diff options
author | Johannes Berg <johannes.berg@intel.com> | 2014-02-17 04:48:17 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-02-20 10:09:54 -0500 |
commit | 37e3308cb2b6933019d9d9c2045877d6d68d9c5a (patch) | |
tree | d9b71804d022a78a65f55d1b6dce4012cd4ee97b /net/mac80211 | |
parent | d9b8396a52b4e857263eeb9e1eba474ea11c19bf (diff) |
mac80211: allow driver to return error from sched_scan_stop
In order to solve races with sched_scan_stop, it is necessary
for the driver to be able to return an error to propagate that
to cfg80211 so it doesn't send an event.
Reviewed-by: Alexander Bondar <alexander.bondar@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/driver-ops.h | 12 | ||||
-rw-r--r-- | net/mac80211/scan.c | 2 |
2 files changed, 9 insertions, 5 deletions
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index ef8b385eff04..fc689f5d971e 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -354,16 +354,20 @@ drv_sched_scan_start(struct ieee80211_local *local, | |||
354 | return ret; | 354 | return ret; |
355 | } | 355 | } |
356 | 356 | ||
357 | static inline void drv_sched_scan_stop(struct ieee80211_local *local, | 357 | static inline int drv_sched_scan_stop(struct ieee80211_local *local, |
358 | struct ieee80211_sub_if_data *sdata) | 358 | struct ieee80211_sub_if_data *sdata) |
359 | { | 359 | { |
360 | int ret; | ||
361 | |||
360 | might_sleep(); | 362 | might_sleep(); |
361 | 363 | ||
362 | check_sdata_in_driver(sdata); | 364 | check_sdata_in_driver(sdata); |
363 | 365 | ||
364 | trace_drv_sched_scan_stop(local, sdata); | 366 | trace_drv_sched_scan_stop(local, sdata); |
365 | local->ops->sched_scan_stop(&local->hw, &sdata->vif); | 367 | ret = local->ops->sched_scan_stop(&local->hw, &sdata->vif); |
366 | trace_drv_return_void(local); | 368 | trace_drv_return_int(local, ret); |
369 | |||
370 | return ret; | ||
367 | } | 371 | } |
368 | 372 | ||
369 | static inline void drv_sw_scan_start(struct ieee80211_local *local) | 373 | static inline void drv_sw_scan_start(struct ieee80211_local *local) |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index b211e412511f..836f500dfbf3 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -1056,7 +1056,7 @@ int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata) | |||
1056 | local->sched_scan_req = NULL; | 1056 | local->sched_scan_req = NULL; |
1057 | 1057 | ||
1058 | if (rcu_access_pointer(local->sched_scan_sdata)) | 1058 | if (rcu_access_pointer(local->sched_scan_sdata)) |
1059 | drv_sched_scan_stop(local, sdata); | 1059 | ret = drv_sched_scan_stop(local, sdata); |
1060 | 1060 | ||
1061 | out: | 1061 | out: |
1062 | mutex_unlock(&local->mtx); | 1062 | mutex_unlock(&local->mtx); |