aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorEliad Peller <eliad@wizery.com>2016-01-05 09:28:06 -0500
committerJohannes Berg <johannes.berg@intel.com>2016-01-14 05:10:20 -0500
commit2bc533bd9dcf48eaf4af6fb89a338734a9e8f76e (patch)
tree28c71b45c5e1e3e38ff73918fae71cdecd965069 /net
parent1a57081add2529fb4d8d11e7385990e7e550d30b (diff)
mac80211: handle sched_scan_stopped vs. hw restart race
On hw restart, mac80211 might try to reconfigure already stopped sched scan, if ieee80211_sched_scan_stopped_work() wasn't scheduled yet. This in turn will keep the device driver with scheduled scan configured, while both mac80211 and cfg80211 will clear their sched scan state once the work is scheduled. Fix it by ignoring ieee80211_sched_scan_stopped() calls while in hw restart, and flush the work before starting the reconfiguration. Signed-off-by: Eliad Peller <eliadx.peller@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/main.c1
-rw-r--r--net/mac80211/scan.c8
2 files changed, 9 insertions, 0 deletions
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index ed4c8e66b44a..8190bf27ebff 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -248,6 +248,7 @@ static void ieee80211_restart_work(struct work_struct *work)
248 248
249 /* wait for scan work complete */ 249 /* wait for scan work complete */
250 flush_workqueue(local->workqueue); 250 flush_workqueue(local->workqueue);
251 flush_work(&local->sched_scan_stopped_work);
251 252
252 WARN(test_bit(SCAN_HW_SCANNING, &local->scanning), 253 WARN(test_bit(SCAN_HW_SCANNING, &local->scanning),
253 "%s called with hardware scan in progress\n", __func__); 254 "%s called with hardware scan in progress\n", __func__);
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index a413e52f7691..8eb68ef42e8c 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -1213,6 +1213,14 @@ void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)
1213 1213
1214 trace_api_sched_scan_stopped(local); 1214 trace_api_sched_scan_stopped(local);
1215 1215
1216 /*
1217 * this shouldn't really happen, so for simplicity
1218 * simply ignore it, and let mac80211 reconfigure
1219 * the sched scan later on.
1220 */
1221 if (local->in_reconfig)
1222 return;
1223
1216 schedule_work(&local->sched_scan_stopped_work); 1224 schedule_work(&local->sched_scan_stopped_work);
1217} 1225}
1218EXPORT_SYMBOL(ieee80211_sched_scan_stopped); 1226EXPORT_SYMBOL(ieee80211_sched_scan_stopped);