Search Linux Wireless

[178/197] mac80211: fix deferred hardware scan requests

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



As Luis Rodriguez pointed out, I should have cc'd linux-wireless on
this from the beginning. I hope no one has any objections to this
going out as part of the next stable drop.

Thanks

-- Chase

---------- Forwarded message ----------
From: Greg KH <gregkh@xxxxxxx>
Date: Thu, Apr 22, 2010 at 3:10 PM
Subject: [178/197] mac80211: fix deferred hardware scan requests
To: linux-kernel@xxxxxxxxxxxxxxx, stable@xxxxxxxxxx
Cc: stable-review@xxxxxxxxxx, torvalds@xxxxxxxxxxxxxxxxxxxx,
akpm@xxxxxxxxxxxxxxxxxxxx, alan@xxxxxxxxxxxxxxxxxxx, Johannes Berg
<johannes@xxxxxxxxxxxxxxxx>, "John W. Linville"
<linville@xxxxxxxxxxxxx>, Chase Douglas <chase.douglas@xxxxxxxxxxxxx>


2.6.32-stable review patch.  If anyone has any objections, please let us know.

------------------

From: Johannes Berg <johannes@xxxxxxxxxxxxxxxx>

commit c0ce77b8323c1a0d4eeef97caf16c0ea971222a9 upstream.

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@xxxxxxxxx>
Signed-off-by: Johannes Berg <johannes@xxxxxxxxxxxxxxxx>
Signed-off-by: John W. Linville <linville@xxxxxxxxxxxxx>
Cc: Chase Douglas <chase.douglas@xxxxxxxxxxxxx>
Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>

---
 net/mac80211/scan.c |   18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -408,6 +408,16 @@ static int __ieee80211_start_scan(struct
       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;
               int ielen;
@@ -428,14 +438,6 @@ static int __ieee80211_start_scan(struct
       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 linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux