| From e9c56f8d2f851fb6d6ce6794c0f5463b862a878e Mon Sep 17 00:00:00 2001 |
| From: Maxime Ripard <maxime.ripard@free-electrons.com> |
| Date: Tue, 10 Dec 2013 19:40:43 +0100 |
| Subject: net: allwinner: emac: Add missing free_irq |
| |
| From: Maxime Ripard <maxime.ripard@free-electrons.com> |
| |
| commit e9c56f8d2f851fb6d6ce6794c0f5463b862a878e upstream. |
| |
| The sun4i-emac driver uses devm_request_irq at .ndo_open time, but relies on |
| the managed device mechanism to actually free it. This causes an issue whenever |
| someone wants to restart the interface, the interrupt still being held, and not |
| yet released. |
| |
| Fall back to using the regular request_irq at .ndo_open time, and introduce a |
| free_irq during .ndo_stop. |
| |
| Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/ethernet/allwinner/sun4i-emac.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/allwinner/sun4i-emac.c |
| +++ b/drivers/net/ethernet/allwinner/sun4i-emac.c |
| @@ -717,8 +717,7 @@ static int emac_open(struct net_device * |
| if (netif_msg_ifup(db)) |
| dev_dbg(db->dev, "enabling %s\n", dev->name); |
| |
| - if (devm_request_irq(db->dev, dev->irq, &emac_interrupt, |
| - 0, dev->name, dev)) |
| + if (request_irq(dev->irq, &emac_interrupt, 0, dev->name, dev)) |
| return -EAGAIN; |
| |
| /* Initialize EMAC board */ |
| @@ -774,6 +773,8 @@ static int emac_stop(struct net_device * |
| |
| emac_shutdown(ndev); |
| |
| + free_irq(ndev->irq, ndev); |
| + |
| return 0; |
| } |
| |