mac80211: only cancel software-based scans on suspend
authorJohn W. Linville <linville@tuxdriver.com>
Wed, 1 Sep 2010 20:12:28 +0000 (16:12 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 1 Sep 2010 20:12:28 +0000 (16:12 -0400)
Otherwise the hardware scan handler could access an invalid scan request
structure.  The driver should cancel any pending hardware scans during
the suspend process anyway, so also add a warning if the hardware scan
is still pending when the device resumes.

Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/ieee80211_i.h
net/mac80211/pm.c

index 16f7fb164c2d158cffaa0153e44b194bfd74c1b2..4e635e2fabdb14d640b3e5832dc00f45ecb65c4a 100644 (file)
@@ -1186,6 +1186,12 @@ int __ieee80211_suspend(struct ieee80211_hw *hw);
 
 static inline int __ieee80211_resume(struct ieee80211_hw *hw)
 {
+       struct ieee80211_local *local = hw_to_local(hw);
+
+       WARN(test_bit(SCAN_HW_SCANNING, &local->scanning),
+               "%s: resume with hardware scan still in progress\n",
+               wiphy_name(hw->wiphy));
+
        return ieee80211_reconfig(hw_to_local(hw));
 }
 #else
index d287fde0431d6b2e688da5400d0ef9f41d9cf1c2..ce671dfd238c115281608e9fdb96b3ac3ce433fd 100644 (file)
@@ -12,7 +12,8 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)
        struct ieee80211_sub_if_data *sdata;
        struct sta_info *sta;
 
-       ieee80211_scan_cancel(local);
+       if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)))
+               ieee80211_scan_cancel(local);
 
        ieee80211_stop_queues_by_reason(hw,
                        IEEE80211_QUEUE_STOP_REASON_SUSPEND);