Commit 2e8d397e authored by Arik Nemtsov's avatar Arik Nemtsov Committed by John W. Linville

mac80211: add stations after AP start on reconfig

When performing a HW restart for an AP mode interface, add stations back
only after the AP is beaconing. This mimics the normal flow of STA
addition on AP.

Some devices (wlcore) do not support adding stations before beaconing,
so this has the added benefit of making recovery work for them.
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 2b0446c4
...@@ -1279,14 +1279,19 @@ int ieee80211_reconfig(struct ieee80211_local *local) ...@@ -1279,14 +1279,19 @@ int ieee80211_reconfig(struct ieee80211_local *local)
/* add STAs back */ /* add STAs back */
mutex_lock(&local->sta_mtx); mutex_lock(&local->sta_mtx);
list_for_each_entry(sta, &local->sta_list, list) { list_for_each_entry(sta, &local->sta_list, list) {
if (sta->uploaded) { enum ieee80211_sta_state state;
enum ieee80211_sta_state state;
for (state = IEEE80211_STA_NOTEXIST; if (!sta->uploaded)
state < sta->sta_state; state++) continue;
WARN_ON(drv_sta_state(local, sta->sdata, sta,
state, state + 1)); /* AP-mode stations will be added later */
} if (sta->sdata->vif.type == NL80211_IFTYPE_AP)
continue;
for (state = IEEE80211_STA_NOTEXIST;
state < sta->sta_state; state++)
WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
state + 1));
} }
mutex_unlock(&local->sta_mtx); mutex_unlock(&local->sta_mtx);
...@@ -1383,6 +1388,24 @@ int ieee80211_reconfig(struct ieee80211_local *local) ...@@ -1383,6 +1388,24 @@ int ieee80211_reconfig(struct ieee80211_local *local)
} }
} }
/* APs are now beaconing, add back stations */
mutex_lock(&local->sta_mtx);
list_for_each_entry(sta, &local->sta_list, list) {
enum ieee80211_sta_state state;
if (!sta->uploaded)
continue;
if (sta->sdata->vif.type != NL80211_IFTYPE_AP)
continue;
for (state = IEEE80211_STA_NOTEXIST;
state < sta->sta_state; state++)
WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
state + 1));
}
mutex_unlock(&local->sta_mtx);
/* add back keys */ /* add back keys */
list_for_each_entry(sdata, &local->interfaces, list) list_for_each_entry(sdata, &local->interfaces, list)
if (ieee80211_sdata_running(sdata)) if (ieee80211_sdata_running(sdata))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment