Commit f048fa9c authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnx2: Fix hang during rmmod bnx2.

The regression is caused by:

commit 4327ba43
    bnx2: Fix netpoll crash.

If ->open() and ->close() are called multiple times, the same napi structs
will be added to dev->napi_list multiple times, corrupting the dev->napi_list.
This causes free_netdev() to hang during rmmod.

We fix this by calling netif_napi_del() during ->close().

Also, bnx2_init_napi() must not be in the __devinit section since it is
called by ->open().
Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarBenjamin Li <benli@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fafeeb6c
...@@ -247,6 +247,7 @@ static const struct flash_spec flash_5709 = { ...@@ -247,6 +247,7 @@ static const struct flash_spec flash_5709 = {
MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl);
static void bnx2_init_napi(struct bnx2 *bp); static void bnx2_init_napi(struct bnx2 *bp);
static void bnx2_del_napi(struct bnx2 *bp);
static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr) static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr)
{ {
...@@ -6270,6 +6271,7 @@ bnx2_open(struct net_device *dev) ...@@ -6270,6 +6271,7 @@ bnx2_open(struct net_device *dev)
bnx2_free_skbs(bp); bnx2_free_skbs(bp);
bnx2_free_irq(bp); bnx2_free_irq(bp);
bnx2_free_mem(bp); bnx2_free_mem(bp);
bnx2_del_napi(bp);
return rc; return rc;
} }
...@@ -6537,6 +6539,7 @@ bnx2_close(struct net_device *dev) ...@@ -6537,6 +6539,7 @@ bnx2_close(struct net_device *dev)
bnx2_free_irq(bp); bnx2_free_irq(bp);
bnx2_free_skbs(bp); bnx2_free_skbs(bp);
bnx2_free_mem(bp); bnx2_free_mem(bp);
bnx2_del_napi(bp);
bp->link_up = 0; bp->link_up = 0;
netif_carrier_off(bp->dev); netif_carrier_off(bp->dev);
bnx2_set_power_state(bp, PCI_D3hot); bnx2_set_power_state(bp, PCI_D3hot);
...@@ -8227,7 +8230,16 @@ bnx2_bus_string(struct bnx2 *bp, char *str) ...@@ -8227,7 +8230,16 @@ bnx2_bus_string(struct bnx2 *bp, char *str)
return str; return str;
} }
static void __devinit static void
bnx2_del_napi(struct bnx2 *bp)
{
int i;
for (i = 0; i < bp->irq_nvecs; i++)
netif_napi_del(&bp->bnx2_napi[i].napi);
}
static void
bnx2_init_napi(struct bnx2 *bp) bnx2_init_napi(struct bnx2 *bp)
{ {
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment