]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: ath12k: Correct 6 GHz frequency value in rx status
authorPradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Wed, 8 May 2024 17:36:51 +0000 (10:36 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 3 Aug 2024 06:59:31 +0000 (08:59 +0200)
[ Upstream commit c3c84a74bd797f76d7da036c9fef947d674bbc18 ]

The frequency in the rx status is currently being filled
incorrectly for the 6 GHz band. The channel number received is
invalid in this case, resulting in packet drops. Fix this
issue by correcting the frequency calculation.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")
Signed-off-by: Pradeep Kumar Chitrapu <quic_pradeepc@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240508173655.22191-3-quic_pradeepc@quicinc.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/ath/ath12k/dp_rx.c
drivers/net/wireless/ath/ath12k/wmi.c

index 75df622f25d8545fc3ed8277c06606f3adc9d115..e5fb5cb000f04b0706202956435a11432953dcb6 100644 (file)
@@ -2383,8 +2383,10 @@ void ath12k_dp_rx_h_ppdu(struct ath12k *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 >= ATH12K_MIN_6G_FREQ &&
+           center_freq <= ATH12K_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) {
@@ -2402,8 +2404,9 @@ void ath12k_dp_rx_h_ppdu(struct ath12k *ar, struct hal_rx_desc *rx_desc,
                                rx_desc, sizeof(*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);
 
        ath12k_dp_rx_h_rate(ar, rx_desc, rx_status);
 }
index 7a52d2082b792e70bb7e4388956d619fb6f04bc4..e88ec9e1201a9ad1da39b0df47b1509115172674 100644 (file)
@@ -6022,8 +6022,10 @@ static void ath12k_mgmt_rx_event(struct ath12k_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 >= ATH12K_MIN_6G_FREQ) {
+       if (rx_ev.chan_freq >= ATH12K_MIN_6G_FREQ &&
+           rx_ev.chan_freq <= ATH12K_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 <= ATH12K_MAX_5G_CHAN) {
@@ -6044,8 +6046,10 @@ static void ath12k_mgmt_rx_event(struct ath12k_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 + ATH12K_DEFAULT_NOISE_FLOOR;
        status->rate_idx = ath12k_mac_bitrate_to_idx(sband, rx_ev.rate / 100);