diff options
author | Anton Vorontsov <avorontsov@ru.mvista.com> | 2009-12-30 08:23:32 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-30 22:03:43 -0800 |
commit | 29fb00e047eae927a3f1a0367c0cfed7ad5228ef (patch) | |
tree | d438872b3e386ddd37daaa79bd3b3f4c62b43d36 /drivers/net/ucc_geth.c | |
parent | 2f5cb43406d0b29b96248f5328a14a6f6abf8ae6 (diff) | |
download | linux-29fb00e047eae927a3f1a0367c0cfed7ad5228ef.tar.gz linux-29fb00e047eae927a3f1a0367c0cfed7ad5228ef.tar.bz2 linux-29fb00e047eae927a3f1a0367c0cfed7ad5228ef.zip |
ucc_geth: Fix netdev watchdog triggering on suspend
Sometimes ucc_geth fails to suspend with the following trace:
ucc_geth e0103000.ucc: suspend
ucc_geth e0102000.ucc: suspend
NETDEV WATCHDOG: eth0 (ucc_geth): transmit queue 0 timed out
------------[ cut here ]------------
Badness at net/sched/sch_generic.c:255
NIP: c021cb5c LR: c021cb5c CTR: c01ab4b4
[...]
NIP [c021cb5c] dev_watchdog+0x298/0x2a8
LR [c021cb5c] dev_watchdog+0x298/0x2a8
Call Trace:
[c0389da0] [c021cb5c] dev_watchdog+0x298/0x2a8 (unreliable)
[c0389e00] [c0031ed8] run_timer_softirq+0x16c/0x1dc
[c0389e50] [c002c638] __do_softirq+0xa4/0x11c
[...]
This patch fixes the issue by properly detaching the device on
suspend, and attaching it back on resume.
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ucc_geth.c')
-rw-r--r-- | drivers/net/ucc_geth.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 41ad2f3697c7..96bdc0b43889 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c @@ -3607,6 +3607,7 @@ static int ucc_geth_suspend(struct of_device *ofdev, pm_message_t state) if (!netif_running(ndev)) return 0; + netif_device_detach(ndev); napi_disable(&ugeth->napi); /* @@ -3665,7 +3666,7 @@ static int ucc_geth_resume(struct of_device *ofdev) phy_start(ugeth->phydev); napi_enable(&ugeth->napi); - netif_start_queue(ndev); + netif_device_attach(ndev); return 0; } |