aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm/rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/rx.c')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rx.c45
1 files changed, 4 insertions, 41 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/rx.c b/drivers/net/wireless/iwlwifi/mvm/rx.c
index 6061553a5e44..cf7276967acd 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rx.c
@@ -60,7 +60,6 @@
60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 60 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61 *****************************************************************************/ 61 *****************************************************************************/
62#include "iwl-trans.h" 62#include "iwl-trans.h"
63
64#include "mvm.h" 63#include "mvm.h"
65#include "fw-api.h" 64#include "fw-api.h"
66 65
@@ -130,42 +129,7 @@ static void iwl_mvm_pass_packet_to_mac80211(struct iwl_mvm *mvm,
130 129
131 memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats)); 130 memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats));
132 131
133 ieee80211_rx_ni(mvm->hw, skb); 132 ieee80211_rx(mvm->hw, skb);
134}
135
136static void iwl_mvm_calc_rssi(struct iwl_mvm *mvm,
137 struct iwl_rx_phy_info *phy_info,
138 struct ieee80211_rx_status *rx_status)
139{
140 int rssi_a, rssi_b, rssi_a_dbm, rssi_b_dbm, max_rssi_dbm;
141 u32 agc_a, agc_b;
142 u32 val;
143
144 val = le32_to_cpu(phy_info->non_cfg_phy[IWL_RX_INFO_AGC_IDX]);
145 agc_a = (val & IWL_OFDM_AGC_A_MSK) >> IWL_OFDM_AGC_A_POS;
146 agc_b = (val & IWL_OFDM_AGC_B_MSK) >> IWL_OFDM_AGC_B_POS;
147
148 val = le32_to_cpu(phy_info->non_cfg_phy[IWL_RX_INFO_RSSI_AB_IDX]);
149 rssi_a = (val & IWL_OFDM_RSSI_INBAND_A_MSK) >> IWL_OFDM_RSSI_A_POS;
150 rssi_b = (val & IWL_OFDM_RSSI_INBAND_B_MSK) >> IWL_OFDM_RSSI_B_POS;
151
152 /*
153 * dBm = rssi dB - agc dB - constant.
154 * Higher AGC (higher radio gain) means lower signal.
155 */
156 rssi_a_dbm = rssi_a - IWL_RSSI_OFFSET - agc_a;
157 rssi_b_dbm = rssi_b - IWL_RSSI_OFFSET - agc_b;
158 max_rssi_dbm = max_t(int, rssi_a_dbm, rssi_b_dbm);
159
160 IWL_DEBUG_STATS(mvm, "Rssi In A %d B %d Max %d AGCA %d AGCB %d\n",
161 rssi_a_dbm, rssi_b_dbm, max_rssi_dbm, agc_a, agc_b);
162
163 rx_status->signal = max_rssi_dbm;
164 rx_status->chains = (le16_to_cpu(phy_info->phy_flags) &
165 RX_RES_PHY_FLAGS_ANTENNA)
166 >> RX_RES_PHY_FLAGS_ANTENNA_POS;
167 rx_status->chain_signal[0] = rssi_a_dbm;
168 rx_status->chain_signal[1] = rssi_b_dbm;
169} 133}
170 134
171/* 135/*
@@ -337,10 +301,7 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
337 */ 301 */
338 /*rx_status.flag |= RX_FLAG_MACTIME_MPDU;*/ 302 /*rx_status.flag |= RX_FLAG_MACTIME_MPDU;*/
339 303
340 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_RX_ENERGY_API) 304 iwl_mvm_get_signal_strength(mvm, phy_info, &rx_status);
341 iwl_mvm_get_signal_strength(mvm, phy_info, &rx_status);
342 else
343 iwl_mvm_calc_rssi(mvm, phy_info, &rx_status);
344 305
345 IWL_DEBUG_STATS_LIMIT(mvm, "Rssi %d, TSF %llu\n", rx_status.signal, 306 IWL_DEBUG_STATS_LIMIT(mvm, "Rssi %d, TSF %llu\n", rx_status.signal,
346 (unsigned long long)rx_status.mactime); 307 (unsigned long long)rx_status.mactime);
@@ -394,6 +355,8 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
394 rx_status.rate_idx = rate_n_flags & RATE_VHT_MCS_RATE_CODE_MSK; 355 rx_status.rate_idx = rate_n_flags & RATE_VHT_MCS_RATE_CODE_MSK;
395 rx_status.flag |= RX_FLAG_VHT; 356 rx_status.flag |= RX_FLAG_VHT;
396 rx_status.flag |= stbc << RX_FLAG_STBC_SHIFT; 357 rx_status.flag |= stbc << RX_FLAG_STBC_SHIFT;
358 if (rate_n_flags & RATE_MCS_BF_MSK)
359 rx_status.vht_flag |= RX_VHT_FLAG_BF;
397 } else { 360 } else {
398 rx_status.rate_idx = 361 rx_status.rate_idx =
399 iwl_mvm_legacy_rate_to_mac80211_idx(rate_n_flags, 362 iwl_mvm_legacy_rate_to_mac80211_idx(rate_n_flags,