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)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 28 Sep 2021 13:16:54 +0000 (16:16 +0300)
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
drivers/net/wireless/ath/ath11k/dp_rx.c
drivers/net/wireless/ath/ath11k/wmi.c

index 90440c9..f08eb9e 100644 (file)
@@ -2393,8 +2393,10 @@ static void ath11k_dp_rx_h_ppdu(struct ath11k *ar, struct hal_rx_desc *rx_desc,
        channel_num = meta_data;
        center_freq = meta_data >> 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) {
@@ -2412,8 +2414,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 0c8feb7..568ef5a 100644 (file)
@@ -6184,8 +6184,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) {
@@ -6206,8 +6208,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);