Commit 4a859df8 authored by Eliad Peller's avatar Eliad Peller Committed by Luciano Coelho

wl12xx: don't check wow param on suspend/resume

Since mac80211 calls suspend/resume only when wowlan triggers
exist, there is no need to check for triggers existance in the
callbacks as well.
Add a WARN_ON() to verify it.
Signed-off-by: default avatarEliad Peller <eliad@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 0c005048
...@@ -1551,69 +1551,68 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw, ...@@ -1551,69 +1551,68 @@ static int wl1271_op_suspend(struct ieee80211_hw *hw,
struct cfg80211_wowlan *wow) struct cfg80211_wowlan *wow)
{ {
struct wl1271 *wl = hw->priv; struct wl1271 *wl = hw->priv;
int ret;
wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow); wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
wl->wow_enabled = !!wow; WARN_ON(!wow || !wow->any);
if (wl->wow_enabled) {
int ret;
ret = wl1271_configure_suspend(wl);
if (ret < 0) {
wl1271_warning("couldn't prepare device to suspend");
return ret;
}
/* flush any remaining work */
wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
flush_delayed_work(&wl->scan_complete_work);
/* wl->wow_enabled = true;
* disable and re-enable interrupts in order to flush ret = wl1271_configure_suspend(wl);
* the threaded_irq if (ret < 0) {
*/ wl1271_warning("couldn't prepare device to suspend");
wl1271_disable_interrupts(wl); return ret;
}
/* flush any remaining work */
wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
flush_delayed_work(&wl->scan_complete_work);
/* /*
* set suspended flag to avoid triggering a new threaded_irq * disable and re-enable interrupts in order to flush
* work. no need for spinlock as interrupts are disabled. * the threaded_irq
*/ */
set_bit(WL1271_FLAG_SUSPENDED, &wl->flags); wl1271_disable_interrupts(wl);
/*
* set suspended flag to avoid triggering a new threaded_irq
* work. no need for spinlock as interrupts are disabled.
*/
set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
wl1271_enable_interrupts(wl);
flush_work(&wl->tx_work);
flush_delayed_work(&wl->pspoll_work);
flush_delayed_work(&wl->elp_work);
wl1271_enable_interrupts(wl);
flush_work(&wl->tx_work);
flush_delayed_work(&wl->pspoll_work);
flush_delayed_work(&wl->elp_work);
}
return 0; return 0;
} }
static int wl1271_op_resume(struct ieee80211_hw *hw) static int wl1271_op_resume(struct ieee80211_hw *hw)
{ {
struct wl1271 *wl = hw->priv; struct wl1271 *wl = hw->priv;
unsigned long flags;
bool run_irq_work = false;
wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d", wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
wl->wow_enabled); wl->wow_enabled);
WARN_ON(!wl->wow_enabled);
/* /*
* re-enable irq_work enqueuing, and call irq_work directly if * re-enable irq_work enqueuing, and call irq_work directly if
* there is a pending work. * there is a pending work.
*/ */
if (wl->wow_enabled) { spin_lock_irqsave(&wl->wl_lock, flags);
struct wl1271 *wl = hw->priv; clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
unsigned long flags; if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags))
bool run_irq_work = false; run_irq_work = true;
spin_unlock_irqrestore(&wl->wl_lock, flags);
spin_lock_irqsave(&wl->wl_lock, flags);
clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags))
run_irq_work = true;
spin_unlock_irqrestore(&wl->wl_lock, flags);
if (run_irq_work) {
wl1271_debug(DEBUG_MAC80211,
"run postponed irq_work directly");
wl1271_irq(0, wl);
wl1271_enable_interrupts(wl);
}
wl1271_configure_resume(wl); if (run_irq_work) {
wl1271_debug(DEBUG_MAC80211,
"run postponed irq_work directly");
wl1271_irq(0, wl);
wl1271_enable_interrupts(wl);
} }
wl1271_configure_resume(wl);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment