xref: /linux/drivers/net/wireless/realtek/rtw88/rtw8821a.c (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
1*32e284a2SBitterblue Smith // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2*32e284a2SBitterblue Smith /* Copyright(c) 2024  Realtek Corporation
3*32e284a2SBitterblue Smith  */
4*32e284a2SBitterblue Smith 
5*32e284a2SBitterblue Smith #include "main.h"
6*32e284a2SBitterblue Smith #include "coex.h"
7*32e284a2SBitterblue Smith #include "phy.h"
8*32e284a2SBitterblue Smith #include "reg.h"
9*32e284a2SBitterblue Smith #include "rtw88xxa.h"
10*32e284a2SBitterblue Smith #include "rtw8821a.h"
11*32e284a2SBitterblue Smith #include "rtw8821a_table.h"
12*32e284a2SBitterblue Smith #include "tx.h"
13*32e284a2SBitterblue Smith 
14*32e284a2SBitterblue Smith static void rtw8821a_power_off(struct rtw_dev *rtwdev)
15*32e284a2SBitterblue Smith {
16*32e284a2SBitterblue Smith 	rtw88xxa_power_off(rtwdev, enter_lps_flow_8821a);
17*32e284a2SBitterblue Smith }
18*32e284a2SBitterblue Smith 
19*32e284a2SBitterblue Smith static s8 rtw8821a_cck_rx_pwr(u8 lna_idx, u8 vga_idx)
20*32e284a2SBitterblue Smith {
21*32e284a2SBitterblue Smith 	static const s8 lna_gain_table[] = {15, -1, -17, 0, -30, -38};
22*32e284a2SBitterblue Smith 	s8 rx_pwr_all = 0;
23*32e284a2SBitterblue Smith 	s8 lna_gain;
24*32e284a2SBitterblue Smith 
25*32e284a2SBitterblue Smith 	switch (lna_idx) {
26*32e284a2SBitterblue Smith 	case 5:
27*32e284a2SBitterblue Smith 	case 4:
28*32e284a2SBitterblue Smith 	case 2:
29*32e284a2SBitterblue Smith 	case 1:
30*32e284a2SBitterblue Smith 	case 0:
31*32e284a2SBitterblue Smith 		lna_gain = lna_gain_table[lna_idx];
32*32e284a2SBitterblue Smith 		rx_pwr_all = lna_gain - 2 * vga_idx;
33*32e284a2SBitterblue Smith 		break;
34*32e284a2SBitterblue Smith 	default:
35*32e284a2SBitterblue Smith 		break;
36*32e284a2SBitterblue Smith 	}
37*32e284a2SBitterblue Smith 
38*32e284a2SBitterblue Smith 	return rx_pwr_all;
39*32e284a2SBitterblue Smith }
40*32e284a2SBitterblue Smith 
41*32e284a2SBitterblue Smith static void rtw8821a_query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
42*32e284a2SBitterblue Smith 				      struct rtw_rx_pkt_stat *pkt_stat)
43*32e284a2SBitterblue Smith {
44*32e284a2SBitterblue Smith 	rtw88xxa_query_phy_status(rtwdev, phy_status, pkt_stat,
45*32e284a2SBitterblue Smith 				  rtw8821a_cck_rx_pwr);
46*32e284a2SBitterblue Smith }
47*32e284a2SBitterblue Smith 
48*32e284a2SBitterblue Smith static void rtw8821a_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
49*32e284a2SBitterblue Smith {
50*32e284a2SBitterblue Smith }
51*32e284a2SBitterblue Smith 
52*32e284a2SBitterblue Smith #define CAL_NUM_8821A 3
53*32e284a2SBitterblue Smith #define MACBB_REG_NUM_8821A 8
54*32e284a2SBitterblue Smith #define AFE_REG_NUM_8821A 4
55*32e284a2SBitterblue Smith #define RF_REG_NUM_8821A 3
56*32e284a2SBitterblue Smith 
57*32e284a2SBitterblue Smith static void rtw8821a_iqk_backup_rf(struct rtw_dev *rtwdev, u32 *rfa_backup,
58*32e284a2SBitterblue Smith 				   const u32 *backup_rf_reg, u32 rf_num)
59*32e284a2SBitterblue Smith {
60*32e284a2SBitterblue Smith 	u32 i;
61*32e284a2SBitterblue Smith 
62*32e284a2SBitterblue Smith 	/* [31] = 0 --> Page C */
63*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
64*32e284a2SBitterblue Smith 
65*32e284a2SBitterblue Smith 	/* Save RF Parameters */
66*32e284a2SBitterblue Smith 	for (i = 0; i < rf_num; i++)
67*32e284a2SBitterblue Smith 		rfa_backup[i] = rtw_read_rf(rtwdev, RF_PATH_A,
68*32e284a2SBitterblue Smith 					    backup_rf_reg[i], MASKDWORD);
69*32e284a2SBitterblue Smith }
70*32e284a2SBitterblue Smith 
71*32e284a2SBitterblue Smith static void rtw8821a_iqk_restore_rf(struct rtw_dev *rtwdev,
72*32e284a2SBitterblue Smith 				    const u32 *backup_rf_reg,
73*32e284a2SBitterblue Smith 				    u32 *RF_backup, u32 rf_reg_num)
74*32e284a2SBitterblue Smith {
75*32e284a2SBitterblue Smith 	u32 i;
76*32e284a2SBitterblue Smith 
77*32e284a2SBitterblue Smith 	/* [31] = 0 --> Page C */
78*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
79*32e284a2SBitterblue Smith 
80*32e284a2SBitterblue Smith 	for (i = 0; i < rf_reg_num; i++)
81*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, backup_rf_reg[i],
82*32e284a2SBitterblue Smith 			     RFREG_MASK, RF_backup[i]);
83*32e284a2SBitterblue Smith }
84*32e284a2SBitterblue Smith 
85*32e284a2SBitterblue Smith static void rtw8821a_iqk_restore_afe(struct rtw_dev *rtwdev, u32 *afe_backup,
86*32e284a2SBitterblue Smith 				     const u32 *backup_afe_reg, u32 afe_num)
87*32e284a2SBitterblue Smith {
88*32e284a2SBitterblue Smith 	u32 i;
89*32e284a2SBitterblue Smith 
90*32e284a2SBitterblue Smith 	/* [31] = 0 --> Page C */
91*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
92*32e284a2SBitterblue Smith 
93*32e284a2SBitterblue Smith 	/* Reload AFE Parameters */
94*32e284a2SBitterblue Smith 	for (i = 0; i < afe_num; i++)
95*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, backup_afe_reg[i], afe_backup[i]);
96*32e284a2SBitterblue Smith 
97*32e284a2SBitterblue Smith 	/* [31] = 1 --> Page C1 */
98*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
99*32e284a2SBitterblue Smith 
100*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x0);
101*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x0);
102*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x0);
103*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x3c000000);
104*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_LSSI_WRITE_A, 0x00000080);
105*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_TXAGCIDX, 0x00000000);
106*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_IQK_DPD_CFG, 0x20040000);
107*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_CFG_PMPD, 0x20000000);
108*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_RFECTL_A, 0x0);
109*32e284a2SBitterblue Smith }
110*32e284a2SBitterblue Smith 
111*32e284a2SBitterblue Smith static void rtw8821a_iqk_rx_fill(struct rtw_dev *rtwdev,
112*32e284a2SBitterblue Smith 				 unsigned int rx_x, unsigned int rx_y)
113*32e284a2SBitterblue Smith {
114*32e284a2SBitterblue Smith 	/* [31] = 0 --> Page C */
115*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
116*32e284a2SBitterblue Smith 
117*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
118*32e284a2SBitterblue Smith 			 0x000003ff, rx_x >> 1);
119*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
120*32e284a2SBitterblue Smith 			 0x03ff0000, (rx_y >> 1) & 0x3ff);
121*32e284a2SBitterblue Smith }
122*32e284a2SBitterblue Smith 
123*32e284a2SBitterblue Smith static void rtw8821a_iqk_tx_fill(struct rtw_dev *rtwdev,
124*32e284a2SBitterblue Smith 				 unsigned int tx_x, unsigned int tx_y)
125*32e284a2SBitterblue Smith {
126*32e284a2SBitterblue Smith 	/* [31] = 1 --> Page C1 */
127*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
128*32e284a2SBitterblue Smith 
129*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_LSSI_WRITE_A, 0x00000080);
130*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_IQK_DPD_CFG, 0x20040000);
131*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_CFG_PMPD, 0x20000000);
132*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_IQC_Y, 0x000007ff, tx_y);
133*32e284a2SBitterblue Smith 	rtw_write32_mask(rtwdev, REG_IQC_X, 0x000007ff, tx_x);
134*32e284a2SBitterblue Smith }
135*32e284a2SBitterblue Smith 
136*32e284a2SBitterblue Smith static void rtw8821a_iqk_tx_vdf_true(struct rtw_dev *rtwdev, u32 cal,
137*32e284a2SBitterblue Smith 				     bool *tx0iqkok,
138*32e284a2SBitterblue Smith 				     int tx_x0[CAL_NUM_8821A],
139*32e284a2SBitterblue Smith 				     int tx_y0[CAL_NUM_8821A])
140*32e284a2SBitterblue Smith {
141*32e284a2SBitterblue Smith 	u32 cal_retry, delay_count, iqk_ready, tx_fail;
142*32e284a2SBitterblue Smith 	int tx_dt[3], vdf_y[3], vdf_x[3];
143*32e284a2SBitterblue Smith 	int k;
144*32e284a2SBitterblue Smith 
145*32e284a2SBitterblue Smith 	for (k = 0; k < 3; k++) {
146*32e284a2SBitterblue Smith 		switch (k) {
147*32e284a2SBitterblue Smith 		case 0:
148*32e284a2SBitterblue Smith 			/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
149*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE,
150*32e284a2SBitterblue Smith 				    0x18008c38);
151*32e284a2SBitterblue Smith 			/* RX_Tone_idx[9:0], RxK_Mask[29] */
152*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c38);
153*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x0);
154*32e284a2SBitterblue Smith 			break;
155*32e284a2SBitterblue Smith 		case 1:
156*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE,
157*32e284a2SBitterblue Smith 					 BIT(28), 0x0);
158*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_OFDM0_A_TX_AFE,
159*32e284a2SBitterblue Smith 					 BIT(28), 0x0);
160*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x0);
161*32e284a2SBitterblue Smith 			break;
162*32e284a2SBitterblue Smith 		case 2:
163*32e284a2SBitterblue Smith 			rtw_dbg(rtwdev, RTW_DBG_RFK,
164*32e284a2SBitterblue Smith 				"vdf_y[1] = %x vdf_y[0] = %x\n",
165*32e284a2SBitterblue Smith 				vdf_y[1] >> 21 & 0x00007ff,
166*32e284a2SBitterblue Smith 				vdf_y[0] >> 21 & 0x00007ff);
167*32e284a2SBitterblue Smith 
168*32e284a2SBitterblue Smith 			rtw_dbg(rtwdev, RTW_DBG_RFK,
169*32e284a2SBitterblue Smith 				"vdf_x[1] = %x vdf_x[0] = %x\n",
170*32e284a2SBitterblue Smith 				vdf_x[1] >> 21 & 0x00007ff,
171*32e284a2SBitterblue Smith 				vdf_x[0] >> 21 & 0x00007ff);
172*32e284a2SBitterblue Smith 
173*32e284a2SBitterblue Smith 			tx_dt[cal] = (vdf_y[1] >> 20) - (vdf_y[0] >> 20);
174*32e284a2SBitterblue Smith 			tx_dt[cal] = (16 * tx_dt[cal]) * 10000 / 15708;
175*32e284a2SBitterblue Smith 			tx_dt[cal] = (tx_dt[cal] >> 1) + (tx_dt[cal] & BIT(0));
176*32e284a2SBitterblue Smith 
177*32e284a2SBitterblue Smith 			/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
178*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE,
179*32e284a2SBitterblue Smith 				    0x18008c20);
180*32e284a2SBitterblue Smith 			/* RX_Tone_idx[9:0], RxK_Mask[29] */
181*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c20);
182*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x1);
183*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_INTPO_SETA, 0x3fff0000,
184*32e284a2SBitterblue Smith 					 tx_dt[cal] & 0x00003fff);
185*32e284a2SBitterblue Smith 			break;
186*32e284a2SBitterblue Smith 		}
187*32e284a2SBitterblue Smith 
188*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
189*32e284a2SBitterblue Smith 
190*32e284a2SBitterblue Smith 		for (cal_retry = 0; cal_retry < 10; cal_retry++) {
191*32e284a2SBitterblue Smith 			/* one shot */
192*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
193*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
194*32e284a2SBitterblue Smith 
195*32e284a2SBitterblue Smith 			mdelay(10);
196*32e284a2SBitterblue Smith 
197*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
198*32e284a2SBitterblue Smith 
199*32e284a2SBitterblue Smith 			for (delay_count = 0; delay_count < 20; delay_count++) {
200*32e284a2SBitterblue Smith 				iqk_ready = rtw_read32_mask(rtwdev,
201*32e284a2SBitterblue Smith 							    REG_IQKA_END,
202*32e284a2SBitterblue Smith 							    BIT(10));
203*32e284a2SBitterblue Smith 
204*32e284a2SBitterblue Smith 				/* Originally: if (~iqk_ready || delay_count > 20)
205*32e284a2SBitterblue Smith 				 * that looks like a typo so make it more explicit
206*32e284a2SBitterblue Smith 				 */
207*32e284a2SBitterblue Smith 				iqk_ready = true;
208*32e284a2SBitterblue Smith 
209*32e284a2SBitterblue Smith 				if (iqk_ready)
210*32e284a2SBitterblue Smith 					break;
211*32e284a2SBitterblue Smith 
212*32e284a2SBitterblue Smith 				mdelay(1);
213*32e284a2SBitterblue Smith 			}
214*32e284a2SBitterblue Smith 
215*32e284a2SBitterblue Smith 			if (delay_count < 20) {
216*32e284a2SBitterblue Smith 				/* ============TXIQK Check============== */
217*32e284a2SBitterblue Smith 				tx_fail = rtw_read32_mask(rtwdev,
218*32e284a2SBitterblue Smith 							  REG_IQKA_END,
219*32e284a2SBitterblue Smith 							  BIT(12));
220*32e284a2SBitterblue Smith 
221*32e284a2SBitterblue Smith 				/* Originally: if (~tx_fail) {
222*32e284a2SBitterblue Smith 				 * It looks like a typo, so make it more explicit.
223*32e284a2SBitterblue Smith 				 */
224*32e284a2SBitterblue Smith 				tx_fail = false;
225*32e284a2SBitterblue Smith 
226*32e284a2SBitterblue Smith 				if (!tx_fail) {
227*32e284a2SBitterblue Smith 					rtw_write32(rtwdev, REG_RFECTL_A,
228*32e284a2SBitterblue Smith 						    0x02000000);
229*32e284a2SBitterblue Smith 					vdf_x[k] = rtw_read32_mask(rtwdev,
230*32e284a2SBitterblue Smith 								   REG_IQKA_END,
231*32e284a2SBitterblue Smith 								   0x07ff0000);
232*32e284a2SBitterblue Smith 					vdf_x[k] <<= 21;
233*32e284a2SBitterblue Smith 
234*32e284a2SBitterblue Smith 					rtw_write32(rtwdev, REG_RFECTL_A,
235*32e284a2SBitterblue Smith 						    0x04000000);
236*32e284a2SBitterblue Smith 					vdf_y[k] = rtw_read32_mask(rtwdev,
237*32e284a2SBitterblue Smith 								   REG_IQKA_END,
238*32e284a2SBitterblue Smith 								   0x07ff0000);
239*32e284a2SBitterblue Smith 					vdf_y[k] <<= 21;
240*32e284a2SBitterblue Smith 
241*32e284a2SBitterblue Smith 					*tx0iqkok = true;
242*32e284a2SBitterblue Smith 					break;
243*32e284a2SBitterblue Smith 				}
244*32e284a2SBitterblue Smith 
245*32e284a2SBitterblue Smith 				rtw_write32_mask(rtwdev, REG_IQC_Y,
246*32e284a2SBitterblue Smith 						 0x000007ff, 0x0);
247*32e284a2SBitterblue Smith 				rtw_write32_mask(rtwdev, REG_IQC_X,
248*32e284a2SBitterblue Smith 						 0x000007ff, 0x200);
249*32e284a2SBitterblue Smith 			}
250*32e284a2SBitterblue Smith 
251*32e284a2SBitterblue Smith 			*tx0iqkok = false;
252*32e284a2SBitterblue Smith 		}
253*32e284a2SBitterblue Smith 	}
254*32e284a2SBitterblue Smith 
255*32e284a2SBitterblue Smith 	if (k == 3) {
256*32e284a2SBitterblue Smith 		tx_x0[cal] = vdf_x[k - 1];
257*32e284a2SBitterblue Smith 		tx_y0[cal] = vdf_y[k - 1];
258*32e284a2SBitterblue Smith 	}
259*32e284a2SBitterblue Smith }
260*32e284a2SBitterblue Smith 
261*32e284a2SBitterblue Smith static void rtw8821a_iqk_tx_vdf_false(struct rtw_dev *rtwdev, u32 cal,
262*32e284a2SBitterblue Smith 				      bool *tx0iqkok,
263*32e284a2SBitterblue Smith 				      int tx_x0[CAL_NUM_8821A],
264*32e284a2SBitterblue Smith 				      int tx_y0[CAL_NUM_8821A])
265*32e284a2SBitterblue Smith {
266*32e284a2SBitterblue Smith 	u32 cal_retry, delay_count, iqk_ready, tx_fail;
267*32e284a2SBitterblue Smith 
268*32e284a2SBitterblue Smith 	/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
269*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x18008c10);
270*32e284a2SBitterblue Smith 	/* RX_Tone_idx[9:0], RxK_Mask[29] */
271*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c10);
272*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
273*32e284a2SBitterblue Smith 
274*32e284a2SBitterblue Smith 	for (cal_retry = 0; cal_retry < 10; cal_retry++) {
275*32e284a2SBitterblue Smith 		/* one shot */
276*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
277*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
278*32e284a2SBitterblue Smith 
279*32e284a2SBitterblue Smith 		mdelay(10);
280*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
281*32e284a2SBitterblue Smith 
282*32e284a2SBitterblue Smith 		for (delay_count = 0; delay_count < 20; delay_count++) {
283*32e284a2SBitterblue Smith 			iqk_ready = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(10));
284*32e284a2SBitterblue Smith 
285*32e284a2SBitterblue Smith 			/* Originally: if (~iqk_ready || delay_count > 20)
286*32e284a2SBitterblue Smith 			 * that looks like a typo so make it more explicit
287*32e284a2SBitterblue Smith 			 */
288*32e284a2SBitterblue Smith 			iqk_ready = true;
289*32e284a2SBitterblue Smith 
290*32e284a2SBitterblue Smith 			if (iqk_ready)
291*32e284a2SBitterblue Smith 				break;
292*32e284a2SBitterblue Smith 
293*32e284a2SBitterblue Smith 			mdelay(1);
294*32e284a2SBitterblue Smith 		}
295*32e284a2SBitterblue Smith 
296*32e284a2SBitterblue Smith 		if (delay_count < 20) {
297*32e284a2SBitterblue Smith 			/* ============TXIQK Check============== */
298*32e284a2SBitterblue Smith 			tx_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(12));
299*32e284a2SBitterblue Smith 
300*32e284a2SBitterblue Smith 			/* Originally: if (~tx_fail) {
301*32e284a2SBitterblue Smith 			 * It looks like a typo, so make it more explicit.
302*32e284a2SBitterblue Smith 			 */
303*32e284a2SBitterblue Smith 			tx_fail = false;
304*32e284a2SBitterblue Smith 
305*32e284a2SBitterblue Smith 			if (!tx_fail) {
306*32e284a2SBitterblue Smith 				rtw_write32(rtwdev, REG_RFECTL_A, 0x02000000);
307*32e284a2SBitterblue Smith 				tx_x0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
308*32e284a2SBitterblue Smith 							     0x07ff0000);
309*32e284a2SBitterblue Smith 				tx_x0[cal] <<= 21;
310*32e284a2SBitterblue Smith 
311*32e284a2SBitterblue Smith 				rtw_write32(rtwdev, REG_RFECTL_A, 0x04000000);
312*32e284a2SBitterblue Smith 				tx_y0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
313*32e284a2SBitterblue Smith 							     0x07ff0000);
314*32e284a2SBitterblue Smith 				tx_y0[cal] <<= 21;
315*32e284a2SBitterblue Smith 
316*32e284a2SBitterblue Smith 				*tx0iqkok = true;
317*32e284a2SBitterblue Smith 				break;
318*32e284a2SBitterblue Smith 			}
319*32e284a2SBitterblue Smith 
320*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_IQC_Y, 0x000007ff, 0x0);
321*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_IQC_X, 0x000007ff, 0x200);
322*32e284a2SBitterblue Smith 		}
323*32e284a2SBitterblue Smith 
324*32e284a2SBitterblue Smith 		*tx0iqkok = false;
325*32e284a2SBitterblue Smith 	}
326*32e284a2SBitterblue Smith }
327*32e284a2SBitterblue Smith 
328*32e284a2SBitterblue Smith static void rtw8821a_iqk_rx(struct rtw_dev *rtwdev, u32 cal, bool *rx0iqkok,
329*32e284a2SBitterblue Smith 			    int rx_x0[CAL_NUM_8821A],
330*32e284a2SBitterblue Smith 			    int rx_y0[CAL_NUM_8821A])
331*32e284a2SBitterblue Smith {
332*32e284a2SBitterblue Smith 	u32 cal_retry, delay_count, iqk_ready, rx_fail;
333*32e284a2SBitterblue Smith 
334*32e284a2SBitterblue Smith 	rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
335*32e284a2SBitterblue Smith 
336*32e284a2SBitterblue Smith 	for (cal_retry = 0; cal_retry < 10; cal_retry++) {
337*32e284a2SBitterblue Smith 		/* one shot */
338*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
339*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
340*32e284a2SBitterblue Smith 
341*32e284a2SBitterblue Smith 		mdelay(10);
342*32e284a2SBitterblue Smith 
343*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
344*32e284a2SBitterblue Smith 
345*32e284a2SBitterblue Smith 		for (delay_count = 0; delay_count < 20; delay_count++) {
346*32e284a2SBitterblue Smith 			iqk_ready = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(10));
347*32e284a2SBitterblue Smith 
348*32e284a2SBitterblue Smith 			/* Originally: if (~iqk_ready || delay_count > 20)
349*32e284a2SBitterblue Smith 			 * that looks like a typo so make it more explicit
350*32e284a2SBitterblue Smith 			 */
351*32e284a2SBitterblue Smith 			iqk_ready = true;
352*32e284a2SBitterblue Smith 
353*32e284a2SBitterblue Smith 			if (iqk_ready)
354*32e284a2SBitterblue Smith 				break;
355*32e284a2SBitterblue Smith 
356*32e284a2SBitterblue Smith 			mdelay(1);
357*32e284a2SBitterblue Smith 		}
358*32e284a2SBitterblue Smith 
359*32e284a2SBitterblue Smith 		if (delay_count < 20) {
360*32e284a2SBitterblue Smith 			/* ============RXIQK Check============== */
361*32e284a2SBitterblue Smith 			rx_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(11));
362*32e284a2SBitterblue Smith 			if (!rx_fail) {
363*32e284a2SBitterblue Smith 				rtw_write32(rtwdev, REG_RFECTL_A, 0x06000000);
364*32e284a2SBitterblue Smith 				rx_x0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
365*32e284a2SBitterblue Smith 							     0x07ff0000);
366*32e284a2SBitterblue Smith 				rx_x0[cal] <<= 21;
367*32e284a2SBitterblue Smith 
368*32e284a2SBitterblue Smith 				rtw_write32(rtwdev, REG_RFECTL_A, 0x08000000);
369*32e284a2SBitterblue Smith 				rx_y0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END,
370*32e284a2SBitterblue Smith 							     0x07ff0000);
371*32e284a2SBitterblue Smith 				rx_y0[cal] <<= 21;
372*32e284a2SBitterblue Smith 
373*32e284a2SBitterblue Smith 				*rx0iqkok = true;
374*32e284a2SBitterblue Smith 				break;
375*32e284a2SBitterblue Smith 			}
376*32e284a2SBitterblue Smith 
377*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
378*32e284a2SBitterblue Smith 					 0x000003ff, 0x200 >> 1);
379*32e284a2SBitterblue Smith 			rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A,
380*32e284a2SBitterblue Smith 					 0x03ff0000, 0x0 >> 1);
381*32e284a2SBitterblue Smith 		}
382*32e284a2SBitterblue Smith 
383*32e284a2SBitterblue Smith 		*rx0iqkok = false;
384*32e284a2SBitterblue Smith 	}
385*32e284a2SBitterblue Smith }
386*32e284a2SBitterblue Smith 
387*32e284a2SBitterblue Smith static void rtw8821a_iqk(struct rtw_dev *rtwdev)
388*32e284a2SBitterblue Smith {
389*32e284a2SBitterblue Smith 	int tx_average = 0, rx_average = 0, rx_iqk_loop = 0;
390*32e284a2SBitterblue Smith 	const struct rtw_efuse *efuse = &rtwdev->efuse;
391*32e284a2SBitterblue Smith 	int tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0;
392*32e284a2SBitterblue Smith 	const struct rtw_hal *hal = &rtwdev->hal;
393*32e284a2SBitterblue Smith 	bool tx0iqkok = false, rx0iqkok = false;
394*32e284a2SBitterblue Smith 	int rx_x_temp = 0, rx_y_temp = 0;
395*32e284a2SBitterblue Smith 	int rx_x0[2][CAL_NUM_8821A];
396*32e284a2SBitterblue Smith 	int rx_y0[2][CAL_NUM_8821A];
397*32e284a2SBitterblue Smith 	int tx_x0[CAL_NUM_8821A];
398*32e284a2SBitterblue Smith 	int tx_y0[CAL_NUM_8821A];
399*32e284a2SBitterblue Smith 	bool rx_finish1 = false;
400*32e284a2SBitterblue Smith 	bool rx_finish2 = false;
401*32e284a2SBitterblue Smith 	bool vdf_enable;
402*32e284a2SBitterblue Smith 	u32 cal;
403*32e284a2SBitterblue Smith 	int i;
404*32e284a2SBitterblue Smith 
405*32e284a2SBitterblue Smith 	rtw_dbg(rtwdev, RTW_DBG_RFK,
406*32e284a2SBitterblue Smith 		"band_width = %d, ext_pa = %d, ext_pa_5g = %d\n",
407*32e284a2SBitterblue Smith 		hal->current_band_width, efuse->ext_pa_2g, efuse->ext_pa_5g);
408*32e284a2SBitterblue Smith 
409*32e284a2SBitterblue Smith 	vdf_enable = hal->current_band_width == RTW_CHANNEL_WIDTH_80;
410*32e284a2SBitterblue Smith 
411*32e284a2SBitterblue Smith 	for (cal = 0; cal < CAL_NUM_8821A; cal++) {
412*32e284a2SBitterblue Smith 		/* path-A LOK */
413*32e284a2SBitterblue Smith 
414*32e284a2SBitterblue Smith 		/* [31] = 0 --> Page C */
415*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
416*32e284a2SBitterblue Smith 
417*32e284a2SBitterblue Smith 		/* ========path-A AFE all on======== */
418*32e284a2SBitterblue Smith 		/* Port 0 DAC/ADC on */
419*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x77777777);
420*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_AFE_PWR2_A, 0x77777777);
421*32e284a2SBitterblue Smith 
422*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_RX_WAIT_CCA_TX_CCK_RFON_A, 0x19791979);
423*32e284a2SBitterblue Smith 
424*32e284a2SBitterblue Smith 		/* hardware 3-wire off */
425*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_3WIRE_SWA, 0xf, 0x4);
426*32e284a2SBitterblue Smith 
427*32e284a2SBitterblue Smith 		/* LOK setting */
428*32e284a2SBitterblue Smith 
429*32e284a2SBitterblue Smith 		/* 1. DAC/ADC sampling rate (160 MHz) */
430*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CK_MONHA, GENMASK(26, 24), 0x7);
431*32e284a2SBitterblue Smith 
432*32e284a2SBitterblue Smith 		/* 2. LoK RF setting (at BW = 20M) */
433*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80002);
434*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, 0x00c00, 0x3);
435*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK,
436*32e284a2SBitterblue Smith 			     0x20000);
437*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK,
438*32e284a2SBitterblue Smith 			     0x0003f);
439*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK,
440*32e284a2SBitterblue Smith 			     0xf3fc3);
441*32e284a2SBitterblue Smith 
442*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK,
443*32e284a2SBitterblue Smith 			     0x931d5);
444*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x8a001);
445*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
446*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_TXAGCIDX, BIT(0), 0x1);
447*32e284a2SBitterblue Smith 		/* TX (X,Y) */
448*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM00, 0x29002000);
449*32e284a2SBitterblue Smith 		/* RX (X,Y) */
450*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM32, 0xa9002000);
451*32e284a2SBitterblue Smith 		/* [0]:AGC_en, [15]:idac_K_Mask */
452*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM96, 0x00462910);
453*32e284a2SBitterblue Smith 
454*32e284a2SBitterblue Smith 		/* [31] = 1 --> Page C1 */
455*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
456*32e284a2SBitterblue Smith 
457*32e284a2SBitterblue Smith 		if (efuse->ext_pa_5g)
458*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
459*32e284a2SBitterblue Smith 				    0x821403f7);
460*32e284a2SBitterblue Smith 		else
461*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
462*32e284a2SBitterblue Smith 				    0x821403f4);
463*32e284a2SBitterblue Smith 
464*32e284a2SBitterblue Smith 		if (hal->current_band_type == RTW_BAND_5G)
465*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x68163e96);
466*32e284a2SBitterblue Smith 		else
467*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28163e96);
468*32e284a2SBitterblue Smith 
469*32e284a2SBitterblue Smith 		/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
470*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x18008c10);
471*32e284a2SBitterblue Smith 		/* RX_Tone_idx[9:0], RxK_Mask[29] */
472*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c10);
473*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000);
474*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000);
475*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000);
476*32e284a2SBitterblue Smith 
477*32e284a2SBitterblue Smith 		mdelay(10);
478*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000);
479*32e284a2SBitterblue Smith 
480*32e284a2SBitterblue Smith 		/* [31] = 0 --> Page C */
481*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
482*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_TXMOD, 0x7fe00,
483*32e284a2SBitterblue Smith 			     rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, 0xffc00));
484*32e284a2SBitterblue Smith 
485*32e284a2SBitterblue Smith 		if (hal->current_band_width == RTW_CHANNEL_WIDTH_40)
486*32e284a2SBitterblue Smith 			rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH,
487*32e284a2SBitterblue Smith 				     RF18_BW_MASK, 0x1);
488*32e284a2SBitterblue Smith 		else if (hal->current_band_width == RTW_CHANNEL_WIDTH_80)
489*32e284a2SBitterblue Smith 			rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH,
490*32e284a2SBitterblue Smith 				     RF18_BW_MASK, 0x0);
491*32e284a2SBitterblue Smith 
492*32e284a2SBitterblue Smith 		/* [31] = 1 --> Page C1 */
493*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
494*32e284a2SBitterblue Smith 
495*32e284a2SBitterblue Smith 		/* 3. TX RF setting */
496*32e284a2SBitterblue Smith 		/* [31] = 0 --> Page C */
497*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
498*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
499*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK,
500*32e284a2SBitterblue Smith 			     0x20000);
501*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK,
502*32e284a2SBitterblue Smith 			     0x0003f);
503*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK,
504*32e284a2SBitterblue Smith 			     0xf3fc3);
505*32e284a2SBitterblue Smith 
506*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 0x931d5);
507*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x8a001);
508*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
509*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
510*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_TXAGCIDX, BIT(0), 0x1);
511*32e284a2SBitterblue Smith 		/* TX (X,Y) */
512*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM00, 0x29002000);
513*32e284a2SBitterblue Smith 		/* RX (X,Y) */
514*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM32, 0xa9002000);
515*32e284a2SBitterblue Smith 		/* [0]:AGC_en, [15]:idac_K_Mask */
516*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a910);
517*32e284a2SBitterblue Smith 
518*32e284a2SBitterblue Smith 		/* [31] = 1 --> Page C1 */
519*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
520*32e284a2SBitterblue Smith 
521*32e284a2SBitterblue Smith 		if (efuse->ext_pa_5g)
522*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
523*32e284a2SBitterblue Smith 				    0x821403f7);
524*32e284a2SBitterblue Smith 		else
525*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE,
526*32e284a2SBitterblue Smith 				    0x821403e3);
527*32e284a2SBitterblue Smith 
528*32e284a2SBitterblue Smith 		if (hal->current_band_type == RTW_BAND_5G)
529*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x40163e96);
530*32e284a2SBitterblue Smith 		else
531*32e284a2SBitterblue Smith 			rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x00163e96);
532*32e284a2SBitterblue Smith 
533*32e284a2SBitterblue Smith 		if (vdf_enable)
534*32e284a2SBitterblue Smith 			rtw8821a_iqk_tx_vdf_true(rtwdev, cal, &tx0iqkok,
535*32e284a2SBitterblue Smith 						 tx_x0, tx_y0);
536*32e284a2SBitterblue Smith 		else
537*32e284a2SBitterblue Smith 			rtw8821a_iqk_tx_vdf_false(rtwdev, cal, &tx0iqkok,
538*32e284a2SBitterblue Smith 						  tx_x0, tx_y0);
539*32e284a2SBitterblue Smith 
540*32e284a2SBitterblue Smith 		if (!tx0iqkok)
541*32e284a2SBitterblue Smith 			break; /* TXK fail, Don't do RXK */
542*32e284a2SBitterblue Smith 
543*32e284a2SBitterblue Smith 		/* ====== RX IQK ====== */
544*32e284a2SBitterblue Smith 		/* [31] = 0 --> Page C */
545*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0);
546*32e284a2SBitterblue Smith 		/* 1. RX RF setting */
547*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
548*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK,
549*32e284a2SBitterblue Smith 			     0x30000);
550*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK,
551*32e284a2SBitterblue Smith 			     0x0002f);
552*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK,
553*32e284a2SBitterblue Smith 			     0xfffbb);
554*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x88001);
555*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 0x931d8);
556*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
557*32e284a2SBitterblue Smith 
558*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x03FF8000,
559*32e284a2SBitterblue Smith 				 (tx_x0[cal] >> 21) & 0x000007ff);
560*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x000007FF,
561*32e284a2SBitterblue Smith 				 (tx_y0[cal] >> 21) & 0x000007ff);
562*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x1);
563*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x0);
564*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000);
565*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a911);
566*32e284a2SBitterblue Smith 
567*32e284a2SBitterblue Smith 		/* [31] = 1 --> Page C1 */
568*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1);
569*32e284a2SBitterblue Smith 
570*32e284a2SBitterblue Smith 		/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
571*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x38008c10);
572*32e284a2SBitterblue Smith 		/* RX_Tone_idx[9:0], RxK_Mask[29] */
573*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x18008c10);
574*32e284a2SBitterblue Smith 		rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x02140119);
575*32e284a2SBitterblue Smith 
576*32e284a2SBitterblue Smith 		if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
577*32e284a2SBitterblue Smith 			rx_iqk_loop = 2; /* for 2% fail; */
578*32e284a2SBitterblue Smith 		else
579*32e284a2SBitterblue Smith 			rx_iqk_loop = 1;
580*32e284a2SBitterblue Smith 
581*32e284a2SBitterblue Smith 		for (i = 0; i < rx_iqk_loop; i++) {
582*32e284a2SBitterblue Smith 			if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE && i == 0)
583*32e284a2SBitterblue Smith 				rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28161100); /* Good */
584*32e284a2SBitterblue Smith 			else
585*32e284a2SBitterblue Smith 				rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28160d00);
586*32e284a2SBitterblue Smith 
587*32e284a2SBitterblue Smith 			rtw8821a_iqk_rx(rtwdev, cal, &rx0iqkok,
588*32e284a2SBitterblue Smith 					rx_x0[i], rx_y0[i]);
589*32e284a2SBitterblue Smith 		}
590*32e284a2SBitterblue Smith 
591*32e284a2SBitterblue Smith 		if (tx0iqkok)
592*32e284a2SBitterblue Smith 			tx_average++;
593*32e284a2SBitterblue Smith 		if (rx0iqkok)
594*32e284a2SBitterblue Smith 			rx_average++;
595*32e284a2SBitterblue Smith 	}
596*32e284a2SBitterblue Smith 
597*32e284a2SBitterblue Smith 	/* FillIQK Result */
598*32e284a2SBitterblue Smith 
599*32e284a2SBitterblue Smith 	if (tx_average == 0)
600*32e284a2SBitterblue Smith 		return;
601*32e284a2SBitterblue Smith 
602*32e284a2SBitterblue Smith 	for (i = 0; i < tx_average; i++)
603*32e284a2SBitterblue Smith 		rtw_dbg(rtwdev, RTW_DBG_RFK,
604*32e284a2SBitterblue Smith 			"tx_x0[%d] = %x ;; tx_y0[%d] = %x\n",
605*32e284a2SBitterblue Smith 			i, (tx_x0[i] >> 21) & 0x000007ff,
606*32e284a2SBitterblue Smith 			i, (tx_y0[i] >> 21) & 0x000007ff);
607*32e284a2SBitterblue Smith 
608*32e284a2SBitterblue Smith 	if (rtw88xxa_iqk_finish(tx_average, 3, tx_x0, tx_y0,
609*32e284a2SBitterblue Smith 				&tx_x, &tx_y, true, true))
610*32e284a2SBitterblue Smith 		rtw8821a_iqk_tx_fill(rtwdev, tx_x, tx_y);
611*32e284a2SBitterblue Smith 	else
612*32e284a2SBitterblue Smith 		rtw8821a_iqk_tx_fill(rtwdev, 0x200, 0x0);
613*32e284a2SBitterblue Smith 
614*32e284a2SBitterblue Smith 	if (rx_average == 0)
615*32e284a2SBitterblue Smith 		return;
616*32e284a2SBitterblue Smith 
617*32e284a2SBitterblue Smith 	for (i = 0; i < rx_average; i++) {
618*32e284a2SBitterblue Smith 		rtw_dbg(rtwdev, RTW_DBG_RFK,
619*32e284a2SBitterblue Smith 			"rx_x0[0][%d] = %x ;; rx_y0[0][%d] = %x\n",
620*32e284a2SBitterblue Smith 			i, (rx_x0[0][i] >> 21) & 0x000007ff,
621*32e284a2SBitterblue Smith 			i, (rx_y0[0][i] >> 21) & 0x000007ff);
622*32e284a2SBitterblue Smith 
623*32e284a2SBitterblue Smith 		if (rx_iqk_loop == 2)
624*32e284a2SBitterblue Smith 			rtw_dbg(rtwdev, RTW_DBG_RFK,
625*32e284a2SBitterblue Smith 				"rx_x0[1][%d] = %x ;; rx_y0[1][%d] = %x\n",
626*32e284a2SBitterblue Smith 				i, (rx_x0[1][i] >> 21) & 0x000007ff,
627*32e284a2SBitterblue Smith 				i, (rx_y0[1][i] >> 21) & 0x000007ff);
628*32e284a2SBitterblue Smith 	}
629*32e284a2SBitterblue Smith 
630*32e284a2SBitterblue Smith 	rx_finish1 = rtw88xxa_iqk_finish(rx_average, 4, rx_x0[0], rx_y0[0],
631*32e284a2SBitterblue Smith 					 &rx_x_temp, &rx_y_temp, true, true);
632*32e284a2SBitterblue Smith 
633*32e284a2SBitterblue Smith 	if (rx_finish1) {
634*32e284a2SBitterblue Smith 		rx_x = rx_x_temp;
635*32e284a2SBitterblue Smith 		rx_y = rx_y_temp;
636*32e284a2SBitterblue Smith 	}
637*32e284a2SBitterblue Smith 
638*32e284a2SBitterblue Smith 	if (rx_iqk_loop == 2) {
639*32e284a2SBitterblue Smith 		rx_finish2 = rtw88xxa_iqk_finish(rx_average, 4,
640*32e284a2SBitterblue Smith 						 rx_x0[1], rx_y0[1],
641*32e284a2SBitterblue Smith 						 &rx_x, &rx_y, true, true);
642*32e284a2SBitterblue Smith 
643*32e284a2SBitterblue Smith 		if (rx_finish1 && rx_finish2) {
644*32e284a2SBitterblue Smith 			rx_x = (rx_x + rx_x_temp) / 2;
645*32e284a2SBitterblue Smith 			rx_y = (rx_y + rx_y_temp) / 2;
646*32e284a2SBitterblue Smith 		}
647*32e284a2SBitterblue Smith 	}
648*32e284a2SBitterblue Smith 
649*32e284a2SBitterblue Smith 	if (rx_finish1 || rx_finish2)
650*32e284a2SBitterblue Smith 		rtw8821a_iqk_rx_fill(rtwdev, rx_x, rx_y);
651*32e284a2SBitterblue Smith 	else
652*32e284a2SBitterblue Smith 		rtw8821a_iqk_rx_fill(rtwdev, 0x200, 0x0);
653*32e284a2SBitterblue Smith }
654*32e284a2SBitterblue Smith 
655*32e284a2SBitterblue Smith static void rtw8821a_do_iqk(struct rtw_dev *rtwdev)
656*32e284a2SBitterblue Smith {
657*32e284a2SBitterblue Smith 	static const u32 backup_macbb_reg[MACBB_REG_NUM_8821A] = {
658*32e284a2SBitterblue Smith 		0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c
659*32e284a2SBitterblue Smith 	};
660*32e284a2SBitterblue Smith 	static const u32 backup_afe_reg[AFE_REG_NUM_8821A] = {
661*32e284a2SBitterblue Smith 		0xc5c, 0xc60, 0xc64, 0xc68
662*32e284a2SBitterblue Smith 	};
663*32e284a2SBitterblue Smith 	static const u32 backup_rf_reg[RF_REG_NUM_8821A] = {
664*32e284a2SBitterblue Smith 		0x65, 0x8f, 0x0
665*32e284a2SBitterblue Smith 	};
666*32e284a2SBitterblue Smith 	u32 macbb_backup[MACBB_REG_NUM_8821A];
667*32e284a2SBitterblue Smith 	u32 afe_backup[AFE_REG_NUM_8821A];
668*32e284a2SBitterblue Smith 	u32 rfa_backup[RF_REG_NUM_8821A];
669*32e284a2SBitterblue Smith 
670*32e284a2SBitterblue Smith 	rtw88xxa_iqk_backup_mac_bb(rtwdev, macbb_backup,
671*32e284a2SBitterblue Smith 				   backup_macbb_reg, MACBB_REG_NUM_8821A);
672*32e284a2SBitterblue Smith 	rtw88xxa_iqk_backup_afe(rtwdev, afe_backup,
673*32e284a2SBitterblue Smith 				backup_afe_reg, AFE_REG_NUM_8821A);
674*32e284a2SBitterblue Smith 	rtw8821a_iqk_backup_rf(rtwdev, rfa_backup,
675*32e284a2SBitterblue Smith 			       backup_rf_reg, RF_REG_NUM_8821A);
676*32e284a2SBitterblue Smith 
677*32e284a2SBitterblue Smith 	rtw88xxa_iqk_configure_mac(rtwdev);
678*32e284a2SBitterblue Smith 
679*32e284a2SBitterblue Smith 	rtw8821a_iqk(rtwdev);
680*32e284a2SBitterblue Smith 
681*32e284a2SBitterblue Smith 	rtw8821a_iqk_restore_rf(rtwdev, backup_rf_reg,
682*32e284a2SBitterblue Smith 				rfa_backup, RF_REG_NUM_8821A);
683*32e284a2SBitterblue Smith 	rtw8821a_iqk_restore_afe(rtwdev, afe_backup,
684*32e284a2SBitterblue Smith 				 backup_afe_reg, AFE_REG_NUM_8821A);
685*32e284a2SBitterblue Smith 	rtw88xxa_iqk_restore_mac_bb(rtwdev, macbb_backup,
686*32e284a2SBitterblue Smith 				    backup_macbb_reg, MACBB_REG_NUM_8821A);
687*32e284a2SBitterblue Smith }
688*32e284a2SBitterblue Smith 
689*32e284a2SBitterblue Smith static void rtw8821a_phy_calibration(struct rtw_dev *rtwdev)
690*32e284a2SBitterblue Smith {
691*32e284a2SBitterblue Smith 	rtw8821a_do_iqk(rtwdev);
692*32e284a2SBitterblue Smith }
693*32e284a2SBitterblue Smith 
694*32e284a2SBitterblue Smith static void rtw8821a_pwr_track(struct rtw_dev *rtwdev)
695*32e284a2SBitterblue Smith {
696*32e284a2SBitterblue Smith 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
697*32e284a2SBitterblue Smith 
698*32e284a2SBitterblue Smith 	if (!dm_info->pwr_trk_triggered) {
699*32e284a2SBitterblue Smith 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
700*32e284a2SBitterblue Smith 			     GENMASK(17, 16), 0x03);
701*32e284a2SBitterblue Smith 		dm_info->pwr_trk_triggered = true;
702*32e284a2SBitterblue Smith 		return;
703*32e284a2SBitterblue Smith 	}
704*32e284a2SBitterblue Smith 
705*32e284a2SBitterblue Smith 	rtw88xxa_phy_pwrtrack(rtwdev, NULL, rtw8821a_do_iqk);
706*32e284a2SBitterblue Smith 	dm_info->pwr_trk_triggered = false;
707*32e284a2SBitterblue Smith }
708*32e284a2SBitterblue Smith 
709*32e284a2SBitterblue Smith static void rtw8821a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
710*32e284a2SBitterblue Smith 					  struct rtw_tx_pkt_info *pkt_info,
711*32e284a2SBitterblue Smith 					  u8 *txdesc)
712*32e284a2SBitterblue Smith {
713*32e284a2SBitterblue Smith 	fill_txdesc_checksum_common(txdesc, 16);
714*32e284a2SBitterblue Smith }
715*32e284a2SBitterblue Smith 
716*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_init(struct rtw_dev *rtwdev)
717*32e284a2SBitterblue Smith {
718*32e284a2SBitterblue Smith 	u8 val8;
719*32e284a2SBitterblue Smith 
720*32e284a2SBitterblue Smith 	/* BT report packet sample rate */
721*32e284a2SBitterblue Smith 	rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
722*32e284a2SBitterblue Smith 
723*32e284a2SBitterblue Smith 	val8 = BIT_STATIS_BT_EN;
724*32e284a2SBitterblue Smith 	if (rtwdev->efuse.share_ant)
725*32e284a2SBitterblue Smith 		val8 |= BIT_R_GRANTALL_WLMASK;
726*32e284a2SBitterblue Smith 	rtw_write8(rtwdev, REG_BT_COEX_ENH_INTR_CTRL, val8);
727*32e284a2SBitterblue Smith 
728*32e284a2SBitterblue Smith 	/* enable BT counter statistics */
729*32e284a2SBitterblue Smith 	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x3);
730*32e284a2SBitterblue Smith 
731*32e284a2SBitterblue Smith 	/* enable PTA */
732*32e284a2SBitterblue Smith 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
733*32e284a2SBitterblue Smith }
734*32e284a2SBitterblue Smith 
735*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type,
736*32e284a2SBitterblue Smith 					 u8 pos_type)
737*32e284a2SBitterblue Smith {
738*32e284a2SBitterblue Smith 	bool share_ant = rtwdev->efuse.share_ant;
739*32e284a2SBitterblue Smith 	struct rtw_coex *coex = &rtwdev->coex;
740*32e284a2SBitterblue Smith 	struct rtw_coex_dm *coex_dm = &coex->dm;
741*32e284a2SBitterblue Smith 	u32 phase = coex_dm->cur_ant_pos_type;
742*32e284a2SBitterblue Smith 
743*32e284a2SBitterblue Smith 	if (!rtwdev->efuse.btcoex)
744*32e284a2SBitterblue Smith 		return;
745*32e284a2SBitterblue Smith 
746*32e284a2SBitterblue Smith 	switch (phase) {
747*32e284a2SBitterblue Smith 	case COEX_SET_ANT_POWERON:
748*32e284a2SBitterblue Smith 	case COEX_SET_ANT_INIT:
749*32e284a2SBitterblue Smith 		rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
750*32e284a2SBitterblue Smith 		rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
751*32e284a2SBitterblue Smith 		rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
752*32e284a2SBitterblue Smith 
753*32e284a2SBitterblue Smith 		rtw_write8(rtwdev, REG_RFE_CTRL8,
754*32e284a2SBitterblue Smith 			   share_ant ? PTA_CTRL_PIN : DPDT_CTRL_PIN);
755*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1);
756*32e284a2SBitterblue Smith 		break;
757*32e284a2SBitterblue Smith 	case COEX_SET_ANT_WONLY:
758*32e284a2SBitterblue Smith 		rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
759*32e284a2SBitterblue Smith 		rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
760*32e284a2SBitterblue Smith 		rtw_write8_clr(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
761*32e284a2SBitterblue Smith 
762*32e284a2SBitterblue Smith 		rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN);
763*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1);
764*32e284a2SBitterblue Smith 		break;
765*32e284a2SBitterblue Smith 	case COEX_SET_ANT_2G:
766*32e284a2SBitterblue Smith 		rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
767*32e284a2SBitterblue Smith 		rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
768*32e284a2SBitterblue Smith 		rtw_write8_clr(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
769*32e284a2SBitterblue Smith 
770*32e284a2SBitterblue Smith 		rtw_write8(rtwdev, REG_RFE_CTRL8,
771*32e284a2SBitterblue Smith 			   share_ant ? PTA_CTRL_PIN : DPDT_CTRL_PIN);
772*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1);
773*32e284a2SBitterblue Smith 		break;
774*32e284a2SBitterblue Smith 	case COEX_SET_ANT_5G:
775*32e284a2SBitterblue Smith 		rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
776*32e284a2SBitterblue Smith 		rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
777*32e284a2SBitterblue Smith 		rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
778*32e284a2SBitterblue Smith 
779*32e284a2SBitterblue Smith 		rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN);
780*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000,
781*32e284a2SBitterblue Smith 				 share_ant ? 0x2 : 0x1);
782*32e284a2SBitterblue Smith 		break;
783*32e284a2SBitterblue Smith 	case COEX_SET_ANT_WOFF:
784*32e284a2SBitterblue Smith 		rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
785*32e284a2SBitterblue Smith 		rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
786*32e284a2SBitterblue Smith 		rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL);
787*32e284a2SBitterblue Smith 
788*32e284a2SBitterblue Smith 		rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN);
789*32e284a2SBitterblue Smith 		rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000,
790*32e284a2SBitterblue Smith 				 share_ant ? 0x2 : 0x1);
791*32e284a2SBitterblue Smith 		break;
792*32e284a2SBitterblue Smith 	default:
793*32e284a2SBitterblue Smith 		rtw_warn(rtwdev, "%s: not handling phase %d\n",
794*32e284a2SBitterblue Smith 			 __func__, phase);
795*32e284a2SBitterblue Smith 		break;
796*32e284a2SBitterblue Smith 	}
797*32e284a2SBitterblue Smith }
798*32e284a2SBitterblue Smith 
799*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
800*32e284a2SBitterblue Smith {
801*32e284a2SBitterblue Smith }
802*32e284a2SBitterblue Smith 
803*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
804*32e284a2SBitterblue Smith {
805*32e284a2SBitterblue Smith }
806*32e284a2SBitterblue Smith 
807*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
808*32e284a2SBitterblue Smith {
809*32e284a2SBitterblue Smith 	struct rtw_coex *coex = &rtwdev->coex;
810*32e284a2SBitterblue Smith 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
811*32e284a2SBitterblue Smith 
812*32e284a2SBitterblue Smith 	coex_rfe->ant_switch_exist = true;
813*32e284a2SBitterblue Smith }
814*32e284a2SBitterblue Smith 
815*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
816*32e284a2SBitterblue Smith {
817*32e284a2SBitterblue Smith 	struct rtw_coex *coex = &rtwdev->coex;
818*32e284a2SBitterblue Smith 	struct rtw_coex_dm *coex_dm = &coex->dm;
819*32e284a2SBitterblue Smith 	struct rtw_efuse *efuse = &rtwdev->efuse;
820*32e284a2SBitterblue Smith 	bool share_ant = efuse->share_ant;
821*32e284a2SBitterblue Smith 
822*32e284a2SBitterblue Smith 	if (share_ant)
823*32e284a2SBitterblue Smith 		return;
824*32e284a2SBitterblue Smith 
825*32e284a2SBitterblue Smith 	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
826*32e284a2SBitterblue Smith 		return;
827*32e284a2SBitterblue Smith 
828*32e284a2SBitterblue Smith 	coex_dm->cur_wl_pwr_lvl = wl_pwr;
829*32e284a2SBitterblue Smith }
830*32e284a2SBitterblue Smith 
831*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
832*32e284a2SBitterblue Smith {
833*32e284a2SBitterblue Smith }
834*32e284a2SBitterblue Smith 
835*32e284a2SBitterblue Smith static const struct rtw_chip_ops rtw8821a_ops = {
836*32e284a2SBitterblue Smith 	.power_on		= rtw88xxa_power_on,
837*32e284a2SBitterblue Smith 	.power_off		= rtw8821a_power_off,
838*32e284a2SBitterblue Smith 	.phy_set_param		= NULL,
839*32e284a2SBitterblue Smith 	.read_efuse		= rtw88xxa_read_efuse,
840*32e284a2SBitterblue Smith 	.query_phy_status	= rtw8821a_query_phy_status,
841*32e284a2SBitterblue Smith 	.set_channel		= rtw88xxa_set_channel,
842*32e284a2SBitterblue Smith 	.mac_init		= NULL,
843*32e284a2SBitterblue Smith 	.read_rf		= rtw88xxa_phy_read_rf,
844*32e284a2SBitterblue Smith 	.write_rf		= rtw_phy_write_rf_reg_sipi,
845*32e284a2SBitterblue Smith 	.set_antenna		= NULL,
846*32e284a2SBitterblue Smith 	.set_tx_power_index	= rtw88xxa_set_tx_power_index,
847*32e284a2SBitterblue Smith 	.cfg_ldo25		= rtw8821a_cfg_ldo25,
848*32e284a2SBitterblue Smith 	.efuse_grant		= rtw88xxa_efuse_grant,
849*32e284a2SBitterblue Smith 	.false_alarm_statistics	= rtw88xxa_false_alarm_statistics,
850*32e284a2SBitterblue Smith 	.phy_calibration	= rtw8821a_phy_calibration,
851*32e284a2SBitterblue Smith 	.cck_pd_set		= rtw88xxa_phy_cck_pd_set,
852*32e284a2SBitterblue Smith 	.pwr_track		= rtw8821a_pwr_track,
853*32e284a2SBitterblue Smith 	.config_bfee		= NULL,
854*32e284a2SBitterblue Smith 	.set_gid_table		= NULL,
855*32e284a2SBitterblue Smith 	.cfg_csi_rate		= NULL,
856*32e284a2SBitterblue Smith 	.fill_txdesc_checksum	= rtw8821a_fill_txdesc_checksum,
857*32e284a2SBitterblue Smith 	.coex_set_init		= rtw8821a_coex_cfg_init,
858*32e284a2SBitterblue Smith 	.coex_set_ant_switch	= rtw8821a_coex_cfg_ant_switch,
859*32e284a2SBitterblue Smith 	.coex_set_gnt_fix	= rtw8821a_coex_cfg_gnt_fix,
860*32e284a2SBitterblue Smith 	.coex_set_gnt_debug	= rtw8821a_coex_cfg_gnt_debug,
861*32e284a2SBitterblue Smith 	.coex_set_rfe_type	= rtw8821a_coex_cfg_rfe_type,
862*32e284a2SBitterblue Smith 	.coex_set_wl_tx_power	= rtw8821a_coex_cfg_wl_tx_power,
863*32e284a2SBitterblue Smith 	.coex_set_wl_rx_gain	= rtw8821a_coex_cfg_wl_rx_gain,
864*32e284a2SBitterblue Smith };
865*32e284a2SBitterblue Smith 
866*32e284a2SBitterblue Smith static const struct rtw_page_table page_table_8821a[] = {
867*32e284a2SBitterblue Smith 	/* hq_num, nq_num, lq_num, exq_num, gapq_num */
868*32e284a2SBitterblue Smith 	{0, 0, 0, 0, 0},	/* SDIO */
869*32e284a2SBitterblue Smith 	{0, 0, 0, 0, 0},	/* PCI */
870*32e284a2SBitterblue Smith 	{8, 0, 0, 0, 1},	/* 2 bulk out endpoints */
871*32e284a2SBitterblue Smith 	{8, 0, 8, 0, 1},	/* 3 bulk out endpoints */
872*32e284a2SBitterblue Smith 	{8, 0, 8, 4, 1},	/* 4 bulk out endpoints */
873*32e284a2SBitterblue Smith };
874*32e284a2SBitterblue Smith 
875*32e284a2SBitterblue Smith static const struct rtw_rqpn rqpn_table_8821a[] = {
876*32e284a2SBitterblue Smith 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
877*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
878*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
879*32e284a2SBitterblue Smith 
880*32e284a2SBitterblue Smith 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
881*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
882*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
883*32e284a2SBitterblue Smith 
884*32e284a2SBitterblue Smith 	{RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH,
885*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
886*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
887*32e284a2SBitterblue Smith 
888*32e284a2SBitterblue Smith 	{RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL,
889*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
890*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
891*32e284a2SBitterblue Smith 
892*32e284a2SBitterblue Smith 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
893*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
894*32e284a2SBitterblue Smith 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
895*32e284a2SBitterblue Smith };
896*32e284a2SBitterblue Smith 
897*32e284a2SBitterblue Smith static const struct rtw_prioq_addrs prioq_addrs_8821a = {
898*32e284a2SBitterblue Smith 	.prio[RTW_DMA_MAPPING_EXTRA] = {
899*32e284a2SBitterblue Smith 		.rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3,
900*32e284a2SBitterblue Smith 	},
901*32e284a2SBitterblue Smith 	.prio[RTW_DMA_MAPPING_LOW] = {
902*32e284a2SBitterblue Smith 		.rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1,
903*32e284a2SBitterblue Smith 	},
904*32e284a2SBitterblue Smith 	.prio[RTW_DMA_MAPPING_NORMAL] = {
905*32e284a2SBitterblue Smith 		.rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1,
906*32e284a2SBitterblue Smith 	},
907*32e284a2SBitterblue Smith 	.prio[RTW_DMA_MAPPING_HIGH] = {
908*32e284a2SBitterblue Smith 		.rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2,
909*32e284a2SBitterblue Smith 	},
910*32e284a2SBitterblue Smith 	.wsize = false,
911*32e284a2SBitterblue Smith };
912*32e284a2SBitterblue Smith 
913*32e284a2SBitterblue Smith static const struct rtw_hw_reg rtw8821a_dig[] = {
914*32e284a2SBitterblue Smith 	[0] = { .addr = REG_RXIGI_A, .mask = 0x7f },
915*32e284a2SBitterblue Smith };
916*32e284a2SBitterblue Smith 
917*32e284a2SBitterblue Smith static const struct rtw_rfe_def rtw8821a_rfe_defs[] = {
918*32e284a2SBitterblue Smith 	[0] = { .phy_pg_tbl	= &rtw8821a_bb_pg_tbl,
919*32e284a2SBitterblue Smith 		.txpwr_lmt_tbl	= &rtw8821a_txpwr_lmt_tbl,
920*32e284a2SBitterblue Smith 		.pwr_track_tbl	= &rtw8821a_rtw_pwr_track_tbl, },
921*32e284a2SBitterblue Smith };
922*32e284a2SBitterblue Smith 
923*32e284a2SBitterblue Smith /* TODO */
924*32e284a2SBitterblue Smith /* rssi in percentage % (dbm = % - 100) */
925*32e284a2SBitterblue Smith static const u8 wl_rssi_step_8821a[] = {101, 45, 101, 40};
926*32e284a2SBitterblue Smith static const u8 bt_rssi_step_8821a[] = {101, 101, 101, 101};
927*32e284a2SBitterblue Smith 
928*32e284a2SBitterblue Smith /* table_sant_8821a, table_nsant_8821a, tdma_sant_8821a, and tdma_nsant_8821a
929*32e284a2SBitterblue Smith  * are copied from rtw8821c.c because the 8821au driver's tables are not
930*32e284a2SBitterblue Smith  * compatible with the coex code in rtw88.
931*32e284a2SBitterblue Smith  *
932*32e284a2SBitterblue Smith  * tdma case 112 (A2DP) byte 0 had to be modified from 0x61 to 0x51,
933*32e284a2SBitterblue Smith  * otherwise the firmware gets confused after pausing the music:
934*32e284a2SBitterblue Smith  * rtw_8821au 1-2:1.2: [BTCoex], Bt_info[1], len=7, data=[81 00 0a 01 00 00]
935*32e284a2SBitterblue Smith  * - 81 means PAN (personal area network) when it should be 4x (A2DP)
936*32e284a2SBitterblue Smith  * The music is not smooth with the PAN algorithm.
937*32e284a2SBitterblue Smith  */
938*32e284a2SBitterblue Smith 
939*32e284a2SBitterblue Smith /* Shared-Antenna Coex Table */
940*32e284a2SBitterblue Smith static const struct coex_table_para table_sant_8821a[] = {
941*32e284a2SBitterblue Smith 	{0x55555555, 0x55555555}, /* case-0 */
942*32e284a2SBitterblue Smith 	{0x55555555, 0x55555555},
943*32e284a2SBitterblue Smith 	{0x66555555, 0x66555555},
944*32e284a2SBitterblue Smith 	{0xaaaaaaaa, 0xaaaaaaaa},
945*32e284a2SBitterblue Smith 	{0x5a5a5a5a, 0x5a5a5a5a},
946*32e284a2SBitterblue Smith 	{0xfafafafa, 0xfafafafa}, /* case-5 */
947*32e284a2SBitterblue Smith 	{0x6a5a5555, 0xaaaaaaaa},
948*32e284a2SBitterblue Smith 	{0x6a5a56aa, 0x6a5a56aa},
949*32e284a2SBitterblue Smith 	{0x6a5a5a5a, 0x6a5a5a5a},
950*32e284a2SBitterblue Smith 	{0x66555555, 0x5a5a5a5a},
951*32e284a2SBitterblue Smith 	{0x66555555, 0x6a5a5a5a}, /* case-10 */
952*32e284a2SBitterblue Smith 	{0x66555555, 0xaaaaaaaa},
953*32e284a2SBitterblue Smith 	{0x66555555, 0x6a5a5aaa},
954*32e284a2SBitterblue Smith 	{0x66555555, 0x6aaa6aaa},
955*32e284a2SBitterblue Smith 	{0x66555555, 0x6a5a5aaa},
956*32e284a2SBitterblue Smith 	{0x66555555, 0xaaaaaaaa}, /* case-15 */
957*32e284a2SBitterblue Smith 	{0xffff55ff, 0xfafafafa},
958*32e284a2SBitterblue Smith 	{0xffff55ff, 0x6afa5afa},
959*32e284a2SBitterblue Smith 	{0xaaffffaa, 0xfafafafa},
960*32e284a2SBitterblue Smith 	{0xaa5555aa, 0x5a5a5a5a},
961*32e284a2SBitterblue Smith 	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
962*32e284a2SBitterblue Smith 	{0xaa5555aa, 0xaaaaaaaa},
963*32e284a2SBitterblue Smith 	{0xffffffff, 0x55555555},
964*32e284a2SBitterblue Smith 	{0xffffffff, 0x5a5a5a5a},
965*32e284a2SBitterblue Smith 	{0xffffffff, 0x5a5a5a5a},
966*32e284a2SBitterblue Smith 	{0xffffffff, 0x5a5a5aaa}, /* case-25 */
967*32e284a2SBitterblue Smith 	{0x55555555, 0x5a5a5a5a},
968*32e284a2SBitterblue Smith 	{0x55555555, 0xaaaaaaaa},
969*32e284a2SBitterblue Smith 	{0x66555555, 0x6a5a6a5a},
970*32e284a2SBitterblue Smith 	{0x66556655, 0x66556655},
971*32e284a2SBitterblue Smith 	{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
972*32e284a2SBitterblue Smith 	{0xffffffff, 0x5aaa5aaa},
973*32e284a2SBitterblue Smith 	{0x56555555, 0x5a5a5aaa}
974*32e284a2SBitterblue Smith };
975*32e284a2SBitterblue Smith 
976*32e284a2SBitterblue Smith /* Non-Shared-Antenna Coex Table */
977*32e284a2SBitterblue Smith static const struct coex_table_para table_nsant_8821a[] = {
978*32e284a2SBitterblue Smith 	{0xffffffff, 0xffffffff}, /* case-100 */
979*32e284a2SBitterblue Smith 	{0xffff55ff, 0xfafafafa},
980*32e284a2SBitterblue Smith 	{0x66555555, 0x66555555},
981*32e284a2SBitterblue Smith 	{0xaaaaaaaa, 0xaaaaaaaa},
982*32e284a2SBitterblue Smith 	{0x5a5a5a5a, 0x5a5a5a5a},
983*32e284a2SBitterblue Smith 	{0xffffffff, 0xffffffff}, /* case-105 */
984*32e284a2SBitterblue Smith 	{0x5afa5afa, 0x5afa5afa},
985*32e284a2SBitterblue Smith 	{0x55555555, 0xfafafafa},
986*32e284a2SBitterblue Smith 	{0x66555555, 0xfafafafa},
987*32e284a2SBitterblue Smith 	{0x66555555, 0x5a5a5a5a},
988*32e284a2SBitterblue Smith 	{0x66555555, 0x6a5a5a5a}, /* case-110 */
989*32e284a2SBitterblue Smith 	{0x66555555, 0xaaaaaaaa},
990*32e284a2SBitterblue Smith 	{0xffff55ff, 0xfafafafa},
991*32e284a2SBitterblue Smith 	{0xffff55ff, 0x5afa5afa},
992*32e284a2SBitterblue Smith 	{0xffff55ff, 0xaaaaaaaa},
993*32e284a2SBitterblue Smith 	{0xffff55ff, 0xffff55ff}, /* case-115 */
994*32e284a2SBitterblue Smith 	{0xaaffffaa, 0x5afa5afa},
995*32e284a2SBitterblue Smith 	{0xaaffffaa, 0xaaaaaaaa},
996*32e284a2SBitterblue Smith 	{0xffffffff, 0xfafafafa},
997*32e284a2SBitterblue Smith 	{0xffff55ff, 0xfafafafa},
998*32e284a2SBitterblue Smith 	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
999*32e284a2SBitterblue Smith 	{0xffff55ff, 0x5afa5afa},
1000*32e284a2SBitterblue Smith 	{0xffff55ff, 0x5afa5afa},
1001*32e284a2SBitterblue Smith 	{0x55ff55ff, 0x55ff55ff}
1002*32e284a2SBitterblue Smith };
1003*32e284a2SBitterblue Smith 
1004*32e284a2SBitterblue Smith /* Shared-Antenna TDMA */
1005*32e284a2SBitterblue Smith static const struct coex_tdma_para tdma_sant_8821a[] = {
1006*32e284a2SBitterblue Smith 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
1007*32e284a2SBitterblue Smith 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
1008*32e284a2SBitterblue Smith 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
1009*32e284a2SBitterblue Smith 	{ {0x61, 0x35, 0x03, 0x11, 0x11} },
1010*32e284a2SBitterblue Smith 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
1011*32e284a2SBitterblue Smith 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} }, /* case-5 */
1012*32e284a2SBitterblue Smith 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
1013*32e284a2SBitterblue Smith 	{ {0x61, 0x35, 0x03, 0x11, 0x10} },
1014*32e284a2SBitterblue Smith 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1015*32e284a2SBitterblue Smith 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
1016*32e284a2SBitterblue Smith 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
1017*32e284a2SBitterblue Smith 	{ {0x61, 0x08, 0x03, 0x11, 0x15} },
1018*32e284a2SBitterblue Smith 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
1019*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
1020*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
1021*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
1022*32e284a2SBitterblue Smith 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
1023*32e284a2SBitterblue Smith 	{ {0x51, 0x3a, 0x03, 0x11, 0x50} },
1024*32e284a2SBitterblue Smith 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
1025*32e284a2SBitterblue Smith 	{ {0x51, 0x21, 0x03, 0x10, 0x50} },
1026*32e284a2SBitterblue Smith 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
1027*32e284a2SBitterblue Smith 	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
1028*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x03, 0x30, 0x54} },
1029*32e284a2SBitterblue Smith 	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
1030*32e284a2SBitterblue Smith 	{ {0x65, 0x10, 0x03, 0x11, 0x10} },
1031*32e284a2SBitterblue Smith 	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
1032*32e284a2SBitterblue Smith 	{ {0x51, 0x21, 0x03, 0x10, 0x50} },
1033*32e284a2SBitterblue Smith 	{ {0x61, 0x08, 0x03, 0x11, 0x11} }
1034*32e284a2SBitterblue Smith };
1035*32e284a2SBitterblue Smith 
1036*32e284a2SBitterblue Smith /* Non-Shared-Antenna TDMA */
1037*32e284a2SBitterblue Smith static const struct coex_tdma_para tdma_nsant_8821a[] = {
1038*32e284a2SBitterblue Smith 	{ {0x00, 0x00, 0x00, 0x40, 0x00} }, /* case-100 */
1039*32e284a2SBitterblue Smith 	{ {0x61, 0x45, 0x03, 0x11, 0x11} },
1040*32e284a2SBitterblue Smith 	{ {0x61, 0x25, 0x03, 0x11, 0x11} },
1041*32e284a2SBitterblue Smith 	{ {0x61, 0x35, 0x03, 0x11, 0x11} },
1042*32e284a2SBitterblue Smith 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
1043*32e284a2SBitterblue Smith 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
1044*32e284a2SBitterblue Smith 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
1045*32e284a2SBitterblue Smith 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1046*32e284a2SBitterblue Smith 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1047*32e284a2SBitterblue Smith 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
1048*32e284a2SBitterblue Smith 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
1049*32e284a2SBitterblue Smith 	{ {0x61, 0x10, 0x03, 0x11, 0x11} },
1050*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x03, 0x10, 0x14} }, /* a2dp high rssi */
1051*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x03, 0x10, 0x54} }, /* a2dp not high rssi */
1052*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
1053*32e284a2SBitterblue Smith 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
1054*32e284a2SBitterblue Smith 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
1055*32e284a2SBitterblue Smith 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
1056*32e284a2SBitterblue Smith 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
1057*32e284a2SBitterblue Smith 	{ {0x51, 0x21, 0x03, 0x10, 0x50} },
1058*32e284a2SBitterblue Smith 	{ {0x51, 0x21, 0x03, 0x10, 0x50} }, /* case-120 */
1059*32e284a2SBitterblue Smith 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }
1060*32e284a2SBitterblue Smith };
1061*32e284a2SBitterblue Smith 
1062*32e284a2SBitterblue Smith /* TODO */
1063*32e284a2SBitterblue Smith static const struct coex_rf_para rf_para_tx_8821a[] = {
1064*32e284a2SBitterblue Smith 	{0, 0, false, 7},  /* for normal */
1065*32e284a2SBitterblue Smith 	{0, 20, false, 7}, /* for WL-CPT */
1066*32e284a2SBitterblue Smith 	{8, 17, true, 4},
1067*32e284a2SBitterblue Smith 	{7, 18, true, 4},
1068*32e284a2SBitterblue Smith 	{6, 19, true, 4},
1069*32e284a2SBitterblue Smith 	{5, 20, true, 4}
1070*32e284a2SBitterblue Smith };
1071*32e284a2SBitterblue Smith 
1072*32e284a2SBitterblue Smith static const struct coex_rf_para rf_para_rx_8821a[] = {
1073*32e284a2SBitterblue Smith 	{0, 0, false, 7},  /* for normal */
1074*32e284a2SBitterblue Smith 	{0, 20, false, 7}, /* for WL-CPT */
1075*32e284a2SBitterblue Smith 	{3, 24, true, 5},
1076*32e284a2SBitterblue Smith 	{2, 26, true, 5},
1077*32e284a2SBitterblue Smith 	{1, 27, true, 5},
1078*32e284a2SBitterblue Smith 	{0, 28, true, 5}
1079*32e284a2SBitterblue Smith };
1080*32e284a2SBitterblue Smith 
1081*32e284a2SBitterblue Smith static_assert(ARRAY_SIZE(rf_para_tx_8821a) == ARRAY_SIZE(rf_para_rx_8821a));
1082*32e284a2SBitterblue Smith 
1083*32e284a2SBitterblue Smith static const struct coex_5g_afh_map afh_5g_8821a[] = { {0, 0, 0} };
1084*32e284a2SBitterblue Smith 
1085*32e284a2SBitterblue Smith static const struct rtw_reg_domain coex_info_hw_regs_8821a[] = {
1086*32e284a2SBitterblue Smith 	{0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1087*32e284a2SBitterblue Smith 	{0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1088*32e284a2SBitterblue Smith 	{0xCBA, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1089*32e284a2SBitterblue Smith 	{0, 0, RTW_REG_DOMAIN_NL},
1090*32e284a2SBitterblue Smith 	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1091*32e284a2SBitterblue Smith 	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1092*32e284a2SBitterblue Smith 	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
1093*32e284a2SBitterblue Smith 	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1094*32e284a2SBitterblue Smith 	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
1095*32e284a2SBitterblue Smith 	{0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
1096*32e284a2SBitterblue Smith 	{0, 0, RTW_REG_DOMAIN_NL},
1097*32e284a2SBitterblue Smith 	{0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
1098*32e284a2SBitterblue Smith 	{0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
1099*32e284a2SBitterblue Smith 	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
1100*32e284a2SBitterblue Smith 	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
1101*32e284a2SBitterblue Smith 	{0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_A},
1102*32e284a2SBitterblue Smith 	{0, 0, RTW_REG_DOMAIN_NL},
1103*32e284a2SBitterblue Smith 	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1104*32e284a2SBitterblue Smith 	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1105*32e284a2SBitterblue Smith 	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
1106*32e284a2SBitterblue Smith 	{0xc50,  MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1107*32e284a2SBitterblue Smith 	{0x60A, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1108*32e284a2SBitterblue Smith };
1109*32e284a2SBitterblue Smith 
1110*32e284a2SBitterblue Smith const struct rtw_chip_info rtw8821a_hw_spec = {
1111*32e284a2SBitterblue Smith 	.ops = &rtw8821a_ops,
1112*32e284a2SBitterblue Smith 	.id = RTW_CHIP_TYPE_8821A,
1113*32e284a2SBitterblue Smith 	.fw_name = "rtw88/rtw8821a_fw.bin",
1114*32e284a2SBitterblue Smith 	.wlan_cpu = RTW_WCPU_11N,
1115*32e284a2SBitterblue Smith 	.tx_pkt_desc_sz = 40,
1116*32e284a2SBitterblue Smith 	.tx_buf_desc_sz = 16,
1117*32e284a2SBitterblue Smith 	.rx_pkt_desc_sz = 24,
1118*32e284a2SBitterblue Smith 	.rx_buf_desc_sz = 8,
1119*32e284a2SBitterblue Smith 	.phy_efuse_size = 512,
1120*32e284a2SBitterblue Smith 	.log_efuse_size = 512,
1121*32e284a2SBitterblue Smith 	.ptct_efuse_size = 96 + 1, /* TODO or just 18? */
1122*32e284a2SBitterblue Smith 	.txff_size = 65536,
1123*32e284a2SBitterblue Smith 	.rxff_size = 16128,
1124*32e284a2SBitterblue Smith 	.rsvd_drv_pg_num = 8,
1125*32e284a2SBitterblue Smith 	.txgi_factor = 1,
1126*32e284a2SBitterblue Smith 	.is_pwr_by_rate_dec = true,
1127*32e284a2SBitterblue Smith 	.max_power_index = 0x3f,
1128*32e284a2SBitterblue Smith 	.csi_buf_pg_num = 0,
1129*32e284a2SBitterblue Smith 	.band = RTW_BAND_2G | RTW_BAND_5G,
1130*32e284a2SBitterblue Smith 	.page_size = 256,
1131*32e284a2SBitterblue Smith 	.dig_min = 0x20,
1132*32e284a2SBitterblue Smith 	.ht_supported = true,
1133*32e284a2SBitterblue Smith 	.vht_supported = true,
1134*32e284a2SBitterblue Smith 	.lps_deep_mode_supported = 0,
1135*32e284a2SBitterblue Smith 	.sys_func_en = 0xFD,
1136*32e284a2SBitterblue Smith 	.pwr_on_seq = card_enable_flow_8821a,
1137*32e284a2SBitterblue Smith 	.pwr_off_seq = card_disable_flow_8821a,
1138*32e284a2SBitterblue Smith 	.page_table = page_table_8821a,
1139*32e284a2SBitterblue Smith 	.rqpn_table = rqpn_table_8821a,
1140*32e284a2SBitterblue Smith 	.prioq_addrs = &prioq_addrs_8821a,
1141*32e284a2SBitterblue Smith 	.intf_table = NULL,
1142*32e284a2SBitterblue Smith 	.dig = rtw8821a_dig,
1143*32e284a2SBitterblue Smith 	.rf_sipi_addr = {REG_LSSI_WRITE_A, REG_LSSI_WRITE_B},
1144*32e284a2SBitterblue Smith 	.ltecoex_addr = NULL,
1145*32e284a2SBitterblue Smith 	.mac_tbl = &rtw8821a_mac_tbl,
1146*32e284a2SBitterblue Smith 	.agc_tbl = &rtw8821a_agc_tbl,
1147*32e284a2SBitterblue Smith 	.bb_tbl = &rtw8821a_bb_tbl,
1148*32e284a2SBitterblue Smith 	.rf_tbl = {&rtw8821a_rf_a_tbl},
1149*32e284a2SBitterblue Smith 	.rfe_defs = rtw8821a_rfe_defs,
1150*32e284a2SBitterblue Smith 	.rfe_defs_size = ARRAY_SIZE(rtw8821a_rfe_defs),
1151*32e284a2SBitterblue Smith 	.rx_ldpc = false,
1152*32e284a2SBitterblue Smith 	.hw_feature_report = false,
1153*32e284a2SBitterblue Smith 	.c2h_ra_report_size = 4,
1154*32e284a2SBitterblue Smith 	.old_datarate_fb_limit = true,
1155*32e284a2SBitterblue Smith 	.usb_tx_agg_desc_num = 6,
1156*32e284a2SBitterblue Smith 	.iqk_threshold = 8,
1157*32e284a2SBitterblue Smith 	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
1158*32e284a2SBitterblue Smith 	.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
1159*32e284a2SBitterblue Smith 
1160*32e284a2SBitterblue Smith 	.coex_para_ver = 20190509, /* glcoex_ver_date_8821a_1ant */
1161*32e284a2SBitterblue Smith 	.bt_desired_ver = 0x62, /* But for 2 ant it's 0x5c */
1162*32e284a2SBitterblue Smith 	.scbd_support = false,
1163*32e284a2SBitterblue Smith 	.new_scbd10_def = false,
1164*32e284a2SBitterblue Smith 	.ble_hid_profile_support = false,
1165*32e284a2SBitterblue Smith 	.wl_mimo_ps_support = false,
1166*32e284a2SBitterblue Smith 	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
1167*32e284a2SBitterblue Smith 	.bt_rssi_type = COEX_BTRSSI_RATIO,
1168*32e284a2SBitterblue Smith 	.ant_isolation = 10,
1169*32e284a2SBitterblue Smith 	.rssi_tolerance = 2,
1170*32e284a2SBitterblue Smith 	.wl_rssi_step = wl_rssi_step_8821a,
1171*32e284a2SBitterblue Smith 	.bt_rssi_step = bt_rssi_step_8821a,
1172*32e284a2SBitterblue Smith 	.table_sant_num = ARRAY_SIZE(table_sant_8821a),
1173*32e284a2SBitterblue Smith 	.table_sant = table_sant_8821a,
1174*32e284a2SBitterblue Smith 	.table_nsant_num = ARRAY_SIZE(table_nsant_8821a),
1175*32e284a2SBitterblue Smith 	.table_nsant = table_nsant_8821a,
1176*32e284a2SBitterblue Smith 	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8821a),
1177*32e284a2SBitterblue Smith 	.tdma_sant = tdma_sant_8821a,
1178*32e284a2SBitterblue Smith 	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8821a),
1179*32e284a2SBitterblue Smith 	.tdma_nsant = tdma_nsant_8821a,
1180*32e284a2SBitterblue Smith 	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8821a),
1181*32e284a2SBitterblue Smith 	.wl_rf_para_tx = rf_para_tx_8821a,
1182*32e284a2SBitterblue Smith 	.wl_rf_para_rx = rf_para_rx_8821a,
1183*32e284a2SBitterblue Smith 	.bt_afh_span_bw20 = 0x20,
1184*32e284a2SBitterblue Smith 	.bt_afh_span_bw40 = 0x30,
1185*32e284a2SBitterblue Smith 	.afh_5g_num = ARRAY_SIZE(afh_5g_8821a),
1186*32e284a2SBitterblue Smith 	.afh_5g = afh_5g_8821a,
1187*32e284a2SBitterblue Smith 
1188*32e284a2SBitterblue Smith 	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8821a),
1189*32e284a2SBitterblue Smith 	.coex_info_hw_regs = coex_info_hw_regs_8821a,
1190*32e284a2SBitterblue Smith };
1191*32e284a2SBitterblue Smith EXPORT_SYMBOL(rtw8821a_hw_spec);
1192*32e284a2SBitterblue Smith 
1193*32e284a2SBitterblue Smith MODULE_FIRMWARE("rtw88/rtw8821a_fw.bin");
1194*32e284a2SBitterblue Smith 
1195*32e284a2SBitterblue Smith MODULE_AUTHOR("Realtek Corporation");
1196*32e284a2SBitterblue Smith MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821a/8811a driver");
1197*32e284a2SBitterblue Smith MODULE_LICENSE("Dual BSD/GPL");
1198