aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/sme.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless/sme.c')
-rw-r--r--net/wireless/sme.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index 340934f714b2..219c3bc2c37d 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -256,9 +256,11 @@ void cfg80211_sme_scan_done(struct net_device *dev)
256{ 256{
257 struct wireless_dev *wdev = dev->ieee80211_ptr; 257 struct wireless_dev *wdev = dev->ieee80211_ptr;
258 258
259 mutex_lock(&wiphy_to_dev(wdev->wiphy)->devlist_mtx);
259 wdev_lock(wdev); 260 wdev_lock(wdev);
260 __cfg80211_sme_scan_done(dev); 261 __cfg80211_sme_scan_done(dev);
261 wdev_unlock(wdev); 262 wdev_unlock(wdev);
263 mutex_unlock(&wiphy_to_dev(wdev->wiphy)->devlist_mtx);
262} 264}
263 265
264void cfg80211_sme_rx_auth(struct net_device *dev, 266void cfg80211_sme_rx_auth(struct net_device *dev,
@@ -644,6 +646,7 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev,
644 struct cfg80211_cached_keys *connkeys) 646 struct cfg80211_cached_keys *connkeys)
645{ 647{
646 struct wireless_dev *wdev = dev->ieee80211_ptr; 648 struct wireless_dev *wdev = dev->ieee80211_ptr;
649 struct ieee80211_channel *chan;
647 int err; 650 int err;
648 651
649 ASSERT_WDEV_LOCK(wdev); 652 ASSERT_WDEV_LOCK(wdev);
@@ -651,6 +654,10 @@ int __cfg80211_connect(struct cfg80211_registered_device *rdev,
651 if (wdev->sme_state != CFG80211_SME_IDLE) 654 if (wdev->sme_state != CFG80211_SME_IDLE)
652 return -EALREADY; 655 return -EALREADY;
653 656
657 chan = rdev_fixed_channel(rdev, wdev);
658 if (chan && chan != connect->channel)
659 return -EBUSY;
660
654 if (WARN_ON(wdev->connect_keys)) { 661 if (WARN_ON(wdev->connect_keys)) {
655 kfree(wdev->connect_keys); 662 kfree(wdev->connect_keys);
656 wdev->connect_keys = NULL; 663 wdev->connect_keys = NULL;
@@ -785,9 +792,11 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,
785{ 792{
786 int err; 793 int err;
787 794
795 mutex_lock(&rdev->devlist_mtx);
788 wdev_lock(dev->ieee80211_ptr); 796 wdev_lock(dev->ieee80211_ptr);
789 err = __cfg80211_connect(rdev, dev, connect, connkeys); 797 err = __cfg80211_connect(rdev, dev, connect, connkeys);
790 wdev_unlock(dev->ieee80211_ptr); 798 wdev_unlock(dev->ieee80211_ptr);
799 mutex_unlock(&rdev->devlist_mtx);
791 800
792 return err; 801 return err;
793} 802}