wifi: iwlwifi: Add support for new 802.11be device
authorMukesh Sisodiya <mukesh.sisodiya@intel.com>
Tue, 23 Jan 2024 18:08:10 +0000 (20:08 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 26 Jan 2024 08:47:25 +0000 (09:47 +0100)
Add support for the new 802.11be device with limites capabilities:
- 320 MHz isn't supported
- MCSs 12 and 13 are not supported

Signed-off-by: Mukesh Sisodiya <mukesh.sisodiya@intel.com>
Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240123200528.8529bd2acedf.I25dccb7bbeb21b8df2123fad51dde7fcf137a508@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/cfg/bz.c
drivers/net/wireless/intel/iwlwifi/fw/pnvm.c
drivers/net/wireless/intel/iwlwifi/iwl-config.h
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
drivers/net/wireless/intel/iwlwifi/iwl-trans.h
drivers/net/wireless/intel/iwlwifi/pcie/drv.c

index 82da957adcf6e832b33ad0f6ca2728f9e4d63c44..21fdaf8e0e0e3928c98ca30babf8deec4dfed2d3 100644 (file)
@@ -153,6 +153,7 @@ const struct iwl_cfg_trans_params iwl_bz_trans_cfg = {
 };
 
 const char iwl_bz_name[] = "Intel(R) TBD Bz device";
+const char iwl_mtp_name[] = "Intel(R) Wi-Fi 7 BE202 160MHz";
 
 const struct iwl_cfg iwl_cfg_bz = {
        .fw_name_mac = "bz",
index 650e4bde9c17b999411b013f8bfebc4df78de80b..d467ec0e35520b46f221ff5af704c4b44d1febca 100644 (file)
@@ -12,6 +12,8 @@
 #include "fw/api/alive.h"
 #include "fw/uefi.h"
 
+#define IWL_PNVM_REDUCED_CAP_BIT BIT(25)
+
 struct iwl_pnvm_section {
        __le32 offset;
        const u8 data[];
@@ -173,6 +175,7 @@ static int iwl_pnvm_parse(struct iwl_trans *trans, const u8 *data,
 
        while (len >= sizeof(*tlv)) {
                u32 tlv_len, tlv_type;
+               u32 rf_type;
 
                len -= sizeof(*tlv);
                tlv = (const void *)data;
@@ -201,6 +204,16 @@ static int iwl_pnvm_parse(struct iwl_trans *trans, const u8 *data,
                        data += sizeof(*tlv) + ALIGN(tlv_len, 4);
                        len -= ALIGN(tlv_len, 4);
 
+                       trans->reduced_cap_sku = false;
+                       rf_type = CSR_HW_RFID_TYPE(trans->hw_rf_id);
+                       if ((trans->sku_id[0] & IWL_PNVM_REDUCED_CAP_BIT) &&
+                           rf_type == IWL_CFG_RF_TYPE_FM)
+                               trans->reduced_cap_sku = true;
+
+                       IWL_DEBUG_FW(trans,
+                                    "Reduced SKU device %d\n",
+                                    trans->reduced_cap_sku);
+
                        if (trans->sku_id[0] == le32_to_cpu(sku_id->data[0]) &&
                            trans->sku_id[1] == le32_to_cpu(sku_id->data[1]) &&
                            trans->sku_id[2] == le32_to_cpu(sku_id->data[2])) {
index b3c6847cccf189f713599c431fdd836f39ee84f8..97e73443316a1264009c2f698ef0f3199e37d6ee 100644 (file)
@@ -443,6 +443,9 @@ struct iwl_cfg {
 #define IWL_CFG_NO_160                 0x1
 #define IWL_CFG_160                    0x0
 
+#define IWL_CFG_NO_320                 0x1
+#define IWL_CFG_320                    0x0
+
 #define IWL_CFG_CORES_BT               0x0
 #define IWL_CFG_CORES_BT_GNSS          0x5
 
@@ -536,6 +539,7 @@ extern const char iwl_ax221_name[];
 extern const char iwl_ax231_name[];
 extern const char iwl_ax411_name[];
 extern const char iwl_bz_name[];
+extern const char iwl_mtp_name[];
 extern const char iwl_sc_name[];
 #if IS_ENABLED(CONFIG_IWLDVM)
 extern const struct iwl_cfg iwl5300_agn_cfg;
index 402896988686990fdd7ea9410f8e01819a7a1bc4..3f62f10a7c37640b9961df4832d419183fa2fbab 100644 (file)
@@ -892,8 +892,9 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
        bool is_ap = iftype_data->types_mask & BIT(NL80211_IFTYPE_AP);
        bool no_320;
 
-       no_320 = !trans->trans_cfg->integrated &&
-                trans->pcie_link_speed < PCI_EXP_LNKSTA_CLS_8_0GB;
+       no_320 = (!trans->trans_cfg->integrated &&
+                trans->pcie_link_speed < PCI_EXP_LNKSTA_CLS_8_0GB) ||
+                trans->reduced_cap_sku;
 
        if (!data->sku_cap_11be_enable || iwlwifi_mod_params.disable_11be)
                iftype_data->eht_cap.has_eht = false;
@@ -1059,6 +1060,17 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
                iftype_data->he_cap.he_cap_elem.phy_cap_info[7] &=
                        ~IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
        }
+
+       if (trans->reduced_cap_sku) {
+               memset(&iftype_data->eht_cap.eht_mcs_nss_supp.bw._320, 0,
+                      sizeof(iftype_data->eht_cap.eht_mcs_nss_supp.bw._320));
+               iftype_data->eht_cap.eht_mcs_nss_supp.bw._80.rx_tx_mcs13_max_nss = 0;
+               iftype_data->eht_cap.eht_mcs_nss_supp.bw._160.rx_tx_mcs13_max_nss = 0;
+               iftype_data->eht_cap.eht_cap_elem.phy_cap_info[8] &=
+                       ~IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA;
+               iftype_data->eht_cap.eht_cap_elem.phy_cap_info[2] &=
+                       ~IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK;
+       }
 }
 
 static void iwl_init_he_hw_capab(struct iwl_trans *trans,
index 5789a87359767b57279dabcdfbc8d8b77a588569..9e26c9eb6d83c85efe8ae6c2a2f8a763e4175e47 100644 (file)
@@ -1068,6 +1068,7 @@ struct iwl_trans_txqs {
  * @pcie_link_speed: current PCIe link speed (%PCI_EXP_LNKSTA_CLS_*),
  *     only valid for discrete (not integrated) NICs
  * @invalid_tx_cmd: invalid TX command buffer
+ * @reduced_cap_sku: reduced capability supported SKU
  */
 struct iwl_trans {
        bool csme_own;
@@ -1090,6 +1091,7 @@ struct iwl_trans {
        u32 hw_id;
        char hw_id_str[52];
        u32 sku_id[3];
+       bool reduced_cap_sku;
 
        u8 rx_mpdu_cmd, rx_mpdu_cmd_hdr_size;
 
index cbae9503f4ba3bc2490ae8f1219e2a857748cd6e..42680d8469f52ad1942978b273103b5f08be8d43 100644 (file)
@@ -1008,8 +1008,13 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
        _IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
                      IWL_CFG_MAC_TYPE_GL, IWL_CFG_ANY,
                      IWL_CFG_RF_TYPE_FM, IWL_CFG_ANY, IWL_CFG_ANY,
-                     IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_NO_CDB,
+                     IWL_CFG_320, IWL_CFG_ANY, IWL_CFG_NO_CDB,
                      iwl_cfg_gl, iwl_bz_name),
+       _IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
+                     IWL_CFG_MAC_TYPE_GL, IWL_CFG_ANY,
+                     IWL_CFG_RF_TYPE_FM, IWL_CFG_ANY, IWL_CFG_ANY,
+                     IWL_CFG_NO_320, IWL_CFG_ANY, IWL_CFG_NO_CDB,
+                     iwl_cfg_gl, iwl_mtp_name),
 
 /* SoF with JF2 */
        _IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,