]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: iwlwifi: mvm: add all EHT based on data0 info from HW
authorMordechay Goodstein <mordechay.goodstein@intel.com>
Sun, 5 Mar 2023 12:16:21 +0000 (14:16 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 7 Mar 2023 19:15:17 +0000 (20:15 +0100)
Update all radiotap EHT TLVs that we can extract from data0 in HW.

Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230305124407.730f219e02ee.Ife3dd85c65758694d7602e8bc8660887d77faacf@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/rx.h
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

index 1c4e84932058568d62b3408bb43eb0abf7468652..544d22472a6ffdffdab4f90182ec301b158d061a 100644 (file)
@@ -367,7 +367,8 @@ enum iwl_rx_phy_eht_data1 {
        /* number of EHT-LTF symbols 0 - 1 EHT-LTF, 1 - 2 EHT-LTFs, 2 - 4 EHT-LTFs,
         * 3 - 6 EHT-LTFs, 4 - 8 EHT-LTFs */
        IWL_RX_PHY_DATA1_EHT_SIG_LTF_NUM                = 0x000000e0,
-       IWL_RX_PHY_DATA1_EHT_RU_ALLOC                   = 0x0000ff00,
+       IWL_RX_PHY_DATA1_EHT_B0                         = 0x00000100,
+       IWL_RX_PHY_DATA1_EHT_RU_B1_B7_ALLOC             = 0x0000fe00,
 };
 
 /* goes into Metadata DW 7 */
index aa72910f8ff2b5cb2ef9396976fd78c4a540388c..174bed9b507424394017ce4003453a7a7c28cf45 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2012-2014, 2018-2022 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2023 Intel Corporation
  * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
  * Copyright (C) 2015-2017 Intel Deutschland GmbH
  */
@@ -1456,6 +1456,74 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm,
        }
 }
 
+#define LE32_DEC_ENC(value, dec_bits, enc_bits) \
+       le32_encode_bits(le32_get_bits(value, dec_bits), enc_bits)
+
+static void iwl_mvm_decode_eht_phy_data(struct iwl_mvm *mvm,
+                                       struct iwl_mvm_rx_phy_data *phy_data,
+                                       struct ieee80211_rx_status *rx_status,
+                                       struct ieee80211_radiotap_eht *eht,
+                                       struct ieee80211_radiotap_eht_usig *usig)
+
+{
+       __le32 data0 = phy_data->d0;
+       __le32 data1 = phy_data->d1;
+       u8 info_type = phy_data->info_type;
+
+       /* Not in EHT range */
+       if (info_type < IWL_RX_PHY_INFO_TYPE_EHT_MU ||
+           info_type > IWL_RX_PHY_INFO_TYPE_EHT_TB_EXT)
+               return;
+
+       usig->common |= cpu_to_le32
+               (IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL_KNOWN |
+                IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR_KNOWN);
+       usig->common |= LE32_DEC_ENC(data0,
+                                    IWL_RX_PHY_DATA0_EHT_UPLINK,
+                                    IEEE80211_RADIOTAP_EHT_USIG_COMMON_UL_DL);
+       usig->common |= LE32_DEC_ENC(data0,
+                                    IWL_RX_PHY_DATA0_EHT_BSS_COLOR_MASK,
+                                    IEEE80211_RADIOTAP_EHT_USIG_COMMON_BSS_COLOR_KNOWN);
+
+       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,
+                                    IEEE80211_RADIOTAP_EHT_DATA0_SPATIAL_REUSE);
+
+       /* All RU allocating size/index is in TB format */
+       eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_RU_ALLOC_TB_FMT);
+       eht->data[8] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PS160,
+                                    IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_PS_160);
+       eht->data[8] |= LE32_DEC_ENC(data1, IWL_RX_PHY_DATA1_EHT_B0,
+                                    IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B0);
+       eht->data[8] |= LE32_DEC_ENC(data1, IWL_RX_PHY_DATA1_EHT_RU_B1_B7_ALLOC,
+                                    IEEE80211_RADIOTAP_EHT_DATA8_RU_ALLOC_TB_FMT_B7_B1);
+
+       usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP_KNOWN);
+       usig->common |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_TXOP_DUR_MASK,
+                                    IEEE80211_RADIOTAP_EHT_USIG_COMMON_TXOP);
+       eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_LDPC_EXTRA_SYM_OM);
+       eht->data[0] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_LDPC_EXT_SYM,
+                                    IEEE80211_RADIOTAP_EHT_DATA0_LDPC_EXTRA_SYM_OM);
+
+       eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_PRE_PADD_FACOR_OM);
+       eht->data[0] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PRE_FEC_PAD_MASK,
+                                   IEEE80211_RADIOTAP_EHT_DATA0_PRE_PADD_FACOR_OM);
+
+       eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_PE_DISAMBIGUITY_OM);
+       eht->data[0] |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PE_DISAMBIG,
+                                    IEEE80211_RADIOTAP_EHT_DATA0_PE_DISAMBIGUITY_OM);
+
+       /* TODO: what about IWL_RX_PHY_DATA0_EHT_BW320_SLOT */
+
+       if (!le32_get_bits(data0, IWL_RX_PHY_DATA0_EHT_SIGA_CRC_OK))
+               usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_BAD_USIG_CRC);
+
+       usig->common |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER_KNOWN);
+       usig->common |= LE32_DEC_ENC(data0, IWL_RX_PHY_DATA0_EHT_PHY_VER,
+                                    IEEE80211_RADIOTAP_EHT_USIG_COMMON_PHY_VER);
+}
+
 static void iwl_mvm_rx_eht(struct iwl_mvm *mvm, struct sk_buff *skb,
                           struct iwl_mvm_rx_phy_data *phy_data,
                           int queue)
@@ -1512,7 +1580,8 @@ static void iwl_mvm_rx_eht(struct iwl_mvm *mvm, struct sk_buff *skb,
                }
        }
 
-       /* TODO: fill usig info (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD) */
+       if (phy_info & IWL_RX_MPDU_PHY_TSF_OVERLOAD)
+               iwl_mvm_decode_eht_phy_data(mvm, phy_data, rx_status, eht, usig);
 
 #define CHECK_TYPE(F)                                                  \
        BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA1_FORMAT_ ## F !=        \