aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2018-06-14 10:30:52 -0400
committerLuca Coelho <luciano.coelho@intel.com>2018-10-06 03:25:48 -0400
commitfed3c4ea6f8f12cb73010c969070f7dbed46ff3f (patch)
treec255b0e0e234545ce0f3932ecb28c68b8012f7b8 /drivers/net/wireless
parent750f43774eb43aa36465c2df5874dbeafb67c9bd (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.c35
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)) {