1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019  Realtek Corporation
3  */
4 
5 #include "main.h"
6 #include "coex.h"
7 #include "fw.h"
8 #include "tx.h"
9 #include "rx.h"
10 #include "phy.h"
11 #include "rtw8822b.h"
12 #include "rtw8822b_table.h"
13 #include "mac.h"
14 #include "reg.h"
15 #include "debug.h"
16 
17 static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
18 				     u8 rx_path, bool is_tx2_path);
19 
20 static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse,
21 				    struct rtw8822b_efuse *map)
22 {
23 	ether_addr_copy(efuse->addr, map->e.mac_addr);
24 }
25 
26 static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
27 {
28 	struct rtw_efuse *efuse = &rtwdev->efuse;
29 	struct rtw8822b_efuse *map;
30 	int i;
31 
32 	map = (struct rtw8822b_efuse *)log_map;
33 
34 	efuse->rfe_option = map->rfe_option;
35 	efuse->rf_board_option = map->rf_board_option;
36 	efuse->crystal_cap = map->xtal_k;
37 	efuse->pa_type_2g = map->pa_type;
38 	efuse->pa_type_5g = map->pa_type;
39 	efuse->lna_type_2g = map->lna_type_2g[0];
40 	efuse->lna_type_5g = map->lna_type_5g[0];
41 	efuse->channel_plan = map->channel_plan;
42 	efuse->country_code[0] = map->country_code[0];
43 	efuse->country_code[1] = map->country_code[1];
44 	efuse->bt_setting = map->rf_bt_setting;
45 	efuse->regd = map->rf_board_option & 0x7;
46 
47 	for (i = 0; i < 4; i++)
48 		efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
49 
50 	switch (rtw_hci_type(rtwdev)) {
51 	case RTW_HCI_TYPE_PCIE:
52 		rtw8822be_efuse_parsing(efuse, map);
53 		break;
54 	default:
55 		/* unsupported now */
56 		return -ENOTSUPP;
57 	}
58 
59 	return 0;
60 }
61 
62 static void rtw8822b_phy_rfe_init(struct rtw_dev *rtwdev)
63 {
64 	/* chip top mux */
65 	rtw_write32_mask(rtwdev, 0x64, BIT(29) | BIT(28), 0x3);
66 	rtw_write32_mask(rtwdev, 0x4c, BIT(26) | BIT(25), 0x0);
67 	rtw_write32_mask(rtwdev, 0x40, BIT(2), 0x1);
68 
69 	/* from s0 or s1 */
70 	rtw_write32_mask(rtwdev, 0x1990, 0x3f, 0x30);
71 	rtw_write32_mask(rtwdev, 0x1990, (BIT(11) | BIT(10)), 0x3);
72 
73 	/* input or output */
74 	rtw_write32_mask(rtwdev, 0x974, 0x3f, 0x3f);
75 	rtw_write32_mask(rtwdev, 0x974, (BIT(11) | BIT(10)), 0x3);
76 }
77 
78 static void rtw8822b_phy_set_param(struct rtw_dev *rtwdev)
79 {
80 	struct rtw_hal *hal = &rtwdev->hal;
81 	u8 crystal_cap;
82 	bool is_tx2_path;
83 
84 	/* power on BB/RF domain */
85 	rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
86 		       BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST);
87 	rtw_write8_set(rtwdev, REG_RF_CTRL,
88 		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
89 	rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN);
90 
91 	/* pre init before header files config */
92 	rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
93 
94 	rtw_phy_load_tables(rtwdev);
95 
96 	crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
97 	rtw_write32_mask(rtwdev, 0x24, 0x7e000000, crystal_cap);
98 	rtw_write32_mask(rtwdev, 0x28, 0x7e, crystal_cap);
99 
100 	/* post init after header files config */
101 	rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
102 
103 	is_tx2_path = false;
104 	rtw8822b_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx,
105 				 is_tx2_path);
106 	rtw_phy_init(rtwdev);
107 
108 	rtw8822b_phy_rfe_init(rtwdev);
109 }
110 
111 #define WLAN_SLOT_TIME		0x09
112 #define WLAN_PIFS_TIME		0x19
113 #define WLAN_SIFS_CCK_CONT_TX	0xA
114 #define WLAN_SIFS_OFDM_CONT_TX	0xE
115 #define WLAN_SIFS_CCK_TRX	0x10
116 #define WLAN_SIFS_OFDM_TRX	0x10
117 #define WLAN_VO_TXOP_LIMIT	0x186 /* unit : 32us */
118 #define WLAN_VI_TXOP_LIMIT	0x3BC /* unit : 32us */
119 #define WLAN_RDG_NAV		0x05
120 #define WLAN_TXOP_NAV		0x1B
121 #define WLAN_CCK_RX_TSF		0x30
122 #define WLAN_OFDM_RX_TSF	0x30
123 #define WLAN_TBTT_PROHIBIT	0x04 /* unit : 32us */
124 #define WLAN_TBTT_HOLD_TIME	0x064 /* unit : 32us */
125 #define WLAN_DRV_EARLY_INT	0x04
126 #define WLAN_BCN_DMA_TIME	0x02
127 
128 #define WLAN_RX_FILTER0		0x0FFFFFFF
129 #define WLAN_RX_FILTER2		0xFFFF
130 #define WLAN_RCR_CFG		0xE400220E
131 #define WLAN_RXPKT_MAX_SZ	12288
132 #define WLAN_RXPKT_MAX_SZ_512	(WLAN_RXPKT_MAX_SZ >> 9)
133 
134 #define WLAN_AMPDU_MAX_TIME		0x70
135 #define WLAN_RTS_LEN_TH			0xFF
136 #define WLAN_RTS_TX_TIME_TH		0x08
137 #define WLAN_MAX_AGG_PKT_LIMIT		0x20
138 #define WLAN_RTS_MAX_AGG_PKT_LIMIT	0x20
139 #define FAST_EDCA_VO_TH		0x06
140 #define FAST_EDCA_VI_TH		0x06
141 #define FAST_EDCA_BE_TH		0x06
142 #define FAST_EDCA_BK_TH		0x06
143 #define WLAN_BAR_RETRY_LIMIT		0x01
144 #define WLAN_RA_TRY_RATE_AGG_LIMIT	0x08
145 
146 #define WLAN_TX_FUNC_CFG1		0x30
147 #define WLAN_TX_FUNC_CFG2		0x30
148 #define WLAN_MAC_OPT_NORM_FUNC1		0x98
149 #define WLAN_MAC_OPT_LB_FUNC1		0x80
150 #define WLAN_MAC_OPT_FUNC2		0x30810041
151 
152 #define WLAN_SIFS_CFG	(WLAN_SIFS_CCK_CONT_TX | \
153 			(WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \
154 			(WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \
155 			(WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX))
156 
157 #define WLAN_TBTT_TIME	(WLAN_TBTT_PROHIBIT |\
158 			(WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
159 
160 #define WLAN_NAV_CFG		(WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16))
161 #define WLAN_RX_TSF_CFG		(WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8)
162 
163 static int rtw8822b_mac_init(struct rtw_dev *rtwdev)
164 {
165 	u32 value32;
166 
167 	/* protocol configuration */
168 	rtw_write8_clr(rtwdev, REG_SW_AMPDU_BURST_MODE_CTRL, BIT_PRE_TX_CMD);
169 	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
170 	rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
171 	value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
172 		  (WLAN_MAX_AGG_PKT_LIMIT << 16) |
173 		  (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24);
174 	rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32);
175 	rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2,
176 		    WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
177 	rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH);
178 	rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH);
179 	rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH);
180 	rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH);
181 	/* EDCA configuration */
182 	rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0);
183 	rtw_write16(rtwdev, REG_TXPAUSE, 0x0000);
184 	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
185 	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME);
186 	rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG);
187 	rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT);
188 	rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT);
189 	rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG);
190 	rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
191 	/* Set beacon cotnrol - enable TSF and other related functions */
192 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
193 	/* Set send beacon related registers */
194 	rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
195 	rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
196 	rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
197 	rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
198 	/* WMAC configuration */
199 	rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
200 	rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
201 	rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
202 	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
203 	rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2);
204 	rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
205 	rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
206 	rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1);
207 
208 	return 0;
209 }
210 
211 static void rtw8822b_set_channel_rfe_efem(struct rtw_dev *rtwdev, u8 channel)
212 {
213 	struct rtw_hal *hal = &rtwdev->hal;
214 	bool is_channel_2g = (channel <= 14) ? true : false;
215 
216 	if (is_channel_2g) {
217 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x705770);
218 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
219 		rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(4), 0);
220 	} else {
221 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x177517);
222 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
223 		rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(5), 0);
224 	}
225 
226 	rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
227 
228 	if (hal->antenna_rx == BB_PATH_AB ||
229 	    hal->antenna_tx == BB_PATH_AB) {
230 		/* 2TX or 2RX */
231 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
232 	} else if (hal->antenna_rx == hal->antenna_tx) {
233 		/* TXA+RXA or TXB+RXB */
234 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
235 	} else {
236 		/* TXB+RXA or TXA+RXB */
237 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
238 	}
239 }
240 
241 static void rtw8822b_set_channel_rfe_ifem(struct rtw_dev *rtwdev, u8 channel)
242 {
243 	struct rtw_hal *hal = &rtwdev->hal;
244 	bool is_channel_2g = (channel <= 14) ? true : false;
245 
246 	if (is_channel_2g) {
247 		/* signal source */
248 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x745774);
249 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
250 	} else {
251 		/* signal source */
252 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x477547);
253 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
254 	}
255 
256 	rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
257 
258 	if (is_channel_2g) {
259 		if (hal->antenna_rx == BB_PATH_AB ||
260 		    hal->antenna_tx == BB_PATH_AB) {
261 			/* 2TX or 2RX */
262 			rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
263 		} else if (hal->antenna_rx == hal->antenna_tx) {
264 			/* TXA+RXA or TXB+RXB */
265 			rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
266 		} else {
267 			/* TXB+RXA or TXA+RXB */
268 			rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
269 		}
270 	} else {
271 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa5a5);
272 	}
273 }
274 
275 enum {
276 	CCUT_IDX_1R_2G,
277 	CCUT_IDX_2R_2G,
278 	CCUT_IDX_1R_5G,
279 	CCUT_IDX_2R_5G,
280 	CCUT_IDX_NR,
281 };
282 
283 struct cca_ccut {
284 	u32 reg82c[CCUT_IDX_NR];
285 	u32 reg830[CCUT_IDX_NR];
286 	u32 reg838[CCUT_IDX_NR];
287 };
288 
289 static const struct cca_ccut cca_ifem_ccut = {
290 	{0x75C97010, 0x75C97010, 0x75C97010, 0x75C97010}, /*Reg82C*/
291 	{0x79a0eaaa, 0x79A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
292 	{0x87765541, 0x87746341, 0x87765541, 0x87746341}, /*Reg838*/
293 };
294 
295 static const struct cca_ccut cca_efem_ccut = {
296 	{0x75B86010, 0x75B76010, 0x75B86010, 0x75B76010}, /*Reg82C*/
297 	{0x79A0EAA8, 0x79A0EAAC, 0x79A0EAA8, 0x79a0eaaa}, /*Reg830*/
298 	{0x87766451, 0x87766431, 0x87766451, 0x87766431}, /*Reg838*/
299 };
300 
301 static const struct cca_ccut cca_ifem_ccut_ext = {
302 	{0x75da8010, 0x75da8010, 0x75da8010, 0x75da8010}, /*Reg82C*/
303 	{0x79a0eaaa, 0x97A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
304 	{0x87765541, 0x86666341, 0x87765561, 0x86666361}, /*Reg838*/
305 };
306 
307 static void rtw8822b_get_cca_val(const struct cca_ccut *cca_ccut, u8 col,
308 				 u32 *reg82c, u32 *reg830, u32 *reg838)
309 {
310 	*reg82c = cca_ccut->reg82c[col];
311 	*reg830 = cca_ccut->reg830[col];
312 	*reg838 = cca_ccut->reg838[col];
313 }
314 
315 struct rtw8822b_rfe_info {
316 	const struct cca_ccut *cca_ccut_2g;
317 	const struct cca_ccut *cca_ccut_5g;
318 	enum rtw_rfe_fem fem;
319 	bool ifem_ext;
320 	void (*rtw_set_channel_rfe)(struct rtw_dev *rtwdev, u8 channel);
321 };
322 
323 #define I2GE5G_CCUT(set_ch) {						\
324 	.cca_ccut_2g = &cca_ifem_ccut,					\
325 	.cca_ccut_5g = &cca_efem_ccut,					\
326 	.fem = RTW_RFE_IFEM2G_EFEM5G,					\
327 	.ifem_ext = false,						\
328 	.rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch,	\
329 	}
330 #define IFEM_EXT_CCUT(set_ch) {						\
331 	.cca_ccut_2g = &cca_ifem_ccut_ext,				\
332 	.cca_ccut_5g = &cca_ifem_ccut_ext,				\
333 	.fem = RTW_RFE_IFEM,						\
334 	.ifem_ext = true,						\
335 	.rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch,	\
336 	}
337 
338 static const struct rtw8822b_rfe_info rtw8822b_rfe_info[] = {
339 	[2] = I2GE5G_CCUT(efem),
340 	[5] = IFEM_EXT_CCUT(ifem),
341 };
342 
343 static void rtw8822b_set_channel_cca(struct rtw_dev *rtwdev, u8 channel, u8 bw,
344 				     const struct rtw8822b_rfe_info *rfe_info)
345 {
346 	struct rtw_hal *hal = &rtwdev->hal;
347 	struct rtw_efuse *efuse = &rtwdev->efuse;
348 	const struct cca_ccut *cca_ccut;
349 	u8 col;
350 	u32 reg82c, reg830, reg838;
351 	bool is_efem_cca = false, is_ifem_cca = false, is_rfe_type = false;
352 
353 	if (channel <= 14) {
354 		cca_ccut = rfe_info->cca_ccut_2g;
355 
356 		if (hal->antenna_rx == BB_PATH_A ||
357 		    hal->antenna_rx == BB_PATH_B)
358 			col = CCUT_IDX_1R_2G;
359 		else
360 			col = CCUT_IDX_2R_2G;
361 	} else {
362 		cca_ccut = rfe_info->cca_ccut_5g;
363 
364 		if (hal->antenna_rx == BB_PATH_A ||
365 		    hal->antenna_rx == BB_PATH_B)
366 			col = CCUT_IDX_1R_5G;
367 		else
368 			col = CCUT_IDX_2R_5G;
369 	}
370 
371 	rtw8822b_get_cca_val(cca_ccut, col, &reg82c, &reg830, &reg838);
372 
373 	switch (rfe_info->fem) {
374 	case RTW_RFE_IFEM:
375 	default:
376 		is_ifem_cca = true;
377 		if (rfe_info->ifem_ext)
378 			is_rfe_type = true;
379 		break;
380 	case RTW_RFE_EFEM:
381 		is_efem_cca = true;
382 		break;
383 	case RTW_RFE_IFEM2G_EFEM5G:
384 		if (channel <= 14)
385 			is_ifem_cca = true;
386 		else
387 			is_efem_cca = true;
388 		break;
389 	}
390 
391 	if (is_ifem_cca) {
392 		if ((hal->cut_version == RTW_CHIP_VER_CUT_B &&
393 		     (col == CCUT_IDX_2R_2G || col == CCUT_IDX_2R_5G) &&
394 		     bw == RTW_CHANNEL_WIDTH_40) ||
395 		    (!is_rfe_type && col == CCUT_IDX_2R_5G &&
396 		     bw == RTW_CHANNEL_WIDTH_40) ||
397 		    (efuse->rfe_option == 5 && col == CCUT_IDX_2R_5G))
398 			reg830 = 0x79a0ea28;
399 	}
400 
401 	rtw_write32_mask(rtwdev, REG_CCASEL, MASKDWORD, reg82c);
402 	rtw_write32_mask(rtwdev, REG_PDMFTH, MASKDWORD, reg830);
403 	rtw_write32_mask(rtwdev, REG_CCA2ND, MASKDWORD, reg838);
404 
405 	if (is_efem_cca && !(hal->cut_version == RTW_CHIP_VER_CUT_B))
406 		rtw_write32_mask(rtwdev, REG_L1WT, MASKDWORD, 0x9194b2b9);
407 
408 	if (bw == RTW_CHANNEL_WIDTH_20 &&
409 	    ((channel >= 52 && channel <= 64) ||
410 	     (channel >= 100 && channel <= 144)))
411 		rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf0, 0x4);
412 }
413 
414 static const u8 low_band[15] = {0x7, 0x6, 0x6, 0x5, 0x0, 0x0, 0x7, 0xff, 0x6,
415 				0x5, 0x0, 0x0, 0x7, 0x6, 0x6};
416 static const u8 middle_band[23] = {0x6, 0x5, 0x0, 0x0, 0x7, 0x6, 0x6, 0xff, 0x0,
417 				   0x0, 0x7, 0x6, 0x6, 0x5, 0x0, 0xff, 0x7, 0x6,
418 				   0x6, 0x5, 0x0, 0x0, 0x7};
419 static const u8 high_band[15] = {0x5, 0x5, 0x0, 0x7, 0x7, 0x6, 0x5, 0xff, 0x0,
420 				 0x7, 0x7, 0x6, 0x5, 0x5, 0x0};
421 
422 static void rtw8822b_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
423 {
424 #define RF18_BAND_MASK		(BIT(16) | BIT(9) | BIT(8))
425 #define RF18_BAND_2G		(0)
426 #define RF18_BAND_5G		(BIT(16) | BIT(8))
427 #define RF18_CHANNEL_MASK	(MASKBYTE0)
428 #define RF18_RFSI_MASK		(BIT(18) | BIT(17))
429 #define RF18_RFSI_GE_CH80	(BIT(17))
430 #define RF18_RFSI_GT_CH144	(BIT(18))
431 #define RF18_BW_MASK		(BIT(11) | BIT(10))
432 #define RF18_BW_20M		(BIT(11) | BIT(10))
433 #define RF18_BW_40M		(BIT(11))
434 #define RF18_BW_80M		(BIT(10))
435 #define RFBE_MASK		(BIT(17) | BIT(16) | BIT(15))
436 
437 	struct rtw_hal *hal = &rtwdev->hal;
438 	u32 rf_reg18, rf_reg_be;
439 
440 	rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
441 
442 	rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK |
443 		      RF18_BW_MASK);
444 
445 	rf_reg18 |= (channel <= 14 ? RF18_BAND_2G : RF18_BAND_5G);
446 	rf_reg18 |= (channel & RF18_CHANNEL_MASK);
447 	if (channel > 144)
448 		rf_reg18 |= RF18_RFSI_GT_CH144;
449 	else if (channel >= 80)
450 		rf_reg18 |= RF18_RFSI_GE_CH80;
451 
452 	switch (bw) {
453 	case RTW_CHANNEL_WIDTH_5:
454 	case RTW_CHANNEL_WIDTH_10:
455 	case RTW_CHANNEL_WIDTH_20:
456 	default:
457 		rf_reg18 |= RF18_BW_20M;
458 		break;
459 	case RTW_CHANNEL_WIDTH_40:
460 		rf_reg18 |= RF18_BW_40M;
461 		break;
462 	case RTW_CHANNEL_WIDTH_80:
463 		rf_reg18 |= RF18_BW_80M;
464 		break;
465 	}
466 
467 	if (channel <= 14)
468 		rf_reg_be = 0x0;
469 	else if (channel >= 36 && channel <= 64)
470 		rf_reg_be = low_band[(channel - 36) >> 1];
471 	else if (channel >= 100 && channel <= 144)
472 		rf_reg_be = middle_band[(channel - 100) >> 1];
473 	else if (channel >= 149 && channel <= 177)
474 		rf_reg_be = high_band[(channel - 149) >> 1];
475 	else
476 		goto err;
477 
478 	rtw_write_rf(rtwdev, RF_PATH_A, RF_MALSEL, RFBE_MASK, rf_reg_be);
479 
480 	/* need to set 0xdf[18]=1 before writing RF18 when channel 144 */
481 	if (channel == 144)
482 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x1);
483 	else
484 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x0);
485 
486 	rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18);
487 	if (hal->rf_type > RF_1T1R)
488 		rtw_write_rf(rtwdev, RF_PATH_B, 0x18, RFREG_MASK, rf_reg18);
489 
490 	rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0);
491 	rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1);
492 
493 	return;
494 
495 err:
496 	WARN_ON(1);
497 }
498 
499 static void rtw8822b_toggle_igi(struct rtw_dev *rtwdev)
500 {
501 	struct rtw_hal *hal = &rtwdev->hal;
502 	u32 igi;
503 
504 	igi = rtw_read32_mask(rtwdev, REG_RXIGI_A, 0x7f);
505 	rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi - 2);
506 	rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi);
507 	rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi - 2);
508 	rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi);
509 
510 	rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, 0x0);
511 	rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0,
512 			 hal->antenna_rx | (hal->antenna_rx << 4));
513 }
514 
515 static void rtw8822b_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw)
516 {
517 	if (bw == RTW_CHANNEL_WIDTH_40) {
518 		/* RX DFIR for BW40 */
519 		rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x1);
520 		rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x0);
521 		rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
522 	} else if (bw == RTW_CHANNEL_WIDTH_80) {
523 		/* RX DFIR for BW80 */
524 		rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
525 		rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1);
526 		rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
527 	} else {
528 		/* RX DFIR for BW20, BW10 and BW5*/
529 		rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
530 		rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2);
531 		rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1);
532 	}
533 }
534 
535 static void rtw8822b_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
536 				    u8 primary_ch_idx)
537 {
538 	struct rtw_efuse *efuse = &rtwdev->efuse;
539 	u8 rfe_option = efuse->rfe_option;
540 	u32 val32;
541 
542 	if (channel <= 14) {
543 		rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1);
544 		rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0);
545 		rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0);
546 		rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15);
547 
548 		rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x0);
549 		rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a);
550 		if (channel == 14) {
551 			rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x00006577);
552 			rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
553 		} else {
554 			rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x384f6577);
555 			rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x1525);
556 		}
557 
558 		rtw_write32_mask(rtwdev, REG_RFEINV, 0x300, 0x2);
559 	} else if (channel > 35) {
560 		rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1);
561 		rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1);
562 		rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0);
563 		rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 34);
564 
565 		if (channel >= 36 && channel <= 64)
566 			rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x1);
567 		else if (channel >= 100 && channel <= 144)
568 			rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x2);
569 		else if (channel >= 149)
570 			rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x3);
571 
572 		if (channel >= 36 && channel <= 48)
573 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494);
574 		else if (channel >= 52 && channel <= 64)
575 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453);
576 		else if (channel >= 100 && channel <= 116)
577 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452);
578 		else if (channel >= 118 && channel <= 177)
579 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
580 
581 		rtw_write32_mask(rtwdev, 0xcbc, 0x300, 0x1);
582 	}
583 
584 	switch (bw) {
585 	case RTW_CHANNEL_WIDTH_20:
586 	default:
587 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
588 		val32 &= 0xFFCFFC00;
589 		val32 |= (RTW_CHANNEL_WIDTH_20);
590 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
591 
592 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
593 		break;
594 	case RTW_CHANNEL_WIDTH_40:
595 		if (primary_ch_idx == 1)
596 			rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
597 		else
598 			rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
599 
600 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
601 		val32 &= 0xFF3FF300;
602 		val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_40);
603 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
604 
605 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
606 		break;
607 	case RTW_CHANNEL_WIDTH_80:
608 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
609 		val32 &= 0xFCEFCF00;
610 		val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_80);
611 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
612 
613 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
614 
615 		if (rfe_option == 2) {
616 			rtw_write32_mask(rtwdev, REG_L1PKWT, 0x0000f000, 0x6);
617 			rtw_write32_mask(rtwdev, REG_ADC40, BIT(10), 0x1);
618 		}
619 		break;
620 	case RTW_CHANNEL_WIDTH_5:
621 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
622 		val32 &= 0xEFEEFE00;
623 		val32 |= ((BIT(6) | RTW_CHANNEL_WIDTH_20));
624 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
625 
626 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
627 		rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
628 		break;
629 	case RTW_CHANNEL_WIDTH_10:
630 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
631 		val32 &= 0xEFFEFF00;
632 		val32 |= ((BIT(7) | RTW_CHANNEL_WIDTH_20));
633 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
634 
635 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
636 		rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
637 		break;
638 	}
639 }
640 
641 static void rtw8822b_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
642 				 u8 primary_chan_idx)
643 {
644 	struct rtw_efuse *efuse = &rtwdev->efuse;
645 	const struct rtw8822b_rfe_info *rfe_info;
646 
647 	if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
648 		 "rfe_option %d is out of boundary\n", efuse->rfe_option))
649 		return;
650 
651 	rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
652 
653 	rtw8822b_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
654 	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
655 	rtw8822b_set_channel_rf(rtwdev, channel, bw);
656 	rtw8822b_set_channel_rxdfir(rtwdev, bw);
657 	rtw8822b_toggle_igi(rtwdev);
658 	rtw8822b_set_channel_cca(rtwdev, channel, bw, rfe_info);
659 	(*rfe_info->rtw_set_channel_rfe)(rtwdev, channel);
660 }
661 
662 static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
663 				     u8 rx_path, bool is_tx2_path)
664 {
665 	struct rtw_efuse *efuse = &rtwdev->efuse;
666 	const struct rtw8822b_rfe_info *rfe_info;
667 	u8 ch = rtwdev->hal.current_channel;
668 	u8 tx_path_sel, rx_path_sel;
669 	int counter;
670 
671 	if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
672 		 "rfe_option %d is out of boundary\n", efuse->rfe_option))
673 		return;
674 
675 	rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
676 
677 	if ((tx_path | rx_path) & BB_PATH_A)
678 		rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x3231);
679 	else
680 		rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x1111);
681 
682 	if ((tx_path | rx_path) & BB_PATH_B)
683 		rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x3231);
684 	else
685 		rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x1111);
686 
687 	rtw_write32_mask(rtwdev, REG_CDDTXP, (BIT(19) | BIT(18)), 0x3);
688 	rtw_write32_mask(rtwdev, REG_TXPSEL, (BIT(29) | BIT(28)), 0x1);
689 	rtw_write32_mask(rtwdev, REG_TXPSEL, BIT(30), 0x1);
690 
691 	if (tx_path & BB_PATH_A) {
692 		rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x001);
693 		rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x8);
694 	} else if (tx_path & BB_PATH_B) {
695 		rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x002);
696 		rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x4);
697 	}
698 
699 	if (tx_path == BB_PATH_A || tx_path == BB_PATH_B)
700 		rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x01);
701 	else
702 		rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x43);
703 
704 	tx_path_sel = (tx_path << 4) | tx_path;
705 	rtw_write32_mask(rtwdev, REG_TXPSEL, MASKBYTE0, tx_path_sel);
706 
707 	if (tx_path != BB_PATH_A && tx_path != BB_PATH_B) {
708 		if (is_tx2_path || rtwdev->mp_mode) {
709 			rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x043);
710 			rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0xc);
711 		}
712 	}
713 
714 	rtw_write32_mask(rtwdev, REG_RXDESC, BIT(22), 0x0);
715 	rtw_write32_mask(rtwdev, REG_RXDESC, BIT(18), 0x0);
716 
717 	if (rx_path & BB_PATH_A)
718 		rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x0);
719 	else if (rx_path & BB_PATH_B)
720 		rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x5);
721 
722 	rx_path_sel = (rx_path << 4) | rx_path;
723 	rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, rx_path_sel);
724 
725 	if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
726 		rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x0);
727 		rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x0);
728 		rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x0);
729 	} else {
730 		rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x1);
731 		rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x1);
732 		rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x1);
733 	}
734 
735 	for (counter = 100; counter > 0; counter--) {
736 		u32 rf_reg33;
737 
738 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
739 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
740 
741 		udelay(2);
742 		rf_reg33 = rtw_read_rf(rtwdev, RF_PATH_A, 0x33, RFREG_MASK);
743 
744 		if (rf_reg33 == 0x00001)
745 			break;
746 	}
747 
748 	if (WARN(counter <= 0, "write RF mode table fail\n"))
749 		return;
750 
751 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
752 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
753 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x00034);
754 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x4080c);
755 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
756 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
757 
758 	rtw8822b_toggle_igi(rtwdev);
759 	rtw8822b_set_channel_cca(rtwdev, 1, RTW_CHANNEL_WIDTH_20, rfe_info);
760 	(*rfe_info->rtw_set_channel_rfe)(rtwdev, ch);
761 }
762 
763 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
764 				   struct rtw_rx_pkt_stat *pkt_stat)
765 {
766 	s8 min_rx_power = -120;
767 	u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
768 
769 	/* 8822B uses only 1 antenna to RX CCK rates */
770 	pkt_stat->rx_power[RF_PATH_A] = pwdb - 110;
771 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
772 	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
773 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
774 				     min_rx_power);
775 }
776 
777 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
778 				   struct rtw_rx_pkt_stat *pkt_stat)
779 {
780 	u8 rxsc, bw;
781 	s8 min_rx_power = -120;
782 
783 	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
784 		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
785 	else
786 		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
787 
788 	if (rxsc >= 1 && rxsc <= 8)
789 		bw = RTW_CHANNEL_WIDTH_20;
790 	else if (rxsc >= 9 && rxsc <= 12)
791 		bw = RTW_CHANNEL_WIDTH_40;
792 	else if (rxsc >= 13)
793 		bw = RTW_CHANNEL_WIDTH_80;
794 	else
795 		bw = GET_PHY_STAT_P1_RF_MODE(phy_status);
796 
797 	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
798 	pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110;
799 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 2);
800 	pkt_stat->bw = bw;
801 	pkt_stat->signal_power = max3(pkt_stat->rx_power[RF_PATH_A],
802 				      pkt_stat->rx_power[RF_PATH_B],
803 				      min_rx_power);
804 }
805 
806 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
807 			     struct rtw_rx_pkt_stat *pkt_stat)
808 {
809 	u8 page;
810 
811 	page = *phy_status & 0xf;
812 
813 	switch (page) {
814 	case 0:
815 		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
816 		break;
817 	case 1:
818 		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
819 		break;
820 	default:
821 		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
822 		return;
823 	}
824 }
825 
826 static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
827 				   struct rtw_rx_pkt_stat *pkt_stat,
828 				   struct ieee80211_rx_status *rx_status)
829 {
830 	struct ieee80211_hdr *hdr;
831 	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
832 	u8 *phy_status = NULL;
833 
834 	memset(pkt_stat, 0, sizeof(*pkt_stat));
835 
836 	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
837 	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
838 	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
839 	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc);
840 	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
841 	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
842 	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
843 	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
844 	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
845 	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
846 	pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
847 	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
848 
849 	/* drv_info_sz is in unit of 8-bytes */
850 	pkt_stat->drv_info_sz *= 8;
851 
852 	/* c2h cmd pkt's rx/phy status is not interested */
853 	if (pkt_stat->is_c2h)
854 		return;
855 
856 	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
857 				       pkt_stat->drv_info_sz);
858 	if (pkt_stat->phy_status) {
859 		phy_status = rx_desc + desc_sz + pkt_stat->shift;
860 		query_phy_status(rtwdev, phy_status, pkt_stat);
861 	}
862 
863 	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
864 }
865 
866 static void
867 rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
868 {
869 	struct rtw_hal *hal = &rtwdev->hal;
870 	static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
871 	static u32 phy_pwr_idx;
872 	u8 rate, rate_idx, pwr_index, shift;
873 	int j;
874 
875 	for (j = 0; j < rtw_rate_size[rs]; j++) {
876 		rate = rtw_rate_section[rs][j];
877 		pwr_index = hal->tx_pwr_tbl[path][rate];
878 		shift = rate & 0x3;
879 		phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
880 		if (shift == 0x3) {
881 			rate_idx = rate & 0xfc;
882 			rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
883 				    phy_pwr_idx);
884 			phy_pwr_idx = 0;
885 		}
886 	}
887 }
888 
889 static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev)
890 {
891 	struct rtw_hal *hal = &rtwdev->hal;
892 	int rs, path;
893 
894 	for (path = 0; path < hal->rf_path_num; path++) {
895 		for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
896 			rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs);
897 	}
898 }
899 
900 static bool rtw8822b_check_rf_path(u8 antenna)
901 {
902 	switch (antenna) {
903 	case BB_PATH_A:
904 	case BB_PATH_B:
905 	case BB_PATH_AB:
906 		return true;
907 	default:
908 		return false;
909 	}
910 }
911 
912 static void rtw8822b_set_antenna(struct rtw_dev *rtwdev, u8 antenna_tx,
913 				 u8 antenna_rx)
914 {
915 	struct rtw_hal *hal = &rtwdev->hal;
916 
917 	rtw_dbg(rtwdev, RTW_DBG_PHY, "config RF path, tx=0x%x rx=0x%x\n",
918 		antenna_tx, antenna_rx);
919 
920 	if (!rtw8822b_check_rf_path(antenna_tx)) {
921 		rtw_info(rtwdev, "unsupport tx path, set to default path ab\n");
922 		antenna_tx = BB_PATH_AB;
923 	}
924 	if (!rtw8822b_check_rf_path(antenna_rx)) {
925 		rtw_info(rtwdev, "unsupport rx path, set to default path ab\n");
926 		antenna_rx = BB_PATH_AB;
927 	}
928 	hal->antenna_tx = antenna_tx;
929 	hal->antenna_rx = antenna_rx;
930 	rtw8822b_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false);
931 }
932 
933 static void rtw8822b_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
934 {
935 	u8 ldo_pwr;
936 
937 	ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
938 	ldo_pwr = enable ? ldo_pwr | BIT(7) : ldo_pwr & ~BIT(7);
939 	rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
940 }
941 
942 static void rtw8822b_false_alarm_statistics(struct rtw_dev *rtwdev)
943 {
944 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
945 	u32 cck_enable;
946 	u32 cck_fa_cnt;
947 	u32 ofdm_fa_cnt;
948 	u32 crc32_cnt;
949 
950 	cck_enable = rtw_read32(rtwdev, 0x808) & BIT(28);
951 	cck_fa_cnt = rtw_read16(rtwdev, 0xa5c);
952 	ofdm_fa_cnt = rtw_read16(rtwdev, 0xf48);
953 
954 	dm_info->cck_fa_cnt = cck_fa_cnt;
955 	dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
956 	dm_info->total_fa_cnt = ofdm_fa_cnt;
957 	dm_info->total_fa_cnt += cck_enable ? cck_fa_cnt : 0;
958 
959 	crc32_cnt = rtw_read32(rtwdev, 0xf04);
960 	dm_info->cck_ok_cnt = crc32_cnt & 0xffff;
961 	dm_info->cck_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
962 	crc32_cnt = rtw_read32(rtwdev, 0xf14);
963 	dm_info->ofdm_ok_cnt = crc32_cnt & 0xffff;
964 	dm_info->ofdm_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
965 	crc32_cnt = rtw_read32(rtwdev, 0xf10);
966 	dm_info->ht_ok_cnt = crc32_cnt & 0xffff;
967 	dm_info->ht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
968 	crc32_cnt = rtw_read32(rtwdev, 0xf0c);
969 	dm_info->vht_ok_cnt = crc32_cnt & 0xffff;
970 	dm_info->vht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
971 
972 	rtw_write32_set(rtwdev, 0x9a4, BIT(17));
973 	rtw_write32_clr(rtwdev, 0x9a4, BIT(17));
974 	rtw_write32_clr(rtwdev, 0xa2c, BIT(15));
975 	rtw_write32_set(rtwdev, 0xa2c, BIT(15));
976 	rtw_write32_set(rtwdev, 0xb58, BIT(0));
977 	rtw_write32_clr(rtwdev, 0xb58, BIT(0));
978 }
979 
980 static void rtw8822b_do_iqk(struct rtw_dev *rtwdev)
981 {
982 	static int do_iqk_cnt;
983 	struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
984 	u32 rf_reg, iqk_fail_mask;
985 	int counter;
986 	bool reload;
987 
988 	rtw_fw_do_iqk(rtwdev, &para);
989 
990 	for (counter = 0; counter < 300; counter++) {
991 		rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK);
992 		if (rf_reg == 0xabcde)
993 			break;
994 		msleep(20);
995 	}
996 	rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
997 
998 	reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
999 	iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0));
1000 	rtw_dbg(rtwdev, RTW_DBG_PHY,
1001 		"iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n",
1002 		counter, reload, ++do_iqk_cnt, iqk_fail_mask);
1003 }
1004 
1005 static void rtw8822b_phy_calibration(struct rtw_dev *rtwdev)
1006 {
1007 	rtw8822b_do_iqk(rtwdev);
1008 }
1009 
1010 static void rtw8822b_coex_cfg_init(struct rtw_dev *rtwdev)
1011 {
1012 	/* enable TBTT nterrupt */
1013 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
1014 
1015 	/* BT report packet sample rate */
1016 	/* 0x790[5:0]=0x5 */
1017 	rtw_write8_set(rtwdev, REG_BT_TDMA_TIME, 0x05);
1018 
1019 	/* enable BT counter statistics */
1020 	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
1021 
1022 	/* enable PTA (3-wire function form BT side) */
1023 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
1024 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_AOD_GPIO3);
1025 
1026 	/* enable PTA (tx/rx signal form WiFi side) */
1027 	rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
1028 	/* wl tx signal to PTA not case EDCCA */
1029 	rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
1030 	/* GNT_BT=1 while select both */
1031 	rtw_write8_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY);
1032 }
1033 
1034 static void rtw8822b_coex_cfg_ant_switch(struct rtw_dev *rtwdev,
1035 					 u8 ctrl_type, u8 pos_type)
1036 {
1037 	struct rtw_coex *coex = &rtwdev->coex;
1038 	struct rtw_coex_dm *coex_dm = &coex->dm;
1039 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1040 	bool polarity_inverse;
1041 	u8 regval = 0;
1042 
1043 	if (((ctrl_type << 8) + pos_type) == coex_dm->cur_switch_status)
1044 		return;
1045 
1046 	coex_dm->cur_switch_status = (ctrl_type << 8) + pos_type;
1047 
1048 	if (coex_rfe->ant_switch_diversity &&
1049 	    ctrl_type == COEX_SWITCH_CTRL_BY_BBSW)
1050 		ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV;
1051 
1052 	polarity_inverse = (coex_rfe->ant_switch_polarity == 1);
1053 
1054 	switch (ctrl_type) {
1055 	default:
1056 	case COEX_SWITCH_CTRL_BY_BBSW:
1057 		/* 0x4c[23] = 0 */
1058 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1059 		/* 0x4c[24] = 1 */
1060 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1061 		/* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
1062 		rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x77);
1063 
1064 		if (pos_type == COEX_SWITCH_TO_WLG_BT) {
1065 			if (coex_rfe->rfe_module_type != 0x4 &&
1066 			    coex_rfe->rfe_module_type != 0x2)
1067 				regval = 0x3;
1068 			else
1069 				regval = (!polarity_inverse ? 0x2 : 0x1);
1070 		} else if (pos_type == COEX_SWITCH_TO_WLG) {
1071 			regval = (!polarity_inverse ? 0x2 : 0x1);
1072 		} else {
1073 			regval = (!polarity_inverse ? 0x1 : 0x2);
1074 		}
1075 
1076 		rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
1077 		break;
1078 	case COEX_SWITCH_CTRL_BY_PTA:
1079 		/* 0x4c[23] = 0 */
1080 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1081 		/* 0x4c[24] = 1 */
1082 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1083 		/* PTA,  DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
1084 		rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x66);
1085 
1086 		regval = (!polarity_inverse ? 0x2 : 0x1);
1087 		rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
1088 		break;
1089 	case COEX_SWITCH_CTRL_BY_ANTDIV:
1090 		/* 0x4c[23] = 0 */
1091 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1092 		/* 0x4c[24] = 1 */
1093 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1094 		rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x88);
1095 		break;
1096 	case COEX_SWITCH_CTRL_BY_MAC:
1097 		/* 0x4c[23] = 1 */
1098 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x1);
1099 
1100 		regval = (!polarity_inverse ? 0x0 : 0x1);
1101 		rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA, regval);
1102 		break;
1103 	case COEX_SWITCH_CTRL_BY_FW:
1104 		/* 0x4c[23] = 0 */
1105 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1106 		/* 0x4c[24] = 1 */
1107 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1108 		break;
1109 	case COEX_SWITCH_CTRL_BY_BT:
1110 		/* 0x4c[23] = 0 */
1111 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1112 		/* 0x4c[24] = 0 */
1113 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x0);
1114 		break;
1115 	}
1116 }
1117 
1118 static void rtw8822b_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
1119 {
1120 }
1121 
1122 static void rtw8822b_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
1123 {
1124 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT_BTGP_SPI_EN >> 16, 0);
1125 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT_BTGP_JTAG_EN >> 24, 0);
1126 	rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT_FSPI_EN >> 16, 0);
1127 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 1, BIT_LED1DIS >> 8, 0);
1128 	rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT_DBG_GNT_WL_BT >> 24, 0);
1129 }
1130 
1131 static void rtw8822b_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
1132 {
1133 	struct rtw_coex *coex = &rtwdev->coex;
1134 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1135 	struct rtw_efuse *efuse = &rtwdev->efuse;
1136 	bool is_ext_fem = false;
1137 
1138 	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
1139 	coex_rfe->ant_switch_polarity = 0;
1140 	coex_rfe->ant_switch_diversity = false;
1141 	if (coex_rfe->rfe_module_type == 0x12 ||
1142 	    coex_rfe->rfe_module_type == 0x15 ||
1143 	    coex_rfe->rfe_module_type == 0x16)
1144 		coex_rfe->ant_switch_exist = false;
1145 	else
1146 		coex_rfe->ant_switch_exist = true;
1147 
1148 	if (coex_rfe->rfe_module_type == 2 ||
1149 	    coex_rfe->rfe_module_type == 4) {
1150 		rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, true);
1151 		is_ext_fem = true;
1152 	} else {
1153 		rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, false);
1154 	}
1155 
1156 	coex_rfe->wlg_at_btg = false;
1157 
1158 	if (efuse->share_ant &&
1159 	    coex_rfe->ant_switch_exist && !is_ext_fem)
1160 		coex_rfe->ant_switch_with_bt = true;
1161 	else
1162 		coex_rfe->ant_switch_with_bt = false;
1163 
1164 	/* Ext switch buffer mux */
1165 	rtw_write8(rtwdev, REG_RFE_CTRL_E, 0xff);
1166 	rtw_write8_mask(rtwdev, REG_RFESEL_CTRL + 1, 0x3, 0x0);
1167 	rtw_write8_mask(rtwdev, REG_RFE_INV16, BIT_RFE_BUF_EN, 0x0);
1168 
1169 	/* Disable LTE Coex Function in WiFi side */
1170 	rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0);
1171 
1172 	/* BTC_CTT_WL_VS_LTE */
1173 	rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1174 
1175 	/* BTC_CTT_BT_VS_LTE */
1176 	rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
1177 }
1178 
1179 static void rtw8822b_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
1180 {
1181 	struct rtw_coex *coex = &rtwdev->coex;
1182 	struct rtw_coex_dm *coex_dm = &coex->dm;
1183 	static const u16 reg_addr[] = {0xc58, 0xe58};
1184 	static const u8	wl_tx_power[] = {0xd8, 0xd4, 0xd0, 0xcc, 0xc8};
1185 	u8 i, pwr;
1186 
1187 	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
1188 		return;
1189 
1190 	coex_dm->cur_wl_pwr_lvl = wl_pwr;
1191 
1192 	if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
1193 		coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
1194 
1195 	pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
1196 
1197 	for (i = 0; i < ARRAY_SIZE(reg_addr); i++)
1198 		rtw_write8_mask(rtwdev, reg_addr[i], 0xff, pwr);
1199 }
1200 
1201 static void rtw8822b_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
1202 {
1203 	struct rtw_coex *coex = &rtwdev->coex;
1204 	struct rtw_coex_dm *coex_dm = &coex->dm;
1205 	/* WL Rx Low gain on */
1206 	static const u32 wl_rx_low_gain_on[] = {
1207 		0xff000003, 0xbd120003, 0xbe100003, 0xbf080003, 0xbf060003,
1208 		0xbf050003, 0xbc140003, 0xbb160003, 0xba180003, 0xb91a0003,
1209 		0xb81c0003, 0xb71e0003, 0xb4200003, 0xb5220003, 0xb4240003,
1210 		0xb3260003, 0xb2280003, 0xb12a0003, 0xb02c0003, 0xaf2e0003,
1211 		0xae300003, 0xad320003, 0xac340003, 0xab360003, 0x8d380003,
1212 		0x8c3a0003, 0x8b3c0003, 0x8a3e0003, 0x6e400003, 0x6d420003,
1213 		0x6c440003, 0x6b460003, 0x6a480003, 0x694a0003, 0x684c0003,
1214 		0x674e0003, 0x66500003, 0x65520003, 0x64540003, 0x64560003,
1215 		0x007e0403
1216 	};
1217 
1218 	/* WL Rx Low gain off */
1219 	static const u32 wl_rx_low_gain_off[] = {
1220 		0xff000003, 0xf4120003, 0xf5100003, 0xf60e0003, 0xf70c0003,
1221 		0xf80a0003, 0xf3140003, 0xf2160003, 0xf1180003, 0xf01a0003,
1222 		0xef1c0003, 0xee1e0003, 0xed200003, 0xec220003, 0xeb240003,
1223 		0xea260003, 0xe9280003, 0xe82a0003, 0xe72c0003, 0xe62e0003,
1224 		0xe5300003, 0xc8320003, 0xc7340003, 0xc6360003, 0xc5380003,
1225 		0xc43a0003, 0xc33c0003, 0xc23e0003, 0xc1400003, 0xc0420003,
1226 		0xa5440003, 0xa4460003, 0xa3480003, 0xa24a0003, 0xa14c0003,
1227 		0x834e0003, 0x82500003, 0x81520003, 0x80540003, 0x65560003,
1228 		0x007e0403
1229 	};
1230 	u8 i;
1231 
1232 	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
1233 		return;
1234 
1235 	coex_dm->cur_wl_rx_low_gain_en = low_gain;
1236 
1237 	if (coex_dm->cur_wl_rx_low_gain_en) {
1238 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
1239 			rtw_write32(rtwdev, REG_RX_GAIN_EN, wl_rx_low_gain_on[i]);
1240 
1241 		/* set Rx filter corner RCK offset */
1242 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x1);
1243 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x3f);
1244 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x1);
1245 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x3f);
1246 	} else {
1247 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
1248 			rtw_write32(rtwdev, 0x81c, wl_rx_low_gain_off[i]);
1249 
1250 		/* set Rx filter corner RCK offset */
1251 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x4);
1252 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x0);
1253 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x4);
1254 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x0);
1255 	}
1256 }
1257 
1258 static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = {
1259 	{0x0086,
1260 	 RTW_PWR_CUT_ALL_MSK,
1261 	 RTW_PWR_INTF_SDIO_MSK,
1262 	 RTW_PWR_ADDR_SDIO,
1263 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1264 	{0x0086,
1265 	 RTW_PWR_CUT_ALL_MSK,
1266 	 RTW_PWR_INTF_SDIO_MSK,
1267 	 RTW_PWR_ADDR_SDIO,
1268 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1269 	{0x004A,
1270 	 RTW_PWR_CUT_ALL_MSK,
1271 	 RTW_PWR_INTF_USB_MSK,
1272 	 RTW_PWR_ADDR_MAC,
1273 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1274 	{0x0005,
1275 	 RTW_PWR_CUT_ALL_MSK,
1276 	 RTW_PWR_INTF_ALL_MSK,
1277 	 RTW_PWR_ADDR_MAC,
1278 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0},
1279 	{0x0300,
1280 	 RTW_PWR_CUT_ALL_MSK,
1281 	 RTW_PWR_INTF_PCI_MSK,
1282 	 RTW_PWR_ADDR_MAC,
1283 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1284 	{0x0301,
1285 	 RTW_PWR_CUT_ALL_MSK,
1286 	 RTW_PWR_INTF_PCI_MSK,
1287 	 RTW_PWR_ADDR_MAC,
1288 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1289 	{0xFFFF,
1290 	 RTW_PWR_CUT_ALL_MSK,
1291 	 RTW_PWR_INTF_ALL_MSK,
1292 	 0,
1293 	 RTW_PWR_CMD_END, 0, 0},
1294 };
1295 
1296 static struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822b[] = {
1297 	{0x0012,
1298 	 RTW_PWR_CUT_ALL_MSK,
1299 	 RTW_PWR_INTF_ALL_MSK,
1300 	 RTW_PWR_ADDR_MAC,
1301 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1302 	{0x0012,
1303 	 RTW_PWR_CUT_ALL_MSK,
1304 	 RTW_PWR_INTF_ALL_MSK,
1305 	 RTW_PWR_ADDR_MAC,
1306 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1307 	{0x0020,
1308 	 RTW_PWR_CUT_ALL_MSK,
1309 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1310 	 RTW_PWR_ADDR_MAC,
1311 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1312 	{0x0001,
1313 	 RTW_PWR_CUT_ALL_MSK,
1314 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1315 	 RTW_PWR_ADDR_MAC,
1316 	 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
1317 	{0x0000,
1318 	 RTW_PWR_CUT_ALL_MSK,
1319 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1320 	 RTW_PWR_ADDR_MAC,
1321 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
1322 	{0x0005,
1323 	 RTW_PWR_CUT_ALL_MSK,
1324 	 RTW_PWR_INTF_ALL_MSK,
1325 	 RTW_PWR_ADDR_MAC,
1326 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
1327 	{0x0075,
1328 	 RTW_PWR_CUT_ALL_MSK,
1329 	 RTW_PWR_INTF_PCI_MSK,
1330 	 RTW_PWR_ADDR_MAC,
1331 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1332 	{0x0006,
1333 	 RTW_PWR_CUT_ALL_MSK,
1334 	 RTW_PWR_INTF_ALL_MSK,
1335 	 RTW_PWR_ADDR_MAC,
1336 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1337 	{0x0075,
1338 	 RTW_PWR_CUT_ALL_MSK,
1339 	 RTW_PWR_INTF_PCI_MSK,
1340 	 RTW_PWR_ADDR_MAC,
1341 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1342 	{0xFF1A,
1343 	 RTW_PWR_CUT_ALL_MSK,
1344 	 RTW_PWR_INTF_USB_MSK,
1345 	 RTW_PWR_ADDR_MAC,
1346 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1347 	{0x0006,
1348 	 RTW_PWR_CUT_ALL_MSK,
1349 	 RTW_PWR_INTF_ALL_MSK,
1350 	 RTW_PWR_ADDR_MAC,
1351 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1352 	{0x0005,
1353 	 RTW_PWR_CUT_ALL_MSK,
1354 	 RTW_PWR_INTF_ALL_MSK,
1355 	 RTW_PWR_ADDR_MAC,
1356 	 RTW_PWR_CMD_WRITE, BIT(7), 0},
1357 	{0x0005,
1358 	 RTW_PWR_CUT_ALL_MSK,
1359 	 RTW_PWR_INTF_ALL_MSK,
1360 	 RTW_PWR_ADDR_MAC,
1361 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
1362 	{0x10C3,
1363 	 RTW_PWR_CUT_ALL_MSK,
1364 	 RTW_PWR_INTF_USB_MSK,
1365 	 RTW_PWR_ADDR_MAC,
1366 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1367 	{0x0005,
1368 	 RTW_PWR_CUT_ALL_MSK,
1369 	 RTW_PWR_INTF_ALL_MSK,
1370 	 RTW_PWR_ADDR_MAC,
1371 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1372 	{0x0005,
1373 	 RTW_PWR_CUT_ALL_MSK,
1374 	 RTW_PWR_INTF_ALL_MSK,
1375 	 RTW_PWR_ADDR_MAC,
1376 	 RTW_PWR_CMD_POLLING, BIT(0), 0},
1377 	{0x0020,
1378 	 RTW_PWR_CUT_ALL_MSK,
1379 	 RTW_PWR_INTF_ALL_MSK,
1380 	 RTW_PWR_ADDR_MAC,
1381 	 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
1382 	{0x10A8,
1383 	 RTW_PWR_CUT_C_MSK,
1384 	 RTW_PWR_INTF_ALL_MSK,
1385 	 RTW_PWR_ADDR_MAC,
1386 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1387 	{0x10A9,
1388 	 RTW_PWR_CUT_C_MSK,
1389 	 RTW_PWR_INTF_ALL_MSK,
1390 	 RTW_PWR_ADDR_MAC,
1391 	 RTW_PWR_CMD_WRITE, 0xFF, 0xef},
1392 	{0x10AA,
1393 	 RTW_PWR_CUT_C_MSK,
1394 	 RTW_PWR_INTF_ALL_MSK,
1395 	 RTW_PWR_ADDR_MAC,
1396 	 RTW_PWR_CMD_WRITE, 0xFF, 0x0c},
1397 	{0x0068,
1398 	 RTW_PWR_CUT_C_MSK,
1399 	 RTW_PWR_INTF_SDIO_MSK,
1400 	 RTW_PWR_ADDR_MAC,
1401 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1402 	{0x0029,
1403 	 RTW_PWR_CUT_ALL_MSK,
1404 	 RTW_PWR_INTF_ALL_MSK,
1405 	 RTW_PWR_ADDR_MAC,
1406 	 RTW_PWR_CMD_WRITE, 0xFF, 0xF9},
1407 	{0x0024,
1408 	 RTW_PWR_CUT_ALL_MSK,
1409 	 RTW_PWR_INTF_ALL_MSK,
1410 	 RTW_PWR_ADDR_MAC,
1411 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
1412 	{0x0074,
1413 	 RTW_PWR_CUT_ALL_MSK,
1414 	 RTW_PWR_INTF_PCI_MSK,
1415 	 RTW_PWR_ADDR_MAC,
1416 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1417 	{0x00AF,
1418 	 RTW_PWR_CUT_ALL_MSK,
1419 	 RTW_PWR_INTF_ALL_MSK,
1420 	 RTW_PWR_ADDR_MAC,
1421 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1422 	{0xFFFF,
1423 	 RTW_PWR_CUT_ALL_MSK,
1424 	 RTW_PWR_INTF_ALL_MSK,
1425 	 0,
1426 	 RTW_PWR_CMD_END, 0, 0},
1427 };
1428 
1429 static struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822b[] = {
1430 	{0x0003,
1431 	 RTW_PWR_CUT_ALL_MSK,
1432 	 RTW_PWR_INTF_SDIO_MSK,
1433 	 RTW_PWR_ADDR_MAC,
1434 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
1435 	{0x0093,
1436 	 RTW_PWR_CUT_ALL_MSK,
1437 	 RTW_PWR_INTF_ALL_MSK,
1438 	 RTW_PWR_ADDR_MAC,
1439 	 RTW_PWR_CMD_WRITE, BIT(3), 0},
1440 	{0x001F,
1441 	 RTW_PWR_CUT_ALL_MSK,
1442 	 RTW_PWR_INTF_ALL_MSK,
1443 	 RTW_PWR_ADDR_MAC,
1444 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1445 	{0x00EF,
1446 	 RTW_PWR_CUT_ALL_MSK,
1447 	 RTW_PWR_INTF_ALL_MSK,
1448 	 RTW_PWR_ADDR_MAC,
1449 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1450 	{0xFF1A,
1451 	 RTW_PWR_CUT_ALL_MSK,
1452 	 RTW_PWR_INTF_USB_MSK,
1453 	 RTW_PWR_ADDR_MAC,
1454 	 RTW_PWR_CMD_WRITE, 0xFF, 0x30},
1455 	{0x0049,
1456 	 RTW_PWR_CUT_ALL_MSK,
1457 	 RTW_PWR_INTF_ALL_MSK,
1458 	 RTW_PWR_ADDR_MAC,
1459 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1460 	{0x0006,
1461 	 RTW_PWR_CUT_ALL_MSK,
1462 	 RTW_PWR_INTF_ALL_MSK,
1463 	 RTW_PWR_ADDR_MAC,
1464 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1465 	{0x0002,
1466 	 RTW_PWR_CUT_ALL_MSK,
1467 	 RTW_PWR_INTF_ALL_MSK,
1468 	 RTW_PWR_ADDR_MAC,
1469 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1470 	{0x10C3,
1471 	 RTW_PWR_CUT_ALL_MSK,
1472 	 RTW_PWR_INTF_USB_MSK,
1473 	 RTW_PWR_ADDR_MAC,
1474 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1475 	{0x0005,
1476 	 RTW_PWR_CUT_ALL_MSK,
1477 	 RTW_PWR_INTF_ALL_MSK,
1478 	 RTW_PWR_ADDR_MAC,
1479 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1480 	{0x0005,
1481 	 RTW_PWR_CUT_ALL_MSK,
1482 	 RTW_PWR_INTF_ALL_MSK,
1483 	 RTW_PWR_ADDR_MAC,
1484 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
1485 	{0x0020,
1486 	 RTW_PWR_CUT_ALL_MSK,
1487 	 RTW_PWR_INTF_ALL_MSK,
1488 	 RTW_PWR_ADDR_MAC,
1489 	 RTW_PWR_CMD_WRITE, BIT(3), 0},
1490 	{0x0000,
1491 	 RTW_PWR_CUT_ALL_MSK,
1492 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1493 	 RTW_PWR_ADDR_MAC,
1494 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1495 	{0xFFFF,
1496 	 RTW_PWR_CUT_ALL_MSK,
1497 	 RTW_PWR_INTF_ALL_MSK,
1498 	 0,
1499 	 RTW_PWR_CMD_END, 0, 0},
1500 };
1501 
1502 static struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822b[] = {
1503 	{0x0005,
1504 	 RTW_PWR_CUT_ALL_MSK,
1505 	 RTW_PWR_INTF_SDIO_MSK,
1506 	 RTW_PWR_ADDR_MAC,
1507 	 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
1508 	{0x0007,
1509 	 RTW_PWR_CUT_ALL_MSK,
1510 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1511 	 RTW_PWR_ADDR_MAC,
1512 	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
1513 	{0x0067,
1514 	 RTW_PWR_CUT_ALL_MSK,
1515 	 RTW_PWR_INTF_ALL_MSK,
1516 	 RTW_PWR_ADDR_MAC,
1517 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
1518 	{0x0005,
1519 	 RTW_PWR_CUT_ALL_MSK,
1520 	 RTW_PWR_INTF_PCI_MSK,
1521 	 RTW_PWR_ADDR_MAC,
1522 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
1523 	{0x004A,
1524 	 RTW_PWR_CUT_ALL_MSK,
1525 	 RTW_PWR_INTF_USB_MSK,
1526 	 RTW_PWR_ADDR_MAC,
1527 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1528 	{0x0067,
1529 	 RTW_PWR_CUT_ALL_MSK,
1530 	 RTW_PWR_INTF_SDIO_MSK,
1531 	 RTW_PWR_ADDR_MAC,
1532 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
1533 	{0x0067,
1534 	 RTW_PWR_CUT_ALL_MSK,
1535 	 RTW_PWR_INTF_SDIO_MSK,
1536 	 RTW_PWR_ADDR_MAC,
1537 	 RTW_PWR_CMD_WRITE, BIT(4), 0},
1538 	{0x004F,
1539 	 RTW_PWR_CUT_ALL_MSK,
1540 	 RTW_PWR_INTF_SDIO_MSK,
1541 	 RTW_PWR_ADDR_MAC,
1542 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1543 	{0x0067,
1544 	 RTW_PWR_CUT_ALL_MSK,
1545 	 RTW_PWR_INTF_SDIO_MSK,
1546 	 RTW_PWR_ADDR_MAC,
1547 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1548 	{0x0046,
1549 	 RTW_PWR_CUT_ALL_MSK,
1550 	 RTW_PWR_INTF_SDIO_MSK,
1551 	 RTW_PWR_ADDR_MAC,
1552 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
1553 	{0x0067,
1554 	 RTW_PWR_CUT_ALL_MSK,
1555 	 RTW_PWR_INTF_SDIO_MSK,
1556 	 RTW_PWR_ADDR_MAC,
1557 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
1558 	{0x0046,
1559 	 RTW_PWR_CUT_ALL_MSK,
1560 	 RTW_PWR_INTF_SDIO_MSK,
1561 	 RTW_PWR_ADDR_MAC,
1562 	 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
1563 	{0x0062,
1564 	 RTW_PWR_CUT_ALL_MSK,
1565 	 RTW_PWR_INTF_SDIO_MSK,
1566 	 RTW_PWR_ADDR_MAC,
1567 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1568 	{0x0081,
1569 	 RTW_PWR_CUT_ALL_MSK,
1570 	 RTW_PWR_INTF_ALL_MSK,
1571 	 RTW_PWR_ADDR_MAC,
1572 	 RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0},
1573 	{0x0005,
1574 	 RTW_PWR_CUT_ALL_MSK,
1575 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1576 	 RTW_PWR_ADDR_MAC,
1577 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
1578 	{0x0086,
1579 	 RTW_PWR_CUT_ALL_MSK,
1580 	 RTW_PWR_INTF_SDIO_MSK,
1581 	 RTW_PWR_ADDR_SDIO,
1582 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1583 	{0x0086,
1584 	 RTW_PWR_CUT_ALL_MSK,
1585 	 RTW_PWR_INTF_SDIO_MSK,
1586 	 RTW_PWR_ADDR_SDIO,
1587 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
1588 	{0x0090,
1589 	 RTW_PWR_CUT_ALL_MSK,
1590 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_PCI_MSK,
1591 	 RTW_PWR_ADDR_MAC,
1592 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1593 	{0x0044,
1594 	 RTW_PWR_CUT_ALL_MSK,
1595 	 RTW_PWR_INTF_SDIO_MSK,
1596 	 RTW_PWR_ADDR_SDIO,
1597 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1598 	{0x0040,
1599 	 RTW_PWR_CUT_ALL_MSK,
1600 	 RTW_PWR_INTF_SDIO_MSK,
1601 	 RTW_PWR_ADDR_SDIO,
1602 	 RTW_PWR_CMD_WRITE, 0xFF, 0x90},
1603 	{0x0041,
1604 	 RTW_PWR_CUT_ALL_MSK,
1605 	 RTW_PWR_INTF_SDIO_MSK,
1606 	 RTW_PWR_ADDR_SDIO,
1607 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
1608 	{0x0042,
1609 	 RTW_PWR_CUT_ALL_MSK,
1610 	 RTW_PWR_INTF_SDIO_MSK,
1611 	 RTW_PWR_ADDR_SDIO,
1612 	 RTW_PWR_CMD_WRITE, 0xFF, 0x04},
1613 	{0xFFFF,
1614 	 RTW_PWR_CUT_ALL_MSK,
1615 	 RTW_PWR_INTF_ALL_MSK,
1616 	 0,
1617 	 RTW_PWR_CMD_END, 0, 0},
1618 };
1619 
1620 static struct rtw_pwr_seq_cmd *card_enable_flow_8822b[] = {
1621 	trans_carddis_to_cardemu_8822b,
1622 	trans_cardemu_to_act_8822b,
1623 	NULL
1624 };
1625 
1626 static struct rtw_pwr_seq_cmd *card_disable_flow_8822b[] = {
1627 	trans_act_to_cardemu_8822b,
1628 	trans_cardemu_to_carddis_8822b,
1629 	NULL
1630 };
1631 
1632 static struct rtw_intf_phy_para usb2_param_8822b[] = {
1633 	{0xFFFF, 0x00,
1634 	 RTW_IP_SEL_PHY,
1635 	 RTW_INTF_PHY_CUT_ALL,
1636 	 RTW_INTF_PHY_PLATFORM_ALL},
1637 };
1638 
1639 static struct rtw_intf_phy_para usb3_param_8822b[] = {
1640 	{0x0001, 0xA841,
1641 	 RTW_IP_SEL_PHY,
1642 	 RTW_INTF_PHY_CUT_D,
1643 	 RTW_INTF_PHY_PLATFORM_ALL},
1644 	{0xFFFF, 0x0000,
1645 	 RTW_IP_SEL_PHY,
1646 	 RTW_INTF_PHY_CUT_ALL,
1647 	 RTW_INTF_PHY_PLATFORM_ALL},
1648 };
1649 
1650 static struct rtw_intf_phy_para pcie_gen1_param_8822b[] = {
1651 	{0x0001, 0xA841,
1652 	 RTW_IP_SEL_PHY,
1653 	 RTW_INTF_PHY_CUT_C,
1654 	 RTW_INTF_PHY_PLATFORM_ALL},
1655 	{0x0002, 0x60C6,
1656 	 RTW_IP_SEL_PHY,
1657 	 RTW_INTF_PHY_CUT_C,
1658 	 RTW_INTF_PHY_PLATFORM_ALL},
1659 	{0x0008, 0x3596,
1660 	 RTW_IP_SEL_PHY,
1661 	 RTW_INTF_PHY_CUT_C,
1662 	 RTW_INTF_PHY_PLATFORM_ALL},
1663 	{0x0009, 0x321C,
1664 	 RTW_IP_SEL_PHY,
1665 	 RTW_INTF_PHY_CUT_C,
1666 	 RTW_INTF_PHY_PLATFORM_ALL},
1667 	{0x000A, 0x9623,
1668 	 RTW_IP_SEL_PHY,
1669 	 RTW_INTF_PHY_CUT_C,
1670 	 RTW_INTF_PHY_PLATFORM_ALL},
1671 	{0x0020, 0x94FF,
1672 	 RTW_IP_SEL_PHY,
1673 	 RTW_INTF_PHY_CUT_C,
1674 	 RTW_INTF_PHY_PLATFORM_ALL},
1675 	{0x0021, 0xFFCF,
1676 	 RTW_IP_SEL_PHY,
1677 	 RTW_INTF_PHY_CUT_C,
1678 	 RTW_INTF_PHY_PLATFORM_ALL},
1679 	{0x0026, 0xC006,
1680 	 RTW_IP_SEL_PHY,
1681 	 RTW_INTF_PHY_CUT_C,
1682 	 RTW_INTF_PHY_PLATFORM_ALL},
1683 	{0x0029, 0xFF0E,
1684 	 RTW_IP_SEL_PHY,
1685 	 RTW_INTF_PHY_CUT_C,
1686 	 RTW_INTF_PHY_PLATFORM_ALL},
1687 	{0x002A, 0x1840,
1688 	 RTW_IP_SEL_PHY,
1689 	 RTW_INTF_PHY_CUT_C,
1690 	 RTW_INTF_PHY_PLATFORM_ALL},
1691 	{0xFFFF, 0x0000,
1692 	 RTW_IP_SEL_PHY,
1693 	 RTW_INTF_PHY_CUT_ALL,
1694 	 RTW_INTF_PHY_PLATFORM_ALL},
1695 };
1696 
1697 static struct rtw_intf_phy_para pcie_gen2_param_8822b[] = {
1698 	{0x0001, 0xA841,
1699 	 RTW_IP_SEL_PHY,
1700 	 RTW_INTF_PHY_CUT_C,
1701 	 RTW_INTF_PHY_PLATFORM_ALL},
1702 	{0x0002, 0x60C6,
1703 	 RTW_IP_SEL_PHY,
1704 	 RTW_INTF_PHY_CUT_C,
1705 	 RTW_INTF_PHY_PLATFORM_ALL},
1706 	{0x0008, 0x3597,
1707 	 RTW_IP_SEL_PHY,
1708 	 RTW_INTF_PHY_CUT_C,
1709 	 RTW_INTF_PHY_PLATFORM_ALL},
1710 	{0x0009, 0x321C,
1711 	 RTW_IP_SEL_PHY,
1712 	 RTW_INTF_PHY_CUT_C,
1713 	 RTW_INTF_PHY_PLATFORM_ALL},
1714 	{0x000A, 0x9623,
1715 	 RTW_IP_SEL_PHY,
1716 	 RTW_INTF_PHY_CUT_C,
1717 	 RTW_INTF_PHY_PLATFORM_ALL},
1718 	{0x0020, 0x94FF,
1719 	 RTW_IP_SEL_PHY,
1720 	 RTW_INTF_PHY_CUT_C,
1721 	 RTW_INTF_PHY_PLATFORM_ALL},
1722 	{0x0021, 0xFFCF,
1723 	 RTW_IP_SEL_PHY,
1724 	 RTW_INTF_PHY_CUT_C,
1725 	 RTW_INTF_PHY_PLATFORM_ALL},
1726 	{0x0026, 0xC006,
1727 	 RTW_IP_SEL_PHY,
1728 	 RTW_INTF_PHY_CUT_C,
1729 	 RTW_INTF_PHY_PLATFORM_ALL},
1730 	{0x0029, 0xFF0E,
1731 	 RTW_IP_SEL_PHY,
1732 	 RTW_INTF_PHY_CUT_C,
1733 	 RTW_INTF_PHY_PLATFORM_ALL},
1734 	{0x002A, 0x3040,
1735 	 RTW_IP_SEL_PHY,
1736 	 RTW_INTF_PHY_CUT_C,
1737 	 RTW_INTF_PHY_PLATFORM_ALL},
1738 	{0xFFFF, 0x0000,
1739 	 RTW_IP_SEL_PHY,
1740 	 RTW_INTF_PHY_CUT_ALL,
1741 	 RTW_INTF_PHY_PLATFORM_ALL},
1742 };
1743 
1744 static struct rtw_intf_phy_para_table phy_para_table_8822b = {
1745 	.usb2_para	= usb2_param_8822b,
1746 	.usb3_para	= usb3_param_8822b,
1747 	.gen1_para	= pcie_gen1_param_8822b,
1748 	.gen2_para	= pcie_gen2_param_8822b,
1749 	.n_usb2_para	= ARRAY_SIZE(usb2_param_8822b),
1750 	.n_usb3_para	= ARRAY_SIZE(usb2_param_8822b),
1751 	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8822b),
1752 	.n_gen2_para	= ARRAY_SIZE(pcie_gen2_param_8822b),
1753 };
1754 
1755 static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
1756 	[2] = RTW_DEF_RFE(8822b, 2, 2),
1757 	[5] = RTW_DEF_RFE(8822b, 5, 5),
1758 };
1759 
1760 static struct rtw_hw_reg rtw8822b_dig[] = {
1761 	[0] = { .addr = 0xc50, .mask = 0x7f },
1762 	[1] = { .addr = 0xe50, .mask = 0x7f },
1763 };
1764 
1765 static struct rtw_page_table page_table_8822b[] = {
1766 	{64, 64, 64, 64, 1},
1767 	{64, 64, 64, 64, 1},
1768 	{64, 64, 0, 0, 1},
1769 	{64, 64, 64, 0, 1},
1770 	{64, 64, 64, 64, 1},
1771 };
1772 
1773 static struct rtw_rqpn rqpn_table_8822b[] = {
1774 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1775 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1776 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
1777 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1778 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1779 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
1780 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1781 	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
1782 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
1783 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1784 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1785 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
1786 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1787 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1788 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
1789 };
1790 
1791 static struct rtw_chip_ops rtw8822b_ops = {
1792 	.phy_set_param		= rtw8822b_phy_set_param,
1793 	.read_efuse		= rtw8822b_read_efuse,
1794 	.query_rx_desc		= rtw8822b_query_rx_desc,
1795 	.set_channel		= rtw8822b_set_channel,
1796 	.mac_init		= rtw8822b_mac_init,
1797 	.read_rf		= rtw_phy_read_rf,
1798 	.write_rf		= rtw_phy_write_rf_reg_sipi,
1799 	.set_tx_power_index	= rtw8822b_set_tx_power_index,
1800 	.set_antenna		= rtw8822b_set_antenna,
1801 	.cfg_ldo25		= rtw8822b_cfg_ldo25,
1802 	.false_alarm_statistics	= rtw8822b_false_alarm_statistics,
1803 	.phy_calibration	= rtw8822b_phy_calibration,
1804 
1805 	.coex_set_init		= rtw8822b_coex_cfg_init,
1806 	.coex_set_ant_switch	= rtw8822b_coex_cfg_ant_switch,
1807 	.coex_set_gnt_fix	= rtw8822b_coex_cfg_gnt_fix,
1808 	.coex_set_gnt_debug	= rtw8822b_coex_cfg_gnt_debug,
1809 	.coex_set_rfe_type	= rtw8822b_coex_cfg_rfe_type,
1810 	.coex_set_wl_tx_power	= rtw8822b_coex_cfg_wl_tx_power,
1811 	.coex_set_wl_rx_gain	= rtw8822b_coex_cfg_wl_rx_gain,
1812 };
1813 
1814 /* Shared-Antenna Coex Table */
1815 static const struct coex_table_para table_sant_8822b[] = {
1816 	{0xffffffff, 0xffffffff}, /* case-0 */
1817 	{0x55555555, 0x55555555},
1818 	{0x66555555, 0x66555555},
1819 	{0xaaaaaaaa, 0xaaaaaaaa},
1820 	{0x5a5a5a5a, 0x5a5a5a5a},
1821 	{0xfafafafa, 0xfafafafa}, /* case-5 */
1822 	{0x6a5a6a5a, 0xaaaaaaaa},
1823 	{0x6a5a56aa, 0x6a5a56aa},
1824 	{0x6a5a5a5a, 0x6a5a5a5a},
1825 	{0x66555555, 0x5a5a5a5a},
1826 	{0x66555555, 0x6a5a5a5a}, /* case-10 */
1827 	{0x66555555, 0xfafafafa},
1828 	{0x66555555, 0x6a5a5aaa},
1829 	{0x66555555, 0x5aaa5aaa},
1830 	{0x66555555, 0xaaaa5aaa},
1831 	{0x66555555, 0xaaaaaaaa}, /* case-15 */
1832 	{0xffff55ff, 0xfafafafa},
1833 	{0xffff55ff, 0x6afa5afa},
1834 	{0xaaffffaa, 0xfafafafa},
1835 	{0xaa5555aa, 0x5a5a5a5a},
1836 	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
1837 	{0xaa5555aa, 0xaaaaaaaa},
1838 	{0xffffffff, 0x5a5a5a5a},
1839 	{0xffffffff, 0x6a5a5a5a},
1840 	{0xffffffff, 0x55555555},
1841 	{0xffffffff, 0x6a5a5aaa}, /* case-25 */
1842 	{0x55555555, 0x5a5a5a5a},
1843 	{0x55555555, 0xaaaaaaaa},
1844 	{0x55555555, 0x6a5a6a5a},
1845 	{0x66556655, 0x66556655}
1846 };
1847 
1848 /* Non-Shared-Antenna Coex Table */
1849 static const struct coex_table_para table_nsant_8822b[] = {
1850 	{0xffffffff, 0xffffffff}, /* case-100 */
1851 	{0x55555555, 0x55555555},
1852 	{0x66555555, 0x66555555},
1853 	{0xaaaaaaaa, 0xaaaaaaaa},
1854 	{0x5a5a5a5a, 0x5a5a5a5a},
1855 	{0xfafafafa, 0xfafafafa}, /* case-105 */
1856 	{0x5afa5afa, 0x5afa5afa},
1857 	{0x55555555, 0xfafafafa},
1858 	{0x66555555, 0xfafafafa},
1859 	{0x66555555, 0x5a5a5a5a},
1860 	{0x66555555, 0x6a5a5a5a}, /* case-110 */
1861 	{0x66555555, 0xaaaaaaaa},
1862 	{0xffff55ff, 0xfafafafa},
1863 	{0xffff55ff, 0x5afa5afa},
1864 	{0xffff55ff, 0xaaaaaaaa},
1865 	{0xaaffffaa, 0xfafafafa}, /* case-115 */
1866 	{0xaaffffaa, 0x5afa5afa},
1867 	{0xaaffffaa, 0xaaaaaaaa},
1868 	{0xffffffff, 0xfafafafa},
1869 	{0xffffffff, 0x5afa5afa},
1870 	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
1871 	{0x55ff55ff, 0x5afa5afa},
1872 	{0x55ff55ff, 0xaaaaaaaa},
1873 	{0x55ff55ff, 0x55ff55ff}
1874 };
1875 
1876 /* Shared-Antenna TDMA */
1877 static const struct coex_tdma_para tdma_sant_8822b[] = {
1878 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
1879 	{ {0x61, 0x45, 0x03, 0x11, 0x11} },
1880 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
1881 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
1882 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
1883 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
1884 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
1885 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
1886 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1887 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
1888 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
1889 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
1890 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
1891 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
1892 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
1893 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
1894 	{ {0x51, 0x45, 0x03, 0x10, 0x10} },
1895 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
1896 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
1897 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
1898 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
1899 	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
1900 	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
1901 	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
1902 	{ {0x65, 0x10, 0x03, 0x11, 0x11} },
1903 	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
1904 	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
1905 };
1906 
1907 /* Non-Shared-Antenna TDMA */
1908 static const struct coex_tdma_para tdma_nsant_8822b[] = {
1909 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-100 */
1910 	{ {0x61, 0x45, 0x03, 0x11, 0x11} },
1911 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
1912 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
1913 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
1914 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
1915 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
1916 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
1917 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1918 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
1919 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
1920 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
1921 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
1922 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
1923 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
1924 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
1925 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
1926 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
1927 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
1928 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
1929 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }  /* case-120 */
1930 };
1931 
1932 /* rssi in percentage % (dbm = % - 100) */
1933 static const u8 wl_rssi_step_8822b[] = {60, 50, 44, 30};
1934 static const u8 bt_rssi_step_8822b[] = {30, 30, 30, 30};
1935 static const struct coex_5g_afh_map afh_5g_8822b[] = { {0, 0, 0} };
1936 
1937 /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
1938 static const struct coex_rf_para rf_para_tx_8822b[] = {
1939 	{0, 0, false, 7},  /* for normal */
1940 	{0, 16, false, 7}, /* for WL-CPT */
1941 	{4, 0, true, 1},
1942 	{3, 6, true, 1},
1943 	{2, 9, true, 1},
1944 	{1, 13, true, 1}
1945 };
1946 
1947 static const struct coex_rf_para rf_para_rx_8822b[] = {
1948 	{0, 0, false, 7},  /* for normal */
1949 	{0, 16, false, 7}, /* for WL-CPT */
1950 	{4, 0, true, 1},
1951 	{3, 6, true, 1},
1952 	{2, 9, true, 1},
1953 	{1, 13, true, 1}
1954 };
1955 
1956 static_assert(ARRAY_SIZE(rf_para_tx_8822b) == ARRAY_SIZE(rf_para_rx_8822b));
1957 
1958 struct rtw_chip_info rtw8822b_hw_spec = {
1959 	.ops = &rtw8822b_ops,
1960 	.id = RTW_CHIP_TYPE_8822B,
1961 	.fw_name = "rtw88/rtw8822b_fw.bin",
1962 	.tx_pkt_desc_sz = 48,
1963 	.tx_buf_desc_sz = 16,
1964 	.rx_pkt_desc_sz = 24,
1965 	.rx_buf_desc_sz = 8,
1966 	.phy_efuse_size = 1024,
1967 	.log_efuse_size = 768,
1968 	.ptct_efuse_size = 96,
1969 	.txff_size = 262144,
1970 	.rxff_size = 24576,
1971 	.txgi_factor = 1,
1972 	.is_pwr_by_rate_dec = true,
1973 	.max_power_index = 0x3f,
1974 	.csi_buf_pg_num = 0,
1975 	.band = RTW_BAND_2G | RTW_BAND_5G,
1976 	.page_size = 128,
1977 	.dig_min = 0x1c,
1978 	.ht_supported = true,
1979 	.vht_supported = true,
1980 	.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
1981 	.sys_func_en = 0xDC,
1982 	.pwr_on_seq = card_enable_flow_8822b,
1983 	.pwr_off_seq = card_disable_flow_8822b,
1984 	.page_table = page_table_8822b,
1985 	.rqpn_table = rqpn_table_8822b,
1986 	.intf_table = &phy_para_table_8822b,
1987 	.dig = rtw8822b_dig,
1988 	.rf_base_addr = {0x2800, 0x2c00},
1989 	.rf_sipi_addr = {0xc90, 0xe90},
1990 	.mac_tbl = &rtw8822b_mac_tbl,
1991 	.agc_tbl = &rtw8822b_agc_tbl,
1992 	.bb_tbl = &rtw8822b_bb_tbl,
1993 	.rf_tbl = {&rtw8822b_rf_a_tbl, &rtw8822b_rf_b_tbl},
1994 	.rfe_defs = rtw8822b_rfe_defs,
1995 	.rfe_defs_size = ARRAY_SIZE(rtw8822b_rfe_defs),
1996 
1997 	.coex_para_ver = 0x19062706,
1998 	.bt_desired_ver = 0x6,
1999 	.scbd_support = true,
2000 	.new_scbd10_def = false,
2001 	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
2002 	.bt_rssi_type = COEX_BTRSSI_RATIO,
2003 	.ant_isolation = 15,
2004 	.rssi_tolerance = 2,
2005 	.wl_rssi_step = wl_rssi_step_8822b,
2006 	.bt_rssi_step = bt_rssi_step_8822b,
2007 	.table_sant_num = ARRAY_SIZE(table_sant_8822b),
2008 	.table_sant = table_sant_8822b,
2009 	.table_nsant_num = ARRAY_SIZE(table_nsant_8822b),
2010 	.table_nsant = table_nsant_8822b,
2011 	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8822b),
2012 	.tdma_sant = tdma_sant_8822b,
2013 	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8822b),
2014 	.tdma_nsant = tdma_nsant_8822b,
2015 	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8822b),
2016 	.wl_rf_para_tx = rf_para_tx_8822b,
2017 	.wl_rf_para_rx = rf_para_rx_8822b,
2018 	.bt_afh_span_bw20 = 0x24,
2019 	.bt_afh_span_bw40 = 0x36,
2020 	.afh_5g_num = ARRAY_SIZE(afh_5g_8822b),
2021 	.afh_5g = afh_5g_8822b,
2022 };
2023 EXPORT_SYMBOL(rtw8822b_hw_spec);
2024 
2025 MODULE_FIRMWARE("rtw88/rtw8822b_fw.bin");
2026