iwlwifi: mvm: add HE TB PPDU SIG-A BW to radiotap
authorJohannes Berg <johannes.berg@intel.com>
Mon, 3 Dec 2018 14:59:40 +0000 (15:59 +0100)
committerLuca Coelho <luciano.coelho@intel.com>
Mon, 4 Feb 2019 10:28:06 +0000 (12:28 +0200)
Expose the trigger-based PPDU SIG-A bandwidth to radiotap in
the newly defined bits thereof.

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
include/net/ieee80211_radiotap.h

index b5ff332..d2728fe 100644 (file)
@@ -960,6 +960,7 @@ iwl_mvm_decode_he_phy_ru_alloc(struct iwl_mvm_rx_phy_data *phy_data,
         * the TSF/timers are not be transmitted in HE-MU.
         */
        u8 ru = le32_get_bits(phy_data->d1, IWL_RX_PHY_DATA1_HE_RU_ALLOC_MASK);
+       u32 he_type = rate_n_flags & RATE_MCS_HE_TYPE_MSK;
        u8 offs = 0;
 
        rx_status->bw = RATE_INFO_BW_HE_RU;
@@ -1002,19 +1003,27 @@ iwl_mvm_decode_he_phy_ru_alloc(struct iwl_mvm_rx_phy_data *phy_data,
                he->data2 |=
                        cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA2_PRISEC_80_SEC);
 
-       if (he_mu) {
 #define CHECK_BW(bw) \
        BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW_ ## bw ## MHZ != \
+                    RATE_MCS_CHAN_WIDTH_##bw >> RATE_MCS_CHAN_WIDTH_POS); \
+       BUILD_BUG_ON(IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_ ## bw ## MHZ != \
                     RATE_MCS_CHAN_WIDTH_##bw >> RATE_MCS_CHAN_WIDTH_POS)
-               CHECK_BW(20);
-               CHECK_BW(40);
-               CHECK_BW(80);
-               CHECK_BW(160);
+       CHECK_BW(20);
+       CHECK_BW(40);
+       CHECK_BW(80);
+       CHECK_BW(160);
+
+       if (he_mu)
                he_mu->flags2 |=
                        le16_encode_bits(FIELD_GET(RATE_MCS_CHAN_WIDTH_MSK,
                                                   rate_n_flags),
                                         IEEE80211_RADIOTAP_HE_MU_FLAGS2_BW_FROM_SIG_A_BW);
-       }
+       else if (he_type == RATE_MCS_HE_TYPE_TRIG)
+               he->data6 |=
+                       cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN) |
+                       le16_encode_bits(FIELD_GET(RATE_MCS_CHAN_WIDTH_MSK,
+                                                  rate_n_flags),
+                                        IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW);
 }
 
 static void iwl_mvm_decode_he_phy_data(struct iwl_mvm *mvm,
index 8014153..38c48bb 100644 (file)
@@ -291,6 +291,12 @@ enum ieee80211_radiotap_he_bits {
 
        IEEE80211_RADIOTAP_HE_DATA6_NSTS                = 0x000f,
        IEEE80211_RADIOTAP_HE_DATA6_DOPPLER             = 0x0010,
+       IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_KNOWN    = 0x0020,
+       IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW          = 0x00c0,
+               IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_20MHZ    = 0,
+               IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_40MHZ    = 1,
+               IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_80MHZ    = 2,
+               IEEE80211_RADIOTAP_HE_DATA6_TB_PPDU_BW_160MHZ   = 3,
        IEEE80211_RADIOTAP_HE_DATA6_TXOP                = 0x7f00,
        IEEE80211_RADIOTAP_HE_DATA6_MIDAMBLE_PDCTY      = 0x8000,
 };