]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: mld: set wiphy::iftype_ext_capab dynamically
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Mon, 15 Sep 2025 08:34:32 +0000 (11:34 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Tue, 28 Oct 2025 14:17:26 +0000 (16:17 +0200)
Instead of having a static const array for each possible combination of
features, build the extended capabilities dynamically.

With this we will also stop setting EHT capabilities when it might
actually be disabled.

Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250915113137.b3c03b56d5a3.I38eaf8ebaf3256e78b4643bef7e3a54aeb4989df@changeid
drivers/net/wireless/intel/iwlwifi/mld/constants.h
drivers/net/wireless/intel/iwlwifi/mld/mac80211.c
drivers/net/wireless/intel/iwlwifi/mld/mld.h

index 49accf96f44b66a1c83a74b2e2c8f84351d09799..5d23a618ae3ca22ad0c1ebd77555aacfdbb9b6b4 100644 (file)
@@ -75,5 +75,7 @@
 #define IWL_MLD_FTM_RESP_LMR_FEEDBACK_SUPPORT  true
 #define IWL_MLD_FTM_NON_TB_MIN_TIME_BETWEEN_MSR        7
 #define IWL_MLD_FTM_NON_TB_MAX_TIME_BETWEEN_MSR        1000
+#define IWL_MLD_STA_EXT_CAPA_SIZE              9
+#define IWL_MLD_EXT_CAPA_NUM_IFTYPES           1
 
 #endif /* __iwl_mld_constants_h__ */
index 98d47fed84215787be71cbd2a1c6347befd8fdfd..5323c73ac827734c188e51407f2f8678065818ce 100644 (file)
@@ -76,13 +76,12 @@ iwl_mld_iface_combinations[] = {
        },
 };
 
-static const u8 if_types_ext_capa_sta[] = {
-        [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
-        [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
-        [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF |
-              WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB,
-        [8] = WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB,
-        [9] = WLAN_EXT_CAPA10_TWT_REQUESTER_SUPPORT,
+static const u8 ext_capa_base[IWL_MLD_STA_EXT_CAPA_SIZE] = {
+       [0] = WLAN_EXT_CAPA1_EXT_CHANNEL_SWITCHING,
+       [2] = WLAN_EXT_CAPA3_MULTI_BSSID_SUPPORT,
+       [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF |
+             WLAN_EXT_CAPA8_MAX_MSDU_IN_AMSDU_LSB,
+       [8] = WLAN_EXT_CAPA9_MAX_MSDU_IN_AMSDU_MSB,
 };
 
 #define IWL_MLD_EMLSR_CAPA     (IEEE80211_EML_CAP_EMLSR_SUPP | \
@@ -95,18 +94,6 @@ static const u8 if_types_ext_capa_sta[] = {
                        IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP_SAME) | \
                        IEEE80211_MLD_CAP_OP_LINK_RECONF_SUPPORT)
 
-static const struct wiphy_iftype_ext_capab iftypes_ext_capa[] = {
-       {
-               .iftype = NL80211_IFTYPE_STATION,
-               .extended_capabilities = if_types_ext_capa_sta,
-               .extended_capabilities_mask = if_types_ext_capa_sta,
-               .extended_capabilities_len = sizeof(if_types_ext_capa_sta),
-               /* relevant only if EHT is supported */
-               .eml_capabilities = IWL_MLD_EMLSR_CAPA,
-               .mld_capa_and_ops = IWL_MLD_CAPA_OPS,
-       },
-};
-
 static void iwl_mld_hw_set_addresses(struct iwl_mld *mld)
 {
        struct wiphy *wiphy = mld->wiphy;
@@ -336,21 +323,37 @@ static void iwl_mac_hw_set_wiphy(struct iwl_mld *mld)
        if (fw_has_capa(ucode_capa, IWL_UCODE_TLV_CAPA_PROTECTED_TWT))
                wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_PROTECTED_TWT);
 
-       wiphy->iftype_ext_capab = NULL;
-       wiphy->num_iftype_ext_capab = 0;
-
-       if (!iwlwifi_mod_params.disable_11ax) {
-               wiphy->iftype_ext_capab = iftypes_ext_capa;
-               wiphy->num_iftype_ext_capab = ARRAY_SIZE(iftypes_ext_capa);
-
-               ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
-               ieee80211_hw_set(hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
-       }
-
        if (iwlmld_mod_params.power_scheme != IWL_POWER_SCHEME_CAM)
                wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
        else
                wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
+
+       /* We are done for non-HE */
+       if (iwlwifi_mod_params.disable_11ax)
+               return;
+
+       ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);
+       ieee80211_hw_set(hw, SUPPORTS_ONLY_HE_MULTI_BSSID);
+
+       wiphy->iftype_ext_capab = mld->ext_capab;
+       wiphy->num_iftype_ext_capab = ARRAY_SIZE(mld->ext_capab);
+
+       BUILD_BUG_ON(sizeof(mld->sta_ext_capab) < sizeof(ext_capa_base));
+
+       memcpy(mld->sta_ext_capab, ext_capa_base, sizeof(ext_capa_base));
+
+       mld->ext_capab[0].iftype = NL80211_IFTYPE_STATION;
+       mld->ext_capab[0].extended_capabilities = mld->sta_ext_capab;
+       mld->ext_capab[0].extended_capabilities_mask = mld->sta_ext_capab;
+       mld->ext_capab[0].extended_capabilities_len = sizeof(mld->sta_ext_capab);
+
+       if (!mld->nvm_data->sku_cap_11be_enable ||
+           iwlwifi_mod_params.disable_11be)
+               return;
+
+       mld->ext_capab[0].eml_capabilities = IWL_MLD_EMLSR_CAPA;
+       mld->ext_capab[0].mld_capa_and_ops = IWL_MLD_CAPA_OPS;
+
 }
 
 static void iwl_mac_hw_set_misc(struct iwl_mld *mld)
index b1d44fdaa61b0a922ec1c53c63c32aeec7ad4893..ceda12c1672d9932b4e8b4a5156cf6fe3ec23cc8 100644 (file)
  * @fw: a pointer to the fw object
  * @hw: pointer to the hw object.
  * @wiphy: a pointer to the wiphy struct, for easier access to it.
+ * @ext_capab: extended capabilities that will be set to wiphy on registration.
+ * @sta_ext_capab: extended capabilities for the station interface.
  * @nvm_data: pointer to the nvm_data that includes all our capabilities
  * @fwrt: fw runtime data
  * @debugfs_dir: debugfs directory
@@ -227,6 +229,8 @@ struct iwl_mld {
        const struct iwl_fw *fw;
        struct ieee80211_hw *hw;
        struct wiphy *wiphy;
+       struct wiphy_iftype_ext_capab ext_capab[IWL_MLD_EXT_CAPA_NUM_IFTYPES];
+       u8 sta_ext_capab[IWL_MLD_STA_EXT_CAPA_SIZE];
        struct iwl_nvm_data *nvm_data;
        struct iwl_fw_runtime fwrt;
        struct dentry *debugfs_dir;