mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 17:24:17 +08:00
net: ks8851: Delay requesting IRQ until opened
The ks8851 driver currently requests the IRQ before registering the net_device. Because the net_device name is used as IRQ name and is still "eth%d" when the IRQ is requested, it's impossibe to tell IRQs apart if multiple ks8851 chips are present. Most other drivers delay requesting the IRQ until the net_device is opened. Do the same. The driver doesn't enable interrupts on the chip before opening the net_device and disables them when closing it, so there doesn't seem to be a need to request the IRQ already on probe. Signed-off-by: Lukas Wunner <lukas@wunner.de> Cc: Frank Pavlic <f.pavlic@kunbus.de> Cc: Ben Dooks <ben.dooks@codethink.co.uk> Cc: Tristram Ha <Tristram.Ha@microchip.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
761cfa979a
commit
d268f31552
@ -785,6 +785,15 @@ static void ks8851_tx_work(struct work_struct *work)
|
||||
static int ks8851_net_open(struct net_device *dev)
|
||||
{
|
||||
struct ks8851_net *ks = netdev_priv(dev);
|
||||
int ret;
|
||||
|
||||
ret = request_threaded_irq(dev->irq, NULL, ks8851_irq,
|
||||
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
|
||||
dev->name, ks);
|
||||
if (ret < 0) {
|
||||
netdev_err(dev, "failed to get irq\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* lock the card, even if we may not actually be doing anything
|
||||
* else at the moment */
|
||||
@ -899,6 +908,8 @@ static int ks8851_net_stop(struct net_device *dev)
|
||||
dev_kfree_skb(txb);
|
||||
}
|
||||
|
||||
free_irq(dev->irq, ks);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1529,14 +1540,6 @@ static int ks8851_probe(struct spi_device *spi)
|
||||
ks8851_read_selftest(ks);
|
||||
ks8851_init_mac(ks);
|
||||
|
||||
ret = request_threaded_irq(spi->irq, NULL, ks8851_irq,
|
||||
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
|
||||
ndev->name, ks);
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "failed to get irq\n");
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
ret = register_netdev(ndev);
|
||||
if (ret) {
|
||||
dev_err(&spi->dev, "failed to register network device\n");
|
||||
@ -1549,11 +1552,7 @@ static int ks8851_probe(struct spi_device *spi)
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
err_netdev:
|
||||
free_irq(ndev->irq, ks);
|
||||
|
||||
err_irq:
|
||||
err_id:
|
||||
if (gpio_is_valid(gpio))
|
||||
gpio_set_value(gpio, 0);
|
||||
@ -1574,7 +1573,6 @@ static int ks8851_remove(struct spi_device *spi)
|
||||
dev_info(&spi->dev, "remove\n");
|
||||
|
||||
unregister_netdev(priv->netdev);
|
||||
free_irq(spi->irq, priv);
|
||||
if (gpio_is_valid(priv->gpio))
|
||||
gpio_set_value(priv->gpio, 0);
|
||||
regulator_disable(priv->vdd_reg);
|
||||
|
Loading…
Reference in New Issue
Block a user