mac80211: call restart complete at wowlan resume time

When the driver's resume function can't completely
restore the configuration in the device, it returns
1 from the callback which will be treated like a HW
restart request, but done directly.

In this case, also call the driver's restart_complete()
function so it can finish the reconfiguration there.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2013-01-11 00:28:01 +01:00
parent d888130a02
commit 8f21b0adfe
2 changed files with 8 additions and 4 deletions

View File

@ -2488,7 +2488,10 @@ enum ieee80211_rate_control_changed {
* *
* @restart_complete: Called after a call to ieee80211_restart_hw(), when the * @restart_complete: Called after a call to ieee80211_restart_hw(), when the
* reconfiguration has completed. This can help the driver implement the * reconfiguration has completed. This can help the driver implement the
* reconfiguration step. This callback may sleep. * reconfiguration step. Also called when reconfiguring because the
* driver's resume function returned 1, as this is just like an "inline"
* hardware restart. This callback may sleep.
*
*/ */
struct ieee80211_ops { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, void (*tx)(struct ieee80211_hw *hw,

View File

@ -1358,9 +1358,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
struct ieee80211_chanctx *ctx; struct ieee80211_chanctx *ctx;
struct sta_info *sta; struct sta_info *sta;
int res, i; int res, i;
#ifdef CONFIG_PM
bool reconfig_due_to_wowlan = false; bool reconfig_due_to_wowlan = false;
#ifdef CONFIG_PM
if (local->suspended) if (local->suspended)
local->resuming = true; local->resuming = true;
@ -1656,10 +1656,11 @@ int ieee80211_reconfig(struct ieee80211_local *local)
* If this is for hw restart things are still running. * If this is for hw restart things are still running.
* We may want to change that later, however. * We may want to change that later, however.
*/ */
if (!local->suspended) { if (!local->suspended || reconfig_due_to_wowlan)
drv_restart_complete(local); drv_restart_complete(local);
if (!local->suspended)
return 0; return 0;
}
#ifdef CONFIG_PM #ifdef CONFIG_PM
/* first set suspended false, then resuming */ /* first set suspended false, then resuming */