mac80211: fix deferred hardware scan requests

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Tuesday, February 16, 2010 - 6:59 pm

Gitweb:     http://git.kernel.org/linus/c0ce77b8323c1a0d4eeef97caf16c0ea971222a9
Commit:     c0ce77b8323c1a0d4eeef97caf16c0ea971222a9
Parent:     098dfded5b1b09927995e89c6d689f85a0f53384
Author:     Johannes Berg <johannes@sipsolutions.net>
AuthorDate: Wed Feb 3 10:22:31 2010 +0100
Committer:  John W. Linville <linville@tuxdriver.com>
CommitDate: Mon Feb 8 16:07:23 2010 -0500

    mac80211: fix deferred hardware scan requests
    
    Reinette found the reason for the warnings that
    happened occasionally when a hw-offloaded scan
    finished; her description of the problem:
    
      mac80211 will defer the handling of scan requests if it is
      busy with management work at the time. The scan requests
      are deferred and run after the work has completed. When
      this occurs there are currently two problems.
    
      * The scan request for hardware scan is not fully populated
        with the band and channels to scan not initialized.
    
      * When the scan is queued the state is not correctly updated
        to reflect that a scan is in progress. The problem here is
        that when the driver completes the scan and calls
        ieee80211_scan_completed() a warning will be triggered
        since mac80211 was not aware that a scan was in progress.
    
    The reason is that the queued scan work will start
    the hw scan right away when the hw_scan_req struct
    has already been allocated. However, in the first
    pass it will not have been filled, which happens
    at the same time as setting the bits. To fix this,
    simply move the allocation after the pending work
    test as well, so that the first iteration of the
    scan work will call __ieee80211_start_scan() even
    in the hardware scan case.
    
    Bug-identified-by: Reinette Chatre <reinette.chatre@intel.com>
    Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
    Signed-off-by: John W. Linville <linville@tuxdriver.com>
---
 net/mac80211/scan.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index f934c96..bc17cf7 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -439,6 +439,16 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
 	if (local->scan_req)
 		return -EBUSY;
 
+	if (req != local->int_scan_req &&
+	    sdata->vif.type == NL80211_IFTYPE_STATION &&
+	    !list_empty(&ifmgd->work_list)) {
+		/* actually wait for the work it's doing to finish/time out */
+		set_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request);
+		local->scan_req = req;
+		local->scan_sdata = sdata;
+		return 0;
+	}
+
 	if (local->ops->hw_scan) {
 		u8 *ies;
 
@@ -463,14 +473,6 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
 	local->scan_req = req;
 	local->scan_sdata = sdata;
 
-	if (req != local->int_scan_req &&
-	    sdata->vif.type == NL80211_IFTYPE_STATION &&
-	    !list_empty(&ifmgd->work_list)) {
-		/* actually wait for the work it's doing to finish/time out */
-		set_bit(IEEE80211_STA_REQ_SCAN, &ifmgd->request);
-		return 0;
-	}
-
 	if (local->ops->hw_scan)
 		__set_bit(SCAN_HW_SCANNING, &local->scanning);
 	else
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
mac80211: fix deferred hardware scan requests, Linux Kernel Mailing ..., (Tue Feb 16, 6:59 pm)