wifi: iwlwifi: mvm: support U-SIG EHT validate checks
authorJohannes Berg <johannes.berg@intel.com>
Tue, 13 Jun 2023 12:57:14 +0000 (15:57 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 14 Jun 2023 10:32:19 +0000 (12:32 +0200)
Support new firmware that can validate the validate bits in
sniffer mode, and advertise that fact and the result of the
checks in the U-SIG radiotap field.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230613155501.c20480aa1171.Icc0d077dae01d662ccb948823e196aa9c5c87976@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/rx.h
drivers/net/wireless/intel/iwlwifi/fw/file.h
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
include/net/ieee80211_radiotap.h

index 67af922..25e2e23 100644 (file)
@@ -292,7 +292,7 @@ enum iwl_rx_phy_he_data0 {
 /* TSF overload low dword */
 enum iwl_rx_phy_eht_data0 {
        /* info type: EHT any */
-       /* 1 bits reserved */
+       IWL_RX_PHY_DATA0_EHT_VALIDATE                           = BIT(0),
        IWL_RX_PHY_DATA0_EHT_UPLINK                             = BIT(1),
        IWL_RX_PHY_DATA0_EHT_BSS_COLOR_MASK                     = 0x000000fc,
        IWL_RX_PHY_DATA0_ETH_SPATIAL_REUSE_MASK                 = 0x00000f00,
index a78b68c..1a4f7c0 100644 (file)
@@ -467,6 +467,7 @@ enum iwl_ucode_tlv_capa {
        IWL_UCODE_TLV_CAPA_PPAG_CHINA_BIOS_SUPPORT      = (__force iwl_ucode_tlv_capa_t)112,
        IWL_UCODE_TLV_CAPA_OFFLOAD_REJ_BTM_SUPPORT      = (__force iwl_ucode_tlv_capa_t)113,
        IWL_UCODE_TLV_CAPA_STA_EXP_MFP_SUPPORT          = (__force iwl_ucode_tlv_capa_t)114,
+       IWL_UCODE_TLV_CAPA_SNIFF_VALIDATE_SUPPORT       = (__force iwl_ucode_tlv_capa_t)116,
 
 #ifdef __CHECKER__
        /* sparse says it cannot increment the previous enum member */
index 89ab440..70db4fe 100644 (file)
@@ -1773,6 +1773,15 @@ static void iwl_mvm_decode_eht_phy_data(struct iwl_mvm *mvm,
                                             IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR);
        }
 
+       if (fw_has_capa(&mvm->fw->ucode_capa,
+                       IWL_UCODE_TLV_CAPA_SNIFF_VALIDATE_SUPPORT)) {
+               usig->common |=
+                       cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_CHECKED);
+               usig->common |=
+                       LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_VALIDATE,
+                                    IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_OK);
+       }
+
        eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_SPATIAL_REUSE);
        eht->data[0] |= LE32_DEC_ENC(data0,
                                     IWL_RX_PHY_DATA0_ETH_SPATIAL_REUSE_MASK,
index f980a72..c4722a9 100644 (file)
@@ -535,6 +535,8 @@ enum ieee80211_radiotap_eht_usig_common {
        IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR_KNOWN      = 0x00000008,
        IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP_KNOWN           = 0x00000010,
        IEEE80211_RADIOTAP_EHT_USIG_COMMON_BAD_USIG_CRC         = 0x00000020,
+       IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_CHECKED = 0x00000040,
+       IEEE80211_RADIOTAP_EHT_USIG_COMMON_VALIDATE_BITS_OK     = 0x00000080,
        IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER              = 0x00007000,
        IEEE80211_RADIOTAP_EHT_USIG_COMMON_BW                   = 0x00038000,
        IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL                = 0x00040000,