rtw89: 8852c: rfk: re-calibrate RX DCK once thermal changes a lot
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 20 May 2022 07:17:29 +0000 (15:17 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 30 May 2022 09:35:58 +0000 (12:35 +0300)
RX DCK is receiver DC calibration. To keep good RF performance, do this
calibration again if the delta of thermal value from the last calibration
is more than 8.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220520071731.38563-5-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.h
drivers/net/wireless/realtek/rtw89/rtw8852c.c
drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c
drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.h

index e8a77225a90ff0afefd25253a5e69b9e2eb05571..35619435ea0a2145252d990db9525d337d0c5cf9 100644 (file)
@@ -2646,6 +2646,10 @@ struct rtw89_lck_info {
        u8 thermal[RF_PATH_MAX];
 };
 
+struct rtw89_rx_dck_info {
+       u8 thermal[RF_PATH_MAX];
+};
+
 struct rtw89_iqk_info {
        bool lok_cor_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR];
        bool lok_fin_fail[RTW89_IQK_CHS_NR][RTW89_IQK_PATH_NR];
@@ -3125,6 +3129,7 @@ struct rtw89_dev {
        struct rtw89_dpk_info dpk;
        struct rtw89_mcc_info mcc;
        struct rtw89_lck_info lck;
+       struct rtw89_rx_dck_info rx_dck;
        bool is_tssi_mode[RF_PATH_MAX];
        bool is_bt_iqk_timeout;
 
index 64840c8d9efe80578ab5ab0ce6743eb4688c33f7..b697aef2faf2d488a4b801f283311983e5dc176a 100644 (file)
@@ -1861,6 +1861,7 @@ static void rtw8852c_rfk_track(struct rtw89_dev *rtwdev)
 {
        rtw8852c_dpk_track(rtwdev);
        rtw8852c_lck_track(rtwdev);
+       rtw8852c_rx_dck_track(rtwdev);
 }
 
 static u32 rtw8852c_bb_cal_txpwr_ref(struct rtw89_dev *rtwdev,
index dfb9caba9bc418a869f70cd8d11f8dfa5905d4b9..4186d825d19b74c471a4e60ed00efbb8cc67c9c9 100644 (file)
@@ -3864,6 +3864,7 @@ void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
 
 void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe)
 {
+       struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck;
        u8 path, kpath;
        u32 rf_reg5;
 
@@ -3883,6 +3884,7 @@ void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_a
                rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
                rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
                _set_rx_dck(rtwdev, phy, path, is_afe);
+               rx_dck->thermal[path] = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
                rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
 
                if (rtwdev->is_tssi_mode[path])
@@ -3891,6 +3893,31 @@ void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_a
        }
 }
 
+#define RTW8852C_RX_DCK_TH 8
+
+void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev)
+{
+       struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck;
+       u8 cur_thermal;
+       int delta;
+       int path;
+
+       for (path = 0; path < RF_PATH_NUM_8852C; path++) {
+               cur_thermal =
+                       ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
+               delta = abs((int)cur_thermal - rx_dck->thermal[path]);
+
+               rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
+                           "[RX_DCK] path=%d current thermal=0x%x delta=0x%x\n",
+                           path, cur_thermal, delta);
+
+               if (delta >= RTW8852C_RX_DCK_TH) {
+                       rtw8852c_rx_dck(rtwdev, RTW89_PHY_0, false);
+                       return;
+               }
+       }
+}
+
 void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
 {
        u32 tx_en;
index c32756f0c01a9a551f03736cc0e78e958e8fd95c..5118a49da8d3e30ad0e96fc6fa2b5e3ee794c7b2 100644 (file)
@@ -12,6 +12,7 @@ void rtw8852c_rck(struct rtw89_dev *rtwdev);
 void rtw8852c_dack(struct rtw89_dev *rtwdev);
 void rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
 void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool is_afe);
+void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev);
 void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
 void rtw8852c_dpk_track(struct rtw89_dev *rtwdev);
 void rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);