Skip to content

Commit

Permalink
wifi: iwlwifi: Do not include radiotap EHT user info if not needed
Browse files Browse the repository at this point in the history
Do not include user information in radtiotap EHT data for EHT sounding
NDP as the frame doesn't include the user specific field. Instead,
encode the NSS and the beamforming information in the EHT data.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230305124407.ac6474ded9bd.I9655589e9afbacc16820f35f6f5d90c6a91b8b05@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Ilan Peer authored and Johannes Berg committed Mar 7, 2023
1 parent 7696c07 commit b55c1f4
Showing 1 changed file with 37 additions and 21 deletions.
58 changes: 37 additions & 21 deletions drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
Original file line number Diff line number Diff line change
Expand Up @@ -1845,6 +1845,7 @@ static void iwl_mvm_rx_eht(struct iwl_mvm *mvm, struct sk_buff *skb,

struct ieee80211_radiotap_eht *eht;
struct ieee80211_radiotap_eht_usig *usig;
size_t eht_len = sizeof(*eht);

u32 rate_n_flags = phy_data->rate_n_flags;
u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
Expand All @@ -1854,8 +1855,10 @@ static void iwl_mvm_rx_eht(struct iwl_mvm *mvm, struct sk_buff *skb,
u32 bw;

/* u32 for 1 user_info */
eht = iwl_mvm_radiotap_put_tlv(skb, IEEE80211_RADIOTAP_EHT,
sizeof(*eht) + sizeof(u32));
if (phy_data->with_data)
eht_len += sizeof(u32);

eht = iwl_mvm_radiotap_put_tlv(skb, IEEE80211_RADIOTAP_EHT, eht_len);

usig = iwl_mvm_radiotap_put_tlv(skb, IEEE80211_RADIOTAP_EHT_USIG,
sizeof(*usig));
Expand Down Expand Up @@ -1946,27 +1949,40 @@ static void iwl_mvm_rx_eht(struct iwl_mvm *mvm, struct sk_buff *skb,
rx_status->eht.gi));
}

eht->user_info[0] |= cpu_to_le32
(IEEE80211_RADIOTAP_EHT_USER_INFO_MCS_KNOWN |
IEEE80211_RADIOTAP_EHT_USER_INFO_CODING_KNOWN |
IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_KNOWN_O |
IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_KNOWN_O |
IEEE80211_RADIOTAP_EHT_USER_INFO_DATA_FOR_USER);

if (rate_n_flags & RATE_MCS_BF_MSK)
eht->user_info[0] |=
cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_O);

if (rate_n_flags & RATE_MCS_LDPC_MSK)
if (!phy_data->with_data) {
eht->known |= cpu_to_le32(IEEE80211_RADIOTAP_EHT_KNOWN_NSS_S |
IEEE80211_RADIOTAP_EHT_KNOWN_BEAMFORMED_S);
eht->data[7] |=
le32_encode_bits(le32_get_bits(phy_data->rx_vec[2],
RX_NO_DATA_RX_VEC2_EHT_NSTS_MSK),
IEEE80211_RADIOTAP_EHT_DATA7_NSS_S);
if (rate_n_flags & RATE_MCS_BF_MSK)
eht->data[7] |=
cpu_to_le32(IEEE80211_RADIOTAP_EHT_DATA7_BEAMFORMED_S);
} else {
eht->user_info[0] |=
cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_CODING);

eht->user_info[0] |= cpu_to_le32
(FIELD_PREP(IEEE80211_RADIOTAP_EHT_USER_INFO_MCS,
FIELD_GET(RATE_VHT_MCS_RATE_CODE_MSK,
rate_n_flags)) |
FIELD_PREP(IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O,
FIELD_GET(RATE_MCS_NSS_MSK, rate_n_flags)));
cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_MCS_KNOWN |
IEEE80211_RADIOTAP_EHT_USER_INFO_CODING_KNOWN |
IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_KNOWN_O |
IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_KNOWN_O |
IEEE80211_RADIOTAP_EHT_USER_INFO_DATA_FOR_USER);

if (rate_n_flags & RATE_MCS_BF_MSK)
eht->user_info[0] |=
cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_BEAMFORMING_O);

if (rate_n_flags & RATE_MCS_LDPC_MSK)
eht->user_info[0] |=
cpu_to_le32(IEEE80211_RADIOTAP_EHT_USER_INFO_CODING);

eht->user_info[0] |= cpu_to_le32
(FIELD_PREP(IEEE80211_RADIOTAP_EHT_USER_INFO_MCS,
FIELD_GET(RATE_VHT_MCS_RATE_CODE_MSK,
rate_n_flags)) |
FIELD_PREP(IEEE80211_RADIOTAP_EHT_USER_INFO_NSS_O,
FIELD_GET(RATE_MCS_NSS_MSK, rate_n_flags)));
}
}

static void iwl_mvm_rx_he(struct iwl_mvm *mvm, struct sk_buff *skb,
Expand Down

0 comments on commit b55c1f4

Please sign in to comment.