]> Git Repo - J-linux.git/commitdiff
wifi: rtw89: fix HW scan timeout due to TSF sync issue
authorChih-Kang Chang <[email protected]>
Fri, 19 Jan 2024 08:15:00 +0000 (16:15 +0800)
committerKalle Valo <[email protected]>
Tue, 23 Jan 2024 11:38:16 +0000 (13:38 +0200)
When STA connects to an AP and doesn't receive any beacon yet, the
hardware scan is triggered. This scan begins with the default TSF
value. Once STA receives a beacon when switches back to the operating
channel, its TSF synchronizes with the AP. However, if there is a
significant difference in TSF values between the default value and
the synchronized value, it will cause firmware fail to trigger
interrupt, and the C2H won't be sent out. As a result, the scan
continues until a timeout occurs. To fix this issue, we disable TSF
synchronization during scanning to prevent drastic TSF changes, and
enable TSF synchronization after scan.

Signed-off-by: Chih-Kang Chang <[email protected]>
Signed-off-by: Ping-Ke Shih <[email protected]>
Signed-off-by: Kalle Valo <[email protected]>
Link: https://msgid.link/[email protected]
drivers/net/wireless/realtek/rtw89/fw.c
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h

index 231dd884645ab8e810be69e5e817301d9a633ec7..e49360e29faf3150cd9ab3ad6849131925003367 100644 (file)
@@ -4873,6 +4873,7 @@ void rtw89_hw_scan_start(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
        rtwvif->scan_ies = &scan_req->ies;
        rtwvif->scan_req = req;
        ieee80211_stop_queues(rtwdev->hw);
+       rtw89_mac_port_cfg_rx_sync(rtwdev, rtwvif, false);
 
        if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
                get_random_mask_addr(mac_addr, req->mac_addr,
@@ -4897,10 +4898,10 @@ void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
 {
        const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        struct rtw89_hw_scan_info *scan_info = &rtwdev->scan_info;
+       struct rtw89_vif *rtwvif = vif_to_rtwvif_safe(vif);
        struct cfg80211_scan_info info = {
                .aborted = aborted,
        };
-       struct rtw89_vif *rtwvif;
 
        if (!vif)
                return;
@@ -4913,10 +4914,10 @@ void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
        rtw89_core_scan_complete(rtwdev, vif, true);
        ieee80211_scan_completed(rtwdev->hw, &info);
        ieee80211_wake_queues(rtwdev->hw);
+       rtw89_mac_port_cfg_rx_sync(rtwdev, rtwvif, true);
        rtw89_mac_enable_beacon_for_ap_vifs(rtwdev, true);
 
        rtw89_release_pkt_list(rtwdev);
-       rtwvif = (struct rtw89_vif *)vif->drv_priv;
        rtwvif->scan_req = NULL;
        rtwvif->scan_ies = NULL;
        scan_info->last_chan_idx = 0;
index 03553b63a4a8ba162446865f993c338368c0a24f..b224d06e5f3c8f2a3b23c8f4568b346fa3f80627 100644 (file)
@@ -4185,13 +4185,11 @@ static void rtw89_mac_port_cfg_rx_sw(struct rtw89_dev *rtwdev,
                rtw89_write32_port_clr(rtwdev, rtwvif, p->port_cfg, bit);
 }
 
-static void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
-                                      struct rtw89_vif *rtwvif)
+void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
+                               struct rtw89_vif *rtwvif, bool en)
 {
        const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        const struct rtw89_port_reg *p = mac->port_base;
-       bool en = rtwvif->net_type == RTW89_NET_TYPE_INFRA ||
-                 rtwvif->net_type == RTW89_NET_TYPE_AD_HOC;
 
        if (en)
                rtw89_write32_port_set(rtwdev, rtwvif, p->port_cfg, B_AX_TSF_UDT_EN);
@@ -4199,6 +4197,15 @@ static void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
                rtw89_write32_port_clr(rtwdev, rtwvif, p->port_cfg, B_AX_TSF_UDT_EN);
 }
 
+static void rtw89_mac_port_cfg_rx_sync_by_nettype(struct rtw89_dev *rtwdev,
+                                                 struct rtw89_vif *rtwvif)
+{
+       bool en = rtwvif->net_type == RTW89_NET_TYPE_INFRA ||
+                 rtwvif->net_type == RTW89_NET_TYPE_AD_HOC;
+
+       rtw89_mac_port_cfg_rx_sync(rtwdev, rtwvif, en);
+}
+
 static void rtw89_mac_port_cfg_tx_sw(struct rtw89_dev *rtwdev,
                                     struct rtw89_vif *rtwvif, bool en)
 {
@@ -4538,7 +4545,7 @@ int rtw89_mac_port_update(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
        rtw89_mac_port_cfg_net_type(rtwdev, rtwvif);
        rtw89_mac_port_cfg_bcn_prct(rtwdev, rtwvif);
        rtw89_mac_port_cfg_rx_sw(rtwdev, rtwvif);
-       rtw89_mac_port_cfg_rx_sync(rtwdev, rtwvif);
+       rtw89_mac_port_cfg_rx_sync_by_nettype(rtwdev, rtwvif);
        rtw89_mac_port_cfg_tx_sw_by_nettype(rtwdev, rtwvif);
        rtw89_mac_port_cfg_bcn_intv(rtwdev, rtwvif);
        rtw89_mac_port_cfg_hiq_win(rtwdev, rtwvif);
index 54ce16a2c4750e5cb605485671e5028149c8de00..181d03d1f78a9c0340658ce7b7adbe2247c1b6fb 100644 (file)
@@ -1086,6 +1086,8 @@ void rtw89_mac_port_tsf_sync(struct rtw89_dev *rtwdev,
                             u16 offset_tu);
 int rtw89_mac_port_get_tsf(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
                           u64 *tsf);
+void rtw89_mac_port_cfg_rx_sync(struct rtw89_dev *rtwdev,
+                               struct rtw89_vif *rtwvif, bool en);
 void rtw89_mac_set_he_obss_narrow_bw_ru(struct rtw89_dev *rtwdev,
                                        struct ieee80211_vif *vif);
 void rtw89_mac_stop_ap(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
This page took 0.07076 seconds and 4 git commands to generate.