|
@@ -74,8 +74,8 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev,
|
|
|
struct ieee80211softmac_auth_queue_item *authptr;
|
|
|
int length = 0;
|
|
|
|
|
|
+check_assoc_again:
|
|
|
mutex_lock(&sm->associnfo.mutex);
|
|
|
-
|
|
|
/* Check if we're already associating to this or another network
|
|
|
* If it's another network, cancel and start over with our new network
|
|
|
* 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,
|
|
|
cancel_delayed_work(&authptr->work);
|
|
|
sm->associnfo.bssvalid = 0;
|
|
|
sm->associnfo.bssfixed = 0;
|
|
|
- flush_scheduled_work();
|
|
|
sm->associnfo.associating = 0;
|
|
|
sm->associnfo.associated = 0;
|
|
|
+ /* We must unlock to avoid deadlocks with the assoc workqueue
|
|
|
+ * on the associnfo.mutex */
|
|
|
+ mutex_unlock(&sm->associnfo.mutex);
|
|
|
+ flush_scheduled_work();
|
|
|
+ /* Avoid race! Check assoc status again. Maybe someone started an
|
|
|
+ * association while we flushed. */
|
|
|
+ goto check_assoc_again;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
sm->associnfo.static_essid = 0;
|
|
|
sm->associnfo.assoc_wait = 0;
|
|
|
|