wifi: mac80211: make ieee80211_chan_bw_change() able to use reserved
Make ieee80211_chan_bw_change() able to use the reserved chanreq (really the chandef part of it) for the calculations, so it can be used _without_ applying the changes first. Remove the comment that indicates this is required, since it no longer is. However, this capability only gets used later. Also, this is not ideal, we really should not different so much between reserved and non-reserved usage, to simplify. That's a further cleanup later though. Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20240612143418.1a08cf83b8cb.Ie567bb272eb25ce487651088f13ad041f549651c@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
7d2bad829c
commit
b275123685
@ -396,12 +396,9 @@ _ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
|
|||||||
return IEEE80211_CHANCTX_CHANGE_MIN_WIDTH;
|
return IEEE80211_CHANCTX_CHANGE_MIN_WIDTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calling this function is assuming that station vif is updated to
|
|
||||||
* lates changes by calling ieee80211_link_update_chanreq
|
|
||||||
*/
|
|
||||||
static void ieee80211_chan_bw_change(struct ieee80211_local *local,
|
static void ieee80211_chan_bw_change(struct ieee80211_local *local,
|
||||||
struct ieee80211_chanctx *ctx,
|
struct ieee80211_chanctx *ctx,
|
||||||
bool narrowed)
|
bool reserved, bool narrowed)
|
||||||
{
|
{
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
struct ieee80211_supported_band *sband =
|
struct ieee80211_supported_band *sband =
|
||||||
@ -418,13 +415,17 @@ static void ieee80211_chan_bw_change(struct ieee80211_local *local,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (link_id = 0; link_id < ARRAY_SIZE(sta->sdata->link); link_id++) {
|
for (link_id = 0; link_id < ARRAY_SIZE(sta->sdata->link); link_id++) {
|
||||||
struct ieee80211_bss_conf *link_conf =
|
struct ieee80211_link_data *link =
|
||||||
rcu_dereference(sdata->vif.link_conf[link_id]);
|
rcu_dereference(sdata->link[link_id]);
|
||||||
|
struct ieee80211_bss_conf *link_conf;
|
||||||
|
struct cfg80211_chan_def *new_chandef;
|
||||||
struct link_sta_info *link_sta;
|
struct link_sta_info *link_sta;
|
||||||
|
|
||||||
if (!link_conf)
|
if (!link)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
link_conf = link->conf;
|
||||||
|
|
||||||
if (rcu_access_pointer(link_conf->chanctx_conf) != &ctx->conf)
|
if (rcu_access_pointer(link_conf->chanctx_conf) != &ctx->conf)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -432,7 +433,13 @@ static void ieee80211_chan_bw_change(struct ieee80211_local *local,
|
|||||||
if (!link_sta)
|
if (!link_sta)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
new_sta_bw = ieee80211_sta_cur_vht_bw(link_sta);
|
if (reserved)
|
||||||
|
new_chandef = &link->reserved.oper;
|
||||||
|
else
|
||||||
|
new_chandef = &link_conf->chanreq.oper;
|
||||||
|
|
||||||
|
new_sta_bw = _ieee80211_sta_cur_vht_bw(link_sta,
|
||||||
|
new_chandef);
|
||||||
|
|
||||||
/* nothing change */
|
/* nothing change */
|
||||||
if (new_sta_bw == link_sta->pub->bandwidth)
|
if (new_sta_bw == link_sta->pub->bandwidth)
|
||||||
@ -466,12 +473,12 @@ void ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* check is BW narrowed */
|
/* check is BW narrowed */
|
||||||
ieee80211_chan_bw_change(local, ctx, true);
|
ieee80211_chan_bw_change(local, ctx, false, true);
|
||||||
|
|
||||||
drv_change_chanctx(local, ctx, changed);
|
drv_change_chanctx(local, ctx, changed);
|
||||||
|
|
||||||
/* check is BW wider */
|
/* check is BW wider */
|
||||||
ieee80211_chan_bw_change(local, ctx, false);
|
ieee80211_chan_bw_change(local, ctx, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _ieee80211_change_chanctx(struct ieee80211_local *local,
|
static void _ieee80211_change_chanctx(struct ieee80211_local *local,
|
||||||
@ -505,7 +512,7 @@ static void _ieee80211_change_chanctx(struct ieee80211_local *local,
|
|||||||
* due to maybe not returning from it, e.g in case new context was added
|
* due to maybe not returning from it, e.g in case new context was added
|
||||||
* first time with all parameters up to date.
|
* first time with all parameters up to date.
|
||||||
*/
|
*/
|
||||||
ieee80211_chan_bw_change(local, old_ctx, true);
|
ieee80211_chan_bw_change(local, old_ctx, false, true);
|
||||||
|
|
||||||
if (ieee80211_chanreq_identical(&ctx_req, chanreq)) {
|
if (ieee80211_chanreq_identical(&ctx_req, chanreq)) {
|
||||||
ieee80211_recalc_chanctx_min_def(local, ctx, rsvd_for);
|
ieee80211_recalc_chanctx_min_def(local, ctx, rsvd_for);
|
||||||
@ -536,7 +543,7 @@ static void _ieee80211_change_chanctx(struct ieee80211_local *local,
|
|||||||
drv_change_chanctx(local, ctx, changed);
|
drv_change_chanctx(local, ctx, changed);
|
||||||
|
|
||||||
/* check if BW is wider */
|
/* check if BW is wider */
|
||||||
ieee80211_chan_bw_change(local, old_ctx, false);
|
ieee80211_chan_bw_change(local, old_ctx, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ieee80211_change_chanctx(struct ieee80211_local *local,
|
static void ieee80211_change_chanctx(struct ieee80211_local *local,
|
||||||
|
Loading…
Reference in New Issue
Block a user