aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r--net/mac80211/scan.c37
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 */
822void ieee80211_scan_cancel(struct ieee80211_local *local) 822void 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);
860out:
856 mutex_unlock(&local->mtx); 861 mutex_unlock(&local->mtx);
857} 862}
858 863