wifi: iwlwifi: disable RX STBC when a device doesn't support it
authorGregory Greenman <gregory.greenman@intel.com>
Wed, 24 May 2023 17:42:08 +0000 (20:42 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 6 Jun 2023 11:05:28 +0000 (13:05 +0200)
Some devices, like step A0 of GL FM device doesn't support RX STBC
for VHT/HE. Add a workaround to remove it from capabilities in
this case.

Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230524203151.65c3e09813e5.Iadfd8cdb0ea5a8088ae3daa555c780c423951894@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c

index 7dcb1c3..cf19e8a 100644 (file)
@@ -464,6 +464,9 @@ static void iwl_init_vht_hw_capab(struct iwl_trans *trans,
                       IEEE80211_VHT_MAX_AMPDU_1024K <<
                       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
 
+       if (!trans->cfg->ht_params->stbc)
+               vht_cap->cap &= ~IEEE80211_VHT_CAP_RXSTBC_MASK;
+
        if (data->vht160_supported)
                vht_cap->cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
                                IEEE80211_VHT_CAP_SHORT_GI_160;
@@ -986,6 +989,13 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
                iftype_data->vendor_elems.data = iwl_vendor_caps;
                iftype_data->vendor_elems.len = ARRAY_SIZE(iwl_vendor_caps);
        }
+
+       if (!trans->cfg->ht_params->stbc) {
+               iftype_data->he_cap.he_cap_elem.phy_cap_info[2] &=
+                       ~IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ;
+               iftype_data->he_cap.he_cap_elem.phy_cap_info[7] &=
+                       ~IEEE80211_HE_PHY_CAP7_STBC_RX_ABOVE_80MHZ;
+       }
 }
 
 static void iwl_init_he_hw_capab(struct iwl_trans *trans,