rtw89: 8852c: rfk: re-calibrate RX DCK once thermal changes a lot
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
This commit is contained in:
parent
768992eb92
commit
e3d365ff0b
4 changed files with 34 additions and 0 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue