ath11k: fix packet drops due to incorrect 6 GHz freq value in rx status
authorPradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Tue, 28 Sep 2021 11:00:43 +0000 (14:00 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 13:04:03 +0000 (14:04 +0100)
[ Upstream commit 9d6ae1f5cf733c0e8d7f904c501fd015c4b9f0f4 ]

Frequency in rx status is being filled incorrectly in the 6 GHz band as
channel number received is invalid in this case which is causing packet
drops. So fix that.

Fixes: 5dcf42f8b79d ("ath11k: Use freq instead of channel number in rx path")
Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210722102054.43419-2-jouni@codeaurora.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/ath/ath11k/dp_rx.c
drivers/net/wireless/ath/ath11k/wmi.c

index 7d6fd81..2e77dca 100644 (file)
@@ -2303,8 +2303,10 @@ static void ath11k_dp_rx_h_ppdu(struct ath11k *ar, struct hal_rx_desc *rx_desc,
        channel_num = ath11k_dp_rx_h_msdu_start_freq(rx_desc);
        center_freq = ath11k_dp_rx_h_msdu_start_freq(rx_desc) >> 16;
 
-       if (center_freq >= 5935 && center_freq <= 7105) {
+       if (center_freq >= ATH11K_MIN_6G_FREQ &&
+           center_freq <= ATH11K_MAX_6G_FREQ) {
                rx_status->band = NL80211_BAND_6GHZ;
+               rx_status->freq = center_freq;
        } else if (channel_num >= 1 && channel_num <= 14) {
                rx_status->band = NL80211_BAND_2GHZ;
        } else if (channel_num >= 36 && channel_num <= 173) {
@@ -2322,8 +2324,9 @@ static void ath11k_dp_rx_h_ppdu(struct ath11k *ar, struct hal_rx_desc *rx_desc,
                                rx_desc, sizeof(struct hal_rx_desc));
        }
 
-       rx_status->freq = ieee80211_channel_to_frequency(channel_num,
-                                                        rx_status->band);
+       if (rx_status->band != NL80211_BAND_6GHZ)
+               rx_status->freq = ieee80211_channel_to_frequency(channel_num,
+                                                                rx_status->band);
 
        ath11k_dp_rx_h_rate(ar, rx_desc, rx_status);
 }
index e17419c..74ebe8e 100644 (file)
@@ -5668,8 +5668,10 @@ static void ath11k_mgmt_rx_event(struct ath11k_base *ab, struct sk_buff *skb)
        if (rx_ev.status & WMI_RX_STATUS_ERR_MIC)
                status->flag |= RX_FLAG_MMIC_ERROR;
 
-       if (rx_ev.chan_freq >= ATH11K_MIN_6G_FREQ) {
+       if (rx_ev.chan_freq >= ATH11K_MIN_6G_FREQ &&
+           rx_ev.chan_freq <= ATH11K_MAX_6G_FREQ) {
                status->band = NL80211_BAND_6GHZ;
+               status->freq = rx_ev.chan_freq;
        } else if (rx_ev.channel >= 1 && rx_ev.channel <= 14) {
                status->band = NL80211_BAND_2GHZ;
        } else if (rx_ev.channel >= 36 && rx_ev.channel <= ATH11K_MAX_5G_CHAN) {
@@ -5690,8 +5692,10 @@ static void ath11k_mgmt_rx_event(struct ath11k_base *ab, struct sk_buff *skb)
 
        sband = &ar->mac.sbands[status->band];
 
-       status->freq = ieee80211_channel_to_frequency(rx_ev.channel,
-                                                     status->band);
+       if (status->band != NL80211_BAND_6GHZ)
+               status->freq = ieee80211_channel_to_frequency(rx_ev.channel,
+                                                             status->band);
+
        status->signal = rx_ev.snr + ATH11K_DEFAULT_NOISE_FLOOR;
        status->rate_idx = ath11k_mac_bitrate_to_idx(sband, rx_ev.rate / 100);