diff options
Diffstat (limited to 'net/wireless/scan.c')
| -rw-r--r-- | net/wireless/scan.c | 40 | 
1 files changed, 25 insertions, 15 deletions
| diff --git a/net/wireless/scan.c b/net/wireless/scan.c index b528e31da2cf..d1ed4aebbbb7 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c @@ -161,18 +161,25 @@ static void __cfg80211_bss_expire(struct cfg80211_registered_device *dev,  		dev->bss_generation++;  } -void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev) +void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, +			   bool send_message)  {  	struct cfg80211_scan_request *request;  	struct wireless_dev *wdev; +	struct sk_buff *msg;  #ifdef CONFIG_CFG80211_WEXT  	union iwreq_data wrqu;  #endif  	ASSERT_RTNL(); -	request = rdev->scan_req; +	if (rdev->scan_msg) { +		nl80211_send_scan_result(rdev, rdev->scan_msg); +		rdev->scan_msg = NULL; +		return; +	} +	request = rdev->scan_req;  	if (!request)  		return; @@ -186,18 +193,16 @@ void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev)  	if (wdev->netdev)  		cfg80211_sme_scan_done(wdev->netdev); -	if (request->aborted) { -		nl80211_send_scan_aborted(rdev, wdev); -	} else { -		if (request->flags & NL80211_SCAN_FLAG_FLUSH) { -			/* flush entries from previous scans */ -			spin_lock_bh(&rdev->bss_lock); -			__cfg80211_bss_expire(rdev, request->scan_start); -			spin_unlock_bh(&rdev->bss_lock); -		} -		nl80211_send_scan_done(rdev, wdev); +	if (!request->aborted && +	    request->flags & NL80211_SCAN_FLAG_FLUSH) { +		/* flush entries from previous scans */ +		spin_lock_bh(&rdev->bss_lock); +		__cfg80211_bss_expire(rdev, request->scan_start); +		spin_unlock_bh(&rdev->bss_lock);  	} +	msg = nl80211_build_scan_msg(rdev, wdev, request->aborted); +  #ifdef CONFIG_CFG80211_WEXT  	if (wdev->netdev && !request->aborted) {  		memset(&wrqu, 0, sizeof(wrqu)); @@ -211,6 +216,11 @@ void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev)  	rdev->scan_req = NULL;  	kfree(request); + +	if (!send_message) +		rdev->scan_msg = msg; +	else +		nl80211_send_scan_result(rdev, msg);  }  void __cfg80211_scan_done(struct work_struct *wk) @@ -221,7 +231,7 @@ void __cfg80211_scan_done(struct work_struct *wk)  			    scan_done_wk);  	rtnl_lock(); -	___cfg80211_scan_done(rdev); +	___cfg80211_scan_done(rdev, true);  	rtnl_unlock();  } @@ -1079,7 +1089,7 @@ int cfg80211_wext_siwscan(struct net_device *dev,  	if (IS_ERR(rdev))  		return PTR_ERR(rdev); -	if (rdev->scan_req) { +	if (rdev->scan_req || rdev->scan_msg) {  		err = -EBUSY;  		goto out;  	} @@ -1481,7 +1491,7 @@ int cfg80211_wext_giwscan(struct net_device *dev,  	if (IS_ERR(rdev))  		return PTR_ERR(rdev); -	if (rdev->scan_req) +	if (rdev->scan_req || rdev->scan_msg)  		return -EAGAIN;  	res = ieee80211_scan_results(rdev, info, extra, data->length); | 
