Commit 2b4562df authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: allow driver to impose WoWLAN restrictions

If the driver can't support WoWLAN in the current
state, this patch allows it to return 1 from the
suspend callback to do the normal deconfiguration
instead of using suspend/resume calls. Note that
if it does this, resume won't be called.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 304e21bb
...@@ -1628,6 +1628,10 @@ enum ieee80211_ampdu_mlme_action { ...@@ -1628,6 +1628,10 @@ enum ieee80211_ampdu_mlme_action {
* ask the device to suspend. This is only invoked when WoWLAN is * ask the device to suspend. This is only invoked when WoWLAN is
* configured, otherwise the device is deconfigured completely and * configured, otherwise the device is deconfigured completely and
* reconfigured at resume time. * reconfigured at resume time.
* The driver may also impose special conditions under which it
* wants to use the "normal" suspend (deconfigure), say if it only
* supports WoWLAN when the device is associated. In this case, it
* must return 1 from this function.
* *
* @resume: If WoWLAN was configured, this indicates that mac80211 is * @resume: If WoWLAN was configured, this indicates that mac80211 is
* now resuming its operation, after this the device must be fully * now resuming its operation, after this the device must be fully
......
...@@ -72,16 +72,20 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) ...@@ -72,16 +72,20 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
local->wowlan = wowlan && local->open_count; local->wowlan = wowlan && local->open_count;
if (local->wowlan) { if (local->wowlan) {
int err = drv_suspend(local, wowlan); int err = drv_suspend(local, wowlan);
if (err) { if (err < 0) {
local->quiescing = false; local->quiescing = false;
return err; return err;
} } else if (err > 0) {
WARN_ON(err != 1);
local->wowlan = false;
} else {
list_for_each_entry(sdata, &local->interfaces, list) { list_for_each_entry(sdata, &local->interfaces, list) {
cancel_work_sync(&sdata->work); cancel_work_sync(&sdata->work);
ieee80211_quiesce(sdata); ieee80211_quiesce(sdata);
} }
goto suspend; goto suspend;
} }
}
/* disable keys */ /* disable keys */
list_for_each_entry(sdata, &local->interfaces, list) list_for_each_entry(sdata, &local->interfaces, list)
......
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