diff options
| -rw-r--r-- | net/ieee80211/softmac/ieee80211softmac_wx.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/net/ieee80211/softmac/ieee80211softmac_wx.c b/net/ieee80211/softmac/ieee80211softmac_wx.c index f13937bf9e8c..d054e9224b3e 100644 --- a/net/ieee80211/softmac/ieee80211softmac_wx.c +++ b/net/ieee80211/softmac/ieee80211softmac_wx.c | |||
| @@ -74,8 +74,8 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, | |||
| 74 | struct ieee80211softmac_auth_queue_item *authptr; | 74 | struct ieee80211softmac_auth_queue_item *authptr; |
| 75 | int length = 0; | 75 | int length = 0; |
| 76 | 76 | ||
| 77 | check_assoc_again: | ||
| 77 | mutex_lock(&sm->associnfo.mutex); | 78 | mutex_lock(&sm->associnfo.mutex); |
| 78 | |||
| 79 | /* Check if we're already associating to this or another network | 79 | /* Check if we're already associating to this or another network |
| 80 | * If it's another network, cancel and start over with our new network | 80 | * If it's another network, cancel and start over with our new network |
| 81 | * If it's our network, ignore the change, we're already doing it! | 81 | * If it's our network, ignore the change, we're already doing it! |
| @@ -98,13 +98,18 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev, | |||
| 98 | cancel_delayed_work(&authptr->work); | 98 | cancel_delayed_work(&authptr->work); |
| 99 | sm->associnfo.bssvalid = 0; | 99 | sm->associnfo.bssvalid = 0; |
| 100 | sm->associnfo.bssfixed = 0; | 100 | sm->associnfo.bssfixed = 0; |
| 101 | flush_scheduled_work(); | ||
| 102 | sm->associnfo.associating = 0; | 101 | sm->associnfo.associating = 0; |
| 103 | sm->associnfo.associated = 0; | 102 | sm->associnfo.associated = 0; |
| 103 | /* We must unlock to avoid deadlocks with the assoc workqueue | ||
| 104 | * on the associnfo.mutex */ | ||
| 105 | mutex_unlock(&sm->associnfo.mutex); | ||
| 106 | flush_scheduled_work(); | ||
| 107 | /* Avoid race! Check assoc status again. Maybe someone started an | ||
| 108 | * association while we flushed. */ | ||
| 109 | goto check_assoc_again; | ||
| 104 | } | 110 | } |
| 105 | } | 111 | } |
| 106 | 112 | ||
| 107 | |||
| 108 | sm->associnfo.static_essid = 0; | 113 | sm->associnfo.static_essid = 0; |
| 109 | sm->associnfo.assoc_wait = 0; | 114 | sm->associnfo.assoc_wait = 0; |
| 110 | 115 | ||
