]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: add crystal_cap check to avoid setting as overflow value
authorChih-Kang Chang <gary.chang@realtek.com>
Thu, 28 Nov 2024 05:54:33 +0000 (13:54 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 5 Dec 2024 06:28:30 +0000 (14:28 +0800)
In the original flow, the crystal_cap might be calculated as a negative
value and set as an overflow value. Therefore, we added a check to limit
the calculated crystal_cap value. Additionally, we shrank the crystal_cap
adjustment according to specific CFO.

Signed-off-by: Chih-Kang Chang <gary.chang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241128055433.11851-7-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/phy.c
drivers/net/wireless/realtek/rtw89/phy.h

index e88ed9ec57c5b0e0376652346d138812ae3cb44d..8d36bf9627323424ff508f7fdb3a6ad25abd7ff9 100644 (file)
@@ -4266,7 +4266,6 @@ static void rtw89_phy_cfo_set_crystal_cap(struct rtw89_dev *rtwdev,
 
        if (!force && cfo->crystal_cap == crystal_cap)
                return;
-       crystal_cap = clamp_t(u8, crystal_cap, 0, 127);
        if (chip->chip_id == RTL8852A || chip->chip_id == RTL8851B) {
                rtw89_phy_cfo_set_xcap_reg(rtwdev, true, crystal_cap);
                rtw89_phy_cfo_set_xcap_reg(rtwdev, false, crystal_cap);
@@ -4389,7 +4388,7 @@ static void rtw89_phy_cfo_crystal_cap_adjust(struct rtw89_dev *rtwdev,
                                             s32 curr_cfo)
 {
        struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking;
-       s8 crystal_cap = cfo->crystal_cap;
+       int crystal_cap = cfo->crystal_cap;
        s32 cfo_abs = abs(curr_cfo);
        int sign;
 
@@ -4410,15 +4409,17 @@ static void rtw89_phy_cfo_crystal_cap_adjust(struct rtw89_dev *rtwdev,
        }
        sign = curr_cfo > 0 ? 1 : -1;
        if (cfo_abs > CFO_TRK_STOP_TH_4)
-               crystal_cap += 7 * sign;
+               crystal_cap += 3 * sign;
        else if (cfo_abs > CFO_TRK_STOP_TH_3)
-               crystal_cap += 5 * sign;
-       else if (cfo_abs > CFO_TRK_STOP_TH_2)
                crystal_cap += 3 * sign;
+       else if (cfo_abs > CFO_TRK_STOP_TH_2)
+               crystal_cap += 1 * sign;
        else if (cfo_abs > CFO_TRK_STOP_TH_1)
                crystal_cap += 1 * sign;
        else
                return;
+
+       crystal_cap = clamp(crystal_cap, 0, 127);
        rtw89_phy_cfo_set_crystal_cap(rtwdev, (u8)crystal_cap, false);
        rtw89_debug(rtwdev, RTW89_DBG_CFO,
                    "X_cap{Curr,Default}={0x%x,0x%x}\n",
index 08a026ac9d386ffd14b37b8d5dd566f966ce92ac..e6d06f0a6c09364beb29ad6e05e6592c2d8ee6cf 100644 (file)
@@ -57,7 +57,7 @@
 #define CFO_TRK_STOP_TH_4 (30 << 2)
 #define CFO_TRK_STOP_TH_3 (20 << 2)
 #define CFO_TRK_STOP_TH_2 (10 << 2)
-#define CFO_TRK_STOP_TH_1 (00 << 2)
+#define CFO_TRK_STOP_TH_1 (03 << 2)
 #define CFO_TRK_STOP_TH (2 << 2)
 #define CFO_SW_COMP_FINE_TUNE (2 << 2)
 #define CFO_PERIOD_CNT 15