diff options
Diffstat (limited to 'net/wireless/scan.c')
-rw-r--r-- | net/wireless/scan.c | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 2ce44a712f13..dd01b58fa78c 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) | |||
169 | union iwreq_data wrqu; | 169 | union iwreq_data wrqu; |
170 | #endif | 170 | #endif |
171 | 171 | ||
172 | lockdep_assert_held(&rdev->sched_scan_mtx); | 172 | ASSERT_RTNL(); |
173 | 173 | ||
174 | request = rdev->scan_req; | 174 | request = rdev->scan_req; |
175 | 175 | ||
@@ -230,9 +230,9 @@ void __cfg80211_scan_done(struct work_struct *wk) | |||
230 | rdev = container_of(wk, struct cfg80211_registered_device, | 230 | rdev = container_of(wk, struct cfg80211_registered_device, |
231 | scan_done_wk); | 231 | scan_done_wk); |
232 | 232 | ||
233 | mutex_lock(&rdev->sched_scan_mtx); | 233 | rtnl_lock(); |
234 | ___cfg80211_scan_done(rdev, false); | 234 | ___cfg80211_scan_done(rdev, false); |
235 | mutex_unlock(&rdev->sched_scan_mtx); | 235 | rtnl_unlock(); |
236 | } | 236 | } |
237 | 237 | ||
238 | void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted) | 238 | void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted) |
@@ -241,6 +241,7 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted) | |||
241 | WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); | 241 | WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req); |
242 | 242 | ||
243 | request->aborted = aborted; | 243 | request->aborted = aborted; |
244 | request->notified = true; | ||
244 | queue_work(cfg80211_wq, &wiphy_to_dev(request->wiphy)->scan_done_wk); | 245 | queue_work(cfg80211_wq, &wiphy_to_dev(request->wiphy)->scan_done_wk); |
245 | } | 246 | } |
246 | EXPORT_SYMBOL(cfg80211_scan_done); | 247 | EXPORT_SYMBOL(cfg80211_scan_done); |
@@ -255,7 +256,7 @@ void __cfg80211_sched_scan_results(struct work_struct *wk) | |||
255 | 256 | ||
256 | request = rdev->sched_scan_req; | 257 | request = rdev->sched_scan_req; |
257 | 258 | ||
258 | mutex_lock(&rdev->sched_scan_mtx); | 259 | rtnl_lock(); |
259 | 260 | ||
260 | /* we don't have sched_scan_req anymore if the scan is stopping */ | 261 | /* we don't have sched_scan_req anymore if the scan is stopping */ |
261 | if (request) { | 262 | if (request) { |
@@ -270,7 +271,7 @@ void __cfg80211_sched_scan_results(struct work_struct *wk) | |||
270 | nl80211_send_sched_scan_results(rdev, request->dev); | 271 | nl80211_send_sched_scan_results(rdev, request->dev); |
271 | } | 272 | } |
272 | 273 | ||
273 | mutex_unlock(&rdev->sched_scan_mtx); | 274 | rtnl_unlock(); |
274 | } | 275 | } |
275 | 276 | ||
276 | void cfg80211_sched_scan_results(struct wiphy *wiphy) | 277 | void cfg80211_sched_scan_results(struct wiphy *wiphy) |
@@ -289,9 +290,9 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy) | |||
289 | 290 | ||
290 | trace_cfg80211_sched_scan_stopped(wiphy); | 291 | trace_cfg80211_sched_scan_stopped(wiphy); |
291 | 292 | ||
292 | mutex_lock(&rdev->sched_scan_mtx); | 293 | rtnl_lock(); |
293 | __cfg80211_stop_sched_scan(rdev, true); | 294 | __cfg80211_stop_sched_scan(rdev, true); |
294 | mutex_unlock(&rdev->sched_scan_mtx); | 295 | rtnl_unlock(); |
295 | } | 296 | } |
296 | EXPORT_SYMBOL(cfg80211_sched_scan_stopped); | 297 | EXPORT_SYMBOL(cfg80211_sched_scan_stopped); |
297 | 298 | ||
@@ -300,7 +301,7 @@ int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev, | |||
300 | { | 301 | { |
301 | struct net_device *dev; | 302 | struct net_device *dev; |
302 | 303 | ||
303 | lockdep_assert_held(&rdev->sched_scan_mtx); | 304 | ASSERT_RTNL(); |
304 | 305 | ||
305 | if (!rdev->sched_scan_req) | 306 | if (!rdev->sched_scan_req) |
306 | return -ENOENT; | 307 | return -ENOENT; |
@@ -1043,21 +1044,19 @@ EXPORT_SYMBOL(cfg80211_unlink_bss); | |||
1043 | static struct cfg80211_registered_device * | 1044 | static struct cfg80211_registered_device * |
1044 | cfg80211_get_dev_from_ifindex(struct net *net, int ifindex) | 1045 | cfg80211_get_dev_from_ifindex(struct net *net, int ifindex) |
1045 | { | 1046 | { |
1046 | struct cfg80211_registered_device *rdev = ERR_PTR(-ENODEV); | 1047 | struct cfg80211_registered_device *rdev; |
1047 | struct net_device *dev; | 1048 | struct net_device *dev; |
1048 | 1049 | ||
1049 | mutex_lock(&cfg80211_mutex); | 1050 | ASSERT_RTNL(); |
1051 | |||
1050 | dev = dev_get_by_index(net, ifindex); | 1052 | dev = dev_get_by_index(net, ifindex); |
1051 | if (!dev) | 1053 | if (!dev) |
1052 | goto out; | 1054 | return ERR_PTR(-ENODEV); |
1053 | if (dev->ieee80211_ptr) { | 1055 | if (dev->ieee80211_ptr) |
1054 | rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy); | 1056 | rdev = wiphy_to_dev(dev->ieee80211_ptr->wiphy); |
1055 | mutex_lock(&rdev->mtx); | 1057 | else |
1056 | } else | ||
1057 | rdev = ERR_PTR(-ENODEV); | 1058 | rdev = ERR_PTR(-ENODEV); |
1058 | dev_put(dev); | 1059 | dev_put(dev); |
1059 | out: | ||
1060 | mutex_unlock(&cfg80211_mutex); | ||
1061 | return rdev; | 1060 | return rdev; |
1062 | } | 1061 | } |
1063 | 1062 | ||
@@ -1083,7 +1082,6 @@ int cfg80211_wext_siwscan(struct net_device *dev, | |||
1083 | if (IS_ERR(rdev)) | 1082 | if (IS_ERR(rdev)) |
1084 | return PTR_ERR(rdev); | 1083 | return PTR_ERR(rdev); |
1085 | 1084 | ||
1086 | mutex_lock(&rdev->sched_scan_mtx); | ||
1087 | if (rdev->scan_req) { | 1085 | if (rdev->scan_req) { |
1088 | err = -EBUSY; | 1086 | err = -EBUSY; |
1089 | goto out; | 1087 | goto out; |
@@ -1190,9 +1188,7 @@ int cfg80211_wext_siwscan(struct net_device *dev, | |||
1190 | dev_hold(dev); | 1188 | dev_hold(dev); |
1191 | } | 1189 | } |
1192 | out: | 1190 | out: |
1193 | mutex_unlock(&rdev->sched_scan_mtx); | ||
1194 | kfree(creq); | 1191 | kfree(creq); |
1195 | cfg80211_unlock_rdev(rdev); | ||
1196 | return err; | 1192 | return err; |
1197 | } | 1193 | } |
1198 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwscan); | 1194 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwscan); |
@@ -1491,10 +1487,8 @@ int cfg80211_wext_giwscan(struct net_device *dev, | |||
1491 | if (IS_ERR(rdev)) | 1487 | if (IS_ERR(rdev)) |
1492 | return PTR_ERR(rdev); | 1488 | return PTR_ERR(rdev); |
1493 | 1489 | ||
1494 | if (rdev->scan_req) { | 1490 | if (rdev->scan_req) |
1495 | res = -EAGAIN; | 1491 | return -EAGAIN; |
1496 | goto out; | ||
1497 | } | ||
1498 | 1492 | ||
1499 | res = ieee80211_scan_results(rdev, info, extra, data->length); | 1493 | res = ieee80211_scan_results(rdev, info, extra, data->length); |
1500 | data->length = 0; | 1494 | data->length = 0; |
@@ -1503,8 +1497,6 @@ int cfg80211_wext_giwscan(struct net_device *dev, | |||
1503 | res = 0; | 1497 | res = 0; |
1504 | } | 1498 | } |
1505 | 1499 | ||
1506 | out: | ||
1507 | cfg80211_unlock_rdev(rdev); | ||
1508 | return res; | 1500 | return res; |
1509 | } | 1501 | } |
1510 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwscan); | 1502 | EXPORT_SYMBOL_GPL(cfg80211_wext_giwscan); |