Skip to content

Commit

Permalink
[SUNGEM]: Fix suspend regression due to NAPI changes.
Browse files Browse the repository at this point in the history
Commit bea3348 (the NAPI changes) made sungem unconditionally enable
NAPI when resuming and unconditionally disable when suspending, this,
however, makes napi_disable() hang when suspending when the interface
was taken down before suspend because taking the interface down also
disables NAPI. This patch makes touching the napi struct in
suspend/resume code paths depend on having the interface up, thereby
fixing the hang on suspend.

The patch also moves the napi_disable() in gem_close() under the lock so
that the NAPI state is always modified atomically together with the
"opened" variable.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Johannes Berg authored and David S. Miller committed Nov 13, 2007
1 parent cd228d5 commit 62768e2
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions drivers/net/sungem.c
Original file line number Diff line number Diff line change
Expand Up @@ -2333,10 +2333,10 @@ static int gem_close(struct net_device *dev)
{
struct gem *gp = dev->priv;

napi_disable(&gp->napi);

mutex_lock(&gp->pm_mutex);

napi_disable(&gp->napi);

gp->opened = 0;
if (!gp->asleep)
gem_do_stop(dev, 0);
Expand All @@ -2355,8 +2355,6 @@ static int gem_suspend(struct pci_dev *pdev, pm_message_t state)

mutex_lock(&gp->pm_mutex);

napi_disable(&gp->napi);

printk(KERN_INFO "%s: suspending, WakeOnLan %s\n",
dev->name,
(gp->wake_on_lan && gp->opened) ? "enabled" : "disabled");
Expand All @@ -2370,6 +2368,8 @@ static int gem_suspend(struct pci_dev *pdev, pm_message_t state)

/* If the driver is opened, we stop the MAC */
if (gp->opened) {
napi_disable(&gp->napi);

/* Stop traffic, mark us closed */
netif_device_detach(dev);

Expand Down Expand Up @@ -2460,6 +2460,7 @@ static int gem_resume(struct pci_dev *pdev)
/* Re-attach net device */
netif_device_attach(dev);

napi_enable(&gp->napi);
}

spin_lock_irqsave(&gp->lock, flags);
Expand All @@ -2479,8 +2480,6 @@ static int gem_resume(struct pci_dev *pdev)
spin_unlock(&gp->tx_lock);
spin_unlock_irqrestore(&gp->lock, flags);

napi_enable(&gp->napi);

mutex_unlock(&gp->pm_mutex);

return 0;
Expand Down

0 comments on commit 62768e2

Please sign in to comment.