]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: iwlwifi: fix HE/EHT capabilities
authorJohannes Berg <johannes.berg@intel.com>
Thu, 10 Jul 2025 18:28:26 +0000 (21:28 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Fri, 11 Jul 2025 15:28:31 +0000 (18:28 +0300)
The default capabilities were set to much more than the hardware
currently is intended to support, and then masked off for only
the GL MAC type. However, this was due to some miscommunication
and is incorrect, it should've been masked off for all current
and planned MACs/RFs. Instead of doing this removing and adding
of capabilities, simply list the ones that currently apply to
all devices. If this changes for a new device type we can change
the code, but at least the driver won't erroneously advertise
some capabilities that aren't actually implemented in hardware.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250710212632.69b9dac7d906.I7885499bc80453d5a84285ec927f5e89f9adfb21@changeid
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c

index 1e4162f1bb44bc69cdb21118ca8a57407419d26b..4424443d23283794b7218f038879299b10502127 100644 (file)
@@ -663,6 +663,8 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
                                .phy_cap_info[9] =
                                        IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
                                        IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB |
+                                       IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
+                                       IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
                                        (IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED <<
                                        IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS),
                                .phy_cap_info[10] =
@@ -691,44 +693,26 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
                        .has_eht = true,
                        .eht_cap_elem = {
                                .mac_cap_info[0] =
-                                       IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
-                                       IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
-                                       IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
-                                       IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2 |
-                                       IEEE80211_EHT_MAC_CAP0_SCS_TRAFFIC_DESC,
-                               .mac_cap_info[1] =
-                                       IEEE80211_EHT_MAC_CAP1_UNSOL_EPCS_PRIO_ACCESS,
+                                       IEEE80211_EHT_MAC_CAP0_OM_CONTROL,
                                .phy_cap_info[0] =
                                        IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
                                        IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
-                                       IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
                                        IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE |
                                        IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK,
                                .phy_cap_info[1] =
                                        IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK  |
                                        IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK,
                                .phy_cap_info[3] =
-                                       IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
-                                       IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
-                                       IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
-                                       IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
-                                       IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
-                                       IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
-                                       IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK,
+                                       IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK,
 
                                .phy_cap_info[4] =
-                                       IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
-                                       IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
                                        IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI,
                                .phy_cap_info[5] =
                                        FIELD_PREP_CONST(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK,
                                                         IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US) |
-                                       IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
                                        IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
-                                       IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP,
-                               .phy_cap_info[6] =
-                                       IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK |
-                                       IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP,
+                                       IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
+                                       IEEE80211_EHT_PHY_CAP5_SUPP_EXTRA_EHT_LTF,
                                .phy_cap_info[8] =
                                        IEEE80211_EHT_PHY_CAP8_RX_1024QAM_WIDER_BW_DL_OFDMA |
                                        IEEE80211_EHT_PHY_CAP8_RX_4096QAM_WIDER_BW_DL_OFDMA,
@@ -796,6 +780,7 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
                                        IEEE80211_HE_PHY_CAP8_HE_ER_SU_PPDU_4XLTF_AND_08_US_GI |
                                        IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_242,
                                .phy_cap_info[9] =
+                                       IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
                                        IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_RESERVED
                                        << IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_POS,
                        },
@@ -822,9 +807,7 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
                        .has_eht = true,
                        .eht_cap_elem = {
                                .mac_cap_info[0] =
-                                       IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
-                                       IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
-                                       IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2,
+                                       IEEE80211_EHT_MAC_CAP0_OM_CONTROL,
                                .phy_cap_info[0] =
                                        IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
                                        IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI,
@@ -1039,48 +1022,17 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
                        cpu_to_le16(IEEE80211_HE_MCS_NOT_SUPPORTED << 2);
        }
 
+       /* prior RFs don't have HE, HR RF doesn't have this, later have it */
+       if (CSR_HW_RFID_TYPE(trans->info.hw_rf_id) == IWL_CFG_RF_TYPE_HR1 ||
+           CSR_HW_RFID_TYPE(trans->info.hw_rf_id) == IWL_CFG_RF_TYPE_HR2)
+               iftype_data->he_cap.he_cap_elem.phy_cap_info[9] &=
+                       ~(IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
+                         IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU);
+
        if (trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_AX210 && !is_ap)
                iftype_data->he_cap.he_cap_elem.phy_cap_info[2] |=
                        IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO;
 
-       switch (CSR_HW_RFID_TYPE(trans->info.hw_rf_id)) {
-       case IWL_CFG_RF_TYPE_GF:
-       case IWL_CFG_RF_TYPE_FM:
-       case IWL_CFG_RF_TYPE_WH:
-       case IWL_CFG_RF_TYPE_PE:
-               iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |=
-                       IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU;
-               if (!is_ap)
-                       iftype_data->he_cap.he_cap_elem.phy_cap_info[9] |=
-                               IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
-               break;
-       }
-
-       if (CSR_HW_REV_TYPE(trans->info.hw_rev) == IWL_CFG_MAC_TYPE_GL &&
-           iftype_data->eht_cap.has_eht) {
-               iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] &=
-                       ~(IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
-                         IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2);
-               iftype_data->eht_cap.eht_cap_elem.phy_cap_info[3] &=
-                       ~(IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
-                         IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
-                         IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
-                         IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
-                         IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
-                         IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
-                         IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK);
-               iftype_data->eht_cap.eht_cap_elem.phy_cap_info[4] &=
-                       ~(IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
-                         IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP);
-               iftype_data->eht_cap.eht_cap_elem.phy_cap_info[5] &=
-                       ~IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK;
-               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))
                iftype_data->he_cap.he_cap_elem.mac_cap_info[2] |=
                        IEEE80211_HE_MAC_CAP2_BCAST_TWT;