162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
262306a36Sopenharmony_ci/* Copyright(c) 2019-2020  Realtek Corporation
362306a36Sopenharmony_ci */
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include "coex.h"
662306a36Sopenharmony_ci#include "debug.h"
762306a36Sopenharmony_ci#include "mac.h"
862306a36Sopenharmony_ci#include "phy.h"
962306a36Sopenharmony_ci#include "reg.h"
1062306a36Sopenharmony_ci#include "rtw8852a.h"
1162306a36Sopenharmony_ci#include "rtw8852a_rfk.h"
1262306a36Sopenharmony_ci#include "rtw8852a_rfk_table.h"
1362306a36Sopenharmony_ci#include "rtw8852a_table.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x,  PHY%d\n",
1862306a36Sopenharmony_ci		    rtwdev->dbcc_en, phy_idx);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	if (!rtwdev->dbcc_en)
2162306a36Sopenharmony_ci		return RF_AB;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	if (phy_idx == RTW89_PHY_0)
2462306a36Sopenharmony_ci		return RF_A;
2562306a36Sopenharmony_ci	else
2662306a36Sopenharmony_ci		return RF_B;
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic const u32 rtw8852a_backup_bb_regs[] = {0x2344, 0x58f0, 0x78f0};
3062306a36Sopenharmony_cistatic const u32 rtw8852a_backup_rf_regs[] = {0xef, 0xde, 0x0, 0x1e, 0x2, 0x85, 0x90, 0x5};
3162306a36Sopenharmony_ci#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852a_backup_bb_regs)
3262306a36Sopenharmony_ci#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852a_backup_rf_regs)
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[])
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	u32 i;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
3962306a36Sopenharmony_ci		backup_bb_reg_val[i] =
4062306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, rtw8852a_backup_bb_regs[i],
4162306a36Sopenharmony_ci					      MASKDWORD);
4262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
4362306a36Sopenharmony_ci			    "[IQK]backup bb reg : %x, value =%x\n",
4462306a36Sopenharmony_ci			    rtw8852a_backup_bb_regs[i], backup_bb_reg_val[i]);
4562306a36Sopenharmony_ci	}
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[],
4962306a36Sopenharmony_ci			       u8 rf_path)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	u32 i;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
5462306a36Sopenharmony_ci		backup_rf_reg_val[i] =
5562306a36Sopenharmony_ci			rtw89_read_rf(rtwdev, rf_path,
5662306a36Sopenharmony_ci				      rtw8852a_backup_rf_regs[i], RFREG_MASK);
5762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
5862306a36Sopenharmony_ci			    "[IQK]backup rf S%d reg : %x, value =%x\n", rf_path,
5962306a36Sopenharmony_ci			    rtw8852a_backup_rf_regs[i], backup_rf_reg_val[i]);
6062306a36Sopenharmony_ci	}
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev,
6462306a36Sopenharmony_ci				u32 backup_bb_reg_val[])
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	u32 i;
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
6962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, rtw8852a_backup_bb_regs[i],
7062306a36Sopenharmony_ci				       MASKDWORD, backup_bb_reg_val[i]);
7162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
7262306a36Sopenharmony_ci			    "[IQK]restore bb reg : %x, value =%x\n",
7362306a36Sopenharmony_ci			    rtw8852a_backup_bb_regs[i], backup_bb_reg_val[i]);
7462306a36Sopenharmony_ci	}
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistatic void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev,
7862306a36Sopenharmony_ci				u32 backup_rf_reg_val[], u8 rf_path)
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	u32 i;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
8362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, rf_path, rtw8852a_backup_rf_regs[i],
8462306a36Sopenharmony_ci			       RFREG_MASK, backup_rf_reg_val[i]);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
8762306a36Sopenharmony_ci			    "[IQK]restore rf S%d reg: %x, value =%x\n", rf_path,
8862306a36Sopenharmony_ci			    rtw8852a_backup_rf_regs[i], backup_rf_reg_val[i]);
8962306a36Sopenharmony_ci	}
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci	u8 path;
9562306a36Sopenharmony_ci	u32 rf_mode;
9662306a36Sopenharmony_ci	int ret;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	for (path = 0; path < RF_PATH_MAX; path++) {
9962306a36Sopenharmony_ci		if (!(kpath & BIT(path)))
10062306a36Sopenharmony_ci			continue;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci		ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode, rf_mode != 2,
10362306a36Sopenharmony_ci					       2, 5000, false, rtwdev, path, 0x00,
10462306a36Sopenharmony_ci					       RR_MOD_MASK);
10562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
10662306a36Sopenharmony_ci			    "[RFK] Wait S%d to Rx mode!! (ret = %d)\n",
10762306a36Sopenharmony_ci			    path, ret);
10862306a36Sopenharmony_ci	}
10962306a36Sopenharmony_ci}
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistatic void _dack_dump(struct rtw89_dev *rtwdev)
11262306a36Sopenharmony_ci{
11362306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
11462306a36Sopenharmony_ci	u8 i;
11562306a36Sopenharmony_ci	u8 t;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
11862306a36Sopenharmony_ci		    "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n",
11962306a36Sopenharmony_ci		    dack->addck_d[0][0], dack->addck_d[0][1]);
12062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
12162306a36Sopenharmony_ci		    "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n",
12262306a36Sopenharmony_ci		    dack->addck_d[1][0], dack->addck_d[1][1]);
12362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
12462306a36Sopenharmony_ci		    "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n",
12562306a36Sopenharmony_ci		    dack->dadck_d[0][0], dack->dadck_d[0][1]);
12662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
12762306a36Sopenharmony_ci		    "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n",
12862306a36Sopenharmony_ci		    dack->dadck_d[1][0], dack->dadck_d[1][1]);
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
13162306a36Sopenharmony_ci		    "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n",
13262306a36Sopenharmony_ci		    dack->biask_d[0][0], dack->biask_d[0][1]);
13362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
13462306a36Sopenharmony_ci		    "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n",
13562306a36Sopenharmony_ci		    dack->biask_d[1][0], dack->biask_d[1][1]);
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n");
13862306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
13962306a36Sopenharmony_ci		t = dack->msbk_d[0][0][i];
14062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
14162306a36Sopenharmony_ci	}
14262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n");
14362306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
14462306a36Sopenharmony_ci		t = dack->msbk_d[0][1][i];
14562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
14662306a36Sopenharmony_ci	}
14762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n");
14862306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
14962306a36Sopenharmony_ci		t = dack->msbk_d[1][0][i];
15062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
15162306a36Sopenharmony_ci	}
15262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n");
15362306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
15462306a36Sopenharmony_ci		t = dack->msbk_d[1][1][i];
15562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
15662306a36Sopenharmony_ci	}
15762306a36Sopenharmony_ci}
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cistatic void _afe_init(struct rtw89_dev *rtwdev)
16062306a36Sopenharmony_ci{
16162306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_afe_init_defs_tbl);
16262306a36Sopenharmony_ci}
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistatic void _addck_backup(struct rtw89_dev *rtwdev)
16562306a36Sopenharmony_ci{
16662306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_S0_RXDC2, B_S0_RXDC2_SEL);
16962306a36Sopenharmony_ci	dack->addck_d[0][0] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_ADDCK,
17062306a36Sopenharmony_ci							 B_S0_ADDCK_Q);
17162306a36Sopenharmony_ci	dack->addck_d[0][1] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_ADDCK,
17262306a36Sopenharmony_ci							 B_S0_ADDCK_I);
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_S1_RXDC2, B_S1_RXDC2_SEL);
17562306a36Sopenharmony_ci	dack->addck_d[1][0] = (u16)rtw89_phy_read32_mask(rtwdev, R_S1_ADDCK,
17662306a36Sopenharmony_ci							 B_S1_ADDCK_Q);
17762306a36Sopenharmony_ci	dack->addck_d[1][1] = (u16)rtw89_phy_read32_mask(rtwdev, R_S1_ADDCK,
17862306a36Sopenharmony_ci							 B_S1_ADDCK_I);
17962306a36Sopenharmony_ci}
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_cistatic void _addck_reload(struct rtw89_dev *rtwdev)
18262306a36Sopenharmony_ci{
18362306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_S0_RXDC, B_S0_RXDC_I, dack->addck_d[0][0]);
18662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_S0_RXDC2, B_S0_RXDC2_Q2,
18762306a36Sopenharmony_ci			       (dack->addck_d[0][1] >> 6));
18862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_S0_RXDC, B_S0_RXDC_Q,
18962306a36Sopenharmony_ci			       (dack->addck_d[0][1] & 0x3f));
19062306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_S0_RXDC2, B_S0_RXDC2_MEN);
19162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_S1_RXDC, B_S1_RXDC_I, dack->addck_d[1][0]);
19262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_S1_RXDC2, B_S1_RXDC2_Q2,
19362306a36Sopenharmony_ci			       (dack->addck_d[1][1] >> 6));
19462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_S1_RXDC, B_S1_RXDC_Q,
19562306a36Sopenharmony_ci			       (dack->addck_d[1][1] & 0x3f));
19662306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_S1_RXDC2, B_S1_RXDC2_EN);
19762306a36Sopenharmony_ci}
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistatic void _dack_backup_s0(struct rtw89_dev *rtwdev)
20062306a36Sopenharmony_ci{
20162306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
20262306a36Sopenharmony_ci	u8 i;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_S0_DACKI, B_S0_DACKI_EN);
20562306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_S0_DACKQ, B_S0_DACKQ_EN);
20662306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG);
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
20962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_S0_DACKI, B_S0_DACKI_AR, i);
21062306a36Sopenharmony_ci		dack->msbk_d[0][0][i] =
21162306a36Sopenharmony_ci			(u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKI7, B_S0_DACKI7_K);
21262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_S0_DACKQ, B_S0_DACKQ_AR, i);
21362306a36Sopenharmony_ci		dack->msbk_d[0][1][i] =
21462306a36Sopenharmony_ci			(u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKQ7, B_S0_DACKQ7_K);
21562306a36Sopenharmony_ci	}
21662306a36Sopenharmony_ci	dack->biask_d[0][0] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_DACKI2,
21762306a36Sopenharmony_ci							 B_S0_DACKI2_K);
21862306a36Sopenharmony_ci	dack->biask_d[0][1] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_DACKQ2,
21962306a36Sopenharmony_ci							 B_S0_DACKQ2_K);
22062306a36Sopenharmony_ci	dack->dadck_d[0][0] = (u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKI8,
22162306a36Sopenharmony_ci							B_S0_DACKI8_K) - 8;
22262306a36Sopenharmony_ci	dack->dadck_d[0][1] = (u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKQ8,
22362306a36Sopenharmony_ci							B_S0_DACKQ8_K) - 8;
22462306a36Sopenharmony_ci}
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_cistatic void _dack_backup_s1(struct rtw89_dev *rtwdev)
22762306a36Sopenharmony_ci{
22862306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
22962306a36Sopenharmony_ci	u8 i;
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_S1_DACKI, B_S1_DACKI_EN);
23262306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_S1_DACKQ, B_S1_DACKQ_EN);
23362306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON);
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
23662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_S1_DACKI, B_S1_DACKI_AR, i);
23762306a36Sopenharmony_ci		dack->msbk_d[1][0][i] =
23862306a36Sopenharmony_ci			(u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKI7, B_S1_DACKI_K);
23962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_S1_DACKQ, B_S1_DACKQ_AR, i);
24062306a36Sopenharmony_ci		dack->msbk_d[1][1][i] =
24162306a36Sopenharmony_ci			(u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKQ7, B_S1_DACKQ7_K);
24262306a36Sopenharmony_ci	}
24362306a36Sopenharmony_ci	dack->biask_d[1][0] =
24462306a36Sopenharmony_ci		(u16)rtw89_phy_read32_mask(rtwdev, R_S1_DACKI2, B_S1_DACKI2_K);
24562306a36Sopenharmony_ci	dack->biask_d[1][1] =
24662306a36Sopenharmony_ci		(u16)rtw89_phy_read32_mask(rtwdev, R_S1_DACKQ2, B_S1_DACKQ2_K);
24762306a36Sopenharmony_ci	dack->dadck_d[1][0] =
24862306a36Sopenharmony_ci		(u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKI8, B_S1_DACKI8_K) - 8;
24962306a36Sopenharmony_ci	dack->dadck_d[1][1] =
25062306a36Sopenharmony_ci		(u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKQ8, B_S1_DACKQ8_K) - 8;
25162306a36Sopenharmony_ci}
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cistatic void _dack_reload_by_path(struct rtw89_dev *rtwdev,
25462306a36Sopenharmony_ci				 enum rtw89_rf_path path, u8 index)
25562306a36Sopenharmony_ci{
25662306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
25762306a36Sopenharmony_ci	u32 tmp = 0, tmp_offset, tmp_reg;
25862306a36Sopenharmony_ci	u8 i;
25962306a36Sopenharmony_ci	u32 idx_offset, path_offset;
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	if (index == 0)
26262306a36Sopenharmony_ci		idx_offset = 0;
26362306a36Sopenharmony_ci	else
26462306a36Sopenharmony_ci		idx_offset = 0x50;
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	if (path == RF_PATH_A)
26762306a36Sopenharmony_ci		path_offset = 0;
26862306a36Sopenharmony_ci	else
26962306a36Sopenharmony_ci		path_offset = 0x2000;
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	tmp_offset = idx_offset + path_offset;
27262306a36Sopenharmony_ci	/* msbk_d: 15/14/13/12 */
27362306a36Sopenharmony_ci	tmp = 0x0;
27462306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++)
27562306a36Sopenharmony_ci		tmp |= dack->msbk_d[path][index][i + 12] << (i * 8);
27662306a36Sopenharmony_ci	tmp_reg = 0x5e14 + tmp_offset;
27762306a36Sopenharmony_ci	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
27862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
27962306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
28062306a36Sopenharmony_ci	/* msbk_d: 11/10/9/8 */
28162306a36Sopenharmony_ci	tmp = 0x0;
28262306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++)
28362306a36Sopenharmony_ci		tmp |= dack->msbk_d[path][index][i + 8] << (i * 8);
28462306a36Sopenharmony_ci	tmp_reg = 0x5e18 + tmp_offset;
28562306a36Sopenharmony_ci	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
28662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
28762306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
28862306a36Sopenharmony_ci	/* msbk_d: 7/6/5/4 */
28962306a36Sopenharmony_ci	tmp = 0x0;
29062306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++)
29162306a36Sopenharmony_ci		tmp |= dack->msbk_d[path][index][i + 4] << (i * 8);
29262306a36Sopenharmony_ci	tmp_reg = 0x5e1c + tmp_offset;
29362306a36Sopenharmony_ci	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
29462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
29562306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
29662306a36Sopenharmony_ci	/* msbk_d: 3/2/1/0 */
29762306a36Sopenharmony_ci	tmp = 0x0;
29862306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++)
29962306a36Sopenharmony_ci		tmp |= dack->msbk_d[path][index][i] << (i * 8);
30062306a36Sopenharmony_ci	tmp_reg = 0x5e20 + tmp_offset;
30162306a36Sopenharmony_ci	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
30262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
30362306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
30462306a36Sopenharmony_ci	/* dadak_d/biask_d */
30562306a36Sopenharmony_ci	tmp = 0x0;
30662306a36Sopenharmony_ci	tmp = (dack->biask_d[path][index] << 22) |
30762306a36Sopenharmony_ci	       (dack->dadck_d[path][index] << 14);
30862306a36Sopenharmony_ci	tmp_reg = 0x5e24 + tmp_offset;
30962306a36Sopenharmony_ci	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
31062306a36Sopenharmony_ci}
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_cistatic void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
31362306a36Sopenharmony_ci{
31462306a36Sopenharmony_ci	u8 i;
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	for (i = 0; i < 2; i++)
31762306a36Sopenharmony_ci		_dack_reload_by_path(rtwdev, path, i);
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
32062306a36Sopenharmony_ci				 &rtw8852a_rfk_dack_reload_defs_a_tbl,
32162306a36Sopenharmony_ci				 &rtw8852a_rfk_dack_reload_defs_b_tbl);
32262306a36Sopenharmony_ci}
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci#define ADDC_T_AVG 100
32562306a36Sopenharmony_cistatic void _check_addc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
32662306a36Sopenharmony_ci{
32762306a36Sopenharmony_ci	s32 dc_re = 0, dc_im = 0;
32862306a36Sopenharmony_ci	u32 tmp;
32962306a36Sopenharmony_ci	u32 i;
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
33262306a36Sopenharmony_ci				 &rtw8852a_rfk_check_addc_defs_a_tbl,
33362306a36Sopenharmony_ci				 &rtw8852a_rfk_check_addc_defs_b_tbl);
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	for (i = 0; i < ADDC_T_AVG; i++) {
33662306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_DBG32_D, MASKDWORD);
33762306a36Sopenharmony_ci		dc_re += sign_extend32(FIELD_GET(0xfff000, tmp), 11);
33862306a36Sopenharmony_ci		dc_im += sign_extend32(FIELD_GET(0xfff, tmp), 11);
33962306a36Sopenharmony_ci	}
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	dc_re /= ADDC_T_AVG;
34262306a36Sopenharmony_ci	dc_im /= ADDC_T_AVG;
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
34562306a36Sopenharmony_ci		    "[DACK]S%d,dc_re = 0x%x,dc_im =0x%x\n", path, dc_re, dc_im);
34662306a36Sopenharmony_ci}
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_cistatic void _addck(struct rtw89_dev *rtwdev)
34962306a36Sopenharmony_ci{
35062306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
35162306a36Sopenharmony_ci	u32 val;
35262306a36Sopenharmony_ci	int ret;
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	/* S0 */
35562306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_reset_defs_a_tbl);
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S0 ADDCK\n");
35862306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_A);
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_trigger_defs_a_tbl);
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
36362306a36Sopenharmony_ci				       false, rtwdev, 0x1e00, BIT(0));
36462306a36Sopenharmony_ci	if (ret) {
36562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n");
36662306a36Sopenharmony_ci		dack->addck_timeout[0] = true;
36762306a36Sopenharmony_ci	}
36862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret);
36962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 ADDCK\n");
37062306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_A);
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_restore_defs_a_tbl);
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci	/* S1 */
37562306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_reset_defs_b_tbl);
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S1 ADDCK\n");
37862306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_B);
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_trigger_defs_b_tbl);
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
38362306a36Sopenharmony_ci				       false, rtwdev, 0x3e00, BIT(0));
38462306a36Sopenharmony_ci	if (ret) {
38562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n");
38662306a36Sopenharmony_ci		dack->addck_timeout[1] = true;
38762306a36Sopenharmony_ci	}
38862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret);
38962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 ADDCK\n");
39062306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_B);
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_restore_defs_b_tbl);
39362306a36Sopenharmony_ci}
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_cistatic void _check_dadc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
39662306a36Sopenharmony_ci{
39762306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
39862306a36Sopenharmony_ci				 &rtw8852a_rfk_check_dadc_defs_f_a_tbl,
39962306a36Sopenharmony_ci				 &rtw8852a_rfk_check_dadc_defs_f_b_tbl);
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci	_check_addc(rtwdev, path);
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
40462306a36Sopenharmony_ci				 &rtw8852a_rfk_check_dadc_defs_r_a_tbl,
40562306a36Sopenharmony_ci				 &rtw8852a_rfk_check_dadc_defs_r_b_tbl);
40662306a36Sopenharmony_ci}
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_cistatic void _dack_s0(struct rtw89_dev *rtwdev)
40962306a36Sopenharmony_ci{
41062306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
41162306a36Sopenharmony_ci	u32 val;
41262306a36Sopenharmony_ci	int ret;
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_f_a_tbl);
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
41762306a36Sopenharmony_ci				       false, rtwdev, 0x5e28, BIT(15));
41862306a36Sopenharmony_ci	ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
41962306a36Sopenharmony_ci					false, rtwdev, 0x5e78, BIT(15));
42062306a36Sopenharmony_ci	if (ret) {
42162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK timeout\n");
42262306a36Sopenharmony_ci		dack->msbk_timeout[0] = true;
42362306a36Sopenharmony_ci	}
42462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_m_a_tbl);
42762306a36Sopenharmony_ci
42862306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
42962306a36Sopenharmony_ci				       false, rtwdev, 0x5e48, BIT(17));
43062306a36Sopenharmony_ci	ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
43162306a36Sopenharmony_ci					false, rtwdev, 0x5e98, BIT(17));
43262306a36Sopenharmony_ci	if (ret) {
43362306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADACK timeout\n");
43462306a36Sopenharmony_ci		dack->dadck_timeout[0] = true;
43562306a36Sopenharmony_ci	}
43662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_r_a_tbl);
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n");
44162306a36Sopenharmony_ci	_check_dadc(rtwdev, RF_PATH_A);
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	_dack_backup_s0(rtwdev);
44462306a36Sopenharmony_ci	_dack_reload(rtwdev, RF_PATH_A);
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG);
44762306a36Sopenharmony_ci}
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_cistatic void _dack_s1(struct rtw89_dev *rtwdev)
45062306a36Sopenharmony_ci{
45162306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
45262306a36Sopenharmony_ci	u32 val;
45362306a36Sopenharmony_ci	int ret;
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_f_b_tbl);
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
45862306a36Sopenharmony_ci				       false, rtwdev, 0x7e28, BIT(15));
45962306a36Sopenharmony_ci	ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
46062306a36Sopenharmony_ci					false, rtwdev, 0x7e78, BIT(15));
46162306a36Sopenharmony_ci	if (ret) {
46262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK timeout\n");
46362306a36Sopenharmony_ci		dack->msbk_timeout[1] = true;
46462306a36Sopenharmony_ci	}
46562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_m_b_tbl);
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
47062306a36Sopenharmony_ci				       false, rtwdev, 0x7e48, BIT(17));
47162306a36Sopenharmony_ci	ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
47262306a36Sopenharmony_ci					false, rtwdev, 0x7e98, BIT(17));
47362306a36Sopenharmony_ci	if (ret) {
47462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DADCK timeout\n");
47562306a36Sopenharmony_ci		dack->dadck_timeout[1] = true;
47662306a36Sopenharmony_ci	}
47762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_r_b_tbl);
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 DADCK\n");
48262306a36Sopenharmony_ci	_check_dadc(rtwdev, RF_PATH_B);
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	_dack_backup_s1(rtwdev);
48562306a36Sopenharmony_ci	_dack_reload(rtwdev, RF_PATH_B);
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON);
48862306a36Sopenharmony_ci}
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_cistatic void _dack(struct rtw89_dev *rtwdev)
49162306a36Sopenharmony_ci{
49262306a36Sopenharmony_ci	_dack_s0(rtwdev);
49362306a36Sopenharmony_ci	_dack_s1(rtwdev);
49462306a36Sopenharmony_ci}
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_cistatic void _dac_cal(struct rtw89_dev *rtwdev, bool force)
49762306a36Sopenharmony_ci{
49862306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
49962306a36Sopenharmony_ci	u32 rf0_0, rf1_0;
50062306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB);
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	dack->dack_done = false;
50362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK b\n");
50462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n");
50562306a36Sopenharmony_ci	rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK);
50662306a36Sopenharmony_ci	rf1_0 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK);
50762306a36Sopenharmony_ci	_afe_init(rtwdev);
50862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0);
50962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0);
51062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x30001);
51162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x30001);
51262306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_START);
51362306a36Sopenharmony_ci	_addck(rtwdev);
51462306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_STOP);
51562306a36Sopenharmony_ci	_addck_backup(rtwdev);
51662306a36Sopenharmony_ci	_addck_reload(rtwdev);
51762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x40001);
51862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x40001);
51962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0);
52062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0);
52162306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_START);
52262306a36Sopenharmony_ci	_dack(rtwdev);
52362306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_STOP);
52462306a36Sopenharmony_ci	_dack_dump(rtwdev);
52562306a36Sopenharmony_ci	dack->dack_done = true;
52662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, rf0_0);
52762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, rf1_0);
52862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1);
52962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1);
53062306a36Sopenharmony_ci	dack->dack_cnt++;
53162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n");
53262306a36Sopenharmony_ci}
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci#define RTW8852A_NCTL_VER 0xd
53562306a36Sopenharmony_ci#define RTW8852A_IQK_VER 0x2a
53662306a36Sopenharmony_ci#define RTW8852A_IQK_SS 2
53762306a36Sopenharmony_ci#define RTW8852A_IQK_THR_REK 8
53862306a36Sopenharmony_ci#define RTW8852A_IQK_CFIR_GROUP_NR 4
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_cienum rtw8852a_iqk_type {
54162306a36Sopenharmony_ci	ID_TXAGC,
54262306a36Sopenharmony_ci	ID_FLOK_COARSE,
54362306a36Sopenharmony_ci	ID_FLOK_FINE,
54462306a36Sopenharmony_ci	ID_TXK,
54562306a36Sopenharmony_ci	ID_RXAGC,
54662306a36Sopenharmony_ci	ID_RXK,
54762306a36Sopenharmony_ci	ID_NBTXK,
54862306a36Sopenharmony_ci	ID_NBRXK,
54962306a36Sopenharmony_ci};
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_cistatic void _iqk_read_fft_dbcc0(struct rtw89_dev *rtwdev, u8 path)
55262306a36Sopenharmony_ci{
55362306a36Sopenharmony_ci	u8 i = 0x0;
55462306a36Sopenharmony_ci	u32 fft[6] = {0x0};
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
55762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00160000);
55862306a36Sopenharmony_ci	fft[0] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
55962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00170000);
56062306a36Sopenharmony_ci	fft[1] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
56162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00180000);
56262306a36Sopenharmony_ci	fft[2] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
56362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00190000);
56462306a36Sopenharmony_ci	fft[3] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
56562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x001a0000);
56662306a36Sopenharmony_ci	fft[4] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
56762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x001b0000);
56862306a36Sopenharmony_ci	fft[5] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
56962306a36Sopenharmony_ci	for (i = 0; i < 6; i++)
57062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x,fft[%x]= %x\n",
57162306a36Sopenharmony_ci			    path, i, fft[i]);
57262306a36Sopenharmony_ci}
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_cistatic void _iqk_read_xym_dbcc0(struct rtw89_dev *rtwdev, u8 path)
57562306a36Sopenharmony_ci{
57662306a36Sopenharmony_ci	u8 i = 0x0;
57762306a36Sopenharmony_ci	u32 tmp = 0x0;
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
58062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, B_NCTL_CFG_SPAGE, path);
58162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF, B_IQK_DIF_TRX, 0x1);
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci	for (i = 0x0; i < 0x18; i++) {
58462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_NCTL_N2, MASKDWORD, 0x000000c0 + i);
58562306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_NCTL_N2, MASKDWORD);
58662306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
58762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lx38 = %x\n",
58862306a36Sopenharmony_ci			    path, BIT(path), tmp);
58962306a36Sopenharmony_ci		udelay(1);
59062306a36Sopenharmony_ci	}
59162306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_IQK_DIF, B_IQK_DIF_TRX);
59262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, 0x40000000);
59362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_N2, MASKDWORD, 0x80010100);
59462306a36Sopenharmony_ci	udelay(1);
59562306a36Sopenharmony_ci}
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_cistatic void _iqk_read_txcfir_dbcc0(struct rtw89_dev *rtwdev, u8 path,
59862306a36Sopenharmony_ci				   u8 group)
59962306a36Sopenharmony_ci{
60062306a36Sopenharmony_ci	static const u32 base_addrs[RTW8852A_IQK_SS][RTW8852A_IQK_CFIR_GROUP_NR] = {
60162306a36Sopenharmony_ci		{0x8f20, 0x8f54, 0x8f88, 0x8fbc},
60262306a36Sopenharmony_ci		{0x9320, 0x9354, 0x9388, 0x93bc},
60362306a36Sopenharmony_ci	};
60462306a36Sopenharmony_ci	u8 idx = 0x0;
60562306a36Sopenharmony_ci	u32 tmp = 0x0;
60662306a36Sopenharmony_ci	u32 base_addr;
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci	if (path >= RTW8852A_IQK_SS) {
60962306a36Sopenharmony_ci		rtw89_warn(rtwdev, "cfir path %d out of range\n", path);
61062306a36Sopenharmony_ci		return;
61162306a36Sopenharmony_ci	}
61262306a36Sopenharmony_ci	if (group >= RTW8852A_IQK_CFIR_GROUP_NR) {
61362306a36Sopenharmony_ci		rtw89_warn(rtwdev, "cfir group %d out of range\n", group);
61462306a36Sopenharmony_ci		return;
61562306a36Sopenharmony_ci	}
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
61862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_W_COEF + (path << 8), MASKDWORD, 0x00000001);
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	base_addr = base_addrs[path][group];
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci	for (idx = 0; idx < 0x0d; idx++) {
62362306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, base_addr + (idx << 2), MASKDWORD);
62462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
62562306a36Sopenharmony_ci			    "[IQK] %x = %x\n",
62662306a36Sopenharmony_ci			    base_addr + (idx << 2), tmp);
62762306a36Sopenharmony_ci	}
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci	if (path == 0x0) {
63062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n");
63162306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C0, MASKDWORD);
63262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8f50 = %x\n", tmp);
63362306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C1, MASKDWORD);
63462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8f84 = %x\n", tmp);
63562306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C2, MASKDWORD);
63662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8fb8 = %x\n", tmp);
63762306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C3, MASKDWORD);
63862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8fec = %x\n", tmp);
63962306a36Sopenharmony_ci	} else {
64062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n");
64162306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C0, MASKDWORD);
64262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9350 = %x\n", tmp);
64362306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C1, MASKDWORD);
64462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9384 = %x\n", tmp);
64562306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C2, MASKDWORD);
64662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x93b8 = %x\n", tmp);
64762306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C3, MASKDWORD);
64862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x93ec = %x\n", tmp);
64962306a36Sopenharmony_ci	}
65062306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_W_COEF + (path << 8), MASKDWORD);
65162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0xc);
65262306a36Sopenharmony_ci	udelay(1);
65362306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), MASKDWORD);
65462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lxfc = %x\n", path,
65562306a36Sopenharmony_ci		    BIT(path), tmp);
65662306a36Sopenharmony_ci}
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_cistatic void _iqk_read_rxcfir_dbcc0(struct rtw89_dev *rtwdev, u8 path,
65962306a36Sopenharmony_ci				   u8 group)
66062306a36Sopenharmony_ci{
66162306a36Sopenharmony_ci	static const u32 base_addrs[RTW8852A_IQK_SS][RTW8852A_IQK_CFIR_GROUP_NR] = {
66262306a36Sopenharmony_ci		{0x8d00, 0x8d44, 0x8d88, 0x8dcc},
66362306a36Sopenharmony_ci		{0x9100, 0x9144, 0x9188, 0x91cc},
66462306a36Sopenharmony_ci	};
66562306a36Sopenharmony_ci	u8 idx = 0x0;
66662306a36Sopenharmony_ci	u32 tmp = 0x0;
66762306a36Sopenharmony_ci	u32 base_addr;
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	if (path >= RTW8852A_IQK_SS) {
67062306a36Sopenharmony_ci		rtw89_warn(rtwdev, "cfir path %d out of range\n", path);
67162306a36Sopenharmony_ci		return;
67262306a36Sopenharmony_ci	}
67362306a36Sopenharmony_ci	if (group >= RTW8852A_IQK_CFIR_GROUP_NR) {
67462306a36Sopenharmony_ci		rtw89_warn(rtwdev, "cfir group %d out of range\n", group);
67562306a36Sopenharmony_ci		return;
67662306a36Sopenharmony_ci	}
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
67962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_W_COEF + (path << 8), MASKDWORD, 0x00000001);
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	base_addr = base_addrs[path][group];
68262306a36Sopenharmony_ci	for (idx = 0; idx < 0x10; idx++) {
68362306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, base_addr + (idx << 2), MASKDWORD);
68462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
68562306a36Sopenharmony_ci			    "[IQK]%x = %x\n",
68662306a36Sopenharmony_ci			    base_addr + (idx << 2), tmp);
68762306a36Sopenharmony_ci	}
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci	if (path == 0x0) {
69062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n");
69162306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C0, MASKDWORD);
69262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8d40 = %x\n", tmp);
69362306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C1, MASKDWORD);
69462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8d84 = %x\n", tmp);
69562306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C2, MASKDWORD);
69662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8dc8 = %x\n", tmp);
69762306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C3, MASKDWORD);
69862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8e0c = %x\n", tmp);
69962306a36Sopenharmony_ci	} else {
70062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n");
70162306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C0, MASKDWORD);
70262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9140 = %x\n", tmp);
70362306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C1, MASKDWORD);
70462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9184 = %x\n", tmp);
70562306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C2, MASKDWORD);
70662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x91c8 = %x\n", tmp);
70762306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C3, MASKDWORD);
70862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x920c = %x\n", tmp);
70962306a36Sopenharmony_ci	}
71062306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_W_COEF + (path << 8), MASKDWORD);
71162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0xd);
71262306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), MASKDWORD);
71362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lxfc = %x\n", path,
71462306a36Sopenharmony_ci		    BIT(path), tmp);
71562306a36Sopenharmony_ci}
71662306a36Sopenharmony_ci
71762306a36Sopenharmony_cistatic void _iqk_sram(struct rtw89_dev *rtwdev, u8 path)
71862306a36Sopenharmony_ci{
71962306a36Sopenharmony_ci	u32 tmp = 0x0;
72062306a36Sopenharmony_ci	u32 i = 0x0;
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
72362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00020000);
72462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX2, MASKDWORD, 0x00000080);
72562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000);
72662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009);
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci	for (i = 0; i <= 0x9f; i++) {
72962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000 + i);
73062306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
73162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n", tmp);
73262306a36Sopenharmony_ci	}
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_ci	for (i = 0; i <= 0x9f; i++) {
73562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000 + i);
73662306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ);
73762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n", tmp);
73862306a36Sopenharmony_ci	}
73962306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_SRAM_IQRX2, MASKDWORD);
74062306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_SRAM_IQRX, MASKDWORD);
74162306a36Sopenharmony_ci}
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_cistatic void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path)
74462306a36Sopenharmony_ci{
74562306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
74662306a36Sopenharmony_ci	u32 tmp = 0x0;
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG);
74962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x3);
75062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041);
75162306a36Sopenharmony_ci	udelay(1);
75262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H2, 0x3);
75362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0);
75462306a36Sopenharmony_ci	udelay(1);
75562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1);
75662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H2, 0x0);
75762306a36Sopenharmony_ci	udelay(1);
75862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0303);
75962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0000);
76062306a36Sopenharmony_ci
76162306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
76262306a36Sopenharmony_ci	case RTW89_BAND_2G:
76362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RXK2);
76462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1);
76562306a36Sopenharmony_ci		break;
76662306a36Sopenharmony_ci	case RTW89_BAND_5G:
76762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RXK2);
76862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_WLSEL, RR_WLSEL_AG, 0x5);
76962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1);
77062306a36Sopenharmony_ci		break;
77162306a36Sopenharmony_ci	default:
77262306a36Sopenharmony_ci		break;
77362306a36Sopenharmony_ci	}
77462306a36Sopenharmony_ci	tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
77562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp);
77662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13);
77762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
77862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x1);
77962306a36Sopenharmony_ci	fsleep(128);
78062306a36Sopenharmony_ci}
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_cistatic bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path, u8 ktype)
78362306a36Sopenharmony_ci{
78462306a36Sopenharmony_ci	u32 tmp;
78562306a36Sopenharmony_ci	u32 val;
78662306a36Sopenharmony_ci	int ret;
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 1, 8200,
78962306a36Sopenharmony_ci				       false, rtwdev, 0xbff8, MASKBYTE0);
79062306a36Sopenharmony_ci	if (ret)
79162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]IQK timeout!!!\n");
79262306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0);
79362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ret=%d\n", path, ret);
79462306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD);
79562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
79662306a36Sopenharmony_ci		    "[IQK]S%x, type= %x, 0x8008 = 0x%x\n", path, ktype, tmp);
79762306a36Sopenharmony_ci
79862306a36Sopenharmony_ci	return false;
79962306a36Sopenharmony_ci}
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_cistatic bool _iqk_one_shot(struct rtw89_dev *rtwdev,
80262306a36Sopenharmony_ci			  enum rtw89_phy_idx phy_idx, u8 path, u8 ktype)
80362306a36Sopenharmony_ci{
80462306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
80562306a36Sopenharmony_ci	bool fail = false;
80662306a36Sopenharmony_ci	u32 iqk_cmd = 0x0;
80762306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy_idx, path);
80862306a36Sopenharmony_ci	u32 addr_rfc_ctl = 0x0;
80962306a36Sopenharmony_ci
81062306a36Sopenharmony_ci	if (path == RF_PATH_A)
81162306a36Sopenharmony_ci		addr_rfc_ctl = 0x5864;
81262306a36Sopenharmony_ci	else
81362306a36Sopenharmony_ci		addr_rfc_ctl = 0x7864;
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
81662306a36Sopenharmony_ci	switch (ktype) {
81762306a36Sopenharmony_ci	case ID_TXAGC:
81862306a36Sopenharmony_ci		iqk_cmd = 0x008 | (1 << (4 + path)) | (path << 1);
81962306a36Sopenharmony_ci		break;
82062306a36Sopenharmony_ci	case ID_FLOK_COARSE:
82162306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000);
82262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009);
82362306a36Sopenharmony_ci		iqk_cmd = 0x108 | (1 << (4 + path));
82462306a36Sopenharmony_ci		break;
82562306a36Sopenharmony_ci	case ID_FLOK_FINE:
82662306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000);
82762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009);
82862306a36Sopenharmony_ci		iqk_cmd = 0x208 | (1 << (4 + path));
82962306a36Sopenharmony_ci		break;
83062306a36Sopenharmony_ci	case ID_TXK:
83162306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, addr_rfc_ctl, 0x20000000);
83262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x025);
83362306a36Sopenharmony_ci		iqk_cmd = 0x008 | (1 << (path + 4)) |
83462306a36Sopenharmony_ci			  (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8);
83562306a36Sopenharmony_ci		break;
83662306a36Sopenharmony_ci	case ID_RXAGC:
83762306a36Sopenharmony_ci		iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1);
83862306a36Sopenharmony_ci		break;
83962306a36Sopenharmony_ci	case ID_RXK:
84062306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000);
84162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);
84262306a36Sopenharmony_ci		iqk_cmd = 0x008 | (1 << (path + 4)) |
84362306a36Sopenharmony_ci			  (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8);
84462306a36Sopenharmony_ci		break;
84562306a36Sopenharmony_ci	case ID_NBTXK:
84662306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, addr_rfc_ctl, 0x20000000);
84762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x025);
84862306a36Sopenharmony_ci		iqk_cmd = 0x308 | (1 << (4 + path));
84962306a36Sopenharmony_ci		break;
85062306a36Sopenharmony_ci	case ID_NBRXK:
85162306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000);
85262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);
85362306a36Sopenharmony_ci		iqk_cmd = 0x608 | (1 << (4 + path));
85462306a36Sopenharmony_ci		break;
85562306a36Sopenharmony_ci	default:
85662306a36Sopenharmony_ci		return false;
85762306a36Sopenharmony_ci	}
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1);
86062306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_DPK_CTL, B_DPK_CTL_EN);
86162306a36Sopenharmony_ci	udelay(1);
86262306a36Sopenharmony_ci	fail = _iqk_check_cal(rtwdev, path, ktype);
86362306a36Sopenharmony_ci	if (iqk_info->iqk_xym_en)
86462306a36Sopenharmony_ci		_iqk_read_xym_dbcc0(rtwdev, path);
86562306a36Sopenharmony_ci	if (iqk_info->iqk_fft_en)
86662306a36Sopenharmony_ci		_iqk_read_fft_dbcc0(rtwdev, path);
86762306a36Sopenharmony_ci	if (iqk_info->iqk_sram_en)
86862306a36Sopenharmony_ci		_iqk_sram(rtwdev, path);
86962306a36Sopenharmony_ci	if (iqk_info->iqk_cfir_en) {
87062306a36Sopenharmony_ci		if (ktype == ID_TXK) {
87162306a36Sopenharmony_ci			_iqk_read_txcfir_dbcc0(rtwdev, path, 0x0);
87262306a36Sopenharmony_ci			_iqk_read_txcfir_dbcc0(rtwdev, path, 0x1);
87362306a36Sopenharmony_ci			_iqk_read_txcfir_dbcc0(rtwdev, path, 0x2);
87462306a36Sopenharmony_ci			_iqk_read_txcfir_dbcc0(rtwdev, path, 0x3);
87562306a36Sopenharmony_ci		} else {
87662306a36Sopenharmony_ci			_iqk_read_rxcfir_dbcc0(rtwdev, path, 0x0);
87762306a36Sopenharmony_ci			_iqk_read_rxcfir_dbcc0(rtwdev, path, 0x1);
87862306a36Sopenharmony_ci			_iqk_read_rxcfir_dbcc0(rtwdev, path, 0x2);
87962306a36Sopenharmony_ci			_iqk_read_rxcfir_dbcc0(rtwdev, path, 0x3);
88062306a36Sopenharmony_ci		}
88162306a36Sopenharmony_ci	}
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, addr_rfc_ctl, 0x20000000);
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_ci	return fail;
88862306a36Sopenharmony_ci}
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_cistatic bool _rxk_group_sel(struct rtw89_dev *rtwdev,
89162306a36Sopenharmony_ci			   enum rtw89_phy_idx phy_idx, u8 path)
89262306a36Sopenharmony_ci{
89362306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
89462306a36Sopenharmony_ci	static const u32 rxgn_a[4] = {0x18C, 0x1A0, 0x28C, 0x2A0};
89562306a36Sopenharmony_ci	static const u32 attc2_a[4] = {0x0, 0x0, 0x07, 0x30};
89662306a36Sopenharmony_ci	static const u32 attc1_a[4] = {0x7, 0x5, 0x1, 0x1};
89762306a36Sopenharmony_ci	static const u32 rxgn_g[4] = {0x1CC, 0x1E0, 0x2CC, 0x2E0};
89862306a36Sopenharmony_ci	static const u32 attc2_g[4] = {0x0, 0x15, 0x3, 0x1a};
89962306a36Sopenharmony_ci	static const u32 attc1_g[4] = {0x1, 0x0, 0x1, 0x0};
90062306a36Sopenharmony_ci	u8 gp = 0x0;
90162306a36Sopenharmony_ci	bool fail = false;
90262306a36Sopenharmony_ci	u32 rf0 = 0x0;
90362306a36Sopenharmony_ci
90462306a36Sopenharmony_ci	for (gp = 0; gp < 0x4; gp++) {
90562306a36Sopenharmony_ci		switch (iqk_info->iqk_band[path]) {
90662306a36Sopenharmony_ci		case RTW89_BAND_2G:
90762306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, rxgn_g[gp]);
90862306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, attc2_g[gp]);
90962306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, attc1_g[gp]);
91062306a36Sopenharmony_ci			break;
91162306a36Sopenharmony_ci		case RTW89_BAND_5G:
91262306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, rxgn_a[gp]);
91362306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C2, attc2_a[gp]);
91462306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C1, attc1_a[gp]);
91562306a36Sopenharmony_ci			break;
91662306a36Sopenharmony_ci		default:
91762306a36Sopenharmony_ci			break;
91862306a36Sopenharmony_ci		}
91962306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_IQK_CFG, B_IQK_CFG_SET);
92062306a36Sopenharmony_ci		rf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);
92162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI,
92262306a36Sopenharmony_ci				       rf0 | iqk_info->syn1to2);
92362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_COM, MASKDWORD, 0x40010100);
92462306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR);
92562306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL);
92662306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3);
92762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp);
92862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN, 0x1);
92962306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
93062306a36Sopenharmony_ci		fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);
93162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(16 + gp + path * 4), fail);
93262306a36Sopenharmony_ci	}
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
93562306a36Sopenharmony_ci	case RTW89_BAND_2G:
93662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0);
93762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
93862306a36Sopenharmony_ci		break;
93962306a36Sopenharmony_ci	case RTW89_BAND_5G:
94062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0);
94162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
94262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_WLSEL, RR_WLSEL_AG, 0x0);
94362306a36Sopenharmony_ci		break;
94462306a36Sopenharmony_ci	default:
94562306a36Sopenharmony_ci		break;
94662306a36Sopenharmony_ci	}
94762306a36Sopenharmony_ci	iqk_info->nb_rxcfir[path] = 0x40000000;
94862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
94962306a36Sopenharmony_ci			       B_IQK_RES_RXCFIR, 0x5);
95062306a36Sopenharmony_ci	iqk_info->is_wb_rxiqk[path] = true;
95162306a36Sopenharmony_ci	return false;
95262306a36Sopenharmony_ci}
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_cistatic bool _iqk_nbrxk(struct rtw89_dev *rtwdev,
95562306a36Sopenharmony_ci		       enum rtw89_phy_idx phy_idx, u8 path)
95662306a36Sopenharmony_ci{
95762306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
95862306a36Sopenharmony_ci	u8 group = 0x0;
95962306a36Sopenharmony_ci	u32 rf0 = 0x0, tmp = 0x0;
96062306a36Sopenharmony_ci	u32 idxrxgain_a = 0x1a0;
96162306a36Sopenharmony_ci	u32 idxattc2_a = 0x00;
96262306a36Sopenharmony_ci	u32 idxattc1_a = 0x5;
96362306a36Sopenharmony_ci	u32 idxrxgain_g = 0x1E0;
96462306a36Sopenharmony_ci	u32 idxattc2_g = 0x15;
96562306a36Sopenharmony_ci	u32 idxattc1_g = 0x0;
96662306a36Sopenharmony_ci	bool fail = false;
96762306a36Sopenharmony_ci
96862306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
96962306a36Sopenharmony_ci	case RTW89_BAND_2G:
97062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, idxrxgain_g);
97162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, idxattc2_g);
97262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, idxattc1_g);
97362306a36Sopenharmony_ci		break;
97462306a36Sopenharmony_ci	case RTW89_BAND_5G:
97562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, idxrxgain_a);
97662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C2, idxattc2_a);
97762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C1, idxattc1_a);
97862306a36Sopenharmony_ci		break;
97962306a36Sopenharmony_ci	default:
98062306a36Sopenharmony_ci		break;
98162306a36Sopenharmony_ci	}
98262306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_IQK_CFG, B_IQK_CFG_SET);
98362306a36Sopenharmony_ci	rf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);
98462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI,
98562306a36Sopenharmony_ci			       rf0 | iqk_info->syn1to2);
98662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_COM, MASKDWORD, 0x40010100);
98762306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR);
98862306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL);
98962306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3);
99062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
99162306a36Sopenharmony_ci			       B_CFIR_LUT_GP, group);
99262306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN);
99362306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
99462306a36Sopenharmony_ci	fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
99762306a36Sopenharmony_ci	case RTW89_BAND_2G:
99862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0);
99962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
100062306a36Sopenharmony_ci		break;
100162306a36Sopenharmony_ci	case RTW89_BAND_5G:
100262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0);
100362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
100462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_WLSEL, RR_WLSEL_AG, 0x0);
100562306a36Sopenharmony_ci		break;
100662306a36Sopenharmony_ci	default:
100762306a36Sopenharmony_ci		break;
100862306a36Sopenharmony_ci	}
100962306a36Sopenharmony_ci	if (!fail) {
101062306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD);
101162306a36Sopenharmony_ci		iqk_info->nb_rxcfir[path] = tmp | 0x2;
101262306a36Sopenharmony_ci	} else {
101362306a36Sopenharmony_ci		iqk_info->nb_rxcfir[path] = 0x40000002;
101462306a36Sopenharmony_ci	}
101562306a36Sopenharmony_ci	return fail;
101662306a36Sopenharmony_ci}
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_cistatic void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path)
101962306a36Sopenharmony_ci{
102062306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ci	if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) {
102362306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
102462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8),
102562306a36Sopenharmony_ci				       MASKDWORD, 0x4d000a08);
102662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13),
102762306a36Sopenharmony_ci				       B_P0_RXCK_VAL, 0x2);
102862306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_P0_RXCK + (path << 13), B_P0_RXCK_ON);
102962306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON);
103062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x1);
103162306a36Sopenharmony_ci	} else {
103262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8),
103362306a36Sopenharmony_ci				       MASKDWORD, 0x44000a08);
103462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13),
103562306a36Sopenharmony_ci				       B_P0_RXCK_VAL, 0x1);
103662306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_P0_RXCK + (path << 13), B_P0_RXCK_ON);
103762306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON);
103862306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL);
103962306a36Sopenharmony_ci	}
104062306a36Sopenharmony_ci}
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_cistatic bool _txk_group_sel(struct rtw89_dev *rtwdev,
104362306a36Sopenharmony_ci			   enum rtw89_phy_idx phy_idx, u8 path)
104462306a36Sopenharmony_ci{
104562306a36Sopenharmony_ci	static const u32 a_txgain[4] = {0xE466, 0x646D, 0xE4E2, 0x64ED};
104662306a36Sopenharmony_ci	static const u32 g_txgain[4] = {0x60e8, 0x60f0, 0x61e8, 0x61ED};
104762306a36Sopenharmony_ci	static const u32 a_itqt[4] = {0x12, 0x12, 0x12, 0x1b};
104862306a36Sopenharmony_ci	static const u32 g_itqt[4] = {0x09, 0x12, 0x12, 0x12};
104962306a36Sopenharmony_ci	static const u32 g_attsmxr[4] = {0x0, 0x1, 0x1, 0x1};
105062306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
105162306a36Sopenharmony_ci	bool fail = false;
105262306a36Sopenharmony_ci	u8 gp = 0x0;
105362306a36Sopenharmony_ci	u32 tmp = 0x0;
105462306a36Sopenharmony_ci
105562306a36Sopenharmony_ci	for (gp = 0x0; gp < 0x4; gp++) {
105662306a36Sopenharmony_ci		switch (iqk_info->iqk_band[path]) {
105762306a36Sopenharmony_ci		case RTW89_BAND_2G:
105862306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8),
105962306a36Sopenharmony_ci					       B_RFGAIN_BND, 0x08);
106062306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL,
106162306a36Sopenharmony_ci				       g_txgain[gp]);
106262306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1,
106362306a36Sopenharmony_ci				       g_attsmxr[gp]);
106462306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0,
106562306a36Sopenharmony_ci				       g_attsmxr[gp]);
106662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
106762306a36Sopenharmony_ci					       MASKDWORD, g_itqt[gp]);
106862306a36Sopenharmony_ci			break;
106962306a36Sopenharmony_ci		case RTW89_BAND_5G:
107062306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8),
107162306a36Sopenharmony_ci					       B_RFGAIN_BND, 0x04);
107262306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL,
107362306a36Sopenharmony_ci				       a_txgain[gp]);
107462306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
107562306a36Sopenharmony_ci					       MASKDWORD, a_itqt[gp]);
107662306a36Sopenharmony_ci			break;
107762306a36Sopenharmony_ci		default:
107862306a36Sopenharmony_ci			break;
107962306a36Sopenharmony_ci		}
108062306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_TXCFIR);
108162306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL);
108262306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3);
108362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
108462306a36Sopenharmony_ci				       B_CFIR_LUT_GP, gp);
108562306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
108662306a36Sopenharmony_ci		fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);
108762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(8 + gp + path * 4), fail);
108862306a36Sopenharmony_ci	}
108962306a36Sopenharmony_ci
109062306a36Sopenharmony_ci	iqk_info->nb_txcfir[path] = 0x40000000;
109162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
109262306a36Sopenharmony_ci			       B_IQK_RES_TXCFIR, 0x5);
109362306a36Sopenharmony_ci	iqk_info->is_wb_txiqk[path] = true;
109462306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
109562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lx38 = 0x%x\n", path,
109662306a36Sopenharmony_ci		    BIT(path), tmp);
109762306a36Sopenharmony_ci	return false;
109862306a36Sopenharmony_ci}
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_cistatic bool _iqk_nbtxk(struct rtw89_dev *rtwdev,
110162306a36Sopenharmony_ci		       enum rtw89_phy_idx phy_idx, u8 path)
110262306a36Sopenharmony_ci{
110362306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
110462306a36Sopenharmony_ci	u8 group = 0x2;
110562306a36Sopenharmony_ci	u32 a_mode_txgain = 0x64e2;
110662306a36Sopenharmony_ci	u32 g_mode_txgain = 0x61e8;
110762306a36Sopenharmony_ci	u32 attsmxr = 0x1;
110862306a36Sopenharmony_ci	u32 itqt = 0x12;
110962306a36Sopenharmony_ci	u32 tmp = 0x0;
111062306a36Sopenharmony_ci	bool fail = false;
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
111362306a36Sopenharmony_ci	case RTW89_BAND_2G:
111462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8),
111562306a36Sopenharmony_ci				       B_RFGAIN_BND, 0x08);
111662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, g_mode_txgain);
111762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, attsmxr);
111862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, attsmxr);
111962306a36Sopenharmony_ci		break;
112062306a36Sopenharmony_ci	case RTW89_BAND_5G:
112162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8),
112262306a36Sopenharmony_ci				       B_RFGAIN_BND, 0x04);
112362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, a_mode_txgain);
112462306a36Sopenharmony_ci		break;
112562306a36Sopenharmony_ci	default:
112662306a36Sopenharmony_ci		break;
112762306a36Sopenharmony_ci	}
112862306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_TXCFIR);
112962306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL);
113062306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3);
113162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, group);
113262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt);
113362306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
113462306a36Sopenharmony_ci	fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);
113562306a36Sopenharmony_ci	if (!fail) {
113662306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
113762306a36Sopenharmony_ci		iqk_info->nb_txcfir[path] = tmp | 0x2;
113862306a36Sopenharmony_ci	} else {
113962306a36Sopenharmony_ci		iqk_info->nb_txcfir[path] = 0x40000002;
114062306a36Sopenharmony_ci	}
114162306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
114262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lx38 = 0x%x\n", path,
114362306a36Sopenharmony_ci		    BIT(path), tmp);
114462306a36Sopenharmony_ci	return fail;
114562306a36Sopenharmony_ci}
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_cistatic void _lok_res_table(struct rtw89_dev *rtwdev, u8 path, u8 ibias)
114862306a36Sopenharmony_ci{
114962306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
115062306a36Sopenharmony_ci
115162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ibias = %x\n", path, ibias);
115262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x2);
115362306a36Sopenharmony_ci	if (iqk_info->iqk_band[path] == RTW89_BAND_2G)
115462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x0);
115562306a36Sopenharmony_ci	else
115662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x1);
115762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ibias);
115862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0);
115962306a36Sopenharmony_ci}
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_cistatic bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path)
116262306a36Sopenharmony_ci{
116362306a36Sopenharmony_ci	bool is_fail = false;
116462306a36Sopenharmony_ci	u32 tmp = 0x0;
116562306a36Sopenharmony_ci	u32 core_i = 0x0;
116662306a36Sopenharmony_ci	u32 core_q = 0x0;
116762306a36Sopenharmony_ci
116862306a36Sopenharmony_ci	tmp = rtw89_read_rf(rtwdev, path, RR_TXMO, RFREG_MASK);
116962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK][FineLOK] S%x, 0x58 = 0x%x\n",
117062306a36Sopenharmony_ci		    path, tmp);
117162306a36Sopenharmony_ci	core_i = FIELD_GET(RR_TXMO_COI, tmp);
117262306a36Sopenharmony_ci	core_q = FIELD_GET(RR_TXMO_COQ, tmp);
117362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, i = 0x%x\n", path, core_i);
117462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, q = 0x%x\n", path, core_q);
117562306a36Sopenharmony_ci
117662306a36Sopenharmony_ci	if (core_i < 0x2 || core_i > 0x1d || core_q < 0x2 || core_q > 0x1d)
117762306a36Sopenharmony_ci		is_fail = true;
117862306a36Sopenharmony_ci	return is_fail;
117962306a36Sopenharmony_ci}
118062306a36Sopenharmony_ci
118162306a36Sopenharmony_cistatic bool _iqk_lok(struct rtw89_dev *rtwdev,
118262306a36Sopenharmony_ci		     enum rtw89_phy_idx phy_idx, u8 path)
118362306a36Sopenharmony_ci{
118462306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
118562306a36Sopenharmony_ci	u32 rf0 = 0x0;
118662306a36Sopenharmony_ci	u8 itqt = 0x12;
118762306a36Sopenharmony_ci	bool fail = false;
118862306a36Sopenharmony_ci	bool tmp = false;
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
119162306a36Sopenharmony_ci	case RTW89_BAND_2G:
119262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, 0xe5e0);
119362306a36Sopenharmony_ci		itqt = 0x09;
119462306a36Sopenharmony_ci		break;
119562306a36Sopenharmony_ci	case RTW89_BAND_5G:
119662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, 0xe4e0);
119762306a36Sopenharmony_ci		itqt = 0x12;
119862306a36Sopenharmony_ci		break;
119962306a36Sopenharmony_ci	default:
120062306a36Sopenharmony_ci		break;
120162306a36Sopenharmony_ci	}
120262306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_IQK_CFG, B_IQK_CFG_SET);
120362306a36Sopenharmony_ci	rf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);
120462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF1, B_IQK_DIF1_TXPI,
120562306a36Sopenharmony_ci			       rf0 | iqk_info->syn1to2);
120662306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_TXCFIR);
120762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1);
120862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, 0x1);
120962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, 0x0);
121062306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN);
121162306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP);
121262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt);
121362306a36Sopenharmony_ci	tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE);
121462306a36Sopenharmony_ci	iqk_info->lok_cor_fail[0][path] = tmp;
121562306a36Sopenharmony_ci	fsleep(10);
121662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt);
121762306a36Sopenharmony_ci	tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE);
121862306a36Sopenharmony_ci	iqk_info->lok_fin_fail[0][path] = tmp;
121962306a36Sopenharmony_ci	fail = _lok_finetune_check(rtwdev, path);
122062306a36Sopenharmony_ci	return fail;
122162306a36Sopenharmony_ci}
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_cistatic void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path)
122462306a36Sopenharmony_ci{
122562306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
122662306a36Sopenharmony_ci
122762306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG);
122862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f);
122962306a36Sopenharmony_ci	udelay(1);
123062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13);
123162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001);
123262306a36Sopenharmony_ci	udelay(1);
123362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041);
123462306a36Sopenharmony_ci	udelay(1);
123562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0303);
123662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0000);
123762306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
123862306a36Sopenharmony_ci	case RTW89_BAND_2G:
123962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_XALNA2, RR_XALNA2_SW, 0x00);
124062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_POW, 0x3f);
124162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0);
124262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x1);
124362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1);
124462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EN, 0x0);
124562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
124662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_LOK, 0x0);
124762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_MASK, 0x000);
124862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV2, RFREG_MASK, 0x80200);
124962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK, 0x80200);
125062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK,
125162306a36Sopenharmony_ci			       0x403e0 | iqk_info->syn1to2);
125262306a36Sopenharmony_ci		udelay(1);
125362306a36Sopenharmony_ci		break;
125462306a36Sopenharmony_ci	case RTW89_BAND_5G:
125562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x00);
125662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_POW, 0x3f);
125762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x7);
125862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EN, 0x0);
125962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
126062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_LOK, 0x0);
126162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_MASK, 0x100);
126262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV2, RFREG_MASK, 0x80200);
126362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK, 0x80200);
126462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, 0x1);
126562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, 0x0);
126662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK,
126762306a36Sopenharmony_ci			       0x403e0 | iqk_info->syn1to2);
126862306a36Sopenharmony_ci		udelay(1);
126962306a36Sopenharmony_ci		break;
127062306a36Sopenharmony_ci	default:
127162306a36Sopenharmony_ci		break;
127262306a36Sopenharmony_ci	}
127362306a36Sopenharmony_ci}
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_cistatic void _iqk_txclk_setting(struct rtw89_dev *rtwdev, u8 path)
127662306a36Sopenharmony_ci{
127762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08);
127862306a36Sopenharmony_ci}
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_cistatic void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
128162306a36Sopenharmony_ci			  u8 path)
128262306a36Sopenharmony_ci{
128362306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
128462306a36Sopenharmony_ci	u32 tmp = 0x0;
128562306a36Sopenharmony_ci	bool flag = 0x0;
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_thermal = %lu\n", path,
128862306a36Sopenharmony_ci		    ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]));
128962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_LOK_COR_fail= %d\n", path,
129062306a36Sopenharmony_ci		    iqk_info->lok_cor_fail[0][path]);
129162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_LOK_FIN_fail= %d\n", path,
129262306a36Sopenharmony_ci		    iqk_info->lok_fin_fail[0][path]);
129362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_TXIQK_fail = %d\n", path,
129462306a36Sopenharmony_ci		    iqk_info->iqk_tx_fail[0][path]);
129562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_RXIQK_fail= %d,\n", path,
129662306a36Sopenharmony_ci		    iqk_info->iqk_rx_fail[0][path]);
129762306a36Sopenharmony_ci	flag = iqk_info->lok_cor_fail[0][path];
129862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(0) << (path * 4), flag);
129962306a36Sopenharmony_ci	flag = iqk_info->lok_fin_fail[0][path];
130062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(1) << (path * 4), flag);
130162306a36Sopenharmony_ci	flag = iqk_info->iqk_tx_fail[0][path];
130262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(2) << (path * 4), flag);
130362306a36Sopenharmony_ci	flag = iqk_info->iqk_rx_fail[0][path];
130462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(3) << (path * 4), flag);
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_IQK_RES + (path << 8), MASKDWORD);
130762306a36Sopenharmony_ci	iqk_info->bp_iqkenable[path] = tmp;
130862306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
130962306a36Sopenharmony_ci	iqk_info->bp_txkresult[path] = tmp;
131062306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD);
131162306a36Sopenharmony_ci	iqk_info->bp_rxkresult[path] = tmp;
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_KCNT,
131462306a36Sopenharmony_ci			       (u8)iqk_info->iqk_times);
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_IQKINF, 0x0000000f << (path * 4));
131762306a36Sopenharmony_ci	if (tmp != 0x0)
131862306a36Sopenharmony_ci		iqk_info->iqk_fail_cnt++;
131962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF2, 0x00ff0000 << (path * 4),
132062306a36Sopenharmony_ci			       iqk_info->iqk_fail_cnt);
132162306a36Sopenharmony_ci}
132262306a36Sopenharmony_ci
132362306a36Sopenharmony_cistatic
132462306a36Sopenharmony_civoid _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
132562306a36Sopenharmony_ci{
132662306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
132762306a36Sopenharmony_ci	bool lok_is_fail = false;
132862306a36Sopenharmony_ci	u8 ibias = 0x1;
132962306a36Sopenharmony_ci	u8 i = 0;
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci	_iqk_txclk_setting(rtwdev, path);
133262306a36Sopenharmony_ci
133362306a36Sopenharmony_ci	for (i = 0; i < 3; i++) {
133462306a36Sopenharmony_ci		_lok_res_table(rtwdev, path, ibias++);
133562306a36Sopenharmony_ci		_iqk_txk_setting(rtwdev, path);
133662306a36Sopenharmony_ci		lok_is_fail = _iqk_lok(rtwdev, phy_idx, path);
133762306a36Sopenharmony_ci		if (!lok_is_fail)
133862306a36Sopenharmony_ci			break;
133962306a36Sopenharmony_ci	}
134062306a36Sopenharmony_ci	if (iqk_info->is_nbiqk)
134162306a36Sopenharmony_ci		iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path);
134262306a36Sopenharmony_ci	else
134362306a36Sopenharmony_ci		iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path);
134462306a36Sopenharmony_ci
134562306a36Sopenharmony_ci	_iqk_rxclk_setting(rtwdev, path);
134662306a36Sopenharmony_ci	_iqk_rxk_setting(rtwdev, path);
134762306a36Sopenharmony_ci	if (iqk_info->is_nbiqk || rtwdev->dbcc_en || iqk_info->iqk_band[path] == RTW89_BAND_2G)
134862306a36Sopenharmony_ci		iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path);
134962306a36Sopenharmony_ci	else
135062306a36Sopenharmony_ci		iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path);
135162306a36Sopenharmony_ci
135262306a36Sopenharmony_ci	_iqk_info_iqk(rtwdev, phy_idx, path);
135362306a36Sopenharmony_ci}
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_cistatic void _iqk_get_ch_info(struct rtw89_dev *rtwdev,
135662306a36Sopenharmony_ci			     enum rtw89_phy_idx phy, u8 path)
135762306a36Sopenharmony_ci{
135862306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
135962306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
136062306a36Sopenharmony_ci	u32 reg_rf18 = 0x0, reg_35c = 0x0;
136162306a36Sopenharmony_ci	u8 idx = 0;
136262306a36Sopenharmony_ci	u8 get_empty_table = false;
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
136562306a36Sopenharmony_ci	for  (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {
136662306a36Sopenharmony_ci		if (iqk_info->iqk_mcc_ch[idx][path] == 0) {
136762306a36Sopenharmony_ci			get_empty_table = true;
136862306a36Sopenharmony_ci			break;
136962306a36Sopenharmony_ci		}
137062306a36Sopenharmony_ci	}
137162306a36Sopenharmony_ci	if (!get_empty_table) {
137262306a36Sopenharmony_ci		idx = iqk_info->iqk_table_idx[path] + 1;
137362306a36Sopenharmony_ci		if (idx > RTW89_IQK_CHS_NR - 1)
137462306a36Sopenharmony_ci			idx = 0;
137562306a36Sopenharmony_ci	}
137662306a36Sopenharmony_ci	reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
137762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]cfg ch = %d\n", reg_rf18);
137862306a36Sopenharmony_ci	reg_35c = rtw89_phy_read32_mask(rtwdev, 0x35c, 0x00000c00);
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_ci	iqk_info->iqk_band[path] = chan->band_type;
138162306a36Sopenharmony_ci	iqk_info->iqk_bw[path] = chan->band_width;
138262306a36Sopenharmony_ci	iqk_info->iqk_ch[path] = chan->channel;
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
138562306a36Sopenharmony_ci		    "[IQK]iqk_info->iqk_band[%x] = 0x%x\n", path,
138662306a36Sopenharmony_ci		    iqk_info->iqk_band[path]);
138762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_info->iqk_bw[%x] = 0x%x\n",
138862306a36Sopenharmony_ci		    path, iqk_info->iqk_bw[path]);
138962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_info->iqk_ch[%x] = 0x%x\n",
139062306a36Sopenharmony_ci		    path, iqk_info->iqk_ch[path]);
139162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
139262306a36Sopenharmony_ci		    "[IQK]S%d (PHY%d): / DBCC %s/ %s/ CH%d/ %s\n", path, phy,
139362306a36Sopenharmony_ci		    rtwdev->dbcc_en ? "on" : "off",
139462306a36Sopenharmony_ci		    iqk_info->iqk_band[path] == 0 ? "2G" :
139562306a36Sopenharmony_ci		    iqk_info->iqk_band[path] == 1 ? "5G" : "6G",
139662306a36Sopenharmony_ci		    iqk_info->iqk_ch[path],
139762306a36Sopenharmony_ci		    iqk_info->iqk_bw[path] == 0 ? "20M" :
139862306a36Sopenharmony_ci		    iqk_info->iqk_bw[path] == 1 ? "40M" : "80M");
139962306a36Sopenharmony_ci	if (reg_35c == 0x01)
140062306a36Sopenharmony_ci		iqk_info->syn1to2 = 0x1;
140162306a36Sopenharmony_ci	else
140262306a36Sopenharmony_ci		iqk_info->syn1to2 = 0x0;
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_VER, RTW8852A_IQK_VER);
140562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKCH, 0x000f << (path * 16),
140662306a36Sopenharmony_ci			       (u8)iqk_info->iqk_band[path]);
140762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKCH, 0x00f0 << (path * 16),
140862306a36Sopenharmony_ci			       (u8)iqk_info->iqk_bw[path]);
140962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKCH, 0xff00 << (path * 16),
141062306a36Sopenharmony_ci			       (u8)iqk_info->iqk_ch[path]);
141162306a36Sopenharmony_ci
141262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF2, 0x000000ff, RTW8852A_NCTL_VER);
141362306a36Sopenharmony_ci}
141462306a36Sopenharmony_ci
141562306a36Sopenharmony_cistatic void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
141662306a36Sopenharmony_ci			   u8 path)
141762306a36Sopenharmony_ci{
141862306a36Sopenharmony_ci	_iqk_by_path(rtwdev, phy_idx, path);
141962306a36Sopenharmony_ci}
142062306a36Sopenharmony_ci
142162306a36Sopenharmony_cistatic void _iqk_restore(struct rtw89_dev *rtwdev, u8 path)
142262306a36Sopenharmony_ci{
142362306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
142462306a36Sopenharmony_ci
142562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD,
142662306a36Sopenharmony_ci			       iqk_info->nb_txcfir[path]);
142762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD,
142862306a36Sopenharmony_ci			       iqk_info->nb_rxcfir[path]);
142962306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_RPT, MASKDWORD);
143062306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_MDPK_RX_DCK, MASKDWORD);
143162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);
143262306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_KPATH_CFG, MASKDWORD);
143362306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_GAPK, B_GAPK_ADR);
143462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0x10010000);
143562306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_KIP + (path << 8), B_KIP_RFGAIN);
143662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_MAP + (path << 8), MASKDWORD, 0xe4e4e4e4);
143762306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL);
143862306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW);
143962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), MASKDWORD, 0x00000002);
144062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
144162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_POW, 0x0);
144262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
144362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
144462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_TXRSV, RR_TXRSV_GAPK, 0x0);
144562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_BIAS, RR_BIAS_GAPK, 0x0);
144662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
144762306a36Sopenharmony_ci}
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_cistatic void _iqk_afebb_restore(struct rtw89_dev *rtwdev,
145062306a36Sopenharmony_ci			       enum rtw89_phy_idx phy_idx, u8 path)
145162306a36Sopenharmony_ci{
145262306a36Sopenharmony_ci	const struct rtw89_rfk_tbl *tbl;
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci	switch (_kpath(rtwdev, phy_idx)) {
145562306a36Sopenharmony_ci	case RF_A:
145662306a36Sopenharmony_ci		tbl = &rtw8852a_rfk_iqk_restore_defs_dbcc_path0_tbl;
145762306a36Sopenharmony_ci		break;
145862306a36Sopenharmony_ci	case RF_B:
145962306a36Sopenharmony_ci		tbl = &rtw8852a_rfk_iqk_restore_defs_dbcc_path1_tbl;
146062306a36Sopenharmony_ci		break;
146162306a36Sopenharmony_ci	default:
146262306a36Sopenharmony_ci		tbl = &rtw8852a_rfk_iqk_restore_defs_nondbcc_path01_tbl;
146362306a36Sopenharmony_ci		break;
146462306a36Sopenharmony_ci	}
146562306a36Sopenharmony_ci
146662306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, tbl);
146762306a36Sopenharmony_ci}
146862306a36Sopenharmony_ci
146962306a36Sopenharmony_cistatic void _iqk_preset(struct rtw89_dev *rtwdev, u8 path)
147062306a36Sopenharmony_ci{
147162306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
147262306a36Sopenharmony_ci	u8 idx = iqk_info->iqk_table_idx[path];
147362306a36Sopenharmony_ci
147462306a36Sopenharmony_ci	if (rtwdev->dbcc_en) {
147562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
147662306a36Sopenharmony_ci				       B_COEF_SEL_IQC, path & 0x1);
147762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
147862306a36Sopenharmony_ci				       B_CFIR_LUT_G2, path & 0x1);
147962306a36Sopenharmony_ci	} else {
148062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
148162306a36Sopenharmony_ci				       B_COEF_SEL_IQC, idx);
148262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
148362306a36Sopenharmony_ci				       B_CFIR_LUT_G2, idx);
148462306a36Sopenharmony_ci	}
148562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
148662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
148762306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_RW, MASKDWORD);
148862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a);
148962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, MASKDWORD, 0x00200000);
149062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, MASKDWORD, 0x80000000);
149162306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_LOAD_COEF + (path << 8), MASKDWORD);
149262306a36Sopenharmony_ci}
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_cistatic void _iqk_macbb_setting(struct rtw89_dev *rtwdev,
149562306a36Sopenharmony_ci			       enum rtw89_phy_idx phy_idx, u8 path)
149662306a36Sopenharmony_ci{
149762306a36Sopenharmony_ci	const struct rtw89_rfk_tbl *tbl;
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===> %s\n", __func__);
150062306a36Sopenharmony_ci
150162306a36Sopenharmony_ci	switch (_kpath(rtwdev, phy_idx)) {
150262306a36Sopenharmony_ci	case RF_A:
150362306a36Sopenharmony_ci		tbl = &rtw8852a_rfk_iqk_set_defs_dbcc_path0_tbl;
150462306a36Sopenharmony_ci		break;
150562306a36Sopenharmony_ci	case RF_B:
150662306a36Sopenharmony_ci		tbl = &rtw8852a_rfk_iqk_set_defs_dbcc_path1_tbl;
150762306a36Sopenharmony_ci		break;
150862306a36Sopenharmony_ci	default:
150962306a36Sopenharmony_ci		tbl = &rtw8852a_rfk_iqk_set_defs_nondbcc_path01_tbl;
151062306a36Sopenharmony_ci		break;
151162306a36Sopenharmony_ci	}
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, tbl);
151462306a36Sopenharmony_ci}
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_cistatic void _iqk_dbcc(struct rtw89_dev *rtwdev, u8 path)
151762306a36Sopenharmony_ci{
151862306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
151962306a36Sopenharmony_ci	u8 phy_idx = 0x0;
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_ci	iqk_info->iqk_times++;
152262306a36Sopenharmony_ci
152362306a36Sopenharmony_ci	if (path == 0x0)
152462306a36Sopenharmony_ci		phy_idx = RTW89_PHY_0;
152562306a36Sopenharmony_ci	else
152662306a36Sopenharmony_ci		phy_idx = RTW89_PHY_1;
152762306a36Sopenharmony_ci
152862306a36Sopenharmony_ci	_iqk_get_ch_info(rtwdev, phy_idx, path);
152962306a36Sopenharmony_ci	_iqk_macbb_setting(rtwdev, phy_idx, path);
153062306a36Sopenharmony_ci	_iqk_preset(rtwdev, path);
153162306a36Sopenharmony_ci	_iqk_start_iqk(rtwdev, phy_idx, path);
153262306a36Sopenharmony_ci	_iqk_restore(rtwdev, path);
153362306a36Sopenharmony_ci	_iqk_afebb_restore(rtwdev, phy_idx, path);
153462306a36Sopenharmony_ci}
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_cistatic void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
153762306a36Sopenharmony_ci{
153862306a36Sopenharmony_ci	u32 rf_reg5, rck_val = 0;
153962306a36Sopenharmony_ci	u32 val;
154062306a36Sopenharmony_ci	int ret;
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path);
154362306a36Sopenharmony_ci
154462306a36Sopenharmony_ci	rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
154762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
154862306a36Sopenharmony_ci
154962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%x\n",
155062306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK));
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci	/* RCK trigger */
155362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240);
155462306a36Sopenharmony_ci
155562306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 20,
155662306a36Sopenharmony_ci				       false, rtwdev, path, 0x1c, BIT(3));
155762306a36Sopenharmony_ci	if (ret)
155862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RCK timeout\n");
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci	rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA);
156162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val);
156262306a36Sopenharmony_ci
156362306a36Sopenharmony_ci	/* RCK_ADC_OFFSET */
156462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKO, RR_RCKO_OFF, 0x4);
156562306a36Sopenharmony_ci
156662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RFC, RR_RFC_CKEN, 0x1);
156762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RFC, RR_RFC_CKEN, 0x0);
156862306a36Sopenharmony_ci
156962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
157062306a36Sopenharmony_ci
157162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
157262306a36Sopenharmony_ci		    "[RCK] RF 0x1b / 0x1c / 0x1d = 0x%x / 0x%x / 0x%x\n",
157362306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK),
157462306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_RCKS, RFREG_MASK),
157562306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_RCKO, RFREG_MASK));
157662306a36Sopenharmony_ci}
157762306a36Sopenharmony_ci
157862306a36Sopenharmony_cistatic void _iqk_init(struct rtw89_dev *rtwdev)
157962306a36Sopenharmony_ci{
158062306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
158162306a36Sopenharmony_ci	u8 ch, path;
158262306a36Sopenharmony_ci
158362306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_IQKINF, MASKDWORD);
158462306a36Sopenharmony_ci	if (iqk_info->is_iqk_init)
158562306a36Sopenharmony_ci		return;
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
158862306a36Sopenharmony_ci	iqk_info->is_iqk_init = true;
158962306a36Sopenharmony_ci	iqk_info->is_nbiqk = false;
159062306a36Sopenharmony_ci	iqk_info->iqk_fft_en = false;
159162306a36Sopenharmony_ci	iqk_info->iqk_sram_en = false;
159262306a36Sopenharmony_ci	iqk_info->iqk_cfir_en = false;
159362306a36Sopenharmony_ci	iqk_info->iqk_xym_en = false;
159462306a36Sopenharmony_ci	iqk_info->iqk_times = 0x0;
159562306a36Sopenharmony_ci
159662306a36Sopenharmony_ci	for (ch = 0; ch < RTW89_IQK_CHS_NR; ch++) {
159762306a36Sopenharmony_ci		iqk_info->iqk_channel[ch] = 0x0;
159862306a36Sopenharmony_ci		for (path = 0; path < RTW8852A_IQK_SS; path++) {
159962306a36Sopenharmony_ci			iqk_info->lok_cor_fail[ch][path] = false;
160062306a36Sopenharmony_ci			iqk_info->lok_fin_fail[ch][path] = false;
160162306a36Sopenharmony_ci			iqk_info->iqk_tx_fail[ch][path] = false;
160262306a36Sopenharmony_ci			iqk_info->iqk_rx_fail[ch][path] = false;
160362306a36Sopenharmony_ci			iqk_info->iqk_mcc_ch[ch][path] = 0x0;
160462306a36Sopenharmony_ci			iqk_info->iqk_table_idx[path] = 0x0;
160562306a36Sopenharmony_ci		}
160662306a36Sopenharmony_ci	}
160762306a36Sopenharmony_ci}
160862306a36Sopenharmony_ci
160962306a36Sopenharmony_cistatic void _doiqk(struct rtw89_dev *rtwdev, bool force,
161062306a36Sopenharmony_ci		   enum rtw89_phy_idx phy_idx, u8 path)
161162306a36Sopenharmony_ci{
161262306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
161362306a36Sopenharmony_ci	u32 backup_bb_val[BACKUP_BB_REGS_NR];
161462306a36Sopenharmony_ci	u32 backup_rf_val[RTW8852A_IQK_SS][BACKUP_RF_REGS_NR];
161562306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
161662306a36Sopenharmony_ci
161762306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
161862306a36Sopenharmony_ci
161962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
162062306a36Sopenharmony_ci		    "[IQK]==========IQK start!!!!!==========\n");
162162306a36Sopenharmony_ci	iqk_info->iqk_times++;
162262306a36Sopenharmony_ci	iqk_info->version = RTW8852A_IQK_VER;
162362306a36Sopenharmony_ci
162462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
162562306a36Sopenharmony_ci	_iqk_get_ch_info(rtwdev, phy_idx, path);
162662306a36Sopenharmony_ci	_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
162762306a36Sopenharmony_ci	_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
162862306a36Sopenharmony_ci	_iqk_macbb_setting(rtwdev, phy_idx, path);
162962306a36Sopenharmony_ci	_iqk_preset(rtwdev, path);
163062306a36Sopenharmony_ci	_iqk_start_iqk(rtwdev, phy_idx, path);
163162306a36Sopenharmony_ci	_iqk_restore(rtwdev, path);
163262306a36Sopenharmony_ci	_iqk_afebb_restore(rtwdev, phy_idx, path);
163362306a36Sopenharmony_ci	_rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
163462306a36Sopenharmony_ci	_rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path);
163562306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
163662306a36Sopenharmony_ci}
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_cistatic void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
163962306a36Sopenharmony_ci{
164062306a36Sopenharmony_ci	switch (_kpath(rtwdev, phy_idx)) {
164162306a36Sopenharmony_ci	case RF_A:
164262306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
164362306a36Sopenharmony_ci		break;
164462306a36Sopenharmony_ci	case RF_B:
164562306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
164662306a36Sopenharmony_ci		break;
164762306a36Sopenharmony_ci	case RF_AB:
164862306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
164962306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
165062306a36Sopenharmony_ci		break;
165162306a36Sopenharmony_ci	default:
165262306a36Sopenharmony_ci		break;
165362306a36Sopenharmony_ci	}
165462306a36Sopenharmony_ci}
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_ci#define RXDCK_VER_8852A 0xe
165762306a36Sopenharmony_ci
165862306a36Sopenharmony_cistatic void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
165962306a36Sopenharmony_ci			enum rtw89_rf_path path, bool is_afe)
166062306a36Sopenharmony_ci{
166162306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path);
166262306a36Sopenharmony_ci	u32 ori_val;
166362306a36Sopenharmony_ci
166462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
166562306a36Sopenharmony_ci		    "[RX_DCK] ==== S%d RX DCK (by %s)====\n",
166662306a36Sopenharmony_ci		    path, is_afe ? "AFE" : "RFC");
166762306a36Sopenharmony_ci
166862306a36Sopenharmony_ci	ori_val = rtw89_phy_read32_mask(rtwdev, R_P0_RXCK + (path << 13), MASKDWORD);
166962306a36Sopenharmony_ci
167062306a36Sopenharmony_ci	if (is_afe) {
167162306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG);
167262306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_P0_RXCK + (path << 13), B_P0_RXCK_ON);
167362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13),
167462306a36Sopenharmony_ci				       B_P0_RXCK_VAL, 0x3);
167562306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_S0_RXDC2 + (path << 13), B_S0_RXDC2_MEN);
167662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_S0_RXDC2 + (path << 13),
167762306a36Sopenharmony_ci				       B_S0_RXDC2_AVG, 0x3);
167862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3);
167962306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK);
168062306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST);
168162306a36Sopenharmony_ci		rtw89_phy_write32_set(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST);
168262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_CRXBB, 0x1);
168362306a36Sopenharmony_ci	}
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK2, RR_DCK2_CYCLE, 0x3f);
168662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_SEL, is_afe);
168762306a36Sopenharmony_ci
168862306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_ONESHOT_START);
168962306a36Sopenharmony_ci
169062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);
169162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1);
169262306a36Sopenharmony_ci
169362306a36Sopenharmony_ci	fsleep(600);
169462306a36Sopenharmony_ci
169562306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_ONESHOT_STOP);
169662306a36Sopenharmony_ci
169762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci	if (is_afe) {
170062306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG);
170162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13),
170262306a36Sopenharmony_ci				       MASKDWORD, ori_val);
170362306a36Sopenharmony_ci	}
170462306a36Sopenharmony_ci}
170562306a36Sopenharmony_ci
170662306a36Sopenharmony_cistatic void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
170762306a36Sopenharmony_ci		    bool is_afe)
170862306a36Sopenharmony_ci{
170962306a36Sopenharmony_ci	u8 path, kpath, dck_tune;
171062306a36Sopenharmony_ci	u32 rf_reg5;
171162306a36Sopenharmony_ci	u32 addr;
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
171462306a36Sopenharmony_ci		    "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, Cv: %d) ******\n",
171562306a36Sopenharmony_ci		    RXDCK_VER_8852A, rtwdev->hal.cv);
171662306a36Sopenharmony_ci
171762306a36Sopenharmony_ci	kpath = _kpath(rtwdev, phy);
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_ci	for (path = 0; path < 2; path++) {
172062306a36Sopenharmony_ci		if (!(kpath & BIT(path)))
172162306a36Sopenharmony_ci			continue;
172262306a36Sopenharmony_ci
172362306a36Sopenharmony_ci		rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
172462306a36Sopenharmony_ci		dck_tune = (u8)rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE);
172562306a36Sopenharmony_ci
172662306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path]) {
172762306a36Sopenharmony_ci			addr = 0x5818 + (path << 13);
172862306a36Sopenharmony_ci			/* TSSI pause */
172962306a36Sopenharmony_ci			rtw89_phy_write32_set(rtwdev, addr, BIT(30));
173062306a36Sopenharmony_ci		}
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
173362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0);
173462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
173562306a36Sopenharmony_ci		_set_rx_dck(rtwdev, phy, path, is_afe);
173662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune);
173762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path]) {
174062306a36Sopenharmony_ci			addr = 0x5818 + (path << 13);
174162306a36Sopenharmony_ci			/* TSSI resume */
174262306a36Sopenharmony_ci			rtw89_phy_write32_clr(rtwdev, addr, BIT(30));
174362306a36Sopenharmony_ci		}
174462306a36Sopenharmony_ci	}
174562306a36Sopenharmony_ci}
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_ci#define RTW8852A_RF_REL_VERSION 34
174862306a36Sopenharmony_ci#define RTW8852A_DPK_VER 0x10
174962306a36Sopenharmony_ci#define RTW8852A_DPK_TH_AVG_NUM 4
175062306a36Sopenharmony_ci#define RTW8852A_DPK_RF_PATH 2
175162306a36Sopenharmony_ci#define RTW8852A_DPK_KIP_REG_NUM 2
175262306a36Sopenharmony_ci
175362306a36Sopenharmony_cienum rtw8852a_dpk_id {
175462306a36Sopenharmony_ci	LBK_RXIQK	= 0x06,
175562306a36Sopenharmony_ci	SYNC		= 0x10,
175662306a36Sopenharmony_ci	MDPK_IDL	= 0x11,
175762306a36Sopenharmony_ci	MDPK_MPA	= 0x12,
175862306a36Sopenharmony_ci	GAIN_LOSS	= 0x13,
175962306a36Sopenharmony_ci	GAIN_CAL	= 0x14,
176062306a36Sopenharmony_ci};
176162306a36Sopenharmony_ci
176262306a36Sopenharmony_cistatic void _rf_direct_cntrl(struct rtw89_dev *rtwdev,
176362306a36Sopenharmony_ci			     enum rtw89_rf_path path, bool is_bybb)
176462306a36Sopenharmony_ci{
176562306a36Sopenharmony_ci	if (is_bybb)
176662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
176762306a36Sopenharmony_ci	else
176862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
176962306a36Sopenharmony_ci}
177062306a36Sopenharmony_ci
177162306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev,
177262306a36Sopenharmony_ci		       enum rtw89_rf_path path, bool off);
177362306a36Sopenharmony_ci
177462306a36Sopenharmony_cistatic void _dpk_bkup_kip(struct rtw89_dev *rtwdev, u32 *reg,
177562306a36Sopenharmony_ci			  u32 reg_bkup[][RTW8852A_DPK_KIP_REG_NUM],
177662306a36Sopenharmony_ci			  u8 path)
177762306a36Sopenharmony_ci{
177862306a36Sopenharmony_ci	u8 i;
177962306a36Sopenharmony_ci
178062306a36Sopenharmony_ci	for (i = 0; i < RTW8852A_DPK_KIP_REG_NUM; i++) {
178162306a36Sopenharmony_ci		reg_bkup[path][i] = rtw89_phy_read32_mask(rtwdev,
178262306a36Sopenharmony_ci							  reg[i] + (path << 8),
178362306a36Sopenharmony_ci							  MASKDWORD);
178462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n",
178562306a36Sopenharmony_ci			    reg[i] + (path << 8), reg_bkup[path][i]);
178662306a36Sopenharmony_ci	}
178762306a36Sopenharmony_ci}
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_cistatic void _dpk_reload_kip(struct rtw89_dev *rtwdev, u32 *reg,
179062306a36Sopenharmony_ci			    u32 reg_bkup[][RTW8852A_DPK_KIP_REG_NUM], u8 path)
179162306a36Sopenharmony_ci{
179262306a36Sopenharmony_ci	u8 i;
179362306a36Sopenharmony_ci
179462306a36Sopenharmony_ci	for (i = 0; i < RTW8852A_DPK_KIP_REG_NUM; i++) {
179562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8),
179662306a36Sopenharmony_ci				       MASKDWORD, reg_bkup[path][i]);
179762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Reload 0x%x = %x\n",
179862306a36Sopenharmony_ci			    reg[i] + (path << 8), reg_bkup[path][i]);
179962306a36Sopenharmony_ci	}
180062306a36Sopenharmony_ci}
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_cistatic u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
180362306a36Sopenharmony_ci			enum rtw89_rf_path path, enum rtw8852a_dpk_id id)
180462306a36Sopenharmony_ci{
180562306a36Sopenharmony_ci	u8 phy_map  = rtw89_btc_path_phymap(rtwdev, phy, path);
180662306a36Sopenharmony_ci	u16 dpk_cmd = 0x0;
180762306a36Sopenharmony_ci	u32 val;
180862306a36Sopenharmony_ci	int ret;
180962306a36Sopenharmony_ci
181062306a36Sopenharmony_ci	dpk_cmd = (u16)((id << 8) | (0x19 + (path << 4)));
181162306a36Sopenharmony_ci
181262306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_ONESHOT_START);
181362306a36Sopenharmony_ci
181462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd);
181562306a36Sopenharmony_ci	rtw89_phy_write32_set(rtwdev, R_DPK_CTL, B_DPK_CTL_EN);
181662306a36Sopenharmony_ci
181762306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
181862306a36Sopenharmony_ci				       10, 20000, false, rtwdev, 0xbff8, MASKBYTE0);
181962306a36Sopenharmony_ci
182062306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0);
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_ONESHOT_STOP);
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
182562306a36Sopenharmony_ci		    "[DPK] one-shot for %s = 0x%x (ret=%d)\n",
182662306a36Sopenharmony_ci		    id == 0x06 ? "LBK_RXIQK" :
182762306a36Sopenharmony_ci		    id == 0x10 ? "SYNC" :
182862306a36Sopenharmony_ci		    id == 0x11 ? "MDPK_IDL" :
182962306a36Sopenharmony_ci		    id == 0x12 ? "MDPK_MPA" :
183062306a36Sopenharmony_ci		    id == 0x13 ? "GAIN_LOSS" : "PWR_CAL",
183162306a36Sopenharmony_ci		    dpk_cmd, ret);
183262306a36Sopenharmony_ci
183362306a36Sopenharmony_ci	if (ret) {
183462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
183562306a36Sopenharmony_ci			    "[DPK] one-shot over 20ms!!!!\n");
183662306a36Sopenharmony_ci		return 1;
183762306a36Sopenharmony_ci	}
183862306a36Sopenharmony_ci
183962306a36Sopenharmony_ci	return 0;
184062306a36Sopenharmony_ci}
184162306a36Sopenharmony_ci
184262306a36Sopenharmony_cistatic void _dpk_rx_dck(struct rtw89_dev *rtwdev,
184362306a36Sopenharmony_ci			enum rtw89_phy_idx phy,
184462306a36Sopenharmony_ci			enum rtw89_rf_path path)
184562306a36Sopenharmony_ci{
184662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_EN_TIA_IDA, 0x3);
184762306a36Sopenharmony_ci	_set_rx_dck(rtwdev, phy, path, false);
184862306a36Sopenharmony_ci}
184962306a36Sopenharmony_ci
185062306a36Sopenharmony_cistatic void _dpk_information(struct rtw89_dev *rtwdev,
185162306a36Sopenharmony_ci			     enum rtw89_phy_idx phy,
185262306a36Sopenharmony_ci			     enum rtw89_rf_path path)
185362306a36Sopenharmony_ci{
185462306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
185562306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
185662306a36Sopenharmony_ci	u8 kidx = dpk->cur_idx[path];
185762306a36Sopenharmony_ci
185862306a36Sopenharmony_ci	dpk->bp[path][kidx].band = chan->band_type;
185962306a36Sopenharmony_ci	dpk->bp[path][kidx].ch = chan->channel;
186062306a36Sopenharmony_ci	dpk->bp[path][kidx].bw = chan->band_width;
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
186362306a36Sopenharmony_ci		    "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n",
186462306a36Sopenharmony_ci		    path, dpk->cur_idx[path], phy,
186562306a36Sopenharmony_ci		    rtwdev->is_tssi_mode[path] ? "on" : "off",
186662306a36Sopenharmony_ci		    rtwdev->dbcc_en ? "on" : "off",
186762306a36Sopenharmony_ci		    dpk->bp[path][kidx].band == 0 ? "2G" :
186862306a36Sopenharmony_ci		    dpk->bp[path][kidx].band == 1 ? "5G" : "6G",
186962306a36Sopenharmony_ci		    dpk->bp[path][kidx].ch,
187062306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == 0 ? "20M" :
187162306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == 1 ? "40M" : "80M");
187262306a36Sopenharmony_ci}
187362306a36Sopenharmony_ci
187462306a36Sopenharmony_cistatic void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev,
187562306a36Sopenharmony_ci				enum rtw89_phy_idx phy,
187662306a36Sopenharmony_ci				enum rtw89_rf_path path, u8 kpath)
187762306a36Sopenharmony_ci{
187862306a36Sopenharmony_ci	switch (kpath) {
187962306a36Sopenharmony_ci	case RF_A:
188062306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sf_defs_a_tbl);
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_2P4G_BAND, B_2P4G_BAND_SEL) == 0x0)
188362306a36Sopenharmony_ci			rtw89_phy_write32_set(rtwdev, R_RXCCA, B_RXCCA_DIS);
188462306a36Sopenharmony_ci
188562306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sr_defs_a_tbl);
188662306a36Sopenharmony_ci		break;
188762306a36Sopenharmony_ci	case RF_B:
188862306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sf_defs_b_tbl);
188962306a36Sopenharmony_ci
189062306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_2P4G_BAND, B_2P4G_BAND_SEL) == 0x1)
189162306a36Sopenharmony_ci			rtw89_phy_write32_set(rtwdev, R_RXCCA, B_RXCCA_DIS);
189262306a36Sopenharmony_ci
189362306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sr_defs_b_tbl);
189462306a36Sopenharmony_ci		break;
189562306a36Sopenharmony_ci	case RF_AB:
189662306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_s_defs_ab_tbl);
189762306a36Sopenharmony_ci		break;
189862306a36Sopenharmony_ci	default:
189962306a36Sopenharmony_ci		break;
190062306a36Sopenharmony_ci	}
190162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
190262306a36Sopenharmony_ci		    "[DPK] Set BB/AFE for PHY%d (kpath=%d)\n", phy, kpath);
190362306a36Sopenharmony_ci}
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_cistatic void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev,
190662306a36Sopenharmony_ci				enum rtw89_phy_idx phy,
190762306a36Sopenharmony_ci				enum rtw89_rf_path path, u8 kpath)
190862306a36Sopenharmony_ci{
190962306a36Sopenharmony_ci	switch (kpath) {
191062306a36Sopenharmony_ci	case RF_A:
191162306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_r_defs_a_tbl);
191262306a36Sopenharmony_ci		break;
191362306a36Sopenharmony_ci	case RF_B:
191462306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_r_defs_b_tbl);
191562306a36Sopenharmony_ci		break;
191662306a36Sopenharmony_ci	case RF_AB:
191762306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_r_defs_ab_tbl);
191862306a36Sopenharmony_ci		break;
191962306a36Sopenharmony_ci	default:
192062306a36Sopenharmony_ci		break;
192162306a36Sopenharmony_ci	}
192262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
192362306a36Sopenharmony_ci		    "[DPK] Restore BB/AFE for PHY%d (kpath=%d)\n", phy, kpath);
192462306a36Sopenharmony_ci}
192562306a36Sopenharmony_ci
192662306a36Sopenharmony_cistatic void _dpk_tssi_pause(struct rtw89_dev *rtwdev,
192762306a36Sopenharmony_ci			    enum rtw89_rf_path path, bool is_pause)
192862306a36Sopenharmony_ci{
192962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13),
193062306a36Sopenharmony_ci			       B_P0_TSSI_TRK_EN, is_pause);
193162306a36Sopenharmony_ci
193262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path,
193362306a36Sopenharmony_ci		    is_pause ? "pause" : "resume");
193462306a36Sopenharmony_ci}
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_cistatic void _dpk_kip_setting(struct rtw89_dev *rtwdev,
193762306a36Sopenharmony_ci			     enum rtw89_rf_path path, u8 kidx)
193862306a36Sopenharmony_ci{
193962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
194062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_CLK, MASKDWORD, 0x00093f3f);
194162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a);
194262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08);
194362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG, B_DPK_CFG_IDX, 0x2);
194462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, B_NCTL_CFG_SPAGE, path); /*subpage_id*/
194562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8) + (kidx << 2),
194662306a36Sopenharmony_ci			       MASKDWORD, 0x003f2e2e);
194762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
194862306a36Sopenharmony_ci			       MASKDWORD, 0x005b5b5b);
194962306a36Sopenharmony_ci
195062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP setting for S%d[%d]!!\n",
195162306a36Sopenharmony_ci		    path, kidx);
195262306a36Sopenharmony_ci}
195362306a36Sopenharmony_ci
195462306a36Sopenharmony_cistatic void _dpk_kip_restore(struct rtw89_dev *rtwdev,
195562306a36Sopenharmony_ci			     enum rtw89_rf_path path)
195662306a36Sopenharmony_ci{
195762306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_NCTL_RPT, MASKDWORD);
195862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);
195962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0x10010000);
196062306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_KIP_CLK, MASKDWORD);
196162306a36Sopenharmony_ci
196262306a36Sopenharmony_ci	if (rtwdev->hal.cv > CHIP_CBV)
196362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8), BIT(15), 0x1);
196462306a36Sopenharmony_ci
196562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path);
196662306a36Sopenharmony_ci}
196762306a36Sopenharmony_ci
196862306a36Sopenharmony_cistatic void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev,
196962306a36Sopenharmony_ci			   enum rtw89_phy_idx phy,
197062306a36Sopenharmony_ci			   enum rtw89_rf_path path)
197162306a36Sopenharmony_ci{
197262306a36Sopenharmony_ci	u8 cur_rxbb;
197362306a36Sopenharmony_ci
197462306a36Sopenharmony_ci	cur_rxbb = (u8)rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB);
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_lbk_rxiqk_defs_f_tbl);
197762306a36Sopenharmony_ci
197862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);
197962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1);
198062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXPOW, RR_RXPOW_IQK, 0x2);
198162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK,
198262306a36Sopenharmony_ci		       rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK));
198362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13);
198462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
198562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x1);
198662306a36Sopenharmony_ci
198762306a36Sopenharmony_ci	fsleep(70);
198862306a36Sopenharmony_ci
198962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTL, 0x1f);
199062306a36Sopenharmony_ci
199162306a36Sopenharmony_ci	if (cur_rxbb <= 0xa)
199262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTH, 0x3);
199362306a36Sopenharmony_ci	else if (cur_rxbb <= 0x10 && cur_rxbb >= 0xb)
199462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTH, 0x1);
199562306a36Sopenharmony_ci	else
199662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTH, 0x0);
199762306a36Sopenharmony_ci
199862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);
199962306a36Sopenharmony_ci
200062306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, LBK_RXIQK);
200162306a36Sopenharmony_ci
200262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path,
200362306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD));
200462306a36Sopenharmony_ci
200562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0);
200662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXPOW, RR_RXPOW_IQK, 0x0);
200762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); /*POW IQKPLL*/
200862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_DPK);
200962306a36Sopenharmony_ci
201062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_lbk_rxiqk_defs_r_tbl);
201162306a36Sopenharmony_ci}
201262306a36Sopenharmony_ci
201362306a36Sopenharmony_cistatic void _dpk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx,
201462306a36Sopenharmony_ci			     enum rtw89_rf_path path)
201562306a36Sopenharmony_ci{
201662306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
201762306a36Sopenharmony_ci
201862306a36Sopenharmony_ci	dpk->bp[path][kidx].ther_dpk =
201962306a36Sopenharmony_ci		ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
202062306a36Sopenharmony_ci
202162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n",
202262306a36Sopenharmony_ci		    dpk->bp[path][kidx].ther_dpk);
202362306a36Sopenharmony_ci}
202462306a36Sopenharmony_ci
202562306a36Sopenharmony_cistatic u8 _dpk_set_tx_pwr(struct rtw89_dev *rtwdev, u8 gain,
202662306a36Sopenharmony_ci			  enum rtw89_rf_path path)
202762306a36Sopenharmony_ci{
202862306a36Sopenharmony_ci	u8 txagc_ori = 0x38;
202962306a36Sopenharmony_ci
203062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MODOPT, RFREG_MASK, txagc_ori);
203162306a36Sopenharmony_ci
203262306a36Sopenharmony_ci	return txagc_ori;
203362306a36Sopenharmony_ci}
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_cistatic void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain,
203662306a36Sopenharmony_ci			    enum rtw89_rf_path path, u8 kidx)
203762306a36Sopenharmony_ci{
203862306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci	if (dpk->bp[path][kidx].band == RTW89_BAND_2G) {
204162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DPK, 0x280b);
204262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTC, 0x0);
204362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTR, 0x4);
204462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MIXER, RR_MIXER_GN, 0x0);
204562306a36Sopenharmony_ci	} else {
204662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DPK, 0x282e);
204762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_BIASA2, RR_BIASA2_LB, 0x7);
204862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXATANK, RR_TXATANK_LBSW, 0x3);
204962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXA, RR_RXA_DPK, 0x3);
205062306a36Sopenharmony_ci	}
205162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1);
205262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1);
205362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0);
205462306a36Sopenharmony_ci
205562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
205662306a36Sopenharmony_ci		    "[DPK] RF 0x0/0x1/0x1a = 0x%x/ 0x%x/ 0x%x\n",
205762306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK),
205862306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_MODOPT, RFREG_MASK),
205962306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_BTC, RFREG_MASK));
206062306a36Sopenharmony_ci}
206162306a36Sopenharmony_ci
206262306a36Sopenharmony_cistatic void _dpk_manual_txcfir(struct rtw89_dev *rtwdev,
206362306a36Sopenharmony_ci			       enum rtw89_rf_path path, bool is_manual)
206462306a36Sopenharmony_ci{
206562306a36Sopenharmony_ci	u8 tmp_pad, tmp_txbb;
206662306a36Sopenharmony_ci
206762306a36Sopenharmony_ci	if (is_manual) {
206862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_KIP + (path << 8), B_KIP_RFGAIN, 0x1);
206962306a36Sopenharmony_ci		tmp_pad = (u8)rtw89_read_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_PAD);
207062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RFGAIN + (path << 8),
207162306a36Sopenharmony_ci				       B_RFGAIN_PAD, tmp_pad);
207262306a36Sopenharmony_ci
207362306a36Sopenharmony_ci		tmp_txbb = (u8)rtw89_read_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_BB);
207462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RFGAIN + (path << 8),
207562306a36Sopenharmony_ci				       B_RFGAIN_TXBB, tmp_txbb);
207662306a36Sopenharmony_ci
207762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8),
207862306a36Sopenharmony_ci				       B_LOAD_COEF_CFIR, 0x1);
207962306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_LOAD_COEF + (path << 8),
208062306a36Sopenharmony_ci				      B_LOAD_COEF_CFIR);
208162306a36Sopenharmony_ci
208262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), BIT(1), 0x1);
208362306a36Sopenharmony_ci
208462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
208562306a36Sopenharmony_ci			    "[DPK] PAD_man / TXBB_man = 0x%x / 0x%x\n", tmp_pad,
208662306a36Sopenharmony_ci			    tmp_txbb);
208762306a36Sopenharmony_ci	} else {
208862306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_KIP + (path << 8), B_KIP_RFGAIN);
208962306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
209062306a36Sopenharmony_ci			    "[DPK] disable manual switch TXCFIR\n");
209162306a36Sopenharmony_ci	}
209262306a36Sopenharmony_ci}
209362306a36Sopenharmony_ci
209462306a36Sopenharmony_cistatic void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev,
209562306a36Sopenharmony_ci			       enum rtw89_rf_path path, bool is_bypass)
209662306a36Sopenharmony_ci{
209762306a36Sopenharmony_ci	if (is_bypass) {
209862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
209962306a36Sopenharmony_ci				       B_RXIQC_BYPASS2, 0x1);
210062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
210162306a36Sopenharmony_ci				       B_RXIQC_BYPASS, 0x1);
210262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
210362306a36Sopenharmony_ci			    "[DPK] Bypass RXIQC (0x8%d3c = 0x%x)\n", 1 + path,
210462306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
210562306a36Sopenharmony_ci						  MASKDWORD));
210662306a36Sopenharmony_ci	} else {
210762306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS2);
210862306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS);
210962306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
211062306a36Sopenharmony_ci			    "[DPK] restore 0x8%d3c = 0x%x\n", 1 + path,
211162306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
211262306a36Sopenharmony_ci						  MASKDWORD));
211362306a36Sopenharmony_ci	}
211462306a36Sopenharmony_ci}
211562306a36Sopenharmony_ci
211662306a36Sopenharmony_cistatic
211762306a36Sopenharmony_civoid _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)
211862306a36Sopenharmony_ci{
211962306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_ci	if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80)
212262306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_TPG_MOD, B_TPG_MOD_F);
212362306a36Sopenharmony_ci	else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40)
212462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2);
212562306a36Sopenharmony_ci	else
212662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1);
212762306a36Sopenharmony_ci
212862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n",
212962306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" :
213062306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M");
213162306a36Sopenharmony_ci}
213262306a36Sopenharmony_ci
213362306a36Sopenharmony_cistatic void _dpk_table_select(struct rtw89_dev *rtwdev,
213462306a36Sopenharmony_ci			      enum rtw89_rf_path path, u8 kidx, u8 gain)
213562306a36Sopenharmony_ci{
213662306a36Sopenharmony_ci	u8 val;
213762306a36Sopenharmony_ci
213862306a36Sopenharmony_ci	val = 0x80 + kidx * 0x20 + gain * 0x10;
213962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val);
214062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
214162306a36Sopenharmony_ci		    "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx,
214262306a36Sopenharmony_ci		    gain, val);
214362306a36Sopenharmony_ci}
214462306a36Sopenharmony_ci
214562306a36Sopenharmony_cistatic bool _dpk_sync_check(struct rtw89_dev *rtwdev,
214662306a36Sopenharmony_ci			    enum rtw89_rf_path path)
214762306a36Sopenharmony_ci{
214862306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_I 200
214962306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_Q 200
215062306a36Sopenharmony_ci#define DPK_SYNC_TH_CORR 170
215162306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
215262306a36Sopenharmony_ci	u16 dc_i, dc_q;
215362306a36Sopenharmony_ci	u8 corr_val, corr_idx;
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL);
215662306a36Sopenharmony_ci
215762306a36Sopenharmony_ci	corr_idx = (u8)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI);
215862306a36Sopenharmony_ci	corr_val = (u8)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV);
215962306a36Sopenharmony_ci
216062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
216162306a36Sopenharmony_ci		    "[DPK] S%d Corr_idx / Corr_val = %d / %d\n", path, corr_idx,
216262306a36Sopenharmony_ci		    corr_val);
216362306a36Sopenharmony_ci
216462306a36Sopenharmony_ci	dpk->corr_idx[path][0] = corr_idx;
216562306a36Sopenharmony_ci	dpk->corr_val[path][0] = corr_val;
216662306a36Sopenharmony_ci
216762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9);
216862306a36Sopenharmony_ci
216962306a36Sopenharmony_ci	dc_i = (u16)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
217062306a36Sopenharmony_ci	dc_q = (u16)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ);
217162306a36Sopenharmony_ci
217262306a36Sopenharmony_ci	dc_i = abs(sign_extend32(dc_i, 11));
217362306a36Sopenharmony_ci	dc_q = abs(sign_extend32(dc_q, 11));
217462306a36Sopenharmony_ci
217562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n",
217662306a36Sopenharmony_ci		    path, dc_i, dc_q);
217762306a36Sopenharmony_ci
217862306a36Sopenharmony_ci	dpk->dc_i[path][0] = dc_i;
217962306a36Sopenharmony_ci	dpk->dc_q[path][0] = dc_q;
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ci	if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q ||
218262306a36Sopenharmony_ci	    corr_val < DPK_SYNC_TH_CORR)
218362306a36Sopenharmony_ci		return true;
218462306a36Sopenharmony_ci	else
218562306a36Sopenharmony_ci		return false;
218662306a36Sopenharmony_ci}
218762306a36Sopenharmony_ci
218862306a36Sopenharmony_cistatic bool _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
218962306a36Sopenharmony_ci		      enum rtw89_rf_path path, u8 kidx)
219062306a36Sopenharmony_ci{
219162306a36Sopenharmony_ci	_dpk_tpg_sel(rtwdev, path, kidx);
219262306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, SYNC);
219362306a36Sopenharmony_ci	return _dpk_sync_check(rtwdev, path); /*1= fail*/
219462306a36Sopenharmony_ci}
219562306a36Sopenharmony_ci
219662306a36Sopenharmony_cistatic u16 _dpk_dgain_read(struct rtw89_dev *rtwdev)
219762306a36Sopenharmony_ci{
219862306a36Sopenharmony_ci	u16 dgain = 0x0;
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL);
220162306a36Sopenharmony_ci
220262306a36Sopenharmony_ci	rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_SYNERR);
220362306a36Sopenharmony_ci
220462306a36Sopenharmony_ci	dgain = (u16)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
220562306a36Sopenharmony_ci
220662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x (%d)\n", dgain,
220762306a36Sopenharmony_ci		    dgain);
220862306a36Sopenharmony_ci
220962306a36Sopenharmony_ci	return dgain;
221062306a36Sopenharmony_ci}
221162306a36Sopenharmony_ci
221262306a36Sopenharmony_cistatic s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain)
221362306a36Sopenharmony_ci{
221462306a36Sopenharmony_ci	s8 offset;
221562306a36Sopenharmony_ci
221662306a36Sopenharmony_ci	if (dgain >= 0x783)
221762306a36Sopenharmony_ci		offset = 0x6;
221862306a36Sopenharmony_ci	else if (dgain <= 0x782 && dgain >= 0x551)
221962306a36Sopenharmony_ci		offset = 0x3;
222062306a36Sopenharmony_ci	else if (dgain <= 0x550 && dgain >= 0x3c4)
222162306a36Sopenharmony_ci		offset = 0x0;
222262306a36Sopenharmony_ci	else if (dgain <= 0x3c3 && dgain >= 0x2aa)
222362306a36Sopenharmony_ci		offset = -3;
222462306a36Sopenharmony_ci	else if (dgain <= 0x2a9 && dgain >= 0x1e3)
222562306a36Sopenharmony_ci		offset = -6;
222662306a36Sopenharmony_ci	else if (dgain <= 0x1e2 && dgain >= 0x156)
222762306a36Sopenharmony_ci		offset = -9;
222862306a36Sopenharmony_ci	else if (dgain <= 0x155)
222962306a36Sopenharmony_ci		offset = -12;
223062306a36Sopenharmony_ci	else
223162306a36Sopenharmony_ci		offset = 0x0;
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_ci	return offset;
223462306a36Sopenharmony_ci}
223562306a36Sopenharmony_ci
223662306a36Sopenharmony_cistatic u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev)
223762306a36Sopenharmony_ci{
223862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6);
223962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1);
224062306a36Sopenharmony_ci	return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL);
224162306a36Sopenharmony_ci}
224262306a36Sopenharmony_ci
224362306a36Sopenharmony_cistatic void _dpk_gainloss(struct rtw89_dev *rtwdev,
224462306a36Sopenharmony_ci			  enum rtw89_phy_idx phy, enum rtw89_rf_path path,
224562306a36Sopenharmony_ci			  u8 kidx)
224662306a36Sopenharmony_ci{
224762306a36Sopenharmony_ci	_dpk_table_select(rtwdev, path, kidx, 1);
224862306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, GAIN_LOSS);
224962306a36Sopenharmony_ci}
225062306a36Sopenharmony_ci
225162306a36Sopenharmony_ci#define DPK_TXAGC_LOWER 0x2e
225262306a36Sopenharmony_ci#define DPK_TXAGC_UPPER 0x3f
225362306a36Sopenharmony_ci#define DPK_TXAGC_INVAL 0xff
225462306a36Sopenharmony_ci
225562306a36Sopenharmony_cistatic u8 _dpk_set_offset(struct rtw89_dev *rtwdev,
225662306a36Sopenharmony_ci			  enum rtw89_rf_path path, s8 gain_offset)
225762306a36Sopenharmony_ci{
225862306a36Sopenharmony_ci	u8 txagc;
225962306a36Sopenharmony_ci
226062306a36Sopenharmony_ci	txagc = (u8)rtw89_read_rf(rtwdev, path, RR_MODOPT, RFREG_MASK);
226162306a36Sopenharmony_ci
226262306a36Sopenharmony_ci	if (txagc - gain_offset < DPK_TXAGC_LOWER)
226362306a36Sopenharmony_ci		txagc = DPK_TXAGC_LOWER;
226462306a36Sopenharmony_ci	else if (txagc - gain_offset > DPK_TXAGC_UPPER)
226562306a36Sopenharmony_ci		txagc = DPK_TXAGC_UPPER;
226662306a36Sopenharmony_ci	else
226762306a36Sopenharmony_ci		txagc = txagc - gain_offset;
226862306a36Sopenharmony_ci
226962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MODOPT, RFREG_MASK, txagc);
227062306a36Sopenharmony_ci
227162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n",
227262306a36Sopenharmony_ci		    gain_offset, txagc);
227362306a36Sopenharmony_ci	return txagc;
227462306a36Sopenharmony_ci}
227562306a36Sopenharmony_ci
227662306a36Sopenharmony_cienum dpk_agc_step {
227762306a36Sopenharmony_ci	DPK_AGC_STEP_SYNC_DGAIN,
227862306a36Sopenharmony_ci	DPK_AGC_STEP_GAIN_ADJ,
227962306a36Sopenharmony_ci	DPK_AGC_STEP_GAIN_LOSS_IDX,
228062306a36Sopenharmony_ci	DPK_AGC_STEP_GL_GT_CRITERION,
228162306a36Sopenharmony_ci	DPK_AGC_STEP_GL_LT_CRITERION,
228262306a36Sopenharmony_ci	DPK_AGC_STEP_SET_TX_GAIN,
228362306a36Sopenharmony_ci};
228462306a36Sopenharmony_ci
228562306a36Sopenharmony_cistatic u8 _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check)
228662306a36Sopenharmony_ci{
228762306a36Sopenharmony_ci	u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0;
228862306a36Sopenharmony_ci	u8 i;
228962306a36Sopenharmony_ci
229062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_pas_read_defs_tbl);
229162306a36Sopenharmony_ci
229262306a36Sopenharmony_ci	if (is_check) {
229362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00);
229462306a36Sopenharmony_ci		val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
229562306a36Sopenharmony_ci		val1_i = abs(sign_extend32(val1_i, 11));
229662306a36Sopenharmony_ci		val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
229762306a36Sopenharmony_ci		val1_q = abs(sign_extend32(val1_q, 11));
229862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f);
229962306a36Sopenharmony_ci		val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
230062306a36Sopenharmony_ci		val2_i = abs(sign_extend32(val2_i, 11));
230162306a36Sopenharmony_ci		val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
230262306a36Sopenharmony_ci		val2_q = abs(sign_extend32(val2_q, 11));
230362306a36Sopenharmony_ci
230462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n",
230562306a36Sopenharmony_ci			    phy_div(val1_i * val1_i + val1_q * val1_q,
230662306a36Sopenharmony_ci				    val2_i * val2_i + val2_q * val2_q));
230762306a36Sopenharmony_ci
230862306a36Sopenharmony_ci	} else {
230962306a36Sopenharmony_ci		for (i = 0; i < 32; i++) {
231062306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i);
231162306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK,
231262306a36Sopenharmony_ci				    "[DPK] PAS_Read[%02d]= 0x%08x\n", i,
231362306a36Sopenharmony_ci				    rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD));
231462306a36Sopenharmony_ci		}
231562306a36Sopenharmony_ci	}
231662306a36Sopenharmony_ci	if ((val1_i * val1_i + val1_q * val1_q) >=
231762306a36Sopenharmony_ci	    ((val2_i * val2_i + val2_q * val2_q) * 8 / 5))
231862306a36Sopenharmony_ci		return 1;
231962306a36Sopenharmony_ci	else
232062306a36Sopenharmony_ci		return 0;
232162306a36Sopenharmony_ci}
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_cistatic u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
232462306a36Sopenharmony_ci		   enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
232562306a36Sopenharmony_ci		   bool loss_only)
232662306a36Sopenharmony_ci{
232762306a36Sopenharmony_ci#define DPK_AGC_ADJ_LMT 6
232862306a36Sopenharmony_ci#define DPK_DGAIN_UPPER 1922
232962306a36Sopenharmony_ci#define DPK_DGAIN_LOWER 342
233062306a36Sopenharmony_ci#define DPK_RXBB_UPPER 0x1f
233162306a36Sopenharmony_ci#define DPK_RXBB_LOWER 0
233262306a36Sopenharmony_ci#define DPK_GL_CRIT 7
233362306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
233462306a36Sopenharmony_ci	u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0;
233562306a36Sopenharmony_ci	u8 agc_cnt = 0;
233662306a36Sopenharmony_ci	bool limited_rxbb = false;
233762306a36Sopenharmony_ci	s8 offset = 0;
233862306a36Sopenharmony_ci	u16 dgain = 0;
233962306a36Sopenharmony_ci	u8 step = DPK_AGC_STEP_SYNC_DGAIN;
234062306a36Sopenharmony_ci	bool goout = false;
234162306a36Sopenharmony_ci
234262306a36Sopenharmony_ci	tmp_txagc = init_txagc;
234362306a36Sopenharmony_ci
234462306a36Sopenharmony_ci	do {
234562306a36Sopenharmony_ci		switch (step) {
234662306a36Sopenharmony_ci		case DPK_AGC_STEP_SYNC_DGAIN:
234762306a36Sopenharmony_ci			if (_dpk_sync(rtwdev, phy, path, kidx)) {
234862306a36Sopenharmony_ci				tmp_txagc = DPK_TXAGC_INVAL;
234962306a36Sopenharmony_ci				goout = true;
235062306a36Sopenharmony_ci				break;
235162306a36Sopenharmony_ci			}
235262306a36Sopenharmony_ci
235362306a36Sopenharmony_ci			dgain = _dpk_dgain_read(rtwdev);
235462306a36Sopenharmony_ci
235562306a36Sopenharmony_ci			if (loss_only || limited_rxbb)
235662306a36Sopenharmony_ci				step = DPK_AGC_STEP_GAIN_LOSS_IDX;
235762306a36Sopenharmony_ci			else
235862306a36Sopenharmony_ci				step = DPK_AGC_STEP_GAIN_ADJ;
235962306a36Sopenharmony_ci			break;
236062306a36Sopenharmony_ci
236162306a36Sopenharmony_ci		case DPK_AGC_STEP_GAIN_ADJ:
236262306a36Sopenharmony_ci			tmp_rxbb = (u8)rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB);
236362306a36Sopenharmony_ci			offset = _dpk_dgain_mapping(rtwdev, dgain);
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci			if (tmp_rxbb + offset > DPK_RXBB_UPPER) {
236662306a36Sopenharmony_ci				tmp_rxbb = DPK_RXBB_UPPER;
236762306a36Sopenharmony_ci				limited_rxbb = true;
236862306a36Sopenharmony_ci			} else if (tmp_rxbb + offset < DPK_RXBB_LOWER) {
236962306a36Sopenharmony_ci				tmp_rxbb = DPK_RXBB_LOWER;
237062306a36Sopenharmony_ci				limited_rxbb = true;
237162306a36Sopenharmony_ci			} else {
237262306a36Sopenharmony_ci				tmp_rxbb = tmp_rxbb + offset;
237362306a36Sopenharmony_ci			}
237462306a36Sopenharmony_ci
237562306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB, tmp_rxbb);
237662306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK,
237762306a36Sopenharmony_ci				    "[DPK] Adjust RXBB (%d) = 0x%x\n", offset,
237862306a36Sopenharmony_ci				    tmp_rxbb);
237962306a36Sopenharmony_ci			if (offset != 0 || agc_cnt == 0) {
238062306a36Sopenharmony_ci				if (chan->band_width < RTW89_CHANNEL_WIDTH_80)
238162306a36Sopenharmony_ci					_dpk_bypass_rxcfir(rtwdev, path, true);
238262306a36Sopenharmony_ci				else
238362306a36Sopenharmony_ci					_dpk_lbk_rxiqk(rtwdev, phy, path);
238462306a36Sopenharmony_ci			}
238562306a36Sopenharmony_ci			if (dgain > DPK_DGAIN_UPPER || dgain < DPK_DGAIN_LOWER)
238662306a36Sopenharmony_ci				step = DPK_AGC_STEP_SYNC_DGAIN;
238762306a36Sopenharmony_ci			else
238862306a36Sopenharmony_ci				step = DPK_AGC_STEP_GAIN_LOSS_IDX;
238962306a36Sopenharmony_ci
239062306a36Sopenharmony_ci			agc_cnt++;
239162306a36Sopenharmony_ci			break;
239262306a36Sopenharmony_ci
239362306a36Sopenharmony_ci		case DPK_AGC_STEP_GAIN_LOSS_IDX:
239462306a36Sopenharmony_ci			_dpk_gainloss(rtwdev, phy, path, kidx);
239562306a36Sopenharmony_ci			tmp_gl_idx = _dpk_gainloss_read(rtwdev);
239662306a36Sopenharmony_ci
239762306a36Sopenharmony_ci			if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) ||
239862306a36Sopenharmony_ci			    tmp_gl_idx > DPK_GL_CRIT)
239962306a36Sopenharmony_ci				step = DPK_AGC_STEP_GL_GT_CRITERION;
240062306a36Sopenharmony_ci			else if (tmp_gl_idx == 0)
240162306a36Sopenharmony_ci				step = DPK_AGC_STEP_GL_LT_CRITERION;
240262306a36Sopenharmony_ci			else
240362306a36Sopenharmony_ci				step = DPK_AGC_STEP_SET_TX_GAIN;
240462306a36Sopenharmony_ci			break;
240562306a36Sopenharmony_ci
240662306a36Sopenharmony_ci		case DPK_AGC_STEP_GL_GT_CRITERION:
240762306a36Sopenharmony_ci			if (tmp_txagc == DPK_TXAGC_LOWER) {
240862306a36Sopenharmony_ci				goout = true;
240962306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_RFK,
241062306a36Sopenharmony_ci					    "[DPK] Txagc@lower bound!!\n");
241162306a36Sopenharmony_ci			} else {
241262306a36Sopenharmony_ci				tmp_txagc = _dpk_set_offset(rtwdev, path, 3);
241362306a36Sopenharmony_ci			}
241462306a36Sopenharmony_ci			step = DPK_AGC_STEP_GAIN_LOSS_IDX;
241562306a36Sopenharmony_ci			agc_cnt++;
241662306a36Sopenharmony_ci			break;
241762306a36Sopenharmony_ci
241862306a36Sopenharmony_ci		case DPK_AGC_STEP_GL_LT_CRITERION:
241962306a36Sopenharmony_ci			if (tmp_txagc == DPK_TXAGC_UPPER) {
242062306a36Sopenharmony_ci				goout = true;
242162306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_RFK,
242262306a36Sopenharmony_ci					    "[DPK] Txagc@upper bound!!\n");
242362306a36Sopenharmony_ci			} else {
242462306a36Sopenharmony_ci				tmp_txagc = _dpk_set_offset(rtwdev, path, -2);
242562306a36Sopenharmony_ci			}
242662306a36Sopenharmony_ci			step = DPK_AGC_STEP_GAIN_LOSS_IDX;
242762306a36Sopenharmony_ci			agc_cnt++;
242862306a36Sopenharmony_ci			break;
242962306a36Sopenharmony_ci
243062306a36Sopenharmony_ci		case DPK_AGC_STEP_SET_TX_GAIN:
243162306a36Sopenharmony_ci			tmp_txagc = _dpk_set_offset(rtwdev, path, tmp_gl_idx);
243262306a36Sopenharmony_ci			goout = true;
243362306a36Sopenharmony_ci			agc_cnt++;
243462306a36Sopenharmony_ci			break;
243562306a36Sopenharmony_ci
243662306a36Sopenharmony_ci		default:
243762306a36Sopenharmony_ci			goout = true;
243862306a36Sopenharmony_ci			break;
243962306a36Sopenharmony_ci		}
244062306a36Sopenharmony_ci	} while (!goout && (agc_cnt < DPK_AGC_ADJ_LMT));
244162306a36Sopenharmony_ci
244262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
244362306a36Sopenharmony_ci		    "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc,
244462306a36Sopenharmony_ci		    tmp_rxbb);
244562306a36Sopenharmony_ci
244662306a36Sopenharmony_ci	return tmp_txagc;
244762306a36Sopenharmony_ci}
244862306a36Sopenharmony_ci
244962306a36Sopenharmony_cistatic void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order)
245062306a36Sopenharmony_ci{
245162306a36Sopenharmony_ci	switch (order) {
245262306a36Sopenharmony_ci	case 0:
245362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
245462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3);
245562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1);
245662306a36Sopenharmony_ci		break;
245762306a36Sopenharmony_ci	case 1:
245862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
245962306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN);
246062306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN);
246162306a36Sopenharmony_ci		break;
246262306a36Sopenharmony_ci	case 2:
246362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
246462306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN);
246562306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN);
246662306a36Sopenharmony_ci		break;
246762306a36Sopenharmony_ci	default:
246862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
246962306a36Sopenharmony_ci			    "[DPK] Wrong MDPD order!!(0x%x)\n", order);
247062306a36Sopenharmony_ci		break;
247162306a36Sopenharmony_ci	}
247262306a36Sopenharmony_ci
247362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
247462306a36Sopenharmony_ci		    "[DPK] Set MDPD order to 0x%x for IDL\n", order);
247562306a36Sopenharmony_ci}
247662306a36Sopenharmony_ci
247762306a36Sopenharmony_cistatic void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
247862306a36Sopenharmony_ci			 enum rtw89_rf_path path, u8 kidx, u8 gain)
247962306a36Sopenharmony_ci{
248062306a36Sopenharmony_ci	_dpk_set_mdpd_para(rtwdev, 0x0);
248162306a36Sopenharmony_ci	_dpk_table_select(rtwdev, path, kidx, 1);
248262306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, MDPK_IDL);
248362306a36Sopenharmony_ci}
248462306a36Sopenharmony_ci
248562306a36Sopenharmony_cistatic void _dpk_fill_result(struct rtw89_dev *rtwdev,
248662306a36Sopenharmony_ci			     enum rtw89_rf_path path, u8 kidx, u8 gain,
248762306a36Sopenharmony_ci			     u8 txagc)
248862306a36Sopenharmony_ci{
248962306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
249062306a36Sopenharmony_ci
249162306a36Sopenharmony_ci	u16 pwsf = 0x78;
249262306a36Sopenharmony_ci	u8 gs = 0x5b;
249362306a36Sopenharmony_ci
249462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_MDPD, kidx);
249562306a36Sopenharmony_ci
249662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
249762306a36Sopenharmony_ci		    "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n", txagc,
249862306a36Sopenharmony_ci		    pwsf, gs);
249962306a36Sopenharmony_ci
250062306a36Sopenharmony_ci	dpk->bp[path][kidx].txagc_dpk = txagc;
250162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8),
250262306a36Sopenharmony_ci			       0x3F << ((gain << 3) + (kidx << 4)), txagc);
250362306a36Sopenharmony_ci
250462306a36Sopenharmony_ci	dpk->bp[path][kidx].pwsf = pwsf;
250562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2),
250662306a36Sopenharmony_ci			       0x1FF << (gain << 4), pwsf);
250762306a36Sopenharmony_ci
250862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1);
250962306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD);
251062306a36Sopenharmony_ci
251162306a36Sopenharmony_ci	dpk->bp[path][kidx].gs = gs;
251262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
251362306a36Sopenharmony_ci			       MASKDWORD, 0x065b5b5b);
251462306a36Sopenharmony_ci
251562306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD);
251662306a36Sopenharmony_ci
251762306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL);
251862306a36Sopenharmony_ci}
251962306a36Sopenharmony_ci
252062306a36Sopenharmony_cistatic bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
252162306a36Sopenharmony_ci			      enum rtw89_rf_path path)
252262306a36Sopenharmony_ci{
252362306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
252462306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
252562306a36Sopenharmony_ci	bool is_reload = false;
252662306a36Sopenharmony_ci	u8 idx, cur_band, cur_ch;
252762306a36Sopenharmony_ci
252862306a36Sopenharmony_ci	cur_band = chan->band_type;
252962306a36Sopenharmony_ci	cur_ch = chan->channel;
253062306a36Sopenharmony_ci
253162306a36Sopenharmony_ci	for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) {
253262306a36Sopenharmony_ci		if (cur_band != dpk->bp[path][idx].band ||
253362306a36Sopenharmony_ci		    cur_ch != dpk->bp[path][idx].ch)
253462306a36Sopenharmony_ci			continue;
253562306a36Sopenharmony_ci
253662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
253762306a36Sopenharmony_ci				       B_COEF_SEL_MDPD, idx);
253862306a36Sopenharmony_ci		dpk->cur_idx[path] = idx;
253962306a36Sopenharmony_ci		is_reload = true;
254062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
254162306a36Sopenharmony_ci			    "[DPK] reload S%d[%d] success\n", path, idx);
254262306a36Sopenharmony_ci	}
254362306a36Sopenharmony_ci
254462306a36Sopenharmony_ci	return is_reload;
254562306a36Sopenharmony_ci}
254662306a36Sopenharmony_ci
254762306a36Sopenharmony_cistatic bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
254862306a36Sopenharmony_ci		      enum rtw89_rf_path path, u8 gain)
254962306a36Sopenharmony_ci{
255062306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
255162306a36Sopenharmony_ci	u8 txagc = 0, kidx = dpk->cur_idx[path];
255262306a36Sopenharmony_ci	bool is_fail = false;
255362306a36Sopenharmony_ci
255462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
255562306a36Sopenharmony_ci		    "[DPK] ========= S%d[%d] DPK Start =========\n", path,
255662306a36Sopenharmony_ci		    kidx);
255762306a36Sopenharmony_ci
255862306a36Sopenharmony_ci	_rf_direct_cntrl(rtwdev, path, false);
255962306a36Sopenharmony_ci	txagc = _dpk_set_tx_pwr(rtwdev, gain, path);
256062306a36Sopenharmony_ci	_dpk_rf_setting(rtwdev, gain, path, kidx);
256162306a36Sopenharmony_ci	_dpk_rx_dck(rtwdev, phy, path);
256262306a36Sopenharmony_ci
256362306a36Sopenharmony_ci	_dpk_kip_setting(rtwdev, path, kidx);
256462306a36Sopenharmony_ci	_dpk_manual_txcfir(rtwdev, path, true);
256562306a36Sopenharmony_ci	txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false);
256662306a36Sopenharmony_ci	if (txagc == DPK_TXAGC_INVAL)
256762306a36Sopenharmony_ci		is_fail = true;
256862306a36Sopenharmony_ci	_dpk_get_thermal(rtwdev, kidx, path);
256962306a36Sopenharmony_ci
257062306a36Sopenharmony_ci	_dpk_idl_mpa(rtwdev, phy, path, kidx, gain);
257162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
257262306a36Sopenharmony_ci	_dpk_fill_result(rtwdev, path, kidx, gain, txagc);
257362306a36Sopenharmony_ci	_dpk_manual_txcfir(rtwdev, path, false);
257462306a36Sopenharmony_ci
257562306a36Sopenharmony_ci	if (!is_fail)
257662306a36Sopenharmony_ci		dpk->bp[path][kidx].path_ok = true;
257762306a36Sopenharmony_ci	else
257862306a36Sopenharmony_ci		dpk->bp[path][kidx].path_ok = false;
257962306a36Sopenharmony_ci
258062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx,
258162306a36Sopenharmony_ci		    is_fail ? "Check" : "Success");
258262306a36Sopenharmony_ci
258362306a36Sopenharmony_ci	return is_fail;
258462306a36Sopenharmony_ci}
258562306a36Sopenharmony_ci
258662306a36Sopenharmony_cistatic void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
258762306a36Sopenharmony_ci			    enum rtw89_phy_idx phy, u8 kpath)
258862306a36Sopenharmony_ci{
258962306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
259062306a36Sopenharmony_ci	u32 backup_bb_val[BACKUP_BB_REGS_NR];
259162306a36Sopenharmony_ci	u32 backup_rf_val[RTW8852A_DPK_RF_PATH][BACKUP_RF_REGS_NR];
259262306a36Sopenharmony_ci	u32 kip_bkup[RTW8852A_DPK_RF_PATH][RTW8852A_DPK_KIP_REG_NUM] = {{0}};
259362306a36Sopenharmony_ci	u32 kip_reg[] = {R_RXIQC, R_IQK_RES};
259462306a36Sopenharmony_ci	u8 path;
259562306a36Sopenharmony_ci	bool is_fail = true, reloaded[RTW8852A_DPK_RF_PATH] = {false};
259662306a36Sopenharmony_ci
259762306a36Sopenharmony_ci	if (dpk->is_dpk_reload_en) {
259862306a36Sopenharmony_ci		for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) {
259962306a36Sopenharmony_ci			if (!(kpath & BIT(path)))
260062306a36Sopenharmony_ci				continue;
260162306a36Sopenharmony_ci
260262306a36Sopenharmony_ci			reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
260362306a36Sopenharmony_ci			if (!reloaded[path] && dpk->bp[path][0].ch != 0)
260462306a36Sopenharmony_ci				dpk->cur_idx[path] = !dpk->cur_idx[path];
260562306a36Sopenharmony_ci			else
260662306a36Sopenharmony_ci				_dpk_onoff(rtwdev, path, false);
260762306a36Sopenharmony_ci		}
260862306a36Sopenharmony_ci	} else {
260962306a36Sopenharmony_ci		for (path = 0; path < RTW8852A_DPK_RF_PATH; path++)
261062306a36Sopenharmony_ci			dpk->cur_idx[path] = 0;
261162306a36Sopenharmony_ci	}
261262306a36Sopenharmony_ci
261362306a36Sopenharmony_ci	if ((kpath == RF_A && reloaded[RF_PATH_A]) ||
261462306a36Sopenharmony_ci	    (kpath == RF_B && reloaded[RF_PATH_B]) ||
261562306a36Sopenharmony_ci	    (kpath == RF_AB && reloaded[RF_PATH_A] && reloaded[RF_PATH_B]))
261662306a36Sopenharmony_ci		return;
261762306a36Sopenharmony_ci
261862306a36Sopenharmony_ci	_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
261962306a36Sopenharmony_ci
262062306a36Sopenharmony_ci	for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) {
262162306a36Sopenharmony_ci		if (!(kpath & BIT(path)) || reloaded[path])
262262306a36Sopenharmony_ci			continue;
262362306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path])
262462306a36Sopenharmony_ci			_dpk_tssi_pause(rtwdev, path, true);
262562306a36Sopenharmony_ci		_dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path);
262662306a36Sopenharmony_ci		_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
262762306a36Sopenharmony_ci		_dpk_information(rtwdev, phy, path);
262862306a36Sopenharmony_ci	}
262962306a36Sopenharmony_ci
263062306a36Sopenharmony_ci	_dpk_bb_afe_setting(rtwdev, phy, path, kpath);
263162306a36Sopenharmony_ci
263262306a36Sopenharmony_ci	for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) {
263362306a36Sopenharmony_ci		if (!(kpath & BIT(path)) || reloaded[path])
263462306a36Sopenharmony_ci			continue;
263562306a36Sopenharmony_ci
263662306a36Sopenharmony_ci		is_fail = _dpk_main(rtwdev, phy, path, 1);
263762306a36Sopenharmony_ci		_dpk_onoff(rtwdev, path, is_fail);
263862306a36Sopenharmony_ci	}
263962306a36Sopenharmony_ci
264062306a36Sopenharmony_ci	_dpk_bb_afe_restore(rtwdev, phy, path, kpath);
264162306a36Sopenharmony_ci	_rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
264262306a36Sopenharmony_ci
264362306a36Sopenharmony_ci	for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) {
264462306a36Sopenharmony_ci		if (!(kpath & BIT(path)) || reloaded[path])
264562306a36Sopenharmony_ci			continue;
264662306a36Sopenharmony_ci
264762306a36Sopenharmony_ci		_dpk_kip_restore(rtwdev, path);
264862306a36Sopenharmony_ci		_dpk_reload_kip(rtwdev, kip_reg, kip_bkup, path);
264962306a36Sopenharmony_ci		_rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path);
265062306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path])
265162306a36Sopenharmony_ci			_dpk_tssi_pause(rtwdev, path, false);
265262306a36Sopenharmony_ci	}
265362306a36Sopenharmony_ci}
265462306a36Sopenharmony_ci
265562306a36Sopenharmony_cistatic bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
265662306a36Sopenharmony_ci{
265762306a36Sopenharmony_ci	struct rtw89_fem_info *fem = &rtwdev->fem;
265862306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
265962306a36Sopenharmony_ci
266062306a36Sopenharmony_ci	if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
266162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
266262306a36Sopenharmony_ci			    "[DPK] Skip DPK due to 2G_ext_PA exist!!\n");
266362306a36Sopenharmony_ci		return true;
266462306a36Sopenharmony_ci	} else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) {
266562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
266662306a36Sopenharmony_ci			    "[DPK] Skip DPK due to 5G_ext_PA exist!!\n");
266762306a36Sopenharmony_ci		return true;
266862306a36Sopenharmony_ci	}
266962306a36Sopenharmony_ci
267062306a36Sopenharmony_ci	return false;
267162306a36Sopenharmony_ci}
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_cistatic void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
267462306a36Sopenharmony_ci{
267562306a36Sopenharmony_ci	u8 path, kpath;
267662306a36Sopenharmony_ci
267762306a36Sopenharmony_ci	kpath = _kpath(rtwdev, phy);
267862306a36Sopenharmony_ci
267962306a36Sopenharmony_ci	for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) {
268062306a36Sopenharmony_ci		if (kpath & BIT(path))
268162306a36Sopenharmony_ci			_dpk_onoff(rtwdev, path, true);
268262306a36Sopenharmony_ci	}
268362306a36Sopenharmony_ci}
268462306a36Sopenharmony_ci
268562306a36Sopenharmony_cistatic void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force)
268662306a36Sopenharmony_ci{
268762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
268862306a36Sopenharmony_ci		    "[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n",
268962306a36Sopenharmony_ci		    RTW8852A_DPK_VER, rtwdev->hal.cv,
269062306a36Sopenharmony_ci		    RTW8852A_RF_REL_VERSION);
269162306a36Sopenharmony_ci
269262306a36Sopenharmony_ci	if (_dpk_bypass_check(rtwdev, phy))
269362306a36Sopenharmony_ci		_dpk_force_bypass(rtwdev, phy);
269462306a36Sopenharmony_ci	else
269562306a36Sopenharmony_ci		_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy));
269662306a36Sopenharmony_ci}
269762306a36Sopenharmony_ci
269862306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev,
269962306a36Sopenharmony_ci		       enum rtw89_rf_path path, bool off)
270062306a36Sopenharmony_ci{
270162306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
270262306a36Sopenharmony_ci	u8 val, kidx = dpk->cur_idx[path];
270362306a36Sopenharmony_ci
270462306a36Sopenharmony_ci	val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok;
270562306a36Sopenharmony_ci
270662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
270762306a36Sopenharmony_ci			       MASKBYTE3, 0x6 | val);
270862306a36Sopenharmony_ci
270962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path,
271062306a36Sopenharmony_ci		    kidx, dpk->is_dpk_enable && !off ? "enable" : "disable");
271162306a36Sopenharmony_ci}
271262306a36Sopenharmony_ci
271362306a36Sopenharmony_cistatic void _dpk_track(struct rtw89_dev *rtwdev)
271462306a36Sopenharmony_ci{
271562306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
271662306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
271762306a36Sopenharmony_ci	u8 path, kidx;
271862306a36Sopenharmony_ci	u8 trk_idx = 0, txagc_rf = 0;
271962306a36Sopenharmony_ci	s8 txagc_bb = 0, txagc_bb_tp = 0, ini_diff = 0, txagc_ofst = 0;
272062306a36Sopenharmony_ci	u16 pwsf[2];
272162306a36Sopenharmony_ci	u8 cur_ther;
272262306a36Sopenharmony_ci	s8 delta_ther[2] = {0};
272362306a36Sopenharmony_ci
272462306a36Sopenharmony_ci	for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) {
272562306a36Sopenharmony_ci		kidx = dpk->cur_idx[path];
272662306a36Sopenharmony_ci
272762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
272862306a36Sopenharmony_ci			    "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n",
272962306a36Sopenharmony_ci			    path, kidx, dpk->bp[path][kidx].ch);
273062306a36Sopenharmony_ci
273162306a36Sopenharmony_ci		cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
273262306a36Sopenharmony_ci
273362306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
273462306a36Sopenharmony_ci			    "[DPK_TRK] thermal now = %d\n", cur_ther);
273562306a36Sopenharmony_ci
273662306a36Sopenharmony_ci		if (dpk->bp[path][kidx].ch != 0 && cur_ther != 0)
273762306a36Sopenharmony_ci			delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther;
273862306a36Sopenharmony_ci
273962306a36Sopenharmony_ci		if (dpk->bp[path][kidx].band == RTW89_BAND_2G)
274062306a36Sopenharmony_ci			delta_ther[path] = delta_ther[path] * 3 / 2;
274162306a36Sopenharmony_ci		else
274262306a36Sopenharmony_ci			delta_ther[path] = delta_ther[path] * 5 / 2;
274362306a36Sopenharmony_ci
274462306a36Sopenharmony_ci		txagc_rf = (u8)rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB  + (path << 13),
274562306a36Sopenharmony_ci						     RR_MODOPT_M_TXPWR);
274662306a36Sopenharmony_ci
274762306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path]) {
274862306a36Sopenharmony_ci			trk_idx = (u8)rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK);
274962306a36Sopenharmony_ci
275062306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
275162306a36Sopenharmony_ci				    "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n",
275262306a36Sopenharmony_ci				    txagc_rf, trk_idx);
275362306a36Sopenharmony_ci
275462306a36Sopenharmony_ci			txagc_bb =
275562306a36Sopenharmony_ci				(s8)rtw89_phy_read32_mask(rtwdev,
275662306a36Sopenharmony_ci							  R_TXAGC_BB + (path << 13),
275762306a36Sopenharmony_ci							  MASKBYTE2);
275862306a36Sopenharmony_ci			txagc_bb_tp =
275962306a36Sopenharmony_ci				(u8)rtw89_phy_read32_mask(rtwdev,
276062306a36Sopenharmony_ci							  R_TXAGC_TP + (path << 13),
276162306a36Sopenharmony_ci							  B_TXAGC_TP);
276262306a36Sopenharmony_ci
276362306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
276462306a36Sopenharmony_ci				    "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n",
276562306a36Sopenharmony_ci				    txagc_bb_tp, txagc_bb);
276662306a36Sopenharmony_ci
276762306a36Sopenharmony_ci			txagc_ofst =
276862306a36Sopenharmony_ci				(s8)rtw89_phy_read32_mask(rtwdev,
276962306a36Sopenharmony_ci							  R_TXAGC_BB + (path << 13),
277062306a36Sopenharmony_ci							  MASKBYTE3);
277162306a36Sopenharmony_ci
277262306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
277362306a36Sopenharmony_ci				    "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n",
277462306a36Sopenharmony_ci				    txagc_ofst, delta_ther[path]);
277562306a36Sopenharmony_ci
277662306a36Sopenharmony_ci			if (rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8),
277762306a36Sopenharmony_ci						  BIT(15)) == 0x1)
277862306a36Sopenharmony_ci				txagc_ofst = 0;
277962306a36Sopenharmony_ci
278062306a36Sopenharmony_ci			if (txagc_rf != 0 && cur_ther != 0)
278162306a36Sopenharmony_ci				ini_diff = txagc_ofst + delta_ther[path];
278262306a36Sopenharmony_ci
278362306a36Sopenharmony_ci			if (rtw89_phy_read32_mask(rtwdev, R_P0_TXDPD + (path << 13),
278462306a36Sopenharmony_ci						  B_P0_TXDPD) == 0x0) {
278562306a36Sopenharmony_ci				pwsf[0] = dpk->bp[path][kidx].pwsf + txagc_bb_tp -
278662306a36Sopenharmony_ci					  txagc_bb + ini_diff +
278762306a36Sopenharmony_ci					  tssi_info->extra_ofst[path];
278862306a36Sopenharmony_ci				pwsf[1] = dpk->bp[path][kidx].pwsf + txagc_bb_tp -
278962306a36Sopenharmony_ci					  txagc_bb + ini_diff +
279062306a36Sopenharmony_ci					  tssi_info->extra_ofst[path];
279162306a36Sopenharmony_ci			} else {
279262306a36Sopenharmony_ci				pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff +
279362306a36Sopenharmony_ci					  tssi_info->extra_ofst[path];
279462306a36Sopenharmony_ci				pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff +
279562306a36Sopenharmony_ci					  tssi_info->extra_ofst[path];
279662306a36Sopenharmony_ci			}
279762306a36Sopenharmony_ci
279862306a36Sopenharmony_ci		} else {
279962306a36Sopenharmony_ci			pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
280062306a36Sopenharmony_ci			pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
280162306a36Sopenharmony_ci		}
280262306a36Sopenharmony_ci
280362306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS) == 0x0 &&
280462306a36Sopenharmony_ci		    txagc_rf != 0) {
280562306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
280662306a36Sopenharmony_ci				    "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n",
280762306a36Sopenharmony_ci				    pwsf[0], pwsf[1]);
280862306a36Sopenharmony_ci
280962306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2),
281062306a36Sopenharmony_ci					       0x000001FF, pwsf[0]);
281162306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2),
281262306a36Sopenharmony_ci					       0x01FF0000, pwsf[1]);
281362306a36Sopenharmony_ci		}
281462306a36Sopenharmony_ci	}
281562306a36Sopenharmony_ci}
281662306a36Sopenharmony_ci
281762306a36Sopenharmony_cistatic void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
281862306a36Sopenharmony_ci			     enum rtw89_rf_path path)
281962306a36Sopenharmony_ci{
282062306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
282162306a36Sopenharmony_ci	enum rtw89_band band = chan->band_type;
282262306a36Sopenharmony_ci
282362306a36Sopenharmony_ci	if (band == RTW89_BAND_2G)
282462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1);
282562306a36Sopenharmony_ci	else
282662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1);
282762306a36Sopenharmony_ci}
282862306a36Sopenharmony_ci
282962306a36Sopenharmony_cistatic void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
283062306a36Sopenharmony_ci{
283162306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
283262306a36Sopenharmony_ci	enum rtw89_band band = chan->band_type;
283362306a36Sopenharmony_ci
283462306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_sys_defs_tbl);
283562306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
283662306a36Sopenharmony_ci				 &rtw8852a_tssi_sys_defs_2g_tbl,
283762306a36Sopenharmony_ci				 &rtw8852a_tssi_sys_defs_5g_tbl);
283862306a36Sopenharmony_ci}
283962306a36Sopenharmony_ci
284062306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
284162306a36Sopenharmony_ci				    enum rtw89_rf_path path)
284262306a36Sopenharmony_ci{
284362306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
284462306a36Sopenharmony_ci	enum rtw89_band band = chan->band_type;
284562306a36Sopenharmony_ci
284662306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
284762306a36Sopenharmony_ci				 &rtw8852a_tssi_txpwr_ctrl_bb_defs_a_tbl,
284862306a36Sopenharmony_ci				 &rtw8852a_tssi_txpwr_ctrl_bb_defs_b_tbl);
284962306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
285062306a36Sopenharmony_ci				 &rtw8852a_tssi_txpwr_ctrl_bb_defs_2g_tbl,
285162306a36Sopenharmony_ci				 &rtw8852a_tssi_txpwr_ctrl_bb_defs_5g_tbl);
285262306a36Sopenharmony_ci}
285362306a36Sopenharmony_ci
285462306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev,
285562306a36Sopenharmony_ci					  enum rtw89_phy_idx phy,
285662306a36Sopenharmony_ci					  enum rtw89_rf_path path)
285762306a36Sopenharmony_ci{
285862306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
285962306a36Sopenharmony_ci				 &rtw8852a_tssi_txpwr_ctrl_bb_he_tb_defs_a_tbl,
286062306a36Sopenharmony_ci				 &rtw8852a_tssi_txpwr_ctrl_bb_he_tb_defs_b_tbl);
286162306a36Sopenharmony_ci}
286262306a36Sopenharmony_ci
286362306a36Sopenharmony_cistatic void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
286462306a36Sopenharmony_ci			  enum rtw89_rf_path path)
286562306a36Sopenharmony_ci{
286662306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
286762306a36Sopenharmony_ci				 &rtw8852a_tssi_dck_defs_a_tbl,
286862306a36Sopenharmony_ci				 &rtw8852a_tssi_dck_defs_b_tbl);
286962306a36Sopenharmony_ci}
287062306a36Sopenharmony_ci
287162306a36Sopenharmony_cistatic void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
287262306a36Sopenharmony_ci				 enum rtw89_rf_path path)
287362306a36Sopenharmony_ci{
287462306a36Sopenharmony_ci#define __get_val(ptr, idx)				\
287562306a36Sopenharmony_ci({							\
287662306a36Sopenharmony_ci	s8 *__ptr = (ptr);				\
287762306a36Sopenharmony_ci	u8 __idx = (idx), __i, __v;			\
287862306a36Sopenharmony_ci	u32 __val = 0;					\
287962306a36Sopenharmony_ci	for (__i = 0; __i < 4; __i++) {			\
288062306a36Sopenharmony_ci		__v = (__ptr[__idx + __i]);		\
288162306a36Sopenharmony_ci		__val |= (__v << (8 * __i));		\
288262306a36Sopenharmony_ci	}						\
288362306a36Sopenharmony_ci	__val;						\
288462306a36Sopenharmony_ci})
288562306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
288662306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
288762306a36Sopenharmony_ci	u8 ch = chan->channel;
288862306a36Sopenharmony_ci	u8 subband = chan->subband_type;
288962306a36Sopenharmony_ci	const s8 *thm_up_a = NULL;
289062306a36Sopenharmony_ci	const s8 *thm_down_a = NULL;
289162306a36Sopenharmony_ci	const s8 *thm_up_b = NULL;
289262306a36Sopenharmony_ci	const s8 *thm_down_b = NULL;
289362306a36Sopenharmony_ci	u8 thermal = 0xff;
289462306a36Sopenharmony_ci	s8 thm_ofst[64] = {0};
289562306a36Sopenharmony_ci	u32 tmp = 0;
289662306a36Sopenharmony_ci	u8 i, j;
289762306a36Sopenharmony_ci
289862306a36Sopenharmony_ci	switch (subband) {
289962306a36Sopenharmony_ci	default:
290062306a36Sopenharmony_ci	case RTW89_CH_2G:
290162306a36Sopenharmony_ci		thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_2ga_p;
290262306a36Sopenharmony_ci		thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_2ga_n;
290362306a36Sopenharmony_ci		thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_2gb_p;
290462306a36Sopenharmony_ci		thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_2gb_n;
290562306a36Sopenharmony_ci		break;
290662306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_1:
290762306a36Sopenharmony_ci		thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_p[0];
290862306a36Sopenharmony_ci		thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_n[0];
290962306a36Sopenharmony_ci		thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_p[0];
291062306a36Sopenharmony_ci		thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_n[0];
291162306a36Sopenharmony_ci		break;
291262306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_3:
291362306a36Sopenharmony_ci		thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_p[1];
291462306a36Sopenharmony_ci		thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_n[1];
291562306a36Sopenharmony_ci		thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_p[1];
291662306a36Sopenharmony_ci		thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_n[1];
291762306a36Sopenharmony_ci		break;
291862306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_4:
291962306a36Sopenharmony_ci		thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_p[2];
292062306a36Sopenharmony_ci		thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_n[2];
292162306a36Sopenharmony_ci		thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_p[2];
292262306a36Sopenharmony_ci		thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_n[2];
292362306a36Sopenharmony_ci		break;
292462306a36Sopenharmony_ci	}
292562306a36Sopenharmony_ci
292662306a36Sopenharmony_ci	if (path == RF_PATH_A) {
292762306a36Sopenharmony_ci		thermal = tssi_info->thermal[RF_PATH_A];
292862306a36Sopenharmony_ci
292962306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
293062306a36Sopenharmony_ci			    "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal);
293162306a36Sopenharmony_ci
293262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0);
293362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1);
293462306a36Sopenharmony_ci
293562306a36Sopenharmony_ci		if (thermal == 0xff) {
293662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32);
293762306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32);
293862306a36Sopenharmony_ci
293962306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
294062306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0);
294162306a36Sopenharmony_ci
294262306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
294362306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
294462306a36Sopenharmony_ci					    0x5c00 + i, 0x0);
294562306a36Sopenharmony_ci			}
294662306a36Sopenharmony_ci
294762306a36Sopenharmony_ci		} else {
294862306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, thermal);
294962306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL,
295062306a36Sopenharmony_ci					       thermal);
295162306a36Sopenharmony_ci
295262306a36Sopenharmony_ci			i = 0;
295362306a36Sopenharmony_ci			for (j = 0; j < 32; j++)
295462306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
295562306a36Sopenharmony_ci					      -thm_down_a[i++] :
295662306a36Sopenharmony_ci					      -thm_down_a[DELTA_SWINGIDX_SIZE - 1];
295762306a36Sopenharmony_ci
295862306a36Sopenharmony_ci			i = 1;
295962306a36Sopenharmony_ci			for (j = 63; j >= 32; j--)
296062306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
296162306a36Sopenharmony_ci					      thm_up_a[i++] :
296262306a36Sopenharmony_ci					      thm_up_a[DELTA_SWINGIDX_SIZE - 1];
296362306a36Sopenharmony_ci
296462306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
296562306a36Sopenharmony_ci				tmp = __get_val(thm_ofst, i);
296662306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp);
296762306a36Sopenharmony_ci
296862306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
296962306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
297062306a36Sopenharmony_ci					    0x5c00 + i, tmp);
297162306a36Sopenharmony_ci			}
297262306a36Sopenharmony_ci		}
297362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1);
297462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0);
297562306a36Sopenharmony_ci
297662306a36Sopenharmony_ci	} else {
297762306a36Sopenharmony_ci		thermal = tssi_info->thermal[RF_PATH_B];
297862306a36Sopenharmony_ci
297962306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
298062306a36Sopenharmony_ci			    "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal);
298162306a36Sopenharmony_ci
298262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0);
298362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1);
298462306a36Sopenharmony_ci
298562306a36Sopenharmony_ci		if (thermal == 0xff) {
298662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32);
298762306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32);
298862306a36Sopenharmony_ci
298962306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
299062306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0);
299162306a36Sopenharmony_ci
299262306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
299362306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
299462306a36Sopenharmony_ci					    0x7c00 + i, 0x0);
299562306a36Sopenharmony_ci			}
299662306a36Sopenharmony_ci
299762306a36Sopenharmony_ci		} else {
299862306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, thermal);
299962306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL,
300062306a36Sopenharmony_ci					       thermal);
300162306a36Sopenharmony_ci
300262306a36Sopenharmony_ci			i = 0;
300362306a36Sopenharmony_ci			for (j = 0; j < 32; j++)
300462306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
300562306a36Sopenharmony_ci					      -thm_down_b[i++] :
300662306a36Sopenharmony_ci					      -thm_down_b[DELTA_SWINGIDX_SIZE - 1];
300762306a36Sopenharmony_ci
300862306a36Sopenharmony_ci			i = 1;
300962306a36Sopenharmony_ci			for (j = 63; j >= 32; j--)
301062306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
301162306a36Sopenharmony_ci					      thm_up_b[i++] :
301262306a36Sopenharmony_ci					      thm_up_b[DELTA_SWINGIDX_SIZE - 1];
301362306a36Sopenharmony_ci
301462306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
301562306a36Sopenharmony_ci				tmp = __get_val(thm_ofst, i);
301662306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp);
301762306a36Sopenharmony_ci
301862306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
301962306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
302062306a36Sopenharmony_ci					    0x7c00 + i, tmp);
302162306a36Sopenharmony_ci			}
302262306a36Sopenharmony_ci		}
302362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1);
302462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0);
302562306a36Sopenharmony_ci	}
302662306a36Sopenharmony_ci#undef __get_val
302762306a36Sopenharmony_ci}
302862306a36Sopenharmony_ci
302962306a36Sopenharmony_cistatic void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
303062306a36Sopenharmony_ci				   enum rtw89_rf_path path)
303162306a36Sopenharmony_ci{
303262306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
303362306a36Sopenharmony_ci				 &rtw8852a_tssi_dac_gain_tbl_defs_a_tbl,
303462306a36Sopenharmony_ci				 &rtw8852a_tssi_dac_gain_tbl_defs_b_tbl);
303562306a36Sopenharmony_ci}
303662306a36Sopenharmony_ci
303762306a36Sopenharmony_cistatic void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
303862306a36Sopenharmony_ci				enum rtw89_rf_path path)
303962306a36Sopenharmony_ci{
304062306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
304162306a36Sopenharmony_ci				 &rtw8852a_tssi_slope_cal_org_defs_a_tbl,
304262306a36Sopenharmony_ci				 &rtw8852a_tssi_slope_cal_org_defs_b_tbl);
304362306a36Sopenharmony_ci}
304462306a36Sopenharmony_ci
304562306a36Sopenharmony_cistatic void _tssi_set_rf_gap_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
304662306a36Sopenharmony_ci				 enum rtw89_rf_path path)
304762306a36Sopenharmony_ci{
304862306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
304962306a36Sopenharmony_ci				 &rtw8852a_tssi_rf_gap_tbl_defs_a_tbl,
305062306a36Sopenharmony_ci				 &rtw8852a_tssi_rf_gap_tbl_defs_b_tbl);
305162306a36Sopenharmony_ci}
305262306a36Sopenharmony_ci
305362306a36Sopenharmony_cistatic void _tssi_set_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
305462306a36Sopenharmony_ci			    enum rtw89_rf_path path)
305562306a36Sopenharmony_ci{
305662306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
305762306a36Sopenharmony_ci				 &rtw8852a_tssi_slope_defs_a_tbl,
305862306a36Sopenharmony_ci				 &rtw8852a_tssi_slope_defs_b_tbl);
305962306a36Sopenharmony_ci}
306062306a36Sopenharmony_ci
306162306a36Sopenharmony_cistatic void _tssi_set_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
306262306a36Sopenharmony_ci			    enum rtw89_rf_path path)
306362306a36Sopenharmony_ci{
306462306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
306562306a36Sopenharmony_ci				 &rtw8852a_tssi_track_defs_a_tbl,
306662306a36Sopenharmony_ci				 &rtw8852a_tssi_track_defs_b_tbl);
306762306a36Sopenharmony_ci}
306862306a36Sopenharmony_ci
306962306a36Sopenharmony_cistatic void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev,
307062306a36Sopenharmony_ci					  enum rtw89_phy_idx phy,
307162306a36Sopenharmony_ci					  enum rtw89_rf_path path)
307262306a36Sopenharmony_ci{
307362306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
307462306a36Sopenharmony_ci				 &rtw8852a_tssi_txagc_ofst_mv_avg_defs_a_tbl,
307562306a36Sopenharmony_ci				 &rtw8852a_tssi_txagc_ofst_mv_avg_defs_b_tbl);
307662306a36Sopenharmony_ci}
307762306a36Sopenharmony_ci
307862306a36Sopenharmony_cistatic void _tssi_pak(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
307962306a36Sopenharmony_ci		      enum rtw89_rf_path path)
308062306a36Sopenharmony_ci{
308162306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
308262306a36Sopenharmony_ci	u8 subband = chan->subband_type;
308362306a36Sopenharmony_ci
308462306a36Sopenharmony_ci	switch (subband) {
308562306a36Sopenharmony_ci	default:
308662306a36Sopenharmony_ci	case RTW89_CH_2G:
308762306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
308862306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_a_2g_tbl,
308962306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_b_2g_tbl);
309062306a36Sopenharmony_ci		break;
309162306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_1:
309262306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
309362306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_a_5g_1_tbl,
309462306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_b_5g_1_tbl);
309562306a36Sopenharmony_ci		break;
309662306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_3:
309762306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
309862306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_a_5g_3_tbl,
309962306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_b_5g_3_tbl);
310062306a36Sopenharmony_ci		break;
310162306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_4:
310262306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
310362306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_a_5g_4_tbl,
310462306a36Sopenharmony_ci					 &rtw8852a_tssi_pak_defs_b_5g_4_tbl);
310562306a36Sopenharmony_ci		break;
310662306a36Sopenharmony_ci	}
310762306a36Sopenharmony_ci}
310862306a36Sopenharmony_ci
310962306a36Sopenharmony_cistatic void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
311062306a36Sopenharmony_ci{
311162306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
311262306a36Sopenharmony_ci	u8 i;
311362306a36Sopenharmony_ci
311462306a36Sopenharmony_ci	for (i = 0; i < RF_PATH_NUM_8852A; i++) {
311562306a36Sopenharmony_ci		_tssi_set_track(rtwdev, phy, i);
311662306a36Sopenharmony_ci		_tssi_set_txagc_offset_mv_avg(rtwdev, phy, i);
311762306a36Sopenharmony_ci
311862306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, i == RF_PATH_A,
311962306a36Sopenharmony_ci					 &rtw8852a_tssi_enable_defs_a_tbl,
312062306a36Sopenharmony_ci					 &rtw8852a_tssi_enable_defs_b_tbl);
312162306a36Sopenharmony_ci
312262306a36Sopenharmony_ci		tssi_info->base_thermal[i] =
312362306a36Sopenharmony_ci			ewma_thermal_read(&rtwdev->phystat.avg_thermal[i]);
312462306a36Sopenharmony_ci		rtwdev->is_tssi_mode[i] = true;
312562306a36Sopenharmony_ci	}
312662306a36Sopenharmony_ci}
312762306a36Sopenharmony_ci
312862306a36Sopenharmony_cistatic void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
312962306a36Sopenharmony_ci{
313062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_disable_defs_tbl);
313162306a36Sopenharmony_ci
313262306a36Sopenharmony_ci	rtwdev->is_tssi_mode[RF_PATH_A] = false;
313362306a36Sopenharmony_ci	rtwdev->is_tssi_mode[RF_PATH_B] = false;
313462306a36Sopenharmony_ci}
313562306a36Sopenharmony_ci
313662306a36Sopenharmony_cistatic u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch)
313762306a36Sopenharmony_ci{
313862306a36Sopenharmony_ci	switch (ch) {
313962306a36Sopenharmony_ci	case 1 ... 2:
314062306a36Sopenharmony_ci		return 0;
314162306a36Sopenharmony_ci	case 3 ... 5:
314262306a36Sopenharmony_ci		return 1;
314362306a36Sopenharmony_ci	case 6 ... 8:
314462306a36Sopenharmony_ci		return 2;
314562306a36Sopenharmony_ci	case 9 ... 11:
314662306a36Sopenharmony_ci		return 3;
314762306a36Sopenharmony_ci	case 12 ... 13:
314862306a36Sopenharmony_ci		return 4;
314962306a36Sopenharmony_ci	case 14:
315062306a36Sopenharmony_ci		return 5;
315162306a36Sopenharmony_ci	}
315262306a36Sopenharmony_ci
315362306a36Sopenharmony_ci	return 0;
315462306a36Sopenharmony_ci}
315562306a36Sopenharmony_ci
315662306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP_BIT (BIT(31))
315762306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx))
315862306a36Sopenharmony_ci#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT)
315962306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT)
316062306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1)
316162306a36Sopenharmony_ci
316262306a36Sopenharmony_cistatic u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch)
316362306a36Sopenharmony_ci{
316462306a36Sopenharmony_ci	switch (ch) {
316562306a36Sopenharmony_ci	case 1 ... 2:
316662306a36Sopenharmony_ci		return 0;
316762306a36Sopenharmony_ci	case 3 ... 5:
316862306a36Sopenharmony_ci		return 1;
316962306a36Sopenharmony_ci	case 6 ... 8:
317062306a36Sopenharmony_ci		return 2;
317162306a36Sopenharmony_ci	case 9 ... 11:
317262306a36Sopenharmony_ci		return 3;
317362306a36Sopenharmony_ci	case 12 ... 14:
317462306a36Sopenharmony_ci		return 4;
317562306a36Sopenharmony_ci	case 36 ... 40:
317662306a36Sopenharmony_ci		return 5;
317762306a36Sopenharmony_ci	case 41 ... 43:
317862306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(5);
317962306a36Sopenharmony_ci	case 44 ... 48:
318062306a36Sopenharmony_ci		return 6;
318162306a36Sopenharmony_ci	case 49 ... 51:
318262306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(6);
318362306a36Sopenharmony_ci	case 52 ... 56:
318462306a36Sopenharmony_ci		return 7;
318562306a36Sopenharmony_ci	case 57 ... 59:
318662306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(7);
318762306a36Sopenharmony_ci	case 60 ... 64:
318862306a36Sopenharmony_ci		return 8;
318962306a36Sopenharmony_ci	case 100 ... 104:
319062306a36Sopenharmony_ci		return 9;
319162306a36Sopenharmony_ci	case 105 ... 107:
319262306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(9);
319362306a36Sopenharmony_ci	case 108 ... 112:
319462306a36Sopenharmony_ci		return 10;
319562306a36Sopenharmony_ci	case 113 ... 115:
319662306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(10);
319762306a36Sopenharmony_ci	case 116 ... 120:
319862306a36Sopenharmony_ci		return 11;
319962306a36Sopenharmony_ci	case 121 ... 123:
320062306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(11);
320162306a36Sopenharmony_ci	case 124 ... 128:
320262306a36Sopenharmony_ci		return 12;
320362306a36Sopenharmony_ci	case 129 ... 131:
320462306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(12);
320562306a36Sopenharmony_ci	case 132 ... 136:
320662306a36Sopenharmony_ci		return 13;
320762306a36Sopenharmony_ci	case 137 ... 139:
320862306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(13);
320962306a36Sopenharmony_ci	case 140 ... 144:
321062306a36Sopenharmony_ci		return 14;
321162306a36Sopenharmony_ci	case 149 ... 153:
321262306a36Sopenharmony_ci		return 15;
321362306a36Sopenharmony_ci	case 154 ... 156:
321462306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(15);
321562306a36Sopenharmony_ci	case 157 ... 161:
321662306a36Sopenharmony_ci		return 16;
321762306a36Sopenharmony_ci	case 162 ... 164:
321862306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(16);
321962306a36Sopenharmony_ci	case 165 ... 169:
322062306a36Sopenharmony_ci		return 17;
322162306a36Sopenharmony_ci	case 170 ... 172:
322262306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(17);
322362306a36Sopenharmony_ci	case 173 ... 177:
322462306a36Sopenharmony_ci		return 18;
322562306a36Sopenharmony_ci	}
322662306a36Sopenharmony_ci
322762306a36Sopenharmony_ci	return 0;
322862306a36Sopenharmony_ci}
322962306a36Sopenharmony_ci
323062306a36Sopenharmony_cistatic u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
323162306a36Sopenharmony_ci{
323262306a36Sopenharmony_ci	switch (ch) {
323362306a36Sopenharmony_ci	case 1 ... 8:
323462306a36Sopenharmony_ci		return 0;
323562306a36Sopenharmony_ci	case 9 ... 14:
323662306a36Sopenharmony_ci		return 1;
323762306a36Sopenharmony_ci	case 36 ... 48:
323862306a36Sopenharmony_ci		return 2;
323962306a36Sopenharmony_ci	case 52 ... 64:
324062306a36Sopenharmony_ci		return 3;
324162306a36Sopenharmony_ci	case 100 ... 112:
324262306a36Sopenharmony_ci		return 4;
324362306a36Sopenharmony_ci	case 116 ... 128:
324462306a36Sopenharmony_ci		return 5;
324562306a36Sopenharmony_ci	case 132 ... 144:
324662306a36Sopenharmony_ci		return 6;
324762306a36Sopenharmony_ci	case 149 ... 177:
324862306a36Sopenharmony_ci		return 7;
324962306a36Sopenharmony_ci	}
325062306a36Sopenharmony_ci
325162306a36Sopenharmony_ci	return 0;
325262306a36Sopenharmony_ci}
325362306a36Sopenharmony_ci
325462306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
325562306a36Sopenharmony_ci			    enum rtw89_rf_path path)
325662306a36Sopenharmony_ci{
325762306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
325862306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
325962306a36Sopenharmony_ci	u8 ch = chan->channel;
326062306a36Sopenharmony_ci	u32 gidx, gidx_1st, gidx_2nd;
326162306a36Sopenharmony_ci	s8 de_1st = 0;
326262306a36Sopenharmony_ci	s8 de_2nd = 0;
326362306a36Sopenharmony_ci	s8 val;
326462306a36Sopenharmony_ci
326562306a36Sopenharmony_ci	gidx = _tssi_get_ofdm_group(rtwdev, ch);
326662306a36Sopenharmony_ci
326762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
326862306a36Sopenharmony_ci		    "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n",
326962306a36Sopenharmony_ci		    path, gidx);
327062306a36Sopenharmony_ci
327162306a36Sopenharmony_ci	if (IS_TSSI_EXTRA_GROUP(gidx)) {
327262306a36Sopenharmony_ci		gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx);
327362306a36Sopenharmony_ci		gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx);
327462306a36Sopenharmony_ci		de_1st = tssi_info->tssi_mcs[path][gidx_1st];
327562306a36Sopenharmony_ci		de_2nd = tssi_info->tssi_mcs[path][gidx_2nd];
327662306a36Sopenharmony_ci		val = (de_1st + de_2nd) / 2;
327762306a36Sopenharmony_ci
327862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
327962306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n",
328062306a36Sopenharmony_ci			    path, val, de_1st, de_2nd);
328162306a36Sopenharmony_ci	} else {
328262306a36Sopenharmony_ci		val = tssi_info->tssi_mcs[path][gidx];
328362306a36Sopenharmony_ci
328462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
328562306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val);
328662306a36Sopenharmony_ci	}
328762306a36Sopenharmony_ci
328862306a36Sopenharmony_ci	return val;
328962306a36Sopenharmony_ci}
329062306a36Sopenharmony_ci
329162306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev,
329262306a36Sopenharmony_ci				 enum rtw89_phy_idx phy,
329362306a36Sopenharmony_ci				 enum rtw89_rf_path path)
329462306a36Sopenharmony_ci{
329562306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
329662306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
329762306a36Sopenharmony_ci	u8 ch = chan->channel;
329862306a36Sopenharmony_ci	u32 tgidx, tgidx_1st, tgidx_2nd;
329962306a36Sopenharmony_ci	s8 tde_1st = 0;
330062306a36Sopenharmony_ci	s8 tde_2nd = 0;
330162306a36Sopenharmony_ci	s8 val;
330262306a36Sopenharmony_ci
330362306a36Sopenharmony_ci	tgidx = _tssi_get_trim_group(rtwdev, ch);
330462306a36Sopenharmony_ci
330562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
330662306a36Sopenharmony_ci		    "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n",
330762306a36Sopenharmony_ci		    path, tgidx);
330862306a36Sopenharmony_ci
330962306a36Sopenharmony_ci	if (IS_TSSI_EXTRA_GROUP(tgidx)) {
331062306a36Sopenharmony_ci		tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx);
331162306a36Sopenharmony_ci		tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx);
331262306a36Sopenharmony_ci		tde_1st = tssi_info->tssi_trim[path][tgidx_1st];
331362306a36Sopenharmony_ci		tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd];
331462306a36Sopenharmony_ci		val = (tde_1st + tde_2nd) / 2;
331562306a36Sopenharmony_ci
331662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
331762306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n",
331862306a36Sopenharmony_ci			    path, val, tde_1st, tde_2nd);
331962306a36Sopenharmony_ci	} else {
332062306a36Sopenharmony_ci		val = tssi_info->tssi_trim[path][tgidx];
332162306a36Sopenharmony_ci
332262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
332362306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs trim_de=%d\n",
332462306a36Sopenharmony_ci			    path, val);
332562306a36Sopenharmony_ci	}
332662306a36Sopenharmony_ci
332762306a36Sopenharmony_ci	return val;
332862306a36Sopenharmony_ci}
332962306a36Sopenharmony_ci
333062306a36Sopenharmony_cistatic void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev,
333162306a36Sopenharmony_ci				  enum rtw89_phy_idx phy)
333262306a36Sopenharmony_ci{
333362306a36Sopenharmony_ci#define __DE_MASK 0x003ff000
333462306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
333562306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
333662306a36Sopenharmony_ci	static const u32 r_cck_long[RF_PATH_NUM_8852A] = {0x5858, 0x7858};
333762306a36Sopenharmony_ci	static const u32 r_cck_short[RF_PATH_NUM_8852A] = {0x5860, 0x7860};
333862306a36Sopenharmony_ci	static const u32 r_mcs_20m[RF_PATH_NUM_8852A] = {0x5838, 0x7838};
333962306a36Sopenharmony_ci	static const u32 r_mcs_40m[RF_PATH_NUM_8852A] = {0x5840, 0x7840};
334062306a36Sopenharmony_ci	static const u32 r_mcs_80m[RF_PATH_NUM_8852A] = {0x5848, 0x7848};
334162306a36Sopenharmony_ci	static const u32 r_mcs_80m_80m[RF_PATH_NUM_8852A] = {0x5850, 0x7850};
334262306a36Sopenharmony_ci	static const u32 r_mcs_5m[RF_PATH_NUM_8852A] = {0x5828, 0x7828};
334362306a36Sopenharmony_ci	static const u32 r_mcs_10m[RF_PATH_NUM_8852A] = {0x5830, 0x7830};
334462306a36Sopenharmony_ci	u8 ch = chan->channel;
334562306a36Sopenharmony_ci	u8 i, gidx;
334662306a36Sopenharmony_ci	s8 ofdm_de;
334762306a36Sopenharmony_ci	s8 trim_de;
334862306a36Sopenharmony_ci	s32 val;
334962306a36Sopenharmony_ci
335062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n",
335162306a36Sopenharmony_ci		    phy, ch);
335262306a36Sopenharmony_ci
335362306a36Sopenharmony_ci	for (i = 0; i < RF_PATH_NUM_8852A; i++) {
335462306a36Sopenharmony_ci		gidx = _tssi_get_cck_group(rtwdev, ch);
335562306a36Sopenharmony_ci		trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
335662306a36Sopenharmony_ci		val = tssi_info->tssi_cck[i][gidx] + trim_de;
335762306a36Sopenharmony_ci
335862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
335962306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n",
336062306a36Sopenharmony_ci			    i, gidx, tssi_info->tssi_cck[i][gidx], trim_de);
336162306a36Sopenharmony_ci
336262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_cck_long[i], __DE_MASK, val);
336362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_cck_short[i], __DE_MASK, val);
336462306a36Sopenharmony_ci
336562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
336662306a36Sopenharmony_ci			    "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n",
336762306a36Sopenharmony_ci			    r_cck_long[i],
336862306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, r_cck_long[i],
336962306a36Sopenharmony_ci						  __DE_MASK));
337062306a36Sopenharmony_ci
337162306a36Sopenharmony_ci		ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
337262306a36Sopenharmony_ci		trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
337362306a36Sopenharmony_ci		val = ofdm_de + trim_de;
337462306a36Sopenharmony_ci
337562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
337662306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n",
337762306a36Sopenharmony_ci			    i, ofdm_de, trim_de);
337862306a36Sopenharmony_ci
337962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_mcs_20m[i], __DE_MASK, val);
338062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_mcs_40m[i], __DE_MASK, val);
338162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_mcs_80m[i], __DE_MASK, val);
338262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_mcs_80m_80m[i], __DE_MASK, val);
338362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_mcs_5m[i], __DE_MASK, val);
338462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, r_mcs_10m[i], __DE_MASK, val);
338562306a36Sopenharmony_ci
338662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
338762306a36Sopenharmony_ci			    "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n",
338862306a36Sopenharmony_ci			    r_mcs_20m[i],
338962306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, r_mcs_20m[i],
339062306a36Sopenharmony_ci						  __DE_MASK));
339162306a36Sopenharmony_ci	}
339262306a36Sopenharmony_ci#undef __DE_MASK
339362306a36Sopenharmony_ci}
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_cistatic void _tssi_track(struct rtw89_dev *rtwdev)
339662306a36Sopenharmony_ci{
339762306a36Sopenharmony_ci	static const u32 tx_gain_scale_table[] = {
339862306a36Sopenharmony_ci		0x400, 0x40e, 0x41d, 0x427, 0x43c, 0x44c, 0x45c, 0x46c,
339962306a36Sopenharmony_ci		0x400, 0x39d, 0x3ab, 0x3b8, 0x3c6, 0x3d4, 0x3e2, 0x3f1
340062306a36Sopenharmony_ci	};
340162306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
340262306a36Sopenharmony_ci	u8 path;
340362306a36Sopenharmony_ci	u8 cur_ther;
340462306a36Sopenharmony_ci	s32 delta_ther = 0, gain_offset_int, gain_offset_float;
340562306a36Sopenharmony_ci	s8 gain_offset;
340662306a36Sopenharmony_ci
340762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRK] %s:\n",
340862306a36Sopenharmony_ci		    __func__);
340962306a36Sopenharmony_ci
341062306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_A])
341162306a36Sopenharmony_ci		return;
341262306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_B])
341362306a36Sopenharmony_ci		return;
341462306a36Sopenharmony_ci
341562306a36Sopenharmony_ci	for (path = RF_PATH_A; path < RF_PATH_NUM_8852A; path++) {
341662306a36Sopenharmony_ci		if (!tssi_info->tssi_tracking_check[path]) {
341762306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRK] return!!!\n");
341862306a36Sopenharmony_ci			continue;
341962306a36Sopenharmony_ci		}
342062306a36Sopenharmony_ci
342162306a36Sopenharmony_ci		cur_ther = (u8)rtw89_phy_read32_mask(rtwdev,
342262306a36Sopenharmony_ci						  R_TSSI_THER + (path << 13),
342362306a36Sopenharmony_ci						  B_TSSI_THER);
342462306a36Sopenharmony_ci
342562306a36Sopenharmony_ci		if (cur_ther == 0 || tssi_info->base_thermal[path] == 0)
342662306a36Sopenharmony_ci			continue;
342762306a36Sopenharmony_ci
342862306a36Sopenharmony_ci		delta_ther = cur_ther - tssi_info->base_thermal[path];
342962306a36Sopenharmony_ci
343062306a36Sopenharmony_ci		gain_offset = (s8)delta_ther * 15 / 10;
343162306a36Sopenharmony_ci
343262306a36Sopenharmony_ci		tssi_info->extra_ofst[path] = gain_offset;
343362306a36Sopenharmony_ci
343462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
343562306a36Sopenharmony_ci			    "[TSSI][TRK] base_thermal=%d gain_offset=0x%x path=%d\n",
343662306a36Sopenharmony_ci			    tssi_info->base_thermal[path], gain_offset, path);
343762306a36Sopenharmony_ci
343862306a36Sopenharmony_ci		gain_offset_int = gain_offset >> 3;
343962306a36Sopenharmony_ci		gain_offset_float = gain_offset & 7;
344062306a36Sopenharmony_ci
344162306a36Sopenharmony_ci		if (gain_offset_int > 15)
344262306a36Sopenharmony_ci			gain_offset_int = 15;
344362306a36Sopenharmony_ci		else if (gain_offset_int < -16)
344462306a36Sopenharmony_ci			gain_offset_int = -16;
344562306a36Sopenharmony_ci
344662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPD_OFT_EN + (path << 13),
344762306a36Sopenharmony_ci				       B_DPD_OFT_EN, 0x1);
344862306a36Sopenharmony_ci
344962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_TXGAIN_SCALE + (path << 13),
345062306a36Sopenharmony_ci				       B_TXGAIN_SCALE_EN, 0x1);
345162306a36Sopenharmony_ci
345262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPD_OFT_ADDR + (path << 13),
345362306a36Sopenharmony_ci				       B_DPD_OFT_ADDR, gain_offset_int);
345462306a36Sopenharmony_ci
345562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_TXGAIN_SCALE + (path << 13),
345662306a36Sopenharmony_ci				       B_TXGAIN_SCALE_OFT,
345762306a36Sopenharmony_ci				       tx_gain_scale_table[gain_offset_float]);
345862306a36Sopenharmony_ci	}
345962306a36Sopenharmony_ci}
346062306a36Sopenharmony_ci
346162306a36Sopenharmony_cistatic void _tssi_high_power(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
346262306a36Sopenharmony_ci{
346362306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
346462306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
346562306a36Sopenharmony_ci	u8 ch = chan->channel, ch_tmp;
346662306a36Sopenharmony_ci	u8 bw = chan->band_width;
346762306a36Sopenharmony_ci	u8 band = chan->band_type;
346862306a36Sopenharmony_ci	u8 subband = chan->subband_type;
346962306a36Sopenharmony_ci	s8 power;
347062306a36Sopenharmony_ci	s32 xdbm;
347162306a36Sopenharmony_ci
347262306a36Sopenharmony_ci	if (bw == RTW89_CHANNEL_WIDTH_40)
347362306a36Sopenharmony_ci		ch_tmp = ch - 2;
347462306a36Sopenharmony_ci	else if (bw == RTW89_CHANNEL_WIDTH_80)
347562306a36Sopenharmony_ci		ch_tmp = ch - 6;
347662306a36Sopenharmony_ci	else
347762306a36Sopenharmony_ci		ch_tmp = ch;
347862306a36Sopenharmony_ci
347962306a36Sopenharmony_ci	power = rtw89_phy_read_txpwr_limit(rtwdev, band, bw, RTW89_1TX,
348062306a36Sopenharmony_ci					   RTW89_RS_MCS, RTW89_NONBF, ch_tmp);
348162306a36Sopenharmony_ci
348262306a36Sopenharmony_ci	xdbm = power * 100 / 4;
348362306a36Sopenharmony_ci
348462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d xdbm=%d\n",
348562306a36Sopenharmony_ci		    __func__, phy, xdbm);
348662306a36Sopenharmony_ci
348762306a36Sopenharmony_ci	if (xdbm > 1800 && subband == RTW89_CH_2G) {
348862306a36Sopenharmony_ci		tssi_info->tssi_tracking_check[RF_PATH_A] = true;
348962306a36Sopenharmony_ci		tssi_info->tssi_tracking_check[RF_PATH_B] = true;
349062306a36Sopenharmony_ci	} else {
349162306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_tracking_defs_tbl);
349262306a36Sopenharmony_ci		tssi_info->extra_ofst[RF_PATH_A] = 0;
349362306a36Sopenharmony_ci		tssi_info->extra_ofst[RF_PATH_B] = 0;
349462306a36Sopenharmony_ci		tssi_info->tssi_tracking_check[RF_PATH_A] = false;
349562306a36Sopenharmony_ci		tssi_info->tssi_tracking_check[RF_PATH_B] = false;
349662306a36Sopenharmony_ci	}
349762306a36Sopenharmony_ci}
349862306a36Sopenharmony_ci
349962306a36Sopenharmony_cistatic void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
350062306a36Sopenharmony_ci			u8 path, s16 pwr_dbm, u8 enable)
350162306a36Sopenharmony_ci{
350262306a36Sopenharmony_ci	rtw8852a_bb_set_plcp_tx(rtwdev);
350362306a36Sopenharmony_ci	rtw8852a_bb_cfg_tx_path(rtwdev, path);
350462306a36Sopenharmony_ci	rtw8852a_bb_set_power(rtwdev, pwr_dbm, phy);
350562306a36Sopenharmony_ci	rtw8852a_bb_set_pmac_pkt_tx(rtwdev, enable, 20, 5000, 0, phy);
350662306a36Sopenharmony_ci}
350762306a36Sopenharmony_ci
350862306a36Sopenharmony_cistatic void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
350962306a36Sopenharmony_ci{
351062306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
351162306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
351262306a36Sopenharmony_ci	const struct rtw89_chip_info *mac_reg = rtwdev->chip;
351362306a36Sopenharmony_ci	u8 ch = chan->channel, ch_tmp;
351462306a36Sopenharmony_ci	u8 bw = chan->band_width;
351562306a36Sopenharmony_ci	u8 band = chan->band_type;
351662306a36Sopenharmony_ci	u32 tx_en;
351762306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0);
351862306a36Sopenharmony_ci	s8 power;
351962306a36Sopenharmony_ci	s16 xdbm;
352062306a36Sopenharmony_ci	u32 i, tx_counter = 0;
352162306a36Sopenharmony_ci
352262306a36Sopenharmony_ci	if (bw == RTW89_CHANNEL_WIDTH_40)
352362306a36Sopenharmony_ci		ch_tmp = ch - 2;
352462306a36Sopenharmony_ci	else if (bw == RTW89_CHANNEL_WIDTH_80)
352562306a36Sopenharmony_ci		ch_tmp = ch - 6;
352662306a36Sopenharmony_ci	else
352762306a36Sopenharmony_ci		ch_tmp = ch;
352862306a36Sopenharmony_ci
352962306a36Sopenharmony_ci	power = rtw89_phy_read_txpwr_limit(rtwdev, band, RTW89_CHANNEL_WIDTH_20,
353062306a36Sopenharmony_ci					   RTW89_1TX, RTW89_RS_OFDM,
353162306a36Sopenharmony_ci					   RTW89_NONBF, ch_tmp);
353262306a36Sopenharmony_ci
353362306a36Sopenharmony_ci	xdbm = (power * 100) >> mac_reg->txpwr_factor_mac;
353462306a36Sopenharmony_ci
353562306a36Sopenharmony_ci	if (xdbm > 1800)
353662306a36Sopenharmony_ci		xdbm = 68;
353762306a36Sopenharmony_ci	else
353862306a36Sopenharmony_ci		xdbm = power * 2;
353962306a36Sopenharmony_ci
354062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
354162306a36Sopenharmony_ci		    "[TSSI] %s: phy=%d org_power=%d xdbm=%d\n",
354262306a36Sopenharmony_ci		    __func__, phy, power, xdbm);
354362306a36Sopenharmony_ci
354462306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
354562306a36Sopenharmony_ci	rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
354662306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy));
354762306a36Sopenharmony_ci	tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
354862306a36Sopenharmony_ci
354962306a36Sopenharmony_ci	_tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, true);
355062306a36Sopenharmony_ci	mdelay(15);
355162306a36Sopenharmony_ci	_tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, false);
355262306a36Sopenharmony_ci
355362306a36Sopenharmony_ci	tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD) -
355462306a36Sopenharmony_ci		    tx_counter;
355562306a36Sopenharmony_ci
355662306a36Sopenharmony_ci	if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, MASKHWORD) != 0xc000 &&
355762306a36Sopenharmony_ci	    rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, MASKHWORD) != 0x0) {
355862306a36Sopenharmony_ci		for (i = 0; i < 6; i++) {
355962306a36Sopenharmony_ci			tssi_info->default_txagc_offset[RF_PATH_A] =
356062306a36Sopenharmony_ci				rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB,
356162306a36Sopenharmony_ci						      MASKBYTE3);
356262306a36Sopenharmony_ci
356362306a36Sopenharmony_ci			if (tssi_info->default_txagc_offset[RF_PATH_A] != 0x0)
356462306a36Sopenharmony_ci				break;
356562306a36Sopenharmony_ci		}
356662306a36Sopenharmony_ci	}
356762306a36Sopenharmony_ci
356862306a36Sopenharmony_ci	if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, MASKHWORD) != 0xc000 &&
356962306a36Sopenharmony_ci	    rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, MASKHWORD) != 0x0) {
357062306a36Sopenharmony_ci		for (i = 0; i < 6; i++) {
357162306a36Sopenharmony_ci			tssi_info->default_txagc_offset[RF_PATH_B] =
357262306a36Sopenharmony_ci				rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1,
357362306a36Sopenharmony_ci						      MASKBYTE3);
357462306a36Sopenharmony_ci
357562306a36Sopenharmony_ci			if (tssi_info->default_txagc_offset[RF_PATH_B] != 0x0)
357662306a36Sopenharmony_ci				break;
357762306a36Sopenharmony_ci		}
357862306a36Sopenharmony_ci	}
357962306a36Sopenharmony_ci
358062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
358162306a36Sopenharmony_ci		    "[TSSI] %s: tx counter=%d\n",
358262306a36Sopenharmony_ci		    __func__, tx_counter);
358362306a36Sopenharmony_ci
358462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
358562306a36Sopenharmony_ci		    "[TSSI] Backup R_TXAGC_BB=0x%x R_TXAGC_BB_S1=0x%x\n",
358662306a36Sopenharmony_ci		    tssi_info->default_txagc_offset[RF_PATH_A],
358762306a36Sopenharmony_ci		    tssi_info->default_txagc_offset[RF_PATH_B]);
358862306a36Sopenharmony_ci
358962306a36Sopenharmony_ci	rtw8852a_bb_tx_mode_switch(rtwdev, phy, 0);
359062306a36Sopenharmony_ci
359162306a36Sopenharmony_ci	rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en);
359262306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
359362306a36Sopenharmony_ci}
359462306a36Sopenharmony_ci
359562306a36Sopenharmony_civoid rtw8852a_rck(struct rtw89_dev *rtwdev)
359662306a36Sopenharmony_ci{
359762306a36Sopenharmony_ci	u8 path;
359862306a36Sopenharmony_ci
359962306a36Sopenharmony_ci	for (path = 0; path < 2; path++)
360062306a36Sopenharmony_ci		_rck(rtwdev, path);
360162306a36Sopenharmony_ci}
360262306a36Sopenharmony_ci
360362306a36Sopenharmony_civoid rtw8852a_dack(struct rtw89_dev *rtwdev)
360462306a36Sopenharmony_ci{
360562306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
360662306a36Sopenharmony_ci
360762306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
360862306a36Sopenharmony_ci	_dac_cal(rtwdev, false);
360962306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
361062306a36Sopenharmony_ci}
361162306a36Sopenharmony_ci
361262306a36Sopenharmony_civoid rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
361362306a36Sopenharmony_ci{
361462306a36Sopenharmony_ci	u32 tx_en;
361562306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
361662306a36Sopenharmony_ci
361762306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
361862306a36Sopenharmony_ci	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
361962306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
362062306a36Sopenharmony_ci
362162306a36Sopenharmony_ci	_iqk_init(rtwdev);
362262306a36Sopenharmony_ci	if (rtwdev->dbcc_en)
362362306a36Sopenharmony_ci		_iqk_dbcc(rtwdev, phy_idx);
362462306a36Sopenharmony_ci	else
362562306a36Sopenharmony_ci		_iqk(rtwdev, phy_idx, false);
362662306a36Sopenharmony_ci
362762306a36Sopenharmony_ci	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
362862306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
362962306a36Sopenharmony_ci}
363062306a36Sopenharmony_ci
363162306a36Sopenharmony_civoid rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
363262306a36Sopenharmony_ci		     bool is_afe)
363362306a36Sopenharmony_ci{
363462306a36Sopenharmony_ci	u32 tx_en;
363562306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
363662306a36Sopenharmony_ci
363762306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
363862306a36Sopenharmony_ci	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
363962306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
364062306a36Sopenharmony_ci
364162306a36Sopenharmony_ci	_rx_dck(rtwdev, phy_idx, is_afe);
364262306a36Sopenharmony_ci
364362306a36Sopenharmony_ci	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
364462306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
364562306a36Sopenharmony_ci}
364662306a36Sopenharmony_ci
364762306a36Sopenharmony_civoid rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
364862306a36Sopenharmony_ci{
364962306a36Sopenharmony_ci	u32 tx_en;
365062306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
365162306a36Sopenharmony_ci
365262306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
365362306a36Sopenharmony_ci	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
365462306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
365562306a36Sopenharmony_ci
365662306a36Sopenharmony_ci	rtwdev->dpk.is_dpk_enable = true;
365762306a36Sopenharmony_ci	rtwdev->dpk.is_dpk_reload_en = false;
365862306a36Sopenharmony_ci	_dpk(rtwdev, phy_idx, false);
365962306a36Sopenharmony_ci
366062306a36Sopenharmony_ci	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
366162306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
366262306a36Sopenharmony_ci}
366362306a36Sopenharmony_ci
366462306a36Sopenharmony_civoid rtw8852a_dpk_track(struct rtw89_dev *rtwdev)
366562306a36Sopenharmony_ci{
366662306a36Sopenharmony_ci	_dpk_track(rtwdev);
366762306a36Sopenharmony_ci}
366862306a36Sopenharmony_ci
366962306a36Sopenharmony_civoid rtw8852a_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
367062306a36Sopenharmony_ci{
367162306a36Sopenharmony_ci	u8 i;
367262306a36Sopenharmony_ci
367362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n",
367462306a36Sopenharmony_ci		    __func__, phy);
367562306a36Sopenharmony_ci
367662306a36Sopenharmony_ci	_tssi_disable(rtwdev, phy);
367762306a36Sopenharmony_ci
367862306a36Sopenharmony_ci	for (i = RF_PATH_A; i < RF_PATH_NUM_8852A; i++) {
367962306a36Sopenharmony_ci		_tssi_rf_setting(rtwdev, phy, i);
368062306a36Sopenharmony_ci		_tssi_set_sys(rtwdev, phy);
368162306a36Sopenharmony_ci		_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
368262306a36Sopenharmony_ci		_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
368362306a36Sopenharmony_ci		_tssi_set_dck(rtwdev, phy, i);
368462306a36Sopenharmony_ci		_tssi_set_tmeter_tbl(rtwdev, phy, i);
368562306a36Sopenharmony_ci		_tssi_set_dac_gain_tbl(rtwdev, phy, i);
368662306a36Sopenharmony_ci		_tssi_slope_cal_org(rtwdev, phy, i);
368762306a36Sopenharmony_ci		_tssi_set_rf_gap_tbl(rtwdev, phy, i);
368862306a36Sopenharmony_ci		_tssi_set_slope(rtwdev, phy, i);
368962306a36Sopenharmony_ci		_tssi_pak(rtwdev, phy, i);
369062306a36Sopenharmony_ci	}
369162306a36Sopenharmony_ci
369262306a36Sopenharmony_ci	_tssi_enable(rtwdev, phy);
369362306a36Sopenharmony_ci	_tssi_set_efuse_to_de(rtwdev, phy);
369462306a36Sopenharmony_ci	_tssi_high_power(rtwdev, phy);
369562306a36Sopenharmony_ci	_tssi_pre_tx(rtwdev, phy);
369662306a36Sopenharmony_ci}
369762306a36Sopenharmony_ci
369862306a36Sopenharmony_civoid rtw8852a_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
369962306a36Sopenharmony_ci{
370062306a36Sopenharmony_ci	u8 i;
370162306a36Sopenharmony_ci
370262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n",
370362306a36Sopenharmony_ci		    __func__, phy);
370462306a36Sopenharmony_ci
370562306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_A])
370662306a36Sopenharmony_ci		return;
370762306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_B])
370862306a36Sopenharmony_ci		return;
370962306a36Sopenharmony_ci
371062306a36Sopenharmony_ci	_tssi_disable(rtwdev, phy);
371162306a36Sopenharmony_ci
371262306a36Sopenharmony_ci	for (i = RF_PATH_A; i < RF_PATH_NUM_8852A; i++) {
371362306a36Sopenharmony_ci		_tssi_rf_setting(rtwdev, phy, i);
371462306a36Sopenharmony_ci		_tssi_set_sys(rtwdev, phy);
371562306a36Sopenharmony_ci		_tssi_set_tmeter_tbl(rtwdev, phy, i);
371662306a36Sopenharmony_ci		_tssi_pak(rtwdev, phy, i);
371762306a36Sopenharmony_ci	}
371862306a36Sopenharmony_ci
371962306a36Sopenharmony_ci	_tssi_enable(rtwdev, phy);
372062306a36Sopenharmony_ci	_tssi_set_efuse_to_de(rtwdev, phy);
372162306a36Sopenharmony_ci}
372262306a36Sopenharmony_ci
372362306a36Sopenharmony_civoid rtw8852a_tssi_track(struct rtw89_dev *rtwdev)
372462306a36Sopenharmony_ci{
372562306a36Sopenharmony_ci	_tssi_track(rtwdev);
372662306a36Sopenharmony_ci}
372762306a36Sopenharmony_ci
372862306a36Sopenharmony_cistatic
372962306a36Sopenharmony_civoid _rtw8852a_tssi_avg_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
373062306a36Sopenharmony_ci{
373162306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B])
373262306a36Sopenharmony_ci		return;
373362306a36Sopenharmony_ci
373462306a36Sopenharmony_ci	/* disable */
373562306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_disable_defs_tbl);
373662306a36Sopenharmony_ci
373762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x0);
373862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x0);
373962306a36Sopenharmony_ci
374062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x0);
374162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x0);
374262306a36Sopenharmony_ci
374362306a36Sopenharmony_ci	/* enable */
374462306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_enable_defs_ab_tbl);
374562306a36Sopenharmony_ci}
374662306a36Sopenharmony_ci
374762306a36Sopenharmony_cistatic
374862306a36Sopenharmony_civoid _rtw8852a_tssi_set_avg(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
374962306a36Sopenharmony_ci{
375062306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B])
375162306a36Sopenharmony_ci		return;
375262306a36Sopenharmony_ci
375362306a36Sopenharmony_ci	/* disable */
375462306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_disable_defs_tbl);
375562306a36Sopenharmony_ci
375662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x4);
375762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2);
375862306a36Sopenharmony_ci
375962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x4);
376062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2);
376162306a36Sopenharmony_ci
376262306a36Sopenharmony_ci	/* enable */
376362306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_enable_defs_ab_tbl);
376462306a36Sopenharmony_ci}
376562306a36Sopenharmony_ci
376662306a36Sopenharmony_cistatic void rtw8852a_tssi_set_avg(struct rtw89_dev *rtwdev,
376762306a36Sopenharmony_ci				  enum rtw89_phy_idx phy, bool enable)
376862306a36Sopenharmony_ci{
376962306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B])
377062306a36Sopenharmony_ci		return;
377162306a36Sopenharmony_ci
377262306a36Sopenharmony_ci	if (enable) {
377362306a36Sopenharmony_ci		/* SCAN_START */
377462306a36Sopenharmony_ci		_rtw8852a_tssi_avg_scan(rtwdev, phy);
377562306a36Sopenharmony_ci	} else {
377662306a36Sopenharmony_ci		/* SCAN_END */
377762306a36Sopenharmony_ci		_rtw8852a_tssi_set_avg(rtwdev, phy);
377862306a36Sopenharmony_ci	}
377962306a36Sopenharmony_ci}
378062306a36Sopenharmony_ci
378162306a36Sopenharmony_cistatic void rtw8852a_tssi_default_txagc(struct rtw89_dev *rtwdev,
378262306a36Sopenharmony_ci					enum rtw89_phy_idx phy, bool enable)
378362306a36Sopenharmony_ci{
378462306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
378562306a36Sopenharmony_ci	u8 i;
378662306a36Sopenharmony_ci
378762306a36Sopenharmony_ci	if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B])
378862306a36Sopenharmony_ci		return;
378962306a36Sopenharmony_ci
379062306a36Sopenharmony_ci	if (enable) {
379162306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, B_TXAGC_BB_OFT) != 0xc000 &&
379262306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, B_TXAGC_BB_OFT) != 0x0) {
379362306a36Sopenharmony_ci			for (i = 0; i < 6; i++) {
379462306a36Sopenharmony_ci				tssi_info->default_txagc_offset[RF_PATH_A] =
379562306a36Sopenharmony_ci					rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB,
379662306a36Sopenharmony_ci							      B_TXAGC_BB);
379762306a36Sopenharmony_ci				if (tssi_info->default_txagc_offset[RF_PATH_A])
379862306a36Sopenharmony_ci					break;
379962306a36Sopenharmony_ci			}
380062306a36Sopenharmony_ci		}
380162306a36Sopenharmony_ci
380262306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, B_TXAGC_BB_S1_OFT) != 0xc000 &&
380362306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, B_TXAGC_BB_S1_OFT) != 0x0) {
380462306a36Sopenharmony_ci			for (i = 0; i < 6; i++) {
380562306a36Sopenharmony_ci				tssi_info->default_txagc_offset[RF_PATH_B] =
380662306a36Sopenharmony_ci					rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1,
380762306a36Sopenharmony_ci							      B_TXAGC_BB_S1);
380862306a36Sopenharmony_ci				if (tssi_info->default_txagc_offset[RF_PATH_B])
380962306a36Sopenharmony_ci					break;
381062306a36Sopenharmony_ci			}
381162306a36Sopenharmony_ci		}
381262306a36Sopenharmony_ci	} else {
381362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT,
381462306a36Sopenharmony_ci				       tssi_info->default_txagc_offset[RF_PATH_A]);
381562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT,
381662306a36Sopenharmony_ci				       tssi_info->default_txagc_offset[RF_PATH_B]);
381762306a36Sopenharmony_ci
381862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);
381962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);
382062306a36Sopenharmony_ci
382162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0);
382262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1);
382362306a36Sopenharmony_ci	}
382462306a36Sopenharmony_ci}
382562306a36Sopenharmony_ci
382662306a36Sopenharmony_civoid rtw8852a_wifi_scan_notify(struct rtw89_dev *rtwdev,
382762306a36Sopenharmony_ci			       bool scan_start, enum rtw89_phy_idx phy_idx)
382862306a36Sopenharmony_ci{
382962306a36Sopenharmony_ci	if (scan_start) {
383062306a36Sopenharmony_ci		rtw8852a_tssi_default_txagc(rtwdev, phy_idx, true);
383162306a36Sopenharmony_ci		rtw8852a_tssi_set_avg(rtwdev, phy_idx, true);
383262306a36Sopenharmony_ci	} else {
383362306a36Sopenharmony_ci		rtw8852a_tssi_default_txagc(rtwdev, phy_idx, false);
383462306a36Sopenharmony_ci		rtw8852a_tssi_set_avg(rtwdev, phy_idx, false);
383562306a36Sopenharmony_ci	}
383662306a36Sopenharmony_ci}
3837