wlcore: Don't recover during boot
While recursive recovery is avoided during shutdown, a new recovery may be queued when the FW boots. The recovery work will then try to stop an already stopped hardware, which will most likely result in a kernel panic. Fix this by verifying that wl->state is on before queueing a new recovery. Signed-off-by: Ido Yariv <ido@wizery.com> Signed-off-by: Arik Nemtsov <arik@wizery.com> Signed-off-by: Luciano Coelho <luca@coelho.fi>
This commit is contained in:
parent
1defbeb042
commit
792a58a872
1 changed files with 2 additions and 1 deletions
|
@ -775,8 +775,9 @@ void wl12xx_queue_recovery_work(struct wl1271 *wl)
|
||||||
WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
|
WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
|
||||||
|
|
||||||
/* Avoid a recursive recovery */
|
/* Avoid a recursive recovery */
|
||||||
if (!test_and_set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
|
if (wl->state == WLCORE_STATE_ON) {
|
||||||
wl->state = WLCORE_STATE_RESTARTING;
|
wl->state = WLCORE_STATE_RESTARTING;
|
||||||
|
set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
|
||||||
wlcore_disable_interrupts_nosync(wl);
|
wlcore_disable_interrupts_nosync(wl);
|
||||||
ieee80211_queue_work(wl->hw, &wl->recovery_work);
|
ieee80211_queue_work(wl->hw, &wl->recovery_work);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue