]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: rtw89: Parse channel from IE to correct invalid hardware reports during scanning
authorChih-Kang Chang <gary.chang@realtek.com>
Thu, 20 Feb 2025 06:43:57 +0000 (14:43 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 27 Feb 2025 05:53:35 +0000 (13:53 +0800)
For some packets, we could not get channel information from PPDU status.
And this causes wrong frequencies being reported. Parse the channel
information from IE if provided by AP to fix this.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20250220064357.17962-1-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/rtw8851b.c
drivers/net/wireless/realtek/rtw89/rtw8852a.c
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/realtek/rtw89/rtw8852bt.c
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8922a.c

index 8d5dc22fb5080079eb8e5324401c8149851b7288..4d286182e21d63df797021ec51d9d0a0e5b260f1 100644 (file)
@@ -2382,6 +2382,49 @@ static void rtw89_core_validate_rx_signal(struct ieee80211_rx_status *rx_status)
                rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
 }
 
+static void rtw89_core_update_rx_freq_from_ie(struct rtw89_dev *rtwdev,
+                                             struct sk_buff *skb,
+                                             struct ieee80211_rx_status *rx_status)
+{
+       struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
+       size_t hdr_len, ielen;
+       u8 *variable;
+       int chan;
+
+       if (!rtwdev->chip->rx_freq_frome_ie)
+               return;
+
+       if (!rtwdev->scanning)
+               return;
+
+       if (ieee80211_is_beacon(mgmt->frame_control)) {
+               variable = mgmt->u.beacon.variable;
+               hdr_len = offsetof(struct ieee80211_mgmt,
+                                  u.beacon.variable);
+       } else if (ieee80211_is_probe_resp(mgmt->frame_control)) {
+               variable = mgmt->u.probe_resp.variable;
+               hdr_len = offsetof(struct ieee80211_mgmt,
+                                  u.probe_resp.variable);
+       } else {
+               return;
+       }
+
+       if (skb->len > hdr_len)
+               ielen = skb->len - hdr_len;
+       else
+               return;
+
+       /* The parsing code for both 2GHz and 5GHz bands is the same in this
+        * function.
+        */
+       chan = cfg80211_get_ies_channel_number(variable, ielen, NL80211_BAND_2GHZ);
+       if (chan == -1)
+               return;
+
+       rx_status->band = chan > 14 ? RTW89_BAND_5G : RTW89_BAND_2G;
+       rx_status->freq = ieee80211_channel_to_frequency(chan, rx_status->band);
+}
+
 static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev,
                                      struct rtw89_rx_phy_ppdu *phy_ppdu,
                                      struct rtw89_rx_desc_info *desc_info,
@@ -2399,6 +2442,7 @@ static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev,
        rtw89_core_update_rx_status_by_ppdu(rtwdev, rx_status, phy_ppdu);
        rtw89_core_update_radiotap(rtwdev, skb_ppdu, rx_status);
        rtw89_core_validate_rx_signal(rx_status);
+       rtw89_core_update_rx_freq_from_ie(rtwdev, skb_ppdu, rx_status);
 
        /* In low power mode, it does RX in thread context. */
        local_bh_disable();
index 3d458dbbdd0021653592bfbedb03000bcf30844a..3f62df657e1fddf4a23c111253361b6d72901f7d 100644 (file)
@@ -4283,6 +4283,7 @@ struct rtw89_chip_info {
        bool support_ant_gain;
        bool ul_tb_waveform_ctrl;
        bool ul_tb_pwr_diff;
+       bool rx_freq_frome_ie;
        bool hw_sec_hdr;
        bool hw_mgmt_tx_encrypt;
        bool hw_tkip_crypto;
index 34f2278ddf2019df4a951dda8a44f91874236c97..b709dd71b06a21e9074efb27756930e244449640 100644 (file)
@@ -2500,6 +2500,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
        .support_ant_gain       = false,
        .ul_tb_waveform_ctrl    = true,
        .ul_tb_pwr_diff         = false,
+       .rx_freq_frome_ie       = true,
        .hw_sec_hdr             = false,
        .hw_mgmt_tx_encrypt     = false,
        .hw_tkip_crypto         = false,
index 66d85c04da263d0c2545d6c2bb652562db46f7cd..638236bffebb5bbd075b48abacbdc04990d974f9 100644 (file)
@@ -2218,6 +2218,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
        .support_ant_gain       = false,
        .ul_tb_waveform_ctrl    = false,
        .ul_tb_pwr_diff         = false,
+       .rx_freq_frome_ie       = true,
        .hw_sec_hdr             = false,
        .hw_mgmt_tx_encrypt     = false,
        .hw_tkip_crypto         = false,
index 7650576f0577b6fe621442e41ec5c3b1f070c222..8bec74716f84aecb337c952bf7c865568f275fa0 100644 (file)
@@ -854,6 +854,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
        .support_ant_gain       = true,
        .ul_tb_waveform_ctrl    = true,
        .ul_tb_pwr_diff         = false,
+       .rx_freq_frome_ie       = true,
        .hw_sec_hdr             = false,
        .hw_mgmt_tx_encrypt     = false,
        .hw_tkip_crypto         = false,
index c96ef0dfbae27e12434f91a3902847674b5b5cd1..e62810660005472d4688d43e607cec6c6915d5db 100644 (file)
@@ -787,6 +787,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
        .support_ant_gain       = true,
        .ul_tb_waveform_ctrl    = true,
        .ul_tb_pwr_diff         = false,
+       .rx_freq_frome_ie       = true,
        .hw_sec_hdr             = false,
        .hw_mgmt_tx_encrypt     = false,
        .hw_tkip_crypto         = true,
index 7ba92bf898e3111a9ebf3e2132a06b29f0619689..5d3e105dc87fc7b5d0507f7784d8fd737cbcdb19 100644 (file)
@@ -3013,6 +3013,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
        .support_ant_gain       = true,
        .ul_tb_waveform_ctrl    = false,
        .ul_tb_pwr_diff         = true,
+       .rx_freq_frome_ie       = false,
        .hw_sec_hdr             = true,
        .hw_mgmt_tx_encrypt     = true,
        .hw_tkip_crypto         = true,
index 157685c1b68644c7cd99045786cfd05b0c9746d7..210fa818ffe8fcddb1325d0db4e01915f992d8a7 100644 (file)
@@ -2772,6 +2772,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
        .support_ant_gain       = false,
        .ul_tb_waveform_ctrl    = false,
        .ul_tb_pwr_diff         = false,
+       .rx_freq_frome_ie       = false,
        .hw_sec_hdr             = true,
        .hw_mgmt_tx_encrypt     = true,
        .hw_tkip_crypto         = true,