]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: cfg80211: allow IR in 20 MHz configurations
authorAnjaneyulu <pagadala.yesu.anjaneyulu@intel.com>
Sat, 8 Mar 2025 21:03:30 +0000 (23:03 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 11 Mar 2025 09:53:01 +0000 (10:53 +0100)
Some regulatory bodies doesn't allow IR (initiate radioation) on a
specific subband, but allows it for channels with a bandwidth of 20 MHz.
Add a channel flag that indicates that, and consider it in
cfg80211_reg_check_beaconing.

While on it, fix the kernel doc of enum nl80211_reg_rule_flags and
change it to use BIT().

Signed-off-by: Anjaneyulu <pagadala.yesu.anjaneyulu@intel.com>
Co-developed-by: Somashekhar Puttagangaiah <somashekhar.puttagangaiah@intel.com>
Signed-off-by: Somashekhar Puttagangaiah <somashekhar.puttagangaiah@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250308225541.d3ab352a73ff.I8a8f79e1c9eb74936929463960ee2a324712fe51@changeid
[fix typo]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/wireless/chan.c
net/wireless/nl80211.c
net/wireless/reg.c

index 29b9cf0fe6c81c9d610ceb45a7662f14876506f8..0d423830a8ed551e8888645b56f4662e8e52724c 100644 (file)
@@ -127,6 +127,8 @@ struct wiphy;
  *     even if it is otherwise disabled.
  * @IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP: Allow using this channel for AP operation
  *     with very low power (VLP), even if otherwise set to NO_IR.
+ * @IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY: Allow activity on a 20 MHz channel,
+ *     even if otherwise set to NO_IR.
  */
 enum ieee80211_channel_flags {
        IEEE80211_CHAN_DISABLED                 = BIT(0),
@@ -155,6 +157,7 @@ enum ieee80211_channel_flags {
        IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT       = BIT(23),
        IEEE80211_CHAN_CAN_MONITOR              = BIT(24),
        IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP        = BIT(25),
+       IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY     = BIT(26),
 };
 
 #define IEEE80211_CHAN_NO_HT40 \
index c59075acdb10431a729fd6282f2d0dac32fb4054..26cae1cc87273b4c1eaf7db31b5a289bcbf64e73 100644 (file)
@@ -4335,6 +4335,8 @@ enum nl80211_wmm_rule {
  *     otherwise completely disabled.
  * @NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP: This channel can be used for a
  *     very low power (VLP) AP, despite being NO_IR.
+ * @NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY: This channel can be active in
+ *     20 MHz bandwidth, despite being NO_IR.
  * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
  *     currently defined
  * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
@@ -4379,6 +4381,7 @@ enum nl80211_frequency_attr {
        NL80211_FREQUENCY_ATTR_NO_6GHZ_AFC_CLIENT,
        NL80211_FREQUENCY_ATTR_CAN_MONITOR,
        NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP,
+       NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY,
 
        /* keep last */
        __NL80211_FREQUENCY_ATTR_AFTER_LAST,
@@ -4590,31 +4593,34 @@ enum nl80211_sched_scan_match_attr {
  * @NL80211_RRF_NO_6GHZ_AFC_CLIENT: Client connection to AFC AP not allowed
  * @NL80211_RRF_ALLOW_6GHZ_VLP_AP: Very low power (VLP) AP can be permitted
  *     despite NO_IR configuration.
+ * @NL80211_RRF_ALLOW_20MHZ_ACTIVITY: Allow activity in 20 MHz bandwidth,
+ *     despite NO_IR configuration.
  */
 enum nl80211_reg_rule_flags {
-       NL80211_RRF_NO_OFDM             = 1<<0,
-       NL80211_RRF_NO_CCK              = 1<<1,
-       NL80211_RRF_NO_INDOOR           = 1<<2,
-       NL80211_RRF_NO_OUTDOOR          = 1<<3,
-       NL80211_RRF_DFS                 = 1<<4,
-       NL80211_RRF_PTP_ONLY            = 1<<5,
-       NL80211_RRF_PTMP_ONLY           = 1<<6,
-       NL80211_RRF_NO_IR               = 1<<7,
-       __NL80211_RRF_NO_IBSS           = 1<<8,
-       NL80211_RRF_AUTO_BW             = 1<<11,
-       NL80211_RRF_IR_CONCURRENT       = 1<<12,
-       NL80211_RRF_NO_HT40MINUS        = 1<<13,
-       NL80211_RRF_NO_HT40PLUS         = 1<<14,
-       NL80211_RRF_NO_80MHZ            = 1<<15,
-       NL80211_RRF_NO_160MHZ           = 1<<16,
-       NL80211_RRF_NO_HE               = 1<<17,
-       NL80211_RRF_NO_320MHZ           = 1<<18,
-       NL80211_RRF_NO_EHT              = 1<<19,
-       NL80211_RRF_PSD                 = 1<<20,
-       NL80211_RRF_DFS_CONCURRENT      = 1<<21,
-       NL80211_RRF_NO_6GHZ_VLP_CLIENT  = 1<<22,
-       NL80211_RRF_NO_6GHZ_AFC_CLIENT  = 1<<23,
-       NL80211_RRF_ALLOW_6GHZ_VLP_AP   = 1<<24,
+       NL80211_RRF_NO_OFDM                 = 1 << 0,
+       NL80211_RRF_NO_CCK                  = 1 << 1,
+       NL80211_RRF_NO_INDOOR               = 1 << 2,
+       NL80211_RRF_NO_OUTDOOR              = 1 << 3,
+       NL80211_RRF_DFS                     = 1 << 4,
+       NL80211_RRF_PTP_ONLY                = 1 << 5,
+       NL80211_RRF_PTMP_ONLY               = 1 << 6,
+       NL80211_RRF_NO_IR                   = 1 << 7,
+       __NL80211_RRF_NO_IBSS               = 1 << 8,
+       NL80211_RRF_AUTO_BW                 = 1 << 11,
+       NL80211_RRF_IR_CONCURRENT           = 1 << 12,
+       NL80211_RRF_NO_HT40MINUS            = 1 << 13,
+       NL80211_RRF_NO_HT40PLUS             = 1 << 14,
+       NL80211_RRF_NO_80MHZ                = 1 << 15,
+       NL80211_RRF_NO_160MHZ               = 1 << 16,
+       NL80211_RRF_NO_HE                   = 1 << 17,
+       NL80211_RRF_NO_320MHZ               = 1 << 18,
+       NL80211_RRF_NO_EHT                  = 1 << 19,
+       NL80211_RRF_PSD                     = 1 << 20,
+       NL80211_RRF_DFS_CONCURRENT          = 1 << 21,
+       NL80211_RRF_NO_6GHZ_VLP_CLIENT      = 1 << 22,
+       NL80211_RRF_NO_6GHZ_AFC_CLIENT      = 1 << 23,
+       NL80211_RRF_ALLOW_6GHZ_VLP_AP       = 1 << 24,
+       NL80211_RRF_ALLOW_20MHZ_ACTIVITY    = 1 << 25,
 };
 
 #define NL80211_RRF_PASSIVE_SCAN       NL80211_RRF_NO_IR
index 9f918b77b40e2323aa0c883b21071d9308e64399..4cdb74a3f38c6a464d8e359cf5ec28ecb93f5bab 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright 2009      Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
- * Copyright 2018-2024 Intel Corporation
+ * Copyright 2018-2025 Intel Corporation
  */
 
 #include <linux/export.h>
@@ -1497,6 +1497,12 @@ bool cfg80211_reg_check_beaconing(struct wiphy *wiphy,
        if (cfg->reg_power == IEEE80211_REG_VLP_AP)
                permitting_flags |= IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP;
 
+       if ((cfg->iftype == NL80211_IFTYPE_P2P_GO ||
+            cfg->iftype == NL80211_IFTYPE_AP) &&
+           (chandef->width == NL80211_CHAN_WIDTH_20_NOHT ||
+            chandef->width == NL80211_CHAN_WIDTH_20))
+               permitting_flags |= IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY;
+
        return _cfg80211_reg_can_beacon(wiphy, chandef, cfg->iftype,
                                        check_no_ir ? IEEE80211_CHAN_NO_IR : 0,
                                        permitting_flags);
index e2e8c368fbbf9ccd84a46d46419a91ffac32bcc9..aee49d43cf862de684194e8f7b40dbc6a1654707 100644 (file)
@@ -1235,6 +1235,10 @@ static int nl80211_msg_put_channel(struct sk_buff *msg, struct wiphy *wiphy,
                if ((chan->flags & IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP) &&
                    nla_put_flag(msg, NL80211_FREQUENCY_ATTR_ALLOW_6GHZ_VLP_AP))
                        goto nla_put_failure;
+               if ((chan->flags & IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY) &&
+                   nla_put_flag(msg,
+                                NL80211_FREQUENCY_ATTR_ALLOW_20MHZ_ACTIVITY))
+                       goto nla_put_failure;
        }
 
        if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
index 2dd0533e766050209bab574fa2207e6eafadc2ee..9314f7fcd54bbdff982e3fe3f86c9c0bdaa1ac3e 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2008-2011 Luis R. Rodriguez <mcgrof@qca.qualcomm.com>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright      2017  Intel Deutschland GmbH
- * Copyright (C) 2018 - 2024 Intel Corporation
+ * Copyright (C) 2018 - 2025 Intel Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -1602,6 +1602,8 @@ static u32 map_regdom_flags(u32 rd_flags)
                channel_flags |= IEEE80211_CHAN_PSD;
        if (rd_flags & NL80211_RRF_ALLOW_6GHZ_VLP_AP)
                channel_flags |= IEEE80211_CHAN_ALLOW_6GHZ_VLP_AP;
+       if (rd_flags & NL80211_RRF_ALLOW_20MHZ_ACTIVITY)
+               channel_flags |= IEEE80211_CHAN_ALLOW_20MHZ_ACTIVITY;
        return channel_flags;
 }