OSDN Git Service

iwlwifi: mvm: show more HE radiotap data for TB PPDUs
authorJohannes Berg <johannes.berg@intel.com>
Tue, 19 Jun 2018 07:32:00 +0000 (09:32 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Sat, 6 Oct 2018 07:25:53 +0000 (10:25 +0300)
For trigger-based PPDUs, most values aren't part of the HE-SIG-A
because they're preconfigured by the trigger frame. However, we
still have this information since we used the trigger frame to
configure the hardware, so we can (and do) read it back out and
can thus show it in radiotap.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

index a63a073..26ac940 100644 (file)
@@ -1005,16 +1005,41 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm,
 {
        u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
        bool sigb_data;
-
-       he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN);
+       u16 d1known = IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN |
+                     IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN |
+                     IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN |
+                     IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN |
+                     IEEE80211_RADIOTAP_HE_DATA1_BSS_COLOR_KNOWN;
+       u16 d2known = IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN |
+                     IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN |
+                     IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN;
+
+       he->data1 |= cpu_to_le16(d1known);
+       he->data2 |= cpu_to_le16(d2known);
        he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_BSS_COLOR_MASK,
                                                he_phy_data),
                                      IEEE80211_RADIOTAP_HE_DATA3_BSS_COLOR);
-
-       he->data2 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_TXOP_KNOWN);
+       he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_UPLINK,
+                                               he_phy_data),
+                                     IEEE80211_RADIOTAP_HE_DATA3_UL_DL);
+       he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_LDPC_EXT_SYM,
+                                               he_phy_data),
+                                     IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG);
+       he->data4 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_SPATIAL_REUSE_MASK,
+                                               he_phy_data),
+                                     IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE);
+       he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PRE_FEC_PAD_MASK,
+                                               he_phy_data),
+                                     IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD);
+       he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PE_DISAMBIG,
+                                               he_phy_data),
+                                     IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG);
        he->data6 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_TXOP_DUR_MASK,
                                                he_phy_data),
                                      IEEE80211_RADIOTAP_HE_DATA6_TXOP);
+       he->data6 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_DOPPLER,
+                                               he_phy_data),
+                                     IEEE80211_RADIOTAP_HE_DATA6_DOPPLER);
 
        switch (he_type) {
        case RATE_MCS_HE_TYPE_MU:
@@ -1044,7 +1069,8 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm,
                                IWL_RX_HE_PHY_INFO_TYPE_MU_EXT_INFO;
                if (sigb_data)
                        iwl_mvm_decode_he_sigb(mvm, desc, rate_n_flags, he_mu);
-
+               /* fall through */
+       case RATE_MCS_HE_TYPE_TRIG:
                he->data2 |=
                        cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_NUM_LTF_SYMS_KNOWN);
                he->data5 |=
@@ -1063,37 +1089,6 @@ static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm,
                break;
        }
 
-       if (he_type != RATE_MCS_HE_TYPE_TRIG) {
-               u16 d1known = IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN |
-                             IEEE80211_RADIOTAP_HE_DATA1_UL_DL_KNOWN |
-                             IEEE80211_RADIOTAP_HE_DATA1_SPTL_REUSE_KNOWN |
-                             IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN;
-               u16 d2known = IEEE80211_RADIOTAP_HE_DATA2_PRE_FEC_PAD_KNOWN |
-                             IEEE80211_RADIOTAP_HE_DATA2_PE_DISAMBIG_KNOWN;
-
-               he->data1 |= cpu_to_le16(d1known);
-               he->data2 |= cpu_to_le16(d2known);
-
-               he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_UPLINK,
-                                                       he_phy_data),
-                                             IEEE80211_RADIOTAP_HE_DATA3_UL_DL);
-               he->data3 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_LDPC_EXT_SYM,
-                                                       he_phy_data),
-                                             IEEE80211_RADIOTAP_HE_DATA3_LDPC_XSYMSEG);
-               he->data4 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_SPATIAL_REUSE_MASK,
-                                                       he_phy_data),
-                                             IEEE80211_RADIOTAP_HE_DATA4_SU_MU_SPTL_REUSE);
-               he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PRE_FEC_PAD_MASK,
-                                                       he_phy_data),
-                                             IEEE80211_RADIOTAP_HE_DATA5_PRE_FEC_PAD);
-               he->data5 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_PE_DISAMBIG,
-                                                       he_phy_data),
-                                             IEEE80211_RADIOTAP_HE_DATA5_PE_DISAMBIG);
-               he->data6 |= le16_encode_bits(FIELD_GET(IWL_RX_HE_PHY_DOPPLER,
-                                                       he_phy_data),
-                                             IEEE80211_RADIOTAP_HE_DATA6_DOPPLER);
-       }
-
        switch (FIELD_GET(IWL_RX_HE_PHY_INFO_TYPE_MASK, he_phy_data)) {
        case IWL_RX_HE_PHY_INFO_TYPE_MU:
        case IWL_RX_HE_PHY_INFO_TYPE_MU_EXT_INFO: