xref: /freebsd-src/sys/contrib/dev/rtw89/rtw8852bt_rfk.c (revision 6d67aabd63555ab62a2f2b7f52a75ef100a2fe75)
1*6d67aabdSBjoern A. Zeeb // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2*6d67aabdSBjoern A. Zeeb /* Copyright(c) 2024 Realtek Corporation
3*6d67aabdSBjoern A. Zeeb  */
4*6d67aabdSBjoern A. Zeeb 
5*6d67aabdSBjoern A. Zeeb #include "coex.h"
6*6d67aabdSBjoern A. Zeeb #include "debug.h"
7*6d67aabdSBjoern A. Zeeb #include "fw.h"
8*6d67aabdSBjoern A. Zeeb #include "mac.h"
9*6d67aabdSBjoern A. Zeeb #include "phy.h"
10*6d67aabdSBjoern A. Zeeb #include "reg.h"
11*6d67aabdSBjoern A. Zeeb #include "rtw8852bt.h"
12*6d67aabdSBjoern A. Zeeb #include "rtw8852bt_rfk.h"
13*6d67aabdSBjoern A. Zeeb #include "rtw8852bt_rfk_table.h"
14*6d67aabdSBjoern A. Zeeb #include "rtw8852b_common.h"
15*6d67aabdSBjoern A. Zeeb 
16*6d67aabdSBjoern A. Zeeb #define RTW8852BT_RXDCK_VER 0x1
17*6d67aabdSBjoern A. Zeeb #define RTW8852BT_IQK_VER 0x2a
18*6d67aabdSBjoern A. Zeeb #define RTW8852BT_SS 2
19*6d67aabdSBjoern A. Zeeb #define RTW8852BT_TSSI_PATH_NR 2
20*6d67aabdSBjoern A. Zeeb #define RTW8852BT_DPK_VER 0x06
21*6d67aabdSBjoern A. Zeeb #define DPK_RF_PATH_MAX_8852BT 2
22*6d67aabdSBjoern A. Zeeb 
23*6d67aabdSBjoern A. Zeeb #define _TSSI_DE_MASK GENMASK(21, 12)
24*6d67aabdSBjoern A. Zeeb #define DPK_TXAGC_LOWER 0x2e
25*6d67aabdSBjoern A. Zeeb #define DPK_TXAGC_UPPER 0x3f
26*6d67aabdSBjoern A. Zeeb #define DPK_TXAGC_INVAL 0xff
27*6d67aabdSBjoern A. Zeeb #define RFREG_MASKRXBB 0x003e0
28*6d67aabdSBjoern A. Zeeb #define RFREG_MASKMODE 0xf0000
29*6d67aabdSBjoern A. Zeeb 
30*6d67aabdSBjoern A. Zeeb enum rf_mode {
31*6d67aabdSBjoern A. Zeeb 	RF_SHUT_DOWN = 0x0,
32*6d67aabdSBjoern A. Zeeb 	RF_STANDBY = 0x1,
33*6d67aabdSBjoern A. Zeeb 	RF_TX = 0x2,
34*6d67aabdSBjoern A. Zeeb 	RF_RX = 0x3,
35*6d67aabdSBjoern A. Zeeb 	RF_TXIQK = 0x4,
36*6d67aabdSBjoern A. Zeeb 	RF_DPK = 0x5,
37*6d67aabdSBjoern A. Zeeb 	RF_RXK1 = 0x6,
38*6d67aabdSBjoern A. Zeeb 	RF_RXK2 = 0x7,
39*6d67aabdSBjoern A. Zeeb };
40*6d67aabdSBjoern A. Zeeb 
41*6d67aabdSBjoern A. Zeeb enum rtw8852bt_dpk_id {
42*6d67aabdSBjoern A. Zeeb 	LBK_RXIQK	= 0x06,
43*6d67aabdSBjoern A. Zeeb 	SYNC		= 0x10,
44*6d67aabdSBjoern A. Zeeb 	MDPK_IDL	= 0x11,
45*6d67aabdSBjoern A. Zeeb 	MDPK_MPA	= 0x12,
46*6d67aabdSBjoern A. Zeeb 	GAIN_LOSS	= 0x13,
47*6d67aabdSBjoern A. Zeeb 	GAIN_CAL	= 0x14,
48*6d67aabdSBjoern A. Zeeb 	DPK_RXAGC	= 0x15,
49*6d67aabdSBjoern A. Zeeb 	KIP_PRESET	= 0x16,
50*6d67aabdSBjoern A. Zeeb 	KIP_RESTORE	= 0x17,
51*6d67aabdSBjoern A. Zeeb 	DPK_TXAGC	= 0x19,
52*6d67aabdSBjoern A. Zeeb 	D_KIP_PRESET	= 0x28,
53*6d67aabdSBjoern A. Zeeb 	D_TXAGC		= 0x29,
54*6d67aabdSBjoern A. Zeeb 	D_RXAGC		= 0x2a,
55*6d67aabdSBjoern A. Zeeb 	D_SYNC		= 0x2b,
56*6d67aabdSBjoern A. Zeeb 	D_GAIN_LOSS	= 0x2c,
57*6d67aabdSBjoern A. Zeeb 	D_MDPK_IDL	= 0x2d,
58*6d67aabdSBjoern A. Zeeb 	D_GAIN_NORM	= 0x2f,
59*6d67aabdSBjoern A. Zeeb 	D_KIP_THERMAL	= 0x30,
60*6d67aabdSBjoern A. Zeeb 	D_KIP_RESTORE	= 0x31
61*6d67aabdSBjoern A. Zeeb };
62*6d67aabdSBjoern A. Zeeb 
63*6d67aabdSBjoern A. Zeeb enum dpk_agc_step {
64*6d67aabdSBjoern A. Zeeb 	DPK_AGC_STEP_SYNC_DGAIN,
65*6d67aabdSBjoern A. Zeeb 	DPK_AGC_STEP_GAIN_ADJ,
66*6d67aabdSBjoern A. Zeeb 	DPK_AGC_STEP_GAIN_LOSS_IDX,
67*6d67aabdSBjoern A. Zeeb 	DPK_AGC_STEP_GL_GT_CRITERION,
68*6d67aabdSBjoern A. Zeeb 	DPK_AGC_STEP_GL_LT_CRITERION,
69*6d67aabdSBjoern A. Zeeb 	DPK_AGC_STEP_SET_TX_GAIN,
70*6d67aabdSBjoern A. Zeeb };
71*6d67aabdSBjoern A. Zeeb 
72*6d67aabdSBjoern A. Zeeb enum rtw8852bt_iqk_type {
73*6d67aabdSBjoern A. Zeeb 	ID_TXAGC = 0x0,
74*6d67aabdSBjoern A. Zeeb 	ID_FLOK_COARSE = 0x1,
75*6d67aabdSBjoern A. Zeeb 	ID_FLOK_FINE = 0x2,
76*6d67aabdSBjoern A. Zeeb 	ID_TXK = 0x3,
77*6d67aabdSBjoern A. Zeeb 	ID_RXAGC = 0x4,
78*6d67aabdSBjoern A. Zeeb 	ID_RXK = 0x5,
79*6d67aabdSBjoern A. Zeeb 	ID_NBTXK = 0x6,
80*6d67aabdSBjoern A. Zeeb 	ID_NBRXK = 0x7,
81*6d67aabdSBjoern A. Zeeb 	ID_FLOK_VBUFFER = 0x8,
82*6d67aabdSBjoern A. Zeeb 	ID_A_FLOK_COARSE = 0x9,
83*6d67aabdSBjoern A. Zeeb 	ID_G_FLOK_COARSE = 0xa,
84*6d67aabdSBjoern A. Zeeb 	ID_A_FLOK_FINE = 0xb,
85*6d67aabdSBjoern A. Zeeb 	ID_G_FLOK_FINE = 0xc,
86*6d67aabdSBjoern A. Zeeb 	ID_IQK_RESTORE = 0x10,
87*6d67aabdSBjoern A. Zeeb };
88*6d67aabdSBjoern A. Zeeb 
89*6d67aabdSBjoern A. Zeeb enum adc_ck {
90*6d67aabdSBjoern A. Zeeb 	ADC_NA = 0,
91*6d67aabdSBjoern A. Zeeb 	ADC_480M = 1,
92*6d67aabdSBjoern A. Zeeb 	ADC_960M = 2,
93*6d67aabdSBjoern A. Zeeb 	ADC_1920M = 3,
94*6d67aabdSBjoern A. Zeeb };
95*6d67aabdSBjoern A. Zeeb 
96*6d67aabdSBjoern A. Zeeb enum dac_ck {
97*6d67aabdSBjoern A. Zeeb 	DAC_40M = 0,
98*6d67aabdSBjoern A. Zeeb 	DAC_80M = 1,
99*6d67aabdSBjoern A. Zeeb 	DAC_120M = 2,
100*6d67aabdSBjoern A. Zeeb 	DAC_160M = 3,
101*6d67aabdSBjoern A. Zeeb 	DAC_240M = 4,
102*6d67aabdSBjoern A. Zeeb 	DAC_320M = 5,
103*6d67aabdSBjoern A. Zeeb 	DAC_480M = 6,
104*6d67aabdSBjoern A. Zeeb 	DAC_960M = 7,
105*6d67aabdSBjoern A. Zeeb };
106*6d67aabdSBjoern A. Zeeb 
107*6d67aabdSBjoern A. Zeeb static const u32 _tssi_trigger[RTW8852BT_TSSI_PATH_NR] = {0x5820, 0x7820};
108*6d67aabdSBjoern A. Zeeb static const u32 _tssi_cw_rpt_addr[RTW8852BT_TSSI_PATH_NR] = {0x1c18, 0x3c18};
109*6d67aabdSBjoern A. Zeeb static const u32 _tssi_cw_default_addr[RTW8852BT_TSSI_PATH_NR][4] = {
110*6d67aabdSBjoern A. Zeeb 	{0x5634, 0x5630, 0x5630, 0x5630},
111*6d67aabdSBjoern A. Zeeb 	{0x7634, 0x7630, 0x7630, 0x7630} };
112*6d67aabdSBjoern A. Zeeb static const u32 _tssi_cw_default_mask[4] = {
113*6d67aabdSBjoern A. Zeeb 	0x000003ff, 0x3ff00000, 0x000ffc00, 0x000003ff};
114*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_cck_long[RF_PATH_NUM_8852BT] = {0x5858, 0x7858};
115*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_cck_short[RF_PATH_NUM_8852BT] = {0x5860, 0x7860};
116*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8852BT] = {0x5838, 0x7838};
117*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8852BT] = {0x5840, 0x7840};
118*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8852BT] = {0x5848, 0x7848};
119*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8852BT] = {0x5850, 0x7850};
120*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852BT] = {0x5828, 0x7828};
121*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852BT] = {0x5830, 0x7830};
122*6d67aabdSBjoern A. Zeeb 
123*6d67aabdSBjoern A. Zeeb static const u32 rtw8852bt_backup_bb_regs[] = {0x2344, 0x5800, 0x7800, 0x0704};
124*6d67aabdSBjoern A. Zeeb static const u32 rtw8852bt_backup_rf_regs[] = {
125*6d67aabdSBjoern A. Zeeb 	0xde, 0xdf, 0x8b, 0x90, 0x97, 0x85, 0x5, 0x10005};
126*6d67aabdSBjoern A. Zeeb static const u32 rtw8852bt_backup_kip_regs[] = {
127*6d67aabdSBjoern A. Zeeb 	0x813c, 0x8124, 0x8120, 0xc0d4, 0xc0d8, 0xc0c4, 0xc0ec,
128*6d67aabdSBjoern A. Zeeb 	0x823c, 0x8224, 0x8220, 0xc1d4, 0xc1d8, 0xc1c4, 0xc1ec};
129*6d67aabdSBjoern A. Zeeb 
130*6d67aabdSBjoern A. Zeeb #define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852bt_backup_bb_regs)
131*6d67aabdSBjoern A. Zeeb #define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852bt_backup_rf_regs)
132*6d67aabdSBjoern A. Zeeb #define BACKUP_KIP_REGS_NR ARRAY_SIZE(rtw8852bt_backup_kip_regs)
133*6d67aabdSBjoern A. Zeeb 
134*6d67aabdSBjoern A. Zeeb static void _rfk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx, enum rtw89_rf_path path)
135*6d67aabdSBjoern A. Zeeb {
136*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
137*6d67aabdSBjoern A. Zeeb 
138*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1);
139*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x0);
140*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1);
141*6d67aabdSBjoern A. Zeeb 
142*6d67aabdSBjoern A. Zeeb 	udelay(200);
143*6d67aabdSBjoern A. Zeeb 
144*6d67aabdSBjoern A. Zeeb 	dpk->bp[path][kidx].ther_dpk = rtw89_read_rf(rtwdev, path, RR_TM, RR_TM_VAL);
145*6d67aabdSBjoern A. Zeeb 
146*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n",
147*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].ther_dpk);
148*6d67aabdSBjoern A. Zeeb }
149*6d67aabdSBjoern A. Zeeb 
150*6d67aabdSBjoern A. Zeeb static void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[])
151*6d67aabdSBjoern A. Zeeb {
152*6d67aabdSBjoern A. Zeeb 	u32 i;
153*6d67aabdSBjoern A. Zeeb 
154*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
155*6d67aabdSBjoern A. Zeeb 		backup_bb_reg_val[i] =
156*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, rtw8852bt_backup_bb_regs[i], MASKDWORD);
157*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
158*6d67aabdSBjoern A. Zeeb 			    "[RFK]backup bb reg : %x, value =%x\n",
159*6d67aabdSBjoern A. Zeeb 			    rtw8852bt_backup_bb_regs[i], backup_bb_reg_val[i]);
160*6d67aabdSBjoern A. Zeeb 	}
161*6d67aabdSBjoern A. Zeeb }
162*6d67aabdSBjoern A. Zeeb 
163*6d67aabdSBjoern A. Zeeb static void _rfk_backup_kip_reg(struct rtw89_dev *rtwdev, u32 backup_kip_reg_val[])
164*6d67aabdSBjoern A. Zeeb {
165*6d67aabdSBjoern A. Zeeb 	u32 i;
166*6d67aabdSBjoern A. Zeeb 
167*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < BACKUP_KIP_REGS_NR; i++) {
168*6d67aabdSBjoern A. Zeeb 		backup_kip_reg_val[i] =
169*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, rtw8852bt_backup_kip_regs[i],
170*6d67aabdSBjoern A. Zeeb 					      MASKDWORD);
171*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n",
172*6d67aabdSBjoern A. Zeeb 			    rtw8852bt_backup_kip_regs[i], backup_kip_reg_val[i]);
173*6d67aabdSBjoern A. Zeeb 	}
174*6d67aabdSBjoern A. Zeeb }
175*6d67aabdSBjoern A. Zeeb 
176*6d67aabdSBjoern A. Zeeb static
177*6d67aabdSBjoern A. Zeeb void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[], u8 rf_path)
178*6d67aabdSBjoern A. Zeeb {
179*6d67aabdSBjoern A. Zeeb 	u32 i;
180*6d67aabdSBjoern A. Zeeb 
181*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
182*6d67aabdSBjoern A. Zeeb 		backup_rf_reg_val[i] =
183*6d67aabdSBjoern A. Zeeb 			rtw89_read_rf(rtwdev, rf_path, rtw8852bt_backup_rf_regs[i],
184*6d67aabdSBjoern A. Zeeb 				      RFREG_MASK);
185*6d67aabdSBjoern A. Zeeb 
186*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup RF S%d 0x%x = %x\n",
187*6d67aabdSBjoern A. Zeeb 			    rf_path, rtw8852bt_backup_rf_regs[i], backup_rf_reg_val[i]);
188*6d67aabdSBjoern A. Zeeb 	}
189*6d67aabdSBjoern A. Zeeb }
190*6d67aabdSBjoern A. Zeeb 
191*6d67aabdSBjoern A. Zeeb static void _rfk_reload_bb_reg(struct rtw89_dev *rtwdev, const u32 backup_bb_reg_val[])
192*6d67aabdSBjoern A. Zeeb {
193*6d67aabdSBjoern A. Zeeb 	u32 i;
194*6d67aabdSBjoern A. Zeeb 
195*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < BACKUP_BB_REGS_NR; i++) {
196*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, rtw8852bt_backup_bb_regs[i],
197*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, backup_bb_reg_val[i]);
198*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
199*6d67aabdSBjoern A. Zeeb 			    "[RFK]restore bb reg : %x, value =%x\n",
200*6d67aabdSBjoern A. Zeeb 			    rtw8852bt_backup_bb_regs[i], backup_bb_reg_val[i]);
201*6d67aabdSBjoern A. Zeeb 	}
202*6d67aabdSBjoern A. Zeeb }
203*6d67aabdSBjoern A. Zeeb 
204*6d67aabdSBjoern A. Zeeb static void _rfk_reload_kip_reg(struct rtw89_dev *rtwdev, u32 backup_kip_reg_val[])
205*6d67aabdSBjoern A. Zeeb {
206*6d67aabdSBjoern A. Zeeb 	u32 i;
207*6d67aabdSBjoern A. Zeeb 
208*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < BACKUP_KIP_REGS_NR; i++) {
209*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, rtw8852bt_backup_kip_regs[i],
210*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, backup_kip_reg_val[i]);
211*6d67aabdSBjoern A. Zeeb 
212*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
213*6d67aabdSBjoern A. Zeeb 			    "[RFK]restore kip reg : %x, value =%x\n",
214*6d67aabdSBjoern A. Zeeb 			    rtw8852bt_backup_kip_regs[i], backup_kip_reg_val[i]);
215*6d67aabdSBjoern A. Zeeb 	}
216*6d67aabdSBjoern A. Zeeb }
217*6d67aabdSBjoern A. Zeeb 
218*6d67aabdSBjoern A. Zeeb static void _rfk_reload_rf_reg(struct rtw89_dev *rtwdev,
219*6d67aabdSBjoern A. Zeeb 			       const u32 backup_rf_reg_val[], u8 rf_path)
220*6d67aabdSBjoern A. Zeeb {
221*6d67aabdSBjoern A. Zeeb 	u32 i;
222*6d67aabdSBjoern A. Zeeb 
223*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < BACKUP_RF_REGS_NR; i++) {
224*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, rf_path, rtw8852bt_backup_rf_regs[i],
225*6d67aabdSBjoern A. Zeeb 			       RFREG_MASK, backup_rf_reg_val[i]);
226*6d67aabdSBjoern A. Zeeb 
227*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
228*6d67aabdSBjoern A. Zeeb 			    "[RFK]restore rf S%d reg: %x, value =%x\n", rf_path,
229*6d67aabdSBjoern A. Zeeb 			    rtw8852bt_backup_rf_regs[i], backup_rf_reg_val[i]);
230*6d67aabdSBjoern A. Zeeb 	}
231*6d67aabdSBjoern A. Zeeb }
232*6d67aabdSBjoern A. Zeeb 
233*6d67aabdSBjoern A. Zeeb static u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
234*6d67aabdSBjoern A. Zeeb {
235*6d67aabdSBjoern A. Zeeb 	u8 val;
236*6d67aabdSBjoern A. Zeeb 
237*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x,PHY%d\n",
238*6d67aabdSBjoern A. Zeeb 		    rtwdev->dbcc_en, phy_idx);
239*6d67aabdSBjoern A. Zeeb 
240*6d67aabdSBjoern A. Zeeb 	if (!rtwdev->dbcc_en) {
241*6d67aabdSBjoern A. Zeeb 		val = RF_AB;
242*6d67aabdSBjoern A. Zeeb 	} else {
243*6d67aabdSBjoern A. Zeeb 		if (phy_idx == RTW89_PHY_0)
244*6d67aabdSBjoern A. Zeeb 			val = RF_A;
245*6d67aabdSBjoern A. Zeeb 		else
246*6d67aabdSBjoern A. Zeeb 			val = RF_B;
247*6d67aabdSBjoern A. Zeeb 	}
248*6d67aabdSBjoern A. Zeeb 	return val;
249*6d67aabdSBjoern A. Zeeb }
250*6d67aabdSBjoern A. Zeeb 
251*6d67aabdSBjoern A. Zeeb static
252*6d67aabdSBjoern A. Zeeb void _txck_force(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool force,
253*6d67aabdSBjoern A. Zeeb 		 enum dac_ck ck)
254*6d67aabdSBjoern A. Zeeb {
255*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x0);
256*6d67aabdSBjoern A. Zeeb 
257*6d67aabdSBjoern A. Zeeb 	if (!force)
258*6d67aabdSBjoern A. Zeeb 		return;
259*6d67aabdSBjoern A. Zeeb 
260*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_VAL, ck);
261*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x1);
262*6d67aabdSBjoern A. Zeeb }
263*6d67aabdSBjoern A. Zeeb 
264*6d67aabdSBjoern A. Zeeb static
265*6d67aabdSBjoern A. Zeeb void _rxck_force(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool force,
266*6d67aabdSBjoern A. Zeeb 		 enum adc_ck ck)
267*6d67aabdSBjoern A. Zeeb {
268*6d67aabdSBjoern A. Zeeb 	u32 bw = 0;
269*6d67aabdSBjoern A. Zeeb 
270*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x0);
271*6d67aabdSBjoern A. Zeeb 
272*6d67aabdSBjoern A. Zeeb 	if (!force)
273*6d67aabdSBjoern A. Zeeb 		return;
274*6d67aabdSBjoern A. Zeeb 
275*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_VAL, ck);
276*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x1);
277*6d67aabdSBjoern A. Zeeb 
278*6d67aabdSBjoern A. Zeeb 	switch (ck) {
279*6d67aabdSBjoern A. Zeeb 	case ADC_480M:
280*6d67aabdSBjoern A. Zeeb 		bw = RTW89_CHANNEL_WIDTH_40;
281*6d67aabdSBjoern A. Zeeb 		break;
282*6d67aabdSBjoern A. Zeeb 	case ADC_960M:
283*6d67aabdSBjoern A. Zeeb 		bw = RTW89_CHANNEL_WIDTH_80;
284*6d67aabdSBjoern A. Zeeb 		break;
285*6d67aabdSBjoern A. Zeeb 	case ADC_1920M:
286*6d67aabdSBjoern A. Zeeb 		bw = RTW89_CHANNEL_WIDTH_160;
287*6d67aabdSBjoern A. Zeeb 		break;
288*6d67aabdSBjoern A. Zeeb 	default:
289*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "%s==>Invalid ck", __func__);
290*6d67aabdSBjoern A. Zeeb 		break;
291*6d67aabdSBjoern A. Zeeb 	}
292*6d67aabdSBjoern A. Zeeb 
293*6d67aabdSBjoern A. Zeeb 	rtw8852bx_adc_cfg(rtwdev, bw, path);
294*6d67aabdSBjoern A. Zeeb }
295*6d67aabdSBjoern A. Zeeb 
296*6d67aabdSBjoern A. Zeeb static void _rfk_bb_afe_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
297*6d67aabdSBjoern A. Zeeb 				enum rtw89_rf_path path, u8 kpath)
298*6d67aabdSBjoern A. Zeeb {
299*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x0303);
300*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x1);
301*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x1);
302*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x3);
303*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_CLKG_FORCE, 0x3);
304*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x1ffffff);
305*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x1);
306*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x1);
307*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, B_TXRX_FORCE_VAL, 0x3ff);
308*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_CLKEN, 0x3);
309*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_RST, B_IQK_DPK_RST, 0x1);
310*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_PATH_RST, B_P0_PATH_RST, 0x1);
311*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_PATH_RST, B_P1_PATH_RST, 0x1);
312*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1);
313*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1);
314*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCFO_WEIGHT, B_DAC_CLK_IDX, 0x1);
315*6d67aabdSBjoern A. Zeeb 
316*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_A, true, DAC_960M);
317*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_B, true, DAC_960M);
318*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_A, true, ADC_1920M);
319*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_B, true, ADC_1920M);
320*6d67aabdSBjoern A. Zeeb 
321*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC,
322*6d67aabdSBjoern A. Zeeb 			       B_UPD_CLK_ADC_VAL | B_UPD_CLK_ADC_ON, 0x5);
323*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
324*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
325*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, MASKBYTE3, 0x1f);
326*6d67aabdSBjoern A. Zeeb 	udelay(1);
327*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, MASKBYTE3, 0x13);
328*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, MASKHWORD, 0x0001);
329*6d67aabdSBjoern A. Zeeb 	udelay(1);
330*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, MASKHWORD, 0x0041);
331*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_RSTB, 0x1);
332*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x3333);
333*6d67aabdSBjoern A. Zeeb 
334*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXPWRB_H, B_TXPWRB_RDY, 0x1);
335*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_OFT_EN, MASKLWORD, 0x0000);
336*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_FORCE, B_P1_TXPW_RDY, 0x1);
337*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TXAGC_TH, MASKLWORD, 0x0000);
338*6d67aabdSBjoern A. Zeeb }
339*6d67aabdSBjoern A. Zeeb 
340*6d67aabdSBjoern A. Zeeb static void _rfk_bb_afe_restore(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
341*6d67aabdSBjoern A. Zeeb 				enum rtw89_rf_path path, u8 kpath)
342*6d67aabdSBjoern A. Zeeb {
343*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x0303);
344*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
345*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
346*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x0);
347*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_CLKG_FORCE, 0x0);
348*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x0);
349*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x0);
350*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x0);
351*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, B_TXRX_FORCE_VAL, 0x63);
352*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_TXCK_ALL, 0x00);
353*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_TXCK_ALL, 0x00);
354*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC,
355*6d67aabdSBjoern A. Zeeb 			       B_UPD_CLK_ADC_VAL | B_UPD_CLK_ADC_ON, 0x0);
356*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x0000);
357*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x0);
358*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x0);
359*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0);
360*6d67aabdSBjoern A. Zeeb 
361*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXPWRB_H, B_TXPWRB_RDY, 0x0);
362*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TXPW_RSTB, 0x1);
363*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TXPW_RSTB, 0x2);
364*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_FORCE, B_P1_TXPW_RDY, 0x0);
365*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TXPW_RSTB, 0x1);
366*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TXPW_RSTB, 0x2);
367*6d67aabdSBjoern A. Zeeb }
368*6d67aabdSBjoern A. Zeeb 
369*6d67aabdSBjoern A. Zeeb static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
370*6d67aabdSBjoern A. Zeeb 			enum rtw89_rf_path path)
371*6d67aabdSBjoern A. Zeeb {
372*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0);
373*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);
374*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1);
375*6d67aabdSBjoern A. Zeeb 	mdelay(1);
376*6d67aabdSBjoern A. Zeeb }
377*6d67aabdSBjoern A. Zeeb 
378*6d67aabdSBjoern A. Zeeb static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
379*6d67aabdSBjoern A. Zeeb {
380*6d67aabdSBjoern A. Zeeb 	u8 path, dck_tune;
381*6d67aabdSBjoern A. Zeeb 	u32 rf_reg5;
382*6d67aabdSBjoern A. Zeeb 
383*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
384*6d67aabdSBjoern A. Zeeb 		    "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, CV : 0x%x) ******\n",
385*6d67aabdSBjoern A. Zeeb 		    RTW8852BT_RXDCK_VER, rtwdev->hal.cv);
386*6d67aabdSBjoern A. Zeeb 
387*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < RF_PATH_NUM_8852BT; path++) {
388*6d67aabdSBjoern A. Zeeb 		rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
389*6d67aabdSBjoern A. Zeeb 		dck_tune = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE);
390*6d67aabdSBjoern A. Zeeb 
391*6d67aabdSBjoern A. Zeeb 		if (rtwdev->is_tssi_mode[path])
392*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev,
393*6d67aabdSBjoern A. Zeeb 					       R_P0_TSSI_TRK + (path << 13),
394*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_TRK_EN, 0x1);
395*6d67aabdSBjoern A. Zeeb 
396*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
397*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0);
398*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
399*6d67aabdSBjoern A. Zeeb 		_set_rx_dck(rtwdev, phy, path);
400*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune);
401*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
402*6d67aabdSBjoern A. Zeeb 
403*6d67aabdSBjoern A. Zeeb 		if (rtwdev->is_tssi_mode[path])
404*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev,
405*6d67aabdSBjoern A. Zeeb 					       R_P0_TSSI_TRK + (path << 13),
406*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_TRK_EN, 0x0);
407*6d67aabdSBjoern A. Zeeb 	}
408*6d67aabdSBjoern A. Zeeb }
409*6d67aabdSBjoern A. Zeeb 
410*6d67aabdSBjoern A. Zeeb static void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
411*6d67aabdSBjoern A. Zeeb {
412*6d67aabdSBjoern A. Zeeb 	u32 rf_reg5;
413*6d67aabdSBjoern A. Zeeb 	u32 rck_val;
414*6d67aabdSBjoern A. Zeeb 	u32 val;
415*6d67aabdSBjoern A. Zeeb 	int ret;
416*6d67aabdSBjoern A. Zeeb 
417*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path);
418*6d67aabdSBjoern A. Zeeb 
419*6d67aabdSBjoern A. Zeeb 	rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);
420*6d67aabdSBjoern A. Zeeb 
421*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
422*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);
423*6d67aabdSBjoern A. Zeeb 
424*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n",
425*6d67aabdSBjoern A. Zeeb 		    rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK));
426*6d67aabdSBjoern A. Zeeb 
427*6d67aabdSBjoern A. Zeeb 	/* RCK trigger */
428*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240);
429*6d67aabdSBjoern A. Zeeb 
430*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30,
431*6d67aabdSBjoern A. Zeeb 				       false, rtwdev, path, RR_RCKS, BIT(3));
432*6d67aabdSBjoern A. Zeeb 
433*6d67aabdSBjoern A. Zeeb 	rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA);
434*6d67aabdSBjoern A. Zeeb 
435*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n",
436*6d67aabdSBjoern A. Zeeb 		    rck_val, ret);
437*6d67aabdSBjoern A. Zeeb 
438*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val);
439*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);
440*6d67aabdSBjoern A. Zeeb 
441*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n",
442*6d67aabdSBjoern A. Zeeb 		    rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK));
443*6d67aabdSBjoern A. Zeeb }
444*6d67aabdSBjoern A. Zeeb 
445*6d67aabdSBjoern A. Zeeb static void _drck(struct rtw89_dev *rtwdev)
446*6d67aabdSBjoern A. Zeeb {
447*6d67aabdSBjoern A. Zeeb 	u32 rck_d;
448*6d67aabdSBjoern A. Zeeb 	u32 val;
449*6d67aabdSBjoern A. Zeeb 	int ret;
450*6d67aabdSBjoern A. Zeeb 
451*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n");
452*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x1);
453*6d67aabdSBjoern A. Zeeb 
454*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val,
455*6d67aabdSBjoern A. Zeeb 				       1, 10000, false,
456*6d67aabdSBjoern A. Zeeb 				       rtwdev, R_DRCK_RES, B_DRCK_POL);
457*6d67aabdSBjoern A. Zeeb 	if (ret)
458*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n");
459*6d67aabdSBjoern A. Zeeb 
460*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x0);
461*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1);
462*6d67aabdSBjoern A. Zeeb 	udelay(1);
463*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0);
464*6d67aabdSBjoern A. Zeeb 
465*6d67aabdSBjoern A. Zeeb 	rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RES, 0x7c00);
466*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_IDLE, 0x0);
467*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_VAL, rck_d);
468*6d67aabdSBjoern A. Zeeb 
469*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0c4 = 0x%x\n",
470*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, R_DRCK, MASKDWORD));
471*6d67aabdSBjoern A. Zeeb }
472*6d67aabdSBjoern A. Zeeb 
473*6d67aabdSBjoern A. Zeeb static void _dack_backup_s0(struct rtw89_dev *rtwdev)
474*6d67aabdSBjoern A. Zeeb {
475*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
476*6d67aabdSBjoern A. Zeeb 	u8 i;
477*6d67aabdSBjoern A. Zeeb 
478*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
479*6d67aabdSBjoern A. Zeeb 
480*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 0x10; i++) {
481*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i);
482*6d67aabdSBjoern A. Zeeb 		dack->msbk_d[0][0][i] =
483*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0);
484*6d67aabdSBjoern A. Zeeb 
485*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i);
486*6d67aabdSBjoern A. Zeeb 		dack->msbk_d[0][1][i] =
487*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1);
488*6d67aabdSBjoern A. Zeeb 	}
489*6d67aabdSBjoern A. Zeeb 
490*6d67aabdSBjoern A. Zeeb 	dack->biask_d[0][0] =
491*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00);
492*6d67aabdSBjoern A. Zeeb 	dack->biask_d[0][1] =
493*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01);
494*6d67aabdSBjoern A. Zeeb 
495*6d67aabdSBjoern A. Zeeb 	dack->dadck_d[0][0] =
496*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00);
497*6d67aabdSBjoern A. Zeeb 	dack->dadck_d[0][1] =
498*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01);
499*6d67aabdSBjoern A. Zeeb }
500*6d67aabdSBjoern A. Zeeb 
501*6d67aabdSBjoern A. Zeeb static void _dack_backup_s1(struct rtw89_dev *rtwdev)
502*6d67aabdSBjoern A. Zeeb {
503*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
504*6d67aabdSBjoern A. Zeeb 	u8 i;
505*6d67aabdSBjoern A. Zeeb 
506*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
507*6d67aabdSBjoern A. Zeeb 
508*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 0x10; i++) {
509*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10, i);
510*6d67aabdSBjoern A. Zeeb 		dack->msbk_d[1][0][i] =
511*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK10S);
512*6d67aabdSBjoern A. Zeeb 
513*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DACK11, B_DACK11, i);
514*6d67aabdSBjoern A. Zeeb 		dack->msbk_d[1][1][i] =
515*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK11S);
516*6d67aabdSBjoern A. Zeeb 	}
517*6d67aabdSBjoern A. Zeeb 
518*6d67aabdSBjoern A. Zeeb 	dack->biask_d[1][0] =
519*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS10, B_DACK_BIAS10);
520*6d67aabdSBjoern A. Zeeb 	dack->biask_d[1][1] =
521*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS11, B_DACK_BIAS11);
522*6d67aabdSBjoern A. Zeeb 
523*6d67aabdSBjoern A. Zeeb 	dack->dadck_d[1][0] =
524*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK10, B_DACK_DADCK10);
525*6d67aabdSBjoern A. Zeeb 	dack->dadck_d[1][1] =
526*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK11, B_DACK_DADCK11);
527*6d67aabdSBjoern A. Zeeb }
528*6d67aabdSBjoern A. Zeeb 
529*6d67aabdSBjoern A. Zeeb static
530*6d67aabdSBjoern A. Zeeb void _dack_reset(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
531*6d67aabdSBjoern A. Zeeb {
532*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A) {
533*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x0);
534*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x1);
535*6d67aabdSBjoern A. Zeeb 	} else {
536*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10_RST, 0x0);
537*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10_RST, 0x1);
538*6d67aabdSBjoern A. Zeeb 	}
539*6d67aabdSBjoern A. Zeeb }
540*6d67aabdSBjoern A. Zeeb 
541*6d67aabdSBjoern A. Zeeb static
542*6d67aabdSBjoern A. Zeeb void _dack_reload_by_path(struct rtw89_dev *rtwdev, u8 path, u8 index)
543*6d67aabdSBjoern A. Zeeb {
544*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
545*6d67aabdSBjoern A. Zeeb 	u32 tmp, tmp_offset, tmp_reg;
546*6d67aabdSBjoern A. Zeeb 	u32 idx_offset, path_offset;
547*6d67aabdSBjoern A. Zeeb 	u8 i;
548*6d67aabdSBjoern A. Zeeb 
549*6d67aabdSBjoern A. Zeeb 	if (index == 0)
550*6d67aabdSBjoern A. Zeeb 		idx_offset = 0;
551*6d67aabdSBjoern A. Zeeb 	else
552*6d67aabdSBjoern A. Zeeb 		idx_offset = 0x14;
553*6d67aabdSBjoern A. Zeeb 
554*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A)
555*6d67aabdSBjoern A. Zeeb 		path_offset = 0;
556*6d67aabdSBjoern A. Zeeb 	else
557*6d67aabdSBjoern A. Zeeb 		path_offset = 0x28;
558*6d67aabdSBjoern A. Zeeb 
559*6d67aabdSBjoern A. Zeeb 	tmp_offset = idx_offset + path_offset;
560*6d67aabdSBjoern A. Zeeb 
561*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_RST, 0x1);
562*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCOF9, B_DCOF9_RST, 0x1);
563*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_RST, 0x1);
564*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACK2_K, B_DACK2_RST, 0x1);
565*6d67aabdSBjoern A. Zeeb 
566*6d67aabdSBjoern A. Zeeb 	/* msbk_d: 15/14/13/12 */
567*6d67aabdSBjoern A. Zeeb 	tmp = 0x0;
568*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 4; i++)
569*6d67aabdSBjoern A. Zeeb 		tmp |= dack->msbk_d[path][index][i + 12] << (i * 8);
570*6d67aabdSBjoern A. Zeeb 	tmp_reg = 0xc200 + tmp_offset;
571*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
572*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
573*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
574*6d67aabdSBjoern A. Zeeb 
575*6d67aabdSBjoern A. Zeeb 	/* msbk_d: 11/10/9/8 */
576*6d67aabdSBjoern A. Zeeb 	tmp = 0x0;
577*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 4; i++)
578*6d67aabdSBjoern A. Zeeb 		tmp |= dack->msbk_d[path][index][i + 8] << (i * 8);
579*6d67aabdSBjoern A. Zeeb 	tmp_reg = 0xc204 + tmp_offset;
580*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
581*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
582*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
583*6d67aabdSBjoern A. Zeeb 
584*6d67aabdSBjoern A. Zeeb 	/* msbk_d: 7/6/5/4 */
585*6d67aabdSBjoern A. Zeeb 	tmp = 0x0;
586*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 4; i++)
587*6d67aabdSBjoern A. Zeeb 		tmp |= dack->msbk_d[path][index][i + 4] << (i * 8);
588*6d67aabdSBjoern A. Zeeb 	tmp_reg = 0xc208 + tmp_offset;
589*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
590*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
591*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
592*6d67aabdSBjoern A. Zeeb 
593*6d67aabdSBjoern A. Zeeb 	/* msbk_d: 3/2/1/0 */
594*6d67aabdSBjoern A. Zeeb 	tmp = 0x0;
595*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 4; i++)
596*6d67aabdSBjoern A. Zeeb 		tmp |= dack->msbk_d[path][index][i] << (i * 8);
597*6d67aabdSBjoern A. Zeeb 	tmp_reg = 0xc20c + tmp_offset;
598*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
599*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
600*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
601*6d67aabdSBjoern A. Zeeb 
602*6d67aabdSBjoern A. Zeeb 	/* dadak_d/biask_d */
603*6d67aabdSBjoern A. Zeeb 	tmp = (dack->biask_d[path][index] << 22) |
604*6d67aabdSBjoern A. Zeeb 	      (dack->dadck_d[path][index] << 14);
605*6d67aabdSBjoern A. Zeeb 	tmp_reg = 0xc210 + tmp_offset;
606*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32(rtwdev, tmp_reg, tmp);
607*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg,
608*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD));
609*6d67aabdSBjoern A. Zeeb 
610*6d67aabdSBjoern A. Zeeb 	/* enable DACK result from reg */
611*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL + tmp_offset, B_DACKN0_EN, 0x1);
612*6d67aabdSBjoern A. Zeeb }
613*6d67aabdSBjoern A. Zeeb 
614*6d67aabdSBjoern A. Zeeb static
615*6d67aabdSBjoern A. Zeeb void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
616*6d67aabdSBjoern A. Zeeb {
617*6d67aabdSBjoern A. Zeeb 	u8 i;
618*6d67aabdSBjoern A. Zeeb 
619*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 2; i++)
620*6d67aabdSBjoern A. Zeeb 		_dack_reload_by_path(rtwdev, path, i);
621*6d67aabdSBjoern A. Zeeb }
622*6d67aabdSBjoern A. Zeeb 
623*6d67aabdSBjoern A. Zeeb static bool _dack_s0_poll(struct rtw89_dev *rtwdev)
624*6d67aabdSBjoern A. Zeeb {
625*6d67aabdSBjoern A. Zeeb 	if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 ||
626*6d67aabdSBjoern A. Zeeb 	    rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0 ||
627*6d67aabdSBjoern A. Zeeb 	    rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 ||
628*6d67aabdSBjoern A. Zeeb 	    rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0)
629*6d67aabdSBjoern A. Zeeb 		return false;
630*6d67aabdSBjoern A. Zeeb 
631*6d67aabdSBjoern A. Zeeb 	return true;
632*6d67aabdSBjoern A. Zeeb }
633*6d67aabdSBjoern A. Zeeb 
634*6d67aabdSBjoern A. Zeeb static void _dack_s0(struct rtw89_dev *rtwdev)
635*6d67aabdSBjoern A. Zeeb {
636*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
637*6d67aabdSBjoern A. Zeeb 	bool done;
638*6d67aabdSBjoern A. Zeeb 	int ret;
639*6d67aabdSBjoern A. Zeeb 
640*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_A, true, DAC_160M);
641*6d67aabdSBjoern A. Zeeb 
642*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
643*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, BIT(28), 0x1);
644*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN1, 0x0);
645*6d67aabdSBjoern A. Zeeb 	udelay(100);
646*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_VAL, 0x30);
647*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCOF9, B_DCOF9_VAL, 0x30);
648*6d67aabdSBjoern A. Zeeb 
649*6d67aabdSBjoern A. Zeeb 	_dack_reset(rtwdev, RF_PATH_A);
650*6d67aabdSBjoern A. Zeeb 
651*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x1);
652*6d67aabdSBjoern A. Zeeb 	udelay(1);
653*6d67aabdSBjoern A. Zeeb 
654*6d67aabdSBjoern A. Zeeb 	dack->msbk_timeout[0] = false;
655*6d67aabdSBjoern A. Zeeb 
656*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(_dack_s0_poll, done, done,
657*6d67aabdSBjoern A. Zeeb 				       1, 20000, false, rtwdev);
658*6d67aabdSBjoern A. Zeeb 	if (ret) {
659*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DACK timeout\n");
660*6d67aabdSBjoern A. Zeeb 		dack->msbk_timeout[0] = true;
661*6d67aabdSBjoern A. Zeeb 	}
662*6d67aabdSBjoern A. Zeeb 
663*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x0);
664*6d67aabdSBjoern A. Zeeb 
665*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_A, false, DAC_960M);
666*6d67aabdSBjoern A. Zeeb 	_dack_backup_s0(rtwdev);
667*6d67aabdSBjoern A. Zeeb 	_dack_reload(rtwdev, RF_PATH_A);
668*6d67aabdSBjoern A. Zeeb 
669*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
670*6d67aabdSBjoern A. Zeeb }
671*6d67aabdSBjoern A. Zeeb 
672*6d67aabdSBjoern A. Zeeb static bool _dack_s1_poll(struct rtw89_dev *rtwdev)
673*6d67aabdSBjoern A. Zeeb {
674*6d67aabdSBjoern A. Zeeb 	if (rtw89_phy_read32_mask(rtwdev, R_DACK_S1P0, B_DACK_S1P0_OK) == 0 ||
675*6d67aabdSBjoern A. Zeeb 	    rtw89_phy_read32_mask(rtwdev, R_DACK_S1P1, B_DACK_S1P1_OK) == 0 ||
676*6d67aabdSBjoern A. Zeeb 	    rtw89_phy_read32_mask(rtwdev, R_DACK_S1P2, B_DACK_S1P2_OK) == 0 ||
677*6d67aabdSBjoern A. Zeeb 	    rtw89_phy_read32_mask(rtwdev, R_DACK_S1P3, B_DACK_S1P3_OK) == 0)
678*6d67aabdSBjoern A. Zeeb 		return false;
679*6d67aabdSBjoern A. Zeeb 
680*6d67aabdSBjoern A. Zeeb 	return true;
681*6d67aabdSBjoern A. Zeeb }
682*6d67aabdSBjoern A. Zeeb 
683*6d67aabdSBjoern A. Zeeb static void _dack_s1(struct rtw89_dev *rtwdev)
684*6d67aabdSBjoern A. Zeeb {
685*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
686*6d67aabdSBjoern A. Zeeb 	bool done;
687*6d67aabdSBjoern A. Zeeb 	int ret;
688*6d67aabdSBjoern A. Zeeb 
689*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_B, true, DAC_160M);
690*6d67aabdSBjoern A. Zeeb 
691*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
692*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, BIT(28), 0x1);
693*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN1, 0x0);
694*6d67aabdSBjoern A. Zeeb 	udelay(100);
695*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_VAL, 0x30);
696*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACK2_K, B_DACK2_VAL, 0x30);
697*6d67aabdSBjoern A. Zeeb 
698*6d67aabdSBjoern A. Zeeb 	_dack_reset(rtwdev, RF_PATH_B);
699*6d67aabdSBjoern A. Zeeb 
700*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_EN, 0x1);
701*6d67aabdSBjoern A. Zeeb 	udelay(1);
702*6d67aabdSBjoern A. Zeeb 
703*6d67aabdSBjoern A. Zeeb 	dack->msbk_timeout[1] = false;
704*6d67aabdSBjoern A. Zeeb 
705*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(_dack_s1_poll, done, done,
706*6d67aabdSBjoern A. Zeeb 				       1, 10000, false, rtwdev);
707*6d67aabdSBjoern A. Zeeb 	if (ret) {
708*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DACK timeout\n");
709*6d67aabdSBjoern A. Zeeb 		dack->msbk_timeout[1] = true;
710*6d67aabdSBjoern A. Zeeb 	}
711*6d67aabdSBjoern A. Zeeb 
712*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_EN, 0x0);
713*6d67aabdSBjoern A. Zeeb 
714*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_B, false, DAC_960M);
715*6d67aabdSBjoern A. Zeeb 	_dack_backup_s1(rtwdev);
716*6d67aabdSBjoern A. Zeeb 	_dack_reload(rtwdev, RF_PATH_B);
717*6d67aabdSBjoern A. Zeeb 
718*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
719*6d67aabdSBjoern A. Zeeb }
720*6d67aabdSBjoern A. Zeeb 
721*6d67aabdSBjoern A. Zeeb static void _dack(struct rtw89_dev *rtwdev)
722*6d67aabdSBjoern A. Zeeb {
723*6d67aabdSBjoern A. Zeeb 	_dack_s0(rtwdev);
724*6d67aabdSBjoern A. Zeeb 	_dack_s1(rtwdev);
725*6d67aabdSBjoern A. Zeeb }
726*6d67aabdSBjoern A. Zeeb 
727*6d67aabdSBjoern A. Zeeb static void _dack_dump(struct rtw89_dev *rtwdev)
728*6d67aabdSBjoern A. Zeeb {
729*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
730*6d67aabdSBjoern A. Zeeb 	u8 i;
731*6d67aabdSBjoern A. Zeeb 	u8 t;
732*6d67aabdSBjoern A. Zeeb 
733*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
734*6d67aabdSBjoern A. Zeeb 		    "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n",
735*6d67aabdSBjoern A. Zeeb 		    dack->addck_d[0][0], dack->addck_d[0][1]);
736*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
737*6d67aabdSBjoern A. Zeeb 		    "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n",
738*6d67aabdSBjoern A. Zeeb 		    dack->addck_d[1][0], dack->addck_d[1][1]);
739*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
740*6d67aabdSBjoern A. Zeeb 		    "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n",
741*6d67aabdSBjoern A. Zeeb 		    dack->dadck_d[0][0], dack->dadck_d[0][1]);
742*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
743*6d67aabdSBjoern A. Zeeb 		    "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n",
744*6d67aabdSBjoern A. Zeeb 		    dack->dadck_d[1][0], dack->dadck_d[1][1]);
745*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
746*6d67aabdSBjoern A. Zeeb 		    "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n",
747*6d67aabdSBjoern A. Zeeb 		    dack->biask_d[0][0], dack->biask_d[0][1]);
748*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
749*6d67aabdSBjoern A. Zeeb 		    "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n",
750*6d67aabdSBjoern A. Zeeb 		    dack->biask_d[1][0], dack->biask_d[1][1]);
751*6d67aabdSBjoern A. Zeeb 
752*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n");
753*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 0x10; i++) {
754*6d67aabdSBjoern A. Zeeb 		t = dack->msbk_d[0][0][i];
755*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
756*6d67aabdSBjoern A. Zeeb 	}
757*6d67aabdSBjoern A. Zeeb 
758*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n");
759*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
760*6d67aabdSBjoern A. Zeeb 		t = dack->msbk_d[0][1][i];
761*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
762*6d67aabdSBjoern A. Zeeb 	}
763*6d67aabdSBjoern A. Zeeb 
764*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n");
765*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
766*6d67aabdSBjoern A. Zeeb 		t = dack->msbk_d[1][0][i];
767*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
768*6d67aabdSBjoern A. Zeeb 	}
769*6d67aabdSBjoern A. Zeeb 
770*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n");
771*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {
772*6d67aabdSBjoern A. Zeeb 		t = dack->msbk_d[1][1][i];
773*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);
774*6d67aabdSBjoern A. Zeeb 	}
775*6d67aabdSBjoern A. Zeeb }
776*6d67aabdSBjoern A. Zeeb 
777*6d67aabdSBjoern A. Zeeb static void _addck_ori(struct rtw89_dev *rtwdev)
778*6d67aabdSBjoern A. Zeeb {
779*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
780*6d67aabdSBjoern A. Zeeb 	u32 val;
781*6d67aabdSBjoern A. Zeeb 	int ret;
782*6d67aabdSBjoern A. Zeeb 
783*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x0);
784*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_MAN, 0x0);
785*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
786*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0);
787*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0);
788*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1);
789*6d67aabdSBjoern A. Zeeb 
790*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf);
791*6d67aabdSBjoern A. Zeeb 	udelay(100);
792*6d67aabdSBjoern A. Zeeb 
793*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0);
794*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(4), 0x1);
795*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3);
796*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x1);
797*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x0);
798*6d67aabdSBjoern A. Zeeb 	udelay(1);
799*6d67aabdSBjoern A. Zeeb 
800*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1);
801*6d67aabdSBjoern A. Zeeb 	dack->addck_timeout[0] = false;
802*6d67aabdSBjoern A. Zeeb 
803*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val,
804*6d67aabdSBjoern A. Zeeb 				       1, 10000, false,
805*6d67aabdSBjoern A. Zeeb 				       rtwdev, R_ADDCKR0, BIT(0));
806*6d67aabdSBjoern A. Zeeb 	if (ret) {
807*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n");
808*6d67aabdSBjoern A. Zeeb 		dack->addck_timeout[0] = true;
809*6d67aabdSBjoern A. Zeeb 	}
810*6d67aabdSBjoern A. Zeeb 
811*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(4), 0x0);
812*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1);
813*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc);
814*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1);
815*6d67aabdSBjoern A. Zeeb 
816*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0);
817*6d67aabdSBjoern A. Zeeb 	dack->addck_d[0][0] =
818*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0);
819*6d67aabdSBjoern A. Zeeb 	dack->addck_d[0][1] =
820*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1);
821*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
822*6d67aabdSBjoern A. Zeeb 
823*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
824*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0);
825*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0);
826*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1);
827*6d67aabdSBjoern A. Zeeb 
828*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf);
829*6d67aabdSBjoern A. Zeeb 	udelay(100);
830*6d67aabdSBjoern A. Zeeb 
831*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0);
832*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(4), 0x1);
833*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3);
834*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x1);
835*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x0);
836*6d67aabdSBjoern A. Zeeb 	udelay(1);
837*6d67aabdSBjoern A. Zeeb 
838*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x1);
839*6d67aabdSBjoern A. Zeeb 	dack->addck_timeout[1] = false;
840*6d67aabdSBjoern A. Zeeb 
841*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val,
842*6d67aabdSBjoern A. Zeeb 				       1, 10000, false,
843*6d67aabdSBjoern A. Zeeb 				       rtwdev, R_ADDCKR1, BIT(0));
844*6d67aabdSBjoern A. Zeeb 	if (ret) {
845*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n");
846*6d67aabdSBjoern A. Zeeb 		dack->addck_timeout[1] = true;
847*6d67aabdSBjoern A. Zeeb 	}
848*6d67aabdSBjoern A. Zeeb 
849*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(4), 0x0);
850*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1);
851*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc);
852*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1);
853*6d67aabdSBjoern A. Zeeb 
854*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x0);
855*6d67aabdSBjoern A. Zeeb 	dack->addck_d[1][0] =
856*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A0);
857*6d67aabdSBjoern A. Zeeb 	dack->addck_d[1][1] =
858*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A1);
859*6d67aabdSBjoern A. Zeeb 
860*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
861*6d67aabdSBjoern A. Zeeb }
862*6d67aabdSBjoern A. Zeeb 
863*6d67aabdSBjoern A. Zeeb static void _addck_reload(struct rtw89_dev *rtwdev)
864*6d67aabdSBjoern A. Zeeb {
865*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
866*6d67aabdSBjoern A. Zeeb 
867*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL1, dack->addck_d[0][0]);
868*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL0, dack->addck_d[0][1]);
869*6d67aabdSBjoern A. Zeeb 
870*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RLS, 0x3);
871*6d67aabdSBjoern A. Zeeb 
872*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RL1, dack->addck_d[1][0]);
873*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RL0, dack->addck_d[1][1]);
874*6d67aabdSBjoern A. Zeeb 
875*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RLS, 0x3);
876*6d67aabdSBjoern A. Zeeb }
877*6d67aabdSBjoern A. Zeeb 
878*6d67aabdSBjoern A. Zeeb static void _dack_manual_off(struct rtw89_dev *rtwdev)
879*6d67aabdSBjoern A. Zeeb {
880*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RLS, 0x0);
881*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RLS, 0x0);
882*6d67aabdSBjoern A. Zeeb 
883*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL, B_DACKN0_EN, 0x0);
884*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACKN1_CTL, B_DACKN1_ON, 0x0);
885*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACKN2_CTL, B_DACKN2_ON, 0x0);
886*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DACKN3_CTL, B_DACKN3_ON, 0x0);
887*6d67aabdSBjoern A. Zeeb }
888*6d67aabdSBjoern A. Zeeb 
889*6d67aabdSBjoern A. Zeeb static void _dac_cal(struct rtw89_dev *rtwdev, bool force)
890*6d67aabdSBjoern A. Zeeb {
891*6d67aabdSBjoern A. Zeeb 	struct rtw89_dack_info *dack = &rtwdev->dack;
892*6d67aabdSBjoern A. Zeeb 
893*6d67aabdSBjoern A. Zeeb 	dack->dack_done = false;
894*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n");
895*6d67aabdSBjoern A. Zeeb 
896*6d67aabdSBjoern A. Zeeb 	_drck(rtwdev);
897*6d67aabdSBjoern A. Zeeb 	_dack_manual_off(rtwdev);
898*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x0);
899*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RFREG_MASK, 0x0);
900*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1);
901*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x337e1);
902*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_A, true, ADC_960M);
903*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_B, true, ADC_960M);
904*6d67aabdSBjoern A. Zeeb 	_addck_ori(rtwdev);
905*6d67aabdSBjoern A. Zeeb 
906*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_A, false, ADC_960M);
907*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_B, false, ADC_960M);
908*6d67aabdSBjoern A. Zeeb 	_addck_reload(rtwdev);
909*6d67aabdSBjoern A. Zeeb 
910*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0);
911*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0);
912*6d67aabdSBjoern A. Zeeb 
913*6d67aabdSBjoern A. Zeeb 	_dack(rtwdev);
914*6d67aabdSBjoern A. Zeeb 	_dack_dump(rtwdev);
915*6d67aabdSBjoern A. Zeeb 	dack->dack_done = true;
916*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x1);
917*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RFREG_MASK, 0x1);
918*6d67aabdSBjoern A. Zeeb 
919*6d67aabdSBjoern A. Zeeb 	dack->dack_cnt++;
920*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n");
921*6d67aabdSBjoern A. Zeeb }
922*6d67aabdSBjoern A. Zeeb 
923*6d67aabdSBjoern A. Zeeb static bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path, u8 ktype)
924*6d67aabdSBjoern A. Zeeb {
925*6d67aabdSBjoern A. Zeeb 	bool notready = false;
926*6d67aabdSBjoern A. Zeeb 	u32 val;
927*6d67aabdSBjoern A. Zeeb 	int ret;
928*6d67aabdSBjoern A. Zeeb 
929*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
930*6d67aabdSBjoern A. Zeeb 				       10, 8200, false,
931*6d67aabdSBjoern A. Zeeb 				       rtwdev, R_RFK_ST, MASKBYTE0);
932*6d67aabdSBjoern A. Zeeb 	if (ret)
933*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL1 IQK timeout!!!\n");
934*6d67aabdSBjoern A. Zeeb 
935*6d67aabdSBjoern A. Zeeb 	udelay(10);
936*6d67aabdSBjoern A. Zeeb 
937*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000,
938*6d67aabdSBjoern A. Zeeb 				       10, 400, false,
939*6d67aabdSBjoern A. Zeeb 				       rtwdev, R_RPT_COM, B_RPT_COM_RDY);
940*6d67aabdSBjoern A. Zeeb 	if (ret) {
941*6d67aabdSBjoern A. Zeeb 		notready = true;
942*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL2 IQK timeout!!!\n");
943*6d67aabdSBjoern A. Zeeb 	}
944*6d67aabdSBjoern A. Zeeb 
945*6d67aabdSBjoern A. Zeeb 	udelay(10);
946*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);
947*6d67aabdSBjoern A. Zeeb 
948*6d67aabdSBjoern A. Zeeb 	return notready;
949*6d67aabdSBjoern A. Zeeb }
950*6d67aabdSBjoern A. Zeeb 
951*6d67aabdSBjoern A. Zeeb static bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
952*6d67aabdSBjoern A. Zeeb 			  u8 path, u8 ktype)
953*6d67aabdSBjoern A. Zeeb {
954*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
955*6d67aabdSBjoern A. Zeeb 	u32 iqk_cmd;
956*6d67aabdSBjoern A. Zeeb 	bool fail;
957*6d67aabdSBjoern A. Zeeb 
958*6d67aabdSBjoern A. Zeeb 	switch (ktype) {
959*6d67aabdSBjoern A. Zeeb 	case ID_TXAGC:
960*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x008 | (1 << (4 + path)) | (path << 1);
961*6d67aabdSBjoern A. Zeeb 		break;
962*6d67aabdSBjoern A. Zeeb 	case ID_FLOK_COARSE:
963*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x108 | (1 << (4 + path));
964*6d67aabdSBjoern A. Zeeb 		break;
965*6d67aabdSBjoern A. Zeeb 	case ID_FLOK_FINE:
966*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x208 | (1 << (4 + path));
967*6d67aabdSBjoern A. Zeeb 		break;
968*6d67aabdSBjoern A. Zeeb 	case ID_FLOK_VBUFFER:
969*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x308 | (1 << (4 + path));
970*6d67aabdSBjoern A. Zeeb 		break;
971*6d67aabdSBjoern A. Zeeb 	case ID_TXK:
972*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x008 | (1 << (path + 4)) |
973*6d67aabdSBjoern A. Zeeb 			  (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8);
974*6d67aabdSBjoern A. Zeeb 		break;
975*6d67aabdSBjoern A. Zeeb 	case ID_RXAGC:
976*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1);
977*6d67aabdSBjoern A. Zeeb 		break;
978*6d67aabdSBjoern A. Zeeb 	case ID_RXK:
979*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x008 | (1 << (path + 4)) |
980*6d67aabdSBjoern A. Zeeb 			  (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8);
981*6d67aabdSBjoern A. Zeeb 		break;
982*6d67aabdSBjoern A. Zeeb 	case ID_NBTXK:
983*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x408 | (1 << (4 + path));
984*6d67aabdSBjoern A. Zeeb 		break;
985*6d67aabdSBjoern A. Zeeb 	case ID_NBRXK:
986*6d67aabdSBjoern A. Zeeb 		iqk_cmd = 0x608 | (1 << (4 + path));
987*6d67aabdSBjoern A. Zeeb 		break;
988*6d67aabdSBjoern A. Zeeb 	default:
989*6d67aabdSBjoern A. Zeeb 		return false;
990*6d67aabdSBjoern A. Zeeb 	}
991*6d67aabdSBjoern A. Zeeb 
992*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s, iqk_cmd = %x\n",
993*6d67aabdSBjoern A. Zeeb 		    __func__, iqk_cmd + 1);
994*6d67aabdSBjoern A. Zeeb 
995*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1);
996*6d67aabdSBjoern A. Zeeb 	fail = _iqk_check_cal(rtwdev, path, ktype);
997*6d67aabdSBjoern A. Zeeb 
998*6d67aabdSBjoern A. Zeeb 	return fail;
999*6d67aabdSBjoern A. Zeeb }
1000*6d67aabdSBjoern A. Zeeb 
1001*6d67aabdSBjoern A. Zeeb static void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path)
1002*6d67aabdSBjoern A. Zeeb {
1003*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1004*6d67aabdSBjoern A. Zeeb 
1005*6d67aabdSBjoern A. Zeeb 	switch (iqk_info->iqk_band[path]) {
1006*6d67aabdSBjoern A. Zeeb 	case RTW89_BAND_2G:
1007*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0);
1008*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x0);
1009*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1);
1010*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0);
1011*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
1012*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x00);
1013*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e);
1014*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0);
1015*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x5);
1016*6d67aabdSBjoern A. Zeeb 		udelay(1);
1017*6d67aabdSBjoern A. Zeeb 		break;
1018*6d67aabdSBjoern A. Zeeb 	case RTW89_BAND_5G:
1019*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x1);
1020*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0);
1021*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1);
1022*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x80);
1023*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e);
1024*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0);
1025*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x4);
1026*6d67aabdSBjoern A. Zeeb 		udelay(1);
1027*6d67aabdSBjoern A. Zeeb 		break;
1028*6d67aabdSBjoern A. Zeeb 	default:
1029*6d67aabdSBjoern A. Zeeb 		break;
1030*6d67aabdSBjoern A. Zeeb 	}
1031*6d67aabdSBjoern A. Zeeb }
1032*6d67aabdSBjoern A. Zeeb 
1033*6d67aabdSBjoern A. Zeeb static bool _iqk_2g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1034*6d67aabdSBjoern A. Zeeb {
1035*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
1036*6d67aabdSBjoern A. Zeeb 
1037*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
1038*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1039*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09);
1040*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);
1041*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000119 + (path << 4));
1042*6d67aabdSBjoern A. Zeeb 
1043*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_COARSE);
1044*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1045*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1046*6d67aabdSBjoern A. Zeeb 
1047*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
1048*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1049*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24);
1050*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4));
1051*6d67aabdSBjoern A. Zeeb 
1052*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER);
1053*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1054*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1055*6d67aabdSBjoern A. Zeeb 
1056*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
1057*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1058*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09);
1059*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000219 + (path << 4));
1060*6d67aabdSBjoern A. Zeeb 
1061*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_COARSE);
1062*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1063*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1064*6d67aabdSBjoern A. Zeeb 
1065*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
1066*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1067*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24);
1068*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4));
1069*6d67aabdSBjoern A. Zeeb 
1070*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER);
1071*6d67aabdSBjoern A. Zeeb 
1072*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1073*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1074*6d67aabdSBjoern A. Zeeb 
1075*6d67aabdSBjoern A. Zeeb 	return false;
1076*6d67aabdSBjoern A. Zeeb }
1077*6d67aabdSBjoern A. Zeeb 
1078*6d67aabdSBjoern A. Zeeb static bool _iqk_5g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1079*6d67aabdSBjoern A. Zeeb {
1080*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
1081*6d67aabdSBjoern A. Zeeb 
1082*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
1083*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1084*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09);
1085*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);
1086*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000119 + (path << 4));
1087*6d67aabdSBjoern A. Zeeb 
1088*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_COARSE);
1089*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1090*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1091*6d67aabdSBjoern A. Zeeb 
1092*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
1093*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1094*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24);
1095*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4));
1096*6d67aabdSBjoern A. Zeeb 
1097*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER);
1098*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1099*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1100*6d67aabdSBjoern A. Zeeb 
1101*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0);
1102*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1103*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09);
1104*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000219 + (path << 4));
1105*6d67aabdSBjoern A. Zeeb 
1106*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_COARSE);
1107*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1108*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1109*6d67aabdSBjoern A. Zeeb 
1110*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12);
1111*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1112*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24);
1113*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4));
1114*6d67aabdSBjoern A. Zeeb 
1115*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER);
1116*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1117*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1118*6d67aabdSBjoern A. Zeeb 
1119*6d67aabdSBjoern A. Zeeb 	return false;
1120*6d67aabdSBjoern A. Zeeb }
1121*6d67aabdSBjoern A. Zeeb 
1122*6d67aabdSBjoern A. Zeeb static bool _iqk_2g_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1123*6d67aabdSBjoern A. Zeeb {
1124*6d67aabdSBjoern A. Zeeb 	static const u32 g_power_range[4] = {0x0, 0x0, 0x0, 0x0};
1125*6d67aabdSBjoern A. Zeeb 	static const u32 g_track_range[4] = {0x4, 0x4, 0x6, 0x6};
1126*6d67aabdSBjoern A. Zeeb 	static const u32 g_gain_bb[4] = {0x08, 0x0e, 0x08, 0x0e};
1127*6d67aabdSBjoern A. Zeeb 	static const u32 g_itqt[4] = {0x09, 0x12, 0x1b, 0x24};
1128*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1129*6d67aabdSBjoern A. Zeeb 	bool notready = false;
1130*6d67aabdSBjoern A. Zeeb 	bool kfail = false;
1131*6d67aabdSBjoern A. Zeeb 	u8 gp;
1132*6d67aabdSBjoern A. Zeeb 
1133*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
1134*6d67aabdSBjoern A. Zeeb 
1135*6d67aabdSBjoern A. Zeeb 	for (gp = 0x0; gp < 0x4; gp++) {
1136*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0,
1137*6d67aabdSBjoern A. Zeeb 			       g_power_range[gp]);
1138*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1,
1139*6d67aabdSBjoern A. Zeeb 			       g_track_range[gp]);
1140*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG,
1141*6d67aabdSBjoern A. Zeeb 			       g_gain_bb[gp]);
1142*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1143*6d67aabdSBjoern A. Zeeb 				       0x00000100, 0x1);
1144*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1145*6d67aabdSBjoern A. Zeeb 				       0x00000010, 0x1);
1146*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1147*6d67aabdSBjoern A. Zeeb 				       0x00000004, 0x0);
1148*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1149*6d67aabdSBjoern A. Zeeb 				       0x00000003, gp);
1150*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT,
1151*6d67aabdSBjoern A. Zeeb 				       0x009);
1152*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
1153*6d67aabdSBjoern A. Zeeb 				       B_KIP_IQP_IQSW, g_itqt[gp]);
1154*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);
1155*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_txcfir[path] =
1156*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
1157*6d67aabdSBjoern A. Zeeb 
1158*6d67aabdSBjoern A. Zeeb 		if (iqk_info->is_nbiqk)
1159*6d67aabdSBjoern A. Zeeb 			break;
1160*6d67aabdSBjoern A. Zeeb 
1161*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
1162*6d67aabdSBjoern A. Zeeb 				       B_KIP_IQP_IQSW, g_itqt[gp]);
1163*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);
1164*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1165*6d67aabdSBjoern A. Zeeb 
1166*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
1167*6d67aabdSBjoern A. Zeeb 			    "[IQK]S%x, gp = 0x%x, 0x8%x38 = 0x%x\n",
1168*6d67aabdSBjoern A. Zeeb 			    path, gp, 1 << path, iqk_info->nb_txcfir[path]);
1169*6d67aabdSBjoern A. Zeeb 	}
1170*6d67aabdSBjoern A. Zeeb 
1171*6d67aabdSBjoern A. Zeeb 	if (!notready)
1172*6d67aabdSBjoern A. Zeeb 		kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);
1173*6d67aabdSBjoern A. Zeeb 
1174*6d67aabdSBjoern A. Zeeb 	if (kfail) {
1175*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_txcfir[path] = 0x40000002;
1176*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
1177*6d67aabdSBjoern A. Zeeb 				       B_IQK_RES_TXCFIR, 0x0);
1178*6d67aabdSBjoern A. Zeeb 	}
1179*6d67aabdSBjoern A. Zeeb 
1180*6d67aabdSBjoern A. Zeeb 	return kfail;
1181*6d67aabdSBjoern A. Zeeb }
1182*6d67aabdSBjoern A. Zeeb 
1183*6d67aabdSBjoern A. Zeeb static bool _iqk_5g_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1184*6d67aabdSBjoern A. Zeeb {
1185*6d67aabdSBjoern A. Zeeb 	static const u32 a_power_range[4] = {0x0, 0x0, 0x0, 0x0};
1186*6d67aabdSBjoern A. Zeeb 	static const u32 a_track_range[4] = {0x3, 0x3, 0x6, 0x6};
1187*6d67aabdSBjoern A. Zeeb 	static const u32 a_gain_bb[4] = {0x08, 0x10, 0x08, 0x0e};
1188*6d67aabdSBjoern A. Zeeb 	static const u32 a_itqt[4] = {0x09, 0x12, 0x1b, 0x24};
1189*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1190*6d67aabdSBjoern A. Zeeb 	bool notready = false;
1191*6d67aabdSBjoern A. Zeeb 	bool kfail = false;
1192*6d67aabdSBjoern A. Zeeb 	u8 gp;
1193*6d67aabdSBjoern A. Zeeb 
1194*6d67aabdSBjoern A. Zeeb 	for (gp = 0x0; gp < 0x4; gp++) {
1195*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, a_power_range[gp]);
1196*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, a_track_range[gp]);
1197*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, a_gain_bb[gp]);
1198*6d67aabdSBjoern A. Zeeb 
1199*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
1200*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, a_itqt[gp]);
1201*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1202*6d67aabdSBjoern A. Zeeb 				       0x00000100, 0x1);
1203*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1204*6d67aabdSBjoern A. Zeeb 				       0x00000010, 0x1);
1205*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1206*6d67aabdSBjoern A. Zeeb 				       0x00000004, 0x0);
1207*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1208*6d67aabdSBjoern A. Zeeb 				       0x00000003, gp);
1209*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT,
1210*6d67aabdSBjoern A. Zeeb 				       0x009);
1211*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
1212*6d67aabdSBjoern A. Zeeb 				       B_KIP_IQP_IQSW, a_itqt[gp]);
1213*6d67aabdSBjoern A. Zeeb 
1214*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);
1215*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_txcfir[path] =
1216*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD);
1217*6d67aabdSBjoern A. Zeeb 
1218*6d67aabdSBjoern A. Zeeb 		if (iqk_info->is_nbiqk)
1219*6d67aabdSBjoern A. Zeeb 			break;
1220*6d67aabdSBjoern A. Zeeb 
1221*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),
1222*6d67aabdSBjoern A. Zeeb 				       B_KIP_IQP_IQSW, a_itqt[gp]);
1223*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);
1224*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1225*6d67aabdSBjoern A. Zeeb 
1226*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
1227*6d67aabdSBjoern A. Zeeb 			    "[IQK]S%x, gp = 0x%x, 0x8%x38 = 0x%x\n",
1228*6d67aabdSBjoern A. Zeeb 			    path, gp, 1 << path, iqk_info->nb_txcfir[path]);
1229*6d67aabdSBjoern A. Zeeb 	}
1230*6d67aabdSBjoern A. Zeeb 
1231*6d67aabdSBjoern A. Zeeb 	if (!notready)
1232*6d67aabdSBjoern A. Zeeb 		kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);
1233*6d67aabdSBjoern A. Zeeb 
1234*6d67aabdSBjoern A. Zeeb 	if (kfail) {
1235*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_txcfir[path] = 0x40000002;
1236*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
1237*6d67aabdSBjoern A. Zeeb 				       B_IQK_RES_TXCFIR, 0x0);
1238*6d67aabdSBjoern A. Zeeb 	}
1239*6d67aabdSBjoern A. Zeeb 
1240*6d67aabdSBjoern A. Zeeb 	return kfail;
1241*6d67aabdSBjoern A. Zeeb }
1242*6d67aabdSBjoern A. Zeeb 
1243*6d67aabdSBjoern A. Zeeb static void _iqk_adc_fifo_rst(struct rtw89_dev *rtwdev,
1244*6d67aabdSBjoern A. Zeeb 			      enum rtw89_phy_idx phy_idx, u8 path)
1245*6d67aabdSBjoern A. Zeeb {
1246*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303);
1247*6d67aabdSBjoern A. Zeeb 	udelay(10);
1248*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x3333);
1249*6d67aabdSBjoern A. Zeeb }
1250*6d67aabdSBjoern A. Zeeb 
1251*6d67aabdSBjoern A. Zeeb static void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path)
1252*6d67aabdSBjoern A. Zeeb {
1253*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1254*6d67aabdSBjoern A. Zeeb 
1255*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
1256*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303);
1257*6d67aabdSBjoern A. Zeeb 
1258*6d67aabdSBjoern A. Zeeb 	if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) {
1259*6d67aabdSBjoern A. Zeeb 		_rxck_force(rtwdev, RF_PATH_A, true, ADC_960M);
1260*6d67aabdSBjoern A. Zeeb 		_rxck_force(rtwdev, RF_PATH_B, true, ADC_960M);
1261*6d67aabdSBjoern A. Zeeb 		udelay(1);
1262*6d67aabdSBjoern A. Zeeb 
1263*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC,
1264*6d67aabdSBjoern A. Zeeb 				       B_UPD_CLK_ADC_ON, 0x1);
1265*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC,
1266*6d67aabdSBjoern A. Zeeb 				       B_UPD_CLK_ADC_VAL, 0x1);
1267*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1,
1268*6d67aabdSBjoern A. Zeeb 				       B_PATH0_SAMPL_DLY_T_MSK_V1, 0x2);
1269*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1,
1270*6d67aabdSBjoern A. Zeeb 				       B_PATH1_SAMPL_DLY_T_MSK_V1, 0x2);
1271*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, 0x8);
1272*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1,
1273*6d67aabdSBjoern A. Zeeb 				       B_PATH1_BW_SEL_MSK_V1, 0x8);
1274*6d67aabdSBjoern A. Zeeb 	} else {
1275*6d67aabdSBjoern A. Zeeb 		_rxck_force(rtwdev, RF_PATH_A, true, ADC_480M);
1276*6d67aabdSBjoern A. Zeeb 		_rxck_force(rtwdev, RF_PATH_B, true, ADC_480M);
1277*6d67aabdSBjoern A. Zeeb 		udelay(1);
1278*6d67aabdSBjoern A. Zeeb 
1279*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC,
1280*6d67aabdSBjoern A. Zeeb 				       B_UPD_CLK_ADC_ON, 0x1);
1281*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC,
1282*6d67aabdSBjoern A. Zeeb 				       B_UPD_CLK_ADC_VAL, 0x0);
1283*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1,
1284*6d67aabdSBjoern A. Zeeb 				       B_PATH0_SAMPL_DLY_T_MSK_V1, 0x3);
1285*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1,
1286*6d67aabdSBjoern A. Zeeb 				       B_PATH1_SAMPL_DLY_T_MSK_V1, 0x3);
1287*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, 0xf);
1288*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1,
1289*6d67aabdSBjoern A. Zeeb 				       B_PATH1_BW_SEL_MSK_V1, 0xf);
1290*6d67aabdSBjoern A. Zeeb 	}
1291*6d67aabdSBjoern A. Zeeb 
1292*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, 0x00000780, 0x8);
1293*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x00000780, 0x8);
1294*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, 0x00007800, 0x2);
1295*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x00007800, 0x2);
1296*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_MUL, 0x0);
1297*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
1298*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
1299*6d67aabdSBjoern A. Zeeb 	udelay(1);
1300*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f);
1301*6d67aabdSBjoern A. Zeeb 	udelay(1);
1302*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03);
1303*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001);
1304*6d67aabdSBjoern A. Zeeb 	udelay(1);
1305*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041);
1306*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x3333);
1307*6d67aabdSBjoern A. Zeeb }
1308*6d67aabdSBjoern A. Zeeb 
1309*6d67aabdSBjoern A. Zeeb static bool _iqk_2g_rx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1310*6d67aabdSBjoern A. Zeeb {
1311*6d67aabdSBjoern A. Zeeb 	static const u32 g_idxrxgain[2] = {0x212, 0x310};
1312*6d67aabdSBjoern A. Zeeb 	static const u32 g_idxattc2[2] = {0x00, 0x20};
1313*6d67aabdSBjoern A. Zeeb 	static const u32 g_idxattc1[2] = {0x3, 0x2};
1314*6d67aabdSBjoern A. Zeeb 	static const u32 g_idxrxagc[2] = {0x0, 0x2};
1315*6d67aabdSBjoern A. Zeeb 	static const u32 g_idx[2] = {0x0, 0x2};
1316*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1317*6d67aabdSBjoern A. Zeeb 	bool notready = false;
1318*6d67aabdSBjoern A. Zeeb 	bool kfail = false;
1319*6d67aabdSBjoern A. Zeeb 	u32 rf_18, tmp;
1320*6d67aabdSBjoern A. Zeeb 	u8 gp;
1321*6d67aabdSBjoern A. Zeeb 
1322*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
1323*6d67aabdSBjoern A. Zeeb 
1324*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);
1325*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1);
1326*6d67aabdSBjoern A. Zeeb 	rf_18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
1327*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, rf_18);
1328*6d67aabdSBjoern A. Zeeb 
1329*6d67aabdSBjoern A. Zeeb 	for (gp = 0x0; gp < 0x2; gp++) {
1330*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, g_idxrxgain[gp]);
1331*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, g_idxattc2[gp]);
1332*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, g_idxattc1[gp]);
1333*6d67aabdSBjoern A. Zeeb 
1334*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1335*6d67aabdSBjoern A. Zeeb 				       0x00000100, 0x1);
1336*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1337*6d67aabdSBjoern A. Zeeb 				       0x00000010, 0x0);
1338*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1339*6d67aabdSBjoern A. Zeeb 				       0x00000007, g_idx[gp]);
1340*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);
1341*6d67aabdSBjoern A. Zeeb 		udelay(100);
1342*6d67aabdSBjoern A. Zeeb 		udelay(100);
1343*6d67aabdSBjoern A. Zeeb 
1344*6d67aabdSBjoern A. Zeeb 		tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);
1345*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, tmp);
1346*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, g_idxrxagc[gp]);
1347*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1348*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);
1349*6d67aabdSBjoern A. Zeeb 
1350*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC);
1351*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1352*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, rf rxbb  = %x\n", path,
1353*6d67aabdSBjoern A. Zeeb 			    rtw89_read_rf(rtwdev, path, RR_MOD, 0x003c0));
1354*6d67aabdSBjoern A. Zeeb 
1355*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);
1356*6d67aabdSBjoern A. Zeeb 		udelay(100);
1357*6d67aabdSBjoern A. Zeeb 		udelay(100);
1358*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1359*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);
1360*6d67aabdSBjoern A. Zeeb 
1361*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);
1362*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_rxcfir[path] =
1363*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
1364*6d67aabdSBjoern A. Zeeb 					      MASKDWORD) | 0x2;
1365*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
1366*6d67aabdSBjoern A. Zeeb 			    "[IQK]S%x, gp = 0x%x, 0x8%x3c = 0x%x\n", path,
1367*6d67aabdSBjoern A. Zeeb 			    g_idx[gp], 1 << path, iqk_info->nb_rxcfir[path]);
1368*6d67aabdSBjoern A. Zeeb 
1369*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1370*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1371*6d67aabdSBjoern A. Zeeb 
1372*6d67aabdSBjoern A. Zeeb 		if (iqk_info->is_nbiqk)
1373*6d67aabdSBjoern A. Zeeb 			break;
1374*6d67aabdSBjoern A. Zeeb 
1375*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1376*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);
1377*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_NCTL_N1,  B_NCTL_N1_CIP, 0x00);
1378*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1379*6d67aabdSBjoern A. Zeeb 	}
1380*6d67aabdSBjoern A. Zeeb 
1381*6d67aabdSBjoern A. Zeeb 	if (!notready)
1382*6d67aabdSBjoern A. Zeeb 		kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);
1383*6d67aabdSBjoern A. Zeeb 
1384*6d67aabdSBjoern A. Zeeb 	if (kfail) {
1385*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_txcfir[path] = 0x40000002;
1386*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
1387*6d67aabdSBjoern A. Zeeb 				       B_IQK_RES_RXCFIR, 0x0);
1388*6d67aabdSBjoern A. Zeeb 	}
1389*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0);
1390*6d67aabdSBjoern A. Zeeb 
1391*6d67aabdSBjoern A. Zeeb 	return kfail;
1392*6d67aabdSBjoern A. Zeeb }
1393*6d67aabdSBjoern A. Zeeb 
1394*6d67aabdSBjoern A. Zeeb static bool _iqk_5g_rx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1395*6d67aabdSBjoern A. Zeeb {
1396*6d67aabdSBjoern A. Zeeb 	static const u32 a_idxrxgain[2] = {0x110, 0x290};
1397*6d67aabdSBjoern A. Zeeb 	static const u32 a_idxattc2[2] = {0x0f, 0x0f};
1398*6d67aabdSBjoern A. Zeeb 	static const u32 a_idxattc1[2] = {0x2, 0x2};
1399*6d67aabdSBjoern A. Zeeb 	static const u32 a_idxrxagc[2] = {0x4, 0x6};
1400*6d67aabdSBjoern A. Zeeb 	static const u32 a_idx[2] = {0x0, 0x2};
1401*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1402*6d67aabdSBjoern A. Zeeb 	bool notready = false;
1403*6d67aabdSBjoern A. Zeeb 	bool kfail = false;
1404*6d67aabdSBjoern A. Zeeb 	u32 rf_18, tmp;
1405*6d67aabdSBjoern A. Zeeb 	u8 gp;
1406*6d67aabdSBjoern A. Zeeb 
1407*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
1408*6d67aabdSBjoern A. Zeeb 
1409*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);
1410*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1);
1411*6d67aabdSBjoern A. Zeeb 	rf_18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
1412*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, rf_18);
1413*6d67aabdSBjoern A. Zeeb 
1414*6d67aabdSBjoern A. Zeeb 	for (gp = 0x0; gp < 0x2; gp++) {
1415*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, a_idxrxgain[gp]);
1416*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT, a_idxattc2[gp]);
1417*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2, a_idxattc1[gp]);
1418*6d67aabdSBjoern A. Zeeb 
1419*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1420*6d67aabdSBjoern A. Zeeb 				       0x00000100, 0x1);
1421*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1422*6d67aabdSBjoern A. Zeeb 				       0x00000010, 0x0);
1423*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8),
1424*6d67aabdSBjoern A. Zeeb 				       0x00000007, a_idx[gp]);
1425*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);
1426*6d67aabdSBjoern A. Zeeb 		udelay(100);
1427*6d67aabdSBjoern A. Zeeb 		udelay(100);
1428*6d67aabdSBjoern A. Zeeb 
1429*6d67aabdSBjoern A. Zeeb 		tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);
1430*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, tmp);
1431*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, a_idxrxagc[gp]);
1432*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1433*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);
1434*6d67aabdSBjoern A. Zeeb 
1435*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC);
1436*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1437*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, rf rxbb  = %x\n", path,
1438*6d67aabdSBjoern A. Zeeb 			    rtw89_read_rf(rtwdev, path, RR_MOD, 0x003c0));
1439*6d67aabdSBjoern A. Zeeb 
1440*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);
1441*6d67aabdSBjoern A. Zeeb 		udelay(200);
1442*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1443*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);
1444*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);
1445*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_rxcfir[path] =
1446*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8),
1447*6d67aabdSBjoern A. Zeeb 					      MASKDWORD) | 0x2;
1448*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
1449*6d67aabdSBjoern A. Zeeb 			    "[IQK]S%x, gp = 0x%x, 0x8%x3c = 0x%x\n",
1450*6d67aabdSBjoern A. Zeeb 			    path, a_idx[gp], 1 << path, iqk_info->nb_rxcfir[path]);
1451*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1452*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1453*6d67aabdSBjoern A. Zeeb 
1454*6d67aabdSBjoern A. Zeeb 		if (iqk_info->is_nbiqk)
1455*6d67aabdSBjoern A. Zeeb 			break;
1456*6d67aabdSBjoern A. Zeeb 
1457*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1458*6d67aabdSBjoern A. Zeeb 		notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);
1459*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1460*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1461*6d67aabdSBjoern A. Zeeb 	}
1462*6d67aabdSBjoern A. Zeeb 
1463*6d67aabdSBjoern A. Zeeb 	if (!notready)
1464*6d67aabdSBjoern A. Zeeb 		kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);
1465*6d67aabdSBjoern A. Zeeb 
1466*6d67aabdSBjoern A. Zeeb 	if (kfail) {
1467*6d67aabdSBjoern A. Zeeb 		iqk_info->nb_txcfir[path] = 0x40000002;
1468*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8),
1469*6d67aabdSBjoern A. Zeeb 				       B_IQK_RES_RXCFIR, 0x0);
1470*6d67aabdSBjoern A. Zeeb 	}
1471*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0);
1472*6d67aabdSBjoern A. Zeeb 
1473*6d67aabdSBjoern A. Zeeb 	return kfail;
1474*6d67aabdSBjoern A. Zeeb }
1475*6d67aabdSBjoern A. Zeeb 
1476*6d67aabdSBjoern A. Zeeb static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1477*6d67aabdSBjoern A. Zeeb {
1478*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1479*6d67aabdSBjoern A. Zeeb 	bool lok_result = false;
1480*6d67aabdSBjoern A. Zeeb 	bool txk_result = false;
1481*6d67aabdSBjoern A. Zeeb 	bool rxk_result = false;
1482*6d67aabdSBjoern A. Zeeb 	u8 i;
1483*6d67aabdSBjoern A. Zeeb 
1484*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < 3; i++) {
1485*6d67aabdSBjoern A. Zeeb 		_iqk_txk_setting(rtwdev, path);
1486*6d67aabdSBjoern A. Zeeb 		if (iqk_info->iqk_band[path] == RTW89_BAND_2G)
1487*6d67aabdSBjoern A. Zeeb 			lok_result = _iqk_2g_lok(rtwdev, phy_idx, path);
1488*6d67aabdSBjoern A. Zeeb 		else
1489*6d67aabdSBjoern A. Zeeb 			lok_result = _iqk_5g_lok(rtwdev, phy_idx, path);
1490*6d67aabdSBjoern A. Zeeb 
1491*6d67aabdSBjoern A. Zeeb 		if (!lok_result)
1492*6d67aabdSBjoern A. Zeeb 			break;
1493*6d67aabdSBjoern A. Zeeb 	}
1494*6d67aabdSBjoern A. Zeeb 
1495*6d67aabdSBjoern A. Zeeb 	if (lok_result) {
1496*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
1497*6d67aabdSBjoern A. Zeeb 			    "[IQK]!!!!!!!!!!LOK by Pass !!!!!!!!!!!\n");
1498*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK, 0x80200);
1499*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RSV2, RFREG_MASK, 0x80200);
1500*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_LOKVB, RFREG_MASK, 0x80200);
1501*6d67aabdSBjoern A. Zeeb 	}
1502*6d67aabdSBjoern A. Zeeb 
1503*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RF_0x08[00:19] = 0x%x\n",
1504*6d67aabdSBjoern A. Zeeb 		    rtw89_read_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK));
1505*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RF_0x09[00:19] = 0x%x\n",
1506*6d67aabdSBjoern A. Zeeb 		    rtw89_read_rf(rtwdev, path, RR_RSV2, RFREG_MASK));
1507*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RF_0x0a[00:19] = 0x%x\n",
1508*6d67aabdSBjoern A. Zeeb 		    rtw89_read_rf(rtwdev, path, RR_LOKVB, RFREG_MASK));
1509*6d67aabdSBjoern A. Zeeb 
1510*6d67aabdSBjoern A. Zeeb 	if (iqk_info->iqk_band[path] == RTW89_BAND_2G)
1511*6d67aabdSBjoern A. Zeeb 		txk_result = _iqk_2g_tx(rtwdev, phy_idx, path);
1512*6d67aabdSBjoern A. Zeeb 	else
1513*6d67aabdSBjoern A. Zeeb 		txk_result = _iqk_5g_tx(rtwdev, phy_idx, path);
1514*6d67aabdSBjoern A. Zeeb 
1515*6d67aabdSBjoern A. Zeeb 	_iqk_rxclk_setting(rtwdev, path);
1516*6d67aabdSBjoern A. Zeeb 	_iqk_adc_fifo_rst(rtwdev, phy_idx, path);
1517*6d67aabdSBjoern A. Zeeb 
1518*6d67aabdSBjoern A. Zeeb 	if (iqk_info->iqk_band[path] == RTW89_BAND_2G)
1519*6d67aabdSBjoern A. Zeeb 		rxk_result = _iqk_2g_rx(rtwdev, phy_idx, path);
1520*6d67aabdSBjoern A. Zeeb 	else
1521*6d67aabdSBjoern A. Zeeb 		rxk_result = _iqk_5g_rx(rtwdev, phy_idx, path);
1522*6d67aabdSBjoern A. Zeeb 
1523*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
1524*6d67aabdSBjoern A. Zeeb 		    "[IQK]result  : lok_= %x, txk_= %x, rxk_= %x\n",
1525*6d67aabdSBjoern A. Zeeb 		    lok_result, txk_result, rxk_result);
1526*6d67aabdSBjoern A. Zeeb }
1527*6d67aabdSBjoern A. Zeeb 
1528*6d67aabdSBjoern A. Zeeb static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path)
1529*6d67aabdSBjoern A. Zeeb {
1530*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
1531*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1532*6d67aabdSBjoern A. Zeeb 	u8 get_empty_table = false;
1533*6d67aabdSBjoern A. Zeeb 	u32 reg_rf18;
1534*6d67aabdSBjoern A. Zeeb 	u32 reg_35c;
1535*6d67aabdSBjoern A. Zeeb 	u8 idx;
1536*6d67aabdSBjoern A. Zeeb 
1537*6d67aabdSBjoern A. Zeeb 	for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {
1538*6d67aabdSBjoern A. Zeeb 		if (iqk_info->iqk_mcc_ch[idx][path] == 0) {
1539*6d67aabdSBjoern A. Zeeb 			get_empty_table = true;
1540*6d67aabdSBjoern A. Zeeb 			break;
1541*6d67aabdSBjoern A. Zeeb 		}
1542*6d67aabdSBjoern A. Zeeb 	}
1543*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (1)idx = %x\n", idx);
1544*6d67aabdSBjoern A. Zeeb 
1545*6d67aabdSBjoern A. Zeeb 	if (!get_empty_table) {
1546*6d67aabdSBjoern A. Zeeb 		idx = iqk_info->iqk_table_idx[path] + 1;
1547*6d67aabdSBjoern A. Zeeb 		if (idx > 1)
1548*6d67aabdSBjoern A. Zeeb 			idx = 0;
1549*6d67aabdSBjoern A. Zeeb 	}
1550*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (2)idx = %x\n", idx);
1551*6d67aabdSBjoern A. Zeeb 
1552*6d67aabdSBjoern A. Zeeb 	reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
1553*6d67aabdSBjoern A. Zeeb 	reg_35c = rtw89_phy_read32_mask(rtwdev, R_CIRST, B_CIRST_SYN);
1554*6d67aabdSBjoern A. Zeeb 
1555*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_band[path] = chan->band_type;
1556*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_bw[path] = chan->band_width;
1557*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_ch[path] = chan->channel;
1558*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_mcc_ch[idx][path] = chan->channel;
1559*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_table_idx[path] = idx;
1560*6d67aabdSBjoern A. Zeeb 
1561*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x, idx = %x\n",
1562*6d67aabdSBjoern A. Zeeb 		    path, reg_rf18, idx);
1563*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x\n",
1564*6d67aabdSBjoern A. Zeeb 		    path, reg_rf18);
1565*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x35c= 0x%x\n",
1566*6d67aabdSBjoern A. Zeeb 		    path, reg_35c);
1567*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n",
1568*6d67aabdSBjoern A. Zeeb 		    iqk_info->iqk_times, idx);
1569*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_mcc_ch[%x][%x] = 0x%x\n",
1570*6d67aabdSBjoern A. Zeeb 		    idx, path, iqk_info->iqk_mcc_ch[idx][path]);
1571*6d67aabdSBjoern A. Zeeb }
1572*6d67aabdSBjoern A. Zeeb 
1573*6d67aabdSBjoern A. Zeeb static void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path)
1574*6d67aabdSBjoern A. Zeeb {
1575*6d67aabdSBjoern A. Zeeb 	_iqk_by_path(rtwdev, phy_idx, path);
1576*6d67aabdSBjoern A. Zeeb }
1577*6d67aabdSBjoern A. Zeeb 
1578*6d67aabdSBjoern A. Zeeb static void _iqk_restore(struct rtw89_dev *rtwdev, u8 path)
1579*6d67aabdSBjoern A. Zeeb {
1580*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1581*6d67aabdSBjoern A. Zeeb 
1582*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__);
1583*6d67aabdSBjoern A. Zeeb 
1584*6d67aabdSBjoern A. Zeeb 	if (iqk_info->is_nbiqk) {
1585*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),
1586*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, iqk_info->nb_txcfir[path]);
1587*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
1588*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, iqk_info->nb_rxcfir[path]);
1589*6d67aabdSBjoern A. Zeeb 	} else {
1590*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),
1591*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, 0x40000000);
1592*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
1593*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, 0x40000000);
1594*6d67aabdSBjoern A. Zeeb 	}
1595*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD,
1596*6d67aabdSBjoern A. Zeeb 			       0x00000e19 + (path << 4));
1597*6d67aabdSBjoern A. Zeeb 
1598*6d67aabdSBjoern A. Zeeb 	_iqk_check_cal(rtwdev, path, 0x0);
1599*6d67aabdSBjoern A. Zeeb 
1600*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);
1601*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000);
1602*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);
1603*6d67aabdSBjoern A. Zeeb 
1604*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_CLK, MASKDWORD, 0x0);
1605*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K2, 0x0);
1606*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), BIT(28), 0x0);
1607*6d67aabdSBjoern A. Zeeb 
1608*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
1609*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0);
1610*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0x3);
1611*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
1612*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1);
1613*6d67aabdSBjoern A. Zeeb }
1614*6d67aabdSBjoern A. Zeeb 
1615*6d67aabdSBjoern A. Zeeb static void _iqk_afebb_restore(struct rtw89_dev *rtwdev,
1616*6d67aabdSBjoern A. Zeeb 			       enum rtw89_phy_idx phy_idx, u8 path)
1617*6d67aabdSBjoern A. Zeeb {
1618*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__);
1619*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303);
1620*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);
1621*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0);
1622*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x0);
1623*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_CLKG_FORCE, 0x0);
1624*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x0000000);
1625*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x0);
1626*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x0);
1627*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, 0x0000001f, 0x03);
1628*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, 0x000003e0, 0x03);
1629*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_TXCK_ALL, 0x00);
1630*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_TXCK_ALL, 0x00);
1631*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC,
1632*6d67aabdSBjoern A. Zeeb 			       B_UPD_CLK_ADC_VAL | B_UPD_CLK_ADC_ON, 0x0);
1633*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0);
1634*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x0);
1635*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0000);
1636*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x0);
1637*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x0);
1638*6d67aabdSBjoern A. Zeeb }
1639*6d67aabdSBjoern A. Zeeb 
1640*6d67aabdSBjoern A. Zeeb static void _iqk_preset(struct rtw89_dev *rtwdev, u8 path)
1641*6d67aabdSBjoern A. Zeeb {
1642*6d67aabdSBjoern A. Zeeb 	u8 idx = 0;
1643*6d67aabdSBjoern A. Zeeb 
1644*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 0x00000001, idx);
1645*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 0x00000008, idx);
1646*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, 0x40000000);
1647*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 0x40000000);
1648*6d67aabdSBjoern A. Zeeb 
1649*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
1650*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0);
1651*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
1652*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a);
1653*6d67aabdSBjoern A. Zeeb }
1654*6d67aabdSBjoern A. Zeeb 
1655*6d67aabdSBjoern A. Zeeb static void _iqk_macbb_setting(struct rtw89_dev *rtwdev,
1656*6d67aabdSBjoern A. Zeeb 			       enum rtw89_phy_idx phy_idx, u8 path)
1657*6d67aabdSBjoern A. Zeeb {
1658*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303);
1659*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_GOT_TXRX, 0x3);
1660*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_GOT_TXRX, 0x3);
1661*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x1);
1662*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x1);
1663*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x3);
1664*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P0_CLKG_FORCE, 0x3);
1665*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x1ffffff);
1666*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x1);
1667*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x1);
1668*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, B_TXRX_FORCE_VAL, 0x3ff);
1669*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_CLKEN,  0x3);
1670*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_RST, B_IQK_DPK_RST, 0x1);
1671*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_PATH_RST, B_P0_PATH_RST, 0x1);
1672*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_PATH_RST, B_P1_PATH_RST, 0x1);
1673*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1);
1674*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1);
1675*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DCFO_WEIGHT, B_DAC_CLK_IDX, 0x1);
1676*6d67aabdSBjoern A. Zeeb 
1677*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_A, true, DAC_960M);
1678*6d67aabdSBjoern A. Zeeb 	_txck_force(rtwdev, RF_PATH_B, true, DAC_960M);
1679*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_A, true, ADC_1920M);
1680*6d67aabdSBjoern A. Zeeb 	_rxck_force(rtwdev, RF_PATH_B, true, ADC_1920M);
1681*6d67aabdSBjoern A. Zeeb 
1682*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1);
1683*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x2);
1684*6d67aabdSBjoern A. Zeeb 
1685*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);
1686*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1);
1687*6d67aabdSBjoern A. Zeeb 	udelay(10);
1688*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f);
1689*6d67aabdSBjoern A. Zeeb 	udelay(10);
1690*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13);
1691*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001);
1692*6d67aabdSBjoern A. Zeeb 	udelay(10);
1693*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041);
1694*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_RSTB, 0x1);
1695*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x3333);
1696*6d67aabdSBjoern A. Zeeb }
1697*6d67aabdSBjoern A. Zeeb 
1698*6d67aabdSBjoern A. Zeeb static void _iqk_init(struct rtw89_dev *rtwdev)
1699*6d67aabdSBjoern A. Zeeb {
1700*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1701*6d67aabdSBjoern A. Zeeb 	u8 idx, path;
1702*6d67aabdSBjoern A. Zeeb 
1703*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQKINF, MASKDWORD, 0x0);
1704*6d67aabdSBjoern A. Zeeb 
1705*6d67aabdSBjoern A. Zeeb 	if (iqk_info->is_iqk_init)
1706*6d67aabdSBjoern A. Zeeb 		return;
1707*6d67aabdSBjoern A. Zeeb 
1708*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);
1709*6d67aabdSBjoern A. Zeeb 	iqk_info->is_iqk_init = true;
1710*6d67aabdSBjoern A. Zeeb 	iqk_info->is_nbiqk = false;
1711*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_fft_en = false;
1712*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_sram_en = false;
1713*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_cfir_en = false;
1714*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_xym_en = false;
1715*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_times = 0x0;
1716*6d67aabdSBjoern A. Zeeb 
1717*6d67aabdSBjoern A. Zeeb 	for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {
1718*6d67aabdSBjoern A. Zeeb 		iqk_info->iqk_channel[idx] = 0x0;
1719*6d67aabdSBjoern A. Zeeb 		for (path = 0; path < RTW8852BT_SS; path++) {
1720*6d67aabdSBjoern A. Zeeb 			iqk_info->lok_cor_fail[idx][path] = false;
1721*6d67aabdSBjoern A. Zeeb 			iqk_info->lok_fin_fail[idx][path] = false;
1722*6d67aabdSBjoern A. Zeeb 			iqk_info->iqk_tx_fail[idx][path] = false;
1723*6d67aabdSBjoern A. Zeeb 			iqk_info->iqk_rx_fail[idx][path] = false;
1724*6d67aabdSBjoern A. Zeeb 			iqk_info->iqk_mcc_ch[idx][path] = 0x0;
1725*6d67aabdSBjoern A. Zeeb 			iqk_info->iqk_table_idx[path] = 0x0;
1726*6d67aabdSBjoern A. Zeeb 		}
1727*6d67aabdSBjoern A. Zeeb 	}
1728*6d67aabdSBjoern A. Zeeb }
1729*6d67aabdSBjoern A. Zeeb 
1730*6d67aabdSBjoern A. Zeeb static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)
1731*6d67aabdSBjoern A. Zeeb {
1732*6d67aabdSBjoern A. Zeeb 	u32 rf_mode;
1733*6d67aabdSBjoern A. Zeeb 	u8 path;
1734*6d67aabdSBjoern A. Zeeb 	int ret;
1735*6d67aabdSBjoern A. Zeeb 
1736*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < RF_PATH_MAX; path++) {
1737*6d67aabdSBjoern A. Zeeb 		if (!(kpath & BIT(path)))
1738*6d67aabdSBjoern A. Zeeb 			continue;
1739*6d67aabdSBjoern A. Zeeb 
1740*6d67aabdSBjoern A. Zeeb 		ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode,
1741*6d67aabdSBjoern A. Zeeb 					       rf_mode != 2, 2, 5000, false,
1742*6d67aabdSBjoern A. Zeeb 					       rtwdev, path, RR_MOD, RR_MOD_MASK);
1743*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
1744*6d67aabdSBjoern A. Zeeb 			    "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", path, ret);
1745*6d67aabdSBjoern A. Zeeb 	}
1746*6d67aabdSBjoern A. Zeeb }
1747*6d67aabdSBjoern A. Zeeb 
1748*6d67aabdSBjoern A. Zeeb static void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx,
1749*6d67aabdSBjoern A. Zeeb 			   bool is_pause)
1750*6d67aabdSBjoern A. Zeeb {
1751*6d67aabdSBjoern A. Zeeb 	if (!is_pause)
1752*6d67aabdSBjoern A. Zeeb 		return;
1753*6d67aabdSBjoern A. Zeeb 
1754*6d67aabdSBjoern A. Zeeb 	_wait_rx_mode(rtwdev, _kpath(rtwdev, band_idx));
1755*6d67aabdSBjoern A. Zeeb }
1756*6d67aabdSBjoern A. Zeeb 
1757*6d67aabdSBjoern A. Zeeb static void _doiqk(struct rtw89_dev *rtwdev, bool force,
1758*6d67aabdSBjoern A. Zeeb 		   enum rtw89_phy_idx phy_idx, u8 path)
1759*6d67aabdSBjoern A. Zeeb {
1760*6d67aabdSBjoern A. Zeeb 	struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;
1761*6d67aabdSBjoern A. Zeeb 	u32 backup_bb_val[BACKUP_BB_REGS_NR];
1762*6d67aabdSBjoern A. Zeeb 	u32 backup_rf_val[RTW8852BT_SS][BACKUP_RF_REGS_NR];
1763*6d67aabdSBjoern A. Zeeb 	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB);
1764*6d67aabdSBjoern A. Zeeb 
1765*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
1766*6d67aabdSBjoern A. Zeeb 
1767*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
1768*6d67aabdSBjoern A. Zeeb 		    "[IQK]==========IQK start!!!!!==========\n");
1769*6d67aabdSBjoern A. Zeeb 	iqk_info->iqk_times++;
1770*6d67aabdSBjoern A. Zeeb 	iqk_info->version = RTW8852BT_IQK_VER;
1771*6d67aabdSBjoern A. Zeeb 
1772*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);
1773*6d67aabdSBjoern A. Zeeb 	_iqk_get_ch_info(rtwdev, phy_idx, path);
1774*6d67aabdSBjoern A. Zeeb 
1775*6d67aabdSBjoern A. Zeeb 	_rfk_backup_bb_reg(rtwdev, backup_bb_val);
1776*6d67aabdSBjoern A. Zeeb 	_rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path);
1777*6d67aabdSBjoern A. Zeeb 	_iqk_macbb_setting(rtwdev, phy_idx, path);
1778*6d67aabdSBjoern A. Zeeb 	_iqk_preset(rtwdev, path);
1779*6d67aabdSBjoern A. Zeeb 	_iqk_start_iqk(rtwdev, phy_idx, path);
1780*6d67aabdSBjoern A. Zeeb 	_iqk_restore(rtwdev, path);
1781*6d67aabdSBjoern A. Zeeb 	_iqk_afebb_restore(rtwdev, phy_idx, path);
1782*6d67aabdSBjoern A. Zeeb 	_rfk_reload_bb_reg(rtwdev, backup_bb_val);
1783*6d67aabdSBjoern A. Zeeb 	_rfk_reload_rf_reg(rtwdev, backup_rf_val[path], path);
1784*6d67aabdSBjoern A. Zeeb 
1785*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
1786*6d67aabdSBjoern A. Zeeb }
1787*6d67aabdSBjoern A. Zeeb 
1788*6d67aabdSBjoern A. Zeeb static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force)
1789*6d67aabdSBjoern A. Zeeb {
1790*6d67aabdSBjoern A. Zeeb 	u8 kpath = _kpath(rtwdev, phy_idx);
1791*6d67aabdSBjoern A. Zeeb 
1792*6d67aabdSBjoern A. Zeeb 	switch (kpath) {
1793*6d67aabdSBjoern A. Zeeb 	case RF_A:
1794*6d67aabdSBjoern A. Zeeb 		_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
1795*6d67aabdSBjoern A. Zeeb 		break;
1796*6d67aabdSBjoern A. Zeeb 	case RF_B:
1797*6d67aabdSBjoern A. Zeeb 		_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
1798*6d67aabdSBjoern A. Zeeb 		break;
1799*6d67aabdSBjoern A. Zeeb 	case RF_AB:
1800*6d67aabdSBjoern A. Zeeb 		_doiqk(rtwdev, force, phy_idx, RF_PATH_A);
1801*6d67aabdSBjoern A. Zeeb 		_doiqk(rtwdev, force, phy_idx, RF_PATH_B);
1802*6d67aabdSBjoern A. Zeeb 		break;
1803*6d67aabdSBjoern A. Zeeb 	default:
1804*6d67aabdSBjoern A. Zeeb 		break;
1805*6d67aabdSBjoern A. Zeeb 	}
1806*6d67aabdSBjoern A. Zeeb }
1807*6d67aabdSBjoern A. Zeeb 
1808*6d67aabdSBjoern A. Zeeb static void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool off)
1809*6d67aabdSBjoern A. Zeeb {
1810*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
1811*6d67aabdSBjoern A. Zeeb 	u8 val, kidx = dpk->cur_idx[path];
1812*6d67aabdSBjoern A. Zeeb 	bool off_reverse;
1813*6d67aabdSBjoern A. Zeeb 
1814*6d67aabdSBjoern A. Zeeb 	val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok;
1815*6d67aabdSBjoern A. Zeeb 
1816*6d67aabdSBjoern A. Zeeb 	if (off)
1817*6d67aabdSBjoern A. Zeeb 		off_reverse = false;
1818*6d67aabdSBjoern A. Zeeb 	else
1819*6d67aabdSBjoern A. Zeeb 		off_reverse = true;
1820*6d67aabdSBjoern A. Zeeb 
1821*6d67aabdSBjoern A. Zeeb 	val = dpk->is_dpk_enable & off_reverse & dpk->bp[path][kidx].path_ok;
1822*6d67aabdSBjoern A. Zeeb 
1823*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
1824*6d67aabdSBjoern A. Zeeb 			       BIT(24), val);
1825*6d67aabdSBjoern A. Zeeb 
1826*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path,
1827*6d67aabdSBjoern A. Zeeb 		    kidx, dpk->is_dpk_enable & off_reverse ? "enable" : "disable");
1828*6d67aabdSBjoern A. Zeeb }
1829*6d67aabdSBjoern A. Zeeb 
1830*6d67aabdSBjoern A. Zeeb static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
1831*6d67aabdSBjoern A. Zeeb 			  enum rtw89_rf_path path, enum rtw8852bt_dpk_id id)
1832*6d67aabdSBjoern A. Zeeb {
1833*6d67aabdSBjoern A. Zeeb 	u16 dpk_cmd;
1834*6d67aabdSBjoern A. Zeeb 	u32 val;
1835*6d67aabdSBjoern A. Zeeb 	int ret;
1836*6d67aabdSBjoern A. Zeeb 
1837*6d67aabdSBjoern A. Zeeb 	dpk_cmd = (id << 8) | (0x19 + (path << 4));
1838*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd);
1839*6d67aabdSBjoern A. Zeeb 
1840*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,
1841*6d67aabdSBjoern A. Zeeb 				       1, 30000, false,
1842*6d67aabdSBjoern A. Zeeb 				       rtwdev, R_RFK_ST, MASKBYTE0);
1843*6d67aabdSBjoern A. Zeeb 	if (ret)
1844*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 1 over 30ms!!!!\n");
1845*6d67aabdSBjoern A. Zeeb 
1846*6d67aabdSBjoern A. Zeeb 	udelay(1);
1847*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00030000);
1848*6d67aabdSBjoern A. Zeeb 
1849*6d67aabdSBjoern A. Zeeb 	ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000,
1850*6d67aabdSBjoern A. Zeeb 				       1, 2000, false,
1851*6d67aabdSBjoern A. Zeeb 				       rtwdev, R_RPT_COM, MASKLWORD);
1852*6d67aabdSBjoern A. Zeeb 	if (ret)
1853*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 2 over 2ms!!!!\n");
1854*6d67aabdSBjoern A. Zeeb 
1855*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);
1856*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
1857*6d67aabdSBjoern A. Zeeb 		    "[DPK] one-shot for %s = 0x%04x\n",
1858*6d67aabdSBjoern A. Zeeb 		    id == 0x06 ? "LBK_RXIQK" :
1859*6d67aabdSBjoern A. Zeeb 		    id == 0x10 ? "SYNC" :
1860*6d67aabdSBjoern A. Zeeb 		    id == 0x11 ? "MDPK_IDL" :
1861*6d67aabdSBjoern A. Zeeb 		    id == 0x12 ? "MDPK_MPA" :
1862*6d67aabdSBjoern A. Zeeb 		    id == 0x13 ? "GAIN_LOSS" :
1863*6d67aabdSBjoern A. Zeeb 		    id == 0x14 ? "PWR_CAL" :
1864*6d67aabdSBjoern A. Zeeb 		    id == 0x15 ? "DPK_RXAGC" :
1865*6d67aabdSBjoern A. Zeeb 		    id == 0x16 ? "KIP_PRESET" :
1866*6d67aabdSBjoern A. Zeeb 		    id == 0x17 ? "KIP_RESOTRE" :
1867*6d67aabdSBjoern A. Zeeb 		    "DPK_TXAGC", dpk_cmd);
1868*6d67aabdSBjoern A. Zeeb }
1869*6d67aabdSBjoern A. Zeeb 
1870*6d67aabdSBjoern A. Zeeb static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
1871*6d67aabdSBjoern A. Zeeb 			enum rtw89_rf_path path)
1872*6d67aabdSBjoern A. Zeeb {
1873*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);
1874*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1);
1875*6d67aabdSBjoern A. Zeeb 
1876*6d67aabdSBjoern A. Zeeb 	udelay(600);
1877*6d67aabdSBjoern A. Zeeb 
1878*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d RXDCK\n", path);
1879*6d67aabdSBjoern A. Zeeb }
1880*6d67aabdSBjoern A. Zeeb 
1881*6d67aabdSBjoern A. Zeeb static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
1882*6d67aabdSBjoern A. Zeeb 			     enum rtw89_rf_path path)
1883*6d67aabdSBjoern A. Zeeb {
1884*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
1885*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
1886*6d67aabdSBjoern A. Zeeb 
1887*6d67aabdSBjoern A. Zeeb 	u8 kidx = dpk->cur_idx[path];
1888*6d67aabdSBjoern A. Zeeb 
1889*6d67aabdSBjoern A. Zeeb 	dpk->bp[path][kidx].band = chan->band_type;
1890*6d67aabdSBjoern A. Zeeb 	dpk->bp[path][kidx].ch = chan->channel;
1891*6d67aabdSBjoern A. Zeeb 	dpk->bp[path][kidx].bw = chan->band_width;
1892*6d67aabdSBjoern A. Zeeb 
1893*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
1894*6d67aabdSBjoern A. Zeeb 		    "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n",
1895*6d67aabdSBjoern A. Zeeb 		    path, dpk->cur_idx[path], phy,
1896*6d67aabdSBjoern A. Zeeb 		    rtwdev->is_tssi_mode[path] ? "on" : "off",
1897*6d67aabdSBjoern A. Zeeb 		    rtwdev->dbcc_en ? "on" : "off",
1898*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].band == 0 ? "2G" :
1899*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].band == 1 ? "5G" : "6G",
1900*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].ch,
1901*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].bw == 0 ? "20M" :
1902*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].bw == 1 ? "40M" : "80M");
1903*6d67aabdSBjoern A. Zeeb }
1904*6d67aabdSBjoern A. Zeeb 
1905*6d67aabdSBjoern A. Zeeb static void _dpk_tssi_pause(struct rtw89_dev *rtwdev,
1906*6d67aabdSBjoern A. Zeeb 			    enum rtw89_rf_path path, bool is_pause)
1907*6d67aabdSBjoern A. Zeeb {
1908*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13),
1909*6d67aabdSBjoern A. Zeeb 			       B_P0_TSSI_TRK_EN, is_pause);
1910*6d67aabdSBjoern A. Zeeb 
1911*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path,
1912*6d67aabdSBjoern A. Zeeb 		    is_pause ? "pause" : "resume");
1913*6d67aabdSBjoern A. Zeeb }
1914*6d67aabdSBjoern A. Zeeb 
1915*6d67aabdSBjoern A. Zeeb static void _dpk_kip_restore(struct rtw89_dev *rtwdev,
1916*6d67aabdSBjoern A. Zeeb 			     enum rtw89_rf_path path)
1917*6d67aabdSBjoern A. Zeeb {
1918*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000);
1919*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);
1920*6d67aabdSBjoern A. Zeeb 
1921*6d67aabdSBjoern A. Zeeb 	if (rtwdev->hal.cv > CHIP_CAV)
1922*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8),
1923*6d67aabdSBjoern A. Zeeb 				       B_DPD_COM_OF, 0x1);
1924*6d67aabdSBjoern A. Zeeb 
1925*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path);
1926*6d67aabdSBjoern A. Zeeb }
1927*6d67aabdSBjoern A. Zeeb 
1928*6d67aabdSBjoern A. Zeeb static void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
1929*6d67aabdSBjoern A. Zeeb 			   enum rtw89_rf_path path, u8 cur_rxbb, u32 rf_18)
1930*6d67aabdSBjoern A. Zeeb {
1931*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1);
1932*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR, 0x0);
1933*6d67aabdSBjoern A. Zeeb 
1934*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, rf_18);
1935*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0xd);
1936*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1);
1937*6d67aabdSBjoern A. Zeeb 
1938*6d67aabdSBjoern A. Zeeb 	if (cur_rxbb >= 0x11)
1939*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x13);
1940*6d67aabdSBjoern A. Zeeb 	else if (cur_rxbb <= 0xa)
1941*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x00);
1942*6d67aabdSBjoern A. Zeeb 	else
1943*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x05);
1944*6d67aabdSBjoern A. Zeeb 
1945*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x0);
1946*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);
1947*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80014);
1948*6d67aabdSBjoern A. Zeeb 
1949*6d67aabdSBjoern A. Zeeb 	udelay(100);
1950*6d67aabdSBjoern A. Zeeb 
1951*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
1952*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x025);
1953*6d67aabdSBjoern A. Zeeb 
1954*6d67aabdSBjoern A. Zeeb 	_dpk_one_shot(rtwdev, phy, path, LBK_RXIQK);
1955*6d67aabdSBjoern A. Zeeb 
1956*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
1957*6d67aabdSBjoern A. Zeeb 
1958*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0);
1959*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0);
1960*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0);
1961*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1);
1962*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0x5);
1963*6d67aabdSBjoern A. Zeeb }
1964*6d67aabdSBjoern A. Zeeb 
1965*6d67aabdSBjoern A. Zeeb static void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain,
1966*6d67aabdSBjoern A. Zeeb 			    enum rtw89_rf_path path, u8 kidx)
1967*6d67aabdSBjoern A. Zeeb {
1968*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
1969*6d67aabdSBjoern A. Zeeb 
1970*6d67aabdSBjoern A. Zeeb 	if (dpk->bp[path][kidx].band == RTW89_BAND_2G) {
1971*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220);
1972*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_FATT, 0xf2);
1973*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1);
1974*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1);
1975*6d67aabdSBjoern A. Zeeb 	} else {
1976*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220);
1977*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SWATT, 0x5);
1978*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1);
1979*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1);
1980*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RXA_LNA, RFREG_MASK, 0x920FC);
1981*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_XALNA2, RFREG_MASK, 0x002C0);
1982*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_IQGEN, RFREG_MASK, 0x38800);
1983*6d67aabdSBjoern A. Zeeb 	}
1984*6d67aabdSBjoern A. Zeeb 
1985*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1);
1986*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1);
1987*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0);
1988*6d67aabdSBjoern A. Zeeb }
1989*6d67aabdSBjoern A. Zeeb 
1990*6d67aabdSBjoern A. Zeeb static void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev,
1991*6d67aabdSBjoern A. Zeeb 			       enum rtw89_rf_path path, bool is_bypass)
1992*6d67aabdSBjoern A. Zeeb {
1993*6d67aabdSBjoern A. Zeeb 	if (is_bypass) {
1994*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
1995*6d67aabdSBjoern A. Zeeb 				       B_RXIQC_BYPASS2, 0x1);
1996*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
1997*6d67aabdSBjoern A. Zeeb 				       B_RXIQC_BYPASS, 0x1);
1998*6d67aabdSBjoern A. Zeeb 	} else {
1999*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
2000*6d67aabdSBjoern A. Zeeb 				       B_RXIQC_BYPASS2, 0x0);
2001*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),
2002*6d67aabdSBjoern A. Zeeb 				       B_RXIQC_BYPASS, 0x0);
2003*6d67aabdSBjoern A. Zeeb 	}
2004*6d67aabdSBjoern A. Zeeb }
2005*6d67aabdSBjoern A. Zeeb 
2006*6d67aabdSBjoern A. Zeeb static
2007*6d67aabdSBjoern A. Zeeb void _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)
2008*6d67aabdSBjoern A. Zeeb {
2009*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2010*6d67aabdSBjoern A. Zeeb 
2011*6d67aabdSBjoern A. Zeeb 	if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80)
2012*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x0);
2013*6d67aabdSBjoern A. Zeeb 	else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40)
2014*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2);
2015*6d67aabdSBjoern A. Zeeb 	else
2016*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1);
2017*6d67aabdSBjoern A. Zeeb 
2018*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n",
2019*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" :
2020*6d67aabdSBjoern A. Zeeb 		    dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M");
2021*6d67aabdSBjoern A. Zeeb }
2022*6d67aabdSBjoern A. Zeeb 
2023*6d67aabdSBjoern A. Zeeb static void _dpk_table_select(struct rtw89_dev *rtwdev,
2024*6d67aabdSBjoern A. Zeeb 			      enum rtw89_rf_path path, u8 kidx, u8 gain)
2025*6d67aabdSBjoern A. Zeeb {
2026*6d67aabdSBjoern A. Zeeb 	u8 val;
2027*6d67aabdSBjoern A. Zeeb 
2028*6d67aabdSBjoern A. Zeeb 	val = 0x80 + kidx * 0x20 + gain * 0x10;
2029*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val);
2030*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
2031*6d67aabdSBjoern A. Zeeb 		    "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx,
2032*6d67aabdSBjoern A. Zeeb 		    gain, val);
2033*6d67aabdSBjoern A. Zeeb }
2034*6d67aabdSBjoern A. Zeeb 
2035*6d67aabdSBjoern A. Zeeb static bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)
2036*6d67aabdSBjoern A. Zeeb {
2037*6d67aabdSBjoern A. Zeeb #define DPK_SYNC_TH_DC_I 200
2038*6d67aabdSBjoern A. Zeeb #define DPK_SYNC_TH_DC_Q 200
2039*6d67aabdSBjoern A. Zeeb #define DPK_SYNC_TH_CORR 170
2040*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2041*6d67aabdSBjoern A. Zeeb 	u8 corr_val, corr_idx;
2042*6d67aabdSBjoern A. Zeeb 	u16 dc_i, dc_q;
2043*6d67aabdSBjoern A. Zeeb 	u32 corr, dc;
2044*6d67aabdSBjoern A. Zeeb 
2045*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0);
2046*6d67aabdSBjoern A. Zeeb 
2047*6d67aabdSBjoern A. Zeeb 	corr = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
2048*6d67aabdSBjoern A. Zeeb 	corr_idx = u32_get_bits(corr, B_PRT_COM_CORI);
2049*6d67aabdSBjoern A. Zeeb 	corr_val = u32_get_bits(corr, B_PRT_COM_CORV);
2050*6d67aabdSBjoern A. Zeeb 
2051*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
2052*6d67aabdSBjoern A. Zeeb 		    "[DPK] S%d Corr_idx / Corr_val = %d / %d\n",
2053*6d67aabdSBjoern A. Zeeb 		    path, corr_idx, corr_val);
2054*6d67aabdSBjoern A. Zeeb 
2055*6d67aabdSBjoern A. Zeeb 	dpk->corr_idx[path][kidx] = corr_idx;
2056*6d67aabdSBjoern A. Zeeb 	dpk->corr_val[path][kidx] = corr_val;
2057*6d67aabdSBjoern A. Zeeb 
2058*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9);
2059*6d67aabdSBjoern A. Zeeb 
2060*6d67aabdSBjoern A. Zeeb 	dc = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD);
2061*6d67aabdSBjoern A. Zeeb 	dc_i = u32_get_bits(dc, B_PRT_COM_DCI);
2062*6d67aabdSBjoern A. Zeeb 	dc_q = u32_get_bits(dc, B_PRT_COM_DCQ);
2063*6d67aabdSBjoern A. Zeeb 
2064*6d67aabdSBjoern A. Zeeb 	dc_i = abs(sign_extend32(dc_i, 11));
2065*6d67aabdSBjoern A. Zeeb 	dc_q = abs(sign_extend32(dc_q, 11));
2066*6d67aabdSBjoern A. Zeeb 
2067*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n",
2068*6d67aabdSBjoern A. Zeeb 		    path, dc_i, dc_q);
2069*6d67aabdSBjoern A. Zeeb 
2070*6d67aabdSBjoern A. Zeeb 	dpk->dc_i[path][kidx] = dc_i;
2071*6d67aabdSBjoern A. Zeeb 	dpk->dc_q[path][kidx] = dc_q;
2072*6d67aabdSBjoern A. Zeeb 
2073*6d67aabdSBjoern A. Zeeb 	if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q ||
2074*6d67aabdSBjoern A. Zeeb 	    corr_val < DPK_SYNC_TH_CORR)
2075*6d67aabdSBjoern A. Zeeb 		return true;
2076*6d67aabdSBjoern A. Zeeb 	else
2077*6d67aabdSBjoern A. Zeeb 		return false;
2078*6d67aabdSBjoern A. Zeeb }
2079*6d67aabdSBjoern A. Zeeb 
2080*6d67aabdSBjoern A. Zeeb static void _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2081*6d67aabdSBjoern A. Zeeb 		      enum rtw89_rf_path path, u8 kidx)
2082*6d67aabdSBjoern A. Zeeb {
2083*6d67aabdSBjoern A. Zeeb 	_dpk_one_shot(rtwdev, phy, path, SYNC);
2084*6d67aabdSBjoern A. Zeeb }
2085*6d67aabdSBjoern A. Zeeb 
2086*6d67aabdSBjoern A. Zeeb static u16 _dpk_dgain_read(struct rtw89_dev *rtwdev)
2087*6d67aabdSBjoern A. Zeeb {
2088*6d67aabdSBjoern A. Zeeb 	u16 dgain;
2089*6d67aabdSBjoern A. Zeeb 
2090*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0);
2091*6d67aabdSBjoern A. Zeeb 
2092*6d67aabdSBjoern A. Zeeb 	dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);
2093*6d67aabdSBjoern A. Zeeb 
2094*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain);
2095*6d67aabdSBjoern A. Zeeb 
2096*6d67aabdSBjoern A. Zeeb 	return dgain;
2097*6d67aabdSBjoern A. Zeeb }
2098*6d67aabdSBjoern A. Zeeb 
2099*6d67aabdSBjoern A. Zeeb static s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain)
2100*6d67aabdSBjoern A. Zeeb {
2101*6d67aabdSBjoern A. Zeeb 	static const u16 bnd[15] = {
2102*6d67aabdSBjoern A. Zeeb 		0xbf1, 0xaa5, 0x97d, 0x875, 0x789, 0x6b7, 0x5fc, 0x556,
2103*6d67aabdSBjoern A. Zeeb 		0x4c1, 0x43d, 0x3c7, 0x35e, 0x2ac, 0x262, 0x220
2104*6d67aabdSBjoern A. Zeeb 	};
2105*6d67aabdSBjoern A. Zeeb 	s8 offset;
2106*6d67aabdSBjoern A. Zeeb 
2107*6d67aabdSBjoern A. Zeeb 	if (dgain >= bnd[0])
2108*6d67aabdSBjoern A. Zeeb 		offset = 0x6;
2109*6d67aabdSBjoern A. Zeeb 	else if (bnd[0] > dgain && dgain >= bnd[1])
2110*6d67aabdSBjoern A. Zeeb 		offset = 0x6;
2111*6d67aabdSBjoern A. Zeeb 	else if (bnd[1] > dgain && dgain >= bnd[2])
2112*6d67aabdSBjoern A. Zeeb 		offset = 0x5;
2113*6d67aabdSBjoern A. Zeeb 	else if (bnd[2] > dgain && dgain >= bnd[3])
2114*6d67aabdSBjoern A. Zeeb 		offset = 0x4;
2115*6d67aabdSBjoern A. Zeeb 	else if (bnd[3] > dgain && dgain >= bnd[4])
2116*6d67aabdSBjoern A. Zeeb 		offset = 0x3;
2117*6d67aabdSBjoern A. Zeeb 	else if (bnd[4] > dgain && dgain >= bnd[5])
2118*6d67aabdSBjoern A. Zeeb 		offset = 0x2;
2119*6d67aabdSBjoern A. Zeeb 	else if (bnd[5] > dgain && dgain >= bnd[6])
2120*6d67aabdSBjoern A. Zeeb 		offset = 0x1;
2121*6d67aabdSBjoern A. Zeeb 	else if (bnd[6] > dgain && dgain >= bnd[7])
2122*6d67aabdSBjoern A. Zeeb 		offset = 0x0;
2123*6d67aabdSBjoern A. Zeeb 	else if (bnd[7] > dgain && dgain >= bnd[8])
2124*6d67aabdSBjoern A. Zeeb 		offset = 0xff;
2125*6d67aabdSBjoern A. Zeeb 	else if (bnd[8] > dgain && dgain >= bnd[9])
2126*6d67aabdSBjoern A. Zeeb 		offset = 0xfe;
2127*6d67aabdSBjoern A. Zeeb 	else if (bnd[9] > dgain && dgain >= bnd[10])
2128*6d67aabdSBjoern A. Zeeb 		offset = 0xfd;
2129*6d67aabdSBjoern A. Zeeb 	else if (bnd[10] > dgain && dgain >= bnd[11])
2130*6d67aabdSBjoern A. Zeeb 		offset = 0xfc;
2131*6d67aabdSBjoern A. Zeeb 	else if (bnd[11] > dgain && dgain >= bnd[12])
2132*6d67aabdSBjoern A. Zeeb 		offset = 0xfb;
2133*6d67aabdSBjoern A. Zeeb 	else if (bnd[12] > dgain && dgain >= bnd[13])
2134*6d67aabdSBjoern A. Zeeb 		offset = 0xfa;
2135*6d67aabdSBjoern A. Zeeb 	else if (bnd[13] > dgain && dgain >= bnd[14])
2136*6d67aabdSBjoern A. Zeeb 		offset = 0xf9;
2137*6d67aabdSBjoern A. Zeeb 	else if (bnd[14] > dgain)
2138*6d67aabdSBjoern A. Zeeb 		offset = 0xf8;
2139*6d67aabdSBjoern A. Zeeb 	else
2140*6d67aabdSBjoern A. Zeeb 		offset = 0x0;
2141*6d67aabdSBjoern A. Zeeb 
2142*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain offset = %d\n", offset);
2143*6d67aabdSBjoern A. Zeeb 
2144*6d67aabdSBjoern A. Zeeb 	return offset;
2145*6d67aabdSBjoern A. Zeeb }
2146*6d67aabdSBjoern A. Zeeb 
2147*6d67aabdSBjoern A. Zeeb static u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev)
2148*6d67aabdSBjoern A. Zeeb {
2149*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6);
2150*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1);
2151*6d67aabdSBjoern A. Zeeb 
2152*6d67aabdSBjoern A. Zeeb 	return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL);
2153*6d67aabdSBjoern A. Zeeb }
2154*6d67aabdSBjoern A. Zeeb 
2155*6d67aabdSBjoern A. Zeeb static void _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2156*6d67aabdSBjoern A. Zeeb 			  enum rtw89_rf_path path, u8 kidx)
2157*6d67aabdSBjoern A. Zeeb {
2158*6d67aabdSBjoern A. Zeeb 	_dpk_one_shot(rtwdev, phy, path, GAIN_LOSS);
2159*6d67aabdSBjoern A. Zeeb 
2160*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6);
2161*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1);
2162*6d67aabdSBjoern A. Zeeb }
2163*6d67aabdSBjoern A. Zeeb 
2164*6d67aabdSBjoern A. Zeeb static void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2165*6d67aabdSBjoern A. Zeeb 			    enum rtw89_rf_path path, u8 kidx)
2166*6d67aabdSBjoern A. Zeeb {
2167*6d67aabdSBjoern A. Zeeb 	_dpk_tpg_sel(rtwdev, path, kidx);
2168*6d67aabdSBjoern A. Zeeb 	_dpk_one_shot(rtwdev, phy, path, KIP_PRESET);
2169*6d67aabdSBjoern A. Zeeb }
2170*6d67aabdSBjoern A. Zeeb 
2171*6d67aabdSBjoern A. Zeeb static void _dpk_kip_pwr_clk_on(struct rtw89_dev *rtwdev,
2172*6d67aabdSBjoern A. Zeeb 				enum rtw89_rf_path path)
2173*6d67aabdSBjoern A. Zeeb {
2174*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);
2175*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a);
2176*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08);
2177*6d67aabdSBjoern A. Zeeb 
2178*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP Power/CLK on\n");
2179*6d67aabdSBjoern A. Zeeb }
2180*6d67aabdSBjoern A. Zeeb 
2181*6d67aabdSBjoern A. Zeeb static
2182*6d67aabdSBjoern A. Zeeb u8 _dpk_txagc_check_8852bt(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 txagc)
2183*6d67aabdSBjoern A. Zeeb {
2184*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2185*6d67aabdSBjoern A. Zeeb 
2186*6d67aabdSBjoern A. Zeeb 	if (txagc >= dpk->max_dpk_txagc[path])
2187*6d67aabdSBjoern A. Zeeb 		txagc = dpk->max_dpk_txagc[path];
2188*6d67aabdSBjoern A. Zeeb 
2189*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Set TxAGC = 0x%x\n", txagc);
2190*6d67aabdSBjoern A. Zeeb 
2191*6d67aabdSBjoern A. Zeeb 	return txagc;
2192*6d67aabdSBjoern A. Zeeb }
2193*6d67aabdSBjoern A. Zeeb 
2194*6d67aabdSBjoern A. Zeeb static void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2195*6d67aabdSBjoern A. Zeeb 			       enum rtw89_rf_path path, u8 txagc)
2196*6d67aabdSBjoern A. Zeeb {
2197*6d67aabdSBjoern A. Zeeb 	u8 val;
2198*6d67aabdSBjoern A. Zeeb 
2199*6d67aabdSBjoern A. Zeeb 	val = _dpk_txagc_check_8852bt(rtwdev, path, txagc);
2200*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_TXAGC, RFREG_MASK, val);
2201*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
2202*6d67aabdSBjoern A. Zeeb 	_dpk_one_shot(rtwdev, phy, path, DPK_TXAGC);
2203*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
2204*6d67aabdSBjoern A. Zeeb 
2205*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] set TXAGC = 0x%x\n", txagc);
2206*6d67aabdSBjoern A. Zeeb }
2207*6d67aabdSBjoern A. Zeeb 
2208*6d67aabdSBjoern A. Zeeb static void _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2209*6d67aabdSBjoern A. Zeeb 			       enum rtw89_rf_path path)
2210*6d67aabdSBjoern A. Zeeb {
2211*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, 0x50220);
2212*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1);
2213*6d67aabdSBjoern A. Zeeb 	_dpk_one_shot(rtwdev, phy, path, DPK_RXAGC);
2214*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0);
2215*6d67aabdSBjoern A. Zeeb }
2216*6d67aabdSBjoern A. Zeeb 
2217*6d67aabdSBjoern A. Zeeb static u8 _dpk_set_offset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2218*6d67aabdSBjoern A. Zeeb 			  enum rtw89_rf_path path, u8 txagc, s8 gain_offset)
2219*6d67aabdSBjoern A. Zeeb {
2220*6d67aabdSBjoern A. Zeeb 	txagc = rtw89_read_rf(rtwdev, path, RR_TXAGC, RFREG_MASK);
2221*6d67aabdSBjoern A. Zeeb 
2222*6d67aabdSBjoern A. Zeeb 	if ((txagc - gain_offset) < DPK_TXAGC_LOWER)
2223*6d67aabdSBjoern A. Zeeb 		txagc = DPK_TXAGC_LOWER;
2224*6d67aabdSBjoern A. Zeeb 	else if ((txagc - gain_offset) > DPK_TXAGC_UPPER)
2225*6d67aabdSBjoern A. Zeeb 		txagc = DPK_TXAGC_UPPER;
2226*6d67aabdSBjoern A. Zeeb 	else
2227*6d67aabdSBjoern A. Zeeb 		txagc = txagc - gain_offset;
2228*6d67aabdSBjoern A. Zeeb 
2229*6d67aabdSBjoern A. Zeeb 	_dpk_kip_set_txagc(rtwdev, phy, path, txagc);
2230*6d67aabdSBjoern A. Zeeb 
2231*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n",
2232*6d67aabdSBjoern A. Zeeb 		    gain_offset, txagc);
2233*6d67aabdSBjoern A. Zeeb 	return txagc;
2234*6d67aabdSBjoern A. Zeeb }
2235*6d67aabdSBjoern A. Zeeb 
2236*6d67aabdSBjoern A. Zeeb static bool _dpk_pas_read(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,
2237*6d67aabdSBjoern A. Zeeb 			  u8 is_check)
2238*6d67aabdSBjoern A. Zeeb {
2239*6d67aabdSBjoern A. Zeeb 	u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0;
2240*6d67aabdSBjoern A. Zeeb 	u8 i;
2241*6d67aabdSBjoern A. Zeeb 
2242*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06);
2243*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0);
2244*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08);
2245*6d67aabdSBjoern A. Zeeb 
2246*6d67aabdSBjoern A. Zeeb 	if (is_check) {
2247*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00);
2248*6d67aabdSBjoern A. Zeeb 		val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
2249*6d67aabdSBjoern A. Zeeb 		val1_i = abs(sign_extend32(val1_i, 11));
2250*6d67aabdSBjoern A. Zeeb 		val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
2251*6d67aabdSBjoern A. Zeeb 		val1_q = abs(sign_extend32(val1_q, 11));
2252*6d67aabdSBjoern A. Zeeb 
2253*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f);
2254*6d67aabdSBjoern A. Zeeb 		val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);
2255*6d67aabdSBjoern A. Zeeb 		val2_i = abs(sign_extend32(val2_i, 11));
2256*6d67aabdSBjoern A. Zeeb 		val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);
2257*6d67aabdSBjoern A. Zeeb 		val2_q = abs(sign_extend32(val2_q, 11));
2258*6d67aabdSBjoern A. Zeeb 
2259*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n",
2260*6d67aabdSBjoern A. Zeeb 			    phy_div(val1_i * val1_i + val1_q * val1_q,
2261*6d67aabdSBjoern A. Zeeb 				    val2_i * val2_i + val2_q * val2_q));
2262*6d67aabdSBjoern A. Zeeb 	} else {
2263*6d67aabdSBjoern A. Zeeb 		for (i = 0; i < 32; i++) {
2264*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i);
2265*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK,
2266*6d67aabdSBjoern A. Zeeb 				    "[DPK] PAS_Read[%02d]= 0x%08x\n", i,
2267*6d67aabdSBjoern A. Zeeb 				    rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD));
2268*6d67aabdSBjoern A. Zeeb 		}
2269*6d67aabdSBjoern A. Zeeb 	}
2270*6d67aabdSBjoern A. Zeeb 
2271*6d67aabdSBjoern A. Zeeb 	if (val1_i * val1_i + val1_q * val1_q >=
2272*6d67aabdSBjoern A. Zeeb 	    (val2_i * val2_i + val2_q * val2_q) * 8 / 5)
2273*6d67aabdSBjoern A. Zeeb 		return true;
2274*6d67aabdSBjoern A. Zeeb 
2275*6d67aabdSBjoern A. Zeeb 	return false;
2276*6d67aabdSBjoern A. Zeeb }
2277*6d67aabdSBjoern A. Zeeb 
2278*6d67aabdSBjoern A. Zeeb static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2279*6d67aabdSBjoern A. Zeeb 		   enum rtw89_rf_path path, u8 kidx, u8 init_txagc,
2280*6d67aabdSBjoern A. Zeeb 		   bool loss_only)
2281*6d67aabdSBjoern A. Zeeb {
2282*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
2283*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2284*6d67aabdSBjoern A. Zeeb 	u8 goout = 0, agc_cnt = 0, limited_rxbb = 0, gl_cnt = 0;
2285*6d67aabdSBjoern A. Zeeb 	u8 tmp_txagc, tmp_rxbb, tmp_gl_idx = 0;
2286*6d67aabdSBjoern A. Zeeb 	u8 step = DPK_AGC_STEP_SYNC_DGAIN;
2287*6d67aabdSBjoern A. Zeeb 	int limit = 200;
2288*6d67aabdSBjoern A. Zeeb 	s8 offset = 0;
2289*6d67aabdSBjoern A. Zeeb 	u16 dgain = 0;
2290*6d67aabdSBjoern A. Zeeb 	u32 rf_18;
2291*6d67aabdSBjoern A. Zeeb 
2292*6d67aabdSBjoern A. Zeeb 	tmp_txagc = init_txagc;
2293*6d67aabdSBjoern A. Zeeb 
2294*6d67aabdSBjoern A. Zeeb 	tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB);
2295*6d67aabdSBjoern A. Zeeb 	rf_18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK);
2296*6d67aabdSBjoern A. Zeeb 
2297*6d67aabdSBjoern A. Zeeb 	do {
2298*6d67aabdSBjoern A. Zeeb 		switch (step) {
2299*6d67aabdSBjoern A. Zeeb 		case DPK_AGC_STEP_SYNC_DGAIN:
2300*6d67aabdSBjoern A. Zeeb 			_dpk_sync(rtwdev, phy, path, kidx);
2301*6d67aabdSBjoern A. Zeeb 			if (agc_cnt == 0) {
2302*6d67aabdSBjoern A. Zeeb 				if (chan->band_width < 2)
2303*6d67aabdSBjoern A. Zeeb 					_dpk_bypass_rxcfir(rtwdev, path, true);
2304*6d67aabdSBjoern A. Zeeb 				else
2305*6d67aabdSBjoern A. Zeeb 					_dpk_lbk_rxiqk(rtwdev, phy, path,
2306*6d67aabdSBjoern A. Zeeb 						       tmp_rxbb, rf_18);
2307*6d67aabdSBjoern A. Zeeb 			}
2308*6d67aabdSBjoern A. Zeeb 
2309*6d67aabdSBjoern A. Zeeb 			if (_dpk_sync_check(rtwdev, path, kidx) == true) {
2310*6d67aabdSBjoern A. Zeeb 				tmp_txagc = 0xff;
2311*6d67aabdSBjoern A. Zeeb 				goout = 1;
2312*6d67aabdSBjoern A. Zeeb 				break;
2313*6d67aabdSBjoern A. Zeeb 			}
2314*6d67aabdSBjoern A. Zeeb 
2315*6d67aabdSBjoern A. Zeeb 			dgain = _dpk_dgain_read(rtwdev);
2316*6d67aabdSBjoern A. Zeeb 			offset = _dpk_dgain_mapping(rtwdev, dgain);
2317*6d67aabdSBjoern A. Zeeb 
2318*6d67aabdSBjoern A. Zeeb 			if (loss_only == 1 || limited_rxbb == 1 || offset == 0)
2319*6d67aabdSBjoern A. Zeeb 				step = DPK_AGC_STEP_GAIN_LOSS_IDX;
2320*6d67aabdSBjoern A. Zeeb 			else
2321*6d67aabdSBjoern A. Zeeb 				step = DPK_AGC_STEP_GAIN_ADJ;
2322*6d67aabdSBjoern A. Zeeb 			break;
2323*6d67aabdSBjoern A. Zeeb 		case DPK_AGC_STEP_GAIN_ADJ:
2324*6d67aabdSBjoern A. Zeeb 			tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB);
2325*6d67aabdSBjoern A. Zeeb 
2326*6d67aabdSBjoern A. Zeeb 			if (tmp_rxbb + offset > 0x1f) {
2327*6d67aabdSBjoern A. Zeeb 				tmp_rxbb = 0x1f;
2328*6d67aabdSBjoern A. Zeeb 				limited_rxbb = 1;
2329*6d67aabdSBjoern A. Zeeb 			} else if (tmp_rxbb + offset < 0) {
2330*6d67aabdSBjoern A. Zeeb 				tmp_rxbb = 0;
2331*6d67aabdSBjoern A. Zeeb 				limited_rxbb = 1;
2332*6d67aabdSBjoern A. Zeeb 			} else {
2333*6d67aabdSBjoern A. Zeeb 				tmp_rxbb = tmp_rxbb + offset;
2334*6d67aabdSBjoern A. Zeeb 			}
2335*6d67aabdSBjoern A. Zeeb 
2336*6d67aabdSBjoern A. Zeeb 			rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB, tmp_rxbb);
2337*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK,
2338*6d67aabdSBjoern A. Zeeb 				    "[DPK] Adjust RXBB (%d) = 0x%x\n", offset, tmp_rxbb);
2339*6d67aabdSBjoern A. Zeeb 
2340*6d67aabdSBjoern A. Zeeb 			if (chan->band_width == RTW89_CHANNEL_WIDTH_80)
2341*6d67aabdSBjoern A. Zeeb 				_dpk_lbk_rxiqk(rtwdev, phy, path, tmp_rxbb, rf_18);
2342*6d67aabdSBjoern A. Zeeb 			if (dgain > 1922 || dgain < 342)
2343*6d67aabdSBjoern A. Zeeb 				step = DPK_AGC_STEP_SYNC_DGAIN;
2344*6d67aabdSBjoern A. Zeeb 			else
2345*6d67aabdSBjoern A. Zeeb 				step = DPK_AGC_STEP_GAIN_LOSS_IDX;
2346*6d67aabdSBjoern A. Zeeb 
2347*6d67aabdSBjoern A. Zeeb 			agc_cnt++;
2348*6d67aabdSBjoern A. Zeeb 			break;
2349*6d67aabdSBjoern A. Zeeb 		case DPK_AGC_STEP_GAIN_LOSS_IDX:
2350*6d67aabdSBjoern A. Zeeb 			_dpk_gainloss(rtwdev, phy, path, kidx);
2351*6d67aabdSBjoern A. Zeeb 
2352*6d67aabdSBjoern A. Zeeb 			tmp_gl_idx = _dpk_gainloss_read(rtwdev);
2353*6d67aabdSBjoern A. Zeeb 
2354*6d67aabdSBjoern A. Zeeb 			if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, path, true)) ||
2355*6d67aabdSBjoern A. Zeeb 			    tmp_gl_idx >= 7)
2356*6d67aabdSBjoern A. Zeeb 				step = DPK_AGC_STEP_GL_GT_CRITERION;
2357*6d67aabdSBjoern A. Zeeb 			else if (tmp_gl_idx == 0)
2358*6d67aabdSBjoern A. Zeeb 				step = DPK_AGC_STEP_GL_LT_CRITERION;
2359*6d67aabdSBjoern A. Zeeb 			else
2360*6d67aabdSBjoern A. Zeeb 				step = DPK_AGC_STEP_SET_TX_GAIN;
2361*6d67aabdSBjoern A. Zeeb 
2362*6d67aabdSBjoern A. Zeeb 			gl_cnt++;
2363*6d67aabdSBjoern A. Zeeb 			break;
2364*6d67aabdSBjoern A. Zeeb 		case DPK_AGC_STEP_GL_GT_CRITERION:
2365*6d67aabdSBjoern A. Zeeb 			if (tmp_txagc == 0x2e ||
2366*6d67aabdSBjoern A. Zeeb 			    tmp_txagc == dpk->max_dpk_txagc[path]) {
2367*6d67aabdSBjoern A. Zeeb 				goout = 1;
2368*6d67aabdSBjoern A. Zeeb 				rtw89_debug(rtwdev, RTW89_DBG_RFK,
2369*6d67aabdSBjoern A. Zeeb 					    "[DPK] Txagc@lower bound!!\n");
2370*6d67aabdSBjoern A. Zeeb 			} else {
2371*6d67aabdSBjoern A. Zeeb 				tmp_txagc = _dpk_set_offset(rtwdev, phy, path,
2372*6d67aabdSBjoern A. Zeeb 							    tmp_txagc, 0x3);
2373*6d67aabdSBjoern A. Zeeb 			}
2374*6d67aabdSBjoern A. Zeeb 			step = DPK_AGC_STEP_GAIN_LOSS_IDX;
2375*6d67aabdSBjoern A. Zeeb 			agc_cnt++;
2376*6d67aabdSBjoern A. Zeeb 			break;
2377*6d67aabdSBjoern A. Zeeb 
2378*6d67aabdSBjoern A. Zeeb 		case DPK_AGC_STEP_GL_LT_CRITERION:
2379*6d67aabdSBjoern A. Zeeb 			if (tmp_txagc == 0x3f || tmp_txagc == dpk->max_dpk_txagc[path]) {
2380*6d67aabdSBjoern A. Zeeb 				goout = 1;
2381*6d67aabdSBjoern A. Zeeb 				rtw89_debug(rtwdev, RTW89_DBG_RFK,
2382*6d67aabdSBjoern A. Zeeb 					    "[DPK] Txagc@upper bound!!\n");
2383*6d67aabdSBjoern A. Zeeb 			} else {
2384*6d67aabdSBjoern A. Zeeb 				tmp_txagc = _dpk_set_offset(rtwdev, phy, path,
2385*6d67aabdSBjoern A. Zeeb 							    tmp_txagc, 0xfe);
2386*6d67aabdSBjoern A. Zeeb 			}
2387*6d67aabdSBjoern A. Zeeb 			step = DPK_AGC_STEP_GAIN_LOSS_IDX;
2388*6d67aabdSBjoern A. Zeeb 			agc_cnt++;
2389*6d67aabdSBjoern A. Zeeb 			break;
2390*6d67aabdSBjoern A. Zeeb 
2391*6d67aabdSBjoern A. Zeeb 		case DPK_AGC_STEP_SET_TX_GAIN:
2392*6d67aabdSBjoern A. Zeeb 			tmp_txagc = _dpk_set_offset(rtwdev, phy, path, tmp_txagc,
2393*6d67aabdSBjoern A. Zeeb 						    tmp_gl_idx);
2394*6d67aabdSBjoern A. Zeeb 			goout = 1;
2395*6d67aabdSBjoern A. Zeeb 			agc_cnt++;
2396*6d67aabdSBjoern A. Zeeb 			break;
2397*6d67aabdSBjoern A. Zeeb 
2398*6d67aabdSBjoern A. Zeeb 		default:
2399*6d67aabdSBjoern A. Zeeb 			goout = 1;
2400*6d67aabdSBjoern A. Zeeb 			break;
2401*6d67aabdSBjoern A. Zeeb 		}
2402*6d67aabdSBjoern A. Zeeb 	} while (!goout && agc_cnt < 6 && limit-- > 0);
2403*6d67aabdSBjoern A. Zeeb 
2404*6d67aabdSBjoern A. Zeeb 	if (gl_cnt >= 6)
2405*6d67aabdSBjoern A. Zeeb 		_dpk_pas_read(rtwdev, path, false);
2406*6d67aabdSBjoern A. Zeeb 
2407*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
2408*6d67aabdSBjoern A. Zeeb 		    "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc, tmp_rxbb);
2409*6d67aabdSBjoern A. Zeeb 
2410*6d67aabdSBjoern A. Zeeb 	return tmp_txagc;
2411*6d67aabdSBjoern A. Zeeb }
2412*6d67aabdSBjoern A. Zeeb 
2413*6d67aabdSBjoern A. Zeeb static void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev,
2414*6d67aabdSBjoern A. Zeeb 			       enum rtw89_rf_path path, u8 order)
2415*6d67aabdSBjoern A. Zeeb {
2416*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2417*6d67aabdSBjoern A. Zeeb 
2418*6d67aabdSBjoern A. Zeeb 	switch (order) {
2419*6d67aabdSBjoern A. Zeeb 	case 0: /* (5,3,1) */
2420*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
2421*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3);
2422*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1);
2423*6d67aabdSBjoern A. Zeeb 		dpk->dpk_order[path] = 0x3;
2424*6d67aabdSBjoern A. Zeeb 		break;
2425*6d67aabdSBjoern A. Zeeb 	case 1: /* (5,3,0) */
2426*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
2427*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0);
2428*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x0);
2429*6d67aabdSBjoern A. Zeeb 		dpk->dpk_order[path] = 0x1;
2430*6d67aabdSBjoern A. Zeeb 		break;
2431*6d67aabdSBjoern A. Zeeb 	case 2: /* (5,0,0) */
2432*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order);
2433*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0);
2434*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x0);
2435*6d67aabdSBjoern A. Zeeb 		dpk->dpk_order[path] = 0x0;
2436*6d67aabdSBjoern A. Zeeb 		break;
2437*6d67aabdSBjoern A. Zeeb 	default:
2438*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
2439*6d67aabdSBjoern A. Zeeb 			    "[DPK] Wrong MDPD order!!(0x%x)\n", order);
2440*6d67aabdSBjoern A. Zeeb 		break;
2441*6d67aabdSBjoern A. Zeeb 	}
2442*6d67aabdSBjoern A. Zeeb 
2443*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Set %s for IDL\n",
2444*6d67aabdSBjoern A. Zeeb 		    order == 0x0 ? "(5,3,1)" :
2445*6d67aabdSBjoern A. Zeeb 		    order == 0x1 ? "(5,3,0)" : "(5,0,0)");
2446*6d67aabdSBjoern A. Zeeb 
2447*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
2448*6d67aabdSBjoern A. Zeeb 		    "[DPK] Set MDPD order to 0x%x for IDL\n", order);
2449*6d67aabdSBjoern A. Zeeb }
2450*6d67aabdSBjoern A. Zeeb 
2451*6d67aabdSBjoern A. Zeeb static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2452*6d67aabdSBjoern A. Zeeb 			 enum rtw89_rf_path path, u8 kidx, u8 gain)
2453*6d67aabdSBjoern A. Zeeb {
2454*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2455*6d67aabdSBjoern A. Zeeb 
2456*6d67aabdSBjoern A. Zeeb 	if (dpk->bp[path][kidx].bw < RTW89_CHANNEL_WIDTH_80 &&
2457*6d67aabdSBjoern A. Zeeb 	    dpk->bp[path][kidx].band == RTW89_BAND_5G)
2458*6d67aabdSBjoern A. Zeeb 		_dpk_set_mdpd_para(rtwdev, path, 0x2);
2459*6d67aabdSBjoern A. Zeeb 	else
2460*6d67aabdSBjoern A. Zeeb 		_dpk_set_mdpd_para(rtwdev, path, 0x0);
2461*6d67aabdSBjoern A. Zeeb 
2462*6d67aabdSBjoern A. Zeeb 	_dpk_one_shot(rtwdev, phy, path, MDPK_IDL);
2463*6d67aabdSBjoern A. Zeeb }
2464*6d67aabdSBjoern A. Zeeb 
2465*6d67aabdSBjoern A. Zeeb static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2466*6d67aabdSBjoern A. Zeeb 			     enum rtw89_rf_path path, u8 kidx, u8 gain, u8 txagc)
2467*6d67aabdSBjoern A. Zeeb {
2468*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2469*6d67aabdSBjoern A. Zeeb 	u8 gs = dpk->dpk_gs[phy];
2470*6d67aabdSBjoern A. Zeeb 	u16 pwsf = 0x78;
2471*6d67aabdSBjoern A. Zeeb 
2472*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), BIT(8), kidx);
2473*6d67aabdSBjoern A. Zeeb 
2474*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
2475*6d67aabdSBjoern A. Zeeb 		    "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n",
2476*6d67aabdSBjoern A. Zeeb 		    txagc, pwsf, gs);
2477*6d67aabdSBjoern A. Zeeb 
2478*6d67aabdSBjoern A. Zeeb 	dpk->bp[path][kidx].txagc_dpk = txagc;
2479*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8),
2480*6d67aabdSBjoern A. Zeeb 			       0x3F << ((gain << 3) + (kidx << 4)), txagc);
2481*6d67aabdSBjoern A. Zeeb 
2482*6d67aabdSBjoern A. Zeeb 	dpk->bp[path][kidx].pwsf = pwsf;
2483*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2),
2484*6d67aabdSBjoern A. Zeeb 			       0x1FF << (gain << 4), pwsf);
2485*6d67aabdSBjoern A. Zeeb 
2486*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1);
2487*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0);
2488*6d67aabdSBjoern A. Zeeb 
2489*6d67aabdSBjoern A. Zeeb 	dpk->bp[path][kidx].gs = gs;
2490*6d67aabdSBjoern A. Zeeb 	if (dpk->dpk_gs[phy] == 0x7f)
2491*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev,
2492*6d67aabdSBjoern A. Zeeb 				       R_DPD_CH0A + (path << 8) + (kidx << 2),
2493*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, 0x007f7f7f);
2494*6d67aabdSBjoern A. Zeeb 	else
2495*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev,
2496*6d67aabdSBjoern A. Zeeb 				       R_DPD_CH0A + (path << 8) + (kidx << 2),
2497*6d67aabdSBjoern A. Zeeb 				       MASKDWORD, 0x005b5b5b);
2498*6d67aabdSBjoern A. Zeeb 
2499*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),
2500*6d67aabdSBjoern A. Zeeb 			       B_DPD_ORDER_V1, dpk->dpk_order[path]);
2501*6d67aabdSBjoern A. Zeeb 
2502*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD, 0x0);
2503*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL, 0x0);
2504*6d67aabdSBjoern A. Zeeb }
2505*6d67aabdSBjoern A. Zeeb 
2506*6d67aabdSBjoern A. Zeeb static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2507*6d67aabdSBjoern A. Zeeb 			      enum rtw89_rf_path path)
2508*6d67aabdSBjoern A. Zeeb {
2509*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
2510*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2511*6d67aabdSBjoern A. Zeeb 	u8 idx, cur_band, cur_ch;
2512*6d67aabdSBjoern A. Zeeb 	bool is_reload = false;
2513*6d67aabdSBjoern A. Zeeb 
2514*6d67aabdSBjoern A. Zeeb 	cur_band = chan->band_type;
2515*6d67aabdSBjoern A. Zeeb 	cur_ch = chan->channel;
2516*6d67aabdSBjoern A. Zeeb 
2517*6d67aabdSBjoern A. Zeeb 	for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) {
2518*6d67aabdSBjoern A. Zeeb 		if (cur_band != dpk->bp[path][idx].band ||
2519*6d67aabdSBjoern A. Zeeb 		    cur_ch != dpk->bp[path][idx].ch)
2520*6d67aabdSBjoern A. Zeeb 			continue;
2521*6d67aabdSBjoern A. Zeeb 
2522*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8),
2523*6d67aabdSBjoern A. Zeeb 				       B_COEF_SEL_MDPD, idx);
2524*6d67aabdSBjoern A. Zeeb 		dpk->cur_idx[path] = idx;
2525*6d67aabdSBjoern A. Zeeb 		is_reload = true;
2526*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
2527*6d67aabdSBjoern A. Zeeb 			    "[DPK] reload S%d[%d] success\n", path, idx);
2528*6d67aabdSBjoern A. Zeeb 	}
2529*6d67aabdSBjoern A. Zeeb 
2530*6d67aabdSBjoern A. Zeeb 	return is_reload;
2531*6d67aabdSBjoern A. Zeeb }
2532*6d67aabdSBjoern A. Zeeb 
2533*6d67aabdSBjoern A. Zeeb static
2534*6d67aabdSBjoern A. Zeeb void _rf_direct_cntrl(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool is_bybb)
2535*6d67aabdSBjoern A. Zeeb {
2536*6d67aabdSBjoern A. Zeeb 	if (is_bybb)
2537*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);
2538*6d67aabdSBjoern A. Zeeb 	else
2539*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);
2540*6d67aabdSBjoern A. Zeeb }
2541*6d67aabdSBjoern A. Zeeb 
2542*6d67aabdSBjoern A. Zeeb static
2543*6d67aabdSBjoern A. Zeeb void _drf_direct_cntrl(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool is_bybb)
2544*6d67aabdSBjoern A. Zeeb {
2545*6d67aabdSBjoern A. Zeeb 	if (is_bybb)
2546*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1);
2547*6d67aabdSBjoern A. Zeeb 	else
2548*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0);
2549*6d67aabdSBjoern A. Zeeb }
2550*6d67aabdSBjoern A. Zeeb 
2551*6d67aabdSBjoern A. Zeeb static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2552*6d67aabdSBjoern A. Zeeb 		      enum rtw89_rf_path path, u8 gain)
2553*6d67aabdSBjoern A. Zeeb {
2554*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2555*6d67aabdSBjoern A. Zeeb 	u8 txagc = 0x38, kidx = dpk->cur_idx[path];
2556*6d67aabdSBjoern A. Zeeb 	bool is_fail = false;
2557*6d67aabdSBjoern A. Zeeb 
2558*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
2559*6d67aabdSBjoern A. Zeeb 		    "[DPK] ========= S%d[%d] DPK Start =========\n", path, kidx);
2560*6d67aabdSBjoern A. Zeeb 
2561*6d67aabdSBjoern A. Zeeb 	_rf_direct_cntrl(rtwdev, path, false);
2562*6d67aabdSBjoern A. Zeeb 	_drf_direct_cntrl(rtwdev, path, false);
2563*6d67aabdSBjoern A. Zeeb 
2564*6d67aabdSBjoern A. Zeeb 	_dpk_kip_pwr_clk_on(rtwdev, path);
2565*6d67aabdSBjoern A. Zeeb 	_dpk_kip_set_txagc(rtwdev, phy, path, txagc);
2566*6d67aabdSBjoern A. Zeeb 	_dpk_rf_setting(rtwdev, gain, path, kidx);
2567*6d67aabdSBjoern A. Zeeb 	_dpk_rx_dck(rtwdev, phy, path);
2568*6d67aabdSBjoern A. Zeeb 	_dpk_kip_preset(rtwdev, phy, path, kidx);
2569*6d67aabdSBjoern A. Zeeb 	_dpk_kip_set_rxagc(rtwdev, phy, path);
2570*6d67aabdSBjoern A. Zeeb 	_dpk_table_select(rtwdev, path, kidx, gain);
2571*6d67aabdSBjoern A. Zeeb 
2572*6d67aabdSBjoern A. Zeeb 	txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false);
2573*6d67aabdSBjoern A. Zeeb 
2574*6d67aabdSBjoern A. Zeeb 	_rfk_get_thermal(rtwdev, kidx, path);
2575*6d67aabdSBjoern A. Zeeb 
2576*6d67aabdSBjoern A. Zeeb 	if (txagc == 0xff) {
2577*6d67aabdSBjoern A. Zeeb 		is_fail = true;
2578*6d67aabdSBjoern A. Zeeb 		goto _error;
2579*6d67aabdSBjoern A. Zeeb 	}
2580*6d67aabdSBjoern A. Zeeb 
2581*6d67aabdSBjoern A. Zeeb 	_dpk_idl_mpa(rtwdev, phy, path, kidx, gain);
2582*6d67aabdSBjoern A. Zeeb 
2583*6d67aabdSBjoern A. Zeeb 	rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, RF_RX);
2584*6d67aabdSBjoern A. Zeeb 	_dpk_fill_result(rtwdev, phy, path, kidx, gain, txagc);
2585*6d67aabdSBjoern A. Zeeb 
2586*6d67aabdSBjoern A. Zeeb _error:
2587*6d67aabdSBjoern A. Zeeb 	if (!is_fail)
2588*6d67aabdSBjoern A. Zeeb 		dpk->bp[path][kidx].path_ok = 1;
2589*6d67aabdSBjoern A. Zeeb 	else
2590*6d67aabdSBjoern A. Zeeb 		dpk->bp[path][kidx].path_ok = 0;
2591*6d67aabdSBjoern A. Zeeb 
2592*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx,
2593*6d67aabdSBjoern A. Zeeb 		    is_fail ? "Check" : "Success");
2594*6d67aabdSBjoern A. Zeeb 
2595*6d67aabdSBjoern A. Zeeb 	_dpk_onoff(rtwdev, path, is_fail);
2596*6d67aabdSBjoern A. Zeeb 
2597*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx,
2598*6d67aabdSBjoern A. Zeeb 		    is_fail ? "Check" : "Success");
2599*6d67aabdSBjoern A. Zeeb 
2600*6d67aabdSBjoern A. Zeeb 	return is_fail;
2601*6d67aabdSBjoern A. Zeeb }
2602*6d67aabdSBjoern A. Zeeb 
2603*6d67aabdSBjoern A. Zeeb static void _dpk_cal_select(struct rtw89_dev *rtwdev,
2604*6d67aabdSBjoern A. Zeeb 			    enum rtw89_phy_idx phy, u8 kpath)
2605*6d67aabdSBjoern A. Zeeb {
2606*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2607*6d67aabdSBjoern A. Zeeb 	u32 backup_kip_val[BACKUP_KIP_REGS_NR];
2608*6d67aabdSBjoern A. Zeeb 	u32 backup_bb_val[BACKUP_BB_REGS_NR];
2609*6d67aabdSBjoern A. Zeeb 	u32 backup_rf_val[RTW8852BT_SS][BACKUP_RF_REGS_NR];
2610*6d67aabdSBjoern A. Zeeb 	bool reloaded[2] = {false};
2611*6d67aabdSBjoern A. Zeeb 	u8 path;
2612*6d67aabdSBjoern A. Zeeb 
2613*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) {
2614*6d67aabdSBjoern A. Zeeb 		reloaded[path] = _dpk_reload_check(rtwdev, phy, path);
2615*6d67aabdSBjoern A. Zeeb 		if (!reloaded[path] && dpk->bp[path][0].ch != 0)
2616*6d67aabdSBjoern A. Zeeb 			dpk->cur_idx[path] = !dpk->cur_idx[path];
2617*6d67aabdSBjoern A. Zeeb 		else
2618*6d67aabdSBjoern A. Zeeb 			_dpk_onoff(rtwdev, path, false);
2619*6d67aabdSBjoern A. Zeeb 	}
2620*6d67aabdSBjoern A. Zeeb 
2621*6d67aabdSBjoern A. Zeeb 	_rfk_backup_bb_reg(rtwdev, backup_bb_val);
2622*6d67aabdSBjoern A. Zeeb 	_rfk_backup_kip_reg(rtwdev, backup_kip_val);
2623*6d67aabdSBjoern A. Zeeb 
2624*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) {
2625*6d67aabdSBjoern A. Zeeb 		_rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path);
2626*6d67aabdSBjoern A. Zeeb 		_dpk_information(rtwdev, phy, path);
2627*6d67aabdSBjoern A. Zeeb 		if (rtwdev->is_tssi_mode[path])
2628*6d67aabdSBjoern A. Zeeb 			_dpk_tssi_pause(rtwdev, path, true);
2629*6d67aabdSBjoern A. Zeeb 	}
2630*6d67aabdSBjoern A. Zeeb 
2631*6d67aabdSBjoern A. Zeeb 	_rfk_bb_afe_setting(rtwdev, phy, path, kpath);
2632*6d67aabdSBjoern A. Zeeb 
2633*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++)
2634*6d67aabdSBjoern A. Zeeb 		_dpk_main(rtwdev, phy, path, 1);
2635*6d67aabdSBjoern A. Zeeb 
2636*6d67aabdSBjoern A. Zeeb 	_rfk_bb_afe_restore(rtwdev, phy, path, kpath);
2637*6d67aabdSBjoern A. Zeeb 
2638*6d67aabdSBjoern A. Zeeb 	_dpk_kip_restore(rtwdev, path);
2639*6d67aabdSBjoern A. Zeeb 	_rfk_reload_bb_reg(rtwdev, backup_bb_val);
2640*6d67aabdSBjoern A. Zeeb 	_rfk_reload_kip_reg(rtwdev, backup_kip_val);
2641*6d67aabdSBjoern A. Zeeb 
2642*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) {
2643*6d67aabdSBjoern A. Zeeb 		_rfk_reload_rf_reg(rtwdev, backup_rf_val[path], path);
2644*6d67aabdSBjoern A. Zeeb 		if (rtwdev->is_tssi_mode[path])
2645*6d67aabdSBjoern A. Zeeb 			_dpk_tssi_pause(rtwdev, path, false);
2646*6d67aabdSBjoern A. Zeeb 	}
2647*6d67aabdSBjoern A. Zeeb }
2648*6d67aabdSBjoern A. Zeeb 
2649*6d67aabdSBjoern A. Zeeb static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
2650*6d67aabdSBjoern A. Zeeb {
2651*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
2652*6d67aabdSBjoern A. Zeeb 	struct rtw89_fem_info *fem = &rtwdev->fem;
2653*6d67aabdSBjoern A. Zeeb 
2654*6d67aabdSBjoern A. Zeeb 	if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) {
2655*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
2656*6d67aabdSBjoern A. Zeeb 			    "[DPK] Skip DPK due to 2G_ext_PA exist!!\n");
2657*6d67aabdSBjoern A. Zeeb 		return true;
2658*6d67aabdSBjoern A. Zeeb 	} else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) {
2659*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
2660*6d67aabdSBjoern A. Zeeb 			    "[DPK] Skip DPK due to 5G_ext_PA exist!!\n");
2661*6d67aabdSBjoern A. Zeeb 		return true;
2662*6d67aabdSBjoern A. Zeeb 	} else if (fem->epa_6g && chan->band_type == RTW89_BAND_6G) {
2663*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
2664*6d67aabdSBjoern A. Zeeb 			    "[DPK] Skip DPK due to 6G_ext_PA exist!!\n");
2665*6d67aabdSBjoern A. Zeeb 		return true;
2666*6d67aabdSBjoern A. Zeeb 	}
2667*6d67aabdSBjoern A. Zeeb 
2668*6d67aabdSBjoern A. Zeeb 	return false;
2669*6d67aabdSBjoern A. Zeeb }
2670*6d67aabdSBjoern A. Zeeb 
2671*6d67aabdSBjoern A. Zeeb static void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
2672*6d67aabdSBjoern A. Zeeb {
2673*6d67aabdSBjoern A. Zeeb 	u8 path, kpath;
2674*6d67aabdSBjoern A. Zeeb 
2675*6d67aabdSBjoern A. Zeeb 	kpath = _kpath(rtwdev, phy);
2676*6d67aabdSBjoern A. Zeeb 
2677*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < RTW8852BT_SS; path++) {
2678*6d67aabdSBjoern A. Zeeb 		if (kpath & BIT(path))
2679*6d67aabdSBjoern A. Zeeb 			_dpk_onoff(rtwdev, path, true);
2680*6d67aabdSBjoern A. Zeeb 	}
2681*6d67aabdSBjoern A. Zeeb }
2682*6d67aabdSBjoern A. Zeeb 
2683*6d67aabdSBjoern A. Zeeb static void _dpk_track(struct rtw89_dev *rtwdev)
2684*6d67aabdSBjoern A. Zeeb {
2685*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2686*6d67aabdSBjoern A. Zeeb 	s8 txagc_bb, txagc_bb_tp, ini_diff = 0, txagc_ofst;
2687*6d67aabdSBjoern A. Zeeb 	s8 delta_ther[2] = {};
2688*6d67aabdSBjoern A. Zeeb 	u8 trk_idx, txagc_rf;
2689*6d67aabdSBjoern A. Zeeb 	u8 path, kidx;
2690*6d67aabdSBjoern A. Zeeb 	u16 pwsf[2];
2691*6d67aabdSBjoern A. Zeeb 	u8 cur_ther;
2692*6d67aabdSBjoern A. Zeeb 	u32 tmp;
2693*6d67aabdSBjoern A. Zeeb 
2694*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < RF_PATH_NUM_8852BT; path++) {
2695*6d67aabdSBjoern A. Zeeb 		kidx = dpk->cur_idx[path];
2696*6d67aabdSBjoern A. Zeeb 
2697*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
2698*6d67aabdSBjoern A. Zeeb 			    "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n",
2699*6d67aabdSBjoern A. Zeeb 			    path, kidx, dpk->bp[path][kidx].ch);
2700*6d67aabdSBjoern A. Zeeb 
2701*6d67aabdSBjoern A. Zeeb 		cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]);
2702*6d67aabdSBjoern A. Zeeb 
2703*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
2704*6d67aabdSBjoern A. Zeeb 			    "[DPK_TRK] thermal now = %d\n", cur_ther);
2705*6d67aabdSBjoern A. Zeeb 
2706*6d67aabdSBjoern A. Zeeb 		if (dpk->bp[path][kidx].ch && cur_ther)
2707*6d67aabdSBjoern A. Zeeb 			delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther;
2708*6d67aabdSBjoern A. Zeeb 
2709*6d67aabdSBjoern A. Zeeb 		if (dpk->bp[path][kidx].band == RTW89_BAND_2G)
2710*6d67aabdSBjoern A. Zeeb 			delta_ther[path] = delta_ther[path] * 3 / 2;
2711*6d67aabdSBjoern A. Zeeb 		else
2712*6d67aabdSBjoern A. Zeeb 			delta_ther[path] = delta_ther[path] * 5 / 2;
2713*6d67aabdSBjoern A. Zeeb 
2714*6d67aabdSBjoern A. Zeeb 		txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
2715*6d67aabdSBjoern A. Zeeb 						 B_TXAGC_RF);
2716*6d67aabdSBjoern A. Zeeb 
2717*6d67aabdSBjoern A. Zeeb 		if (rtwdev->is_tssi_mode[path]) {
2718*6d67aabdSBjoern A. Zeeb 			trk_idx = rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK);
2719*6d67aabdSBjoern A. Zeeb 
2720*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
2721*6d67aabdSBjoern A. Zeeb 				    "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n",
2722*6d67aabdSBjoern A. Zeeb 				    txagc_rf, trk_idx);
2723*6d67aabdSBjoern A. Zeeb 
2724*6d67aabdSBjoern A. Zeeb 			txagc_bb =
2725*6d67aabdSBjoern A. Zeeb 				rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
2726*6d67aabdSBjoern A. Zeeb 						      MASKBYTE2);
2727*6d67aabdSBjoern A. Zeeb 			txagc_bb_tp =
2728*6d67aabdSBjoern A. Zeeb 				rtw89_phy_read32_mask(rtwdev, R_TXAGC_TP + (path << 13),
2729*6d67aabdSBjoern A. Zeeb 						      B_TXAGC_TP);
2730*6d67aabdSBjoern A. Zeeb 
2731*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
2732*6d67aabdSBjoern A. Zeeb 				    "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n",
2733*6d67aabdSBjoern A. Zeeb 				    txagc_bb_tp, txagc_bb);
2734*6d67aabdSBjoern A. Zeeb 
2735*6d67aabdSBjoern A. Zeeb 			txagc_ofst =
2736*6d67aabdSBjoern A. Zeeb 				rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),
2737*6d67aabdSBjoern A. Zeeb 						      MASKBYTE3);
2738*6d67aabdSBjoern A. Zeeb 
2739*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
2740*6d67aabdSBjoern A. Zeeb 				    "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n",
2741*6d67aabdSBjoern A. Zeeb 				    txagc_ofst, delta_ther[path]);
2742*6d67aabdSBjoern A. Zeeb 			tmp = rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8),
2743*6d67aabdSBjoern A. Zeeb 						    B_DPD_COM_OF);
2744*6d67aabdSBjoern A. Zeeb 			if (tmp == 0x1) {
2745*6d67aabdSBjoern A. Zeeb 				txagc_ofst = 0;
2746*6d67aabdSBjoern A. Zeeb 				rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
2747*6d67aabdSBjoern A. Zeeb 					    "[DPK_TRK] HW txagc offset mode\n");
2748*6d67aabdSBjoern A. Zeeb 			}
2749*6d67aabdSBjoern A. Zeeb 
2750*6d67aabdSBjoern A. Zeeb 			if (txagc_rf && cur_ther)
2751*6d67aabdSBjoern A. Zeeb 				ini_diff = txagc_ofst + (delta_ther[path]);
2752*6d67aabdSBjoern A. Zeeb 
2753*6d67aabdSBjoern A. Zeeb 			tmp = rtw89_phy_read32_mask(rtwdev,
2754*6d67aabdSBjoern A. Zeeb 						    R_P0_TXDPD + (path << 13),
2755*6d67aabdSBjoern A. Zeeb 						    B_P0_TXDPD);
2756*6d67aabdSBjoern A. Zeeb 			if (tmp == 0x0) {
2757*6d67aabdSBjoern A. Zeeb 				pwsf[0] = dpk->bp[path][kidx].pwsf +
2758*6d67aabdSBjoern A. Zeeb 					  txagc_bb_tp - txagc_bb + ini_diff;
2759*6d67aabdSBjoern A. Zeeb 				pwsf[1] = dpk->bp[path][kidx].pwsf +
2760*6d67aabdSBjoern A. Zeeb 					  txagc_bb_tp - txagc_bb + ini_diff;
2761*6d67aabdSBjoern A. Zeeb 			} else {
2762*6d67aabdSBjoern A. Zeeb 				pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff;
2763*6d67aabdSBjoern A. Zeeb 				pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff;
2764*6d67aabdSBjoern A. Zeeb 			}
2765*6d67aabdSBjoern A. Zeeb 		} else {
2766*6d67aabdSBjoern A. Zeeb 			pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
2767*6d67aabdSBjoern A. Zeeb 			pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff;
2768*6d67aabdSBjoern A. Zeeb 		}
2769*6d67aabdSBjoern A. Zeeb 
2770*6d67aabdSBjoern A. Zeeb 		tmp = rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS);
2771*6d67aabdSBjoern A. Zeeb 		if (!tmp && txagc_rf) {
2772*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,
2773*6d67aabdSBjoern A. Zeeb 				    "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n",
2774*6d67aabdSBjoern A. Zeeb 				    pwsf[0], pwsf[1]);
2775*6d67aabdSBjoern A. Zeeb 
2776*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev,
2777*6d67aabdSBjoern A. Zeeb 					       R_DPD_BND + (path << 8) + (kidx << 2),
2778*6d67aabdSBjoern A. Zeeb 					       B_DPD_BND_0, pwsf[0]);
2779*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev,
2780*6d67aabdSBjoern A. Zeeb 					       R_DPD_BND + (path << 8) + (kidx << 2),
2781*6d67aabdSBjoern A. Zeeb 					       B_DPD_BND_1, pwsf[1]);
2782*6d67aabdSBjoern A. Zeeb 		}
2783*6d67aabdSBjoern A. Zeeb 	}
2784*6d67aabdSBjoern A. Zeeb }
2785*6d67aabdSBjoern A. Zeeb 
2786*6d67aabdSBjoern A. Zeeb static void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
2787*6d67aabdSBjoern A. Zeeb {
2788*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
2789*6d67aabdSBjoern A. Zeeb 	u8 tx_scale, ofdm_bkof, path, kpath;
2790*6d67aabdSBjoern A. Zeeb 
2791*6d67aabdSBjoern A. Zeeb 	kpath = _kpath(rtwdev, phy);
2792*6d67aabdSBjoern A. Zeeb 
2793*6d67aabdSBjoern A. Zeeb 	ofdm_bkof = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_OFDM);
2794*6d67aabdSBjoern A. Zeeb 	tx_scale = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_SCA);
2795*6d67aabdSBjoern A. Zeeb 
2796*6d67aabdSBjoern A. Zeeb 	if (ofdm_bkof + tx_scale >= 44) {
2797*6d67aabdSBjoern A. Zeeb 		/* move dpd backoff to bb, and set dpd backoff to 0 */
2798*6d67aabdSBjoern A. Zeeb 		dpk->dpk_gs[phy] = 0x7f;
2799*6d67aabdSBjoern A. Zeeb 		for (path = 0; path < RF_PATH_NUM_8852BT; path++) {
2800*6d67aabdSBjoern A. Zeeb 			if (!(kpath & BIT(path)))
2801*6d67aabdSBjoern A. Zeeb 				continue;
2802*6d67aabdSBjoern A. Zeeb 
2803*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8),
2804*6d67aabdSBjoern A. Zeeb 					       B_DPD_CFG, 0x7f7f7f);
2805*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK,
2806*6d67aabdSBjoern A. Zeeb 				    "[RFK] Set S%d DPD backoff to 0dB\n", path);
2807*6d67aabdSBjoern A. Zeeb 		}
2808*6d67aabdSBjoern A. Zeeb 	} else {
2809*6d67aabdSBjoern A. Zeeb 		dpk->dpk_gs[phy] = 0x5b;
2810*6d67aabdSBjoern A. Zeeb 	}
2811*6d67aabdSBjoern A. Zeeb }
2812*6d67aabdSBjoern A. Zeeb 
2813*6d67aabdSBjoern A. Zeeb static void _tssi_dpk_off(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
2814*6d67aabdSBjoern A. Zeeb {
2815*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A, BIT(24), 0x0);
2816*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_DPD_CH0B, BIT(24), 0x0);
2817*6d67aabdSBjoern A. Zeeb }
2818*6d67aabdSBjoern A. Zeeb 
2819*6d67aabdSBjoern A. Zeeb static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2820*6d67aabdSBjoern A. Zeeb 			     enum rtw89_rf_path path)
2821*6d67aabdSBjoern A. Zeeb {
2822*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
2823*6d67aabdSBjoern A. Zeeb 	enum rtw89_band band = chan->band_type;
2824*6d67aabdSBjoern A. Zeeb 
2825*6d67aabdSBjoern A. Zeeb 	if (band == RTW89_BAND_2G)
2826*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1);
2827*6d67aabdSBjoern A. Zeeb 	else
2828*6d67aabdSBjoern A. Zeeb 		rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1);
2829*6d67aabdSBjoern A. Zeeb }
2830*6d67aabdSBjoern A. Zeeb 
2831*6d67aabdSBjoern A. Zeeb static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2832*6d67aabdSBjoern A. Zeeb 			  enum rtw89_rf_path path)
2833*6d67aabdSBjoern A. Zeeb {
2834*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
2835*6d67aabdSBjoern A. Zeeb 	enum rtw89_band band = chan->band_type;
2836*6d67aabdSBjoern A. Zeeb 
2837*6d67aabdSBjoern A. Zeeb 	rtw89_rfk_parser(rtwdev, &rtw8852bt_tssi_sys_defs_tbl);
2838*6d67aabdSBjoern A. Zeeb 
2839*6d67aabdSBjoern A. Zeeb 	if (chan->band_width == RTW89_CHANNEL_WIDTH_80)
2840*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_BW80, 0x1);
2841*6d67aabdSBjoern A. Zeeb 	else
2842*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_BW80, 0x0);
2843*6d67aabdSBjoern A. Zeeb 
2844*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A)
2845*6d67aabdSBjoern A. Zeeb 		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
2846*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_sys_a_defs_2g_tbl,
2847*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_sys_a_defs_5g_tbl);
2848*6d67aabdSBjoern A. Zeeb 	else
2849*6d67aabdSBjoern A. Zeeb 		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
2850*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_sys_b_defs_2g_tbl,
2851*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_sys_b_defs_5g_tbl);
2852*6d67aabdSBjoern A. Zeeb }
2853*6d67aabdSBjoern A. Zeeb 
2854*6d67aabdSBjoern A. Zeeb static void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev,
2855*6d67aabdSBjoern A. Zeeb 				    enum rtw89_phy_idx phy,
2856*6d67aabdSBjoern A. Zeeb 				    enum rtw89_rf_path path)
2857*6d67aabdSBjoern A. Zeeb {
2858*6d67aabdSBjoern A. Zeeb 	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
2859*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_init_txpwr_defs_a_tbl,
2860*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_init_txpwr_defs_b_tbl);
2861*6d67aabdSBjoern A. Zeeb }
2862*6d67aabdSBjoern A. Zeeb 
2863*6d67aabdSBjoern A. Zeeb static void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev,
2864*6d67aabdSBjoern A. Zeeb 					  enum rtw89_phy_idx phy,
2865*6d67aabdSBjoern A. Zeeb 					  enum rtw89_rf_path path)
2866*6d67aabdSBjoern A. Zeeb {
2867*6d67aabdSBjoern A. Zeeb 	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
2868*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_init_txpwr_he_tb_defs_a_tbl,
2869*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_init_txpwr_he_tb_defs_b_tbl);
2870*6d67aabdSBjoern A. Zeeb }
2871*6d67aabdSBjoern A. Zeeb 
2872*6d67aabdSBjoern A. Zeeb static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2873*6d67aabdSBjoern A. Zeeb 			  enum rtw89_rf_path path)
2874*6d67aabdSBjoern A. Zeeb {
2875*6d67aabdSBjoern A. Zeeb 	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
2876*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_dck_defs_a_tbl,
2877*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_dck_defs_b_tbl);
2878*6d67aabdSBjoern A. Zeeb }
2879*6d67aabdSBjoern A. Zeeb 
2880*6d67aabdSBjoern A. Zeeb static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
2881*6d67aabdSBjoern A. Zeeb 				 enum rtw89_rf_path path)
2882*6d67aabdSBjoern A. Zeeb {
2883*6d67aabdSBjoern A. Zeeb #define RTW8852BT_TSSI_GET_VAL(ptr, idx)			\
2884*6d67aabdSBjoern A. Zeeb ({							\
2885*6d67aabdSBjoern A. Zeeb 	s8 *__ptr = (ptr);				\
2886*6d67aabdSBjoern A. Zeeb 	u8 __idx = (idx), __i, __v;			\
2887*6d67aabdSBjoern A. Zeeb 	u32 __val = 0;					\
2888*6d67aabdSBjoern A. Zeeb 	for (__i = 0; __i < 4; __i++) {			\
2889*6d67aabdSBjoern A. Zeeb 		__v = (__ptr[__idx + __i]);		\
2890*6d67aabdSBjoern A. Zeeb 		__val |= (__v << (8 * __i));		\
2891*6d67aabdSBjoern A. Zeeb 	}						\
2892*6d67aabdSBjoern A. Zeeb 	__val;						\
2893*6d67aabdSBjoern A. Zeeb })
2894*6d67aabdSBjoern A. Zeeb 	struct rtw89_fw_txpwr_track_cfg *trk = rtwdev->fw.elm_info.txpwr_trk;
2895*6d67aabdSBjoern A. Zeeb 	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
2896*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
2897*6d67aabdSBjoern A. Zeeb 	u8 ch = chan->channel;
2898*6d67aabdSBjoern A. Zeeb 	u8 subband = chan->subband_type;
2899*6d67aabdSBjoern A. Zeeb 	const s8 *thm_up_a = NULL;
2900*6d67aabdSBjoern A. Zeeb 	const s8 *thm_down_a = NULL;
2901*6d67aabdSBjoern A. Zeeb 	const s8 *thm_up_b = NULL;
2902*6d67aabdSBjoern A. Zeeb 	const s8 *thm_down_b = NULL;
2903*6d67aabdSBjoern A. Zeeb 	u8 thermal = 0xff;
2904*6d67aabdSBjoern A. Zeeb 	s8 thm_ofst[64] = {0};
2905*6d67aabdSBjoern A. Zeeb 	u32 tmp = 0;
2906*6d67aabdSBjoern A. Zeeb 	u8 i, j;
2907*6d67aabdSBjoern A. Zeeb 
2908*6d67aabdSBjoern A. Zeeb 	switch (subband) {
2909*6d67aabdSBjoern A. Zeeb 	default:
2910*6d67aabdSBjoern A. Zeeb 	case RTW89_CH_2G:
2911*6d67aabdSBjoern A. Zeeb 		thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_P][0];
2912*6d67aabdSBjoern A. Zeeb 		thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_N][0];
2913*6d67aabdSBjoern A. Zeeb 		thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_P][0];
2914*6d67aabdSBjoern A. Zeeb 		thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_N][0];
2915*6d67aabdSBjoern A. Zeeb 		break;
2916*6d67aabdSBjoern A. Zeeb 	case RTW89_CH_5G_BAND_1:
2917*6d67aabdSBjoern A. Zeeb 		thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][0];
2918*6d67aabdSBjoern A. Zeeb 		thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][0];
2919*6d67aabdSBjoern A. Zeeb 		thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][0];
2920*6d67aabdSBjoern A. Zeeb 		thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][0];
2921*6d67aabdSBjoern A. Zeeb 		break;
2922*6d67aabdSBjoern A. Zeeb 	case RTW89_CH_5G_BAND_3:
2923*6d67aabdSBjoern A. Zeeb 		thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][1];
2924*6d67aabdSBjoern A. Zeeb 		thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][1];
2925*6d67aabdSBjoern A. Zeeb 		thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][1];
2926*6d67aabdSBjoern A. Zeeb 		thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][1];
2927*6d67aabdSBjoern A. Zeeb 		break;
2928*6d67aabdSBjoern A. Zeeb 	case RTW89_CH_5G_BAND_4:
2929*6d67aabdSBjoern A. Zeeb 		thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][2];
2930*6d67aabdSBjoern A. Zeeb 		thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][2];
2931*6d67aabdSBjoern A. Zeeb 		thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][2];
2932*6d67aabdSBjoern A. Zeeb 		thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][2];
2933*6d67aabdSBjoern A. Zeeb 		break;
2934*6d67aabdSBjoern A. Zeeb 	}
2935*6d67aabdSBjoern A. Zeeb 
2936*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A) {
2937*6d67aabdSBjoern A. Zeeb 		thermal = tssi_info->thermal[RF_PATH_A];
2938*6d67aabdSBjoern A. Zeeb 
2939*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
2940*6d67aabdSBjoern A. Zeeb 			    "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal);
2941*6d67aabdSBjoern A. Zeeb 
2942*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0);
2943*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1);
2944*6d67aabdSBjoern A. Zeeb 
2945*6d67aabdSBjoern A. Zeeb 		if (thermal == 0xff) {
2946*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32);
2947*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32);
2948*6d67aabdSBjoern A. Zeeb 
2949*6d67aabdSBjoern A. Zeeb 			for (i = 0; i < 64; i += 4) {
2950*6d67aabdSBjoern A. Zeeb 				rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0);
2951*6d67aabdSBjoern A. Zeeb 
2952*6d67aabdSBjoern A. Zeeb 				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
2953*6d67aabdSBjoern A. Zeeb 					    "[TSSI] write 0x%x val=0x%08x\n",
2954*6d67aabdSBjoern A. Zeeb 					    R_P0_TSSI_BASE + i, 0x0);
2955*6d67aabdSBjoern A. Zeeb 			}
2956*6d67aabdSBjoern A. Zeeb 
2957*6d67aabdSBjoern A. Zeeb 		} else {
2958*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER,
2959*6d67aabdSBjoern A. Zeeb 					       thermal);
2960*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL,
2961*6d67aabdSBjoern A. Zeeb 					       thermal);
2962*6d67aabdSBjoern A. Zeeb 
2963*6d67aabdSBjoern A. Zeeb 			i = 0;
2964*6d67aabdSBjoern A. Zeeb 			for (j = 0; j < 32; j++)
2965*6d67aabdSBjoern A. Zeeb 				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
2966*6d67aabdSBjoern A. Zeeb 					      -thm_down_a[i++] :
2967*6d67aabdSBjoern A. Zeeb 					      -thm_down_a[DELTA_SWINGIDX_SIZE - 1];
2968*6d67aabdSBjoern A. Zeeb 
2969*6d67aabdSBjoern A. Zeeb 			i = 1;
2970*6d67aabdSBjoern A. Zeeb 			for (j = 63; j >= 32; j--)
2971*6d67aabdSBjoern A. Zeeb 				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
2972*6d67aabdSBjoern A. Zeeb 					      thm_up_a[i++] :
2973*6d67aabdSBjoern A. Zeeb 					      thm_up_a[DELTA_SWINGIDX_SIZE - 1];
2974*6d67aabdSBjoern A. Zeeb 
2975*6d67aabdSBjoern A. Zeeb 			for (i = 0; i < 64; i += 4) {
2976*6d67aabdSBjoern A. Zeeb 				tmp = RTW8852BT_TSSI_GET_VAL(thm_ofst, i);
2977*6d67aabdSBjoern A. Zeeb 				rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp);
2978*6d67aabdSBjoern A. Zeeb 
2979*6d67aabdSBjoern A. Zeeb 				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
2980*6d67aabdSBjoern A. Zeeb 					    "[TSSI] write 0x%x val=0x%08x\n",
2981*6d67aabdSBjoern A. Zeeb 					    0x5c00 + i, tmp);
2982*6d67aabdSBjoern A. Zeeb 			}
2983*6d67aabdSBjoern A. Zeeb 		}
2984*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1);
2985*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0);
2986*6d67aabdSBjoern A. Zeeb 
2987*6d67aabdSBjoern A. Zeeb 	} else {
2988*6d67aabdSBjoern A. Zeeb 		thermal = tssi_info->thermal[RF_PATH_B];
2989*6d67aabdSBjoern A. Zeeb 
2990*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
2991*6d67aabdSBjoern A. Zeeb 			    "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal);
2992*6d67aabdSBjoern A. Zeeb 
2993*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0);
2994*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1);
2995*6d67aabdSBjoern A. Zeeb 
2996*6d67aabdSBjoern A. Zeeb 		if (thermal == 0xff) {
2997*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32);
2998*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32);
2999*6d67aabdSBjoern A. Zeeb 
3000*6d67aabdSBjoern A. Zeeb 			for (i = 0; i < 64; i += 4) {
3001*6d67aabdSBjoern A. Zeeb 				rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0);
3002*6d67aabdSBjoern A. Zeeb 
3003*6d67aabdSBjoern A. Zeeb 				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3004*6d67aabdSBjoern A. Zeeb 					    "[TSSI] write 0x%x val=0x%08x\n",
3005*6d67aabdSBjoern A. Zeeb 					    0x7c00 + i, 0x0);
3006*6d67aabdSBjoern A. Zeeb 			}
3007*6d67aabdSBjoern A. Zeeb 
3008*6d67aabdSBjoern A. Zeeb 		} else {
3009*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER,
3010*6d67aabdSBjoern A. Zeeb 					       thermal);
3011*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL,
3012*6d67aabdSBjoern A. Zeeb 					       thermal);
3013*6d67aabdSBjoern A. Zeeb 
3014*6d67aabdSBjoern A. Zeeb 			i = 0;
3015*6d67aabdSBjoern A. Zeeb 			for (j = 0; j < 32; j++)
3016*6d67aabdSBjoern A. Zeeb 				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
3017*6d67aabdSBjoern A. Zeeb 					      -thm_down_b[i++] :
3018*6d67aabdSBjoern A. Zeeb 					      -thm_down_b[DELTA_SWINGIDX_SIZE - 1];
3019*6d67aabdSBjoern A. Zeeb 
3020*6d67aabdSBjoern A. Zeeb 			i = 1;
3021*6d67aabdSBjoern A. Zeeb 			for (j = 63; j >= 32; j--)
3022*6d67aabdSBjoern A. Zeeb 				thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?
3023*6d67aabdSBjoern A. Zeeb 					      thm_up_b[i++] :
3024*6d67aabdSBjoern A. Zeeb 					      thm_up_b[DELTA_SWINGIDX_SIZE - 1];
3025*6d67aabdSBjoern A. Zeeb 
3026*6d67aabdSBjoern A. Zeeb 			for (i = 0; i < 64; i += 4) {
3027*6d67aabdSBjoern A. Zeeb 				tmp = RTW8852BT_TSSI_GET_VAL(thm_ofst, i);
3028*6d67aabdSBjoern A. Zeeb 				rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp);
3029*6d67aabdSBjoern A. Zeeb 
3030*6d67aabdSBjoern A. Zeeb 				rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3031*6d67aabdSBjoern A. Zeeb 					    "[TSSI] write 0x%x val=0x%08x\n",
3032*6d67aabdSBjoern A. Zeeb 					    0x7c00 + i, tmp);
3033*6d67aabdSBjoern A. Zeeb 			}
3034*6d67aabdSBjoern A. Zeeb 		}
3035*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1);
3036*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0);
3037*6d67aabdSBjoern A. Zeeb 	}
3038*6d67aabdSBjoern A. Zeeb #undef RTW8852BT_TSSI_GET_VAL
3039*6d67aabdSBjoern A. Zeeb }
3040*6d67aabdSBjoern A. Zeeb 
3041*6d67aabdSBjoern A. Zeeb static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3042*6d67aabdSBjoern A. Zeeb 				   enum rtw89_rf_path path)
3043*6d67aabdSBjoern A. Zeeb {
3044*6d67aabdSBjoern A. Zeeb 	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
3045*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_dac_gain_defs_a_tbl,
3046*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_dac_gain_defs_b_tbl);
3047*6d67aabdSBjoern A. Zeeb }
3048*6d67aabdSBjoern A. Zeeb 
3049*6d67aabdSBjoern A. Zeeb static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3050*6d67aabdSBjoern A. Zeeb 				enum rtw89_rf_path path)
3051*6d67aabdSBjoern A. Zeeb {
3052*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3053*6d67aabdSBjoern A. Zeeb 	enum rtw89_band band = chan->band_type;
3054*6d67aabdSBjoern A. Zeeb 
3055*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A)
3056*6d67aabdSBjoern A. Zeeb 		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
3057*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_slope_a_defs_2g_tbl,
3058*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_slope_a_defs_5g_tbl);
3059*6d67aabdSBjoern A. Zeeb 	else
3060*6d67aabdSBjoern A. Zeeb 		rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,
3061*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_slope_b_defs_2g_tbl,
3062*6d67aabdSBjoern A. Zeeb 					 &rtw8852bt_tssi_slope_b_defs_5g_tbl);
3063*6d67aabdSBjoern A. Zeeb }
3064*6d67aabdSBjoern A. Zeeb 
3065*6d67aabdSBjoern A. Zeeb static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3066*6d67aabdSBjoern A. Zeeb 				    enum rtw89_rf_path path, bool all)
3067*6d67aabdSBjoern A. Zeeb {
3068*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3069*6d67aabdSBjoern A. Zeeb 	enum rtw89_band band = chan->band_type;
3070*6d67aabdSBjoern A. Zeeb 	const struct rtw89_rfk_tbl *tbl = NULL;
3071*6d67aabdSBjoern A. Zeeb 	u8 ch = chan->channel;
3072*6d67aabdSBjoern A. Zeeb 
3073*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A) {
3074*6d67aabdSBjoern A. Zeeb 		if (band == RTW89_BAND_2G)
3075*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_a_2g_all_defs_tbl;
3076*6d67aabdSBjoern A. Zeeb 		else if (ch >= 36 && ch <= 64)
3077*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_a_5g1_all_defs_tbl;
3078*6d67aabdSBjoern A. Zeeb 		else if (ch >= 100 && ch <= 144)
3079*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_a_5g2_all_defs_tbl;
3080*6d67aabdSBjoern A. Zeeb 		else if (ch >= 149 && ch <= 177)
3081*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_a_5g3_all_defs_tbl;
3082*6d67aabdSBjoern A. Zeeb 	} else {
3083*6d67aabdSBjoern A. Zeeb 		if (ch >= 1 && ch <= 14)
3084*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_b_2g_all_defs_tbl;
3085*6d67aabdSBjoern A. Zeeb 		else if (ch >= 36 && ch <= 64)
3086*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_b_5g1_all_defs_tbl;
3087*6d67aabdSBjoern A. Zeeb 		else if (ch >= 100 && ch <= 144)
3088*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_b_5g2_all_defs_tbl;
3089*6d67aabdSBjoern A. Zeeb 		else if (ch >= 149 && ch <= 177)
3090*6d67aabdSBjoern A. Zeeb 			tbl = &rtw8852bt_tssi_align_b_5g3_all_defs_tbl;
3091*6d67aabdSBjoern A. Zeeb 	}
3092*6d67aabdSBjoern A. Zeeb 
3093*6d67aabdSBjoern A. Zeeb 	if (tbl)
3094*6d67aabdSBjoern A. Zeeb 		rtw89_rfk_parser(rtwdev, tbl);
3095*6d67aabdSBjoern A. Zeeb }
3096*6d67aabdSBjoern A. Zeeb 
3097*6d67aabdSBjoern A. Zeeb static void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3098*6d67aabdSBjoern A. Zeeb 				 enum rtw89_rf_path path)
3099*6d67aabdSBjoern A. Zeeb {
3100*6d67aabdSBjoern A. Zeeb 	rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A,
3101*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_slope_defs_a_tbl,
3102*6d67aabdSBjoern A. Zeeb 				 &rtw8852bt_tssi_slope_defs_b_tbl);
3103*6d67aabdSBjoern A. Zeeb }
3104*6d67aabdSBjoern A. Zeeb 
3105*6d67aabdSBjoern A. Zeeb static void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3106*6d67aabdSBjoern A. Zeeb 				 enum rtw89_rf_path path)
3107*6d67aabdSBjoern A. Zeeb {
3108*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A)
3109*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSIC, B_P0_TSSIC_BYPASS, 0x0);
3110*6d67aabdSBjoern A. Zeeb 	else
3111*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_TSSIC, B_P1_TSSIC_BYPASS, 0x0);
3112*6d67aabdSBjoern A. Zeeb }
3113*6d67aabdSBjoern A. Zeeb 
3114*6d67aabdSBjoern A. Zeeb static void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev,
3115*6d67aabdSBjoern A. Zeeb 					  enum rtw89_phy_idx phy,
3116*6d67aabdSBjoern A. Zeeb 					  enum rtw89_rf_path path)
3117*6d67aabdSBjoern A. Zeeb {
3118*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "======>%s   path=%d\n", __func__,
3119*6d67aabdSBjoern A. Zeeb 		    path);
3120*6d67aabdSBjoern A. Zeeb 
3121*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A)
3122*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG,
3123*6d67aabdSBjoern A. Zeeb 				       B_P0_TSSI_MV_MIX, 0x010);
3124*6d67aabdSBjoern A. Zeeb 	else
3125*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG,
3126*6d67aabdSBjoern A. Zeeb 				       B_P1_RFCTM_DEL, 0x010);
3127*6d67aabdSBjoern A. Zeeb }
3128*6d67aabdSBjoern A. Zeeb 
3129*6d67aabdSBjoern A. Zeeb static void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
3130*6d67aabdSBjoern A. Zeeb {
3131*6d67aabdSBjoern A. Zeeb 	u8 i;
3132*6d67aabdSBjoern A. Zeeb 
3133*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < RF_PATH_NUM_8852BT; i++) {
3134*6d67aabdSBjoern A. Zeeb 		_tssi_set_tssi_track(rtwdev, phy, i);
3135*6d67aabdSBjoern A. Zeeb 		_tssi_set_txagc_offset_mv_avg(rtwdev, phy, i);
3136*6d67aabdSBjoern A. Zeeb 
3137*6d67aabdSBjoern A. Zeeb 		if (i == RF_PATH_A) {
3138*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG,
3139*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_MV_CLR, 0x0);
3140*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG,
3141*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_EN, 0x0);
3142*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG,
3143*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_EN, 0x1);
3144*6d67aabdSBjoern A. Zeeb 			rtw89_write_rf(rtwdev, i, RR_TXGA_V1,
3145*6d67aabdSBjoern A. Zeeb 				       RR_TXGA_V1_TRK_EN, 0x1);
3146*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
3147*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_RFC, 0x3);
3148*6d67aabdSBjoern A. Zeeb 
3149*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
3150*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_OFT, 0xc0);
3151*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
3152*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_OFT_EN, 0x0);
3153*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK,
3154*6d67aabdSBjoern A. Zeeb 					       B_P0_TSSI_OFT_EN, 0x1);
3155*6d67aabdSBjoern A. Zeeb 
3156*6d67aabdSBjoern A. Zeeb 			rtwdev->is_tssi_mode[RF_PATH_A] = true;
3157*6d67aabdSBjoern A. Zeeb 		} else {
3158*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG,
3159*6d67aabdSBjoern A. Zeeb 					       B_P1_TSSI_MV_CLR, 0x0);
3160*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG,
3161*6d67aabdSBjoern A. Zeeb 					       B_P1_TSSI_EN, 0x0);
3162*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG,
3163*6d67aabdSBjoern A. Zeeb 					       B_P1_TSSI_EN, 0x1);
3164*6d67aabdSBjoern A. Zeeb 			rtw89_write_rf(rtwdev, i, RR_TXGA_V1,
3165*6d67aabdSBjoern A. Zeeb 				       RR_TXGA_V1_TRK_EN, 0x1);
3166*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
3167*6d67aabdSBjoern A. Zeeb 					       B_P1_TSSI_RFC, 0x3);
3168*6d67aabdSBjoern A. Zeeb 
3169*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
3170*6d67aabdSBjoern A. Zeeb 					       B_P1_TSSI_OFT, 0xc0);
3171*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
3172*6d67aabdSBjoern A. Zeeb 					       B_P1_TSSI_OFT_EN, 0x0);
3173*6d67aabdSBjoern A. Zeeb 			rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK,
3174*6d67aabdSBjoern A. Zeeb 					       B_P1_TSSI_OFT_EN, 0x1);
3175*6d67aabdSBjoern A. Zeeb 
3176*6d67aabdSBjoern A. Zeeb 			rtwdev->is_tssi_mode[RF_PATH_B] = true;
3177*6d67aabdSBjoern A. Zeeb 		}
3178*6d67aabdSBjoern A. Zeeb 	}
3179*6d67aabdSBjoern A. Zeeb }
3180*6d67aabdSBjoern A. Zeeb 
3181*6d67aabdSBjoern A. Zeeb static void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
3182*6d67aabdSBjoern A. Zeeb {
3183*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0);
3184*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x1);
3185*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1);
3186*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_EN, 0x0);
3187*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_RFC, 0x1);
3188*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_CLR, 0x1);
3189*6d67aabdSBjoern A. Zeeb 
3190*6d67aabdSBjoern A. Zeeb 	rtwdev->is_tssi_mode[RF_PATH_A] = false;
3191*6d67aabdSBjoern A. Zeeb 	rtwdev->is_tssi_mode[RF_PATH_B] = false;
3192*6d67aabdSBjoern A. Zeeb }
3193*6d67aabdSBjoern A. Zeeb 
3194*6d67aabdSBjoern A. Zeeb static u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch)
3195*6d67aabdSBjoern A. Zeeb {
3196*6d67aabdSBjoern A. Zeeb 	switch (ch) {
3197*6d67aabdSBjoern A. Zeeb 	case 1 ... 2:
3198*6d67aabdSBjoern A. Zeeb 		return 0;
3199*6d67aabdSBjoern A. Zeeb 	case 3 ... 5:
3200*6d67aabdSBjoern A. Zeeb 		return 1;
3201*6d67aabdSBjoern A. Zeeb 	case 6 ... 8:
3202*6d67aabdSBjoern A. Zeeb 		return 2;
3203*6d67aabdSBjoern A. Zeeb 	case 9 ... 11:
3204*6d67aabdSBjoern A. Zeeb 		return 3;
3205*6d67aabdSBjoern A. Zeeb 	case 12 ... 13:
3206*6d67aabdSBjoern A. Zeeb 		return 4;
3207*6d67aabdSBjoern A. Zeeb 	case 14:
3208*6d67aabdSBjoern A. Zeeb 		return 5;
3209*6d67aabdSBjoern A. Zeeb 	}
3210*6d67aabdSBjoern A. Zeeb 
3211*6d67aabdSBjoern A. Zeeb 	return 0;
3212*6d67aabdSBjoern A. Zeeb }
3213*6d67aabdSBjoern A. Zeeb 
3214*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GROUP_BIT (BIT(31))
3215*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx))
3216*6d67aabdSBjoern A. Zeeb #define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT)
3217*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT)
3218*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1)
3219*6d67aabdSBjoern A. Zeeb 
3220*6d67aabdSBjoern A. Zeeb static u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch)
3221*6d67aabdSBjoern A. Zeeb {
3222*6d67aabdSBjoern A. Zeeb 	switch (ch) {
3223*6d67aabdSBjoern A. Zeeb 	case 1 ... 2:
3224*6d67aabdSBjoern A. Zeeb 		return 0;
3225*6d67aabdSBjoern A. Zeeb 	case 3 ... 5:
3226*6d67aabdSBjoern A. Zeeb 		return 1;
3227*6d67aabdSBjoern A. Zeeb 	case 6 ... 8:
3228*6d67aabdSBjoern A. Zeeb 		return 2;
3229*6d67aabdSBjoern A. Zeeb 	case 9 ... 11:
3230*6d67aabdSBjoern A. Zeeb 		return 3;
3231*6d67aabdSBjoern A. Zeeb 	case 12 ... 14:
3232*6d67aabdSBjoern A. Zeeb 		return 4;
3233*6d67aabdSBjoern A. Zeeb 	case 36 ... 40:
3234*6d67aabdSBjoern A. Zeeb 		return 5;
3235*6d67aabdSBjoern A. Zeeb 	case 41 ... 43:
3236*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(5);
3237*6d67aabdSBjoern A. Zeeb 	case 44 ... 48:
3238*6d67aabdSBjoern A. Zeeb 		return 6;
3239*6d67aabdSBjoern A. Zeeb 	case 49 ... 51:
3240*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(6);
3241*6d67aabdSBjoern A. Zeeb 	case 52 ... 56:
3242*6d67aabdSBjoern A. Zeeb 		return 7;
3243*6d67aabdSBjoern A. Zeeb 	case 57 ... 59:
3244*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(7);
3245*6d67aabdSBjoern A. Zeeb 	case 60 ... 64:
3246*6d67aabdSBjoern A. Zeeb 		return 8;
3247*6d67aabdSBjoern A. Zeeb 	case 100 ... 104:
3248*6d67aabdSBjoern A. Zeeb 		return 9;
3249*6d67aabdSBjoern A. Zeeb 	case 105 ... 107:
3250*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(9);
3251*6d67aabdSBjoern A. Zeeb 	case 108 ... 112:
3252*6d67aabdSBjoern A. Zeeb 		return 10;
3253*6d67aabdSBjoern A. Zeeb 	case 113 ... 115:
3254*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(10);
3255*6d67aabdSBjoern A. Zeeb 	case 116 ... 120:
3256*6d67aabdSBjoern A. Zeeb 		return 11;
3257*6d67aabdSBjoern A. Zeeb 	case 121 ... 123:
3258*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(11);
3259*6d67aabdSBjoern A. Zeeb 	case 124 ... 128:
3260*6d67aabdSBjoern A. Zeeb 		return 12;
3261*6d67aabdSBjoern A. Zeeb 	case 129 ... 131:
3262*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(12);
3263*6d67aabdSBjoern A. Zeeb 	case 132 ... 136:
3264*6d67aabdSBjoern A. Zeeb 		return 13;
3265*6d67aabdSBjoern A. Zeeb 	case 137 ... 139:
3266*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(13);
3267*6d67aabdSBjoern A. Zeeb 	case 140 ... 144:
3268*6d67aabdSBjoern A. Zeeb 		return 14;
3269*6d67aabdSBjoern A. Zeeb 	case 149 ... 153:
3270*6d67aabdSBjoern A. Zeeb 		return 15;
3271*6d67aabdSBjoern A. Zeeb 	case 154 ... 156:
3272*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(15);
3273*6d67aabdSBjoern A. Zeeb 	case 157 ... 161:
3274*6d67aabdSBjoern A. Zeeb 		return 16;
3275*6d67aabdSBjoern A. Zeeb 	case 162 ... 164:
3276*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(16);
3277*6d67aabdSBjoern A. Zeeb 	case 165 ... 169:
3278*6d67aabdSBjoern A. Zeeb 		return 17;
3279*6d67aabdSBjoern A. Zeeb 	case 170 ... 172:
3280*6d67aabdSBjoern A. Zeeb 		return TSSI_EXTRA_GROUP(17);
3281*6d67aabdSBjoern A. Zeeb 	case 173 ... 177:
3282*6d67aabdSBjoern A. Zeeb 		return 18;
3283*6d67aabdSBjoern A. Zeeb 	}
3284*6d67aabdSBjoern A. Zeeb 
3285*6d67aabdSBjoern A. Zeeb 	return 0;
3286*6d67aabdSBjoern A. Zeeb }
3287*6d67aabdSBjoern A. Zeeb 
3288*6d67aabdSBjoern A. Zeeb static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)
3289*6d67aabdSBjoern A. Zeeb {
3290*6d67aabdSBjoern A. Zeeb 	switch (ch) {
3291*6d67aabdSBjoern A. Zeeb 	case 1 ... 8:
3292*6d67aabdSBjoern A. Zeeb 		return 0;
3293*6d67aabdSBjoern A. Zeeb 	case 9 ... 14:
3294*6d67aabdSBjoern A. Zeeb 		return 1;
3295*6d67aabdSBjoern A. Zeeb 	case 36 ... 48:
3296*6d67aabdSBjoern A. Zeeb 		return 2;
3297*6d67aabdSBjoern A. Zeeb 	case 52 ... 64:
3298*6d67aabdSBjoern A. Zeeb 		return 3;
3299*6d67aabdSBjoern A. Zeeb 	case 100 ... 112:
3300*6d67aabdSBjoern A. Zeeb 		return 4;
3301*6d67aabdSBjoern A. Zeeb 	case 116 ... 128:
3302*6d67aabdSBjoern A. Zeeb 		return 5;
3303*6d67aabdSBjoern A. Zeeb 	case 132 ... 144:
3304*6d67aabdSBjoern A. Zeeb 		return 6;
3305*6d67aabdSBjoern A. Zeeb 	case 149 ... 177:
3306*6d67aabdSBjoern A. Zeeb 		return 7;
3307*6d67aabdSBjoern A. Zeeb 	}
3308*6d67aabdSBjoern A. Zeeb 
3309*6d67aabdSBjoern A. Zeeb 	return 0;
3310*6d67aabdSBjoern A. Zeeb }
3311*6d67aabdSBjoern A. Zeeb 
3312*6d67aabdSBjoern A. Zeeb static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3313*6d67aabdSBjoern A. Zeeb 			    enum rtw89_rf_path path)
3314*6d67aabdSBjoern A. Zeeb {
3315*6d67aabdSBjoern A. Zeeb 	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
3316*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3317*6d67aabdSBjoern A. Zeeb 	u8 ch = chan->channel;
3318*6d67aabdSBjoern A. Zeeb 	u32 gidx, gidx_1st, gidx_2nd;
3319*6d67aabdSBjoern A. Zeeb 	s8 de_1st;
3320*6d67aabdSBjoern A. Zeeb 	s8 de_2nd;
3321*6d67aabdSBjoern A. Zeeb 	s8 val;
3322*6d67aabdSBjoern A. Zeeb 
3323*6d67aabdSBjoern A. Zeeb 	gidx = _tssi_get_ofdm_group(rtwdev, ch);
3324*6d67aabdSBjoern A. Zeeb 
3325*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3326*6d67aabdSBjoern A. Zeeb 		    "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx);
3327*6d67aabdSBjoern A. Zeeb 
3328*6d67aabdSBjoern A. Zeeb 	if (IS_TSSI_EXTRA_GROUP(gidx)) {
3329*6d67aabdSBjoern A. Zeeb 		gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx);
3330*6d67aabdSBjoern A. Zeeb 		gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx);
3331*6d67aabdSBjoern A. Zeeb 		de_1st = tssi_info->tssi_mcs[path][gidx_1st];
3332*6d67aabdSBjoern A. Zeeb 		de_2nd = tssi_info->tssi_mcs[path][gidx_2nd];
3333*6d67aabdSBjoern A. Zeeb 		val = (de_1st + de_2nd) / 2;
3334*6d67aabdSBjoern A. Zeeb 
3335*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3336*6d67aabdSBjoern A. Zeeb 			    "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n",
3337*6d67aabdSBjoern A. Zeeb 			    path, val, de_1st, de_2nd);
3338*6d67aabdSBjoern A. Zeeb 	} else {
3339*6d67aabdSBjoern A. Zeeb 		val = tssi_info->tssi_mcs[path][gidx];
3340*6d67aabdSBjoern A. Zeeb 
3341*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3342*6d67aabdSBjoern A. Zeeb 			    "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val);
3343*6d67aabdSBjoern A. Zeeb 	}
3344*6d67aabdSBjoern A. Zeeb 
3345*6d67aabdSBjoern A. Zeeb 	return val;
3346*6d67aabdSBjoern A. Zeeb }
3347*6d67aabdSBjoern A. Zeeb 
3348*6d67aabdSBjoern A. Zeeb static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3349*6d67aabdSBjoern A. Zeeb 				 enum rtw89_rf_path path)
3350*6d67aabdSBjoern A. Zeeb {
3351*6d67aabdSBjoern A. Zeeb 	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
3352*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3353*6d67aabdSBjoern A. Zeeb 	u8 ch = chan->channel;
3354*6d67aabdSBjoern A. Zeeb 	u32 tgidx, tgidx_1st, tgidx_2nd;
3355*6d67aabdSBjoern A. Zeeb 	s8 tde_1st;
3356*6d67aabdSBjoern A. Zeeb 	s8 tde_2nd;
3357*6d67aabdSBjoern A. Zeeb 	s8 val;
3358*6d67aabdSBjoern A. Zeeb 
3359*6d67aabdSBjoern A. Zeeb 	tgidx = _tssi_get_trim_group(rtwdev, ch);
3360*6d67aabdSBjoern A. Zeeb 
3361*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3362*6d67aabdSBjoern A. Zeeb 		    "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n",
3363*6d67aabdSBjoern A. Zeeb 		    path, tgidx);
3364*6d67aabdSBjoern A. Zeeb 
3365*6d67aabdSBjoern A. Zeeb 	if (IS_TSSI_EXTRA_GROUP(tgidx)) {
3366*6d67aabdSBjoern A. Zeeb 		tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx);
3367*6d67aabdSBjoern A. Zeeb 		tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx);
3368*6d67aabdSBjoern A. Zeeb 		tde_1st = tssi_info->tssi_trim[path][tgidx_1st];
3369*6d67aabdSBjoern A. Zeeb 		tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd];
3370*6d67aabdSBjoern A. Zeeb 		val = (tde_1st + tde_2nd) / 2;
3371*6d67aabdSBjoern A. Zeeb 
3372*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3373*6d67aabdSBjoern A. Zeeb 			    "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n",
3374*6d67aabdSBjoern A. Zeeb 			    path, val, tde_1st, tde_2nd);
3375*6d67aabdSBjoern A. Zeeb 	} else {
3376*6d67aabdSBjoern A. Zeeb 		val = tssi_info->tssi_trim[path][tgidx];
3377*6d67aabdSBjoern A. Zeeb 
3378*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3379*6d67aabdSBjoern A. Zeeb 			    "[TSSI][TRIM]: path=%d mcs trim_de=%d\n",
3380*6d67aabdSBjoern A. Zeeb 			    path, val);
3381*6d67aabdSBjoern A. Zeeb 	}
3382*6d67aabdSBjoern A. Zeeb 
3383*6d67aabdSBjoern A. Zeeb 	return val;
3384*6d67aabdSBjoern A. Zeeb }
3385*6d67aabdSBjoern A. Zeeb 
3386*6d67aabdSBjoern A. Zeeb static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
3387*6d67aabdSBjoern A. Zeeb {
3388*6d67aabdSBjoern A. Zeeb 	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
3389*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3390*6d67aabdSBjoern A. Zeeb 	u8 ch = chan->channel;
3391*6d67aabdSBjoern A. Zeeb 	u8 gidx;
3392*6d67aabdSBjoern A. Zeeb 	s8 ofdm_de;
3393*6d67aabdSBjoern A. Zeeb 	s8 trim_de;
3394*6d67aabdSBjoern A. Zeeb 	s32 val;
3395*6d67aabdSBjoern A. Zeeb 	u32 i;
3396*6d67aabdSBjoern A. Zeeb 
3397*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n",
3398*6d67aabdSBjoern A. Zeeb 		    phy, ch);
3399*6d67aabdSBjoern A. Zeeb 
3400*6d67aabdSBjoern A. Zeeb 	for (i = RF_PATH_A; i < RF_PATH_NUM_8852BT; i++) {
3401*6d67aabdSBjoern A. Zeeb 		gidx = _tssi_get_cck_group(rtwdev, ch);
3402*6d67aabdSBjoern A. Zeeb 		trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
3403*6d67aabdSBjoern A. Zeeb 		val = tssi_info->tssi_cck[i][gidx] + trim_de;
3404*6d67aabdSBjoern A. Zeeb 
3405*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3406*6d67aabdSBjoern A. Zeeb 			    "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n",
3407*6d67aabdSBjoern A. Zeeb 			    i, gidx, tssi_info->tssi_cck[i][gidx], trim_de);
3408*6d67aabdSBjoern A. Zeeb 
3409*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val);
3410*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val);
3411*6d67aabdSBjoern A. Zeeb 
3412*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3413*6d67aabdSBjoern A. Zeeb 			    "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n",
3414*6d67aabdSBjoern A. Zeeb 			    _tssi_de_cck_long[i],
3415*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],
3416*6d67aabdSBjoern A. Zeeb 						  _TSSI_DE_MASK));
3417*6d67aabdSBjoern A. Zeeb 
3418*6d67aabdSBjoern A. Zeeb 		ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i);
3419*6d67aabdSBjoern A. Zeeb 		trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i);
3420*6d67aabdSBjoern A. Zeeb 		val = ofdm_de + trim_de;
3421*6d67aabdSBjoern A. Zeeb 
3422*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3423*6d67aabdSBjoern A. Zeeb 			    "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n",
3424*6d67aabdSBjoern A. Zeeb 			    i, ofdm_de, trim_de);
3425*6d67aabdSBjoern A. Zeeb 
3426*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val);
3427*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val);
3428*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val);
3429*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i],
3430*6d67aabdSBjoern A. Zeeb 				       _TSSI_DE_MASK, val);
3431*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val);
3432*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val);
3433*6d67aabdSBjoern A. Zeeb 
3434*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_TSSI,
3435*6d67aabdSBjoern A. Zeeb 			    "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n",
3436*6d67aabdSBjoern A. Zeeb 			    _tssi_de_mcs_20m[i],
3437*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i],
3438*6d67aabdSBjoern A. Zeeb 						  _TSSI_DE_MASK));
3439*6d67aabdSBjoern A. Zeeb 	}
3440*6d67aabdSBjoern A. Zeeb }
3441*6d67aabdSBjoern A. Zeeb 
3442*6d67aabdSBjoern A. Zeeb static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)
3443*6d67aabdSBjoern A. Zeeb {
3444*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3445*6d67aabdSBjoern A. Zeeb 		    "[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n"
3446*6d67aabdSBjoern A. Zeeb 		    "0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n",
3447*6d67aabdSBjoern A. Zeeb 		    R_TSSI_PA_K1 + (path << 13),
3448*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_TSSI_PA_K1 + (path << 13)),
3449*6d67aabdSBjoern A. Zeeb 		    R_TSSI_PA_K2 + (path << 13),
3450*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_TSSI_PA_K2 + (path << 13)),
3451*6d67aabdSBjoern A. Zeeb 		    R_P0_TSSI_ALIM1 + (path << 13),
3452*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM1 + (path << 13)),
3453*6d67aabdSBjoern A. Zeeb 		    R_P0_TSSI_ALIM3 + (path << 13),
3454*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM3 + (path << 13)),
3455*6d67aabdSBjoern A. Zeeb 		    R_TSSI_PA_K5 + (path << 13),
3456*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_TSSI_PA_K5 + (path << 13)),
3457*6d67aabdSBjoern A. Zeeb 		    R_P0_TSSI_ALIM2 + (path << 13),
3458*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM2 + (path << 13)),
3459*6d67aabdSBjoern A. Zeeb 		    R_P0_TSSI_ALIM4 + (path << 13),
3460*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM4 + (path << 13)),
3461*6d67aabdSBjoern A. Zeeb 		    R_TSSI_PA_K8 + (path << 13),
3462*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32(rtwdev, R_TSSI_PA_K8 + (path << 13)));
3463*6d67aabdSBjoern A. Zeeb }
3464*6d67aabdSBjoern A. Zeeb 
3465*6d67aabdSBjoern A. Zeeb static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,
3466*6d67aabdSBjoern A. Zeeb 				enum rtw89_phy_idx phy, enum rtw89_rf_path path)
3467*6d67aabdSBjoern A. Zeeb {
3468*6d67aabdSBjoern A. Zeeb 	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
3469*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3470*6d67aabdSBjoern A. Zeeb 	u8 channel = chan->channel;
3471*6d67aabdSBjoern A. Zeeb 	u8 band;
3472*6d67aabdSBjoern A. Zeeb 
3473*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3474*6d67aabdSBjoern A. Zeeb 		    "======>%s   phy=%d   path=%d\n", __func__, phy, path);
3475*6d67aabdSBjoern A. Zeeb 
3476*6d67aabdSBjoern A. Zeeb 	if (channel >= 1 && channel <= 14)
3477*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_2G;
3478*6d67aabdSBjoern A. Zeeb 	else if (channel >= 36 && channel <= 64)
3479*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GL;
3480*6d67aabdSBjoern A. Zeeb 	else if (channel >= 100 && channel <= 144)
3481*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GM;
3482*6d67aabdSBjoern A. Zeeb 	else if (channel >= 149 && channel <= 177)
3483*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GH;
3484*6d67aabdSBjoern A. Zeeb 	else
3485*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_2G;
3486*6d67aabdSBjoern A. Zeeb 
3487*6d67aabdSBjoern A. Zeeb 	if (tssi_info->alignment_done[path][band]) {
3488*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD,
3489*6d67aabdSBjoern A. Zeeb 				       tssi_info->alignment_value[path][band][0]);
3490*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD,
3491*6d67aabdSBjoern A. Zeeb 				       tssi_info->alignment_value[path][band][1]);
3492*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD,
3493*6d67aabdSBjoern A. Zeeb 				       tssi_info->alignment_value[path][band][2]);
3494*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD,
3495*6d67aabdSBjoern A. Zeeb 				       tssi_info->alignment_value[path][band][3]);
3496*6d67aabdSBjoern A. Zeeb 	}
3497*6d67aabdSBjoern A. Zeeb 
3498*6d67aabdSBjoern A. Zeeb 	_tssi_alimentk_dump_result(rtwdev, path);
3499*6d67aabdSBjoern A. Zeeb }
3500*6d67aabdSBjoern A. Zeeb 
3501*6d67aabdSBjoern A. Zeeb static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3502*6d67aabdSBjoern A. Zeeb 			enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm,
3503*6d67aabdSBjoern A. Zeeb 			u8 enable)
3504*6d67aabdSBjoern A. Zeeb {
3505*6d67aabdSBjoern A. Zeeb 	enum rtw89_rf_path_bit rx_path;
3506*6d67aabdSBjoern A. Zeeb 
3507*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A)
3508*6d67aabdSBjoern A. Zeeb 		rx_path = RF_A;
3509*6d67aabdSBjoern A. Zeeb 	else if (path == RF_PATH_B)
3510*6d67aabdSBjoern A. Zeeb 		rx_path = RF_B;
3511*6d67aabdSBjoern A. Zeeb 	else if (path == RF_PATH_AB)
3512*6d67aabdSBjoern A. Zeeb 		rx_path = RF_AB;
3513*6d67aabdSBjoern A. Zeeb 	else
3514*6d67aabdSBjoern A. Zeeb 		rx_path = RF_ABCD; /* don't change path, but still set others */
3515*6d67aabdSBjoern A. Zeeb 
3516*6d67aabdSBjoern A. Zeeb 	if (enable) {
3517*6d67aabdSBjoern A. Zeeb 		rtw8852bx_bb_set_plcp_tx(rtwdev);
3518*6d67aabdSBjoern A. Zeeb 		rtw8852bx_bb_cfg_tx_path(rtwdev, path);
3519*6d67aabdSBjoern A. Zeeb 		rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path);
3520*6d67aabdSBjoern A. Zeeb 		rtw8852bx_bb_set_power(rtwdev, pwr_dbm, phy);
3521*6d67aabdSBjoern A. Zeeb 	}
3522*6d67aabdSBjoern A. Zeeb 
3523*6d67aabdSBjoern A. Zeeb 	rtw8852bx_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy);
3524*6d67aabdSBjoern A. Zeeb }
3525*6d67aabdSBjoern A. Zeeb 
3526*6d67aabdSBjoern A. Zeeb static void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev,
3527*6d67aabdSBjoern A. Zeeb 				      enum rtw89_phy_idx phy, const u32 reg[],
3528*6d67aabdSBjoern A. Zeeb 				      u32 reg_backup[], u32 reg_num)
3529*6d67aabdSBjoern A. Zeeb {
3530*6d67aabdSBjoern A. Zeeb 	u32 i;
3531*6d67aabdSBjoern A. Zeeb 
3532*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < reg_num; i++) {
3533*6d67aabdSBjoern A. Zeeb 		reg_backup[i] = rtw89_phy_read32_mask(rtwdev, reg[i], MASKDWORD);
3534*6d67aabdSBjoern A. Zeeb 
3535*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3536*6d67aabdSBjoern A. Zeeb 			    "[TSSI] Backup BB 0x%x = 0x%x\n", reg[i],
3537*6d67aabdSBjoern A. Zeeb 			    reg_backup[i]);
3538*6d67aabdSBjoern A. Zeeb 	}
3539*6d67aabdSBjoern A. Zeeb }
3540*6d67aabdSBjoern A. Zeeb 
3541*6d67aabdSBjoern A. Zeeb static void _tssi_reload_bb_registers(struct rtw89_dev *rtwdev,
3542*6d67aabdSBjoern A. Zeeb 				      enum rtw89_phy_idx phy, const u32 reg[],
3543*6d67aabdSBjoern A. Zeeb 				      u32 reg_backup[], u32 reg_num)
3544*6d67aabdSBjoern A. Zeeb 
3545*6d67aabdSBjoern A. Zeeb {
3546*6d67aabdSBjoern A. Zeeb 	u32 i;
3547*6d67aabdSBjoern A. Zeeb 
3548*6d67aabdSBjoern A. Zeeb 	for (i = 0; i < reg_num; i++) {
3549*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, reg[i], MASKDWORD, reg_backup[i]);
3550*6d67aabdSBjoern A. Zeeb 
3551*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3552*6d67aabdSBjoern A. Zeeb 			    "[TSSI] Reload BB 0x%x = 0x%x\n", reg[i],
3553*6d67aabdSBjoern A. Zeeb 			    reg_backup[i]);
3554*6d67aabdSBjoern A. Zeeb 	}
3555*6d67aabdSBjoern A. Zeeb }
3556*6d67aabdSBjoern A. Zeeb 
3557*6d67aabdSBjoern A. Zeeb static u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel)
3558*6d67aabdSBjoern A. Zeeb {
3559*6d67aabdSBjoern A. Zeeb 	u8 channel_index;
3560*6d67aabdSBjoern A. Zeeb 
3561*6d67aabdSBjoern A. Zeeb 	if (channel >= 1 && channel <= 14)
3562*6d67aabdSBjoern A. Zeeb 		channel_index = channel - 1;
3563*6d67aabdSBjoern A. Zeeb 	else if (channel >= 36 && channel <= 64)
3564*6d67aabdSBjoern A. Zeeb 		channel_index = (channel - 36) / 2 + 14;
3565*6d67aabdSBjoern A. Zeeb 	else if (channel >= 100 && channel <= 144)
3566*6d67aabdSBjoern A. Zeeb 		channel_index = ((channel - 100) / 2) + 15 + 14;
3567*6d67aabdSBjoern A. Zeeb 	else if (channel >= 149 && channel <= 177)
3568*6d67aabdSBjoern A. Zeeb 		channel_index = ((channel - 149) / 2) + 38 + 14;
3569*6d67aabdSBjoern A. Zeeb 	else
3570*6d67aabdSBjoern A. Zeeb 		channel_index = 0;
3571*6d67aabdSBjoern A. Zeeb 
3572*6d67aabdSBjoern A. Zeeb 	return channel_index;
3573*6d67aabdSBjoern A. Zeeb }
3574*6d67aabdSBjoern A. Zeeb 
3575*6d67aabdSBjoern A. Zeeb static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3576*6d67aabdSBjoern A. Zeeb 				enum rtw89_rf_path path, const s16 *power,
3577*6d67aabdSBjoern A. Zeeb 				u32 *tssi_cw_rpt)
3578*6d67aabdSBjoern A. Zeeb {
3579*6d67aabdSBjoern A. Zeeb 	u32 tx_counter, tx_counter_tmp;
3580*6d67aabdSBjoern A. Zeeb 	const int retry = 100;
3581*6d67aabdSBjoern A. Zeeb 	u32 tmp;
3582*6d67aabdSBjoern A. Zeeb 	int j, k;
3583*6d67aabdSBjoern A. Zeeb 
3584*6d67aabdSBjoern A. Zeeb 	for (j = 0; j < RTW8852BT_TSSI_PATH_NR; j++) {
3585*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x0);
3586*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x1);
3587*6d67aabdSBjoern A. Zeeb 
3588*6d67aabdSBjoern A. Zeeb 		tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
3589*6d67aabdSBjoern A. Zeeb 
3590*6d67aabdSBjoern A. Zeeb 		tmp = rtw89_phy_read32_mask(rtwdev, _tssi_trigger[path], MASKDWORD);
3591*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3592*6d67aabdSBjoern A. Zeeb 			    "[TSSI PA K] 0x%x = 0x%08x   path=%d\n",
3593*6d67aabdSBjoern A. Zeeb 			    _tssi_trigger[path], tmp, path);
3594*6d67aabdSBjoern A. Zeeb 
3595*6d67aabdSBjoern A. Zeeb 		if (j == 0)
3596*6d67aabdSBjoern A. Zeeb 			_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true);
3597*6d67aabdSBjoern A. Zeeb 		else
3598*6d67aabdSBjoern A. Zeeb 			_tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true);
3599*6d67aabdSBjoern A. Zeeb 
3600*6d67aabdSBjoern A. Zeeb 		tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
3601*6d67aabdSBjoern A. Zeeb 		tx_counter_tmp -= tx_counter;
3602*6d67aabdSBjoern A. Zeeb 
3603*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3604*6d67aabdSBjoern A. Zeeb 			    "[TSSI PA K] First HWTXcounter=%d path=%d\n",
3605*6d67aabdSBjoern A. Zeeb 			    tx_counter_tmp, path);
3606*6d67aabdSBjoern A. Zeeb 
3607*6d67aabdSBjoern A. Zeeb 		for (k = 0; k < retry; k++) {
3608*6d67aabdSBjoern A. Zeeb 			tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path],
3609*6d67aabdSBjoern A. Zeeb 						    B_TSSI_CWRPT_RDY);
3610*6d67aabdSBjoern A. Zeeb 			if (tmp)
3611*6d67aabdSBjoern A. Zeeb 				break;
3612*6d67aabdSBjoern A. Zeeb 
3613*6d67aabdSBjoern A. Zeeb 			udelay(30);
3614*6d67aabdSBjoern A. Zeeb 
3615*6d67aabdSBjoern A. Zeeb 			tx_counter_tmp =
3616*6d67aabdSBjoern A. Zeeb 				rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
3617*6d67aabdSBjoern A. Zeeb 			tx_counter_tmp -= tx_counter;
3618*6d67aabdSBjoern A. Zeeb 
3619*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK,
3620*6d67aabdSBjoern A. Zeeb 				    "[TSSI PA K] Flow k = %d HWTXcounter=%d path=%d\n",
3621*6d67aabdSBjoern A. Zeeb 				    k, tx_counter_tmp, path);
3622*6d67aabdSBjoern A. Zeeb 		}
3623*6d67aabdSBjoern A. Zeeb 
3624*6d67aabdSBjoern A. Zeeb 		if (k >= retry) {
3625*6d67aabdSBjoern A. Zeeb 			rtw89_debug(rtwdev, RTW89_DBG_RFK,
3626*6d67aabdSBjoern A. Zeeb 				    "[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n",
3627*6d67aabdSBjoern A. Zeeb 				    k, path);
3628*6d67aabdSBjoern A. Zeeb 
3629*6d67aabdSBjoern A. Zeeb 			_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
3630*6d67aabdSBjoern A. Zeeb 			return false;
3631*6d67aabdSBjoern A. Zeeb 		}
3632*6d67aabdSBjoern A. Zeeb 
3633*6d67aabdSBjoern A. Zeeb 		tssi_cw_rpt[j] =
3634*6d67aabdSBjoern A. Zeeb 			rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path],
3635*6d67aabdSBjoern A. Zeeb 					      B_TSSI_CWRPT);
3636*6d67aabdSBjoern A. Zeeb 
3637*6d67aabdSBjoern A. Zeeb 		_tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false);
3638*6d67aabdSBjoern A. Zeeb 
3639*6d67aabdSBjoern A. Zeeb 		tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD);
3640*6d67aabdSBjoern A. Zeeb 		tx_counter_tmp -= tx_counter;
3641*6d67aabdSBjoern A. Zeeb 
3642*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3643*6d67aabdSBjoern A. Zeeb 			    "[TSSI PA K] Final HWTXcounter=%d path=%d\n",
3644*6d67aabdSBjoern A. Zeeb 			    tx_counter_tmp, path);
3645*6d67aabdSBjoern A. Zeeb 	}
3646*6d67aabdSBjoern A. Zeeb 
3647*6d67aabdSBjoern A. Zeeb 	return true;
3648*6d67aabdSBjoern A. Zeeb }
3649*6d67aabdSBjoern A. Zeeb 
3650*6d67aabdSBjoern A. Zeeb static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,
3651*6d67aabdSBjoern A. Zeeb 			   enum rtw89_rf_path path)
3652*6d67aabdSBjoern A. Zeeb {
3653*6d67aabdSBjoern A. Zeeb 	static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4,
3654*6d67aabdSBjoern A. Zeeb 				      0x78e4, 0x49c0, 0x0d18, 0x0d80};
3655*6d67aabdSBjoern A. Zeeb 	static const s16 power_2g[4] = {48, 20, 4, -8};
3656*6d67aabdSBjoern A. Zeeb 	static const s16 power_5g[4] = {48, 20, 4, 4};
3657*6d67aabdSBjoern A. Zeeb 	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
3658*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3659*6d67aabdSBjoern A. Zeeb 	s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3;
3660*6d67aabdSBjoern A. Zeeb 	u32 tssi_cw_rpt[RTW8852BT_TSSI_PATH_NR] = {};
3661*6d67aabdSBjoern A. Zeeb 	u8 channel = chan->channel;
3662*6d67aabdSBjoern A. Zeeb 	u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel);
3663*6d67aabdSBjoern A. Zeeb 	struct rtw8852bx_bb_tssi_bak tssi_bak;
3664*6d67aabdSBjoern A. Zeeb 	s32 aliment_diff, tssi_cw_default;
3665*6d67aabdSBjoern A. Zeeb 	u32 start_time, finish_time;
3666*6d67aabdSBjoern A. Zeeb 	u32 bb_reg_backup[8] = {};
3667*6d67aabdSBjoern A. Zeeb 	const s16 *power;
3668*6d67aabdSBjoern A. Zeeb 	u8 band;
3669*6d67aabdSBjoern A. Zeeb 	bool ok;
3670*6d67aabdSBjoern A. Zeeb 	u32 tmp;
3671*6d67aabdSBjoern A. Zeeb 	u8 j;
3672*6d67aabdSBjoern A. Zeeb 
3673*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3674*6d67aabdSBjoern A. Zeeb 		    "======> %s   channel=%d   path=%d\n", __func__, channel,
3675*6d67aabdSBjoern A. Zeeb 		    path);
3676*6d67aabdSBjoern A. Zeeb 
3677*6d67aabdSBjoern A. Zeeb 	start_time = ktime_get_ns();
3678*6d67aabdSBjoern A. Zeeb 
3679*6d67aabdSBjoern A. Zeeb 	if (chan->band_type == RTW89_BAND_2G)
3680*6d67aabdSBjoern A. Zeeb 		power = power_2g;
3681*6d67aabdSBjoern A. Zeeb 	else
3682*6d67aabdSBjoern A. Zeeb 		power = power_5g;
3683*6d67aabdSBjoern A. Zeeb 
3684*6d67aabdSBjoern A. Zeeb 	if (channel >= 1 && channel <= 14)
3685*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_2G;
3686*6d67aabdSBjoern A. Zeeb 	else if (channel >= 36 && channel <= 64)
3687*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GL;
3688*6d67aabdSBjoern A. Zeeb 	else if (channel >= 100 && channel <= 144)
3689*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GM;
3690*6d67aabdSBjoern A. Zeeb 	else if (channel >= 149 && channel <= 177)
3691*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GH;
3692*6d67aabdSBjoern A. Zeeb 	else
3693*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_2G;
3694*6d67aabdSBjoern A. Zeeb 
3695*6d67aabdSBjoern A. Zeeb 	rtw8852bx_bb_backup_tssi(rtwdev, phy, &tssi_bak);
3696*6d67aabdSBjoern A. Zeeb 	_tssi_backup_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup,
3697*6d67aabdSBjoern A. Zeeb 				  ARRAY_SIZE(bb_reg_backup));
3698*6d67aabdSBjoern A. Zeeb 
3699*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x8);
3700*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x8);
3701*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2);
3702*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2);
3703*6d67aabdSBjoern A. Zeeb 
3704*6d67aabdSBjoern A. Zeeb 	ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt);
3705*6d67aabdSBjoern A. Zeeb 	if (!ok)
3706*6d67aabdSBjoern A. Zeeb 		goto out;
3707*6d67aabdSBjoern A. Zeeb 
3708*6d67aabdSBjoern A. Zeeb 	for (j = 0; j < RTW8852BT_TSSI_PATH_NR; j++) {
3709*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3710*6d67aabdSBjoern A. Zeeb 			    "[TSSI PA K] power[%d]=%d  tssi_cw_rpt[%d]=%d\n", j,
3711*6d67aabdSBjoern A. Zeeb 			    power[j], j, tssi_cw_rpt[j]);
3712*6d67aabdSBjoern A. Zeeb 	}
3713*6d67aabdSBjoern A. Zeeb 
3714*6d67aabdSBjoern A. Zeeb 	tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][1],
3715*6d67aabdSBjoern A. Zeeb 				    _tssi_cw_default_mask[1]);
3716*6d67aabdSBjoern A. Zeeb 	tssi_cw_default = sign_extend32(tmp, 8);
3717*6d67aabdSBjoern A. Zeeb 	tssi_alim_offset_1 = tssi_cw_rpt[0] - ((power[0] - power[1]) * 2) -
3718*6d67aabdSBjoern A. Zeeb 			     tssi_cw_rpt[1] + tssi_cw_default;
3719*6d67aabdSBjoern A. Zeeb 	aliment_diff = tssi_alim_offset_1 - tssi_cw_default;
3720*6d67aabdSBjoern A. Zeeb 
3721*6d67aabdSBjoern A. Zeeb 	tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][2],
3722*6d67aabdSBjoern A. Zeeb 				    _tssi_cw_default_mask[2]);
3723*6d67aabdSBjoern A. Zeeb 	tssi_cw_default = sign_extend32(tmp, 8);
3724*6d67aabdSBjoern A. Zeeb 	tssi_alim_offset_2 = tssi_cw_default + aliment_diff;
3725*6d67aabdSBjoern A. Zeeb 
3726*6d67aabdSBjoern A. Zeeb 	tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][3],
3727*6d67aabdSBjoern A. Zeeb 				    _tssi_cw_default_mask[3]);
3728*6d67aabdSBjoern A. Zeeb 	tssi_cw_default = sign_extend32(tmp, 8);
3729*6d67aabdSBjoern A. Zeeb 	tssi_alim_offset_3 = tssi_cw_default + aliment_diff;
3730*6d67aabdSBjoern A. Zeeb 
3731*6d67aabdSBjoern A. Zeeb 	if (path == RF_PATH_A) {
3732*6d67aabdSBjoern A. Zeeb 		tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) |
3733*6d67aabdSBjoern A. Zeeb 		      FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) |
3734*6d67aabdSBjoern A. Zeeb 		      FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3);
3735*6d67aabdSBjoern A. Zeeb 
3736*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM1, tmp);
3737*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2, B_P0_TSSI_ALIM2, tmp);
3738*6d67aabdSBjoern A. Zeeb 
3739*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3740*6d67aabdSBjoern A. Zeeb 			    "[TSSI PA K] tssi_alim_offset = 0x%x   0x%x   0x%x   0x%x\n",
3741*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3, B_P0_TSSI_ALIM31),
3742*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM11),
3743*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM12),
3744*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM13));
3745*6d67aabdSBjoern A. Zeeb 	} else {
3746*6d67aabdSBjoern A. Zeeb 		tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) |
3747*6d67aabdSBjoern A. Zeeb 		      FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) |
3748*6d67aabdSBjoern A. Zeeb 		      FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3);
3749*6d67aabdSBjoern A. Zeeb 
3750*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM1, tmp);
3751*6d67aabdSBjoern A. Zeeb 		rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM2, B_P1_TSSI_ALIM2, tmp);
3752*6d67aabdSBjoern A. Zeeb 
3753*6d67aabdSBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_RFK,
3754*6d67aabdSBjoern A. Zeeb 			    "[TSSI PA K] tssi_alim_offset = 0x%x   0x%x   0x%x   0x%x\n",
3755*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM3, B_P1_TSSI_ALIM31),
3756*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM11),
3757*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM12),
3758*6d67aabdSBjoern A. Zeeb 			    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM13));
3759*6d67aabdSBjoern A. Zeeb 	}
3760*6d67aabdSBjoern A. Zeeb 
3761*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_done[path][band] = true;
3762*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_value[path][band][0] =
3763*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD);
3764*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_value[path][band][1] =
3765*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD);
3766*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_value[path][band][2] =
3767*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD);
3768*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_value[path][band][3] =
3769*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD);
3770*6d67aabdSBjoern A. Zeeb 
3771*6d67aabdSBjoern A. Zeeb 	tssi_info->check_backup_aligmk[path][ch_idx] = true;
3772*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_backup_by_ch[path][ch_idx][0] =
3773*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD);
3774*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_backup_by_ch[path][ch_idx][1] =
3775*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD);
3776*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_backup_by_ch[path][ch_idx][2] =
3777*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD);
3778*6d67aabdSBjoern A. Zeeb 	tssi_info->alignment_backup_by_ch[path][ch_idx][3] =
3779*6d67aabdSBjoern A. Zeeb 		rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD);
3780*6d67aabdSBjoern A. Zeeb 
3781*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3782*6d67aabdSBjoern A. Zeeb 		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][0], 0x%x = 0x%08x\n",
3783*6d67aabdSBjoern A. Zeeb 		    path, band, R_P0_TSSI_ALIM1 + (path << 13),
3784*6d67aabdSBjoern A. Zeeb 		    tssi_info->alignment_value[path][band][0]);
3785*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3786*6d67aabdSBjoern A. Zeeb 		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][1], 0x%x = 0x%08x\n",
3787*6d67aabdSBjoern A. Zeeb 		    path, band, R_P0_TSSI_ALIM3 + (path << 13),
3788*6d67aabdSBjoern A. Zeeb 		    tssi_info->alignment_value[path][band][1]);
3789*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3790*6d67aabdSBjoern A. Zeeb 		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][2], 0x%x = 0x%08x\n",
3791*6d67aabdSBjoern A. Zeeb 		    path, band, R_P0_TSSI_ALIM2 + (path << 13),
3792*6d67aabdSBjoern A. Zeeb 		    tssi_info->alignment_value[path][band][2]);
3793*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3794*6d67aabdSBjoern A. Zeeb 		    "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][3], 0x%x = 0x%08x\n",
3795*6d67aabdSBjoern A. Zeeb 		    path, band, R_P0_TSSI_ALIM4 + (path << 13),
3796*6d67aabdSBjoern A. Zeeb 		    tssi_info->alignment_value[path][band][3]);
3797*6d67aabdSBjoern A. Zeeb 
3798*6d67aabdSBjoern A. Zeeb out:
3799*6d67aabdSBjoern A. Zeeb 	_tssi_reload_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup,
3800*6d67aabdSBjoern A. Zeeb 				  ARRAY_SIZE(bb_reg_backup));
3801*6d67aabdSBjoern A. Zeeb 	rtw8852bx_bb_restore_tssi(rtwdev, phy, &tssi_bak);
3802*6d67aabdSBjoern A. Zeeb 	rtw8852bx_bb_tx_mode_switch(rtwdev, phy, 0);
3803*6d67aabdSBjoern A. Zeeb 
3804*6d67aabdSBjoern A. Zeeb 	finish_time = ktime_get_ns();
3805*6d67aabdSBjoern A. Zeeb 	tssi_info->tssi_alimk_time += finish_time - start_time;
3806*6d67aabdSBjoern A. Zeeb 
3807*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3808*6d67aabdSBjoern A. Zeeb 		    "[TSSI PA K] %s processing time = %d ms\n", __func__,
3809*6d67aabdSBjoern A. Zeeb 		    tssi_info->tssi_alimk_time);
3810*6d67aabdSBjoern A. Zeeb }
3811*6d67aabdSBjoern A. Zeeb 
3812*6d67aabdSBjoern A. Zeeb void rtw8852bt_dpk_init(struct rtw89_dev *rtwdev)
3813*6d67aabdSBjoern A. Zeeb {
3814*6d67aabdSBjoern A. Zeeb 	struct rtw89_dpk_info *dpk = &rtwdev->dpk;
3815*6d67aabdSBjoern A. Zeeb 
3816*6d67aabdSBjoern A. Zeeb 	u8 path;
3817*6d67aabdSBjoern A. Zeeb 
3818*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < 2; path++) {
3819*6d67aabdSBjoern A. Zeeb 		dpk->cur_idx[path] = 0;
3820*6d67aabdSBjoern A. Zeeb 		dpk->max_dpk_txagc[path] = 0x3F;
3821*6d67aabdSBjoern A. Zeeb 	}
3822*6d67aabdSBjoern A. Zeeb 
3823*6d67aabdSBjoern A. Zeeb 	dpk->is_dpk_enable = true;
3824*6d67aabdSBjoern A. Zeeb 	dpk->is_dpk_reload_en = false;
3825*6d67aabdSBjoern A. Zeeb 	_set_dpd_backoff(rtwdev, RTW89_PHY_0);
3826*6d67aabdSBjoern A. Zeeb }
3827*6d67aabdSBjoern A. Zeeb 
3828*6d67aabdSBjoern A. Zeeb void rtw8852bt_rck(struct rtw89_dev *rtwdev)
3829*6d67aabdSBjoern A. Zeeb {
3830*6d67aabdSBjoern A. Zeeb 	u8 path;
3831*6d67aabdSBjoern A. Zeeb 
3832*6d67aabdSBjoern A. Zeeb 	for (path = 0; path < RF_PATH_NUM_8852BT; path++)
3833*6d67aabdSBjoern A. Zeeb 		_rck(rtwdev, path);
3834*6d67aabdSBjoern A. Zeeb }
3835*6d67aabdSBjoern A. Zeeb 
3836*6d67aabdSBjoern A. Zeeb void rtw8852bt_dack(struct rtw89_dev *rtwdev)
3837*6d67aabdSBjoern A. Zeeb {
3838*6d67aabdSBjoern A. Zeeb 	u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0);
3839*6d67aabdSBjoern A. Zeeb 
3840*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START);
3841*6d67aabdSBjoern A. Zeeb 	_dac_cal(rtwdev, false);
3842*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP);
3843*6d67aabdSBjoern A. Zeeb }
3844*6d67aabdSBjoern A. Zeeb 
3845*6d67aabdSBjoern A. Zeeb void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
3846*6d67aabdSBjoern A. Zeeb {
3847*6d67aabdSBjoern A. Zeeb 	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
3848*6d67aabdSBjoern A. Zeeb 	u32 tx_en;
3849*6d67aabdSBjoern A. Zeeb 
3850*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);
3851*6d67aabdSBjoern A. Zeeb 	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
3852*6d67aabdSBjoern A. Zeeb 	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
3853*6d67aabdSBjoern A. Zeeb 
3854*6d67aabdSBjoern A. Zeeb 	_iqk_init(rtwdev);
3855*6d67aabdSBjoern A. Zeeb 	_iqk(rtwdev, phy_idx, false);
3856*6d67aabdSBjoern A. Zeeb 
3857*6d67aabdSBjoern A. Zeeb 	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
3858*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);
3859*6d67aabdSBjoern A. Zeeb }
3860*6d67aabdSBjoern A. Zeeb 
3861*6d67aabdSBjoern A. Zeeb void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
3862*6d67aabdSBjoern A. Zeeb {
3863*6d67aabdSBjoern A. Zeeb 	u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0);
3864*6d67aabdSBjoern A. Zeeb 	u32 tx_en;
3865*6d67aabdSBjoern A. Zeeb 
3866*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);
3867*6d67aabdSBjoern A. Zeeb 	rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);
3868*6d67aabdSBjoern A. Zeeb 	_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));
3869*6d67aabdSBjoern A. Zeeb 
3870*6d67aabdSBjoern A. Zeeb 	_rx_dck(rtwdev, phy_idx);
3871*6d67aabdSBjoern A. Zeeb 
3872*6d67aabdSBjoern A. Zeeb 	rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);
3873*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);
3874*6d67aabdSBjoern A. Zeeb }
3875*6d67aabdSBjoern A. Zeeb 
3876*6d67aabdSBjoern A. Zeeb void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
3877*6d67aabdSBjoern A. Zeeb {
3878*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3879*6d67aabdSBjoern A. Zeeb 		    "[DPK] ****** DPK Start (Ver: 0x%x) ******\n", RTW8852BT_DPK_VER);
3880*6d67aabdSBjoern A. Zeeb 
3881*6d67aabdSBjoern A. Zeeb 	if (_dpk_bypass_check(rtwdev, phy_idx))
3882*6d67aabdSBjoern A. Zeeb 		_dpk_force_bypass(rtwdev, phy_idx);
3883*6d67aabdSBjoern A. Zeeb 	else
3884*6d67aabdSBjoern A. Zeeb 		_dpk_cal_select(rtwdev, phy_idx, RF_AB);
3885*6d67aabdSBjoern A. Zeeb }
3886*6d67aabdSBjoern A. Zeeb 
3887*6d67aabdSBjoern A. Zeeb void rtw8852bt_dpk_track(struct rtw89_dev *rtwdev)
3888*6d67aabdSBjoern A. Zeeb {
3889*6d67aabdSBjoern A. Zeeb 	_dpk_track(rtwdev);
3890*6d67aabdSBjoern A. Zeeb }
3891*6d67aabdSBjoern A. Zeeb 
3892*6d67aabdSBjoern A. Zeeb void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en)
3893*6d67aabdSBjoern A. Zeeb {
3894*6d67aabdSBjoern A. Zeeb 	static const u32 reg[2] = {R_DPD_CH0A, R_DPD_CH0B};
3895*6d67aabdSBjoern A. Zeeb 	u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB);
3896*6d67aabdSBjoern A. Zeeb 	u32 reg_backup[2] = {};
3897*6d67aabdSBjoern A. Zeeb 	u32 tx_en;
3898*6d67aabdSBjoern A. Zeeb 	u8 i;
3899*6d67aabdSBjoern A. Zeeb 
3900*6d67aabdSBjoern A. Zeeb 	_tssi_backup_bb_registers(rtwdev, phy, reg, reg_backup, 2);
3901*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy);
3902*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);
3903*6d67aabdSBjoern A. Zeeb 
3904*6d67aabdSBjoern A. Zeeb 	_tssi_dpk_off(rtwdev, phy);
3905*6d67aabdSBjoern A. Zeeb 	_tssi_disable(rtwdev, phy);
3906*6d67aabdSBjoern A. Zeeb 
3907*6d67aabdSBjoern A. Zeeb 	for (i = RF_PATH_A; i < RF_PATH_NUM_8852BT; i++) {
3908*6d67aabdSBjoern A. Zeeb 		_tssi_rf_setting(rtwdev, phy, i);
3909*6d67aabdSBjoern A. Zeeb 		_tssi_set_sys(rtwdev, phy, i);
3910*6d67aabdSBjoern A. Zeeb 		_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);
3911*6d67aabdSBjoern A. Zeeb 		_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);
3912*6d67aabdSBjoern A. Zeeb 		_tssi_set_dck(rtwdev, phy, i);
3913*6d67aabdSBjoern A. Zeeb 		_tssi_set_tmeter_tbl(rtwdev, phy, i);
3914*6d67aabdSBjoern A. Zeeb 		_tssi_set_dac_gain_tbl(rtwdev, phy, i);
3915*6d67aabdSBjoern A. Zeeb 		_tssi_slope_cal_org(rtwdev, phy, i);
3916*6d67aabdSBjoern A. Zeeb 		_tssi_alignment_default(rtwdev, phy, i, true);
3917*6d67aabdSBjoern A. Zeeb 		_tssi_set_tssi_slope(rtwdev, phy, i);
3918*6d67aabdSBjoern A. Zeeb 
3919*6d67aabdSBjoern A. Zeeb 		rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL);
3920*6d67aabdSBjoern A. Zeeb 		_tmac_tx_pause(rtwdev, phy, true);
3921*6d67aabdSBjoern A. Zeeb 		if (hwtx_en)
3922*6d67aabdSBjoern A. Zeeb 			_tssi_alimentk(rtwdev, phy, i);
3923*6d67aabdSBjoern A. Zeeb 		_tmac_tx_pause(rtwdev, phy, false);
3924*6d67aabdSBjoern A. Zeeb 		rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en);
3925*6d67aabdSBjoern A. Zeeb 	}
3926*6d67aabdSBjoern A. Zeeb 
3927*6d67aabdSBjoern A. Zeeb 	_tssi_enable(rtwdev, phy);
3928*6d67aabdSBjoern A. Zeeb 	_tssi_set_efuse_to_de(rtwdev, phy);
3929*6d67aabdSBjoern A. Zeeb 
3930*6d67aabdSBjoern A. Zeeb 	_tssi_reload_bb_registers(rtwdev, phy, reg, reg_backup, 2);
3931*6d67aabdSBjoern A. Zeeb 
3932*6d67aabdSBjoern A. Zeeb 	rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);
3933*6d67aabdSBjoern A. Zeeb }
3934*6d67aabdSBjoern A. Zeeb 
3935*6d67aabdSBjoern A. Zeeb void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)
3936*6d67aabdSBjoern A. Zeeb {
3937*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3938*6d67aabdSBjoern A. Zeeb 	struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;
3939*6d67aabdSBjoern A. Zeeb 	u8 channel = chan->channel;
3940*6d67aabdSBjoern A. Zeeb 	u8 band;
3941*6d67aabdSBjoern A. Zeeb 	u32 i;
3942*6d67aabdSBjoern A. Zeeb 
3943*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3944*6d67aabdSBjoern A. Zeeb 		    "======>%s   phy=%d  channel=%d\n", __func__, phy, channel);
3945*6d67aabdSBjoern A. Zeeb 
3946*6d67aabdSBjoern A. Zeeb 	if (channel >= 1 && channel <= 14)
3947*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_2G;
3948*6d67aabdSBjoern A. Zeeb 	else if (channel >= 36 && channel <= 64)
3949*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GL;
3950*6d67aabdSBjoern A. Zeeb 	else if (channel >= 100 && channel <= 144)
3951*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GM;
3952*6d67aabdSBjoern A. Zeeb 	else if (channel >= 149 && channel <= 177)
3953*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_5GH;
3954*6d67aabdSBjoern A. Zeeb 	else
3955*6d67aabdSBjoern A. Zeeb 		band = TSSI_ALIMK_2G;
3956*6d67aabdSBjoern A. Zeeb 
3957*6d67aabdSBjoern A. Zeeb 	_tssi_disable(rtwdev, phy);
3958*6d67aabdSBjoern A. Zeeb 
3959*6d67aabdSBjoern A. Zeeb 	for (i = RF_PATH_A; i < RTW8852BT_TSSI_PATH_NR; i++) {
3960*6d67aabdSBjoern A. Zeeb 		_tssi_rf_setting(rtwdev, phy, i);
3961*6d67aabdSBjoern A. Zeeb 		_tssi_set_sys(rtwdev, phy, i);
3962*6d67aabdSBjoern A. Zeeb 		_tssi_set_tmeter_tbl(rtwdev, phy, i);
3963*6d67aabdSBjoern A. Zeeb 
3964*6d67aabdSBjoern A. Zeeb 		if (tssi_info->alignment_done[i][band])
3965*6d67aabdSBjoern A. Zeeb 			_tssi_alimentk_done(rtwdev, phy, i);
3966*6d67aabdSBjoern A. Zeeb 		else
3967*6d67aabdSBjoern A. Zeeb 			_tssi_alignment_default(rtwdev, phy, i, true);
3968*6d67aabdSBjoern A. Zeeb 	}
3969*6d67aabdSBjoern A. Zeeb 
3970*6d67aabdSBjoern A. Zeeb 	_tssi_enable(rtwdev, phy);
3971*6d67aabdSBjoern A. Zeeb 	_tssi_set_efuse_to_de(rtwdev, phy);
3972*6d67aabdSBjoern A. Zeeb }
3973*6d67aabdSBjoern A. Zeeb 
3974*6d67aabdSBjoern A. Zeeb static void rtw8852bt_tssi_default_txagc(struct rtw89_dev *rtwdev,
3975*6d67aabdSBjoern A. Zeeb 					 enum rtw89_phy_idx phy, bool enable)
3976*6d67aabdSBjoern A. Zeeb {
3977*6d67aabdSBjoern A. Zeeb 	const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
3978*6d67aabdSBjoern A. Zeeb 	u8 channel = chan->channel;
3979*6d67aabdSBjoern A. Zeeb 
3980*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s   ch=%d\n",
3981*6d67aabdSBjoern A. Zeeb 		    __func__, channel);
3982*6d67aabdSBjoern A. Zeeb 
3983*6d67aabdSBjoern A. Zeeb 	if (enable)
3984*6d67aabdSBjoern A. Zeeb 		return;
3985*6d67aabdSBjoern A. Zeeb 
3986*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
3987*6d67aabdSBjoern A. Zeeb 		    "======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
3988*6d67aabdSBjoern A. Zeeb 		    __func__,
3989*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT),
3990*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT));
3991*6d67aabdSBjoern A. Zeeb 
3992*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0);
3993*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT,  0xc0);
3994*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);
3995*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);
3996*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0);
3997*6d67aabdSBjoern A. Zeeb 	rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1);
3998*6d67aabdSBjoern A. Zeeb 
3999*6d67aabdSBjoern A. Zeeb 	_tssi_alimentk_done(rtwdev, phy, RF_PATH_A);
4000*6d67aabdSBjoern A. Zeeb 	_tssi_alimentk_done(rtwdev, phy, RF_PATH_B);
4001*6d67aabdSBjoern A. Zeeb 
4002*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
4003*6d67aabdSBjoern A. Zeeb 		    "======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n",
4004*6d67aabdSBjoern A. Zeeb 		    __func__,
4005*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT),
4006*6d67aabdSBjoern A. Zeeb 		    rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT));
4007*6d67aabdSBjoern A. Zeeb 
4008*6d67aabdSBjoern A. Zeeb 	rtw89_debug(rtwdev, RTW89_DBG_RFK,
4009*6d67aabdSBjoern A. Zeeb 		    "======> %s   SCAN_END\n", __func__);
4010*6d67aabdSBjoern A. Zeeb }
4011*6d67aabdSBjoern A. Zeeb 
4012*6d67aabdSBjoern A. Zeeb void rtw8852bt_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,
4013*6d67aabdSBjoern A. Zeeb 				enum rtw89_phy_idx phy_idx)
4014*6d67aabdSBjoern A. Zeeb {
4015*6d67aabdSBjoern A. Zeeb 	if (scan_start)
4016*6d67aabdSBjoern A. Zeeb 		rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, true);
4017*6d67aabdSBjoern A. Zeeb 	else
4018*6d67aabdSBjoern A. Zeeb 		rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, false);
4019*6d67aabdSBjoern A. Zeeb }
4020