diff options
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r-- | net/mac80211/scan.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 58ffa7d069c7..1758b463c583 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -821,10 +821,8 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | |||
821 | */ | 821 | */ |
822 | void ieee80211_scan_cancel(struct ieee80211_local *local) | 822 | void ieee80211_scan_cancel(struct ieee80211_local *local) |
823 | { | 823 | { |
824 | bool abortscan; | ||
825 | |||
826 | /* | 824 | /* |
827 | * We are only canceling software scan, or deferred scan that was not | 825 | * We are canceling software scan, or deferred scan that was not |
828 | * yet really started (see __ieee80211_start_scan ). | 826 | * yet really started (see __ieee80211_start_scan ). |
829 | * | 827 | * |
830 | * Regarding hardware scan: | 828 | * Regarding hardware scan: |
@@ -836,23 +834,30 @@ void ieee80211_scan_cancel(struct ieee80211_local *local) | |||
836 | * - we can not cancel scan_work since driver can schedule it | 834 | * - we can not cancel scan_work since driver can schedule it |
837 | * by ieee80211_scan_completed(..., true) to finish scan | 835 | * by ieee80211_scan_completed(..., true) to finish scan |
838 | * | 836 | * |
839 | * Hence low lever driver is responsible for canceling HW scan. | 837 | * Hence we only call the cancel_hw_scan() callback, but the low-level |
838 | * driver is still responsible for calling ieee80211_scan_completed() | ||
839 | * after the scan was completed/aborted. | ||
840 | */ | 840 | */ |
841 | 841 | ||
842 | mutex_lock(&local->mtx); | 842 | mutex_lock(&local->mtx); |
843 | abortscan = local->scan_req && !test_bit(SCAN_HW_SCANNING, &local->scanning); | 843 | if (!local->scan_req) |
844 | if (abortscan) { | 844 | goto out; |
845 | /* | 845 | |
846 | * The scan is canceled, but stop work from being pending. | 846 | if (test_bit(SCAN_HW_SCANNING, &local->scanning)) { |
847 | * | 847 | if (local->ops->cancel_hw_scan) |
848 | * If the work is currently running, it must be blocked on | 848 | drv_cancel_hw_scan(local, local->scan_sdata); |
849 | * the mutex, but we'll set scan_sdata = NULL and it'll | 849 | goto out; |
850 | * simply exit once it acquires the mutex. | ||
851 | */ | ||
852 | cancel_delayed_work(&local->scan_work); | ||
853 | /* and clean up */ | ||
854 | __ieee80211_scan_completed(&local->hw, true, false); | ||
855 | } | 850 | } |
851 | |||
852 | /* | ||
853 | * If the work is currently running, it must be blocked on | ||
854 | * the mutex, but we'll set scan_sdata = NULL and it'll | ||
855 | * simply exit once it acquires the mutex. | ||
856 | */ | ||
857 | cancel_delayed_work(&local->scan_work); | ||
858 | /* and clean up */ | ||
859 | __ieee80211_scan_completed(&local->hw, true, false); | ||
860 | out: | ||
856 | mutex_unlock(&local->mtx); | 861 | mutex_unlock(&local->mtx); |
857 | } | 862 | } |
858 | 863 | ||