[PATCH] mac80211: fix deferred hardware scan requests

Stefan Bader stefan.bader at canonical.com
Fri Apr 16 23:29:29 UTC 2010


Despite of likely knowing the intention I need to play dumb: what is the
intention of this? There is not much indication which release you target,
neither much help about the impact of the bug or the regression potential of the
fix. What is the use case to trigger it.
As we basically are locked down with the release kernel, we are now doing all
fixes in SRU mode which requires a bit more explanation on things (see Leann's
recent submissions).
If this only triggers a warning but still leaves things workable, this should
hopefully get back via stable. As normal SRU updates are in general limited to
more serious issues.

Stefan

Chase Douglas wrote:
> From: Johannes Berg <johannes at sipsolutions.net>
> 
> 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 at intel.com>
> Signed-off-by: Johannes Berg <johannes at sipsolutions.net>
> Signed-off-by: John W. Linville <linville at tuxdriver.com>
> (cherry picked from commit c0ce77b8323c1a0d4eeef97caf16c0ea971222a9)
> 
> BugLink: http://bugs.launchpad.net/bugs/528688
> 
> Signed-off-by: Chase Douglas <chase.douglas at canonical.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 1a41909..fd6411d 100644
> --- a/net/mac80211/scan.c
> +++ b/net/mac80211/scan.c
> @@ -408,6 +408,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;
>  		int ielen;
> @@ -428,14 +438,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





More information about the kernel-team mailing list