]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: adjust DIG threshold to reduce false alarm
authorEric Huang <echuang@realtek.com>
Wed, 28 Aug 2024 05:52:16 +0000 (13:52 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 5 Sep 2024 00:50:47 +0000 (08:50 +0800)
Use RSSI without subtracting offset as packet detection lower bound and
set an absolute minimal threshold. It's equivalent to setting a higher
noise floor, thereby reducing false alarm and improving interference
endurance.

Signed-off-by: Eric Huang <echuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240828055217.10263-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/phy.c

index 59b98aa876dd798f10d5447a619b4efbb8d9e430..c7165e757842be758b23b70d915fe55b204b7f67 100644 (file)
@@ -5401,7 +5401,7 @@ static void rtw89_phy_dig_update_para(struct rtw89_dev *rtwdev)
        memcpy(dig->igi_rssi_th, igi_rssi_th, sizeof(dig->igi_rssi_th));
 }
 
-static const u8 pd_low_th_offset = 20, dynamic_igi_min = 0x20;
+static const u8 pd_low_th_offset = 16, dynamic_igi_min = 0x20;
 static const u8 igi_max_performance_mode = 0x5a;
 static const u8 dynamic_pd_threshold_max;
 
@@ -5699,38 +5699,47 @@ void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev)
 }
 
 #define IGI_RSSI_MIN 10
+#define ABS_IGI_MIN 0xc
 void rtw89_phy_dig(struct rtw89_dev *rtwdev)
 {
        struct rtw89_dig_info *dig = &rtwdev->dig;
        bool is_linked = rtwdev->total_sta_assoc > 0;
+       u8 igi_min;
 
        if (unlikely(dig->bypass_dig)) {
                dig->bypass_dig = false;
                return;
        }
 
+       rtw89_phy_dig_update_rssi_info(rtwdev);
+
        if (!dig->is_linked_pre && is_linked) {
                rtw89_debug(rtwdev, RTW89_DBG_DIG, "First connected\n");
                rtw89_phy_dig_update_para(rtwdev);
+               dig->igi_fa_rssi = dig->igi_rssi;
        } else if (dig->is_linked_pre && !is_linked) {
                rtw89_debug(rtwdev, RTW89_DBG_DIG, "First disconnected\n");
                rtw89_phy_dig_update_para(rtwdev);
+               dig->igi_fa_rssi = dig->igi_rssi;
        }
        dig->is_linked_pre = is_linked;
 
        rtw89_phy_dig_igi_offset_by_env(rtwdev);
-       rtw89_phy_dig_update_rssi_info(rtwdev);
 
-       dig->dyn_igi_min = (dig->igi_rssi > IGI_RSSI_MIN) ?
-                           dig->igi_rssi - IGI_RSSI_MIN : 0;
-       dig->dyn_igi_max = dig->dyn_igi_min + IGI_OFFSET_MAX;
-       dig->igi_fa_rssi = dig->dyn_igi_min + dig->fa_rssi_ofst;
+       igi_min = max_t(int, dig->igi_rssi - IGI_RSSI_MIN, 0);
+       dig->dyn_igi_max = min(igi_min + IGI_OFFSET_MAX, igi_max_performance_mode);
+       dig->dyn_igi_min = max(igi_min, ABS_IGI_MIN);
 
-       dig->igi_fa_rssi = clamp(dig->igi_fa_rssi, dig->dyn_igi_min,
-                                dig->dyn_igi_max);
+       if (dig->dyn_igi_max >= dig->dyn_igi_min) {
+               dig->igi_fa_rssi += dig->fa_rssi_ofst;
+               dig->igi_fa_rssi = clamp(dig->igi_fa_rssi, dig->dyn_igi_min,
+                                        dig->dyn_igi_max);
+       } else {
+               dig->igi_fa_rssi = dig->dyn_igi_max;
+       }
 
        rtw89_debug(rtwdev, RTW89_DBG_DIG,
-                   "rssi=%03d, dyn(max,min)=(%d,%d), final_rssi=%d\n",
+                   "rssi=%03d, dyn_joint(max,min)=(%d,%d), final_rssi=%d\n",
                    dig->igi_rssi, dig->dyn_igi_max, dig->dyn_igi_min,
                    dig->igi_fa_rssi);