]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw88: Increase the RX gain before scanning
authorMartin Hrůza <martin.hruza123@gmail.com>
Tue, 23 Dec 2025 23:19:00 +0000 (01:19 +0200)
committerPing-Ke Shih <pkshih@realtek.com>
Fri, 26 Dec 2025 04:33:19 +0000 (12:33 +0800)
The driver reduces the RX gain while connected to a network located
close by. In this condition scans return few results because the more
distant networks can't be heard.

Temporarily increase the RX gain before scanning in order to detect
all available networks. Reset the RX gain back to the last recorded
value once the scan finishes.

Link: https://github.com/lwfinger/rtw88/issues/337
Signed-off-by: Martin Hrůza <martin.hruza123@gmail.com>
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/c2e72aff-190d-4f59-9914-2588de756385@gmail.com
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/phy.c
drivers/net/wireless/realtek/rtw88/phy.h

index 361ce0d40956d8cc9f6690cfec9c3166ae91cea0..dbec7724d6af04f52b642413039a3cae296cbaef 100644 (file)
@@ -1483,6 +1483,8 @@ void rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
 
        set_bit(RTW_FLAG_DIG_DISABLE, rtwdev->flags);
        set_bit(RTW_FLAG_SCANNING, rtwdev->flags);
+
+       rtw_phy_dig_set_max_coverage(rtwdev);
 }
 
 void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
@@ -1494,6 +1496,7 @@ void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
        if (!rtwvif)
                return;
 
+       rtw_phy_dig_reset(rtwdev);
        clear_bit(RTW_FLAG_SCANNING, rtwdev->flags);
        clear_bit(RTW_FLAG_DIG_DISABLE, rtwdev->flags);
 
index 55be0d8e0c28d1eee4195942d5ad6f09e123b4b4..e2ac5c6fd5002996534e061b6f45dfdd65728525 100644 (file)
@@ -370,6 +370,26 @@ static void rtw_phy_statistics(struct rtw_dev *rtwdev)
 #define DIG_CVRG_MIN                           0x1c
 #define DIG_RSSI_GAIN_OFFSET                   15
 
+void rtw_phy_dig_set_max_coverage(struct rtw_dev *rtwdev)
+{
+       /* Lower values result in greater coverage. */
+       rtw_dbg(rtwdev, RTW_DBG_PHY, "Setting IGI=%#x for max coverage\n",
+               DIG_CVRG_MIN);
+
+       rtw_phy_dig_write(rtwdev, DIG_CVRG_MIN);
+}
+
+void rtw_phy_dig_reset(struct rtw_dev *rtwdev)
+{
+       struct rtw_dm_info *dm_info = &rtwdev->dm_info;
+       u8 last_igi;
+
+       last_igi = dm_info->igi_history[0];
+       rtw_dbg(rtwdev, RTW_DBG_PHY, "Resetting IGI=%#x\n", last_igi);
+
+       rtw_phy_dig_write(rtwdev, last_igi);
+}
+
 static bool
 rtw_phy_dig_check_damping(struct rtw_dm_info *dm_info)
 {
index c9e6b869661d61e12e94de16f347729102abb5d8..8449936497bb1912d21de54ce33d1452191078bc 100644 (file)
@@ -146,6 +146,8 @@ static inline int rtw_check_supported_rfe(struct rtw_dev *rtwdev)
 }
 
 void rtw_phy_dig_write(struct rtw_dev *rtwdev, u8 igi);
+void rtw_phy_dig_reset(struct rtw_dev *rtwdev);
+void rtw_phy_dig_set_max_coverage(struct rtw_dev *rtwdev);
 
 struct rtw_power_params {
        u8 pwr_base;