]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: 8852bt: rfk: add RX DCK
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 27 Jun 2024 02:58:47 +0000 (10:58 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 2 Jul 2024 11:42:37 +0000 (19:42 +0800)
RX DCK stands for receiver DC calibration. With this calibration, we have
proper DC offset to reflect correct received signal strength indicator.
Do this calibration when bringing up interface and going to connect.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240627025849.25198-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.c
drivers/net/wireless/realtek/rtw89/rtw8852bt_rfk.h

index 4a638e2444db68a852a2e3f7b227a510166af274..52dfbe0b3d6b8fc717040884827d069eb28ba3ca 100644 (file)
@@ -13,6 +13,7 @@
 #include "rtw8852bt_rfk_table.h"
 #include "rtw8852b_common.h"
 
+#define RTW8852BT_RXDCK_VER 0x1
 #define RTW8852BT_IQK_VER 0x2a
 #define RTW8852BT_SS 2
 #define RTW8852BT_TSSI_PATH_NR 2
@@ -365,6 +366,47 @@ static void _rfk_bb_afe_restore(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy
        rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TXPW_RSTB, 0x2);
 }
 
+static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
+                       enum rtw89_rf_path path)
+{
+       rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);
+       rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1);
+       mdelay(1);
+}
+
+static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
+{
+       u8 path, dck_tune;
+       u32 rf_reg5;
+
+       rtw89_debug(rtwdev, RTW89_DBG_RFK,
+                   "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, CV : 0x%x) ******\n",
+                   RTW8852BT_RXDCK_VER, rtwdev->hal.cv);
+
+       for (path = 0; path < RF_PATH_NUM_8852BT; path++) {
+               rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
+               dck_tune = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE);
+
+               if (rtwdev->is_tssi_mode[path])
+                       rtw89_phy_write32_mask(rtwdev,
+                                              R_P0_TSSI_TRK + (path << 13),
+                                              B_P0_TSSI_TRK_EN, 0x1);
+
+               rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0);
+               rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
+               _set_rx_dck(rtwdev, phy, path);
+               rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune);
+               rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
+
+               if (rtwdev->is_tssi_mode[path])
+                       rtw89_phy_write32_mask(rtwdev,
+                                              R_P0_TSSI_TRK + (path << 13),
+                                              B_P0_TSSI_TRK_EN, 0x0);
+       }
+}
+
 static bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path, u8 ktype)
 {
        bool notready = false;
@@ -3286,6 +3328,21 @@ void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
        rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
 }
 
+void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+{
+       u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
+       u32 tx_en;
+
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
+       rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
+       _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
+
+       _rx_dck(rtwdev, phy_idx);
+
+       rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
+       rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
+}
+
 void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
 {
        rtw89_debug(rtwdev, RTW89_DBG_RFK,
index 22c0c9c3d173729a4e0a28618be7fe337b764792..3ac63a2a63f7b78974125db0730c7ccfd20d0cbb 100644 (file)
@@ -8,6 +8,7 @@
 #include "core.h"
 
 void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
+void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx);
 void rtw8852bt_dpk_init(struct rtw89_dev *rtwdev);
 void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy);
 void rtw8852bt_dpk_track(struct rtw89_dev *rtwdev);