Skip to content

Commit

Permalink
wlcore: prevent recovery in the middle of resume
Browse files Browse the repository at this point in the history
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: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
  • Loading branch information
Arik Nemtsov authored and Luciano Coelho committed Jun 23, 2012
1 parent b5b45b3 commit 725b827
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions drivers/net/wireless/ti/wlcore/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1723,6 +1723,7 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
struct wl12xx_vif *wlvif;
unsigned long flags;
bool run_irq_work = false, pending_recovery;
int ret;

wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
wl->wow_enabled);
Expand All @@ -1738,6 +1739,8 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
run_irq_work = true;
spin_unlock_irqrestore(&wl->wl_lock, flags);

mutex_lock(&wl->mutex);

/* test the recovery flag before calling any SDIO functions */
pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
&wl->flags);
Expand All @@ -1747,13 +1750,15 @@ static int wl1271_op_resume(struct ieee80211_hw *hw)
"run postponed irq_work directly");

/* don't talk to the HW if recovery is pending */
if (!pending_recovery)
wlcore_irq(0, wl);
if (!pending_recovery) {
ret = wlcore_irq_locked(wl);
if (ret)
wl12xx_queue_recovery_work(wl);
}

wlcore_enable_interrupts(wl);
}

mutex_lock(&wl->mutex);
if (pending_recovery) {
wl1271_warning("queuing forgotten recovery on resume");
ieee80211_queue_work(wl->hw, &wl->recovery_work);
Expand Down

0 comments on commit 725b827

Please sign in to comment.