aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2010-09-01 16:12:28 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-09-01 16:12:28 -0400
commit85f72bc839705294b32b6c16b491c0422f0a71b3 (patch)
treec2aec95a5b7315cc7e5bff44a28eb26d045d64e5
parent18145c69349f2ab60c470798f83b3a2639e2a8d9 (diff)
mac80211: only cancel software-based scans on suspend
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>
-rw-r--r--net/mac80211/ieee80211_i.h6
-rw-r--r--net/mac80211/pm.c3
2 files changed, 8 insertions, 1 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 16f7fb164c2d..4e635e2fabdb 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1186,6 +1186,12 @@ int __ieee80211_suspend(struct ieee80211_hw *hw);
1186 1186
1187static inline int __ieee80211_resume(struct ieee80211_hw *hw) 1187static inline int __ieee80211_resume(struct ieee80211_hw *hw)
1188{ 1188{
1189 struct ieee80211_local *local = hw_to_local(hw);
1190
1191 WARN(test_bit(SCAN_HW_SCANNING, &local->scanning),
1192 "%s: resume with hardware scan still in progress\n",
1193 wiphy_name(hw->wiphy));
1194
1189 return ieee80211_reconfig(hw_to_local(hw)); 1195 return ieee80211_reconfig(hw_to_local(hw));
1190} 1196}
1191#else 1197#else
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c
index d287fde0431d..ce671dfd238c 100644
--- a/net/mac80211/pm.c
+++ b/net/mac80211/pm.c
@@ -12,7 +12,8 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)
12 struct ieee80211_sub_if_data *sdata; 12 struct ieee80211_sub_if_data *sdata;
13 struct sta_info *sta; 13 struct sta_info *sta;
14 14
15 ieee80211_scan_cancel(local); 15 if (unlikely(test_bit(SCAN_SW_SCANNING, &local->scanning)))
16 ieee80211_scan_cancel(local);
16 17
17 ieee80211_stop_queues_by_reason(hw, 18 ieee80211_stop_queues_by_reason(hw,
18 IEEE80211_QUEUE_STOP_REASON_SUSPEND); 19 IEEE80211_QUEUE_STOP_REASON_SUSPEND);