wifi: iwlwifi: mvm: add support for Extra EHT LTF
authorGregory Greenman <gregory.greenman@intel.com>
Tue, 13 Jun 2023 12:57:19 +0000 (15:57 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 14 Jun 2023 10:32:20 +0000 (12:32 +0200)
Add support for Extra EHT LTF defined in 9.4.2.313
EHT Capabilities element.

Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230613155501.de019d7cc174.I806f0f6042b89274192701a60b4f7900822db666@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/rs.h
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
drivers/net/wireless/intel/iwlwifi/mvm/rs-fw.c
include/linux/ieee80211.h

index c9a48fc5fac88bdfe14e8bc98364ed2ccd472953..a1a272433b09b453fd91344960c73698891059f5 100644 (file)
@@ -21,6 +21,7 @@
  * @IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_2_MSK: enable HE Dual Carrier Modulation
  *                                         for BPSK (MCS 0) with 2 spatial
  *                                         streams
+ * @IWL_TLC_MNG_CFG_FLAGS_EHT_EXTRA_LTF_MSK: enable support for EHT extra LTF
  */
 enum iwl_tlc_mng_cfg_flags {
        IWL_TLC_MNG_CFG_FLAGS_STBC_MSK                  = BIT(0),
@@ -28,6 +29,7 @@ enum iwl_tlc_mng_cfg_flags {
        IWL_TLC_MNG_CFG_FLAGS_HE_STBC_160MHZ_MSK        = BIT(2),
        IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_1_MSK          = BIT(3),
        IWL_TLC_MNG_CFG_FLAGS_HE_DCM_NSS_2_MSK          = BIT(4),
+       IWL_TLC_MNG_CFG_FLAGS_EHT_EXTRA_LTF_MSK         = BIT(6),
 };
 
 /**
index 7edb98ef809369aee30db2c1cc133381a8c2b696..fad71f490313a0aab20521b8dd1125b147fc4374 100644 (file)
@@ -1012,6 +1012,8 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
                iftype_data->eht_cap.eht_cap_elem.phy_cap_info[6] &=
                        ~(IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK |
                          IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP);
+               iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] |=
+                       IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF;
        }
 
        if (fw_has_capa(&fw->ucode_capa, IWL_UCODE_TLV_CAPA_BROADCAST_TWT))
index e77b6157f759cfd29a1a9be9846fad3fbafaba3d..7c6eff4fa58a37780e3b3a6820b4b84e6c0f4556 100644 (file)
@@ -591,6 +591,21 @@ void iwl_mvm_rs_fw_rate_init(struct iwl_mvm *mvm,
        int cmd_ver;
        int ret;
 
+       /* Enable external EHT LTF only for GL device and if there's
+        * mutual support by AP and client
+        */
+       if (CSR_HW_REV_TYPE(mvm->trans->hw_rev) == IWL_CFG_MAC_TYPE_GL &&
+           sband->iftype_data->eht_cap.has_eht &&
+           sband->iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] &
+           IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF &&
+           link_sta->eht_cap.has_eht &&
+           link_sta->eht_cap.eht_cap_elem.phy_cap_info[5] &
+           IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF) {
+               IWL_DEBUG_RATE(mvm, "Set support for Extra EHT LTF\n");
+               cfg_cmd.flags |=
+                       cpu_to_le16(IWL_TLC_MNG_CFG_FLAGS_EHT_EXTRA_LTF_MSK);
+       }
+
        rcu_read_lock();
        mvm_link_sta = rcu_dereference(mvmsta->link[link_id]);
        if (WARN_ON_ONCE(!mvm_link_sta)) {
index 516cd32d619658eaf582ef4f28050824cf119b20..5dfed1a6625c96cf2cb3e6ca340b5bce9f055682 100644 (file)
@@ -2859,6 +2859,7 @@ ieee80211_he_spr_size(const u8 *he_spr_ie)
 
 /* Maximum number of supported EHT LTF is split */
 #define IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK       0xc0
+#define IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF              0x40
 #define IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK       0x07
 
 #define IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK                 0x78