@@ -936,7 +936,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN);
- ifmgd->associated = NULL;
memset(ifmgd->bssid, 0, ETH_ALEN);
/*
@@ -1007,6 +1006,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
del_timer_sync(&sdata->u.mgd.timer);
del_timer_sync(&sdata->u.mgd.chswitch_timer);
+
+ ifmgd->associated = NULL;
}
void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
@@ -513,6 +513,19 @@ ieee80211_associate(struct ieee80211_work *wk)
{
struct ieee80211_sub_if_data *sdata = wk->sdata;
struct ieee80211_local *local = sdata->local;
+ struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+ bool associated;
+
+ mutex_lock(&ifmgd->mtx);
+ associated = !!ifmgd->associated;
+ mutex_unlock(&ifmgd->mtx);
+
+ if (associated) {
+ printk(KERN_DEBUG "%s: delaying association with %pM as "
+ "we are still associated",
+ sdata->name, wk->filter_ta);
+ goto wait;
+ }
wk->assoc.tries++;
if (wk->assoc.tries > IEEE80211_ASSOC_MAX_TRIES) {
@@ -534,6 +547,7 @@ ieee80211_associate(struct ieee80211_work *wk)
sdata->name, wk->filter_ta, wk->assoc.tries);
ieee80211_send_assoc(sdata, wk);
+wait:
wk->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT;
run_again(local, wk->timeout);