| From a6133d3d189be4b3685f12c4765128fff23ea03c Mon Sep 17 00:00:00 2001 |
| From: Ilkka Virta <itvirta@iki.fi> |
| Date: Fri, 6 Feb 2009 22:00:36 -0800 |
| Subject: sungem: Soft lockup in sungem on Netra AC200 when switching interface up |
| |
| From: Ilkka Virta <itvirta@iki.fi> |
| |
| [ Upstream commit 71822faa3bc0af5dbf5e333a2d085f1ed7cd809f ] |
| |
| From: Ilkka Virta <itvirta@iki.fi> |
| |
| In the lockup situation the driver seems to go off in an eternal storm |
| of interrupts right after calling request_irq(). It doesn't actually |
| do anything interesting in the interrupt handler. Since connecting the link |
| afterwards works, something later in initialization must fix this. |
| |
| Looking at gem_do_start() and gem_open(), it seems that the only thing |
| done while opening the device after the request_irq(), is a call to |
| napi_enable(). |
| |
| I don't know what the ordering requirements are for the |
| initialization, but I boldly tried to move the napi_enable() call |
| inside gem_do_start() before the link state is checked and interrupts |
| subsequently enabled, and it seems to work for me. Doesn't even break |
| anything too obvious... |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/sungem.c | 8 ++++---- |
| 1 file changed, 4 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/net/sungem.c |
| +++ b/drivers/net/sungem.c |
| @@ -2205,6 +2205,8 @@ static int gem_do_start(struct net_devic |
| |
| gp->running = 1; |
| |
| + napi_enable(&gp->napi); |
| + |
| if (gp->lstate == link_up) { |
| netif_carrier_on(gp->dev); |
| gem_set_link_modes(gp); |
| @@ -2222,6 +2224,8 @@ static int gem_do_start(struct net_devic |
| spin_lock_irqsave(&gp->lock, flags); |
| spin_lock(&gp->tx_lock); |
| |
| + napi_disable(&gp->napi); |
| + |
| gp->running = 0; |
| gem_reset(gp); |
| gem_clean_rings(gp); |
| @@ -2322,8 +2326,6 @@ static int gem_open(struct net_device *d |
| if (!gp->asleep) |
| rc = gem_do_start(dev); |
| gp->opened = (rc == 0); |
| - if (gp->opened) |
| - napi_enable(&gp->napi); |
| |
| mutex_unlock(&gp->pm_mutex); |
| |
| @@ -2460,8 +2462,6 @@ static int gem_resume(struct pci_dev *pd |
| |
| /* Re-attach net device */ |
| netif_device_attach(dev); |
| - |
| - napi_enable(&gp->napi); |
| } |
| |
| spin_lock_irqsave(&gp->lock, flags); |