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: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Johannes Berg 2011-07-02 00:02:01 +02:00 committed by John W. Linville
parent 304e21bbea
commit 2b4562dfd6
2 changed files with 14 additions and 6 deletions

View File

@ -1628,6 +1628,10 @@ enum ieee80211_ampdu_mlme_action {
* ask the device to suspend. This is only invoked when WoWLAN is
* configured, otherwise the device is deconfigured completely and
* 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
* now resuming its operation, after this the device must be fully

View File

@ -72,15 +72,19 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
local->wowlan = wowlan && local->open_count;
if (local->wowlan) {
int err = drv_suspend(local, wowlan);
if (err) {
if (err < 0) {
local->quiescing = false;
return err;
} else if (err > 0) {
WARN_ON(err != 1);
local->wowlan = false;
} else {
list_for_each_entry(sdata, &local->interfaces, list) {
cancel_work_sync(&sdata->work);
ieee80211_quiesce(sdata);
}
goto suspend;
}
list_for_each_entry(sdata, &local->interfaces, list) {
cancel_work_sync(&sdata->work);
ieee80211_quiesce(sdata);
}
goto suspend;
}
/* disable keys */