mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-13 10:38:44 -04:00
wifi: iwlwifi: mvm: add all EHT based on data0 info from HW
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>
This commit is contained in:
committed by
Johannes Berg
parent
24f7f6e3ed
commit
4ec825854c
@@ -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 */
|
||||
|
||||
@@ -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 != \
|
||||
|
||||
Reference in New Issue
Block a user