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 <maximlevitsky@gmail.com>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Rafael J. Wysocki 2010-10-25 13:01:55 +00:00 committed by David S. Miller
parent 78fd9c4491
commit f2dc0d1809
1 changed files with 5 additions and 5 deletions

View File

@ -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))) !((tp->tg3_flags & TG3_FLAG_WOL_CAP) && device_can_wakeup(dp)))
return -EINVAL; return -EINVAL;
device_set_wakeup_enable(dp, wol->wolopts & WAKE_MAGIC);
spin_lock_bh(&tp->lock); spin_lock_bh(&tp->lock);
if (wol->wolopts & WAKE_MAGIC) { if (device_may_wakeup(dp))
tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
device_set_wakeup_enable(dp, true); else
} else {
tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE; tp->tg3_flags &= ~TG3_FLAG_WOL_ENABLE;
device_set_wakeup_enable(dp, false);
}
spin_unlock_bh(&tp->lock); spin_unlock_bh(&tp->lock);
return 0; return 0;
} }