wifi: iwlwifi: parse active and 20 MHz AP NVM channel flag
authorAnjaneyulu <pagadala.yesu.anjaneyulu@intel.com>
Wed, 23 Apr 2025 06:16:30 +0000 (09:16 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 23 Apr 2025 13:37:38 +0000 (15:37 +0200)
Configure 20 MHz AP mode based on NVM settings, set the
NL80211_RRF_ALLOW_20MHZ_ACTIVITY flag, when the NVM indicates
that an access point can operate in 20 MHz only.

Signed-off-by: Somashekhar Puttagangaiah <somashekhar.puttagangaiah@intel.com>
Signed-off-by: Pagadala Yesu Anjaneyulu <pagadala.yesu.anjaneyulu@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250423091408.897d826a8612.I1f7f84f4485ed3928070c97a031110ccb608bda8@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c

index cd1b004..018752b 100644 (file)
@@ -143,6 +143,9 @@ static struct ieee80211_rate iwl_cfg80211_rates[] = {
  * @NVM_CHANNEL_VALID: channel is usable for this SKU/geo
  * @NVM_CHANNEL_IBSS: usable as an IBSS channel and deprecated
  *     when %IWL_NVM_SBANDS_FLAGS_LAR enabled.
+ * @NVM_CHANNEL_ALLOW_20MHZ_ACTIVITY: active scanning allowed and
+ *     AP allowed only in 20 MHz. Valid only
+ *     when %IWL_NVM_SBANDS_FLAGS_LAR enabled.
  * @NVM_CHANNEL_ACTIVE: active scanning allowed and allows IBSS
  *     when %IWL_NVM_SBANDS_FLAGS_LAR enabled.
  * @NVM_CHANNEL_RADAR: radar detection required
@@ -159,20 +162,21 @@ static struct ieee80211_rate iwl_cfg80211_rates[] = {
  * @NVM_CHANNEL_AFC: client support connection to UHB AFC AP
  */
 enum iwl_nvm_channel_flags {
-       NVM_CHANNEL_VALID               = BIT(0),
-       NVM_CHANNEL_IBSS                = BIT(1),
-       NVM_CHANNEL_ACTIVE              = BIT(3),
-       NVM_CHANNEL_RADAR               = BIT(4),
-       NVM_CHANNEL_INDOOR_ONLY         = BIT(5),
-       NVM_CHANNEL_GO_CONCURRENT       = BIT(6),
-       NVM_CHANNEL_UNIFORM             = BIT(7),
-       NVM_CHANNEL_20MHZ               = BIT(8),
-       NVM_CHANNEL_40MHZ               = BIT(9),
-       NVM_CHANNEL_80MHZ               = BIT(10),
-       NVM_CHANNEL_160MHZ              = BIT(11),
-       NVM_CHANNEL_DC_HIGH             = BIT(12),
-       NVM_CHANNEL_VLP                 = BIT(13),
-       NVM_CHANNEL_AFC                 = BIT(14),
+       NVM_CHANNEL_VALID                   = BIT(0),
+       NVM_CHANNEL_IBSS                    = BIT(1),
+       NVM_CHANNEL_ALLOW_20MHZ_ACTIVITY    = BIT(2),
+       NVM_CHANNEL_ACTIVE                  = BIT(3),
+       NVM_CHANNEL_RADAR                   = BIT(4),
+       NVM_CHANNEL_INDOOR_ONLY             = BIT(5),
+       NVM_CHANNEL_GO_CONCURRENT           = BIT(6),
+       NVM_CHANNEL_UNIFORM                 = BIT(7),
+       NVM_CHANNEL_20MHZ                   = BIT(8),
+       NVM_CHANNEL_40MHZ                   = BIT(9),
+       NVM_CHANNEL_80MHZ                   = BIT(10),
+       NVM_CHANNEL_160MHZ                  = BIT(11),
+       NVM_CHANNEL_DC_HIGH                 = BIT(12),
+       NVM_CHANNEL_VLP                     = BIT(13),
+       NVM_CHANNEL_AFC                     = BIT(14),
 };
 
 /**
@@ -1659,6 +1663,10 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan,
        if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
                flags |= NL80211_RRF_NO_OUTDOOR;
 
+       if (nvm_flags & NVM_CHANNEL_ALLOW_20MHZ_ACTIVITY &&
+           flags & NL80211_RRF_NO_IR)
+               flags |= NL80211_RRF_ALLOW_20MHZ_ACTIVITY;
+
        /* Set the GO concurrent flag only in case that NO_IR is set.
         * Otherwise it is meaningless
         */