diff options
author | Johannes Berg <johannes.berg@intel.com> | 2023-05-04 16:45:04 +0300 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2023-05-16 10:26:00 -0700 |
commit | 04312de4ced4b152749614e8179f3978a20a992f (patch) | |
tree | b68728f813ee12d3e773fbd265e06f8f6d8f6a64 | |
parent | b72a455a2409fd94d6d9b4eb51d659a88213243b (diff) | |
download | linux-04312de4ced4b152749614e8179f3978a20a992f.tar.gz linux-04312de4ced4b152749614e8179f3978a20a992f.tar.bz2 linux-04312de4ced4b152749614e8179f3978a20a992f.zip |
wifi: mac80211: recalc chanctx mindef before assigning
When we allocate a new channel context, or find an existing one
that is compatible, we currently assign it to a link before its
mindef is updated. This leads to strange situations, especially
in link switching where you switch to an 80 MHz link and expect
it to be active immediately, but the mindef is still configured
to 20 MHz while assigning. Also, it's strange that the chandef
passed to the assign method's argument is wider than the one in
the context.
Fix this by calculating the mindef with the new link considered
before calling the driver.
In particular, this fixes an iwlwifi problem during link switch
where the firmware would assert because the (link) station that
was added for the AP is configured to transmit at a bandwidth
that's wider than the channel context that it's configured on.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230504134511.828474-5-gregory.greenman@intel.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | net/mac80211/chan.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c index 1b182cf9d661..77c90ed8f5d7 100644 --- a/net/mac80211/chan.c +++ b/net/mac80211/chan.c @@ -871,6 +871,9 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link, } if (new_ctx) { + /* recalc considering the link we'll use it for now */ + ieee80211_recalc_chanctx_min_def(local, new_ctx, link); + ret = drv_assign_vif_chanctx(local, sdata, link->conf, new_ctx); if (ret) goto out; |