]> Gentwo Git Trees - linux/.git/commitdiff
wifi: mac80211: allow sharing identical chanctx for S1G interfaces
authorLachlan Hodges <lachlan.hodges@morsemicro.com>
Wed, 26 Nov 2025 01:57:58 +0000 (12:57 +1100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 26 Nov 2025 09:34:51 +0000 (10:34 +0100)
Introduce support for sharing identical channel contexts for S1G
interfaces. Additionally, do not downgrade channel requests for
S1G interfaces.

Signed-off-by: Lachlan Hodges <lachlan.hodges@morsemicro.com>
Link: https://patch.msgid.link/20251126015758.149034-1-lachlan.hodges@morsemicro.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/chan.c
net/mac80211/mlme.c

index c8aba4183c9a2a0b758669c1661639a30bb818c6..d0bfb12164016eb9a057dd40b3878df1f19fb4f6 100644 (file)
@@ -654,8 +654,19 @@ static void _ieee80211_change_chanctx(struct ieee80211_local *local,
        };
        u32 changed = 0;
 
-       /* expected to handle only 20/40/80/160/320 channel widths */
+       /* 5/10 MHz not handled here */
        switch (chandef->width) {
+       case NL80211_CHAN_WIDTH_1:
+       case NL80211_CHAN_WIDTH_2:
+       case NL80211_CHAN_WIDTH_4:
+       case NL80211_CHAN_WIDTH_8:
+       case NL80211_CHAN_WIDTH_16:
+               /*
+                * mac80211 currently only supports sharing identical
+                * chanctx's for S1G interfaces.
+                */
+               WARN_ON(!ieee80211_chanreq_identical(&ctx_req, chanreq));
+               return;
        case NL80211_CHAN_WIDTH_20_NOHT:
        case NL80211_CHAN_WIDTH_20:
        case NL80211_CHAN_WIDTH_40:
index c705d3f45affe8c63d71f0464f93b698b2bc7ad0..e56ad4b9330f270f88bd13332a9bf45958835ce3 100644 (file)
@@ -6108,9 +6108,10 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
        ret = ieee80211_link_use_channel(link, &chanreq,
                                         IEEE80211_CHANCTX_SHARED);
 
-       /* don't downgrade for 5 and 10 MHz channels, though. */
+       /* don't downgrade for 5/10/S1G MHz channels, though. */
        if (chanreq.oper.width == NL80211_CHAN_WIDTH_5 ||
-           chanreq.oper.width == NL80211_CHAN_WIDTH_10)
+           chanreq.oper.width == NL80211_CHAN_WIDTH_10 ||
+           cfg80211_chandef_is_s1g(&chanreq.oper))
                return ret;
 
        while (ret && chanreq.oper.width != NL80211_CHAN_WIDTH_20_NOHT) {