diff options
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r-- | net/mac80211/scan.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index ea44a8e941ec..d20046b5d8f4 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -902,8 +902,7 @@ out: | |||
902 | return ret; | 902 | return ret; |
903 | } | 903 | } |
904 | 904 | ||
905 | int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata, | 905 | int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata) |
906 | bool driver_initiated) | ||
907 | { | 906 | { |
908 | struct ieee80211_local *local = sdata->local; | 907 | struct ieee80211_local *local = sdata->local; |
909 | int ret = 0, i; | 908 | int ret = 0, i; |
@@ -919,11 +918,9 @@ int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata, | |||
919 | for (i = 0; i < IEEE80211_NUM_BANDS; i++) | 918 | for (i = 0; i < IEEE80211_NUM_BANDS; i++) |
920 | kfree(local->sched_scan_ies.ie[i]); | 919 | kfree(local->sched_scan_ies.ie[i]); |
921 | 920 | ||
922 | if (!driver_initiated) | 921 | drv_sched_scan_stop(local, sdata); |
923 | drv_sched_scan_stop(local, sdata); | ||
924 | local->sched_scanning = false; | 922 | local->sched_scanning = false; |
925 | } | 923 | } |
926 | |||
927 | out: | 924 | out: |
928 | mutex_unlock(&sdata->local->mtx); | 925 | mutex_unlock(&sdata->local->mtx); |
929 | 926 | ||
@@ -940,12 +937,36 @@ void ieee80211_sched_scan_results(struct ieee80211_hw *hw) | |||
940 | } | 937 | } |
941 | EXPORT_SYMBOL(ieee80211_sched_scan_results); | 938 | EXPORT_SYMBOL(ieee80211_sched_scan_results); |
942 | 939 | ||
940 | void ieee80211_sched_scan_stopped_work(struct work_struct *work) | ||
941 | { | ||
942 | struct ieee80211_local *local = | ||
943 | container_of(work, struct ieee80211_local, | ||
944 | sched_scan_stopped_work); | ||
945 | int i; | ||
946 | |||
947 | mutex_lock(&local->mtx); | ||
948 | |||
949 | if (!local->sched_scanning) { | ||
950 | mutex_unlock(&local->mtx); | ||
951 | return; | ||
952 | } | ||
953 | |||
954 | for (i = 0; i < IEEE80211_NUM_BANDS; i++) | ||
955 | kfree(local->sched_scan_ies.ie[i]); | ||
956 | |||
957 | local->sched_scanning = false; | ||
958 | |||
959 | mutex_unlock(&local->mtx); | ||
960 | |||
961 | cfg80211_sched_scan_stopped(local->hw.wiphy); | ||
962 | } | ||
963 | |||
943 | void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw) | 964 | void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw) |
944 | { | 965 | { |
945 | struct ieee80211_local *local = hw_to_local(hw); | 966 | struct ieee80211_local *local = hw_to_local(hw); |
946 | 967 | ||
947 | trace_api_sched_scan_stopped(local); | 968 | trace_api_sched_scan_stopped(local); |
948 | 969 | ||
949 | cfg80211_sched_scan_stopped(hw->wiphy); | 970 | ieee80211_queue_work(&local->hw, &local->sched_scan_stopped_work); |
950 | } | 971 | } |
951 | EXPORT_SYMBOL(ieee80211_sched_scan_stopped); | 972 | EXPORT_SYMBOL(ieee80211_sched_scan_stopped); |