From: Rafael J. Wysocki Date: Mon, 25 Oct 2010 13:01:55 +0000 (+0000) Subject: tg3: Do not call device_set_wakeup_enable() under spin_lock_bh X-Git-Tag: v3.0~2824^2~153 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f2dc0d1809ab7e0147c7e4ac837be1682f706538;p=platform%2Fkernel%2Flinux-amlogic.git tg3: Do not call device_set_wakeup_enable() under spin_lock_bh The tg3 driver calls device_set_wakeup_enable() under spin_lock_bh, which causes a problem to happen after the recent core power management changes, because this function can sleep now. Fix this by moving the device_set_wakeup_enable() call out of the spin_lock_bh-protected area. Reported-by: Maxim Levitsky Signed-off-by: Rafael J. Wysocki Signed-off-by: David S. Miller --- diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 852e917..30ccbb6 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c @@ -9948,16 +9948,16 @@ static int tg3_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) !((tp->tg3_flags & TG3_FLAG_WOL_CAP) && device_can_wakeup(dp))) return -EINVAL; + device_set_wakeup_enable(dp, wol->wolopts & WAKE_MAGIC); + spin_lock_bh(&tp->lock); - if (wol->wolopts & WAKE_MAGIC) { + if (device_may_wakeup(dp)) tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; - device_set_wakeup_enable(dp, true); - } else { + else tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE; - device_set_wakeup_enable(dp, false); - } spin_unlock_bh(&tp->lock); + return 0; }