提交 725b8277 编写于 作者: A Arik Nemtsov 提交者: Luciano Coelho

wlcore: prevent recovery in the middle of resume

Take the mutex early in the resume handler and use the locked version of
the IRQ routine. This ensures any recoveries queued will only take place
after resume has fully completed.
Signed-off-by: NArik Nemtsov <arik@wizery.com>
Signed-off-by: NLuciano Coelho <coelho@ti.com>
上级 b5b45b3c
...@@ -1723,6 +1723,7 @@ static int wl1271_op_resume(struct ieee80211_hw *hw) ...@@ -1723,6 +1723,7 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
struct wl12xx_vif *wlvif; struct wl12xx_vif *wlvif;
unsigned long flags; unsigned long flags;
bool run_irq_work = false, pending_recovery; bool run_irq_work = false, pending_recovery;
int ret;
wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d", wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
wl->wow_enabled); wl->wow_enabled);
...@@ -1738,6 +1739,8 @@ static int wl1271_op_resume(struct ieee80211_hw *hw) ...@@ -1738,6 +1739,8 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
run_irq_work = true; run_irq_work = true;
spin_unlock_irqrestore(&wl->wl_lock, flags); spin_unlock_irqrestore(&wl->wl_lock, flags);
mutex_lock(&wl->mutex);
/* test the recovery flag before calling any SDIO functions */ /* test the recovery flag before calling any SDIO functions */
pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
&wl->flags); &wl->flags);
...@@ -1747,13 +1750,15 @@ static int wl1271_op_resume(struct ieee80211_hw *hw) ...@@ -1747,13 +1750,15 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
"run postponed irq_work directly"); "run postponed irq_work directly");
/* don't talk to the HW if recovery is pending */ /* don't talk to the HW if recovery is pending */
if (!pending_recovery) if (!pending_recovery) {
wlcore_irq(0, wl); ret = wlcore_irq_locked(wl);
if (ret)
wl12xx_queue_recovery_work(wl);
}
wlcore_enable_interrupts(wl); wlcore_enable_interrupts(wl);
} }
mutex_lock(&wl->mutex);
if (pending_recovery) { if (pending_recovery) {
wl1271_warning("queuing forgotten recovery on resume"); wl1271_warning("queuing forgotten recovery on resume");
ieee80211_queue_work(wl->hw, &wl->recovery_work); ieee80211_queue_work(wl->hw, &wl->recovery_work);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册