162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
262306a36Sopenharmony_ci/* Copyright(c) 2019-2022  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 "rtw8852b.h"
1162306a36Sopenharmony_ci#include "rtw8852b_rfk.h"
1262306a36Sopenharmony_ci#include "rtw8852b_rfk_table.h"
1362306a36Sopenharmony_ci#include "rtw8852b_table.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define RTW8852B_RXDCK_VER 0x1
1662306a36Sopenharmony_ci#define RTW8852B_IQK_VER 0x2a
1762306a36Sopenharmony_ci#define RTW8852B_IQK_SS 2
1862306a36Sopenharmony_ci#define RTW8852B_RXK_GROUP_NR 4
1962306a36Sopenharmony_ci#define RTW8852B_TSSI_PATH_NR 2
2062306a36Sopenharmony_ci#define RTW8852B_RF_REL_VERSION 34
2162306a36Sopenharmony_ci#define RTW8852B_DPK_VER 0x0d
2262306a36Sopenharmony_ci#define RTW8852B_DPK_RF_PATH 2
2362306a36Sopenharmony_ci#define RTW8852B_DPK_KIP_REG_NUM 2
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define _TSSI_DE_MASK GENMASK(21, 12)
2662306a36Sopenharmony_ci#define ADDC_T_AVG 100
2762306a36Sopenharmony_ci#define DPK_TXAGC_LOWER 0x2e
2862306a36Sopenharmony_ci#define DPK_TXAGC_UPPER 0x3f
2962306a36Sopenharmony_ci#define DPK_TXAGC_INVAL 0xff
3062306a36Sopenharmony_ci#define RFREG_MASKRXBB 0x003e0
3162306a36Sopenharmony_ci#define RFREG_MASKMODE 0xf0000
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cienum rtw8852b_dpk_id {
3462306a36Sopenharmony_ci	LBK_RXIQK	= 0x06,
3562306a36Sopenharmony_ci	SYNC		= 0x10,
3662306a36Sopenharmony_ci	MDPK_IDL	= 0x11,
3762306a36Sopenharmony_ci	MDPK_MPA	= 0x12,
3862306a36Sopenharmony_ci	GAIN_LOSS	= 0x13,
3962306a36Sopenharmony_ci	GAIN_CAL	= 0x14,
4062306a36Sopenharmony_ci	DPK_RXAGC	= 0x15,
4162306a36Sopenharmony_ci	KIP_PRESET	= 0x16,
4262306a36Sopenharmony_ci	KIP_RESTORE	= 0x17,
4362306a36Sopenharmony_ci	DPK_TXAGC	= 0x19,
4462306a36Sopenharmony_ci	D_KIP_PRESET	= 0x28,
4562306a36Sopenharmony_ci	D_TXAGC		= 0x29,
4662306a36Sopenharmony_ci	D_RXAGC		= 0x2a,
4762306a36Sopenharmony_ci	D_SYNC		= 0x2b,
4862306a36Sopenharmony_ci	D_GAIN_LOSS	= 0x2c,
4962306a36Sopenharmony_ci	D_MDPK_IDL	= 0x2d,
5062306a36Sopenharmony_ci	D_GAIN_NORM	= 0x2f,
5162306a36Sopenharmony_ci	D_KIP_THERMAL	= 0x30,
5262306a36Sopenharmony_ci	D_KIP_RESTORE	= 0x31
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cienum dpk_agc_step {
5662306a36Sopenharmony_ci	DPK_AGC_STEP_SYNC_DGAIN,
5762306a36Sopenharmony_ci	DPK_AGC_STEP_GAIN_ADJ,
5862306a36Sopenharmony_ci	DPK_AGC_STEP_GAIN_LOSS_IDX,
5962306a36Sopenharmony_ci	DPK_AGC_STEP_GL_GT_CRITERION,
6062306a36Sopenharmony_ci	DPK_AGC_STEP_GL_LT_CRITERION,
6162306a36Sopenharmony_ci	DPK_AGC_STEP_SET_TX_GAIN,
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cienum rtw8852b_iqk_type {
6562306a36Sopenharmony_ci	ID_TXAGC = 0x0,
6662306a36Sopenharmony_ci	ID_FLOK_COARSE = 0x1,
6762306a36Sopenharmony_ci	ID_FLOK_FINE = 0x2,
6862306a36Sopenharmony_ci	ID_TXK = 0x3,
6962306a36Sopenharmony_ci	ID_RXAGC = 0x4,
7062306a36Sopenharmony_ci	ID_RXK = 0x5,
7162306a36Sopenharmony_ci	ID_NBTXK = 0x6,
7262306a36Sopenharmony_ci	ID_NBRXK = 0x7,
7362306a36Sopenharmony_ci	ID_FLOK_VBUFFER = 0x8,
7462306a36Sopenharmony_ci	ID_A_FLOK_COARSE = 0x9,
7562306a36Sopenharmony_ci	ID_G_FLOK_COARSE = 0xa,
7662306a36Sopenharmony_ci	ID_A_FLOK_FINE = 0xb,
7762306a36Sopenharmony_ci	ID_G_FLOK_FINE = 0xc,
7862306a36Sopenharmony_ci	ID_IQK_RESTORE = 0x10,
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic const u32 _tssi_trigger[RTW8852B_TSSI_PATH_NR] = {0x5820, 0x7820};
8262306a36Sopenharmony_cistatic const u32 _tssi_cw_rpt_addr[RTW8852B_TSSI_PATH_NR] = {0x1c18, 0x3c18};
8362306a36Sopenharmony_cistatic const u32 _tssi_cw_default_addr[RTW8852B_TSSI_PATH_NR][4] = {
8462306a36Sopenharmony_ci	{0x5634, 0x5630, 0x5630, 0x5630},
8562306a36Sopenharmony_ci	{0x7634, 0x7630, 0x7630, 0x7630} };
8662306a36Sopenharmony_cistatic const u32 _tssi_cw_default_mask[4] = {
8762306a36Sopenharmony_ci	0x000003ff, 0x3ff00000, 0x000ffc00, 0x000003ff};
8862306a36Sopenharmony_cistatic const u32 _tssi_de_cck_long[RF_PATH_NUM_8852B] = {0x5858, 0x7858};
8962306a36Sopenharmony_cistatic const u32 _tssi_de_cck_short[RF_PATH_NUM_8852B] = {0x5860, 0x7860};
9062306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8852B] = {0x5838, 0x7838};
9162306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8852B] = {0x5840, 0x7840};
9262306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8852B] = {0x5848, 0x7848};
9362306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8852B] = {0x5850, 0x7850};
9462306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852B] = {0x5828, 0x7828};
9562306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852B] = {0x5830, 0x7830};
9662306a36Sopenharmony_cistatic const u32 _a_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x190, 0x198, 0x350, 0x352};
9762306a36Sopenharmony_cistatic const u32 _a_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x0f, 0x0f, 0x3f, 0x7f};
9862306a36Sopenharmony_cistatic const u32 _a_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x1, 0x0, 0x0};
9962306a36Sopenharmony_cistatic const u32 _g_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x212, 0x21c, 0x350, 0x360};
10062306a36Sopenharmony_cistatic const u32 _g_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x00, 0x00, 0x28, 0x5f};
10162306a36Sopenharmony_cistatic const u32 _g_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x2, 0x1};
10262306a36Sopenharmony_cistatic const u32 _a_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0};
10362306a36Sopenharmony_cistatic const u32 _a_track_range[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x6, 0x6};
10462306a36Sopenharmony_cistatic const u32 _a_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e};
10562306a36Sopenharmony_cistatic const u32 _a_itqt[RTW8852B_RXK_GROUP_NR] = {0x12, 0x12, 0x12, 0x1b};
10662306a36Sopenharmony_cistatic const u32 _g_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0};
10762306a36Sopenharmony_cistatic const u32 _g_track_range[RTW8852B_RXK_GROUP_NR] = {0x4, 0x4, 0x6, 0x6};
10862306a36Sopenharmony_cistatic const u32 _g_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e};
10962306a36Sopenharmony_cistatic const u32 _g_itqt[RTW8852B_RXK_GROUP_NR] = {0x09, 0x12, 0x1b, 0x24};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistatic const u32 rtw8852b_backup_bb_regs[] = {0x2344, 0x5800, 0x7800};
11262306a36Sopenharmony_cistatic const u32 rtw8852b_backup_rf_regs[] = {
11362306a36Sopenharmony_ci	0xde, 0xdf, 0x8b, 0x90, 0x97, 0x85, 0x1e, 0x0, 0x2, 0x5, 0x10005
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852b_backup_bb_regs)
11762306a36Sopenharmony_ci#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852b_backup_rf_regs)
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_cistatic const struct rtw89_reg3_def rtw8852b_set_nondbcc_path01[] = {
12062306a36Sopenharmony_ci	{0x20fc, 0xffff0000, 0x0303},
12162306a36Sopenharmony_ci	{0x5864, 0x18000000, 0x3},
12262306a36Sopenharmony_ci	{0x7864, 0x18000000, 0x3},
12362306a36Sopenharmony_ci	{0x12b8, 0x40000000, 0x1},
12462306a36Sopenharmony_ci	{0x32b8, 0x40000000, 0x1},
12562306a36Sopenharmony_ci	{0x030c, 0xff000000, 0x13},
12662306a36Sopenharmony_ci	{0x032c, 0xffff0000, 0x0041},
12762306a36Sopenharmony_ci	{0x12b8, 0x10000000, 0x1},
12862306a36Sopenharmony_ci	{0x58c8, 0x01000000, 0x1},
12962306a36Sopenharmony_ci	{0x78c8, 0x01000000, 0x1},
13062306a36Sopenharmony_ci	{0x5864, 0xc0000000, 0x3},
13162306a36Sopenharmony_ci	{0x7864, 0xc0000000, 0x3},
13262306a36Sopenharmony_ci	{0x2008, 0x01ffffff, 0x1ffffff},
13362306a36Sopenharmony_ci	{0x0c1c, 0x00000004, 0x1},
13462306a36Sopenharmony_ci	{0x0700, 0x08000000, 0x1},
13562306a36Sopenharmony_ci	{0x0c70, 0x000003ff, 0x3ff},
13662306a36Sopenharmony_ci	{0x0c60, 0x00000003, 0x3},
13762306a36Sopenharmony_ci	{0x0c6c, 0x00000001, 0x1},
13862306a36Sopenharmony_ci	{0x58ac, 0x08000000, 0x1},
13962306a36Sopenharmony_ci	{0x78ac, 0x08000000, 0x1},
14062306a36Sopenharmony_ci	{0x0c3c, 0x00000200, 0x1},
14162306a36Sopenharmony_ci	{0x2344, 0x80000000, 0x1},
14262306a36Sopenharmony_ci	{0x4490, 0x80000000, 0x1},
14362306a36Sopenharmony_ci	{0x12a0, 0x00007000, 0x7},
14462306a36Sopenharmony_ci	{0x12a0, 0x00008000, 0x1},
14562306a36Sopenharmony_ci	{0x12a0, 0x00070000, 0x3},
14662306a36Sopenharmony_ci	{0x12a0, 0x00080000, 0x1},
14762306a36Sopenharmony_ci	{0x32a0, 0x00070000, 0x3},
14862306a36Sopenharmony_ci	{0x32a0, 0x00080000, 0x1},
14962306a36Sopenharmony_ci	{0x0700, 0x01000000, 0x1},
15062306a36Sopenharmony_ci	{0x0700, 0x06000000, 0x2},
15162306a36Sopenharmony_ci	{0x20fc, 0xffff0000, 0x3333},
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistatic const struct rtw89_reg3_def rtw8852b_restore_nondbcc_path01[] = {
15562306a36Sopenharmony_ci	{0x20fc, 0xffff0000, 0x0303},
15662306a36Sopenharmony_ci	{0x12b8, 0x40000000, 0x0},
15762306a36Sopenharmony_ci	{0x32b8, 0x40000000, 0x0},
15862306a36Sopenharmony_ci	{0x5864, 0xc0000000, 0x0},
15962306a36Sopenharmony_ci	{0x7864, 0xc0000000, 0x0},
16062306a36Sopenharmony_ci	{0x2008, 0x01ffffff, 0x0000000},
16162306a36Sopenharmony_ci	{0x0c1c, 0x00000004, 0x0},
16262306a36Sopenharmony_ci	{0x0700, 0x08000000, 0x0},
16362306a36Sopenharmony_ci	{0x0c70, 0x0000001f, 0x03},
16462306a36Sopenharmony_ci	{0x0c70, 0x000003e0, 0x03},
16562306a36Sopenharmony_ci	{0x12a0, 0x000ff000, 0x00},
16662306a36Sopenharmony_ci	{0x32a0, 0x000ff000, 0x00},
16762306a36Sopenharmony_ci	{0x0700, 0x07000000, 0x0},
16862306a36Sopenharmony_ci	{0x20fc, 0xffff0000, 0x0000},
16962306a36Sopenharmony_ci	{0x58c8, 0x01000000, 0x0},
17062306a36Sopenharmony_ci	{0x78c8, 0x01000000, 0x0},
17162306a36Sopenharmony_ci	{0x0c3c, 0x00000200, 0x0},
17262306a36Sopenharmony_ci	{0x2344, 0x80000000, 0x0},
17362306a36Sopenharmony_ci};
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cistatic void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[])
17662306a36Sopenharmony_ci{
17762306a36Sopenharmony_ci	u32 i;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
18062306a36Sopenharmony_ci		backup_bb_reg_val[i] =
18162306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, rtw8852b_backup_bb_regs[i],
18262306a36Sopenharmony_ci					      MASKDWORD);
18362306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
18462306a36Sopenharmony_ci			    "[RFK]backup bb reg : %x, value =%x\n",
18562306a36Sopenharmony_ci			    rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]);
18662306a36Sopenharmony_ci	}
18762306a36Sopenharmony_ci}
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistatic void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[],
19062306a36Sopenharmony_ci			       u8 rf_path)
19162306a36Sopenharmony_ci{
19262306a36Sopenharmony_ci	u32 i;
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
19562306a36Sopenharmony_ci		backup_rf_reg_val[i] =
19662306a36Sopenharmony_ci			rtw89_read_rf(rtwdev, rf_path,
19762306a36Sopenharmony_ci				      rtw8852b_backup_rf_regs[i], RFREG_MASK);
19862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
19962306a36Sopenharmony_ci			    "[RFK]backup rf S%d reg : %x, value =%x\n", rf_path,
20062306a36Sopenharmony_ci			    rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]);
20162306a36Sopenharmony_ci	}
20262306a36Sopenharmony_ci}
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cistatic void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev,
20562306a36Sopenharmony_ci				const u32 backup_bb_reg_val[])
20662306a36Sopenharmony_ci{
20762306a36Sopenharmony_ci	u32 i;
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci	for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
21062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, rtw8852b_backup_bb_regs[i],
21162306a36Sopenharmony_ci				       MASKDWORD, backup_bb_reg_val[i]);
21262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
21362306a36Sopenharmony_ci			    "[RFK]restore bb reg : %x, value =%x\n",
21462306a36Sopenharmony_ci			    rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]);
21562306a36Sopenharmony_ci	}
21662306a36Sopenharmony_ci}
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cistatic void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev,
21962306a36Sopenharmony_ci				const u32 backup_rf_reg_val[], u8 rf_path)
22062306a36Sopenharmony_ci{
22162306a36Sopenharmony_ci	u32 i;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
22462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, rf_path, rtw8852b_backup_rf_regs[i],
22562306a36Sopenharmony_ci			       RFREG_MASK, backup_rf_reg_val[i]);
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
22862306a36Sopenharmony_ci			    "[RFK]restore rf S%d reg: %x, value =%x\n", rf_path,
22962306a36Sopenharmony_ci			    rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]);
23062306a36Sopenharmony_ci	}
23162306a36Sopenharmony_ci}
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_cistatic void _rfk_rf_direct_cntrl(struct rtw89_dev *rtwdev,
23462306a36Sopenharmony_ci				 enum rtw89_rf_path path, bool is_bybb)
23562306a36Sopenharmony_ci{
23662306a36Sopenharmony_ci	if (is_bybb)
23762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
23862306a36Sopenharmony_ci	else
23962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
24062306a36Sopenharmony_ci}
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_cistatic void _rfk_drf_direct_cntrl(struct rtw89_dev *rtwdev,
24362306a36Sopenharmony_ci				  enum rtw89_rf_path path, bool is_bybb)
24462306a36Sopenharmony_ci{
24562306a36Sopenharmony_ci	if (is_bybb)
24662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1);
24762306a36Sopenharmony_ci	else
24862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0);
24962306a36Sopenharmony_ci}
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistatic bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path)
25262306a36Sopenharmony_ci{
25362306a36Sopenharmony_ci	bool fail = true;
25462306a36Sopenharmony_ci	u32 val;
25562306a36Sopenharmony_ci	int ret;
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
25862306a36Sopenharmony_ci				       1, 8200, false, rtwdev, 0xbff8, MASKBYTE0);
25962306a36Sopenharmony_ci	if (ret)
26062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL1 IQK timeout!!!\n");
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	udelay(200);
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	if (!ret)
26562306a36Sopenharmony_ci		fail = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);
26662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ret=%d\n", path, ret);
26962306a36Sopenharmony_ci	val = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD);
27062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8008 = 0x%x\n", path, val);
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci	return fail;
27362306a36Sopenharmony_ci}
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_cistatic u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
27662306a36Sopenharmony_ci{
27762306a36Sopenharmony_ci	u8 val;
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x,PHY%d\n",
28062306a36Sopenharmony_ci		    rtwdev->dbcc_en, phy_idx);
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci	if (!rtwdev->dbcc_en) {
28362306a36Sopenharmony_ci		val = RF_AB;
28462306a36Sopenharmony_ci	} else {
28562306a36Sopenharmony_ci		if (phy_idx == RTW89_PHY_0)
28662306a36Sopenharmony_ci			val = RF_A;
28762306a36Sopenharmony_ci		else
28862306a36Sopenharmony_ci			val = RF_B;
28962306a36Sopenharmony_ci	}
29062306a36Sopenharmony_ci	return val;
29162306a36Sopenharmony_ci}
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_cistatic void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
29462306a36Sopenharmony_ci			enum rtw89_rf_path path)
29562306a36Sopenharmony_ci{
29662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0);
29762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);
29862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1);
29962306a36Sopenharmony_ci	mdelay(1);
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_cistatic void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
30362306a36Sopenharmony_ci{
30462306a36Sopenharmony_ci	u8 path, dck_tune;
30562306a36Sopenharmony_ci	u32 rf_reg5;
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
30862306a36Sopenharmony_ci		    "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, CV : 0x%x) ******\n",
30962306a36Sopenharmony_ci		    RTW8852B_RXDCK_VER, rtwdev->hal.cv);
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	for (path = 0; path < RF_PATH_NUM_8852B; path++) {
31262306a36Sopenharmony_ci		rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
31362306a36Sopenharmony_ci		dck_tune = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE);
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path])
31662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev,
31762306a36Sopenharmony_ci					       R_P0_TSSI_TRK + (path << 13),
31862306a36Sopenharmony_ci					       B_P0_TSSI_TRK_EN, 0x1);
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
32162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0);
32262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
32362306a36Sopenharmony_ci		_set_rx_dck(rtwdev, phy, path);
32462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune);
32562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path])
32862306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev,
32962306a36Sopenharmony_ci					       R_P0_TSSI_TRK + (path << 13),
33062306a36Sopenharmony_ci					       B_P0_TSSI_TRK_EN, 0x0);
33162306a36Sopenharmony_ci	}
33262306a36Sopenharmony_ci}
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_cistatic void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
33562306a36Sopenharmony_ci{
33662306a36Sopenharmony_ci	u32 rf_reg5;
33762306a36Sopenharmony_ci	u32 rck_val;
33862306a36Sopenharmony_ci	u32 val;
33962306a36Sopenharmony_ci	int ret;
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path);
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci	rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
34662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n",
34962306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK));
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	/* RCK trigger */
35262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240);
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30,
35562306a36Sopenharmony_ci				       false, rtwdev, path, RR_RCKS, BIT(3));
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci	rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA);
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n",
36062306a36Sopenharmony_ci		    rck_val, ret);
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val);
36362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n",
36662306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK));
36762306a36Sopenharmony_ci}
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_cistatic void _afe_init(struct rtw89_dev *rtwdev)
37062306a36Sopenharmony_ci{
37162306a36Sopenharmony_ci	rtw89_write32(rtwdev, R_AX_PHYREG_SET, 0xf);
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_afe_init_defs_tbl);
37462306a36Sopenharmony_ci}
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_cistatic void _drck(struct rtw89_dev *rtwdev)
37762306a36Sopenharmony_ci{
37862306a36Sopenharmony_ci	u32 rck_d;
37962306a36Sopenharmony_ci	u32 val;
38062306a36Sopenharmony_ci	int ret;
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n");
38362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x1);
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
38662306a36Sopenharmony_ci				       false, rtwdev, R_DRCK_RS, B_DRCK_RS_DONE);
38762306a36Sopenharmony_ci	if (ret)
38862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n");
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x0);
39162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1);
39262306a36Sopenharmony_ci	udelay(1);
39362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0);
39462306a36Sopenharmony_ci	rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RS, B_DRCK_RS_LPS);
39562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_SEL, 0x0);
39662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_CV, rck_d);
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0cc = 0x%x\n",
39962306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_DRCK_V1, MASKDWORD));
40062306a36Sopenharmony_ci}
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_cistatic void _addck_backup(struct rtw89_dev *rtwdev)
40362306a36Sopenharmony_ci{
40462306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0);
40762306a36Sopenharmony_ci	dack->addck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0);
40862306a36Sopenharmony_ci	dack->addck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1);
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x0);
41162306a36Sopenharmony_ci	dack->addck_d[1][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A0);
41262306a36Sopenharmony_ci	dack->addck_d[1][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A1);
41362306a36Sopenharmony_ci}
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_cistatic void _addck_reload(struct rtw89_dev *rtwdev)
41662306a36Sopenharmony_ci{
41762306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	/* S0 */
42062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL, dack->addck_d[0][0]);
42162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_VAL, dack->addck_d[0][1] >> 6);
42262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL2, dack->addck_d[0][1] & 0x3f);
42362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x3);
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci	/* S1 */
42662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL, dack->addck_d[1][0]);
42762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK0_VAL, dack->addck_d[1][1] >> 6);
42862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL2, dack->addck_d[1][1] & 0x3f);
42962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_MAN, 0x3);
43062306a36Sopenharmony_ci}
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cistatic void _dack_backup_s0(struct rtw89_dev *rtwdev)
43362306a36Sopenharmony_ci{
43462306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
43562306a36Sopenharmony_ci	u8 i;
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
44062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i);
44162306a36Sopenharmony_ci		dack->msbk_d[0][0][i] =
44262306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0);
44362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i);
44462306a36Sopenharmony_ci		dack->msbk_d[0][1][i] =
44562306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1);
44662306a36Sopenharmony_ci	}
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci	dack->biask_d[0][0] =
44962306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00);
45062306a36Sopenharmony_ci	dack->biask_d[0][1] =
45162306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01);
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	dack->dadck_d[0][0] =
45462306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00);
45562306a36Sopenharmony_ci	dack->dadck_d[0][1] =
45662306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01);
45762306a36Sopenharmony_ci}
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cistatic void _dack_backup_s1(struct rtw89_dev *rtwdev)
46062306a36Sopenharmony_ci{
46162306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
46262306a36Sopenharmony_ci	u8 i;
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
46762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10, i);
46862306a36Sopenharmony_ci		dack->msbk_d[1][0][i] =
46962306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK10S);
47062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DACK11, B_DACK11, i);
47162306a36Sopenharmony_ci		dack->msbk_d[1][1][i] =
47262306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK11S);
47362306a36Sopenharmony_ci	}
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_ci	dack->biask_d[1][0] =
47662306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS10, B_DACK_BIAS10);
47762306a36Sopenharmony_ci	dack->biask_d[1][1] =
47862306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS11, B_DACK_BIAS11);
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci	dack->dadck_d[1][0] =
48162306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK10, B_DACK_DADCK10);
48262306a36Sopenharmony_ci	dack->dadck_d[1][1] =
48362306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK11, B_DACK_DADCK11);
48462306a36Sopenharmony_ci}
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_cistatic void _check_addc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
48762306a36Sopenharmony_ci{
48862306a36Sopenharmony_ci	s32 dc_re = 0, dc_im = 0;
48962306a36Sopenharmony_ci	u32 tmp;
49062306a36Sopenharmony_ci	u32 i;
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
49362306a36Sopenharmony_ci				 &rtw8852b_check_addc_defs_a_tbl,
49462306a36Sopenharmony_ci				 &rtw8852b_check_addc_defs_b_tbl);
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	for (i = 0; i < ADDC_T_AVG; i++) {
49762306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_DBG32_D, MASKDWORD);
49862306a36Sopenharmony_ci		dc_re += sign_extend32(FIELD_GET(0xfff000, tmp), 11);
49962306a36Sopenharmony_ci		dc_im += sign_extend32(FIELD_GET(0xfff, tmp), 11);
50062306a36Sopenharmony_ci	}
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	dc_re /= ADDC_T_AVG;
50362306a36Sopenharmony_ci	dc_im /= ADDC_T_AVG;
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
50662306a36Sopenharmony_ci		    "[DACK]S%d,dc_re = 0x%x,dc_im =0x%x\n", path, dc_re, dc_im);
50762306a36Sopenharmony_ci}
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_cistatic void _addck(struct rtw89_dev *rtwdev)
51062306a36Sopenharmony_ci{
51162306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
51262306a36Sopenharmony_ci	u32 val;
51362306a36Sopenharmony_ci	int ret;
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	/* S0 */
51662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x0);
51762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x30, 0x0);
51862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
51962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0);
52062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0);
52162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1);
52262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf);
52362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0);
52462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x1);
52562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3);
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S0 ADDCK\n");
52862306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_A);
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x1);
53162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x0);
53262306a36Sopenharmony_ci	udelay(1);
53362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1);
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
53662306a36Sopenharmony_ci				       false, rtwdev, R_ADDCKR0, BIT(0));
53762306a36Sopenharmony_ci	if (ret) {
53862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n");
53962306a36Sopenharmony_ci		dack->addck_timeout[0] = true;
54062306a36Sopenharmony_ci	}
54162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret);
54262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 ADDCK\n");
54362306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_A);
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x0);
54662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1);
54762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc);
54862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1);
54962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci	/* S1 */
55262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
55362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0);
55462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0);
55562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1);
55662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf);
55762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0);
55862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x1);
55962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3);
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S1 ADDCK\n");
56262306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_B);
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x1);
56562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x0);
56662306a36Sopenharmony_ci	udelay(1);
56762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x1);
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000,
57062306a36Sopenharmony_ci				       false, rtwdev, R_ADDCKR1, BIT(0));
57162306a36Sopenharmony_ci	if (ret) {
57262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n");
57362306a36Sopenharmony_ci		dack->addck_timeout[1] = true;
57462306a36Sopenharmony_ci	}
57562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret);
57662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 ADDCK\n");
57762306a36Sopenharmony_ci	_check_addc(rtwdev, RF_PATH_B);
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x0);
58062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1);
58162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc);
58262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1);
58362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
58462306a36Sopenharmony_ci}
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_cistatic void _check_dadc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
58762306a36Sopenharmony_ci{
58862306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
58962306a36Sopenharmony_ci				 &rtw8852b_check_dadc_en_defs_a_tbl,
59062306a36Sopenharmony_ci				 &rtw8852b_check_dadc_en_defs_b_tbl);
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci	_check_addc(rtwdev, path);
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
59562306a36Sopenharmony_ci				 &rtw8852b_check_dadc_dis_defs_a_tbl,
59662306a36Sopenharmony_ci				 &rtw8852b_check_dadc_dis_defs_b_tbl);
59762306a36Sopenharmony_ci}
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_cistatic bool _dack_s0_check_done(struct rtw89_dev *rtwdev, bool part1)
60062306a36Sopenharmony_ci{
60162306a36Sopenharmony_ci	if (part1) {
60262306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 ||
60362306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0)
60462306a36Sopenharmony_ci			return false;
60562306a36Sopenharmony_ci	} else {
60662306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 ||
60762306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0)
60862306a36Sopenharmony_ci			return false;
60962306a36Sopenharmony_ci	}
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	return true;
61262306a36Sopenharmony_ci}
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_cistatic void _dack_s0(struct rtw89_dev *rtwdev)
61562306a36Sopenharmony_ci{
61662306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
61762306a36Sopenharmony_ci	bool done;
61862306a36Sopenharmony_ci	int ret;
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_1_defs_tbl);
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000,
62362306a36Sopenharmony_ci				       false, rtwdev, true);
62462306a36Sopenharmony_ci	if (ret) {
62562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK timeout\n");
62662306a36Sopenharmony_ci		dack->msbk_timeout[0] = true;
62762306a36Sopenharmony_ci	}
62862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_2_defs_tbl);
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000,
63362306a36Sopenharmony_ci				       false, rtwdev, false);
63462306a36Sopenharmony_ci	if (ret) {
63562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADCK timeout\n");
63662306a36Sopenharmony_ci		dack->dadck_timeout[0] = true;
63762306a36Sopenharmony_ci	}
63862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_3_defs_tbl);
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n");
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci	_dack_backup_s0(rtwdev);
64562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
64662306a36Sopenharmony_ci}
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_cistatic bool _dack_s1_check_done(struct rtw89_dev *rtwdev, bool part1)
64962306a36Sopenharmony_ci{
65062306a36Sopenharmony_ci	if (part1) {
65162306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_DACK_S1P0, B_DACK_S1P0_OK) == 0 &&
65262306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_DACK_S1P1, B_DACK_S1P1_OK) == 0)
65362306a36Sopenharmony_ci			return false;
65462306a36Sopenharmony_ci	} else {
65562306a36Sopenharmony_ci		if (rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK_S1P2_OK) == 0 &&
65662306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK_S1P3_OK) == 0)
65762306a36Sopenharmony_ci			return false;
65862306a36Sopenharmony_ci	}
65962306a36Sopenharmony_ci
66062306a36Sopenharmony_ci	return true;
66162306a36Sopenharmony_ci}
66262306a36Sopenharmony_ci
66362306a36Sopenharmony_cistatic void _dack_s1(struct rtw89_dev *rtwdev)
66462306a36Sopenharmony_ci{
66562306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
66662306a36Sopenharmony_ci	bool done;
66762306a36Sopenharmony_ci	int ret;
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_1_defs_tbl);
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000,
67262306a36Sopenharmony_ci				       false, rtwdev, true);
67362306a36Sopenharmony_ci	if (ret) {
67462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK timeout\n");
67562306a36Sopenharmony_ci		dack->msbk_timeout[1] = true;
67662306a36Sopenharmony_ci	}
67762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_2_defs_tbl);
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000,
68262306a36Sopenharmony_ci				       false, rtwdev, false);
68362306a36Sopenharmony_ci	if (ret) {
68462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DADCK timeout\n");
68562306a36Sopenharmony_ci		dack->dadck_timeout[1] = true;
68662306a36Sopenharmony_ci	}
68762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_3_defs_tbl);
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 DADCK\n");
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci	_check_dadc(rtwdev, RF_PATH_B);
69462306a36Sopenharmony_ci	_dack_backup_s1(rtwdev);
69562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
69662306a36Sopenharmony_ci}
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_cistatic void _dack(struct rtw89_dev *rtwdev)
69962306a36Sopenharmony_ci{
70062306a36Sopenharmony_ci	_dack_s0(rtwdev);
70162306a36Sopenharmony_ci	_dack_s1(rtwdev);
70262306a36Sopenharmony_ci}
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_cistatic void _dack_dump(struct rtw89_dev *rtwdev)
70562306a36Sopenharmony_ci{
70662306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
70762306a36Sopenharmony_ci	u8 i;
70862306a36Sopenharmony_ci	u8 t;
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
71162306a36Sopenharmony_ci		    "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n",
71262306a36Sopenharmony_ci		    dack->addck_d[0][0], dack->addck_d[0][1]);
71362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
71462306a36Sopenharmony_ci		    "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n",
71562306a36Sopenharmony_ci		    dack->addck_d[1][0], dack->addck_d[1][1]);
71662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
71762306a36Sopenharmony_ci		    "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n",
71862306a36Sopenharmony_ci		    dack->dadck_d[0][0], dack->dadck_d[0][1]);
71962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
72062306a36Sopenharmony_ci		    "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n",
72162306a36Sopenharmony_ci		    dack->dadck_d[1][0], dack->dadck_d[1][1]);
72262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
72362306a36Sopenharmony_ci		    "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n",
72462306a36Sopenharmony_ci		    dack->biask_d[0][0], dack->biask_d[0][1]);
72562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
72662306a36Sopenharmony_ci		    "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n",
72762306a36Sopenharmony_ci		    dack->biask_d[1][0], dack->biask_d[1][1]);
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n");
73062306a36Sopenharmony_ci	for (i = 0; i < 0x10; i++) {
73162306a36Sopenharmony_ci		t = dack->msbk_d[0][0][i];
73262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
73362306a36Sopenharmony_ci	}
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n");
73662306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
73762306a36Sopenharmony_ci		t = dack->msbk_d[0][1][i];
73862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
73962306a36Sopenharmony_ci	}
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n");
74262306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
74362306a36Sopenharmony_ci		t = dack->msbk_d[1][0][i];
74462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
74562306a36Sopenharmony_ci	}
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n");
74862306a36Sopenharmony_ci	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
74962306a36Sopenharmony_ci		t = dack->msbk_d[1][1][i];
75062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
75162306a36Sopenharmony_ci	}
75262306a36Sopenharmony_ci}
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_cistatic void _dac_cal(struct rtw89_dev *rtwdev, bool force)
75562306a36Sopenharmony_ci{
75662306a36Sopenharmony_ci	struct rtw89_dack_info *dack = &rtwdev->dack;
75762306a36Sopenharmony_ci	u32 rf0_0, rf1_0;
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_ci	dack->dack_done = false;
76062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK 0x1\n");
76162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n");
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci	rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK);
76462306a36Sopenharmony_ci	rf1_0 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK);
76562306a36Sopenharmony_ci	_afe_init(rtwdev);
76662306a36Sopenharmony_ci	_drck(rtwdev);
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0);
76962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0);
77062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1);
77162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x337e1);
77262306a36Sopenharmony_ci	_addck(rtwdev);
77362306a36Sopenharmony_ci	_addck_backup(rtwdev);
77462306a36Sopenharmony_ci	_addck_reload(rtwdev);
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0);
77762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0);
77862306a36Sopenharmony_ci	_dack(rtwdev);
77962306a36Sopenharmony_ci	_dack_dump(rtwdev);
78062306a36Sopenharmony_ci	dack->dack_done = true;
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, rf0_0);
78362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, rf1_0);
78462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1);
78562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1);
78662306a36Sopenharmony_ci	dack->dack_cnt++;
78762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n");
78862306a36Sopenharmony_ci}
78962306a36Sopenharmony_ci
79062306a36Sopenharmony_cistatic void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path)
79162306a36Sopenharmony_ci{
79262306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
79362306a36Sopenharmony_ci	u32 tmp;
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
79662306a36Sopenharmony_ci	case RTW89_BAND_2G:
79762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);
79862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1);
79962306a36Sopenharmony_ci		tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
80062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp);
80162306a36Sopenharmony_ci		break;
80262306a36Sopenharmony_ci	case RTW89_BAND_5G:
80362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);
80462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1);
80562306a36Sopenharmony_ci		tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
80662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp);
80762306a36Sopenharmony_ci		break;
80862306a36Sopenharmony_ci	default:
80962306a36Sopenharmony_ci		break;
81062306a36Sopenharmony_ci	}
81162306a36Sopenharmony_ci}
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_cistatic bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
81462306a36Sopenharmony_ci			  u8 path, u8 ktype)
81562306a36Sopenharmony_ci{
81662306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
81762306a36Sopenharmony_ci	u32 iqk_cmd;
81862306a36Sopenharmony_ci	bool fail;
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_ci	switch (ktype) {
82162306a36Sopenharmony_ci	case ID_FLOK_COARSE:
82262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
82362306a36Sopenharmony_ci		iqk_cmd = 0x108 | (1 << (4 + path));
82462306a36Sopenharmony_ci		break;
82562306a36Sopenharmony_ci	case ID_FLOK_FINE:
82662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
82762306a36Sopenharmony_ci		iqk_cmd = 0x208 | (1 << (4 + path));
82862306a36Sopenharmony_ci		break;
82962306a36Sopenharmony_ci	case ID_FLOK_VBUFFER:
83062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
83162306a36Sopenharmony_ci		iqk_cmd = 0x308 | (1 << (4 + path));
83262306a36Sopenharmony_ci		break;
83362306a36Sopenharmony_ci	case ID_TXK:
83462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
83562306a36Sopenharmony_ci		iqk_cmd = 0x008 | (1 << (path + 4)) |
83662306a36Sopenharmony_ci			  (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8);
83762306a36Sopenharmony_ci		break;
83862306a36Sopenharmony_ci	case ID_RXAGC:
83962306a36Sopenharmony_ci		iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1);
84062306a36Sopenharmony_ci		break;
84162306a36Sopenharmony_ci	case ID_RXK:
84262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
84362306a36Sopenharmony_ci		iqk_cmd = 0x008 | (1 << (path + 4)) |
84462306a36Sopenharmony_ci			  (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8);
84562306a36Sopenharmony_ci		break;
84662306a36Sopenharmony_ci	case ID_NBTXK:
84762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
84862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x011);
84962306a36Sopenharmony_ci		iqk_cmd = 0x408 | (1 << (4 + path));
85062306a36Sopenharmony_ci		break;
85162306a36Sopenharmony_ci	case ID_NBRXK:
85262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
85362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);
85462306a36Sopenharmony_ci		iqk_cmd = 0x608 | (1 << (4 + path));
85562306a36Sopenharmony_ci		break;
85662306a36Sopenharmony_ci	default:
85762306a36Sopenharmony_ci		return false;
85862306a36Sopenharmony_ci	}
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1);
86162306a36Sopenharmony_ci	udelay(1);
86262306a36Sopenharmony_ci	fail = _iqk_check_cal(rtwdev, path);
86362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_ci	return fail;
86662306a36Sopenharmony_ci}
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_cistatic bool _rxk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
86962306a36Sopenharmony_ci			   u8 path)
87062306a36Sopenharmony_ci{
87162306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
87262306a36Sopenharmony_ci	bool kfail = false;
87362306a36Sopenharmony_ci	bool fail;
87462306a36Sopenharmony_ci	u8 gp;
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_ci	for (gp = 0; gp < RTW8852B_RXK_GROUP_NR; gp++) {
87762306a36Sopenharmony_ci		switch (iqk_info->iqk_band[path]) {
87862306a36Sopenharmony_ci		case RTW89_BAND_2G:
87962306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
88062306a36Sopenharmony_ci				       _g_idxrxgain[gp]);
88162306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G,
88262306a36Sopenharmony_ci				       _g_idxattc2[gp]);
88362306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G,
88462306a36Sopenharmony_ci				       _g_idxattc1[gp]);
88562306a36Sopenharmony_ci			break;
88662306a36Sopenharmony_ci		case RTW89_BAND_5G:
88762306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
88862306a36Sopenharmony_ci				       _a_idxrxgain[gp]);
88962306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT,
89062306a36Sopenharmony_ci				       _a_idxattc2[gp]);
89162306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2,
89262306a36Sopenharmony_ci				       _a_idxattc1[gp]);
89362306a36Sopenharmony_ci			break;
89462306a36Sopenharmony_ci		default:
89562306a36Sopenharmony_ci			break;
89662306a36Sopenharmony_ci		}
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
89962306a36Sopenharmony_ci				       B_CFIR_LUT_SEL, 0x1);
90062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
90162306a36Sopenharmony_ci				       B_CFIR_LUT_SET, 0x0);
90262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
90362306a36Sopenharmony_ci				       B_CFIR_LUT_GP_V1, gp);
90462306a36Sopenharmony_ci		fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);
90562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQKINF,
90662306a36Sopenharmony_ci				       BIT(16 + gp + path * 4), fail);
90762306a36Sopenharmony_ci		kfail |= fail;
90862306a36Sopenharmony_ci	}
90962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0);
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	if (kfail) {
91262306a36Sopenharmony_ci		iqk_info->nb_rxcfir[path] = 0x40000002;
91362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
91462306a36Sopenharmony_ci				       B_IQK_RES_RXCFIR, 0x0);
91562306a36Sopenharmony_ci		iqk_info->is_wb_rxiqk[path] = false;
91662306a36Sopenharmony_ci	} else {
91762306a36Sopenharmony_ci		iqk_info->nb_rxcfir[path] = 0x40000000;
91862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
91962306a36Sopenharmony_ci				       B_IQK_RES_RXCFIR, 0x5);
92062306a36Sopenharmony_ci		iqk_info->is_wb_rxiqk[path] = true;
92162306a36Sopenharmony_ci	}
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_ci	return kfail;
92462306a36Sopenharmony_ci}
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_cistatic bool _iqk_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
92762306a36Sopenharmony_ci		       u8 path)
92862306a36Sopenharmony_ci{
92962306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
93062306a36Sopenharmony_ci	const u8 gp = 0x3;
93162306a36Sopenharmony_ci	bool kfail = false;
93262306a36Sopenharmony_ci	bool fail;
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
93562306a36Sopenharmony_ci	case RTW89_BAND_2G:
93662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
93762306a36Sopenharmony_ci			       _g_idxrxgain[gp]);
93862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G,
93962306a36Sopenharmony_ci			       _g_idxattc2[gp]);
94062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G,
94162306a36Sopenharmony_ci			       _g_idxattc1[gp]);
94262306a36Sopenharmony_ci		break;
94362306a36Sopenharmony_ci	case RTW89_BAND_5G:
94462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM,
94562306a36Sopenharmony_ci			       _a_idxrxgain[gp]);
94662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT,
94762306a36Sopenharmony_ci			       _a_idxattc2[gp]);
94862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2,
94962306a36Sopenharmony_ci			       _a_idxattc1[gp]);
95062306a36Sopenharmony_ci		break;
95162306a36Sopenharmony_ci	default:
95262306a36Sopenharmony_ci		break;
95362306a36Sopenharmony_ci	}
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1);
95662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x0);
95762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP_V1, gp);
95862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);
95962306a36Sopenharmony_ci	udelay(1);
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_ci	fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);
96262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(16 + gp + path * 4), fail);
96362306a36Sopenharmony_ci	kfail |= fail;
96462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0);
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ci	if (!kfail)
96762306a36Sopenharmony_ci		iqk_info->nb_rxcfir[path] =
96862306a36Sopenharmony_ci			 rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD) | 0x2;
96962306a36Sopenharmony_ci	else
97062306a36Sopenharmony_ci		iqk_info->nb_rxcfir[path] = 0x40000002;
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci	return kfail;
97362306a36Sopenharmony_ci}
97462306a36Sopenharmony_ci
97562306a36Sopenharmony_cistatic void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path)
97662306a36Sopenharmony_ci{
97762306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
97862306a36Sopenharmony_ci
97962306a36Sopenharmony_ci	if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) {
98062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
98162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
98262306a36Sopenharmony_ci		udelay(1);
98362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f);
98462306a36Sopenharmony_ci		udelay(1);
98562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03);
98662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001);
98762306a36Sopenharmony_ci		udelay(1);
98862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041);
98962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x2);
99062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1);
99162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x2);
99262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1);
99362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1);
99462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x1);
99562306a36Sopenharmony_ci	} else {
99662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
99762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
99862306a36Sopenharmony_ci		udelay(1);
99962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f);
100062306a36Sopenharmony_ci		udelay(1);
100162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03);
100262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001);
100362306a36Sopenharmony_ci		udelay(1);
100462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041);
100562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x1);
100662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1);
100762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x1);
100862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1);
100962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1);
101062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x0);
101162306a36Sopenharmony_ci	}
101262306a36Sopenharmony_ci}
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_cistatic bool _txk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
101562306a36Sopenharmony_ci{
101662306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
101762306a36Sopenharmony_ci	bool kfail = false;
101862306a36Sopenharmony_ci	bool fail;
101962306a36Sopenharmony_ci	u8 gp;
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_ci	for (gp = 0x0; gp < RTW8852B_RXK_GROUP_NR; gp++) {
102262306a36Sopenharmony_ci		switch (iqk_info->iqk_band[path]) {
102362306a36Sopenharmony_ci		case RTW89_BAND_2G:
102462306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
102562306a36Sopenharmony_ci				       _g_power_range[gp]);
102662306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
102762306a36Sopenharmony_ci				       _g_track_range[gp]);
102862306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
102962306a36Sopenharmony_ci				       _g_gain_bb[gp]);
103062306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
103162306a36Sopenharmony_ci					       MASKDWORD, _g_itqt[gp]);
103262306a36Sopenharmony_ci			break;
103362306a36Sopenharmony_ci		case RTW89_BAND_5G:
103462306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
103562306a36Sopenharmony_ci				       _a_power_range[gp]);
103662306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
103762306a36Sopenharmony_ci				       _a_track_range[gp]);
103862306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
103962306a36Sopenharmony_ci				       _a_gain_bb[gp]);
104062306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
104162306a36Sopenharmony_ci					       MASKDWORD, _a_itqt[gp]);
104262306a36Sopenharmony_ci			break;
104362306a36Sopenharmony_ci		default:
104462306a36Sopenharmony_ci			break;
104562306a36Sopenharmony_ci		}
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
104862306a36Sopenharmony_ci				       B_CFIR_LUT_SEL, 0x1);
104962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
105062306a36Sopenharmony_ci				       B_CFIR_LUT_SET, 0x1);
105162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
105262306a36Sopenharmony_ci				       B_CFIR_LUT_G2, 0x0);
105362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
105462306a36Sopenharmony_ci				       B_CFIR_LUT_GP, gp);
105562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
105662306a36Sopenharmony_ci		fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);
105762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQKINF,
105862306a36Sopenharmony_ci				       BIT(8 + gp + path * 4), fail);
105962306a36Sopenharmony_ci		kfail |= fail;
106062306a36Sopenharmony_ci	}
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci	if (kfail) {
106362306a36Sopenharmony_ci		iqk_info->nb_txcfir[path] = 0x40000002;
106462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
106562306a36Sopenharmony_ci				       B_IQK_RES_TXCFIR, 0x0);
106662306a36Sopenharmony_ci		iqk_info->is_wb_txiqk[path] = false;
106762306a36Sopenharmony_ci	} else {
106862306a36Sopenharmony_ci		iqk_info->nb_txcfir[path] = 0x40000000;
106962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
107062306a36Sopenharmony_ci				       B_IQK_RES_TXCFIR, 0x5);
107162306a36Sopenharmony_ci		iqk_info->is_wb_txiqk[path] = true;
107262306a36Sopenharmony_ci	}
107362306a36Sopenharmony_ci
107462306a36Sopenharmony_ci	return kfail;
107562306a36Sopenharmony_ci}
107662306a36Sopenharmony_ci
107762306a36Sopenharmony_cistatic bool _iqk_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
107862306a36Sopenharmony_ci{
107962306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
108062306a36Sopenharmony_ci	bool kfail;
108162306a36Sopenharmony_ci	u8 gp = 0x2;
108262306a36Sopenharmony_ci
108362306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
108462306a36Sopenharmony_ci	case RTW89_BAND_2G:
108562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
108662306a36Sopenharmony_ci			       _g_power_range[gp]);
108762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
108862306a36Sopenharmony_ci			       _g_track_range[gp]);
108962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
109062306a36Sopenharmony_ci			       _g_gain_bb[gp]);
109162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
109262306a36Sopenharmony_ci				       MASKDWORD, _g_itqt[gp]);
109362306a36Sopenharmony_ci		break;
109462306a36Sopenharmony_ci	case RTW89_BAND_5G:
109562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
109662306a36Sopenharmony_ci			       _a_power_range[gp]);
109762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
109862306a36Sopenharmony_ci			       _a_track_range[gp]);
109962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
110062306a36Sopenharmony_ci			       _a_gain_bb[gp]);
110162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
110262306a36Sopenharmony_ci				       MASKDWORD, _a_itqt[gp]);
110362306a36Sopenharmony_ci		break;
110462306a36Sopenharmony_ci	default:
110562306a36Sopenharmony_ci		break;
110662306a36Sopenharmony_ci	}
110762306a36Sopenharmony_ci
110862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1);
110962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x1);
111062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G2, 0x0);
111162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp);
111262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
111362306a36Sopenharmony_ci	kfail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci	if (!kfail)
111662306a36Sopenharmony_ci		iqk_info->nb_txcfir[path] =
111762306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8),
111862306a36Sopenharmony_ci					      MASKDWORD) | 0x2;
111962306a36Sopenharmony_ci	else
112062306a36Sopenharmony_ci		iqk_info->nb_txcfir[path] = 0x40000002;
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_ci	return kfail;
112362306a36Sopenharmony_ci}
112462306a36Sopenharmony_ci
112562306a36Sopenharmony_cistatic void _lok_res_table(struct rtw89_dev *rtwdev, u8 path, u8 ibias)
112662306a36Sopenharmony_ci{
112762306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
112862306a36Sopenharmony_ci
112962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
113062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ibias = %x\n", path, ibias);
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x2);
113362306a36Sopenharmony_ci	if (iqk_info->iqk_band[path] == RTW89_BAND_2G)
113462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x0);
113562306a36Sopenharmony_ci	else
113662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x1);
113762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ibias);
113862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0);
113962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_TXVBUF, RR_TXVBUF_DACEN, 0x1);
114062306a36Sopenharmony_ci
114162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x7c = %x\n", path,
114262306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_TXVBUF, RFREG_MASK));
114362306a36Sopenharmony_ci}
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_cistatic bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path)
114662306a36Sopenharmony_ci{
114762306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
114862306a36Sopenharmony_ci	bool is_fail1, is_fail2;
114962306a36Sopenharmony_ci	u32 vbuff_i;
115062306a36Sopenharmony_ci	u32 vbuff_q;
115162306a36Sopenharmony_ci	u32 core_i;
115262306a36Sopenharmony_ci	u32 core_q;
115362306a36Sopenharmony_ci	u32 tmp;
115462306a36Sopenharmony_ci	u8 ch;
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci	tmp = rtw89_read_rf(rtwdev, path, RR_TXMO, RFREG_MASK);
115762306a36Sopenharmony_ci	core_i = FIELD_GET(RR_TXMO_COI, tmp);
115862306a36Sopenharmony_ci	core_q = FIELD_GET(RR_TXMO_COQ, tmp);
115962306a36Sopenharmony_ci	ch = (iqk_info->iqk_times / 2) % RTW89_IQK_CHS_NR;
116062306a36Sopenharmony_ci
116162306a36Sopenharmony_ci	if (core_i < 0x2 || core_i > 0x1d || core_q < 0x2 || core_q > 0x1d)
116262306a36Sopenharmony_ci		is_fail1 = true;
116362306a36Sopenharmony_ci	else
116462306a36Sopenharmony_ci		is_fail1 = false;
116562306a36Sopenharmony_ci
116662306a36Sopenharmony_ci	iqk_info->lok_idac[ch][path] = tmp;
116762306a36Sopenharmony_ci
116862306a36Sopenharmony_ci	tmp = rtw89_read_rf(rtwdev, path, RR_LOKVB, RFREG_MASK);
116962306a36Sopenharmony_ci	vbuff_i = FIELD_GET(RR_LOKVB_COI, tmp);
117062306a36Sopenharmony_ci	vbuff_q = FIELD_GET(RR_LOKVB_COQ, tmp);
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci	if (vbuff_i < 0x2 || vbuff_i > 0x3d || vbuff_q < 0x2 || vbuff_q > 0x3d)
117362306a36Sopenharmony_ci		is_fail2 = true;
117462306a36Sopenharmony_ci	else
117562306a36Sopenharmony_ci		is_fail2 = false;
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ci	iqk_info->lok_vbuf[ch][path] = tmp;
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
118062306a36Sopenharmony_ci		    "[IQK]S%x, lok_idac[%x][%x] = 0x%x\n", path, ch, path,
118162306a36Sopenharmony_ci		    iqk_info->lok_idac[ch][path]);
118262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
118362306a36Sopenharmony_ci		    "[IQK]S%x, lok_vbuf[%x][%x] = 0x%x\n", path, ch, path,
118462306a36Sopenharmony_ci		    iqk_info->lok_vbuf[ch][path]);
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_ci	return is_fail1 | is_fail2;
118762306a36Sopenharmony_ci}
118862306a36Sopenharmony_ci
118962306a36Sopenharmony_cistatic bool _iqk_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
119062306a36Sopenharmony_ci{
119162306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
119262306a36Sopenharmony_ci	bool tmp;
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
119762306a36Sopenharmony_ci	case RTW89_BAND_2G:
119862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0);
119962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x6);
120062306a36Sopenharmony_ci		break;
120162306a36Sopenharmony_ci	case RTW89_BAND_5G:
120262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0);
120362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x4);
120462306a36Sopenharmony_ci		break;
120562306a36Sopenharmony_ci	default:
120662306a36Sopenharmony_ci		break;
120762306a36Sopenharmony_ci	}
120862306a36Sopenharmony_ci
120962306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
121062306a36Sopenharmony_ci	case RTW89_BAND_2G:
121162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
121262306a36Sopenharmony_ci		break;
121362306a36Sopenharmony_ci	case RTW89_BAND_5G:
121462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
121562306a36Sopenharmony_ci		break;
121662306a36Sopenharmony_ci	default:
121762306a36Sopenharmony_ci		break;
121862306a36Sopenharmony_ci	}
121962306a36Sopenharmony_ci
122062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9);
122162306a36Sopenharmony_ci	tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE);
122262306a36Sopenharmony_ci	iqk_info->lok_cor_fail[0][path] = tmp;
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
122562306a36Sopenharmony_ci	case RTW89_BAND_2G:
122662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
122762306a36Sopenharmony_ci		break;
122862306a36Sopenharmony_ci	case RTW89_BAND_5G:
122962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
123062306a36Sopenharmony_ci		break;
123162306a36Sopenharmony_ci	default:
123262306a36Sopenharmony_ci		break;
123362306a36Sopenharmony_ci	}
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24);
123662306a36Sopenharmony_ci	tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER);
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
123962306a36Sopenharmony_ci	case RTW89_BAND_2G:
124062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
124162306a36Sopenharmony_ci		break;
124262306a36Sopenharmony_ci	case RTW89_BAND_5G:
124362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
124462306a36Sopenharmony_ci		break;
124562306a36Sopenharmony_ci	default:
124662306a36Sopenharmony_ci		break;
124762306a36Sopenharmony_ci	}
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9);
125062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);
125162306a36Sopenharmony_ci	tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE);
125262306a36Sopenharmony_ci	iqk_info->lok_fin_fail[0][path] = tmp;
125362306a36Sopenharmony_ci
125462306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
125562306a36Sopenharmony_ci	case RTW89_BAND_2G:
125662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
125762306a36Sopenharmony_ci		break;
125862306a36Sopenharmony_ci	case RTW89_BAND_5G:
125962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
126062306a36Sopenharmony_ci		break;
126162306a36Sopenharmony_ci	default:
126262306a36Sopenharmony_ci		break;
126362306a36Sopenharmony_ci	}
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24);
126662306a36Sopenharmony_ci	_iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER);
126762306a36Sopenharmony_ci
126862306a36Sopenharmony_ci	return _lok_finetune_check(rtwdev, path);
126962306a36Sopenharmony_ci}
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_cistatic void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path)
127262306a36Sopenharmony_ci{
127362306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	switch (iqk_info->iqk_band[path]) {
127662306a36Sopenharmony_ci	case RTW89_BAND_2G:
127762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_XALNA2, RR_XALNA2_SW2, 0x00);
127862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0);
127962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x0);
128062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1);
128162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0);
128262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
128362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x00);
128462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e);
128562306a36Sopenharmony_ci		udelay(1);
128662306a36Sopenharmony_ci		break;
128762306a36Sopenharmony_ci	case RTW89_BAND_5G:
128862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x00);
128962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x1);
129062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0);
129162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
129262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x80);
129362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e);
129462306a36Sopenharmony_ci		udelay(1);
129562306a36Sopenharmony_ci		break;
129662306a36Sopenharmony_ci	default:
129762306a36Sopenharmony_ci		break;
129862306a36Sopenharmony_ci	}
129962306a36Sopenharmony_ci}
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_cistatic void _iqk_txclk_setting(struct rtw89_dev *rtwdev, u8 path)
130262306a36Sopenharmony_ci{
130362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
130462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
130562306a36Sopenharmony_ci	udelay(1);
130662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f);
130762306a36Sopenharmony_ci	udelay(1);
130862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13);
130962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001);
131062306a36Sopenharmony_ci	udelay(1);
131162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041);
131262306a36Sopenharmony_ci}
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_cistatic void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
131562306a36Sopenharmony_ci{
131662306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
131762306a36Sopenharmony_ci	u32 tmp;
131862306a36Sopenharmony_ci	bool flag;
131962306a36Sopenharmony_ci
132062306a36Sopenharmony_ci	flag = iqk_info->lok_cor_fail[0][path];
132162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FCOR << (path * 4), flag);
132262306a36Sopenharmony_ci	flag = iqk_info->lok_fin_fail[0][path];
132362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FFIN << (path * 4), flag);
132462306a36Sopenharmony_ci	flag = iqk_info->iqk_tx_fail[0][path];
132562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FTX << (path * 4), flag);
132662306a36Sopenharmony_ci	flag = iqk_info->iqk_rx_fail[0][path];
132762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_F_RX << (path * 4), flag);
132862306a36Sopenharmony_ci
132962306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_IQK_RES + (path << 8), MASKDWORD);
133062306a36Sopenharmony_ci	iqk_info->bp_iqkenable[path] = tmp;
133162306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
133262306a36Sopenharmony_ci	iqk_info->bp_txkresult[path] = tmp;
133362306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD);
133462306a36Sopenharmony_ci	iqk_info->bp_rxkresult[path] = tmp;
133562306a36Sopenharmony_ci
133662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_KCNT, iqk_info->iqk_times);
133762306a36Sopenharmony_ci
133862306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, R_IQKINF, B_IQKINF_FAIL << (path * 4));
133962306a36Sopenharmony_ci	if (tmp)
134062306a36Sopenharmony_ci		iqk_info->iqk_fail_cnt++;
134162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_FCNT << (path * 4),
134262306a36Sopenharmony_ci			       iqk_info->iqk_fail_cnt);
134362306a36Sopenharmony_ci}
134462306a36Sopenharmony_ci
134562306a36Sopenharmony_cistatic void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
134662306a36Sopenharmony_ci{
134762306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
134862306a36Sopenharmony_ci	bool lok_is_fail = false;
134962306a36Sopenharmony_ci	const int try = 3;
135062306a36Sopenharmony_ci	u8 ibias = 0x1;
135162306a36Sopenharmony_ci	u8 i;
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci	_iqk_txclk_setting(rtwdev, path);
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_ci	/* LOK */
135662306a36Sopenharmony_ci	for (i = 0; i < try; i++) {
135762306a36Sopenharmony_ci		_lok_res_table(rtwdev, path, ibias++);
135862306a36Sopenharmony_ci		_iqk_txk_setting(rtwdev, path);
135962306a36Sopenharmony_ci		lok_is_fail = _iqk_lok(rtwdev, phy_idx, path);
136062306a36Sopenharmony_ci		if (!lok_is_fail)
136162306a36Sopenharmony_ci			break;
136262306a36Sopenharmony_ci	}
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_ci	if (lok_is_fail)
136562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] LOK (%d) fail\n", path);
136662306a36Sopenharmony_ci
136762306a36Sopenharmony_ci	/* TXK */
136862306a36Sopenharmony_ci	if (iqk_info->is_nbiqk)
136962306a36Sopenharmony_ci		iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path);
137062306a36Sopenharmony_ci	else
137162306a36Sopenharmony_ci		iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path);
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	/* RX */
137462306a36Sopenharmony_ci	_iqk_rxclk_setting(rtwdev, path);
137562306a36Sopenharmony_ci	_iqk_rxk_setting(rtwdev, path);
137662306a36Sopenharmony_ci	if (iqk_info->is_nbiqk)
137762306a36Sopenharmony_ci		iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path);
137862306a36Sopenharmony_ci	else
137962306a36Sopenharmony_ci		iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path);
138062306a36Sopenharmony_ci
138162306a36Sopenharmony_ci	_iqk_info_iqk(rtwdev, phy_idx, path);
138262306a36Sopenharmony_ci}
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_cistatic void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path)
138562306a36Sopenharmony_ci{
138662306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
138762306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
138862306a36Sopenharmony_ci	u32 reg_rf18;
138962306a36Sopenharmony_ci	u32 reg_35c;
139062306a36Sopenharmony_ci	u8 idx;
139162306a36Sopenharmony_ci	u8 get_empty_table = false;
139262306a36Sopenharmony_ci
139362306a36Sopenharmony_ci	for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {
139462306a36Sopenharmony_ci		if (iqk_info->iqk_mcc_ch[idx][path] == 0) {
139562306a36Sopenharmony_ci			get_empty_table = true;
139662306a36Sopenharmony_ci			break;
139762306a36Sopenharmony_ci		}
139862306a36Sopenharmony_ci	}
139962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (1)idx = %x\n", idx);
140062306a36Sopenharmony_ci
140162306a36Sopenharmony_ci	if (!get_empty_table) {
140262306a36Sopenharmony_ci		idx = iqk_info->iqk_table_idx[path] + 1;
140362306a36Sopenharmony_ci		if (idx > 1)
140462306a36Sopenharmony_ci			idx = 0;
140562306a36Sopenharmony_ci	}
140662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (2)idx = %x\n", idx);
140762306a36Sopenharmony_ci
140862306a36Sopenharmony_ci	reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
140962306a36Sopenharmony_ci	reg_35c = rtw89_phy_read32_mask(rtwdev, R_CIRST, B_CIRST_SYN);
141062306a36Sopenharmony_ci
141162306a36Sopenharmony_ci	iqk_info->iqk_band[path] = chan->band_type;
141262306a36Sopenharmony_ci	iqk_info->iqk_bw[path] = chan->band_width;
141362306a36Sopenharmony_ci	iqk_info->iqk_ch[path] = chan->channel;
141462306a36Sopenharmony_ci	iqk_info->iqk_mcc_ch[idx][path] = chan->channel;
141562306a36Sopenharmony_ci	iqk_info->iqk_table_idx[path] = idx;
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x, idx = %x\n",
141862306a36Sopenharmony_ci		    path, reg_rf18, idx);
141962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x\n",
142062306a36Sopenharmony_ci		    path, reg_rf18);
142162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n",
142262306a36Sopenharmony_ci		    iqk_info->iqk_times, idx);
142362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_mcc_ch[%x][%x] = 0x%x\n",
142462306a36Sopenharmony_ci		    idx, path, iqk_info->iqk_mcc_ch[idx][path]);
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	if (reg_35c == 0x01)
142762306a36Sopenharmony_ci		iqk_info->syn1to2 = 0x1;
142862306a36Sopenharmony_ci	else
142962306a36Sopenharmony_ci		iqk_info->syn1to2 = 0x0;
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
143262306a36Sopenharmony_ci		    "[IQK]S%x, iqk_info->syn1to2= 0x%x\n", path,
143362306a36Sopenharmony_ci		    iqk_info->syn1to2);
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_VER, RTW8852B_IQK_VER);
143662306a36Sopenharmony_ci	/* 2GHz/5GHz/6GHz = 0/1/2 */
143762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BAND << (path * 16),
143862306a36Sopenharmony_ci			       iqk_info->iqk_band[path]);
143962306a36Sopenharmony_ci	/* 20/40/80 = 0/1/2 */
144062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BW << (path * 16),
144162306a36Sopenharmony_ci			       iqk_info->iqk_bw[path]);
144262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_CH << (path * 16),
144362306a36Sopenharmony_ci			       iqk_info->iqk_ch[path]);
144462306a36Sopenharmony_ci}
144562306a36Sopenharmony_ci
144662306a36Sopenharmony_cistatic void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
144762306a36Sopenharmony_ci{
144862306a36Sopenharmony_ci	_iqk_by_path(rtwdev, phy_idx, path);
144962306a36Sopenharmony_ci}
145062306a36Sopenharmony_ci
145162306a36Sopenharmony_cistatic void _iqk_restore(struct rtw89_dev *rtwdev, u8 path)
145262306a36Sopenharmony_ci{
145362306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
145462306a36Sopenharmony_ci	bool fail;
145562306a36Sopenharmony_ci
145662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD,
145762306a36Sopenharmony_ci			       iqk_info->nb_txcfir[path]);
145862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD,
145962306a36Sopenharmony_ci			       iqk_info->nb_rxcfir[path]);
146062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD,
146162306a36Sopenharmony_ci			       0x00000e19 + (path << 4));
146262306a36Sopenharmony_ci	fail = _iqk_check_cal(rtwdev, path);
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "%s result =%x\n", __func__, fail);
146562306a36Sopenharmony_ci
146662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
146762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000);
146862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);
146962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS, B_IQK_RES_K, 0x0);
147062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K1, 0x0);
147162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K2, 0x0);
147262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
147362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
147462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0x3);
147562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
147662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1);
147762306a36Sopenharmony_ci}
147862306a36Sopenharmony_ci
147962306a36Sopenharmony_cistatic void _iqk_afebb_restore(struct rtw89_dev *rtwdev,
148062306a36Sopenharmony_ci			       enum rtw89_phy_idx phy_idx, u8 path)
148162306a36Sopenharmony_ci{
148262306a36Sopenharmony_ci	const struct rtw89_reg3_def *def;
148362306a36Sopenharmony_ci	int size;
148462306a36Sopenharmony_ci	u8 kpath;
148562306a36Sopenharmony_ci	int i;
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__);
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci	kpath = _kpath(rtwdev, phy_idx);
149062306a36Sopenharmony_ci
149162306a36Sopenharmony_ci	switch (kpath) {
149262306a36Sopenharmony_ci	case RF_A:
149362306a36Sopenharmony_ci	case RF_B:
149462306a36Sopenharmony_ci		return;
149562306a36Sopenharmony_ci	default:
149662306a36Sopenharmony_ci		size = ARRAY_SIZE(rtw8852b_restore_nondbcc_path01);
149762306a36Sopenharmony_ci		def = rtw8852b_restore_nondbcc_path01;
149862306a36Sopenharmony_ci		break;
149962306a36Sopenharmony_ci	}
150062306a36Sopenharmony_ci
150162306a36Sopenharmony_ci	for (i = 0; i < size; i++, def++)
150262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data);
150362306a36Sopenharmony_ci}
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_cistatic void _iqk_preset(struct rtw89_dev *rtwdev, u8 path)
150662306a36Sopenharmony_ci{
150762306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
150862306a36Sopenharmony_ci	u8 idx;
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_ci	idx = iqk_info->iqk_table_idx[path];
151162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (3)idx = %x\n", idx);
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_IQC, idx);
151462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, idx);
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
151762306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0);
151862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
151962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a);
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x54 = 0x%x\n", path, 1 << path,
152262306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_CFIR_LUT + (path << 8), MASKDWORD));
152362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x04 = 0x%x\n", path, 1 << path,
152462306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_COEF_SEL + (path << 8), MASKDWORD));
152562306a36Sopenharmony_ci}
152662306a36Sopenharmony_ci
152762306a36Sopenharmony_cistatic void _iqk_macbb_setting(struct rtw89_dev *rtwdev,
152862306a36Sopenharmony_ci			       enum rtw89_phy_idx phy_idx, u8 path)
152962306a36Sopenharmony_ci{
153062306a36Sopenharmony_ci	const struct rtw89_reg3_def *def;
153162306a36Sopenharmony_ci	int size;
153262306a36Sopenharmony_ci	u8 kpath;
153362306a36Sopenharmony_ci	int i;
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_ci	kpath = _kpath(rtwdev, phy_idx);
153662306a36Sopenharmony_ci
153762306a36Sopenharmony_ci	switch (kpath) {
153862306a36Sopenharmony_ci	case RF_A:
153962306a36Sopenharmony_ci	case RF_B:
154062306a36Sopenharmony_ci		return;
154162306a36Sopenharmony_ci	default:
154262306a36Sopenharmony_ci		size = ARRAY_SIZE(rtw8852b_set_nondbcc_path01);
154362306a36Sopenharmony_ci		def = rtw8852b_set_nondbcc_path01;
154462306a36Sopenharmony_ci		break;
154562306a36Sopenharmony_ci	}
154662306a36Sopenharmony_ci
154762306a36Sopenharmony_ci	for (i = 0; i < size; i++, def++)
154862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data);
154962306a36Sopenharmony_ci}
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_cistatic void _iqk_init(struct rtw89_dev *rtwdev)
155262306a36Sopenharmony_ci{
155362306a36Sopenharmony_ci	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
155462306a36Sopenharmony_ci	u8 idx, path;
155562306a36Sopenharmony_ci
155662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQKINF, MASKDWORD, 0x0);
155762306a36Sopenharmony_ci	if (iqk_info->is_iqk_init)
155862306a36Sopenharmony_ci		return;
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
156162306a36Sopenharmony_ci	iqk_info->is_iqk_init = true;
156262306a36Sopenharmony_ci	iqk_info->is_nbiqk = false;
156362306a36Sopenharmony_ci	iqk_info->iqk_fft_en = false;
156462306a36Sopenharmony_ci	iqk_info->iqk_sram_en = false;
156562306a36Sopenharmony_ci	iqk_info->iqk_cfir_en = false;
156662306a36Sopenharmony_ci	iqk_info->iqk_xym_en = false;
156762306a36Sopenharmony_ci	iqk_info->iqk_times = 0x0;
156862306a36Sopenharmony_ci
156962306a36Sopenharmony_ci	for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {
157062306a36Sopenharmony_ci		iqk_info->iqk_channel[idx] = 0x0;
157162306a36Sopenharmony_ci		for (path = 0; path < RTW8852B_IQK_SS; path++) {
157262306a36Sopenharmony_ci			iqk_info->lok_cor_fail[idx][path] = false;
157362306a36Sopenharmony_ci			iqk_info->lok_fin_fail[idx][path] = false;
157462306a36Sopenharmony_ci			iqk_info->iqk_tx_fail[idx][path] = false;
157562306a36Sopenharmony_ci			iqk_info->iqk_rx_fail[idx][path] = false;
157662306a36Sopenharmony_ci			iqk_info->iqk_mcc_ch[idx][path] = 0x0;
157762306a36Sopenharmony_ci			iqk_info->iqk_table_idx[path] = 0x0;
157862306a36Sopenharmony_ci		}
157962306a36Sopenharmony_ci	}
158062306a36Sopenharmony_ci}
158162306a36Sopenharmony_ci
158262306a36Sopenharmony_cistatic void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
158362306a36Sopenharmony_ci{
158462306a36Sopenharmony_ci	u32 rf_mode;
158562306a36Sopenharmony_ci	u8 path;
158662306a36Sopenharmony_ci	int ret;
158762306a36Sopenharmony_ci
158862306a36Sopenharmony_ci	for (path = 0; path < RF_PATH_MAX; path++) {
158962306a36Sopenharmony_ci		if (!(kpath & BIT(path)))
159062306a36Sopenharmony_ci			continue;
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_ci		ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode,
159362306a36Sopenharmony_ci					       rf_mode != 2, 2, 5000, false,
159462306a36Sopenharmony_ci					       rtwdev, path, RR_MOD, RR_MOD_MASK);
159562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
159662306a36Sopenharmony_ci			    "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", path, ret);
159762306a36Sopenharmony_ci	}
159862306a36Sopenharmony_ci}
159962306a36Sopenharmony_ci
160062306a36Sopenharmony_cistatic void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx,
160162306a36Sopenharmony_ci			   bool is_pause)
160262306a36Sopenharmony_ci{
160362306a36Sopenharmony_ci	if (!is_pause)
160462306a36Sopenharmony_ci		return;
160562306a36Sopenharmony_ci
160662306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, band_idx));
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[RTW8852B_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 = RTW8852B_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
162762306a36Sopenharmony_ci	_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
162862306a36Sopenharmony_ci	_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
162962306a36Sopenharmony_ci	_iqk_macbb_setting(rtwdev, phy_idx, path);
163062306a36Sopenharmony_ci	_iqk_preset(rtwdev, path);
163162306a36Sopenharmony_ci	_iqk_start_iqk(rtwdev, phy_idx, path);
163262306a36Sopenharmony_ci	_iqk_restore(rtwdev, path);
163362306a36Sopenharmony_ci	_iqk_afebb_restore(rtwdev, phy_idx, path);
163462306a36Sopenharmony_ci	_rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
163562306a36Sopenharmony_ci	_rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path);
163662306a36Sopenharmony_ci
163762306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
163862306a36Sopenharmony_ci}
163962306a36Sopenharmony_ci
164062306a36Sopenharmony_cistatic void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
164162306a36Sopenharmony_ci{
164262306a36Sopenharmony_ci	u8 kpath = _kpath(rtwdev, phy_idx);
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_ci	switch (kpath) {
164562306a36Sopenharmony_ci	case RF_A:
164662306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
164762306a36Sopenharmony_ci		break;
164862306a36Sopenharmony_ci	case RF_B:
164962306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
165062306a36Sopenharmony_ci		break;
165162306a36Sopenharmony_ci	case RF_AB:
165262306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
165362306a36Sopenharmony_ci		_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
165462306a36Sopenharmony_ci		break;
165562306a36Sopenharmony_ci	default:
165662306a36Sopenharmony_ci		break;
165762306a36Sopenharmony_ci	}
165862306a36Sopenharmony_ci}
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_cistatic void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 reg[],
166162306a36Sopenharmony_ci			  u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path)
166262306a36Sopenharmony_ci{
166362306a36Sopenharmony_ci	u8 i;
166462306a36Sopenharmony_ci
166562306a36Sopenharmony_ci	for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) {
166662306a36Sopenharmony_ci		reg_bkup[path][i] =
166762306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD);
166862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n",
166962306a36Sopenharmony_ci			    reg[i] + (path << 8), reg_bkup[path][i]);
167062306a36Sopenharmony_ci	}
167162306a36Sopenharmony_ci}
167262306a36Sopenharmony_ci
167362306a36Sopenharmony_cistatic void _dpk_reload_kip(struct rtw89_dev *rtwdev, const u32 reg[],
167462306a36Sopenharmony_ci			    const u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path)
167562306a36Sopenharmony_ci{
167662306a36Sopenharmony_ci	u8 i;
167762306a36Sopenharmony_ci
167862306a36Sopenharmony_ci	for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) {
167962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD,
168062306a36Sopenharmony_ci				       reg_bkup[path][i]);
168162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Reload 0x%x = %x\n",
168262306a36Sopenharmony_ci			    reg[i] + (path << 8), reg_bkup[path][i]);
168362306a36Sopenharmony_ci	}
168462306a36Sopenharmony_ci}
168562306a36Sopenharmony_ci
168662306a36Sopenharmony_cistatic u8 _dpk_order_convert(struct rtw89_dev *rtwdev)
168762306a36Sopenharmony_ci{
168862306a36Sopenharmony_ci	u8 order;
168962306a36Sopenharmony_ci	u8 val;
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci	order = rtw89_phy_read32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP);
169262306a36Sopenharmony_ci	val = 0x3 >> order;
169362306a36Sopenharmony_ci
169462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] convert MDPD order to 0x%x\n", val);
169562306a36Sopenharmony_ci
169662306a36Sopenharmony_ci	return val;
169762306a36Sopenharmony_ci}
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool off)
170062306a36Sopenharmony_ci{
170162306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
170262306a36Sopenharmony_ci	u8 val, kidx = dpk->cur_idx[path];
170362306a36Sopenharmony_ci
170462306a36Sopenharmony_ci	val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok;
170562306a36Sopenharmony_ci
170662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
170762306a36Sopenharmony_ci			       MASKBYTE3, _dpk_order_convert(rtwdev) << 1 | val);
170862306a36Sopenharmony_ci
170962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path,
171062306a36Sopenharmony_ci		    kidx, dpk->is_dpk_enable && !off ? "enable" : "disable");
171162306a36Sopenharmony_ci}
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_cistatic void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
171462306a36Sopenharmony_ci			  enum rtw89_rf_path path, enum rtw8852b_dpk_id id)
171562306a36Sopenharmony_ci{
171662306a36Sopenharmony_ci	u16 dpk_cmd;
171762306a36Sopenharmony_ci	u32 val;
171862306a36Sopenharmony_ci	int ret;
171962306a36Sopenharmony_ci
172062306a36Sopenharmony_ci	dpk_cmd = (id << 8) | (0x19 + (path << 4));
172162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd);
172262306a36Sopenharmony_ci
172362306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
172462306a36Sopenharmony_ci				       1, 20000, false,
172562306a36Sopenharmony_ci				       rtwdev, 0xbff8, MASKBYTE0);
172662306a36Sopenharmony_ci	if (ret)
172762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n");
172862306a36Sopenharmony_ci
172962306a36Sopenharmony_ci	udelay(1);
173062306a36Sopenharmony_ci
173162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00030000);
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000,
173462306a36Sopenharmony_ci				       1, 2000, false,
173562306a36Sopenharmony_ci				       rtwdev, 0x80fc, MASKLWORD);
173662306a36Sopenharmony_ci	if (ret)
173762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n");
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);
174062306a36Sopenharmony_ci
174162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
174262306a36Sopenharmony_ci		    "[DPK] one-shot for %s = 0x%x\n",
174362306a36Sopenharmony_ci		    id == 0x06 ? "LBK_RXIQK" :
174462306a36Sopenharmony_ci		    id == 0x10 ? "SYNC" :
174562306a36Sopenharmony_ci		    id == 0x11 ? "MDPK_IDL" :
174662306a36Sopenharmony_ci		    id == 0x12 ? "MDPK_MPA" :
174762306a36Sopenharmony_ci		    id == 0x13 ? "GAIN_LOSS" :
174862306a36Sopenharmony_ci		    id == 0x14 ? "PWR_CAL" :
174962306a36Sopenharmony_ci		    id == 0x15 ? "DPK_RXAGC" :
175062306a36Sopenharmony_ci		    id == 0x16 ? "KIP_PRESET" :
175162306a36Sopenharmony_ci		    id == 0x17 ? "KIP_RESTORE" : "DPK_TXAGC",
175262306a36Sopenharmony_ci		    dpk_cmd);
175362306a36Sopenharmony_ci}
175462306a36Sopenharmony_ci
175562306a36Sopenharmony_cistatic void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
175662306a36Sopenharmony_ci			enum rtw89_rf_path path)
175762306a36Sopenharmony_ci{
175862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_EN_TIA_IDA, 0x3);
175962306a36Sopenharmony_ci	_set_rx_dck(rtwdev, phy, path);
176062306a36Sopenharmony_ci}
176162306a36Sopenharmony_ci
176262306a36Sopenharmony_cistatic void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
176362306a36Sopenharmony_ci			     enum rtw89_rf_path path)
176462306a36Sopenharmony_ci{
176562306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
176662306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
176762306a36Sopenharmony_ci
176862306a36Sopenharmony_ci	u8 kidx = dpk->cur_idx[path];
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci	dpk->bp[path][kidx].band = chan->band_type;
177162306a36Sopenharmony_ci	dpk->bp[path][kidx].ch = chan->channel;
177262306a36Sopenharmony_ci	dpk->bp[path][kidx].bw = chan->band_width;
177362306a36Sopenharmony_ci
177462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
177562306a36Sopenharmony_ci		    "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n",
177662306a36Sopenharmony_ci		    path, dpk->cur_idx[path], phy,
177762306a36Sopenharmony_ci		    rtwdev->is_tssi_mode[path] ? "on" : "off",
177862306a36Sopenharmony_ci		    rtwdev->dbcc_en ? "on" : "off",
177962306a36Sopenharmony_ci		    dpk->bp[path][kidx].band == 0 ? "2G" :
178062306a36Sopenharmony_ci		    dpk->bp[path][kidx].band == 1 ? "5G" : "6G",
178162306a36Sopenharmony_ci		    dpk->bp[path][kidx].ch,
178262306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == 0 ? "20M" :
178362306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == 1 ? "40M" : "80M");
178462306a36Sopenharmony_ci}
178562306a36Sopenharmony_ci
178662306a36Sopenharmony_cistatic void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev,
178762306a36Sopenharmony_ci				enum rtw89_phy_idx phy,
178862306a36Sopenharmony_ci				enum rtw89_rf_path path, u8 kpath)
178962306a36Sopenharmony_ci{
179062306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_defs_tbl);
179362306a36Sopenharmony_ci
179462306a36Sopenharmony_ci	if (chan->band_width == RTW89_CHANNEL_WIDTH_80) {
179562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x1);
179662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, B_PATH1_BW_SEL_EX, 0x1);
179762306a36Sopenharmony_ci	}
179862306a36Sopenharmony_ci
179962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
180062306a36Sopenharmony_ci		    "[DPK] Set BB/AFE for PHY%d (kpath=%d)\n", phy, kpath);
180162306a36Sopenharmony_ci}
180262306a36Sopenharmony_ci
180362306a36Sopenharmony_cistatic void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev,
180462306a36Sopenharmony_ci				enum rtw89_phy_idx phy,
180562306a36Sopenharmony_ci				enum rtw89_rf_path path, u8 kpath)
180662306a36Sopenharmony_ci{
180762306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
180862306a36Sopenharmony_ci
180962306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_restore_defs_tbl);
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
181262306a36Sopenharmony_ci		    "[DPK] Restore BB/AFE for PHY%d (kpath=%d)\n", phy, kpath);
181362306a36Sopenharmony_ci
181462306a36Sopenharmony_ci	if (chan->band_width == RTW89_CHANNEL_WIDTH_80) {
181562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x0);
181662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1,  B_PATH1_BW_SEL_EX, 0x0);
181762306a36Sopenharmony_ci	}
181862306a36Sopenharmony_ci}
181962306a36Sopenharmony_ci
182062306a36Sopenharmony_cistatic void _dpk_tssi_pause(struct rtw89_dev *rtwdev,
182162306a36Sopenharmony_ci			    enum rtw89_rf_path path, bool is_pause)
182262306a36Sopenharmony_ci{
182362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13),
182462306a36Sopenharmony_ci			       B_P0_TSSI_TRK_EN, is_pause);
182562306a36Sopenharmony_ci
182662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path,
182762306a36Sopenharmony_ci		    is_pause ? "pause" : "resume");
182862306a36Sopenharmony_ci}
182962306a36Sopenharmony_ci
183062306a36Sopenharmony_cistatic void _dpk_kip_restore(struct rtw89_dev *rtwdev,
183162306a36Sopenharmony_ci			     enum rtw89_rf_path path)
183262306a36Sopenharmony_ci{
183362306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_kip_defs_tbl);
183462306a36Sopenharmony_ci
183562306a36Sopenharmony_ci	if (rtwdev->hal.cv > CHIP_CAV)
183662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8), B_DPD_COM_OF, 0x1);
183762306a36Sopenharmony_ci
183862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path);
183962306a36Sopenharmony_ci}
184062306a36Sopenharmony_ci
184162306a36Sopenharmony_cistatic void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
184262306a36Sopenharmony_ci			   enum rtw89_rf_path path)
184362306a36Sopenharmony_ci{
184462306a36Sopenharmony_ci	u8 cur_rxbb;
184562306a36Sopenharmony_ci	u32 tmp;
184662306a36Sopenharmony_ci
184762306a36Sopenharmony_ci	cur_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB);
184862306a36Sopenharmony_ci
184962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1);
185062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR, 0x0);
185162306a36Sopenharmony_ci
185262306a36Sopenharmony_ci	tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
185362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp);
185462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0xd);
185562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1);
185662306a36Sopenharmony_ci
185762306a36Sopenharmony_ci	if (cur_rxbb >= 0x11)
185862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x13);
185962306a36Sopenharmony_ci	else if (cur_rxbb <= 0xa)
186062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x00);
186162306a36Sopenharmony_ci	else
186262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x05);
186362306a36Sopenharmony_ci
186462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x0);
186562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
186662306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80014);
186762306a36Sopenharmony_ci	udelay(70);
186862306a36Sopenharmony_ci
186962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
187062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x025);
187162306a36Sopenharmony_ci
187262306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, LBK_RXIQK);
187362306a36Sopenharmony_ci
187462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path,
187562306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD));
187662306a36Sopenharmony_ci
187762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
187862306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0);
187962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0);
188062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0);
188162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1);
188262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0x5);
188362306a36Sopenharmony_ci}
188462306a36Sopenharmony_ci
188562306a36Sopenharmony_cistatic void _dpk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx, enum rtw89_rf_path path)
188662306a36Sopenharmony_ci{
188762306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
188862306a36Sopenharmony_ci
188962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1);
189062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x0);
189162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1);
189262306a36Sopenharmony_ci
189362306a36Sopenharmony_ci	udelay(200);
189462306a36Sopenharmony_ci
189562306a36Sopenharmony_ci	dpk->bp[path][kidx].ther_dpk = rtw89_read_rf(rtwdev, path, RR_TM, RR_TM_VAL);
189662306a36Sopenharmony_ci
189762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n",
189862306a36Sopenharmony_ci		    dpk->bp[path][kidx].ther_dpk);
189962306a36Sopenharmony_ci}
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_cistatic void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain,
190262306a36Sopenharmony_ci			    enum rtw89_rf_path path, u8 kidx)
190362306a36Sopenharmony_ci{
190462306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
190562306a36Sopenharmony_ci
190662306a36Sopenharmony_ci	if (dpk->bp[path][kidx].band == RTW89_BAND_2G) {
190762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220);
190862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_FATT, 0xf2);
190962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1);
191062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1);
191162306a36Sopenharmony_ci	} else {
191262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220);
191362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SWATT, 0x5);
191462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1);
191562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1);
191662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_RXA_LNA, RFREG_MASK, 0x920FC);
191762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_XALNA2, RFREG_MASK, 0x002C0);
191862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_IQGEN, RFREG_MASK, 0x38800);
191962306a36Sopenharmony_ci	}
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1);
192262306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1);
192362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0);
192462306a36Sopenharmony_ci
192562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
192662306a36Sopenharmony_ci		    "[DPK] ARF 0x0/0x11/0x1a = 0x%x/ 0x%x/ 0x%x\n",
192762306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK),
192862306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_TXIG, RFREG_MASK),
192962306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_BTC, RFREG_MASK));
193062306a36Sopenharmony_ci}
193162306a36Sopenharmony_ci
193262306a36Sopenharmony_cistatic void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev,
193362306a36Sopenharmony_ci			       enum rtw89_rf_path path, bool is_bypass)
193462306a36Sopenharmony_ci{
193562306a36Sopenharmony_ci	if (is_bypass) {
193662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
193762306a36Sopenharmony_ci				       B_RXIQC_BYPASS2, 0x1);
193862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
193962306a36Sopenharmony_ci				       B_RXIQC_BYPASS, 0x1);
194062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
194162306a36Sopenharmony_ci			    "[DPK] Bypass RXIQC (0x8%d3c = 0x%x)\n", 1 + path,
194262306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
194362306a36Sopenharmony_ci						  MASKDWORD));
194462306a36Sopenharmony_ci	} else {
194562306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS2);
194662306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS);
194762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
194862306a36Sopenharmony_ci			    "[DPK] restore 0x8%d3c = 0x%x\n", 1 + path,
194962306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
195062306a36Sopenharmony_ci						  MASKDWORD));
195162306a36Sopenharmony_ci	}
195262306a36Sopenharmony_ci}
195362306a36Sopenharmony_ci
195462306a36Sopenharmony_cistatic
195562306a36Sopenharmony_civoid _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)
195662306a36Sopenharmony_ci{
195762306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
195862306a36Sopenharmony_ci
195962306a36Sopenharmony_ci	if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80)
196062306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_TPG_MOD, B_TPG_MOD_F);
196162306a36Sopenharmony_ci	else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40)
196262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2);
196362306a36Sopenharmony_ci	else
196462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1);
196562306a36Sopenharmony_ci
196662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n",
196762306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" :
196862306a36Sopenharmony_ci		    dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M");
196962306a36Sopenharmony_ci}
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_cistatic void _dpk_table_select(struct rtw89_dev *rtwdev,
197262306a36Sopenharmony_ci			      enum rtw89_rf_path path, u8 kidx, u8 gain)
197362306a36Sopenharmony_ci{
197462306a36Sopenharmony_ci	u8 val;
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci	val = 0x80 + kidx * 0x20 + gain * 0x10;
197762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val);
197862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
197962306a36Sopenharmony_ci		    "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx,
198062306a36Sopenharmony_ci		    gain, val);
198162306a36Sopenharmony_ci}
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_cistatic bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)
198462306a36Sopenharmony_ci{
198562306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_I 200
198662306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_Q 200
198762306a36Sopenharmony_ci#define DPK_SYNC_TH_CORR 170
198862306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
198962306a36Sopenharmony_ci	u16 dc_i, dc_q;
199062306a36Sopenharmony_ci	u8 corr_val, corr_idx;
199162306a36Sopenharmony_ci
199262306a36Sopenharmony_ci	rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL);
199362306a36Sopenharmony_ci
199462306a36Sopenharmony_ci	corr_idx = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI);
199562306a36Sopenharmony_ci	corr_val = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV);
199662306a36Sopenharmony_ci
199762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
199862306a36Sopenharmony_ci		    "[DPK] S%d Corr_idx / Corr_val = %d / %d\n",
199962306a36Sopenharmony_ci		    path, corr_idx, corr_val);
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci	dpk->corr_idx[path][kidx] = corr_idx;
200262306a36Sopenharmony_ci	dpk->corr_val[path][kidx] = corr_val;
200362306a36Sopenharmony_ci
200462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9);
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_ci	dc_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
200762306a36Sopenharmony_ci	dc_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ);
200862306a36Sopenharmony_ci
200962306a36Sopenharmony_ci	dc_i = abs(sign_extend32(dc_i, 11));
201062306a36Sopenharmony_ci	dc_q = abs(sign_extend32(dc_q, 11));
201162306a36Sopenharmony_ci
201262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n",
201362306a36Sopenharmony_ci		    path, dc_i, dc_q);
201462306a36Sopenharmony_ci
201562306a36Sopenharmony_ci	dpk->dc_i[path][kidx] = dc_i;
201662306a36Sopenharmony_ci	dpk->dc_q[path][kidx] = dc_q;
201762306a36Sopenharmony_ci
201862306a36Sopenharmony_ci	if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q ||
201962306a36Sopenharmony_ci	    corr_val < DPK_SYNC_TH_CORR)
202062306a36Sopenharmony_ci		return true;
202162306a36Sopenharmony_ci	else
202262306a36Sopenharmony_ci		return false;
202362306a36Sopenharmony_ci}
202462306a36Sopenharmony_ci
202562306a36Sopenharmony_cistatic bool _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
202662306a36Sopenharmony_ci		      enum rtw89_rf_path path, u8 kidx)
202762306a36Sopenharmony_ci{
202862306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, SYNC);
202962306a36Sopenharmony_ci
203062306a36Sopenharmony_ci	return _dpk_sync_check(rtwdev, path, kidx);
203162306a36Sopenharmony_ci}
203262306a36Sopenharmony_ci
203362306a36Sopenharmony_cistatic u16 _dpk_dgain_read(struct rtw89_dev *rtwdev)
203462306a36Sopenharmony_ci{
203562306a36Sopenharmony_ci	u16 dgain;
203662306a36Sopenharmony_ci
203762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0);
203862306a36Sopenharmony_ci
203962306a36Sopenharmony_ci	dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
204062306a36Sopenharmony_ci
204162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain);
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_ci	return dgain;
204462306a36Sopenharmony_ci}
204562306a36Sopenharmony_ci
204662306a36Sopenharmony_cistatic s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain)
204762306a36Sopenharmony_ci{
204862306a36Sopenharmony_ci	static const u16 bnd[15] = {
204962306a36Sopenharmony_ci		0xbf1, 0xaa5, 0x97d, 0x875, 0x789, 0x6b7, 0x5fc, 0x556,
205062306a36Sopenharmony_ci		0x4c1, 0x43d, 0x3c7, 0x35e, 0x2ac, 0x262, 0x220
205162306a36Sopenharmony_ci	};
205262306a36Sopenharmony_ci	s8 offset;
205362306a36Sopenharmony_ci
205462306a36Sopenharmony_ci	if (dgain >= bnd[0])
205562306a36Sopenharmony_ci		offset = 0x6;
205662306a36Sopenharmony_ci	else if (bnd[0] > dgain && dgain >= bnd[1])
205762306a36Sopenharmony_ci		offset = 0x6;
205862306a36Sopenharmony_ci	else if (bnd[1] > dgain && dgain >= bnd[2])
205962306a36Sopenharmony_ci		offset = 0x5;
206062306a36Sopenharmony_ci	else if (bnd[2] > dgain && dgain >= bnd[3])
206162306a36Sopenharmony_ci		offset = 0x4;
206262306a36Sopenharmony_ci	else if (bnd[3] > dgain && dgain >= bnd[4])
206362306a36Sopenharmony_ci		offset = 0x3;
206462306a36Sopenharmony_ci	else if (bnd[4] > dgain && dgain >= bnd[5])
206562306a36Sopenharmony_ci		offset = 0x2;
206662306a36Sopenharmony_ci	else if (bnd[5] > dgain && dgain >= bnd[6])
206762306a36Sopenharmony_ci		offset = 0x1;
206862306a36Sopenharmony_ci	else if (bnd[6] > dgain && dgain >= bnd[7])
206962306a36Sopenharmony_ci		offset = 0x0;
207062306a36Sopenharmony_ci	else if (bnd[7] > dgain && dgain >= bnd[8])
207162306a36Sopenharmony_ci		offset = 0xff;
207262306a36Sopenharmony_ci	else if (bnd[8] > dgain && dgain >= bnd[9])
207362306a36Sopenharmony_ci		offset = 0xfe;
207462306a36Sopenharmony_ci	else if (bnd[9] > dgain && dgain >= bnd[10])
207562306a36Sopenharmony_ci		offset = 0xfd;
207662306a36Sopenharmony_ci	else if (bnd[10] > dgain && dgain >= bnd[11])
207762306a36Sopenharmony_ci		offset = 0xfc;
207862306a36Sopenharmony_ci	else if (bnd[11] > dgain && dgain >= bnd[12])
207962306a36Sopenharmony_ci		offset = 0xfb;
208062306a36Sopenharmony_ci	else if (bnd[12] > dgain && dgain >= bnd[13])
208162306a36Sopenharmony_ci		offset = 0xfa;
208262306a36Sopenharmony_ci	else if (bnd[13] > dgain && dgain >= bnd[14])
208362306a36Sopenharmony_ci		offset = 0xf9;
208462306a36Sopenharmony_ci	else if (bnd[14] > dgain)
208562306a36Sopenharmony_ci		offset = 0xf8;
208662306a36Sopenharmony_ci	else
208762306a36Sopenharmony_ci		offset = 0x0;
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain offset = %d\n", offset);
209062306a36Sopenharmony_ci
209162306a36Sopenharmony_ci	return offset;
209262306a36Sopenharmony_ci}
209362306a36Sopenharmony_ci
209462306a36Sopenharmony_cistatic u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev)
209562306a36Sopenharmony_ci{
209662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6);
209762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1);
209862306a36Sopenharmony_ci
209962306a36Sopenharmony_ci	return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL);
210062306a36Sopenharmony_ci}
210162306a36Sopenharmony_ci
210262306a36Sopenharmony_cistatic void _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
210362306a36Sopenharmony_ci			  enum rtw89_rf_path path, u8 kidx)
210462306a36Sopenharmony_ci{
210562306a36Sopenharmony_ci	_dpk_table_select(rtwdev, path, kidx, 1);
210662306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, GAIN_LOSS);
210762306a36Sopenharmony_ci}
210862306a36Sopenharmony_ci
210962306a36Sopenharmony_cistatic void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
211062306a36Sopenharmony_ci			    enum rtw89_rf_path path, u8 kidx)
211162306a36Sopenharmony_ci{
211262306a36Sopenharmony_ci	_dpk_tpg_sel(rtwdev, path, kidx);
211362306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, KIP_PRESET);
211462306a36Sopenharmony_ci}
211562306a36Sopenharmony_ci
211662306a36Sopenharmony_cistatic void _dpk_kip_pwr_clk_on(struct rtw89_dev *rtwdev,
211762306a36Sopenharmony_ci				enum rtw89_rf_path path)
211862306a36Sopenharmony_ci{
211962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
212062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a);
212162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08);
212262306a36Sopenharmony_ci
212362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP Power/CLK on\n");
212462306a36Sopenharmony_ci}
212562306a36Sopenharmony_ci
212662306a36Sopenharmony_cistatic void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
212762306a36Sopenharmony_ci			       enum rtw89_rf_path path, u8 txagc)
212862306a36Sopenharmony_ci{
212962306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_TXAGC, RFREG_MASK, txagc);
213062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
213162306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, DPK_TXAGC);
213262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] set TXAGC = 0x%x\n", txagc);
213562306a36Sopenharmony_ci}
213662306a36Sopenharmony_ci
213762306a36Sopenharmony_cistatic void _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
213862306a36Sopenharmony_ci			       enum rtw89_rf_path path)
213962306a36Sopenharmony_ci{
214062306a36Sopenharmony_ci	u32 tmp;
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_ci	tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);
214362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, tmp);
214462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
214562306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, DPK_RXAGC);
214662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
214762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL_V1, 0x8);
214862306a36Sopenharmony_ci
214962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
215062306a36Sopenharmony_ci		    "[DPK] set RXBB = 0x%x (RF0x0[9:5] = 0x%x)\n",
215162306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXBB_V1),
215262306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB));
215362306a36Sopenharmony_ci}
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_cistatic u8 _dpk_set_offset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
215662306a36Sopenharmony_ci			  enum rtw89_rf_path path, s8 gain_offset)
215762306a36Sopenharmony_ci{
215862306a36Sopenharmony_ci	u8 txagc;
215962306a36Sopenharmony_ci
216062306a36Sopenharmony_ci	txagc = rtw89_read_rf(rtwdev, path, RR_TXAGC, RFREG_MASK);
216162306a36Sopenharmony_ci
216262306a36Sopenharmony_ci	if (txagc - gain_offset < DPK_TXAGC_LOWER)
216362306a36Sopenharmony_ci		txagc = DPK_TXAGC_LOWER;
216462306a36Sopenharmony_ci	else if (txagc - gain_offset > DPK_TXAGC_UPPER)
216562306a36Sopenharmony_ci		txagc = DPK_TXAGC_UPPER;
216662306a36Sopenharmony_ci	else
216762306a36Sopenharmony_ci		txagc = txagc - gain_offset;
216862306a36Sopenharmony_ci
216962306a36Sopenharmony_ci	_dpk_kip_set_txagc(rtwdev, phy, path, txagc);
217062306a36Sopenharmony_ci
217162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n",
217262306a36Sopenharmony_ci		    gain_offset, txagc);
217362306a36Sopenharmony_ci	return txagc;
217462306a36Sopenharmony_ci}
217562306a36Sopenharmony_ci
217662306a36Sopenharmony_cistatic bool _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check)
217762306a36Sopenharmony_ci{
217862306a36Sopenharmony_ci	u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0;
217962306a36Sopenharmony_ci	u8 i;
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06);
218262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0);
218362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08);
218462306a36Sopenharmony_ci
218562306a36Sopenharmony_ci	if (is_check) {
218662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00);
218762306a36Sopenharmony_ci		val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
218862306a36Sopenharmony_ci		val1_i = abs(sign_extend32(val1_i, 11));
218962306a36Sopenharmony_ci		val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
219062306a36Sopenharmony_ci		val1_q = abs(sign_extend32(val1_q, 11));
219162306a36Sopenharmony_ci
219262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f);
219362306a36Sopenharmony_ci		val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
219462306a36Sopenharmony_ci		val2_i = abs(sign_extend32(val2_i, 11));
219562306a36Sopenharmony_ci		val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
219662306a36Sopenharmony_ci		val2_q = abs(sign_extend32(val2_q, 11));
219762306a36Sopenharmony_ci
219862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n",
219962306a36Sopenharmony_ci			    phy_div(val1_i * val1_i + val1_q * val1_q,
220062306a36Sopenharmony_ci				    val2_i * val2_i + val2_q * val2_q));
220162306a36Sopenharmony_ci	} else {
220262306a36Sopenharmony_ci		for (i = 0; i < 32; i++) {
220362306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i);
220462306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK,
220562306a36Sopenharmony_ci				    "[DPK] PAS_Read[%02d]= 0x%08x\n", i,
220662306a36Sopenharmony_ci				    rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD));
220762306a36Sopenharmony_ci		}
220862306a36Sopenharmony_ci	}
220962306a36Sopenharmony_ci
221062306a36Sopenharmony_ci	if (val1_i * val1_i + val1_q * val1_q >=
221162306a36Sopenharmony_ci	    (val2_i * val2_i + val2_q * val2_q) * 8 / 5)
221262306a36Sopenharmony_ci		return true;
221362306a36Sopenharmony_ci
221462306a36Sopenharmony_ci	return false;
221562306a36Sopenharmony_ci}
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_cistatic u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
221862306a36Sopenharmony_ci		   enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
221962306a36Sopenharmony_ci		   bool loss_only)
222062306a36Sopenharmony_ci{
222162306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
222262306a36Sopenharmony_ci	u8 step = DPK_AGC_STEP_SYNC_DGAIN;
222362306a36Sopenharmony_ci	u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0;
222462306a36Sopenharmony_ci	u8 goout = 0, agc_cnt = 0, limited_rxbb = 0;
222562306a36Sopenharmony_ci	u16 dgain = 0;
222662306a36Sopenharmony_ci	s8 offset;
222762306a36Sopenharmony_ci	int limit = 200;
222862306a36Sopenharmony_ci
222962306a36Sopenharmony_ci	tmp_txagc = init_txagc;
223062306a36Sopenharmony_ci
223162306a36Sopenharmony_ci	do {
223262306a36Sopenharmony_ci		switch (step) {
223362306a36Sopenharmony_ci		case DPK_AGC_STEP_SYNC_DGAIN:
223462306a36Sopenharmony_ci			if (_dpk_sync(rtwdev, phy, path, kidx)) {
223562306a36Sopenharmony_ci				tmp_txagc = 0xff;
223662306a36Sopenharmony_ci				goout = 1;
223762306a36Sopenharmony_ci				break;
223862306a36Sopenharmony_ci			}
223962306a36Sopenharmony_ci
224062306a36Sopenharmony_ci			dgain = _dpk_dgain_read(rtwdev);
224162306a36Sopenharmony_ci
224262306a36Sopenharmony_ci			if (loss_only == 1 || limited_rxbb == 1)
224362306a36Sopenharmony_ci				step = DPK_AGC_STEP_GAIN_LOSS_IDX;
224462306a36Sopenharmony_ci			else
224562306a36Sopenharmony_ci				step = DPK_AGC_STEP_GAIN_ADJ;
224662306a36Sopenharmony_ci			break;
224762306a36Sopenharmony_ci
224862306a36Sopenharmony_ci		case DPK_AGC_STEP_GAIN_ADJ:
224962306a36Sopenharmony_ci			tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD,
225062306a36Sopenharmony_ci						 RFREG_MASKRXBB);
225162306a36Sopenharmony_ci			offset = _dpk_dgain_mapping(rtwdev, dgain);
225262306a36Sopenharmony_ci
225362306a36Sopenharmony_ci			if (tmp_rxbb + offset > 0x1f) {
225462306a36Sopenharmony_ci				tmp_rxbb = 0x1f;
225562306a36Sopenharmony_ci				limited_rxbb = 1;
225662306a36Sopenharmony_ci			} else if (tmp_rxbb + offset < 0) {
225762306a36Sopenharmony_ci				tmp_rxbb = 0;
225862306a36Sopenharmony_ci				limited_rxbb = 1;
225962306a36Sopenharmony_ci			} else {
226062306a36Sopenharmony_ci				tmp_rxbb = tmp_rxbb + offset;
226162306a36Sopenharmony_ci			}
226262306a36Sopenharmony_ci
226362306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB,
226462306a36Sopenharmony_ci				       tmp_rxbb);
226562306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK,
226662306a36Sopenharmony_ci				    "[DPK] Adjust RXBB (%d) = 0x%x\n", offset, tmp_rxbb);
226762306a36Sopenharmony_ci			if (offset || agc_cnt == 0) {
226862306a36Sopenharmony_ci				if (chan->band_width < RTW89_CHANNEL_WIDTH_80)
226962306a36Sopenharmony_ci					_dpk_bypass_rxcfir(rtwdev, path, true);
227062306a36Sopenharmony_ci				else
227162306a36Sopenharmony_ci					_dpk_lbk_rxiqk(rtwdev, phy, path);
227262306a36Sopenharmony_ci			}
227362306a36Sopenharmony_ci			if (dgain > 1922 || dgain < 342)
227462306a36Sopenharmony_ci				step = DPK_AGC_STEP_SYNC_DGAIN;
227562306a36Sopenharmony_ci			else
227662306a36Sopenharmony_ci				step = DPK_AGC_STEP_GAIN_LOSS_IDX;
227762306a36Sopenharmony_ci
227862306a36Sopenharmony_ci			agc_cnt++;
227962306a36Sopenharmony_ci			break;
228062306a36Sopenharmony_ci
228162306a36Sopenharmony_ci		case DPK_AGC_STEP_GAIN_LOSS_IDX:
228262306a36Sopenharmony_ci			_dpk_gainloss(rtwdev, phy, path, kidx);
228362306a36Sopenharmony_ci			tmp_gl_idx = _dpk_gainloss_read(rtwdev);
228462306a36Sopenharmony_ci
228562306a36Sopenharmony_ci			if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) ||
228662306a36Sopenharmony_ci			    tmp_gl_idx >= 7)
228762306a36Sopenharmony_ci				step = DPK_AGC_STEP_GL_GT_CRITERION;
228862306a36Sopenharmony_ci			else if (tmp_gl_idx == 0)
228962306a36Sopenharmony_ci				step = DPK_AGC_STEP_GL_LT_CRITERION;
229062306a36Sopenharmony_ci			else
229162306a36Sopenharmony_ci				step = DPK_AGC_STEP_SET_TX_GAIN;
229262306a36Sopenharmony_ci			break;
229362306a36Sopenharmony_ci
229462306a36Sopenharmony_ci		case DPK_AGC_STEP_GL_GT_CRITERION:
229562306a36Sopenharmony_ci			if (tmp_txagc == 0x2e) {
229662306a36Sopenharmony_ci				goout = 1;
229762306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_RFK,
229862306a36Sopenharmony_ci					    "[DPK] Txagc@lower bound!!\n");
229962306a36Sopenharmony_ci			} else {
230062306a36Sopenharmony_ci				tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0x3);
230162306a36Sopenharmony_ci			}
230262306a36Sopenharmony_ci			step = DPK_AGC_STEP_GAIN_LOSS_IDX;
230362306a36Sopenharmony_ci			agc_cnt++;
230462306a36Sopenharmony_ci			break;
230562306a36Sopenharmony_ci
230662306a36Sopenharmony_ci		case DPK_AGC_STEP_GL_LT_CRITERION:
230762306a36Sopenharmony_ci			if (tmp_txagc == 0x3f) {
230862306a36Sopenharmony_ci				goout = 1;
230962306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_RFK,
231062306a36Sopenharmony_ci					    "[DPK] Txagc@upper bound!!\n");
231162306a36Sopenharmony_ci			} else {
231262306a36Sopenharmony_ci				tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0xfe);
231362306a36Sopenharmony_ci			}
231462306a36Sopenharmony_ci			step = DPK_AGC_STEP_GAIN_LOSS_IDX;
231562306a36Sopenharmony_ci			agc_cnt++;
231662306a36Sopenharmony_ci			break;
231762306a36Sopenharmony_ci		case DPK_AGC_STEP_SET_TX_GAIN:
231862306a36Sopenharmony_ci			tmp_txagc = _dpk_set_offset(rtwdev, phy, path, tmp_gl_idx);
231962306a36Sopenharmony_ci			goout = 1;
232062306a36Sopenharmony_ci			agc_cnt++;
232162306a36Sopenharmony_ci			break;
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_ci		default:
232462306a36Sopenharmony_ci			goout = 1;
232562306a36Sopenharmony_ci			break;
232662306a36Sopenharmony_ci		}
232762306a36Sopenharmony_ci	} while (!goout && agc_cnt < 6 && limit-- > 0);
232862306a36Sopenharmony_ci
232962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
233062306a36Sopenharmony_ci		    "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc,
233162306a36Sopenharmony_ci		    tmp_rxbb);
233262306a36Sopenharmony_ci
233362306a36Sopenharmony_ci	return tmp_txagc;
233462306a36Sopenharmony_ci}
233562306a36Sopenharmony_ci
233662306a36Sopenharmony_cistatic void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order)
233762306a36Sopenharmony_ci{
233862306a36Sopenharmony_ci	switch (order) {
233962306a36Sopenharmony_ci	case 0:
234062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
234162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3);
234262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1);
234362306a36Sopenharmony_ci		break;
234462306a36Sopenharmony_ci	case 1:
234562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
234662306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN);
234762306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN);
234862306a36Sopenharmony_ci		break;
234962306a36Sopenharmony_ci	case 2:
235062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
235162306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN);
235262306a36Sopenharmony_ci		rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN);
235362306a36Sopenharmony_ci		break;
235462306a36Sopenharmony_ci	default:
235562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
235662306a36Sopenharmony_ci			    "[DPK] Wrong MDPD order!!(0x%x)\n", order);
235762306a36Sopenharmony_ci		break;
235862306a36Sopenharmony_ci	}
235962306a36Sopenharmony_ci
236062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
236162306a36Sopenharmony_ci		    "[DPK] Set MDPD order to 0x%x for IDL\n", order);
236262306a36Sopenharmony_ci}
236362306a36Sopenharmony_ci
236462306a36Sopenharmony_cistatic void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
236562306a36Sopenharmony_ci			 enum rtw89_rf_path path, u8 kidx, u8 gain)
236662306a36Sopenharmony_ci{
236762306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
236862306a36Sopenharmony_ci
236962306a36Sopenharmony_ci	if (dpk->bp[path][kidx].bw < RTW89_CHANNEL_WIDTH_80 &&
237062306a36Sopenharmony_ci	    dpk->bp[path][kidx].band == RTW89_BAND_5G)
237162306a36Sopenharmony_ci		_dpk_set_mdpd_para(rtwdev, 0x2);
237262306a36Sopenharmony_ci	else
237362306a36Sopenharmony_ci		_dpk_set_mdpd_para(rtwdev, 0x0);
237462306a36Sopenharmony_ci
237562306a36Sopenharmony_ci	_dpk_one_shot(rtwdev, phy, path, MDPK_IDL);
237662306a36Sopenharmony_ci}
237762306a36Sopenharmony_ci
237862306a36Sopenharmony_cistatic void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
237962306a36Sopenharmony_ci			     enum rtw89_rf_path path, u8 kidx, u8 gain, u8 txagc)
238062306a36Sopenharmony_ci{
238162306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
238262306a36Sopenharmony_ci	const u16 pwsf = 0x78;
238362306a36Sopenharmony_ci	u8 gs = dpk->dpk_gs[phy];
238462306a36Sopenharmony_ci
238562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
238662306a36Sopenharmony_ci			       B_COEF_SEL_MDPD, kidx);
238762306a36Sopenharmony_ci
238862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
238962306a36Sopenharmony_ci		    "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n", txagc,
239062306a36Sopenharmony_ci		    pwsf, gs);
239162306a36Sopenharmony_ci
239262306a36Sopenharmony_ci	dpk->bp[path][kidx].txagc_dpk = txagc;
239362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8),
239462306a36Sopenharmony_ci			       0x3F << ((gain << 3) + (kidx << 4)), txagc);
239562306a36Sopenharmony_ci
239662306a36Sopenharmony_ci	dpk->bp[path][kidx].pwsf = pwsf;
239762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2),
239862306a36Sopenharmony_ci			       0x1FF << (gain << 4), pwsf);
239962306a36Sopenharmony_ci
240062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1);
240162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0);
240262306a36Sopenharmony_ci
240362306a36Sopenharmony_ci	dpk->bp[path][kidx].gs = gs;
240462306a36Sopenharmony_ci	if (dpk->dpk_gs[phy] == 0x7f)
240562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
240662306a36Sopenharmony_ci				       MASKDWORD, 0x007f7f7f);
240762306a36Sopenharmony_ci	else
240862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
240962306a36Sopenharmony_ci				       MASKDWORD, 0x005b5b5b);
241062306a36Sopenharmony_ci
241162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
241262306a36Sopenharmony_ci			       B_DPD_ORDER_V1, _dpk_order_convert(rtwdev));
241362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD, 0x0);
241462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL, 0x0);
241562306a36Sopenharmony_ci}
241662306a36Sopenharmony_ci
241762306a36Sopenharmony_cistatic bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
241862306a36Sopenharmony_ci			      enum rtw89_rf_path path)
241962306a36Sopenharmony_ci{
242062306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
242162306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
242262306a36Sopenharmony_ci	bool is_reload = false;
242362306a36Sopenharmony_ci	u8 idx, cur_band, cur_ch;
242462306a36Sopenharmony_ci
242562306a36Sopenharmony_ci	cur_band = chan->band_type;
242662306a36Sopenharmony_ci	cur_ch = chan->channel;
242762306a36Sopenharmony_ci
242862306a36Sopenharmony_ci	for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) {
242962306a36Sopenharmony_ci		if (cur_band != dpk->bp[path][idx].band ||
243062306a36Sopenharmony_ci		    cur_ch != dpk->bp[path][idx].ch)
243162306a36Sopenharmony_ci			continue;
243262306a36Sopenharmony_ci
243362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
243462306a36Sopenharmony_ci				       B_COEF_SEL_MDPD, idx);
243562306a36Sopenharmony_ci		dpk->cur_idx[path] = idx;
243662306a36Sopenharmony_ci		is_reload = true;
243762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
243862306a36Sopenharmony_ci			    "[DPK] reload S%d[%d] success\n", path, idx);
243962306a36Sopenharmony_ci	}
244062306a36Sopenharmony_ci
244162306a36Sopenharmony_ci	return is_reload;
244262306a36Sopenharmony_ci}
244362306a36Sopenharmony_ci
244462306a36Sopenharmony_cistatic bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
244562306a36Sopenharmony_ci		      enum rtw89_rf_path path, u8 gain)
244662306a36Sopenharmony_ci{
244762306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
244862306a36Sopenharmony_ci	u8 txagc = 0x38, kidx = dpk->cur_idx[path];
244962306a36Sopenharmony_ci	bool is_fail = false;
245062306a36Sopenharmony_ci
245162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
245262306a36Sopenharmony_ci		    "[DPK] ========= S%d[%d] DPK Start =========\n", path, kidx);
245362306a36Sopenharmony_ci
245462306a36Sopenharmony_ci	_rfk_rf_direct_cntrl(rtwdev, path, false);
245562306a36Sopenharmony_ci	_rfk_drf_direct_cntrl(rtwdev, path, false);
245662306a36Sopenharmony_ci
245762306a36Sopenharmony_ci	_dpk_kip_pwr_clk_on(rtwdev, path);
245862306a36Sopenharmony_ci	_dpk_kip_set_txagc(rtwdev, phy, path, txagc);
245962306a36Sopenharmony_ci	_dpk_rf_setting(rtwdev, gain, path, kidx);
246062306a36Sopenharmony_ci	_dpk_rx_dck(rtwdev, phy, path);
246162306a36Sopenharmony_ci
246262306a36Sopenharmony_ci	_dpk_kip_preset(rtwdev, phy, path, kidx);
246362306a36Sopenharmony_ci	_dpk_kip_set_rxagc(rtwdev, phy, path);
246462306a36Sopenharmony_ci	_dpk_table_select(rtwdev, path, kidx, gain);
246562306a36Sopenharmony_ci
246662306a36Sopenharmony_ci	txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false);
246762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Adjust txagc = 0x%x\n", txagc);
246862306a36Sopenharmony_ci
246962306a36Sopenharmony_ci	if (txagc == 0xff) {
247062306a36Sopenharmony_ci		is_fail = true;
247162306a36Sopenharmony_ci	} else {
247262306a36Sopenharmony_ci		_dpk_get_thermal(rtwdev, kidx, path);
247362306a36Sopenharmony_ci
247462306a36Sopenharmony_ci		_dpk_idl_mpa(rtwdev, phy, path, kidx, gain);
247562306a36Sopenharmony_ci
247662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
247762306a36Sopenharmony_ci
247862306a36Sopenharmony_ci		_dpk_fill_result(rtwdev, phy, path, kidx, gain, txagc);
247962306a36Sopenharmony_ci	}
248062306a36Sopenharmony_ci
248162306a36Sopenharmony_ci	if (!is_fail)
248262306a36Sopenharmony_ci		dpk->bp[path][kidx].path_ok = true;
248362306a36Sopenharmony_ci	else
248462306a36Sopenharmony_ci		dpk->bp[path][kidx].path_ok = false;
248562306a36Sopenharmony_ci
248662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx,
248762306a36Sopenharmony_ci		    is_fail ? "Check" : "Success");
248862306a36Sopenharmony_ci
248962306a36Sopenharmony_ci	return is_fail;
249062306a36Sopenharmony_ci}
249162306a36Sopenharmony_ci
249262306a36Sopenharmony_cistatic void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,
249362306a36Sopenharmony_ci			    enum rtw89_phy_idx phy, u8 kpath)
249462306a36Sopenharmony_ci{
249562306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
249662306a36Sopenharmony_ci	static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120};
249762306a36Sopenharmony_ci	u32 kip_bkup[RTW8852B_DPK_RF_PATH][RTW8852B_DPK_KIP_REG_NUM] = {};
249862306a36Sopenharmony_ci	u32 backup_rf_val[RTW8852B_DPK_RF_PATH][BACKUP_RF_REGS_NR];
249962306a36Sopenharmony_ci	u32 backup_bb_val[BACKUP_BB_REGS_NR];
250062306a36Sopenharmony_ci	bool is_fail = true, reloaded[RTW8852B_DPK_RF_PATH] = {};
250162306a36Sopenharmony_ci	u8 path;
250262306a36Sopenharmony_ci
250362306a36Sopenharmony_ci	if (dpk->is_dpk_reload_en) {
250462306a36Sopenharmony_ci		for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
250562306a36Sopenharmony_ci			reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
250662306a36Sopenharmony_ci			if (!reloaded[path] && dpk->bp[path][0].ch)
250762306a36Sopenharmony_ci				dpk->cur_idx[path] = !dpk->cur_idx[path];
250862306a36Sopenharmony_ci			else
250962306a36Sopenharmony_ci				_dpk_onoff(rtwdev, path, false);
251062306a36Sopenharmony_ci		}
251162306a36Sopenharmony_ci	} else {
251262306a36Sopenharmony_ci		for (path = 0; path < RTW8852B_DPK_RF_PATH; path++)
251362306a36Sopenharmony_ci			dpk->cur_idx[path] = 0;
251462306a36Sopenharmony_ci	}
251562306a36Sopenharmony_ci
251662306a36Sopenharmony_ci	_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);
251762306a36Sopenharmony_ci
251862306a36Sopenharmony_ci	for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
251962306a36Sopenharmony_ci		_dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path);
252062306a36Sopenharmony_ci		_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);
252162306a36Sopenharmony_ci		_dpk_information(rtwdev, phy, path);
252262306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path])
252362306a36Sopenharmony_ci			_dpk_tssi_pause(rtwdev, path, true);
252462306a36Sopenharmony_ci	}
252562306a36Sopenharmony_ci
252662306a36Sopenharmony_ci	_dpk_bb_afe_setting(rtwdev, phy, path, kpath);
252762306a36Sopenharmony_ci
252862306a36Sopenharmony_ci	for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
252962306a36Sopenharmony_ci		is_fail = _dpk_main(rtwdev, phy, path, 1);
253062306a36Sopenharmony_ci		_dpk_onoff(rtwdev, path, is_fail);
253162306a36Sopenharmony_ci	}
253262306a36Sopenharmony_ci
253362306a36Sopenharmony_ci	_dpk_bb_afe_restore(rtwdev, phy, path, kpath);
253462306a36Sopenharmony_ci	_rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);
253562306a36Sopenharmony_ci
253662306a36Sopenharmony_ci	for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
253762306a36Sopenharmony_ci		_dpk_kip_restore(rtwdev, path);
253862306a36Sopenharmony_ci		_dpk_reload_kip(rtwdev, kip_reg, kip_bkup, path);
253962306a36Sopenharmony_ci		_rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path);
254062306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path])
254162306a36Sopenharmony_ci			_dpk_tssi_pause(rtwdev, path, false);
254262306a36Sopenharmony_ci	}
254362306a36Sopenharmony_ci}
254462306a36Sopenharmony_ci
254562306a36Sopenharmony_cistatic bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
254662306a36Sopenharmony_ci{
254762306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
254862306a36Sopenharmony_ci	struct rtw89_fem_info *fem = &rtwdev->fem;
254962306a36Sopenharmony_ci
255062306a36Sopenharmony_ci	if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
255162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
255262306a36Sopenharmony_ci			    "[DPK] Skip DPK due to 2G_ext_PA exist!!\n");
255362306a36Sopenharmony_ci		return true;
255462306a36Sopenharmony_ci	} else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) {
255562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
255662306a36Sopenharmony_ci			    "[DPK] Skip DPK due to 5G_ext_PA exist!!\n");
255762306a36Sopenharmony_ci		return true;
255862306a36Sopenharmony_ci	} else if (fem->epa_6g && chan->band_type == RTW89_BAND_6G) {
255962306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
256062306a36Sopenharmony_ci			    "[DPK] Skip DPK due to 6G_ext_PA exist!!\n");
256162306a36Sopenharmony_ci		return true;
256262306a36Sopenharmony_ci	}
256362306a36Sopenharmony_ci
256462306a36Sopenharmony_ci	return false;
256562306a36Sopenharmony_ci}
256662306a36Sopenharmony_ci
256762306a36Sopenharmony_cistatic void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
256862306a36Sopenharmony_ci{
256962306a36Sopenharmony_ci	u8 path, kpath;
257062306a36Sopenharmony_ci
257162306a36Sopenharmony_ci	kpath = _kpath(rtwdev, phy);
257262306a36Sopenharmony_ci
257362306a36Sopenharmony_ci	for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) {
257462306a36Sopenharmony_ci		if (kpath & BIT(path))
257562306a36Sopenharmony_ci			_dpk_onoff(rtwdev, path, true);
257662306a36Sopenharmony_ci	}
257762306a36Sopenharmony_ci}
257862306a36Sopenharmony_ci
257962306a36Sopenharmony_cistatic void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force)
258062306a36Sopenharmony_ci{
258162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
258262306a36Sopenharmony_ci		    "[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n",
258362306a36Sopenharmony_ci		    RTW8852B_DPK_VER, rtwdev->hal.cv,
258462306a36Sopenharmony_ci		    RTW8852B_RF_REL_VERSION);
258562306a36Sopenharmony_ci
258662306a36Sopenharmony_ci	if (_dpk_bypass_check(rtwdev, phy))
258762306a36Sopenharmony_ci		_dpk_force_bypass(rtwdev, phy);
258862306a36Sopenharmony_ci	else
258962306a36Sopenharmony_ci		_dpk_cal_select(rtwdev, force, phy, RF_AB);
259062306a36Sopenharmony_ci}
259162306a36Sopenharmony_ci
259262306a36Sopenharmony_cistatic void _dpk_track(struct rtw89_dev *rtwdev)
259362306a36Sopenharmony_ci{
259462306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
259562306a36Sopenharmony_ci	s8 txagc_bb, txagc_bb_tp, ini_diff = 0, txagc_ofst;
259662306a36Sopenharmony_ci	s8 delta_ther[2] = {};
259762306a36Sopenharmony_ci	u8 trk_idx, txagc_rf;
259862306a36Sopenharmony_ci	u8 path, kidx;
259962306a36Sopenharmony_ci	u16 pwsf[2];
260062306a36Sopenharmony_ci	u8 cur_ther;
260162306a36Sopenharmony_ci	u32 tmp;
260262306a36Sopenharmony_ci
260362306a36Sopenharmony_ci	for (path = 0; path < RF_PATH_NUM_8852B; path++) {
260462306a36Sopenharmony_ci		kidx = dpk->cur_idx[path];
260562306a36Sopenharmony_ci
260662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
260762306a36Sopenharmony_ci			    "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n",
260862306a36Sopenharmony_ci			    path, kidx, dpk->bp[path][kidx].ch);
260962306a36Sopenharmony_ci
261062306a36Sopenharmony_ci		cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
261162306a36Sopenharmony_ci
261262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
261362306a36Sopenharmony_ci			    "[DPK_TRK] thermal now = %d\n", cur_ther);
261462306a36Sopenharmony_ci
261562306a36Sopenharmony_ci		if (dpk->bp[path][kidx].ch && cur_ther)
261662306a36Sopenharmony_ci			delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther;
261762306a36Sopenharmony_ci
261862306a36Sopenharmony_ci		if (dpk->bp[path][kidx].band == RTW89_BAND_2G)
261962306a36Sopenharmony_ci			delta_ther[path] = delta_ther[path] * 3 / 2;
262062306a36Sopenharmony_ci		else
262162306a36Sopenharmony_ci			delta_ther[path] = delta_ther[path] * 5 / 2;
262262306a36Sopenharmony_ci
262362306a36Sopenharmony_ci		txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
262462306a36Sopenharmony_ci						 0x0000003f);
262562306a36Sopenharmony_ci
262662306a36Sopenharmony_ci		if (rtwdev->is_tssi_mode[path]) {
262762306a36Sopenharmony_ci			trk_idx = rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK);
262862306a36Sopenharmony_ci
262962306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
263062306a36Sopenharmony_ci				    "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n",
263162306a36Sopenharmony_ci				    txagc_rf, trk_idx);
263262306a36Sopenharmony_ci
263362306a36Sopenharmony_ci			txagc_bb =
263462306a36Sopenharmony_ci				rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
263562306a36Sopenharmony_ci						      MASKBYTE2);
263662306a36Sopenharmony_ci			txagc_bb_tp =
263762306a36Sopenharmony_ci				rtw89_phy_read32_mask(rtwdev, R_TXAGC_TP + (path << 13),
263862306a36Sopenharmony_ci						      B_TXAGC_TP);
263962306a36Sopenharmony_ci
264062306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
264162306a36Sopenharmony_ci				    "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n",
264262306a36Sopenharmony_ci				    txagc_bb_tp, txagc_bb);
264362306a36Sopenharmony_ci
264462306a36Sopenharmony_ci			txagc_ofst =
264562306a36Sopenharmony_ci				rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
264662306a36Sopenharmony_ci						      MASKBYTE3);
264762306a36Sopenharmony_ci
264862306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
264962306a36Sopenharmony_ci				    "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n",
265062306a36Sopenharmony_ci				    txagc_ofst, delta_ther[path]);
265162306a36Sopenharmony_ci			tmp = rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8),
265262306a36Sopenharmony_ci						    B_DPD_COM_OF);
265362306a36Sopenharmony_ci			if (tmp == 0x1) {
265462306a36Sopenharmony_ci				txagc_ofst = 0;
265562306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
265662306a36Sopenharmony_ci					    "[DPK_TRK] HW txagc offset mode\n");
265762306a36Sopenharmony_ci			}
265862306a36Sopenharmony_ci
265962306a36Sopenharmony_ci			if (txagc_rf && cur_ther)
266062306a36Sopenharmony_ci				ini_diff = txagc_ofst + (delta_ther[path]);
266162306a36Sopenharmony_ci
266262306a36Sopenharmony_ci			tmp = rtw89_phy_read32_mask(rtwdev,
266362306a36Sopenharmony_ci						    R_P0_TXDPD + (path << 13),
266462306a36Sopenharmony_ci						    B_P0_TXDPD);
266562306a36Sopenharmony_ci			if (tmp == 0x0) {
266662306a36Sopenharmony_ci				pwsf[0] = dpk->bp[path][kidx].pwsf +
266762306a36Sopenharmony_ci					  txagc_bb_tp - txagc_bb + ini_diff;
266862306a36Sopenharmony_ci				pwsf[1] = dpk->bp[path][kidx].pwsf +
266962306a36Sopenharmony_ci					  txagc_bb_tp - txagc_bb + ini_diff;
267062306a36Sopenharmony_ci			} else {
267162306a36Sopenharmony_ci				pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff;
267262306a36Sopenharmony_ci				pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff;
267362306a36Sopenharmony_ci			}
267462306a36Sopenharmony_ci
267562306a36Sopenharmony_ci		} else {
267662306a36Sopenharmony_ci			pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
267762306a36Sopenharmony_ci			pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
267862306a36Sopenharmony_ci		}
267962306a36Sopenharmony_ci
268062306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS);
268162306a36Sopenharmony_ci		if (!tmp && txagc_rf) {
268262306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
268362306a36Sopenharmony_ci				    "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n",
268462306a36Sopenharmony_ci				    pwsf[0], pwsf[1]);
268562306a36Sopenharmony_ci
268662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev,
268762306a36Sopenharmony_ci					       R_DPD_BND + (path << 8) + (kidx << 2),
268862306a36Sopenharmony_ci					       B_DPD_BND_0, pwsf[0]);
268962306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev,
269062306a36Sopenharmony_ci					       R_DPD_BND + (path << 8) + (kidx << 2),
269162306a36Sopenharmony_ci					       B_DPD_BND_1, pwsf[1]);
269262306a36Sopenharmony_ci		}
269362306a36Sopenharmony_ci	}
269462306a36Sopenharmony_ci}
269562306a36Sopenharmony_ci
269662306a36Sopenharmony_cistatic void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
269762306a36Sopenharmony_ci{
269862306a36Sopenharmony_ci	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
269962306a36Sopenharmony_ci	u8 tx_scale, ofdm_bkof, path, kpath;
270062306a36Sopenharmony_ci
270162306a36Sopenharmony_ci	kpath = _kpath(rtwdev, phy);
270262306a36Sopenharmony_ci
270362306a36Sopenharmony_ci	ofdm_bkof = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_OFDM);
270462306a36Sopenharmony_ci	tx_scale = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_SCA);
270562306a36Sopenharmony_ci
270662306a36Sopenharmony_ci	if (ofdm_bkof + tx_scale >= 44) {
270762306a36Sopenharmony_ci		/* move dpd backoff to bb, and set dpd backoff to 0 */
270862306a36Sopenharmony_ci		dpk->dpk_gs[phy] = 0x7f;
270962306a36Sopenharmony_ci		for (path = 0; path < RF_PATH_NUM_8852B; path++) {
271062306a36Sopenharmony_ci			if (!(kpath & BIT(path)))
271162306a36Sopenharmony_ci				continue;
271262306a36Sopenharmony_ci
271362306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8),
271462306a36Sopenharmony_ci					       B_DPD_CFG, 0x7f7f7f);
271562306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK,
271662306a36Sopenharmony_ci				    "[RFK] Set S%d DPD backoff to 0dB\n", path);
271762306a36Sopenharmony_ci		}
271862306a36Sopenharmony_ci	} else {
271962306a36Sopenharmony_ci		dpk->dpk_gs[phy] = 0x5b;
272062306a36Sopenharmony_ci	}
272162306a36Sopenharmony_ci}
272262306a36Sopenharmony_ci
272362306a36Sopenharmony_cistatic void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
272462306a36Sopenharmony_ci			     enum rtw89_rf_path path)
272562306a36Sopenharmony_ci{
272662306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
272762306a36Sopenharmony_ci	enum rtw89_band band = chan->band_type;
272862306a36Sopenharmony_ci
272962306a36Sopenharmony_ci	if (band == RTW89_BAND_2G)
273062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1);
273162306a36Sopenharmony_ci	else
273262306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1);
273362306a36Sopenharmony_ci}
273462306a36Sopenharmony_ci
273562306a36Sopenharmony_cistatic void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
273662306a36Sopenharmony_ci			  enum rtw89_rf_path path)
273762306a36Sopenharmony_ci{
273862306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
273962306a36Sopenharmony_ci	enum rtw89_band band = chan->band_type;
274062306a36Sopenharmony_ci
274162306a36Sopenharmony_ci	rtw89_rfk_parser(rtwdev, &rtw8852b_tssi_sys_defs_tbl);
274262306a36Sopenharmony_ci
274362306a36Sopenharmony_ci	if (path == RF_PATH_A)
274462306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
274562306a36Sopenharmony_ci					 &rtw8852b_tssi_sys_a_defs_2g_tbl,
274662306a36Sopenharmony_ci					 &rtw8852b_tssi_sys_a_defs_5g_tbl);
274762306a36Sopenharmony_ci	else
274862306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
274962306a36Sopenharmony_ci					 &rtw8852b_tssi_sys_b_defs_2g_tbl,
275062306a36Sopenharmony_ci					 &rtw8852b_tssi_sys_b_defs_5g_tbl);
275162306a36Sopenharmony_ci}
275262306a36Sopenharmony_ci
275362306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev,
275462306a36Sopenharmony_ci				    enum rtw89_phy_idx phy,
275562306a36Sopenharmony_ci				    enum rtw89_rf_path path)
275662306a36Sopenharmony_ci{
275762306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
275862306a36Sopenharmony_ci				 &rtw8852b_tssi_init_txpwr_defs_a_tbl,
275962306a36Sopenharmony_ci				 &rtw8852b_tssi_init_txpwr_defs_b_tbl);
276062306a36Sopenharmony_ci}
276162306a36Sopenharmony_ci
276262306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev,
276362306a36Sopenharmony_ci					  enum rtw89_phy_idx phy,
276462306a36Sopenharmony_ci					  enum rtw89_rf_path path)
276562306a36Sopenharmony_ci{
276662306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
276762306a36Sopenharmony_ci				 &rtw8852b_tssi_init_txpwr_he_tb_defs_a_tbl,
276862306a36Sopenharmony_ci				 &rtw8852b_tssi_init_txpwr_he_tb_defs_b_tbl);
276962306a36Sopenharmony_ci}
277062306a36Sopenharmony_ci
277162306a36Sopenharmony_cistatic void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
277262306a36Sopenharmony_ci			  enum rtw89_rf_path path)
277362306a36Sopenharmony_ci{
277462306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
277562306a36Sopenharmony_ci				 &rtw8852b_tssi_dck_defs_a_tbl,
277662306a36Sopenharmony_ci				 &rtw8852b_tssi_dck_defs_b_tbl);
277762306a36Sopenharmony_ci}
277862306a36Sopenharmony_ci
277962306a36Sopenharmony_cistatic void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
278062306a36Sopenharmony_ci				 enum rtw89_rf_path path)
278162306a36Sopenharmony_ci{
278262306a36Sopenharmony_ci#define RTW8852B_TSSI_GET_VAL(ptr, idx)			\
278362306a36Sopenharmony_ci({							\
278462306a36Sopenharmony_ci	s8 *__ptr = (ptr);				\
278562306a36Sopenharmony_ci	u8 __idx = (idx), __i, __v;			\
278662306a36Sopenharmony_ci	u32 __val = 0;					\
278762306a36Sopenharmony_ci	for (__i = 0; __i < 4; __i++) {			\
278862306a36Sopenharmony_ci		__v = (__ptr[__idx + __i]);		\
278962306a36Sopenharmony_ci		__val |= (__v << (8 * __i));		\
279062306a36Sopenharmony_ci	}						\
279162306a36Sopenharmony_ci	__val;						\
279262306a36Sopenharmony_ci})
279362306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
279462306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
279562306a36Sopenharmony_ci	u8 ch = chan->channel;
279662306a36Sopenharmony_ci	u8 subband = chan->subband_type;
279762306a36Sopenharmony_ci	const s8 *thm_up_a = NULL;
279862306a36Sopenharmony_ci	const s8 *thm_down_a = NULL;
279962306a36Sopenharmony_ci	const s8 *thm_up_b = NULL;
280062306a36Sopenharmony_ci	const s8 *thm_down_b = NULL;
280162306a36Sopenharmony_ci	u8 thermal = 0xff;
280262306a36Sopenharmony_ci	s8 thm_ofst[64] = {0};
280362306a36Sopenharmony_ci	u32 tmp = 0;
280462306a36Sopenharmony_ci	u8 i, j;
280562306a36Sopenharmony_ci
280662306a36Sopenharmony_ci	switch (subband) {
280762306a36Sopenharmony_ci	default:
280862306a36Sopenharmony_ci	case RTW89_CH_2G:
280962306a36Sopenharmony_ci		thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_p;
281062306a36Sopenharmony_ci		thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_n;
281162306a36Sopenharmony_ci		thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_p;
281262306a36Sopenharmony_ci		thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_n;
281362306a36Sopenharmony_ci		break;
281462306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_1:
281562306a36Sopenharmony_ci		thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[0];
281662306a36Sopenharmony_ci		thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[0];
281762306a36Sopenharmony_ci		thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[0];
281862306a36Sopenharmony_ci		thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[0];
281962306a36Sopenharmony_ci		break;
282062306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_3:
282162306a36Sopenharmony_ci		thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[1];
282262306a36Sopenharmony_ci		thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[1];
282362306a36Sopenharmony_ci		thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[1];
282462306a36Sopenharmony_ci		thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[1];
282562306a36Sopenharmony_ci		break;
282662306a36Sopenharmony_ci	case RTW89_CH_5G_BAND_4:
282762306a36Sopenharmony_ci		thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[2];
282862306a36Sopenharmony_ci		thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[2];
282962306a36Sopenharmony_ci		thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[2];
283062306a36Sopenharmony_ci		thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[2];
283162306a36Sopenharmony_ci		break;
283262306a36Sopenharmony_ci	}
283362306a36Sopenharmony_ci
283462306a36Sopenharmony_ci	if (path == RF_PATH_A) {
283562306a36Sopenharmony_ci		thermal = tssi_info->thermal[RF_PATH_A];
283662306a36Sopenharmony_ci
283762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
283862306a36Sopenharmony_ci			    "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal);
283962306a36Sopenharmony_ci
284062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0);
284162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1);
284262306a36Sopenharmony_ci
284362306a36Sopenharmony_ci		if (thermal == 0xff) {
284462306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32);
284562306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32);
284662306a36Sopenharmony_ci
284762306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
284862306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0);
284962306a36Sopenharmony_ci
285062306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
285162306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
285262306a36Sopenharmony_ci					    R_P0_TSSI_BASE + i, 0x0);
285362306a36Sopenharmony_ci			}
285462306a36Sopenharmony_ci
285562306a36Sopenharmony_ci		} else {
285662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, thermal);
285762306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL,
285862306a36Sopenharmony_ci					       thermal);
285962306a36Sopenharmony_ci
286062306a36Sopenharmony_ci			i = 0;
286162306a36Sopenharmony_ci			for (j = 0; j < 32; j++)
286262306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
286362306a36Sopenharmony_ci					      -thm_down_a[i++] :
286462306a36Sopenharmony_ci					      -thm_down_a[DELTA_SWINGIDX_SIZE - 1];
286562306a36Sopenharmony_ci
286662306a36Sopenharmony_ci			i = 1;
286762306a36Sopenharmony_ci			for (j = 63; j >= 32; j--)
286862306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
286962306a36Sopenharmony_ci					      thm_up_a[i++] :
287062306a36Sopenharmony_ci					      thm_up_a[DELTA_SWINGIDX_SIZE - 1];
287162306a36Sopenharmony_ci
287262306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
287362306a36Sopenharmony_ci				tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i);
287462306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp);
287562306a36Sopenharmony_ci
287662306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
287762306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
287862306a36Sopenharmony_ci					    0x5c00 + i, tmp);
287962306a36Sopenharmony_ci			}
288062306a36Sopenharmony_ci		}
288162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1);
288262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0);
288362306a36Sopenharmony_ci
288462306a36Sopenharmony_ci	} else {
288562306a36Sopenharmony_ci		thermal = tssi_info->thermal[RF_PATH_B];
288662306a36Sopenharmony_ci
288762306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
288862306a36Sopenharmony_ci			    "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal);
288962306a36Sopenharmony_ci
289062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0);
289162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1);
289262306a36Sopenharmony_ci
289362306a36Sopenharmony_ci		if (thermal == 0xff) {
289462306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32);
289562306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32);
289662306a36Sopenharmony_ci
289762306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
289862306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0);
289962306a36Sopenharmony_ci
290062306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
290162306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
290262306a36Sopenharmony_ci					    0x7c00 + i, 0x0);
290362306a36Sopenharmony_ci			}
290462306a36Sopenharmony_ci
290562306a36Sopenharmony_ci		} else {
290662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, thermal);
290762306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL,
290862306a36Sopenharmony_ci					       thermal);
290962306a36Sopenharmony_ci
291062306a36Sopenharmony_ci			i = 0;
291162306a36Sopenharmony_ci			for (j = 0; j < 32; j++)
291262306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
291362306a36Sopenharmony_ci					      -thm_down_b[i++] :
291462306a36Sopenharmony_ci					      -thm_down_b[DELTA_SWINGIDX_SIZE - 1];
291562306a36Sopenharmony_ci
291662306a36Sopenharmony_ci			i = 1;
291762306a36Sopenharmony_ci			for (j = 63; j >= 32; j--)
291862306a36Sopenharmony_ci				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
291962306a36Sopenharmony_ci					      thm_up_b[i++] :
292062306a36Sopenharmony_ci					      thm_up_b[DELTA_SWINGIDX_SIZE - 1];
292162306a36Sopenharmony_ci
292262306a36Sopenharmony_ci			for (i = 0; i < 64; i += 4) {
292362306a36Sopenharmony_ci				tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i);
292462306a36Sopenharmony_ci				rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp);
292562306a36Sopenharmony_ci
292662306a36Sopenharmony_ci				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
292762306a36Sopenharmony_ci					    "[TSSI] write 0x%x val=0x%08x\n",
292862306a36Sopenharmony_ci					    0x7c00 + i, tmp);
292962306a36Sopenharmony_ci			}
293062306a36Sopenharmony_ci		}
293162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1);
293262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0);
293362306a36Sopenharmony_ci	}
293462306a36Sopenharmony_ci#undef RTW8852B_TSSI_GET_VAL
293562306a36Sopenharmony_ci}
293662306a36Sopenharmony_ci
293762306a36Sopenharmony_cistatic void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
293862306a36Sopenharmony_ci				   enum rtw89_rf_path path)
293962306a36Sopenharmony_ci{
294062306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
294162306a36Sopenharmony_ci				 &rtw8852b_tssi_dac_gain_defs_a_tbl,
294262306a36Sopenharmony_ci				 &rtw8852b_tssi_dac_gain_defs_b_tbl);
294362306a36Sopenharmony_ci}
294462306a36Sopenharmony_ci
294562306a36Sopenharmony_cistatic void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
294662306a36Sopenharmony_ci				enum rtw89_rf_path path)
294762306a36Sopenharmony_ci{
294862306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
294962306a36Sopenharmony_ci	enum rtw89_band band = chan->band_type;
295062306a36Sopenharmony_ci
295162306a36Sopenharmony_ci	if (path == RF_PATH_A)
295262306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
295362306a36Sopenharmony_ci					 &rtw8852b_tssi_slope_a_defs_2g_tbl,
295462306a36Sopenharmony_ci					 &rtw8852b_tssi_slope_a_defs_5g_tbl);
295562306a36Sopenharmony_ci	else
295662306a36Sopenharmony_ci		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
295762306a36Sopenharmony_ci					 &rtw8852b_tssi_slope_b_defs_2g_tbl,
295862306a36Sopenharmony_ci					 &rtw8852b_tssi_slope_b_defs_5g_tbl);
295962306a36Sopenharmony_ci}
296062306a36Sopenharmony_ci
296162306a36Sopenharmony_cistatic void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
296262306a36Sopenharmony_ci				    enum rtw89_rf_path path, bool all)
296362306a36Sopenharmony_ci{
296462306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
296562306a36Sopenharmony_ci	enum rtw89_band band = chan->band_type;
296662306a36Sopenharmony_ci	const struct rtw89_rfk_tbl *tbl = NULL;
296762306a36Sopenharmony_ci	u8 ch = chan->channel;
296862306a36Sopenharmony_ci
296962306a36Sopenharmony_ci	if (path == RF_PATH_A) {
297062306a36Sopenharmony_ci		if (band == RTW89_BAND_2G) {
297162306a36Sopenharmony_ci			if (all)
297262306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_2g_all_defs_tbl;
297362306a36Sopenharmony_ci			else
297462306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_2g_part_defs_tbl;
297562306a36Sopenharmony_ci		} else if (ch >= 36 && ch <= 64) {
297662306a36Sopenharmony_ci			if (all)
297762306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_5g1_all_defs_tbl;
297862306a36Sopenharmony_ci			else
297962306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_5g1_part_defs_tbl;
298062306a36Sopenharmony_ci		} else if (ch >= 100 && ch <= 144) {
298162306a36Sopenharmony_ci			if (all)
298262306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_5g2_all_defs_tbl;
298362306a36Sopenharmony_ci			else
298462306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_5g2_part_defs_tbl;
298562306a36Sopenharmony_ci		} else if (ch >= 149 && ch <= 177) {
298662306a36Sopenharmony_ci			if (all)
298762306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_5g3_all_defs_tbl;
298862306a36Sopenharmony_ci			else
298962306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_a_5g3_part_defs_tbl;
299062306a36Sopenharmony_ci		}
299162306a36Sopenharmony_ci	} else {
299262306a36Sopenharmony_ci		if (ch >= 1 && ch <= 14) {
299362306a36Sopenharmony_ci			if (all)
299462306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_2g_all_defs_tbl;
299562306a36Sopenharmony_ci			else
299662306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_2g_part_defs_tbl;
299762306a36Sopenharmony_ci		} else if (ch >= 36 && ch <= 64) {
299862306a36Sopenharmony_ci			if (all)
299962306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_5g1_all_defs_tbl;
300062306a36Sopenharmony_ci			else
300162306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_5g1_part_defs_tbl;
300262306a36Sopenharmony_ci		} else if (ch >= 100 && ch <= 144) {
300362306a36Sopenharmony_ci			if (all)
300462306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_5g2_all_defs_tbl;
300562306a36Sopenharmony_ci			else
300662306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_5g2_part_defs_tbl;
300762306a36Sopenharmony_ci		} else if (ch >= 149 && ch <= 177) {
300862306a36Sopenharmony_ci			if (all)
300962306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_5g3_all_defs_tbl;
301062306a36Sopenharmony_ci			else
301162306a36Sopenharmony_ci				tbl = &rtw8852b_tssi_align_b_5g3_part_defs_tbl;
301262306a36Sopenharmony_ci		}
301362306a36Sopenharmony_ci	}
301462306a36Sopenharmony_ci
301562306a36Sopenharmony_ci	if (tbl)
301662306a36Sopenharmony_ci		rtw89_rfk_parser(rtwdev, tbl);
301762306a36Sopenharmony_ci}
301862306a36Sopenharmony_ci
301962306a36Sopenharmony_cistatic void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
302062306a36Sopenharmony_ci				 enum rtw89_rf_path path)
302162306a36Sopenharmony_ci{
302262306a36Sopenharmony_ci	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
302362306a36Sopenharmony_ci				 &rtw8852b_tssi_slope_defs_a_tbl,
302462306a36Sopenharmony_ci				 &rtw8852b_tssi_slope_defs_b_tbl);
302562306a36Sopenharmony_ci}
302662306a36Sopenharmony_ci
302762306a36Sopenharmony_cistatic void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
302862306a36Sopenharmony_ci				 enum rtw89_rf_path path)
302962306a36Sopenharmony_ci{
303062306a36Sopenharmony_ci	if (path == RF_PATH_A)
303162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSIC, B_P0_TSSIC_BYPASS, 0x0);
303262306a36Sopenharmony_ci	else
303362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TSSIC, B_P1_TSSIC_BYPASS, 0x0);
303462306a36Sopenharmony_ci}
303562306a36Sopenharmony_ci
303662306a36Sopenharmony_cistatic void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev,
303762306a36Sopenharmony_ci					  enum rtw89_phy_idx phy,
303862306a36Sopenharmony_ci					  enum rtw89_rf_path path)
303962306a36Sopenharmony_ci{
304062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "======>%s   path=%d\n", __func__,
304162306a36Sopenharmony_ci		    path);
304262306a36Sopenharmony_ci
304362306a36Sopenharmony_ci	if (path == RF_PATH_A)
304462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_MIX, 0x010);
304562306a36Sopenharmony_ci	else
304662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_RFCTM_DEL, 0x010);
304762306a36Sopenharmony_ci}
304862306a36Sopenharmony_ci
304962306a36Sopenharmony_cistatic void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
305062306a36Sopenharmony_ci{
305162306a36Sopenharmony_ci	u8 i;
305262306a36Sopenharmony_ci
305362306a36Sopenharmony_ci	for (i = 0; i < RF_PATH_NUM_8852B; i++) {
305462306a36Sopenharmony_ci		_tssi_set_tssi_track(rtwdev, phy, i);
305562306a36Sopenharmony_ci		_tssi_set_txagc_offset_mv_avg(rtwdev, phy, i);
305662306a36Sopenharmony_ci
305762306a36Sopenharmony_ci		if (i == RF_PATH_A) {
305862306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG,
305962306a36Sopenharmony_ci					       B_P0_TSSI_MV_CLR, 0x0);
306062306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG,
306162306a36Sopenharmony_ci					       B_P0_TSSI_EN, 0x0);
306262306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG,
306362306a36Sopenharmony_ci					       B_P0_TSSI_EN, 0x1);
306462306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, i, RR_TXGA_V1,
306562306a36Sopenharmony_ci				       RR_TXGA_V1_TRK_EN, 0x1);
306662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
306762306a36Sopenharmony_ci					       B_P0_TSSI_RFC, 0x3);
306862306a36Sopenharmony_ci
306962306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
307062306a36Sopenharmony_ci					       B_P0_TSSI_OFT, 0xc0);
307162306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
307262306a36Sopenharmony_ci					       B_P0_TSSI_OFT_EN, 0x0);
307362306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
307462306a36Sopenharmony_ci					       B_P0_TSSI_OFT_EN, 0x1);
307562306a36Sopenharmony_ci
307662306a36Sopenharmony_ci			rtwdev->is_tssi_mode[RF_PATH_A] = true;
307762306a36Sopenharmony_ci		} else {
307862306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG,
307962306a36Sopenharmony_ci					       B_P1_TSSI_MV_CLR, 0x0);
308062306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG,
308162306a36Sopenharmony_ci					       B_P1_TSSI_EN, 0x0);
308262306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG,
308362306a36Sopenharmony_ci					       B_P1_TSSI_EN, 0x1);
308462306a36Sopenharmony_ci			rtw89_write_rf(rtwdev, i, RR_TXGA_V1,
308562306a36Sopenharmony_ci				       RR_TXGA_V1_TRK_EN, 0x1);
308662306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
308762306a36Sopenharmony_ci					       B_P1_TSSI_RFC, 0x3);
308862306a36Sopenharmony_ci
308962306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
309062306a36Sopenharmony_ci					       B_P1_TSSI_OFT, 0xc0);
309162306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
309262306a36Sopenharmony_ci					       B_P1_TSSI_OFT_EN, 0x0);
309362306a36Sopenharmony_ci			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
309462306a36Sopenharmony_ci					       B_P1_TSSI_OFT_EN, 0x1);
309562306a36Sopenharmony_ci
309662306a36Sopenharmony_ci			rtwdev->is_tssi_mode[RF_PATH_B] = true;
309762306a36Sopenharmony_ci		}
309862306a36Sopenharmony_ci	}
309962306a36Sopenharmony_ci}
310062306a36Sopenharmony_ci
310162306a36Sopenharmony_cistatic void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
310262306a36Sopenharmony_ci{
310362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0);
310462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x1);
310562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1);
310662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_EN, 0x0);
310762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_RFC, 0x1);
310862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_CLR, 0x1);
310962306a36Sopenharmony_ci
311062306a36Sopenharmony_ci	rtwdev->is_tssi_mode[RF_PATH_A] = false;
311162306a36Sopenharmony_ci	rtwdev->is_tssi_mode[RF_PATH_B] = false;
311262306a36Sopenharmony_ci}
311362306a36Sopenharmony_ci
311462306a36Sopenharmony_cistatic u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch)
311562306a36Sopenharmony_ci{
311662306a36Sopenharmony_ci	switch (ch) {
311762306a36Sopenharmony_ci	case 1 ... 2:
311862306a36Sopenharmony_ci		return 0;
311962306a36Sopenharmony_ci	case 3 ... 5:
312062306a36Sopenharmony_ci		return 1;
312162306a36Sopenharmony_ci	case 6 ... 8:
312262306a36Sopenharmony_ci		return 2;
312362306a36Sopenharmony_ci	case 9 ... 11:
312462306a36Sopenharmony_ci		return 3;
312562306a36Sopenharmony_ci	case 12 ... 13:
312662306a36Sopenharmony_ci		return 4;
312762306a36Sopenharmony_ci	case 14:
312862306a36Sopenharmony_ci		return 5;
312962306a36Sopenharmony_ci	}
313062306a36Sopenharmony_ci
313162306a36Sopenharmony_ci	return 0;
313262306a36Sopenharmony_ci}
313362306a36Sopenharmony_ci
313462306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP_BIT (BIT(31))
313562306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx))
313662306a36Sopenharmony_ci#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT)
313762306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT)
313862306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1)
313962306a36Sopenharmony_ci
314062306a36Sopenharmony_cistatic u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch)
314162306a36Sopenharmony_ci{
314262306a36Sopenharmony_ci	switch (ch) {
314362306a36Sopenharmony_ci	case 1 ... 2:
314462306a36Sopenharmony_ci		return 0;
314562306a36Sopenharmony_ci	case 3 ... 5:
314662306a36Sopenharmony_ci		return 1;
314762306a36Sopenharmony_ci	case 6 ... 8:
314862306a36Sopenharmony_ci		return 2;
314962306a36Sopenharmony_ci	case 9 ... 11:
315062306a36Sopenharmony_ci		return 3;
315162306a36Sopenharmony_ci	case 12 ... 14:
315262306a36Sopenharmony_ci		return 4;
315362306a36Sopenharmony_ci	case 36 ... 40:
315462306a36Sopenharmony_ci		return 5;
315562306a36Sopenharmony_ci	case 41 ... 43:
315662306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(5);
315762306a36Sopenharmony_ci	case 44 ... 48:
315862306a36Sopenharmony_ci		return 6;
315962306a36Sopenharmony_ci	case 49 ... 51:
316062306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(6);
316162306a36Sopenharmony_ci	case 52 ... 56:
316262306a36Sopenharmony_ci		return 7;
316362306a36Sopenharmony_ci	case 57 ... 59:
316462306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(7);
316562306a36Sopenharmony_ci	case 60 ... 64:
316662306a36Sopenharmony_ci		return 8;
316762306a36Sopenharmony_ci	case 100 ... 104:
316862306a36Sopenharmony_ci		return 9;
316962306a36Sopenharmony_ci	case 105 ... 107:
317062306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(9);
317162306a36Sopenharmony_ci	case 108 ... 112:
317262306a36Sopenharmony_ci		return 10;
317362306a36Sopenharmony_ci	case 113 ... 115:
317462306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(10);
317562306a36Sopenharmony_ci	case 116 ... 120:
317662306a36Sopenharmony_ci		return 11;
317762306a36Sopenharmony_ci	case 121 ... 123:
317862306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(11);
317962306a36Sopenharmony_ci	case 124 ... 128:
318062306a36Sopenharmony_ci		return 12;
318162306a36Sopenharmony_ci	case 129 ... 131:
318262306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(12);
318362306a36Sopenharmony_ci	case 132 ... 136:
318462306a36Sopenharmony_ci		return 13;
318562306a36Sopenharmony_ci	case 137 ... 139:
318662306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(13);
318762306a36Sopenharmony_ci	case 140 ... 144:
318862306a36Sopenharmony_ci		return 14;
318962306a36Sopenharmony_ci	case 149 ... 153:
319062306a36Sopenharmony_ci		return 15;
319162306a36Sopenharmony_ci	case 154 ... 156:
319262306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(15);
319362306a36Sopenharmony_ci	case 157 ... 161:
319462306a36Sopenharmony_ci		return 16;
319562306a36Sopenharmony_ci	case 162 ... 164:
319662306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(16);
319762306a36Sopenharmony_ci	case 165 ... 169:
319862306a36Sopenharmony_ci		return 17;
319962306a36Sopenharmony_ci	case 170 ... 172:
320062306a36Sopenharmony_ci		return TSSI_EXTRA_GROUP(17);
320162306a36Sopenharmony_ci	case 173 ... 177:
320262306a36Sopenharmony_ci		return 18;
320362306a36Sopenharmony_ci	}
320462306a36Sopenharmony_ci
320562306a36Sopenharmony_ci	return 0;
320662306a36Sopenharmony_ci}
320762306a36Sopenharmony_ci
320862306a36Sopenharmony_cistatic u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
320962306a36Sopenharmony_ci{
321062306a36Sopenharmony_ci	switch (ch) {
321162306a36Sopenharmony_ci	case 1 ... 8:
321262306a36Sopenharmony_ci		return 0;
321362306a36Sopenharmony_ci	case 9 ... 14:
321462306a36Sopenharmony_ci		return 1;
321562306a36Sopenharmony_ci	case 36 ... 48:
321662306a36Sopenharmony_ci		return 2;
321762306a36Sopenharmony_ci	case 52 ... 64:
321862306a36Sopenharmony_ci		return 3;
321962306a36Sopenharmony_ci	case 100 ... 112:
322062306a36Sopenharmony_ci		return 4;
322162306a36Sopenharmony_ci	case 116 ... 128:
322262306a36Sopenharmony_ci		return 5;
322362306a36Sopenharmony_ci	case 132 ... 144:
322462306a36Sopenharmony_ci		return 6;
322562306a36Sopenharmony_ci	case 149 ... 177:
322662306a36Sopenharmony_ci		return 7;
322762306a36Sopenharmony_ci	}
322862306a36Sopenharmony_ci
322962306a36Sopenharmony_ci	return 0;
323062306a36Sopenharmony_ci}
323162306a36Sopenharmony_ci
323262306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
323362306a36Sopenharmony_ci			    enum rtw89_rf_path path)
323462306a36Sopenharmony_ci{
323562306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
323662306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
323762306a36Sopenharmony_ci	u8 ch = chan->channel;
323862306a36Sopenharmony_ci	u32 gidx, gidx_1st, gidx_2nd;
323962306a36Sopenharmony_ci	s8 de_1st;
324062306a36Sopenharmony_ci	s8 de_2nd;
324162306a36Sopenharmony_ci	s8 val;
324262306a36Sopenharmony_ci
324362306a36Sopenharmony_ci	gidx = _tssi_get_ofdm_group(rtwdev, ch);
324462306a36Sopenharmony_ci
324562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
324662306a36Sopenharmony_ci		    "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx);
324762306a36Sopenharmony_ci
324862306a36Sopenharmony_ci	if (IS_TSSI_EXTRA_GROUP(gidx)) {
324962306a36Sopenharmony_ci		gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx);
325062306a36Sopenharmony_ci		gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx);
325162306a36Sopenharmony_ci		de_1st = tssi_info->tssi_mcs[path][gidx_1st];
325262306a36Sopenharmony_ci		de_2nd = tssi_info->tssi_mcs[path][gidx_2nd];
325362306a36Sopenharmony_ci		val = (de_1st + de_2nd) / 2;
325462306a36Sopenharmony_ci
325562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
325662306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n",
325762306a36Sopenharmony_ci			    path, val, de_1st, de_2nd);
325862306a36Sopenharmony_ci	} else {
325962306a36Sopenharmony_ci		val = tssi_info->tssi_mcs[path][gidx];
326062306a36Sopenharmony_ci
326162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
326262306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val);
326362306a36Sopenharmony_ci	}
326462306a36Sopenharmony_ci
326562306a36Sopenharmony_ci	return val;
326662306a36Sopenharmony_ci}
326762306a36Sopenharmony_ci
326862306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
326962306a36Sopenharmony_ci				 enum rtw89_rf_path path)
327062306a36Sopenharmony_ci{
327162306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
327262306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
327362306a36Sopenharmony_ci	u8 ch = chan->channel;
327462306a36Sopenharmony_ci	u32 tgidx, tgidx_1st, tgidx_2nd;
327562306a36Sopenharmony_ci	s8 tde_1st;
327662306a36Sopenharmony_ci	s8 tde_2nd;
327762306a36Sopenharmony_ci	s8 val;
327862306a36Sopenharmony_ci
327962306a36Sopenharmony_ci	tgidx = _tssi_get_trim_group(rtwdev, ch);
328062306a36Sopenharmony_ci
328162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
328262306a36Sopenharmony_ci		    "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n",
328362306a36Sopenharmony_ci		    path, tgidx);
328462306a36Sopenharmony_ci
328562306a36Sopenharmony_ci	if (IS_TSSI_EXTRA_GROUP(tgidx)) {
328662306a36Sopenharmony_ci		tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx);
328762306a36Sopenharmony_ci		tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx);
328862306a36Sopenharmony_ci		tde_1st = tssi_info->tssi_trim[path][tgidx_1st];
328962306a36Sopenharmony_ci		tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd];
329062306a36Sopenharmony_ci		val = (tde_1st + tde_2nd) / 2;
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
329362306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n",
329462306a36Sopenharmony_ci			    path, val, tde_1st, tde_2nd);
329562306a36Sopenharmony_ci	} else {
329662306a36Sopenharmony_ci		val = tssi_info->tssi_trim[path][tgidx];
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
329962306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs trim_de=%d\n",
330062306a36Sopenharmony_ci			    path, val);
330162306a36Sopenharmony_ci	}
330262306a36Sopenharmony_ci
330362306a36Sopenharmony_ci	return val;
330462306a36Sopenharmony_ci}
330562306a36Sopenharmony_ci
330662306a36Sopenharmony_cistatic void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
330762306a36Sopenharmony_ci{
330862306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
330962306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
331062306a36Sopenharmony_ci	u8 ch = chan->channel;
331162306a36Sopenharmony_ci	u8 gidx;
331262306a36Sopenharmony_ci	s8 ofdm_de;
331362306a36Sopenharmony_ci	s8 trim_de;
331462306a36Sopenharmony_ci	s32 val;
331562306a36Sopenharmony_ci	u32 i;
331662306a36Sopenharmony_ci
331762306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n",
331862306a36Sopenharmony_ci		    phy, ch);
331962306a36Sopenharmony_ci
332062306a36Sopenharmony_ci	for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) {
332162306a36Sopenharmony_ci		gidx = _tssi_get_cck_group(rtwdev, ch);
332262306a36Sopenharmony_ci		trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
332362306a36Sopenharmony_ci		val = tssi_info->tssi_cck[i][gidx] + trim_de;
332462306a36Sopenharmony_ci
332562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
332662306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n",
332762306a36Sopenharmony_ci			    i, gidx, tssi_info->tssi_cck[i][gidx], trim_de);
332862306a36Sopenharmony_ci
332962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val);
333062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val);
333162306a36Sopenharmony_ci
333262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
333362306a36Sopenharmony_ci			    "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n",
333462306a36Sopenharmony_ci			    _tssi_de_cck_long[i],
333562306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],
333662306a36Sopenharmony_ci						  _TSSI_DE_MASK));
333762306a36Sopenharmony_ci
333862306a36Sopenharmony_ci		ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
333962306a36Sopenharmony_ci		trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
334062306a36Sopenharmony_ci		val = ofdm_de + trim_de;
334162306a36Sopenharmony_ci
334262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
334362306a36Sopenharmony_ci			    "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n",
334462306a36Sopenharmony_ci			    i, ofdm_de, trim_de);
334562306a36Sopenharmony_ci
334662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val);
334762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val);
334862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val);
334962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], _TSSI_DE_MASK, val);
335062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val);
335162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val);
335262306a36Sopenharmony_ci
335362306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
335462306a36Sopenharmony_ci			    "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n",
335562306a36Sopenharmony_ci			    _tssi_de_mcs_20m[i],
335662306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i],
335762306a36Sopenharmony_ci						  _TSSI_DE_MASK));
335862306a36Sopenharmony_ci	}
335962306a36Sopenharmony_ci}
336062306a36Sopenharmony_ci
336162306a36Sopenharmony_cistatic void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
336262306a36Sopenharmony_ci{
336362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
336462306a36Sopenharmony_ci		    "[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n"
336562306a36Sopenharmony_ci		    "0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n",
336662306a36Sopenharmony_ci		    R_TSSI_PA_K1 + (path << 13),
336762306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K1 + (path << 13), MASKDWORD),
336862306a36Sopenharmony_ci		    R_TSSI_PA_K2 + (path << 13),
336962306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K2 + (path << 13), MASKDWORD),
337062306a36Sopenharmony_ci		    R_P0_TSSI_ALIM1 + (path << 13),
337162306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD),
337262306a36Sopenharmony_ci		    R_P0_TSSI_ALIM3 + (path << 13),
337362306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD),
337462306a36Sopenharmony_ci		    R_TSSI_PA_K5 + (path << 13),
337562306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K5 + (path << 13), MASKDWORD),
337662306a36Sopenharmony_ci		    R_P0_TSSI_ALIM2 + (path << 13),
337762306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD),
337862306a36Sopenharmony_ci		    R_P0_TSSI_ALIM4 + (path << 13),
337962306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD),
338062306a36Sopenharmony_ci		    R_TSSI_PA_K8 + (path << 13),
338162306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K8 + (path << 13), MASKDWORD));
338262306a36Sopenharmony_ci}
338362306a36Sopenharmony_ci
338462306a36Sopenharmony_cistatic void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
338562306a36Sopenharmony_ci				enum rtw89_phy_idx phy, enum rtw89_rf_path path)
338662306a36Sopenharmony_ci{
338762306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
338862306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
338962306a36Sopenharmony_ci	u8 channel = chan->channel;
339062306a36Sopenharmony_ci	u8 band;
339162306a36Sopenharmony_ci
339262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
339362306a36Sopenharmony_ci		    "======>%s   phy=%d   path=%d\n", __func__, phy, path);
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_ci	if (channel >= 1 && channel <= 14)
339662306a36Sopenharmony_ci		band = TSSI_ALIMK_2G;
339762306a36Sopenharmony_ci	else if (channel >= 36 && channel <= 64)
339862306a36Sopenharmony_ci		band = TSSI_ALIMK_5GL;
339962306a36Sopenharmony_ci	else if (channel >= 100 && channel <= 144)
340062306a36Sopenharmony_ci		band = TSSI_ALIMK_5GM;
340162306a36Sopenharmony_ci	else if (channel >= 149 && channel <= 177)
340262306a36Sopenharmony_ci		band = TSSI_ALIMK_5GH;
340362306a36Sopenharmony_ci	else
340462306a36Sopenharmony_ci		band = TSSI_ALIMK_2G;
340562306a36Sopenharmony_ci
340662306a36Sopenharmony_ci	if (tssi_info->alignment_done[path][band]) {
340762306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD,
340862306a36Sopenharmony_ci				       tssi_info->alignment_value[path][band][0]);
340962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD,
341062306a36Sopenharmony_ci				       tssi_info->alignment_value[path][band][1]);
341162306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD,
341262306a36Sopenharmony_ci				       tssi_info->alignment_value[path][band][2]);
341362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD,
341462306a36Sopenharmony_ci				       tssi_info->alignment_value[path][band][3]);
341562306a36Sopenharmony_ci	}
341662306a36Sopenharmony_ci
341762306a36Sopenharmony_ci	_tssi_alimentk_dump_result(rtwdev, path);
341862306a36Sopenharmony_ci}
341962306a36Sopenharmony_ci
342062306a36Sopenharmony_cistatic void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
342162306a36Sopenharmony_ci			enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm,
342262306a36Sopenharmony_ci			u8 enable)
342362306a36Sopenharmony_ci{
342462306a36Sopenharmony_ci	enum rtw89_rf_path_bit rx_path;
342562306a36Sopenharmony_ci
342662306a36Sopenharmony_ci	if (path == RF_PATH_A)
342762306a36Sopenharmony_ci		rx_path = RF_A;
342862306a36Sopenharmony_ci	else if (path == RF_PATH_B)
342962306a36Sopenharmony_ci		rx_path = RF_B;
343062306a36Sopenharmony_ci	else if (path == RF_PATH_AB)
343162306a36Sopenharmony_ci		rx_path = RF_AB;
343262306a36Sopenharmony_ci	else
343362306a36Sopenharmony_ci		rx_path = RF_ABCD; /* don't change path, but still set others */
343462306a36Sopenharmony_ci
343562306a36Sopenharmony_ci	if (enable) {
343662306a36Sopenharmony_ci		rtw8852b_bb_set_plcp_tx(rtwdev);
343762306a36Sopenharmony_ci		rtw8852b_bb_cfg_tx_path(rtwdev, path);
343862306a36Sopenharmony_ci		rtw8852b_bb_ctrl_rx_path(rtwdev, rx_path);
343962306a36Sopenharmony_ci		rtw8852b_bb_set_power(rtwdev, pwr_dbm, phy);
344062306a36Sopenharmony_ci	}
344162306a36Sopenharmony_ci
344262306a36Sopenharmony_ci	rtw8852b_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy);
344362306a36Sopenharmony_ci}
344462306a36Sopenharmony_ci
344562306a36Sopenharmony_cistatic void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev,
344662306a36Sopenharmony_ci				      enum rtw89_phy_idx phy, const u32 reg[],
344762306a36Sopenharmony_ci				      u32 reg_backup[], u32 reg_num)
344862306a36Sopenharmony_ci{
344962306a36Sopenharmony_ci	u32 i;
345062306a36Sopenharmony_ci
345162306a36Sopenharmony_ci	for (i = 0; i < reg_num; i++) {
345262306a36Sopenharmony_ci		reg_backup[i] = rtw89_phy_read32_mask(rtwdev, reg[i], MASKDWORD);
345362306a36Sopenharmony_ci
345462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
345562306a36Sopenharmony_ci			    "[TSSI] Backup BB 0x%x = 0x%x\n", reg[i],
345662306a36Sopenharmony_ci			    reg_backup[i]);
345762306a36Sopenharmony_ci	}
345862306a36Sopenharmony_ci}
345962306a36Sopenharmony_ci
346062306a36Sopenharmony_cistatic void _tssi_reload_bb_registers(struct rtw89_dev *rtwdev,
346162306a36Sopenharmony_ci				      enum rtw89_phy_idx phy, const u32 reg[],
346262306a36Sopenharmony_ci				      u32 reg_backup[], u32 reg_num)
346362306a36Sopenharmony_ci
346462306a36Sopenharmony_ci{
346562306a36Sopenharmony_ci	u32 i;
346662306a36Sopenharmony_ci
346762306a36Sopenharmony_ci	for (i = 0; i < reg_num; i++) {
346862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, reg[i], MASKDWORD, reg_backup[i]);
346962306a36Sopenharmony_ci
347062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
347162306a36Sopenharmony_ci			    "[TSSI] Reload BB 0x%x = 0x%x\n", reg[i],
347262306a36Sopenharmony_ci			    reg_backup[i]);
347362306a36Sopenharmony_ci	}
347462306a36Sopenharmony_ci}
347562306a36Sopenharmony_ci
347662306a36Sopenharmony_cistatic u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel)
347762306a36Sopenharmony_ci{
347862306a36Sopenharmony_ci	u8 channel_index;
347962306a36Sopenharmony_ci
348062306a36Sopenharmony_ci	if (channel >= 1 && channel <= 14)
348162306a36Sopenharmony_ci		channel_index = channel - 1;
348262306a36Sopenharmony_ci	else if (channel >= 36 && channel <= 64)
348362306a36Sopenharmony_ci		channel_index = (channel - 36) / 2 + 14;
348462306a36Sopenharmony_ci	else if (channel >= 100 && channel <= 144)
348562306a36Sopenharmony_ci		channel_index = ((channel - 100) / 2) + 15 + 14;
348662306a36Sopenharmony_ci	else if (channel >= 149 && channel <= 177)
348762306a36Sopenharmony_ci		channel_index = ((channel - 149) / 2) + 38 + 14;
348862306a36Sopenharmony_ci	else
348962306a36Sopenharmony_ci		channel_index = 0;
349062306a36Sopenharmony_ci
349162306a36Sopenharmony_ci	return channel_index;
349262306a36Sopenharmony_ci}
349362306a36Sopenharmony_ci
349462306a36Sopenharmony_cistatic bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
349562306a36Sopenharmony_ci				enum rtw89_rf_path path, const s16 *power,
349662306a36Sopenharmony_ci				u32 *tssi_cw_rpt)
349762306a36Sopenharmony_ci{
349862306a36Sopenharmony_ci	u32 tx_counter, tx_counter_tmp;
349962306a36Sopenharmony_ci	const int retry = 100;
350062306a36Sopenharmony_ci	u32 tmp;
350162306a36Sopenharmony_ci	int j, k;
350262306a36Sopenharmony_ci
350362306a36Sopenharmony_ci	for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) {
350462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x0);
350562306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x1);
350662306a36Sopenharmony_ci
350762306a36Sopenharmony_ci		tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
350862306a36Sopenharmony_ci
350962306a36Sopenharmony_ci		tmp = rtw89_phy_read32_mask(rtwdev, _tssi_trigger[path], MASKDWORD);
351062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
351162306a36Sopenharmony_ci			    "[TSSI PA K] 0x%x = 0x%08x   path=%d\n",
351262306a36Sopenharmony_ci			    _tssi_trigger[path], tmp, path);
351362306a36Sopenharmony_ci
351462306a36Sopenharmony_ci		if (j == 0)
351562306a36Sopenharmony_ci			_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true);
351662306a36Sopenharmony_ci		else
351762306a36Sopenharmony_ci			_tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true);
351862306a36Sopenharmony_ci
351962306a36Sopenharmony_ci		tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
352062306a36Sopenharmony_ci		tx_counter_tmp -= tx_counter;
352162306a36Sopenharmony_ci
352262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
352362306a36Sopenharmony_ci			    "[TSSI PA K] First HWTXcounter=%d path=%d\n",
352462306a36Sopenharmony_ci			    tx_counter_tmp, path);
352562306a36Sopenharmony_ci
352662306a36Sopenharmony_ci		for (k = 0; k < retry; k++) {
352762306a36Sopenharmony_ci			tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path],
352862306a36Sopenharmony_ci						    B_TSSI_CWRPT_RDY);
352962306a36Sopenharmony_ci			if (tmp)
353062306a36Sopenharmony_ci				break;
353162306a36Sopenharmony_ci
353262306a36Sopenharmony_ci			udelay(30);
353362306a36Sopenharmony_ci
353462306a36Sopenharmony_ci			tx_counter_tmp =
353562306a36Sopenharmony_ci				rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
353662306a36Sopenharmony_ci			tx_counter_tmp -= tx_counter;
353762306a36Sopenharmony_ci
353862306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK,
353962306a36Sopenharmony_ci				    "[TSSI PA K] Flow k = %d HWTXcounter=%d path=%d\n",
354062306a36Sopenharmony_ci				    k, tx_counter_tmp, path);
354162306a36Sopenharmony_ci		}
354262306a36Sopenharmony_ci
354362306a36Sopenharmony_ci		if (k >= retry) {
354462306a36Sopenharmony_ci			rtw89_debug(rtwdev, RTW89_DBG_RFK,
354562306a36Sopenharmony_ci				    "[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n",
354662306a36Sopenharmony_ci				    k, path);
354762306a36Sopenharmony_ci
354862306a36Sopenharmony_ci			_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
354962306a36Sopenharmony_ci			return false;
355062306a36Sopenharmony_ci		}
355162306a36Sopenharmony_ci
355262306a36Sopenharmony_ci		tssi_cw_rpt[j] =
355362306a36Sopenharmony_ci			rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], B_TSSI_CWRPT);
355462306a36Sopenharmony_ci
355562306a36Sopenharmony_ci		_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
355662306a36Sopenharmony_ci
355762306a36Sopenharmony_ci		tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
355862306a36Sopenharmony_ci		tx_counter_tmp -= tx_counter;
355962306a36Sopenharmony_ci
356062306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
356162306a36Sopenharmony_ci			    "[TSSI PA K] Final HWTXcounter=%d path=%d\n",
356262306a36Sopenharmony_ci			    tx_counter_tmp, path);
356362306a36Sopenharmony_ci	}
356462306a36Sopenharmony_ci
356562306a36Sopenharmony_ci	return true;
356662306a36Sopenharmony_ci}
356762306a36Sopenharmony_ci
356862306a36Sopenharmony_cistatic void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
356962306a36Sopenharmony_ci			   enum rtw89_rf_path path)
357062306a36Sopenharmony_ci{
357162306a36Sopenharmony_ci	static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4,
357262306a36Sopenharmony_ci				      0x78e4, 0x49c0, 0x0d18, 0x0d80};
357362306a36Sopenharmony_ci	static const s16 power_2g[4] = {48, 20, 4, 4};
357462306a36Sopenharmony_ci	static const s16 power_5g[4] = {48, 20, 4, 4};
357562306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
357662306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
357762306a36Sopenharmony_ci	s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3;
357862306a36Sopenharmony_ci	u32 tssi_cw_rpt[RTW8852B_TSSI_PATH_NR] = {0};
357962306a36Sopenharmony_ci	u8 channel = chan->channel;
358062306a36Sopenharmony_ci	u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel);
358162306a36Sopenharmony_ci	struct rtw8852b_bb_tssi_bak tssi_bak;
358262306a36Sopenharmony_ci	s32 aliment_diff, tssi_cw_default;
358362306a36Sopenharmony_ci	u32 start_time, finish_time;
358462306a36Sopenharmony_ci	u32 bb_reg_backup[8] = {0};
358562306a36Sopenharmony_ci	const s16 *power;
358662306a36Sopenharmony_ci	u8 band;
358762306a36Sopenharmony_ci	bool ok;
358862306a36Sopenharmony_ci	u32 tmp;
358962306a36Sopenharmony_ci	u8 j;
359062306a36Sopenharmony_ci
359162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
359262306a36Sopenharmony_ci		    "======> %s   channel=%d   path=%d\n", __func__, channel,
359362306a36Sopenharmony_ci		    path);
359462306a36Sopenharmony_ci
359562306a36Sopenharmony_ci	if (tssi_info->check_backup_aligmk[path][ch_idx]) {
359662306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD,
359762306a36Sopenharmony_ci				       tssi_info->alignment_backup_by_ch[path][ch_idx][0]);
359862306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD,
359962306a36Sopenharmony_ci				       tssi_info->alignment_backup_by_ch[path][ch_idx][1]);
360062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD,
360162306a36Sopenharmony_ci				       tssi_info->alignment_backup_by_ch[path][ch_idx][2]);
360262306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD,
360362306a36Sopenharmony_ci				       tssi_info->alignment_backup_by_ch[path][ch_idx][3]);
360462306a36Sopenharmony_ci
360562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
360662306a36Sopenharmony_ci			    "======> %s   Reload TSSI Alignment !!!\n", __func__);
360762306a36Sopenharmony_ci		_tssi_alimentk_dump_result(rtwdev, path);
360862306a36Sopenharmony_ci		return;
360962306a36Sopenharmony_ci	}
361062306a36Sopenharmony_ci
361162306a36Sopenharmony_ci	start_time = ktime_get_ns();
361262306a36Sopenharmony_ci
361362306a36Sopenharmony_ci	if (chan->band_type == RTW89_BAND_2G)
361462306a36Sopenharmony_ci		power = power_2g;
361562306a36Sopenharmony_ci	else
361662306a36Sopenharmony_ci		power = power_5g;
361762306a36Sopenharmony_ci
361862306a36Sopenharmony_ci	if (channel >= 1 && channel <= 14)
361962306a36Sopenharmony_ci		band = TSSI_ALIMK_2G;
362062306a36Sopenharmony_ci	else if (channel >= 36 && channel <= 64)
362162306a36Sopenharmony_ci		band = TSSI_ALIMK_5GL;
362262306a36Sopenharmony_ci	else if (channel >= 100 && channel <= 144)
362362306a36Sopenharmony_ci		band = TSSI_ALIMK_5GM;
362462306a36Sopenharmony_ci	else if (channel >= 149 && channel <= 177)
362562306a36Sopenharmony_ci		band = TSSI_ALIMK_5GH;
362662306a36Sopenharmony_ci	else
362762306a36Sopenharmony_ci		band = TSSI_ALIMK_2G;
362862306a36Sopenharmony_ci
362962306a36Sopenharmony_ci	rtw8852b_bb_backup_tssi(rtwdev, phy, &tssi_bak);
363062306a36Sopenharmony_ci	_tssi_backup_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup));
363162306a36Sopenharmony_ci
363262306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x8);
363362306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x8);
363462306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2);
363562306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2);
363662306a36Sopenharmony_ci
363762306a36Sopenharmony_ci	ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt);
363862306a36Sopenharmony_ci	if (!ok)
363962306a36Sopenharmony_ci		goto out;
364062306a36Sopenharmony_ci
364162306a36Sopenharmony_ci	for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) {
364262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
364362306a36Sopenharmony_ci			    "[TSSI PA K] power[%d]=%d  tssi_cw_rpt[%d]=%d\n", j,
364462306a36Sopenharmony_ci			    power[j], j, tssi_cw_rpt[j]);
364562306a36Sopenharmony_ci	}
364662306a36Sopenharmony_ci
364762306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][1],
364862306a36Sopenharmony_ci				    _tssi_cw_default_mask[1]);
364962306a36Sopenharmony_ci	tssi_cw_default = sign_extend32(tmp, 8);
365062306a36Sopenharmony_ci	tssi_alim_offset_1 = tssi_cw_rpt[0] - ((power[0] - power[1]) * 2) -
365162306a36Sopenharmony_ci			     tssi_cw_rpt[1] + tssi_cw_default;
365262306a36Sopenharmony_ci	aliment_diff = tssi_alim_offset_1 - tssi_cw_default;
365362306a36Sopenharmony_ci
365462306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][2],
365562306a36Sopenharmony_ci				    _tssi_cw_default_mask[2]);
365662306a36Sopenharmony_ci	tssi_cw_default = sign_extend32(tmp, 8);
365762306a36Sopenharmony_ci	tssi_alim_offset_2 = tssi_cw_default + aliment_diff;
365862306a36Sopenharmony_ci
365962306a36Sopenharmony_ci	tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][3],
366062306a36Sopenharmony_ci				    _tssi_cw_default_mask[3]);
366162306a36Sopenharmony_ci	tssi_cw_default = sign_extend32(tmp, 8);
366262306a36Sopenharmony_ci	tssi_alim_offset_3 = tssi_cw_default + aliment_diff;
366362306a36Sopenharmony_ci
366462306a36Sopenharmony_ci	if (path == RF_PATH_A) {
366562306a36Sopenharmony_ci		tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) |
366662306a36Sopenharmony_ci		      FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) |
366762306a36Sopenharmony_ci		      FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3);
366862306a36Sopenharmony_ci
366962306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM1, tmp);
367062306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2, B_P0_TSSI_ALIM2, tmp);
367162306a36Sopenharmony_ci
367262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
367362306a36Sopenharmony_ci			    "[TSSI PA K] tssi_alim_offset = 0x%x   0x%x   0x%x   0x%x\n",
367462306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3, B_P0_TSSI_ALIM31),
367562306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM11),
367662306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM12),
367762306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM13));
367862306a36Sopenharmony_ci	} else {
367962306a36Sopenharmony_ci		tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) |
368062306a36Sopenharmony_ci		      FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) |
368162306a36Sopenharmony_ci		      FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3);
368262306a36Sopenharmony_ci
368362306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM1, tmp);
368462306a36Sopenharmony_ci		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM2, B_P1_TSSI_ALIM2, tmp);
368562306a36Sopenharmony_ci
368662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
368762306a36Sopenharmony_ci			    "[TSSI PA K] tssi_alim_offset = 0x%x   0x%x   0x%x   0x%x\n",
368862306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM3, B_P1_TSSI_ALIM31),
368962306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM11),
369062306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM12),
369162306a36Sopenharmony_ci			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM13));
369262306a36Sopenharmony_ci	}
369362306a36Sopenharmony_ci
369462306a36Sopenharmony_ci	tssi_info->alignment_done[path][band] = true;
369562306a36Sopenharmony_ci	tssi_info->alignment_value[path][band][0] =
369662306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD);
369762306a36Sopenharmony_ci	tssi_info->alignment_value[path][band][1] =
369862306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD);
369962306a36Sopenharmony_ci	tssi_info->alignment_value[path][band][2] =
370062306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD);
370162306a36Sopenharmony_ci	tssi_info->alignment_value[path][band][3] =
370262306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD);
370362306a36Sopenharmony_ci
370462306a36Sopenharmony_ci	tssi_info->check_backup_aligmk[path][ch_idx] = true;
370562306a36Sopenharmony_ci	tssi_info->alignment_backup_by_ch[path][ch_idx][0] =
370662306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD);
370762306a36Sopenharmony_ci	tssi_info->alignment_backup_by_ch[path][ch_idx][1] =
370862306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD);
370962306a36Sopenharmony_ci	tssi_info->alignment_backup_by_ch[path][ch_idx][2] =
371062306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD);
371162306a36Sopenharmony_ci	tssi_info->alignment_backup_by_ch[path][ch_idx][3] =
371262306a36Sopenharmony_ci		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD);
371362306a36Sopenharmony_ci
371462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
371562306a36Sopenharmony_ci		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][0], 0x%x = 0x%08x\n",
371662306a36Sopenharmony_ci		    path, band, R_P0_TSSI_ALIM1 + (path << 13),
371762306a36Sopenharmony_ci		    tssi_info->alignment_value[path][band][0]);
371862306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
371962306a36Sopenharmony_ci		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][1], 0x%x = 0x%08x\n",
372062306a36Sopenharmony_ci		    path, band, R_P0_TSSI_ALIM3 + (path << 13),
372162306a36Sopenharmony_ci		    tssi_info->alignment_value[path][band][1]);
372262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
372362306a36Sopenharmony_ci		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][2], 0x%x = 0x%08x\n",
372462306a36Sopenharmony_ci		    path, band, R_P0_TSSI_ALIM2 + (path << 13),
372562306a36Sopenharmony_ci		    tssi_info->alignment_value[path][band][2]);
372662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
372762306a36Sopenharmony_ci		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][3], 0x%x = 0x%08x\n",
372862306a36Sopenharmony_ci		    path, band, R_P0_TSSI_ALIM4 + (path << 13),
372962306a36Sopenharmony_ci		    tssi_info->alignment_value[path][band][3]);
373062306a36Sopenharmony_ci
373162306a36Sopenharmony_ciout:
373262306a36Sopenharmony_ci	_tssi_reload_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup));
373362306a36Sopenharmony_ci	rtw8852b_bb_restore_tssi(rtwdev, phy, &tssi_bak);
373462306a36Sopenharmony_ci	rtw8852b_bb_tx_mode_switch(rtwdev, phy, 0);
373562306a36Sopenharmony_ci
373662306a36Sopenharmony_ci	finish_time = ktime_get_ns();
373762306a36Sopenharmony_ci	tssi_info->tssi_alimk_time += finish_time - start_time;
373862306a36Sopenharmony_ci
373962306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
374062306a36Sopenharmony_ci		    "[TSSI PA K] %s processing time = %d ms\n", __func__,
374162306a36Sopenharmony_ci		    tssi_info->tssi_alimk_time);
374262306a36Sopenharmony_ci}
374362306a36Sopenharmony_ci
374462306a36Sopenharmony_civoid rtw8852b_dpk_init(struct rtw89_dev *rtwdev)
374562306a36Sopenharmony_ci{
374662306a36Sopenharmony_ci	_set_dpd_backoff(rtwdev, RTW89_PHY_0);
374762306a36Sopenharmony_ci}
374862306a36Sopenharmony_ci
374962306a36Sopenharmony_civoid rtw8852b_rck(struct rtw89_dev *rtwdev)
375062306a36Sopenharmony_ci{
375162306a36Sopenharmony_ci	u8 path;
375262306a36Sopenharmony_ci
375362306a36Sopenharmony_ci	for (path = 0; path < RF_PATH_NUM_8852B; path++)
375462306a36Sopenharmony_ci		_rck(rtwdev, path);
375562306a36Sopenharmony_ci}
375662306a36Sopenharmony_ci
375762306a36Sopenharmony_civoid rtw8852b_dack(struct rtw89_dev *rtwdev)
375862306a36Sopenharmony_ci{
375962306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
376062306a36Sopenharmony_ci
376162306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
376262306a36Sopenharmony_ci	_dac_cal(rtwdev, false);
376362306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
376462306a36Sopenharmony_ci}
376562306a36Sopenharmony_ci
376662306a36Sopenharmony_civoid rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
376762306a36Sopenharmony_ci{
376862306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
376962306a36Sopenharmony_ci	u32 tx_en;
377062306a36Sopenharmony_ci
377162306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
377262306a36Sopenharmony_ci	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
377362306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
377462306a36Sopenharmony_ci
377562306a36Sopenharmony_ci	_iqk_init(rtwdev);
377662306a36Sopenharmony_ci	_iqk(rtwdev, phy_idx, false);
377762306a36Sopenharmony_ci
377862306a36Sopenharmony_ci	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
377962306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
378062306a36Sopenharmony_ci}
378162306a36Sopenharmony_ci
378262306a36Sopenharmony_civoid rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
378362306a36Sopenharmony_ci{
378462306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
378562306a36Sopenharmony_ci	u32 tx_en;
378662306a36Sopenharmony_ci
378762306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
378862306a36Sopenharmony_ci	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
378962306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
379062306a36Sopenharmony_ci
379162306a36Sopenharmony_ci	_rx_dck(rtwdev, phy_idx);
379262306a36Sopenharmony_ci
379362306a36Sopenharmony_ci	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
379462306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
379562306a36Sopenharmony_ci}
379662306a36Sopenharmony_ci
379762306a36Sopenharmony_civoid rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
379862306a36Sopenharmony_ci{
379962306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
380062306a36Sopenharmony_ci	u32 tx_en;
380162306a36Sopenharmony_ci
380262306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);
380362306a36Sopenharmony_ci	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
380462306a36Sopenharmony_ci	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
380562306a36Sopenharmony_ci
380662306a36Sopenharmony_ci	rtwdev->dpk.is_dpk_enable = true;
380762306a36Sopenharmony_ci	rtwdev->dpk.is_dpk_reload_en = false;
380862306a36Sopenharmony_ci	_dpk(rtwdev, phy_idx, false);
380962306a36Sopenharmony_ci
381062306a36Sopenharmony_ci	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
381162306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);
381262306a36Sopenharmony_ci}
381362306a36Sopenharmony_ci
381462306a36Sopenharmony_civoid rtw8852b_dpk_track(struct rtw89_dev *rtwdev)
381562306a36Sopenharmony_ci{
381662306a36Sopenharmony_ci	_dpk_track(rtwdev);
381762306a36Sopenharmony_ci}
381862306a36Sopenharmony_ci
381962306a36Sopenharmony_civoid rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
382062306a36Sopenharmony_ci{
382162306a36Sopenharmony_ci	u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB);
382262306a36Sopenharmony_ci	u32 tx_en;
382362306a36Sopenharmony_ci	u8 i;
382462306a36Sopenharmony_ci
382562306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy);
382662306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
382762306a36Sopenharmony_ci
382862306a36Sopenharmony_ci	_tssi_disable(rtwdev, phy);
382962306a36Sopenharmony_ci
383062306a36Sopenharmony_ci	for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) {
383162306a36Sopenharmony_ci		_tssi_rf_setting(rtwdev, phy, i);
383262306a36Sopenharmony_ci		_tssi_set_sys(rtwdev, phy, i);
383362306a36Sopenharmony_ci		_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
383462306a36Sopenharmony_ci		_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
383562306a36Sopenharmony_ci		_tssi_set_dck(rtwdev, phy, i);
383662306a36Sopenharmony_ci		_tssi_set_tmeter_tbl(rtwdev, phy, i);
383762306a36Sopenharmony_ci		_tssi_set_dac_gain_tbl(rtwdev, phy, i);
383862306a36Sopenharmony_ci		_tssi_slope_cal_org(rtwdev, phy, i);
383962306a36Sopenharmony_ci		_tssi_alignment_default(rtwdev, phy, i, true);
384062306a36Sopenharmony_ci		_tssi_set_tssi_slope(rtwdev, phy, i);
384162306a36Sopenharmony_ci
384262306a36Sopenharmony_ci		rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
384362306a36Sopenharmony_ci		_tmac_tx_pause(rtwdev, phy, true);
384462306a36Sopenharmony_ci		if (hwtx_en)
384562306a36Sopenharmony_ci			_tssi_alimentk(rtwdev, phy, i);
384662306a36Sopenharmony_ci		_tmac_tx_pause(rtwdev, phy, false);
384762306a36Sopenharmony_ci		rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en);
384862306a36Sopenharmony_ci	}
384962306a36Sopenharmony_ci
385062306a36Sopenharmony_ci	_tssi_enable(rtwdev, phy);
385162306a36Sopenharmony_ci	_tssi_set_efuse_to_de(rtwdev, phy);
385262306a36Sopenharmony_ci
385362306a36Sopenharmony_ci	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
385462306a36Sopenharmony_ci}
385562306a36Sopenharmony_ci
385662306a36Sopenharmony_civoid rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
385762306a36Sopenharmony_ci{
385862306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
385962306a36Sopenharmony_ci	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
386062306a36Sopenharmony_ci	u8 channel = chan->channel;
386162306a36Sopenharmony_ci	u8 band;
386262306a36Sopenharmony_ci	u32 i;
386362306a36Sopenharmony_ci
386462306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
386562306a36Sopenharmony_ci		    "======>%s   phy=%d  channel=%d\n", __func__, phy, channel);
386662306a36Sopenharmony_ci
386762306a36Sopenharmony_ci	if (channel >= 1 && channel <= 14)
386862306a36Sopenharmony_ci		band = TSSI_ALIMK_2G;
386962306a36Sopenharmony_ci	else if (channel >= 36 && channel <= 64)
387062306a36Sopenharmony_ci		band = TSSI_ALIMK_5GL;
387162306a36Sopenharmony_ci	else if (channel >= 100 && channel <= 144)
387262306a36Sopenharmony_ci		band = TSSI_ALIMK_5GM;
387362306a36Sopenharmony_ci	else if (channel >= 149 && channel <= 177)
387462306a36Sopenharmony_ci		band = TSSI_ALIMK_5GH;
387562306a36Sopenharmony_ci	else
387662306a36Sopenharmony_ci		band = TSSI_ALIMK_2G;
387762306a36Sopenharmony_ci
387862306a36Sopenharmony_ci	_tssi_disable(rtwdev, phy);
387962306a36Sopenharmony_ci
388062306a36Sopenharmony_ci	for (i = RF_PATH_A; i < RTW8852B_TSSI_PATH_NR; i++) {
388162306a36Sopenharmony_ci		_tssi_rf_setting(rtwdev, phy, i);
388262306a36Sopenharmony_ci		_tssi_set_sys(rtwdev, phy, i);
388362306a36Sopenharmony_ci		_tssi_set_tmeter_tbl(rtwdev, phy, i);
388462306a36Sopenharmony_ci
388562306a36Sopenharmony_ci		if (tssi_info->alignment_done[i][band])
388662306a36Sopenharmony_ci			_tssi_alimentk_done(rtwdev, phy, i);
388762306a36Sopenharmony_ci		else
388862306a36Sopenharmony_ci			_tssi_alignment_default(rtwdev, phy, i, true);
388962306a36Sopenharmony_ci	}
389062306a36Sopenharmony_ci
389162306a36Sopenharmony_ci	_tssi_enable(rtwdev, phy);
389262306a36Sopenharmony_ci	_tssi_set_efuse_to_de(rtwdev, phy);
389362306a36Sopenharmony_ci}
389462306a36Sopenharmony_ci
389562306a36Sopenharmony_cistatic void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev,
389662306a36Sopenharmony_ci					enum rtw89_phy_idx phy, bool enable)
389762306a36Sopenharmony_ci{
389862306a36Sopenharmony_ci	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
389962306a36Sopenharmony_ci	u8 channel = chan->channel;
390062306a36Sopenharmony_ci
390162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s   ch=%d\n",
390262306a36Sopenharmony_ci		    __func__, channel);
390362306a36Sopenharmony_ci
390462306a36Sopenharmony_ci	if (enable) {
390562306a36Sopenharmony_ci		if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B])
390662306a36Sopenharmony_ci			rtw8852b_tssi(rtwdev, phy, true);
390762306a36Sopenharmony_ci		return;
390862306a36Sopenharmony_ci	}
390962306a36Sopenharmony_ci
391062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
391162306a36Sopenharmony_ci		    "======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
391262306a36Sopenharmony_ci		    __func__,
391362306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT),
391462306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT));
391562306a36Sopenharmony_ci
391662306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0);
391762306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT,  0xc0);
391862306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);
391962306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);
392062306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0);
392162306a36Sopenharmony_ci	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1);
392262306a36Sopenharmony_ci
392362306a36Sopenharmony_ci	_tssi_alimentk_done(rtwdev, phy, RF_PATH_A);
392462306a36Sopenharmony_ci	_tssi_alimentk_done(rtwdev, phy, RF_PATH_B);
392562306a36Sopenharmony_ci
392662306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
392762306a36Sopenharmony_ci		    "======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
392862306a36Sopenharmony_ci		    __func__,
392962306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT),
393062306a36Sopenharmony_ci		    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT));
393162306a36Sopenharmony_ci
393262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
393362306a36Sopenharmony_ci		    "======> %s   SCAN_END\n", __func__);
393462306a36Sopenharmony_ci}
393562306a36Sopenharmony_ci
393662306a36Sopenharmony_civoid rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
393762306a36Sopenharmony_ci			       enum rtw89_phy_idx phy_idx)
393862306a36Sopenharmony_ci{
393962306a36Sopenharmony_ci	if (scan_start)
394062306a36Sopenharmony_ci		rtw8852b_tssi_default_txagc(rtwdev, phy_idx, true);
394162306a36Sopenharmony_ci	else
394262306a36Sopenharmony_ci		rtw8852b_tssi_default_txagc(rtwdev, phy_idx, false);
394362306a36Sopenharmony_ci}
394462306a36Sopenharmony_ci
394562306a36Sopenharmony_cistatic void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
394662306a36Sopenharmony_ci			enum rtw89_bandwidth bw, bool dav)
394762306a36Sopenharmony_ci{
394862306a36Sopenharmony_ci	u32 rf_reg18;
394962306a36Sopenharmony_ci	u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
395062306a36Sopenharmony_ci
395162306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
395262306a36Sopenharmony_ci
395362306a36Sopenharmony_ci	rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
395462306a36Sopenharmony_ci	if (rf_reg18 == INV_RF_DATA) {
395562306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK,
395662306a36Sopenharmony_ci			    "[RFK]Invalid RF_0x18 for Path-%d\n", path);
395762306a36Sopenharmony_ci		return;
395862306a36Sopenharmony_ci	}
395962306a36Sopenharmony_ci	rf_reg18 &= ~RR_CFGCH_BW;
396062306a36Sopenharmony_ci
396162306a36Sopenharmony_ci	switch (bw) {
396262306a36Sopenharmony_ci	case RTW89_CHANNEL_WIDTH_5:
396362306a36Sopenharmony_ci	case RTW89_CHANNEL_WIDTH_10:
396462306a36Sopenharmony_ci	case RTW89_CHANNEL_WIDTH_20:
396562306a36Sopenharmony_ci		rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M);
396662306a36Sopenharmony_ci		break;
396762306a36Sopenharmony_ci	case RTW89_CHANNEL_WIDTH_40:
396862306a36Sopenharmony_ci		rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M);
396962306a36Sopenharmony_ci		break;
397062306a36Sopenharmony_ci	case RTW89_CHANNEL_WIDTH_80:
397162306a36Sopenharmony_ci		rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M);
397262306a36Sopenharmony_ci		break;
397362306a36Sopenharmony_ci	default:
397462306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n");
397562306a36Sopenharmony_ci	}
397662306a36Sopenharmony_ci
397762306a36Sopenharmony_ci	rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
397862306a36Sopenharmony_ci		      RR_CFGCH_BW2) & RFREG_MASK;
397962306a36Sopenharmony_ci	rf_reg18 |= RR_CFGCH_BW2;
398062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
398162306a36Sopenharmony_ci
398262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n",
398362306a36Sopenharmony_ci		    bw, path, reg18_addr,
398462306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
398562306a36Sopenharmony_ci}
398662306a36Sopenharmony_ci
398762306a36Sopenharmony_cistatic void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
398862306a36Sopenharmony_ci		     enum rtw89_bandwidth bw)
398962306a36Sopenharmony_ci{
399062306a36Sopenharmony_ci	_bw_setting(rtwdev, RF_PATH_A, bw, true);
399162306a36Sopenharmony_ci	_bw_setting(rtwdev, RF_PATH_B, bw, true);
399262306a36Sopenharmony_ci	_bw_setting(rtwdev, RF_PATH_A, bw, false);
399362306a36Sopenharmony_ci	_bw_setting(rtwdev, RF_PATH_B, bw, false);
399462306a36Sopenharmony_ci}
399562306a36Sopenharmony_ci
399662306a36Sopenharmony_cistatic bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val)
399762306a36Sopenharmony_ci{
399862306a36Sopenharmony_ci	u32 bak;
399962306a36Sopenharmony_ci	u32 tmp;
400062306a36Sopenharmony_ci	int ret;
400162306a36Sopenharmony_ci
400262306a36Sopenharmony_ci	bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK);
400362306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1);
400462306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val);
400562306a36Sopenharmony_ci
400662306a36Sopenharmony_ci	ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000,
400762306a36Sopenharmony_ci				       false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY);
400862306a36Sopenharmony_ci	if (ret)
400962306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n");
401062306a36Sopenharmony_ci
401162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak);
401262306a36Sopenharmony_ci
401362306a36Sopenharmony_ci	return !!ret;
401462306a36Sopenharmony_ci}
401562306a36Sopenharmony_ci
401662306a36Sopenharmony_cistatic void _lck_check(struct rtw89_dev *rtwdev)
401762306a36Sopenharmony_ci{
401862306a36Sopenharmony_ci	u32 tmp;
401962306a36Sopenharmony_ci
402062306a36Sopenharmony_ci	if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
402162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n");
402262306a36Sopenharmony_ci
402362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1);
402462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0);
402562306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1);
402662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0);
402762306a36Sopenharmony_ci	}
402862306a36Sopenharmony_ci
402962306a36Sopenharmony_ci	udelay(10);
403062306a36Sopenharmony_ci
403162306a36Sopenharmony_ci	if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
403262306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n");
403362306a36Sopenharmony_ci
403462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
403562306a36Sopenharmony_ci		tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
403662306a36Sopenharmony_ci		_set_s0_arfc18(rtwdev, tmp);
403762306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
403862306a36Sopenharmony_ci	}
403962306a36Sopenharmony_ci
404062306a36Sopenharmony_ci	if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {
404162306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n");
404262306a36Sopenharmony_ci
404362306a36Sopenharmony_ci		tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK);
404462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp);
404562306a36Sopenharmony_ci		tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK);
404662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp);
404762306a36Sopenharmony_ci
404862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1);
404962306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0);
405062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3);
405162306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0);
405262306a36Sopenharmony_ci
405362306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);
405462306a36Sopenharmony_ci		tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);
405562306a36Sopenharmony_ci		_set_s0_arfc18(rtwdev, tmp);
405662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);
405762306a36Sopenharmony_ci
405862306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n",
405962306a36Sopenharmony_ci			    rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK),
406062306a36Sopenharmony_ci			    rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK));
406162306a36Sopenharmony_ci	}
406262306a36Sopenharmony_ci}
406362306a36Sopenharmony_ci
406462306a36Sopenharmony_cistatic void _set_ch(struct rtw89_dev *rtwdev, u32 val)
406562306a36Sopenharmony_ci{
406662306a36Sopenharmony_ci	bool timeout;
406762306a36Sopenharmony_ci
406862306a36Sopenharmony_ci	timeout = _set_s0_arfc18(rtwdev, val);
406962306a36Sopenharmony_ci	if (!timeout)
407062306a36Sopenharmony_ci		_lck_check(rtwdev);
407162306a36Sopenharmony_ci}
407262306a36Sopenharmony_ci
407362306a36Sopenharmony_cistatic void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
407462306a36Sopenharmony_ci			u8 central_ch, bool dav)
407562306a36Sopenharmony_ci{
407662306a36Sopenharmony_ci	u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;
407762306a36Sopenharmony_ci	bool is_2g_ch = central_ch <= 14;
407862306a36Sopenharmony_ci	u32 rf_reg18;
407962306a36Sopenharmony_ci
408062306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);
408162306a36Sopenharmony_ci
408262306a36Sopenharmony_ci	rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);
408362306a36Sopenharmony_ci	rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH |
408462306a36Sopenharmony_ci		      RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH);
408562306a36Sopenharmony_ci	rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch);
408662306a36Sopenharmony_ci
408762306a36Sopenharmony_ci	if (!is_2g_ch)
408862306a36Sopenharmony_ci		rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) |
408962306a36Sopenharmony_ci			    FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G);
409062306a36Sopenharmony_ci
409162306a36Sopenharmony_ci	rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |
409262306a36Sopenharmony_ci		      RR_CFGCH_BW2) & RFREG_MASK;
409362306a36Sopenharmony_ci	rf_reg18 |= RR_CFGCH_BW2;
409462306a36Sopenharmony_ci
409562306a36Sopenharmony_ci	if (path == RF_PATH_A && dav)
409662306a36Sopenharmony_ci		_set_ch(rtwdev, rf_reg18);
409762306a36Sopenharmony_ci	else
409862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);
409962306a36Sopenharmony_ci
410062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0);
410162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1);
410262306a36Sopenharmony_ci
410362306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK,
410462306a36Sopenharmony_ci		    "[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n",
410562306a36Sopenharmony_ci		    central_ch, path, reg18_addr,
410662306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));
410762306a36Sopenharmony_ci}
410862306a36Sopenharmony_ci
410962306a36Sopenharmony_cistatic void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch)
411062306a36Sopenharmony_ci{
411162306a36Sopenharmony_ci	_ch_setting(rtwdev, RF_PATH_A, central_ch, true);
411262306a36Sopenharmony_ci	_ch_setting(rtwdev, RF_PATH_B, central_ch, true);
411362306a36Sopenharmony_ci	_ch_setting(rtwdev, RF_PATH_A, central_ch, false);
411462306a36Sopenharmony_ci	_ch_setting(rtwdev, RF_PATH_B, central_ch, false);
411562306a36Sopenharmony_ci}
411662306a36Sopenharmony_ci
411762306a36Sopenharmony_cistatic void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw,
411862306a36Sopenharmony_ci			 enum rtw89_rf_path path)
411962306a36Sopenharmony_ci{
412062306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1);
412162306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12);
412262306a36Sopenharmony_ci
412362306a36Sopenharmony_ci	if (bw == RTW89_CHANNEL_WIDTH_20)
412462306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b);
412562306a36Sopenharmony_ci	else if (bw == RTW89_CHANNEL_WIDTH_40)
412662306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13);
412762306a36Sopenharmony_ci	else if (bw == RTW89_CHANNEL_WIDTH_80)
412862306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb);
412962306a36Sopenharmony_ci	else
413062306a36Sopenharmony_ci		rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3);
413162306a36Sopenharmony_ci
413262306a36Sopenharmony_ci	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n", path,
413362306a36Sopenharmony_ci		    rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB));
413462306a36Sopenharmony_ci
413562306a36Sopenharmony_ci	rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0);
413662306a36Sopenharmony_ci}
413762306a36Sopenharmony_ci
413862306a36Sopenharmony_cistatic void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
413962306a36Sopenharmony_ci		     enum rtw89_bandwidth bw)
414062306a36Sopenharmony_ci{
414162306a36Sopenharmony_ci	u8 kpath, path;
414262306a36Sopenharmony_ci
414362306a36Sopenharmony_ci	kpath = _kpath(rtwdev, phy);
414462306a36Sopenharmony_ci
414562306a36Sopenharmony_ci	for (path = 0; path < RF_PATH_NUM_8852B; path++) {
414662306a36Sopenharmony_ci		if (!(kpath & BIT(path)))
414762306a36Sopenharmony_ci			continue;
414862306a36Sopenharmony_ci
414962306a36Sopenharmony_ci		_set_rxbb_bw(rtwdev, bw, path);
415062306a36Sopenharmony_ci	}
415162306a36Sopenharmony_ci}
415262306a36Sopenharmony_ci
415362306a36Sopenharmony_cistatic void rtw8852b_ctrl_bw_ch(struct rtw89_dev *rtwdev,
415462306a36Sopenharmony_ci				enum rtw89_phy_idx phy, u8 central_ch,
415562306a36Sopenharmony_ci				enum rtw89_band band, enum rtw89_bandwidth bw)
415662306a36Sopenharmony_ci{
415762306a36Sopenharmony_ci	_ctrl_ch(rtwdev, central_ch);
415862306a36Sopenharmony_ci	_ctrl_bw(rtwdev, phy, bw);
415962306a36Sopenharmony_ci	_rxbb_bw(rtwdev, phy, bw);
416062306a36Sopenharmony_ci}
416162306a36Sopenharmony_ci
416262306a36Sopenharmony_civoid rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev,
416362306a36Sopenharmony_ci			     const struct rtw89_chan *chan,
416462306a36Sopenharmony_ci			     enum rtw89_phy_idx phy_idx)
416562306a36Sopenharmony_ci{
416662306a36Sopenharmony_ci	rtw8852b_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type,
416762306a36Sopenharmony_ci			    chan->band_width);
416862306a36Sopenharmony_ci}
4169