diff options
Diffstat (limited to 'net/wireless/sme.c')
-rw-r--r-- | net/wireless/sme.c | 9 |
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 | ||
264 | void cfg80211_sme_rx_auth(struct net_device *dev, | 266 | void 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 | } |