diff options
author | David Spinadel <david.spinadel@intel.com> | 2013-12-08 21:48:57 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-12-16 13:47:26 +0100 |
commit | d43c6b6e6f2fcaebf198c499716e5e24d878fdd2 (patch) | |
tree | ef8cc16a17e5b0101d0fc138eb28e55ebd3363c9 /net/mac80211/util.c | |
parent | 0ae07968f6de608ab02d98731747299a0cf274ea (diff) | |
download | kernel-common-d43c6b6e6f2fcaebf198c499716e5e24d878fdd2.tar.gz kernel-common-d43c6b6e6f2fcaebf198c499716e5e24d878fdd2.tar.bz2 kernel-common-d43c6b6e6f2fcaebf198c499716e5e24d878fdd2.zip |
mac80211: reschedule sched scan after HW restart
Keep the sched scan req when starting sched scan, and reschedule
it in case of HW restart during sched scan.
The upper layer don't have to know about the restart.
Signed-off-by: David Spinadel <david.spinadel@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r-- | net/mac80211/util.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index adf81f023681..591b46b72462 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -1462,6 +1462,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) struct sta_info *sta; int res, i; bool reconfig_due_to_wowlan = false; + struct ieee80211_sub_if_data *sched_scan_sdata; + bool sched_scan_stopped = false; #ifdef CONFIG_PM if (local->suspended) @@ -1765,6 +1767,27 @@ int ieee80211_reconfig(struct ieee80211_local *local) #else WARN_ON(1); #endif + + /* + * Reconfigure sched scan if it was interrupted by FW restart or + * suspend. + */ + mutex_lock(&local->mtx); + sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata, + lockdep_is_held(&local->mtx)); + if (sched_scan_sdata && local->sched_scan_req) + /* + * Sched scan stopped, but we don't want to report it. Instead, + * we're trying to reschedule. + */ + if (__ieee80211_request_sched_scan_start(sched_scan_sdata, + local->sched_scan_req)) + sched_scan_stopped = true; + mutex_unlock(&local->mtx); + + if (sched_scan_stopped) + cfg80211_sched_scan_stopped(local->hw.wiphy); + return 0; } |