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:
Родитель
78fd9c4491
Коммит
f2dc0d1809
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче