]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mac80211: fix puncturing bitmap handling in CSA
authorJohannes Berg <johannes.berg@intel.com>
Wed, 16 Aug 2023 10:13:36 +0000 (12:13 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Sep 2023 07:48:06 +0000 (09:48 +0200)
[ Upstream commit 927521170c4a18c620f97865f7bad48f17c48967 ]

Code inspection reveals that we switch the puncturing bitmap
before the real channel switch, since that happens only in
the second round of the worker after the channel context is
switched by ieee80211_link_use_reserved_context().

Fixes: 2cc25e4b2a04 ("wifi: mac80211: configure puncturing bitmap")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/mac80211/cfg.c

index f2d08dbccfb7d347111d1596b0f8dc7c852f13b2..30d69091064fec122f28a773c6ed613de76520ff 100644 (file)
@@ -3640,12 +3640,6 @@ static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
        lockdep_assert_held(&local->mtx);
        lockdep_assert_held(&local->chanctx_mtx);
 
-       if (sdata->vif.bss_conf.eht_puncturing != sdata->vif.bss_conf.csa_punct_bitmap) {
-               sdata->vif.bss_conf.eht_puncturing =
-                                       sdata->vif.bss_conf.csa_punct_bitmap;
-               changed |= BSS_CHANGED_EHT_PUNCTURING;
-       }
-
        /*
         * using reservation isn't immediate as it may be deferred until later
         * with multi-vif. once reservation is complete it will re-schedule the
@@ -3675,6 +3669,12 @@ static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
        if (err)
                return err;
 
+       if (sdata->vif.bss_conf.eht_puncturing != sdata->vif.bss_conf.csa_punct_bitmap) {
+               sdata->vif.bss_conf.eht_puncturing =
+                                       sdata->vif.bss_conf.csa_punct_bitmap;
+               changed |= BSS_CHANGED_EHT_PUNCTURING;
+       }
+
        ieee80211_link_info_change_notify(sdata, &sdata->deflink, changed);
 
        if (sdata->deflink.csa_block_tx) {