diff options
author | Johannes Berg <johannes.berg@intel.com> | 2018-06-14 10:30:52 -0400 |
---|---|---|
committer | Luca Coelho <luciano.coelho@intel.com> | 2018-10-06 03:25:48 -0400 |
commit | fed3c4ea6f8f12cb73010c969070f7dbed46ff3f (patch) | |
tree | c255b0e0e234545ce0f3932ecb28c68b8012f7b8 /drivers/net/wireless | |
parent | 750f43774eb43aa36465c2df5874dbeafb67c9bd (diff) |
iwlwifi: mvm: add more information to HE radiotap
For SU/SU-ER/MU PPDUs we have spatial reuse.
For those where it's relevant we also know the pre-FEC
padding factor, PE disambiguity bit, beam change bit
and doppler bit.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c index b6f7fae0d757..61916f39bac2 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |||
@@ -1004,6 +1004,7 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm, | |||
1004 | int queue) | 1004 | int queue) |
1005 | { | 1005 | { |
1006 | u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK; | 1006 | u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK; |
1007 | bool sigb_data; | ||
1007 | 1008 | ||
1008 | he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN); | 1009 | he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN); |
1009 | he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_BSS_COLOR_MASK, | 1010 | he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_BSS_COLOR_MASK, |
@@ -1015,9 +1016,8 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm, | |||
1015 | he_phy_data), | 1016 | he_phy_data), |
1016 | IEEE80211_RADIOTAP_HE_DATA6_TXOP); | 1017 | IEEE80211_RADIOTAP_HE_DATA6_TXOP); |
1017 | 1018 | ||
1018 | if (he_mu) { | 1019 | switch (he_type) { |
1019 | bool sigb_data; | 1020 | case RATE_MCS_HE_TYPE_MU: |
1020 | |||
1021 | he_mu->flags1 |= | 1021 | he_mu->flags1 |= |
1022 | le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_MU_SIGB_DCM, | 1022 | le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_MU_SIGB_DCM, |
1023 | he_phy_data), | 1023 | he_phy_data), |
@@ -1051,13 +1051,28 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm, | |||
1051 | le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_HE_LTF_NUM_MASK, | 1051 | le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_HE_LTF_NUM_MASK, |
1052 | he_phy_data), | 1052 | he_phy_data), |
1053 | IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS); | 1053 | IEEE80211_RADIOTAP_HE_DATA5_NUM_LTF_SYMS); |
1054 | break; | ||
1055 | case RATE_MCS_HE_TYPE_SU: | ||
1056 | case RATE_MCS_HE_TYPE_EXT_SU: | ||
1057 | he->data1 |= | ||
1058 | cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BEAM_CHANGE_KNOWN); | ||
1059 | he->data3 |= | ||
1060 | le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_BEAM_CHNG, | ||
1061 | he_phy_data), | ||
1062 | IEEE80211_RADIOTAP_HE_DATA3_BEAM_CHANGE); | ||
1063 | break; | ||
1054 | } | 1064 | } |
1055 | 1065 | ||
1056 | if (he_type != RATE_MCS_HE_TYPE_TRIG) { | 1066 | if (he_type != RATE_MCS_HE_TYPE_TRIG) { |
1057 | u16 d1known = IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN | | 1067 | u16 d1known = IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN | |
1058 | IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN; | 1068 | IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN | |
1069 | IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN | | ||
1070 | IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN; | ||
1071 | u16 d2known = IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN | | ||
1072 | IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN; | ||
1059 | 1073 | ||
1060 | he->data1 |= cpu_to_le16(d1known); | 1074 | he->data1 |= cpu_to_le16(d1known); |
1075 | he->data2 |= cpu_to_le16(d2known); | ||
1061 | 1076 | ||
1062 | he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_UPLINK, | 1077 | he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_UPLINK, |
1063 | he_phy_data), | 1078 | he_phy_data), |
@@ -1065,6 +1080,18 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm, | |||
1065 | he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_LDPC_EXT_SYM, | 1080 | he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_LDPC_EXT_SYM, |
1066 | he_phy_data), | 1081 | he_phy_data), |
1067 | IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG); | 1082 | IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG); |
1083 | he->data4 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_SPATIAL_REUSE_MASK, | ||
1084 | he_phy_data), | ||
1085 | IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE); | ||
1086 | he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PRE_FEC_PAD_MASK, | ||
1087 | he_phy_data), | ||
1088 | IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD); | ||
1089 | he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PE_DISAMBIG, | ||
1090 | he_phy_data), | ||
1091 | IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG); | ||
1092 | he->data6 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_DOPPLER, | ||
1093 | he_phy_data), | ||
1094 | IEEE80211_RADIOTAP_HE_DATA6_DOPPLER); | ||
1068 | } | 1095 | } |
1069 | 1096 | ||
1070 | switch (FIELD_GET(IWL_RX_HE_PHY_INFO_TYPE_MASK, he_phy_data)) { | 1097 | switch (FIELD_GET(IWL_RX_HE_PHY_INFO_TYPE_MASK, he_phy_data)) { |