summaryrefslogtreecommitdiff
path: root/net/wireless/scan.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-03-28 17:42:36 -0400
committerDavid S. Miller <davem@davemloft.net>2013-03-28 17:42:36 -0400
commitd2aa8eec7f83f1b18f492e1e9aa634a001c2f58c (patch)
treeddadafda9ba834e74e7f882d761900e08bb1ca1c /net/wireless/scan.c
parent91c5746425aed8f7188a351f1224a26aa232e4b3 (diff)
parent630a216da662ba4197e330118fc55d772a2d7ec9 (diff)
Merge branch 'wireless'
John W. Linville says: ==================== Please excuse this larger-than-I-would-like pull request intended for the 3.9 stream. There are a number of late-breaking fixes, including a revert... Regarding the mac80211 bits, Johannes says: "I have two tracing fixes (one from Vladimir), two fixes for P2P device crashes, a fix for a BSS memory leak/lost update problem and a fix from Ben for a scanning issue in mac80211. It's a little on the large side because one of the P2P device problems required a bit much locking work, but I've run through all the different scenarios (wext/nl80211, p2p-device/station interface, ifdown/rfkill) to verify locking with lockdep." As for the iwlwifi bits, Johannes says: "I have three little fixes to the driver from Emmanuel. One addresses a small bug Ben Hutchings found during the stable review process and two address some warnings in the driver when RF-Kill is asserted." Along with those... Avinash Patil fixes an mwifiex bug cause by failing to process a sleep command due to bad SKB manipulation when going into power saving mode. Colin Ian King avoids a null pointer dereference in iwl4965. Dan Williams officially announces that he has dropped maintainership of the libertas driver. Iestyn C. Elfick adds a work-around to avoid b43 DMA transmision sequence error that would lead to a device reset. Luis R. Rodriguez avoids an ath9k warning by not queueing a work item while going to suspend mode. Rafał Miłecki provides a pair of b43 N-PHY fixes related to RSSI calibration. Finally, I revert "brcmsmac: support 4313iPA" because it has been reported in many places to cause problems with the already supported 4313ePA devices. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/wireless/scan.c')
-rw-r--r--net/wireless/scan.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index 674aadca0079..fd99ea495b7e 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -169,7 +169,7 @@ void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak)
union iwreq_data wrqu;
#endif
- ASSERT_RDEV_LOCK(rdev);
+ lockdep_assert_held(&rdev->sched_scan_mtx);
request = rdev->scan_req;
@@ -230,9 +230,9 @@ void __cfg80211_scan_done(struct work_struct *wk)
rdev = container_of(wk, struct cfg80211_registered_device,
scan_done_wk);
- cfg80211_lock_rdev(rdev);
+ mutex_lock(&rdev->sched_scan_mtx);
___cfg80211_scan_done(rdev, false);
- cfg80211_unlock_rdev(rdev);
+ mutex_unlock(&rdev->sched_scan_mtx);
}
void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted)
@@ -698,11 +698,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
found = rb_find_bss(dev, tmp, BSS_CMP_REGULAR);
if (found) {
- found->pub.beacon_interval = tmp->pub.beacon_interval;
- found->pub.signal = tmp->pub.signal;
- found->pub.capability = tmp->pub.capability;
- found->ts = tmp->ts;
-
/* Update IEs */
if (rcu_access_pointer(tmp->pub.proberesp_ies)) {
const struct cfg80211_bss_ies *old;
@@ -723,6 +718,8 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
if (found->pub.hidden_beacon_bss &&
!list_empty(&found->hidden_list)) {
+ const struct cfg80211_bss_ies *f;
+
/*
* The found BSS struct is one of the probe
* response members of a group, but we're
@@ -732,6 +729,10 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
* SSID to showing it, which is confusing so
* drop this information.
*/
+
+ f = rcu_access_pointer(tmp->pub.beacon_ies);
+ kfree_rcu((struct cfg80211_bss_ies *)f,
+ rcu_head);
goto drop;
}
@@ -761,6 +762,11 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
kfree_rcu((struct cfg80211_bss_ies *)old,
rcu_head);
}
+
+ found->pub.beacon_interval = tmp->pub.beacon_interval;
+ found->pub.signal = tmp->pub.signal;
+ found->pub.capability = tmp->pub.capability;
+ found->ts = tmp->ts;
} else {
struct cfg80211_internal_bss *new;
struct cfg80211_internal_bss *hidden;
@@ -1056,6 +1062,7 @@ int cfg80211_wext_siwscan(struct net_device *dev,
if (IS_ERR(rdev))
return PTR_ERR(rdev);
+ mutex_lock(&rdev->sched_scan_mtx);
if (rdev->scan_req) {
err = -EBUSY;
goto out;
@@ -1162,6 +1169,7 @@ int cfg80211_wext_siwscan(struct net_device *dev,
dev_hold(dev);
}
out:
+ mutex_unlock(&rdev->sched_scan_mtx);
kfree(creq);
cfg80211_unlock_rdev(rdev);
return err;