iwlwifi: add vendor specific capabilities for some RFs
authorJohannes Berg <johannes.berg@intel.com>
Sun, 17 Oct 2021 08:43:42 +0000 (11:43 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 22 Oct 2021 07:48:57 +0000 (10:48 +0300)
On some RFs we want to advertise vendor specific capabilities to
indicate support for improved beamforming rates and/or on 160 MHz,
some APs where Intel has collaborated with the vendor will use it
to improve behaviour. Add these elements where relevant, i.e. for
HR and GF RFs.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211017113927.510f0ef9c2d5.If99bdb9009583ac7cc6cbb708e871a67df836dbe@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c

index 475f951d4b1effee08fffbb8487ed956393cd6f5..f470f9aea50f57451c77c61b7ffd5d6b2f0b545e 100644 (file)
@@ -534,6 +534,17 @@ static void iwl_init_vht_hw_capab(struct iwl_trans *trans,
                cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
 }
 
+static const u8 iwl_vendor_caps[] = {
+       0xdd,                   /* vendor element */
+       0x06,                   /* length */
+       0x00, 0x17, 0x35,       /* Intel OUI */
+       0x08,                   /* type (Intel Capabilities) */
+       /* followed by 16 bits of capabilities */
+#define IWL_VENDOR_CAP_IMPROVED_BF_FDBK_HE     BIT(0)
+       IWL_VENDOR_CAP_IMPROVED_BF_FDBK_HE,
+       0x00
+};
+
 static const struct ieee80211_sband_iftype_data iwl_he_capa[] = {
        {
                .types_mask = BIT(NL80211_IFTYPE_STATION),
@@ -781,6 +792,12 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
        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;
+
+       if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 &&
+           !is_ap) {
+               iftype_data->vendor_elems.data = iwl_vendor_caps;
+               iftype_data->vendor_elems.len = ARRAY_SIZE(iwl_vendor_caps);
+       }
 }
 
 static void iwl_init_he_hw_capab(struct iwl_trans *trans,