mac80211: reassign channel contexts before stations
Since channel contexts are usually present before stations can be added to an interface, reassign before stations them in reconfiguration as well. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -1422,6 +1422,23 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||||||
WARN_ON(drv_add_chanctx(local, ctx));
|
WARN_ON(drv_add_chanctx(local, ctx));
|
||||||
mutex_unlock(&local->chanctx_mtx);
|
mutex_unlock(&local->chanctx_mtx);
|
||||||
|
|
||||||
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||||
|
struct ieee80211_chanctx_conf *ctx_conf;
|
||||||
|
|
||||||
|
if (!ieee80211_sdata_running(sdata))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
mutex_lock(&local->chanctx_mtx);
|
||||||
|
ctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
|
||||||
|
lockdep_is_held(&local->chanctx_mtx));
|
||||||
|
if (ctx_conf) {
|
||||||
|
ctx = container_of(ctx_conf, struct ieee80211_chanctx,
|
||||||
|
conf);
|
||||||
|
drv_assign_vif_chanctx(local, sdata, ctx);
|
||||||
|
}
|
||||||
|
mutex_unlock(&local->chanctx_mtx);
|
||||||
|
}
|
||||||
|
|
||||||
/* 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) {
|
||||||
@@ -1462,22 +1479,11 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||||||
|
|
||||||
/* Finally also reconfigure all the BSS information */
|
/* Finally also reconfigure all the BSS information */
|
||||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||||
struct ieee80211_chanctx_conf *ctx_conf;
|
|
||||||
u32 changed;
|
u32 changed;
|
||||||
|
|
||||||
if (!ieee80211_sdata_running(sdata))
|
if (!ieee80211_sdata_running(sdata))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mutex_lock(&local->chanctx_mtx);
|
|
||||||
ctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
|
|
||||||
lockdep_is_held(&local->chanctx_mtx));
|
|
||||||
if (ctx_conf) {
|
|
||||||
ctx = container_of(ctx_conf, struct ieee80211_chanctx,
|
|
||||||
conf);
|
|
||||||
drv_assign_vif_chanctx(local, sdata, ctx);
|
|
||||||
}
|
|
||||||
mutex_unlock(&local->chanctx_mtx);
|
|
||||||
|
|
||||||
/* common change flags for all interface types */
|
/* common change flags for all interface types */
|
||||||
changed = BSS_CHANGED_ERP_CTS_PROT |
|
changed = BSS_CHANGED_ERP_CTS_PROT |
|
||||||
BSS_CHANGED_ERP_PREAMBLE |
|
BSS_CHANGED_ERP_PREAMBLE |
|
||||||
|
Reference in New Issue
Block a user