iwlwifi: rx: use new api to get band from rx mpdu
authorTova Mussai <tova.mussai@intel.com>
Thu, 1 Aug 2019 11:00:24 +0000 (14:00 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 25 Oct 2019 07:10:28 +0000 (10:10 +0300)
The FW introduce new API to get the band from the rx mpdu,
use this new API.

Signed-off-by: Tova Mussai <tova.mussai@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/rx.h
drivers/net/wireless/intel/iwlwifi/fw/file.h
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

index a93449d..88bc773 100644 (file)
@@ -260,6 +260,11 @@ enum iwl_rx_mpdu_amsdu_info {
        IWL_RX_MPDU_AMSDU_LAST_SUBFRAME         = 0x80,
 };
 
+#define RX_MPDU_BAND_POS 6
+#define RX_MPDU_BAND_MASK 0xC0
+#define BAND_IN_RX_STATUS(_val) \
+       (((_val) & RX_MPDU_BAND_MASK) >> RX_MPDU_BAND_POS)
+
 enum iwl_rx_l3_proto_values {
        IWL_RX_L3_TYPE_NONE,
        IWL_RX_L3_TYPE_IPV4,
index 0762856..6de20e7 100644 (file)
@@ -322,6 +322,8 @@ enum iwl_ucode_tlv_api {
        IWL_UCODE_TLV_API_SAR_TABLE_VER         = (__force iwl_ucode_tlv_api_t)55,
        IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP    = (__force iwl_ucode_tlv_api_t)57,
        IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER     = (__force iwl_ucode_tlv_api_t)58,
+       IWL_UCODE_TLV_API_BAND_IN_RX_DATA       = (__force iwl_ucode_tlv_api_t)59,
+
 
        NUM_IWL_UCODE_TLV_API
 #ifdef __CHECKER__
index d9c4376..a25712c 100644 (file)
@@ -1409,6 +1409,12 @@ static inline bool iwl_mvm_is_scan_ext_chan_supported(struct iwl_mvm *mvm)
                          IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER);
 }
 
+static inline bool iwl_mvm_is_band_in_rx_supported(struct iwl_mvm *mvm)
+{
+       return fw_has_api(&mvm->fw->ucode_capa,
+                          IWL_UCODE_TLV_API_BAND_IN_RX_DATA);
+}
+
 static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
 {
        return fw_has_api(&mvm->fw->ucode_capa,
index 77b03b7..b488cd7 100644 (file)
@@ -1542,6 +1542,19 @@ static void iwl_mvm_decode_lsig(struct sk_buff *skb,
        }
 }
 
+static inline u8 iwl_mvm_nl80211_band_from_rx_msdu(u8 phy_band)
+{
+       switch (phy_band) {
+       case PHY_BAND_24:
+               return NL80211_BAND_2GHZ;
+       case PHY_BAND_5:
+               return NL80211_BAND_5GHZ;
+       default:
+               WARN_ONCE(1, "Unsupported phy band (%u)\n", phy_band);
+               return NL80211_BAND_5GHZ;
+       }
+}
+
 void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
                        struct iwl_rx_cmd_buffer *rxb, int queue)
 {
@@ -1678,8 +1691,14 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
        }
 
        rx_status->device_timestamp = gp2_on_air_rise;
-       rx_status->band = channel > 14 ? NL80211_BAND_5GHZ :
-               NL80211_BAND_2GHZ;
+       if (iwl_mvm_is_band_in_rx_supported(mvm)) {
+               u8 band = BAND_IN_RX_STATUS(desc->mac_phy_idx);
+
+               rx_status->band = iwl_mvm_nl80211_band_from_rx_msdu(band);
+       } else {
+               rx_status->band = channel > 14 ? NL80211_BAND_5GHZ :
+                       NL80211_BAND_2GHZ;
+       }
        rx_status->freq = ieee80211_channel_to_frequency(channel,
                                                         rx_status->band);
        iwl_mvm_get_signal_strength(mvm, rx_status, rate_n_flags, energy_a,