| From 385de85dcdc742717b6afcce968c87a37b6161ba Mon Sep 17 00:00:00 2001 |
| From: Lukas Wunner <lukas@wunner.de> |
| Date: Wed, 20 Mar 2019 15:02:00 +0100 |
| Subject: net: ks8851: Delay requesting IRQ until opened |
| |
| [ Upstream commit d268f31552794abf5b6aa5af31021643411f25f5 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin (Microsoft) <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/micrel/ks8851.c | 24 +++++++++++------------- |
| 1 file changed, 11 insertions(+), 13 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c |
| index 546a79b9cb15..b8f20aa2b7ad 100644 |
| --- a/drivers/net/ethernet/micrel/ks8851.c |
| +++ b/drivers/net/ethernet/micrel/ks8851.c |
| @@ -776,6 +776,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 */ |
| @@ -890,6 +899,8 @@ static int ks8851_net_stop(struct net_device *dev) |
| dev_kfree_skb(txb); |
| } |
| |
| + free_irq(dev->irq, ks); |
| + |
| return 0; |
| } |
| |
| @@ -1520,14 +1531,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"); |
| @@ -1540,11 +1543,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); |
| @@ -1565,7 +1564,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); |
| -- |
| 2.19.1 |
| |