1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019  Realtek Corporation
3  */
4 
5 #include <linux/module.h>
6 #include "main.h"
7 #include "coex.h"
8 #include "fw.h"
9 #include "tx.h"
10 #include "rx.h"
11 #include "phy.h"
12 #include "rtw8822c.h"
13 #include "rtw8822c_table.h"
14 #include "mac.h"
15 #include "reg.h"
16 #include "debug.h"
17 #include "util.h"
18 #include "bf.h"
19 #include "efuse.h"
20 
21 static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
22 				     u8 rx_path, bool is_tx2_path);
23 
24 static void rtw8822ce_efuse_parsing(struct rtw_efuse *efuse,
25 				    struct rtw8822c_efuse *map)
26 {
27 	ether_addr_copy(efuse->addr, map->e.mac_addr);
28 }
29 
30 static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
31 {
32 	struct rtw_efuse *efuse = &rtwdev->efuse;
33 	struct rtw8822c_efuse *map;
34 	int i;
35 
36 	map = (struct rtw8822c_efuse *)log_map;
37 
38 	efuse->rfe_option = map->rfe_option;
39 	efuse->rf_board_option = map->rf_board_option;
40 	efuse->crystal_cap = map->xtal_k;
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 	efuse->thermal_meter[RF_PATH_A] = map->path_a_thermal;
47 	efuse->thermal_meter[RF_PATH_B] = map->path_b_thermal;
48 	efuse->thermal_meter_k =
49 			(map->path_a_thermal + map->path_b_thermal) >> 1;
50 	efuse->power_track_type = (map->tx_pwr_calibrate_rate >> 4) & 0xf;
51 
52 	for (i = 0; i < 4; i++)
53 		efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
54 
55 	switch (rtw_hci_type(rtwdev)) {
56 	case RTW_HCI_TYPE_PCIE:
57 		rtw8822ce_efuse_parsing(efuse, map);
58 		break;
59 	default:
60 		/* unsupported now */
61 		return -ENOTSUPP;
62 	}
63 
64 	return 0;
65 }
66 
67 static void rtw8822c_header_file_init(struct rtw_dev *rtwdev, bool pre)
68 {
69 	rtw_write32_set(rtwdev, REG_3WIRE, BIT_3WIRE_TX_EN | BIT_3WIRE_RX_EN);
70 	rtw_write32_set(rtwdev, REG_3WIRE, BIT_3WIRE_PI_ON);
71 	rtw_write32_set(rtwdev, REG_3WIRE2, BIT_3WIRE_TX_EN | BIT_3WIRE_RX_EN);
72 	rtw_write32_set(rtwdev, REG_3WIRE2, BIT_3WIRE_PI_ON);
73 
74 	if (pre)
75 		rtw_write32_clr(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN);
76 	else
77 		rtw_write32_set(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN);
78 }
79 
80 static void rtw8822c_dac_backup_reg(struct rtw_dev *rtwdev,
81 				    struct rtw_backup_info *backup,
82 				    struct rtw_backup_info *backup_rf)
83 {
84 	u32 path, i;
85 	u32 val;
86 	u32 reg;
87 	u32 rf_addr[DACK_RF_8822C] = {0x8f};
88 	u32 addrs[DACK_REG_8822C] = {0x180c, 0x1810, 0x410c, 0x4110,
89 				     0x1c3c, 0x1c24, 0x1d70, 0x9b4,
90 				     0x1a00, 0x1a14, 0x1d58, 0x1c38,
91 				     0x1e24, 0x1e28, 0x1860, 0x4160};
92 
93 	for (i = 0; i < DACK_REG_8822C; i++) {
94 		backup[i].len = 4;
95 		backup[i].reg = addrs[i];
96 		backup[i].val = rtw_read32(rtwdev, addrs[i]);
97 	}
98 
99 	for (path = 0; path < DACK_PATH_8822C; path++) {
100 		for (i = 0; i < DACK_RF_8822C; i++) {
101 			reg = rf_addr[i];
102 			val = rtw_read_rf(rtwdev, path, reg, RFREG_MASK);
103 			backup_rf[path * i + i].reg = reg;
104 			backup_rf[path * i + i].val = val;
105 		}
106 	}
107 }
108 
109 static void rtw8822c_dac_restore_reg(struct rtw_dev *rtwdev,
110 				     struct rtw_backup_info *backup,
111 				     struct rtw_backup_info *backup_rf)
112 {
113 	u32 path, i;
114 	u32 val;
115 	u32 reg;
116 
117 	rtw_restore_reg(rtwdev, backup, DACK_REG_8822C);
118 
119 	for (path = 0; path < DACK_PATH_8822C; path++) {
120 		for (i = 0; i < DACK_RF_8822C; i++) {
121 			val = backup_rf[path * i + i].val;
122 			reg = backup_rf[path * i + i].reg;
123 			rtw_write_rf(rtwdev, path, reg, RFREG_MASK, val);
124 		}
125 	}
126 }
127 
128 static void rtw8822c_rf_minmax_cmp(struct rtw_dev *rtwdev, u32 value,
129 				   u32 *min, u32 *max)
130 {
131 	if (value >= 0x200) {
132 		if (*min >= 0x200) {
133 			if (*min > value)
134 				*min = value;
135 		} else {
136 			*min = value;
137 		}
138 		if (*max >= 0x200) {
139 			if (*max < value)
140 				*max = value;
141 		}
142 	} else {
143 		if (*min < 0x200) {
144 			if (*min > value)
145 				*min = value;
146 		}
147 
148 		if (*max  >= 0x200) {
149 			*max = value;
150 		} else {
151 			if (*max < value)
152 				*max = value;
153 		}
154 	}
155 }
156 
157 static void swap_u32(u32 *v1, u32 *v2)
158 {
159 	u32 tmp;
160 
161 	tmp = *v1;
162 	*v1 = *v2;
163 	*v2 = tmp;
164 }
165 
166 static void __rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *v1, u32 *v2)
167 {
168 	if (*v1 >= 0x200 && *v2 >= 0x200) {
169 		if (*v1 > *v2)
170 			swap_u32(v1, v2);
171 	} else if (*v1 < 0x200 && *v2 < 0x200) {
172 		if (*v1 > *v2)
173 			swap_u32(v1, v2);
174 	} else if (*v1 < 0x200 && *v2 >= 0x200) {
175 		swap_u32(v1, v2);
176 	}
177 }
178 
179 static void rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
180 {
181 	u32 i, j;
182 
183 	for (i = 0; i < DACK_SN_8822C - 1; i++) {
184 		for (j = 0; j < (DACK_SN_8822C - 1 - i) ; j++) {
185 			__rtw8822c_dac_iq_sort(rtwdev, &iv[j], &iv[j + 1]);
186 			__rtw8822c_dac_iq_sort(rtwdev, &qv[j], &qv[j + 1]);
187 		}
188 	}
189 }
190 
191 static void rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, u32 *vec, u32 *val)
192 {
193 	u32 p, m, t, i;
194 
195 	m = 0;
196 	p = 0;
197 	for (i = 10; i < DACK_SN_8822C - 10; i++) {
198 		if (vec[i] > 0x200)
199 			m = (0x400 - vec[i]) + m;
200 		else
201 			p = vec[i] + p;
202 	}
203 
204 	if (p > m) {
205 		t = p - m;
206 		t = t / (DACK_SN_8822C - 20);
207 	} else {
208 		t = m - p;
209 		t = t / (DACK_SN_8822C - 20);
210 		if (t != 0x0)
211 			t = 0x400 - t;
212 	}
213 
214 	*val = t;
215 }
216 
217 static u32 rtw8822c_get_path_write_addr(u8 path)
218 {
219 	u32 base_addr;
220 
221 	switch (path) {
222 	case RF_PATH_A:
223 		base_addr = 0x1800;
224 		break;
225 	case RF_PATH_B:
226 		base_addr = 0x4100;
227 		break;
228 	default:
229 		WARN_ON(1);
230 		return -1;
231 	}
232 
233 	return base_addr;
234 }
235 
236 static u32 rtw8822c_get_path_read_addr(u8 path)
237 {
238 	u32 base_addr;
239 
240 	switch (path) {
241 	case RF_PATH_A:
242 		base_addr = 0x2800;
243 		break;
244 	case RF_PATH_B:
245 		base_addr = 0x4500;
246 		break;
247 	default:
248 		WARN_ON(1);
249 		return -1;
250 	}
251 
252 	return base_addr;
253 }
254 
255 static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, u32 value)
256 {
257 	bool ret = true;
258 
259 	if ((value >= 0x200 && (0x400 - value) > 0x64) ||
260 	    (value < 0x200 && value > 0x64)) {
261 		ret = false;
262 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] Error overflow\n");
263 	}
264 
265 	return ret;
266 }
267 
268 static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
269 {
270 	u32 temp;
271 	int i = 0, cnt = 0;
272 
273 	while (i < DACK_SN_8822C && cnt < 10000) {
274 		cnt++;
275 		temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
276 		iv[i] = (temp & 0x3ff000) >> 12;
277 		qv[i] = temp & 0x3ff;
278 
279 		if (rtw8822c_dac_iq_check(rtwdev, iv[i]) &&
280 		    rtw8822c_dac_iq_check(rtwdev, qv[i]))
281 			i++;
282 	}
283 }
284 
285 static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
286 				       u32 *iv, u32 *qv,
287 				       u32 *i_value, u32 *q_value)
288 {
289 	u32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;
290 	u32 i_delta, q_delta;
291 	u32 temp;
292 	int i, cnt = 0;
293 
294 	do {
295 		i_min = iv[0];
296 		i_max = iv[0];
297 		q_min = qv[0];
298 		q_max = qv[0];
299 		for (i = 0; i < DACK_SN_8822C; i++) {
300 			rtw8822c_rf_minmax_cmp(rtwdev, iv[i], &i_min, &i_max);
301 			rtw8822c_rf_minmax_cmp(rtwdev, qv[i], &q_min, &q_max);
302 		}
303 
304 		if (i_max < 0x200 && i_min < 0x200)
305 			i_delta = i_max - i_min;
306 		else if (i_max >= 0x200 && i_min >= 0x200)
307 			i_delta = i_max - i_min;
308 		else
309 			i_delta = i_max + (0x400 - i_min);
310 
311 		if (q_max < 0x200 && q_min < 0x200)
312 			q_delta = q_max - q_min;
313 		else if (q_max >= 0x200 && q_min >= 0x200)
314 			q_delta = q_max - q_min;
315 		else
316 			q_delta = q_max + (0x400 - q_min);
317 
318 		rtw_dbg(rtwdev, RTW_DBG_RFK,
319 			"[DACK] i: min=0x%08x, max=0x%08x, delta=0x%08x\n",
320 			i_min, i_max, i_delta);
321 		rtw_dbg(rtwdev, RTW_DBG_RFK,
322 			"[DACK] q: min=0x%08x, max=0x%08x, delta=0x%08x\n",
323 			q_min, q_max, q_delta);
324 
325 		rtw8822c_dac_iq_sort(rtwdev, iv, qv);
326 
327 		if (i_delta > 5 || q_delta > 5) {
328 			temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
329 			iv[0] = (temp & 0x3ff000) >> 12;
330 			qv[0] = temp & 0x3ff;
331 			temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
332 			iv[DACK_SN_8822C - 1] = (temp & 0x3ff000) >> 12;
333 			qv[DACK_SN_8822C - 1] = temp & 0x3ff;
334 		} else {
335 			break;
336 		}
337 	} while (cnt++ < 100);
338 
339 	rtw8822c_dac_iq_offset(rtwdev, iv, i_value);
340 	rtw8822c_dac_iq_offset(rtwdev, qv, q_value);
341 }
342 
343 static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,
344 				     u32 *i_value, u32 *q_value)
345 {
346 	u32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];
347 	u32 rf_a, rf_b;
348 
349 	rf_a = rtw_read_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK);
350 	rf_b = rtw_read_rf(rtwdev, RF_PATH_B, 0x0, RFREG_MASK);
351 
352 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] RF path-A=0x%05x\n", rf_a);
353 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] RF path-B=0x%05x\n", rf_b);
354 
355 	rtw8822c_dac_cal_iq_sample(rtwdev, iv, qv);
356 	rtw8822c_dac_cal_iq_search(rtwdev, iv, qv, i_value, q_value);
357 }
358 
359 static void rtw8822c_dac_bb_setting(struct rtw_dev *rtwdev)
360 {
361 	rtw_write32_mask(rtwdev, 0x1d58, 0xff8, 0x1ff);
362 	rtw_write32_mask(rtwdev, 0x1a00, 0x3, 0x2);
363 	rtw_write32_mask(rtwdev, 0x1a14, 0x300, 0x3);
364 	rtw_write32(rtwdev, 0x1d70, 0x7e7e7e7e);
365 	rtw_write32_mask(rtwdev, 0x180c, 0x3, 0x0);
366 	rtw_write32_mask(rtwdev, 0x410c, 0x3, 0x0);
367 	rtw_write32(rtwdev, 0x1b00, 0x00000008);
368 	rtw_write8(rtwdev, 0x1bcc, 0x3f);
369 	rtw_write32(rtwdev, 0x1b00, 0x0000000a);
370 	rtw_write8(rtwdev, 0x1bcc, 0x3f);
371 	rtw_write32_mask(rtwdev, 0x1e24, BIT(31), 0x0);
372 	rtw_write32_mask(rtwdev, 0x1e28, 0xf, 0x3);
373 }
374 
375 static void rtw8822c_dac_cal_adc(struct rtw_dev *rtwdev,
376 				 u8 path, u32 *adc_ic, u32 *adc_qc)
377 {
378 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
379 	u32 ic = 0, qc = 0, temp = 0;
380 	u32 base_addr;
381 	u32 path_sel;
382 	int i;
383 
384 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK path(%d)\n", path);
385 
386 	base_addr = rtw8822c_get_path_write_addr(path);
387 	switch (path) {
388 	case RF_PATH_A:
389 		path_sel = 0xa0000;
390 		break;
391 	case RF_PATH_B:
392 		path_sel = 0x80000;
393 		break;
394 	default:
395 		WARN_ON(1);
396 		return;
397 	}
398 
399 	/* ADCK step1 */
400 	rtw_write32_mask(rtwdev, base_addr + 0x30, BIT(30), 0x0);
401 	if (path == RF_PATH_B)
402 		rtw_write32(rtwdev, base_addr + 0x30, 0x30db8041);
403 	rtw_write32(rtwdev, base_addr + 0x60, 0xf0040ff0);
404 	rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
405 	rtw_write32(rtwdev, base_addr + 0x10, 0x02dd08c4);
406 	rtw_write32(rtwdev, base_addr + 0x0c, 0x10000260);
407 	rtw_write_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK, 0x10000);
408 	rtw_write_rf(rtwdev, RF_PATH_B, 0x0, RFREG_MASK, 0x10000);
409 	for (i = 0; i < 10; i++) {
410 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK count=%d\n", i);
411 		rtw_write32(rtwdev, 0x1c3c, path_sel + 0x8003);
412 		rtw_write32(rtwdev, 0x1c24, 0x00010002);
413 		rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc);
414 		rtw_dbg(rtwdev, RTW_DBG_RFK,
415 			"[DACK] before: i=0x%x, q=0x%x\n", ic, qc);
416 
417 		/* compensation value */
418 		if (ic != 0x0) {
419 			ic = 0x400 - ic;
420 			*adc_ic = ic;
421 		}
422 		if (qc != 0x0) {
423 			qc = 0x400 - qc;
424 			*adc_qc = qc;
425 		}
426 		temp = (ic & 0x3ff) | ((qc & 0x3ff) << 10);
427 		rtw_write32(rtwdev, base_addr + 0x68, temp);
428 		dm_info->dack_adck[path] = temp;
429 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK 0x%08x=0x08%x\n",
430 			base_addr + 0x68, temp);
431 		/* check ADC DC offset */
432 		rtw_write32(rtwdev, 0x1c3c, path_sel + 0x8103);
433 		rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc);
434 		rtw_dbg(rtwdev, RTW_DBG_RFK,
435 			"[DACK] after:  i=0x%08x, q=0x%08x\n", ic, qc);
436 		if (ic >= 0x200)
437 			ic = 0x400 - ic;
438 		if (qc >= 0x200)
439 			qc = 0x400 - qc;
440 		if (ic < 5 && qc < 5)
441 			break;
442 	}
443 
444 	/* ADCK step2 */
445 	rtw_write32(rtwdev, 0x1c3c, 0x00000003);
446 	rtw_write32(rtwdev, base_addr + 0x0c, 0x10000260);
447 	rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c4);
448 
449 	/* release pull low switch on IQ path */
450 	rtw_write_rf(rtwdev, path, 0x8f, BIT(13), 0x1);
451 }
452 
453 static void rtw8822c_dac_cal_step1(struct rtw_dev *rtwdev, u8 path)
454 {
455 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
456 	u32 base_addr;
457 	u32 read_addr;
458 
459 	base_addr = rtw8822c_get_path_write_addr(path);
460 	read_addr = rtw8822c_get_path_read_addr(path);
461 
462 	rtw_write32(rtwdev, base_addr + 0x68, dm_info->dack_adck[path]);
463 	rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
464 	if (path == RF_PATH_A) {
465 		rtw_write32(rtwdev, base_addr + 0x60, 0xf0040ff0);
466 		rtw_write32(rtwdev, 0x1c38, 0xffffffff);
467 	}
468 	rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
469 	rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
470 	rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb88);
471 	rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff81);
472 	rtw_write32(rtwdev, base_addr + 0xc0, 0x0003d208);
473 	rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb88);
474 	rtw_write32(rtwdev, base_addr + 0xd8, 0x0008ff81);
475 	rtw_write32(rtwdev, base_addr + 0xdc, 0x0003d208);
476 	rtw_write32(rtwdev, base_addr + 0xb8, 0x60000000);
477 	mdelay(2);
478 	rtw_write32(rtwdev, base_addr + 0xbc, 0x000aff8d);
479 	mdelay(2);
480 	rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb89);
481 	rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb89);
482 	mdelay(1);
483 	rtw_write32(rtwdev, base_addr + 0xb8, 0x62000000);
484 	rtw_write32(rtwdev, base_addr + 0xd4, 0x62000000);
485 	mdelay(20);
486 	if (!check_hw_ready(rtwdev, read_addr + 0x08, 0x7fff80, 0xffff) ||
487 	    !check_hw_ready(rtwdev, read_addr + 0x34, 0x7fff80, 0xffff))
488 		rtw_err(rtwdev, "failed to wait for dack ready\n");
489 	rtw_write32(rtwdev, base_addr + 0xb8, 0x02000000);
490 	mdelay(1);
491 	rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff87);
492 	rtw_write32(rtwdev, 0x9b4, 0xdb6db600);
493 	rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
494 	rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff87);
495 	rtw_write32(rtwdev, base_addr + 0x60, 0xf0000000);
496 }
497 
498 static void rtw8822c_dac_cal_step2(struct rtw_dev *rtwdev,
499 				   u8 path, u32 *ic_out, u32 *qc_out)
500 {
501 	u32 base_addr;
502 	u32 ic, qc, ic_in, qc_in;
503 
504 	base_addr = rtw8822c_get_path_write_addr(path);
505 	rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xf0000000, 0x0);
506 	rtw_write32_mask(rtwdev, base_addr + 0xc0, 0xf, 0x8);
507 	rtw_write32_mask(rtwdev, base_addr + 0xd8, 0xf0000000, 0x0);
508 	rtw_write32_mask(rtwdev, base_addr + 0xdc, 0xf, 0x8);
509 
510 	rtw_write32(rtwdev, 0x1b00, 0x00000008);
511 	rtw_write8(rtwdev, 0x1bcc, 0x03f);
512 	rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
513 	rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
514 	rtw_write32(rtwdev, 0x1c3c, 0x00088103);
515 
516 	rtw8822c_dac_cal_rf_mode(rtwdev, &ic_in, &qc_in);
517 	ic = ic_in;
518 	qc = qc_in;
519 
520 	/* compensation value */
521 	if (ic != 0x0)
522 		ic = 0x400 - ic;
523 	if (qc != 0x0)
524 		qc = 0x400 - qc;
525 	if (ic < 0x300) {
526 		ic = ic * 2 * 6 / 5;
527 		ic = ic + 0x80;
528 	} else {
529 		ic = (0x400 - ic) * 2 * 6 / 5;
530 		ic = 0x7f - ic;
531 	}
532 	if (qc < 0x300) {
533 		qc = qc * 2 * 6 / 5;
534 		qc = qc + 0x80;
535 	} else {
536 		qc = (0x400 - qc) * 2 * 6 / 5;
537 		qc = 0x7f - qc;
538 	}
539 
540 	*ic_out = ic;
541 	*qc_out = qc;
542 
543 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] before i=0x%x, q=0x%x\n", ic_in, qc_in);
544 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] after  i=0x%x, q=0x%x\n", ic, qc);
545 }
546 
547 static void rtw8822c_dac_cal_step3(struct rtw_dev *rtwdev, u8 path,
548 				   u32 adc_ic, u32 adc_qc,
549 				   u32 *ic_in, u32 *qc_in,
550 				   u32 *i_out, u32 *q_out)
551 {
552 	u32 base_addr;
553 	u32 read_addr;
554 	u32 ic, qc;
555 	u32 temp;
556 
557 	base_addr = rtw8822c_get_path_write_addr(path);
558 	read_addr = rtw8822c_get_path_read_addr(path);
559 	ic = *ic_in;
560 	qc = *qc_in;
561 
562 	rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220);
563 	rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
564 	rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
565 	rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb88);
566 	rtw_write32(rtwdev, base_addr + 0xbc, 0xc008ff81);
567 	rtw_write32(rtwdev, base_addr + 0xc0, 0x0003d208);
568 	rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xf0000000, ic & 0xf);
569 	rtw_write32_mask(rtwdev, base_addr + 0xc0, 0xf, (ic & 0xf0) >> 4);
570 	rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb88);
571 	rtw_write32(rtwdev, base_addr + 0xd8, 0xe008ff81);
572 	rtw_write32(rtwdev, base_addr + 0xdc, 0x0003d208);
573 	rtw_write32_mask(rtwdev, base_addr + 0xd8, 0xf0000000, qc & 0xf);
574 	rtw_write32_mask(rtwdev, base_addr + 0xdc, 0xf, (qc & 0xf0) >> 4);
575 	rtw_write32(rtwdev, base_addr + 0xb8, 0x60000000);
576 	mdelay(2);
577 	rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xe, 0x6);
578 	mdelay(2);
579 	rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb89);
580 	rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb89);
581 	mdelay(1);
582 	rtw_write32(rtwdev, base_addr + 0xb8, 0x62000000);
583 	rtw_write32(rtwdev, base_addr + 0xd4, 0x62000000);
584 	mdelay(20);
585 	if (!check_hw_ready(rtwdev, read_addr + 0x24, 0x07f80000, ic) ||
586 	    !check_hw_ready(rtwdev, read_addr + 0x50, 0x07f80000, qc))
587 		rtw_err(rtwdev, "failed to write IQ vector to hardware\n");
588 	rtw_write32(rtwdev, base_addr + 0xb8, 0x02000000);
589 	mdelay(1);
590 	rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xe, 0x3);
591 	rtw_write32(rtwdev, 0x9b4, 0xdb6db600);
592 
593 	/* check DAC DC offset */
594 	temp = ((adc_ic + 0x10) & 0x3ff) | (((adc_qc + 0x10) & 0x3ff) << 10);
595 	rtw_write32(rtwdev, base_addr + 0x68, temp);
596 	rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5);
597 	rtw_write32(rtwdev, base_addr + 0x60, 0xf0000000);
598 	rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc);
599 	if (ic >= 0x10)
600 		ic = ic - 0x10;
601 	else
602 		ic = 0x400 - (0x10 - ic);
603 
604 	if (qc >= 0x10)
605 		qc = qc - 0x10;
606 	else
607 		qc = 0x400 - (0x10 - qc);
608 
609 	*i_out = ic;
610 	*q_out = qc;
611 
612 	if (ic >= 0x200)
613 		ic = 0x400 - ic;
614 	if (qc >= 0x200)
615 		qc = 0x400 - qc;
616 
617 	*ic_in = ic;
618 	*qc_in = qc;
619 
620 	rtw_dbg(rtwdev, RTW_DBG_RFK,
621 		"[DACK] after  DACK i=0x%x, q=0x%x\n", *i_out, *q_out);
622 }
623 
624 static void rtw8822c_dac_cal_step4(struct rtw_dev *rtwdev, u8 path)
625 {
626 	u32 base_addr = rtw8822c_get_path_write_addr(path);
627 
628 	rtw_write32(rtwdev, base_addr + 0x68, 0x0);
629 	rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c4);
630 	rtw_write32_mask(rtwdev, base_addr + 0xbc, 0x1, 0x0);
631 	rtw_write32_mask(rtwdev, base_addr + 0x30, BIT(30), 0x1);
632 }
633 
634 static void rtw8822c_dac_cal_backup_vec(struct rtw_dev *rtwdev,
635 					u8 path, u8 vec, u32 w_addr, u32 r_addr)
636 {
637 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
638 	u16 val;
639 	u32 i;
640 
641 	if (WARN_ON(vec >= 2))
642 		return;
643 
644 	for (i = 0; i < DACK_MSBK_BACKUP_NUM; i++) {
645 		rtw_write32_mask(rtwdev, w_addr, 0xf0000000, i);
646 		val = (u16)rtw_read32_mask(rtwdev, r_addr, 0x7fc0000);
647 		dm_info->dack_msbk[path][vec][i] = val;
648 	}
649 }
650 
651 static void rtw8822c_dac_cal_backup_path(struct rtw_dev *rtwdev, u8 path)
652 {
653 	u32 w_off = 0x1c;
654 	u32 r_off = 0x2c;
655 	u32 w_addr, r_addr;
656 
657 	if (WARN_ON(path >= 2))
658 		return;
659 
660 	/* backup I vector */
661 	w_addr = rtw8822c_get_path_write_addr(path) + 0xb0;
662 	r_addr = rtw8822c_get_path_read_addr(path) + 0x10;
663 	rtw8822c_dac_cal_backup_vec(rtwdev, path, 0, w_addr, r_addr);
664 
665 	/* backup Q vector */
666 	w_addr = rtw8822c_get_path_write_addr(path) + 0xb0 + w_off;
667 	r_addr = rtw8822c_get_path_read_addr(path) + 0x10 + r_off;
668 	rtw8822c_dac_cal_backup_vec(rtwdev, path, 1, w_addr, r_addr);
669 }
670 
671 static void rtw8822c_dac_cal_backup_dck(struct rtw_dev *rtwdev)
672 {
673 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
674 	u8 val;
675 
676 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_I_0, 0xf0000000);
677 	dm_info->dack_dck[RF_PATH_A][0][0] = val;
678 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_I_1, 0xf);
679 	dm_info->dack_dck[RF_PATH_A][0][1] = val;
680 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_Q_0, 0xf0000000);
681 	dm_info->dack_dck[RF_PATH_A][1][0] = val;
682 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_Q_1, 0xf);
683 	dm_info->dack_dck[RF_PATH_A][1][1] = val;
684 
685 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_I_0, 0xf0000000);
686 	dm_info->dack_dck[RF_PATH_B][0][0] = val;
687 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_I_1, 0xf);
688 	dm_info->dack_dck[RF_PATH_B][1][0] = val;
689 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_Q_0, 0xf0000000);
690 	dm_info->dack_dck[RF_PATH_B][0][1] = val;
691 	val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_Q_1, 0xf);
692 	dm_info->dack_dck[RF_PATH_B][1][1] = val;
693 }
694 
695 static void rtw8822c_dac_cal_backup(struct rtw_dev *rtwdev)
696 {
697 	u32 temp[3];
698 
699 	temp[0] = rtw_read32(rtwdev, 0x1860);
700 	temp[1] = rtw_read32(rtwdev, 0x4160);
701 	temp[2] = rtw_read32(rtwdev, 0x9b4);
702 
703 	/* set clock */
704 	rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
705 
706 	/* backup path-A I/Q */
707 	rtw_write32_clr(rtwdev, 0x1830, BIT(30));
708 	rtw_write32_mask(rtwdev, 0x1860, 0xfc000000, 0x3c);
709 	rtw8822c_dac_cal_backup_path(rtwdev, RF_PATH_A);
710 
711 	/* backup path-B I/Q */
712 	rtw_write32_clr(rtwdev, 0x4130, BIT(30));
713 	rtw_write32_mask(rtwdev, 0x4160, 0xfc000000, 0x3c);
714 	rtw8822c_dac_cal_backup_path(rtwdev, RF_PATH_B);
715 
716 	rtw8822c_dac_cal_backup_dck(rtwdev);
717 	rtw_write32_set(rtwdev, 0x1830, BIT(30));
718 	rtw_write32_set(rtwdev, 0x4130, BIT(30));
719 
720 	rtw_write32(rtwdev, 0x1860, temp[0]);
721 	rtw_write32(rtwdev, 0x4160, temp[1]);
722 	rtw_write32(rtwdev, 0x9b4, temp[2]);
723 }
724 
725 static void rtw8822c_dac_cal_restore_dck(struct rtw_dev *rtwdev)
726 {
727 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
728 	u8 val;
729 
730 	rtw_write32_set(rtwdev, REG_DCKA_I_0, BIT(19));
731 	val = dm_info->dack_dck[RF_PATH_A][0][0];
732 	rtw_write32_mask(rtwdev, REG_DCKA_I_0, 0xf0000000, val);
733 	val = dm_info->dack_dck[RF_PATH_A][0][1];
734 	rtw_write32_mask(rtwdev, REG_DCKA_I_1, 0xf, val);
735 
736 	rtw_write32_set(rtwdev, REG_DCKA_Q_0, BIT(19));
737 	val = dm_info->dack_dck[RF_PATH_A][1][0];
738 	rtw_write32_mask(rtwdev, REG_DCKA_Q_0, 0xf0000000, val);
739 	val = dm_info->dack_dck[RF_PATH_A][1][1];
740 	rtw_write32_mask(rtwdev, REG_DCKA_Q_1, 0xf, val);
741 
742 	rtw_write32_set(rtwdev, REG_DCKB_I_0, BIT(19));
743 	val = dm_info->dack_dck[RF_PATH_B][0][0];
744 	rtw_write32_mask(rtwdev, REG_DCKB_I_0, 0xf0000000, val);
745 	val = dm_info->dack_dck[RF_PATH_B][0][1];
746 	rtw_write32_mask(rtwdev, REG_DCKB_I_1, 0xf, val);
747 
748 	rtw_write32_set(rtwdev, REG_DCKB_Q_0, BIT(19));
749 	val = dm_info->dack_dck[RF_PATH_B][1][0];
750 	rtw_write32_mask(rtwdev, REG_DCKB_Q_0, 0xf0000000, val);
751 	val = dm_info->dack_dck[RF_PATH_B][1][1];
752 	rtw_write32_mask(rtwdev, REG_DCKB_Q_1, 0xf, val);
753 }
754 
755 static void rtw8822c_dac_cal_restore_prepare(struct rtw_dev *rtwdev)
756 {
757 	rtw_write32(rtwdev, 0x9b4, 0xdb66db00);
758 
759 	rtw_write32_mask(rtwdev, 0x18b0, BIT(27), 0x0);
760 	rtw_write32_mask(rtwdev, 0x18cc, BIT(27), 0x0);
761 	rtw_write32_mask(rtwdev, 0x41b0, BIT(27), 0x0);
762 	rtw_write32_mask(rtwdev, 0x41cc, BIT(27), 0x0);
763 
764 	rtw_write32_mask(rtwdev, 0x1830, BIT(30), 0x0);
765 	rtw_write32_mask(rtwdev, 0x1860, 0xfc000000, 0x3c);
766 	rtw_write32_mask(rtwdev, 0x18b4, BIT(0), 0x1);
767 	rtw_write32_mask(rtwdev, 0x18d0, BIT(0), 0x1);
768 
769 	rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x0);
770 	rtw_write32_mask(rtwdev, 0x4160, 0xfc000000, 0x3c);
771 	rtw_write32_mask(rtwdev, 0x41b4, BIT(0), 0x1);
772 	rtw_write32_mask(rtwdev, 0x41d0, BIT(0), 0x1);
773 
774 	rtw_write32_mask(rtwdev, 0x18b0, 0xf00, 0x0);
775 	rtw_write32_mask(rtwdev, 0x18c0, BIT(14), 0x0);
776 	rtw_write32_mask(rtwdev, 0x18cc, 0xf00, 0x0);
777 	rtw_write32_mask(rtwdev, 0x18dc, BIT(14), 0x0);
778 
779 	rtw_write32_mask(rtwdev, 0x18b0, BIT(0), 0x0);
780 	rtw_write32_mask(rtwdev, 0x18cc, BIT(0), 0x0);
781 	rtw_write32_mask(rtwdev, 0x18b0, BIT(0), 0x1);
782 	rtw_write32_mask(rtwdev, 0x18cc, BIT(0), 0x1);
783 
784 	rtw8822c_dac_cal_restore_dck(rtwdev);
785 
786 	rtw_write32_mask(rtwdev, 0x18c0, 0x38000, 0x7);
787 	rtw_write32_mask(rtwdev, 0x18dc, 0x38000, 0x7);
788 	rtw_write32_mask(rtwdev, 0x41c0, 0x38000, 0x7);
789 	rtw_write32_mask(rtwdev, 0x41dc, 0x38000, 0x7);
790 
791 	rtw_write32_mask(rtwdev, 0x18b8, BIT(26) | BIT(25), 0x1);
792 	rtw_write32_mask(rtwdev, 0x18d4, BIT(26) | BIT(25), 0x1);
793 
794 	rtw_write32_mask(rtwdev, 0x41b0, 0xf00, 0x0);
795 	rtw_write32_mask(rtwdev, 0x41c0, BIT(14), 0x0);
796 	rtw_write32_mask(rtwdev, 0x41cc, 0xf00, 0x0);
797 	rtw_write32_mask(rtwdev, 0x41dc, BIT(14), 0x0);
798 
799 	rtw_write32_mask(rtwdev, 0x41b0, BIT(0), 0x0);
800 	rtw_write32_mask(rtwdev, 0x41cc, BIT(0), 0x0);
801 	rtw_write32_mask(rtwdev, 0x41b0, BIT(0), 0x1);
802 	rtw_write32_mask(rtwdev, 0x41cc, BIT(0), 0x1);
803 
804 	rtw_write32_mask(rtwdev, 0x41b8, BIT(26) | BIT(25), 0x1);
805 	rtw_write32_mask(rtwdev, 0x41d4, BIT(26) | BIT(25), 0x1);
806 }
807 
808 static bool rtw8822c_dac_cal_restore_wait(struct rtw_dev *rtwdev,
809 					  u32 target_addr, u32 toggle_addr)
810 {
811 	u32 cnt = 0;
812 
813 	do {
814 		rtw_write32_mask(rtwdev, toggle_addr, BIT(26) | BIT(25), 0x0);
815 		rtw_write32_mask(rtwdev, toggle_addr, BIT(26) | BIT(25), 0x2);
816 
817 		if (rtw_read32_mask(rtwdev, target_addr, 0xf) == 0x6)
818 			return true;
819 
820 	} while (cnt++ < 100);
821 
822 	return false;
823 }
824 
825 static bool rtw8822c_dac_cal_restore_path(struct rtw_dev *rtwdev, u8 path)
826 {
827 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
828 	u32 w_off = 0x1c;
829 	u32 r_off = 0x2c;
830 	u32 w_i, r_i, w_q, r_q;
831 	u32 value;
832 	u32 i;
833 
834 	w_i = rtw8822c_get_path_write_addr(path) + 0xb0;
835 	r_i = rtw8822c_get_path_read_addr(path) + 0x08;
836 	w_q = rtw8822c_get_path_write_addr(path) + 0xb0 + w_off;
837 	r_q = rtw8822c_get_path_read_addr(path) + 0x08 + r_off;
838 
839 	if (!rtw8822c_dac_cal_restore_wait(rtwdev, r_i, w_i + 0x8))
840 		return false;
841 
842 	for (i = 0; i < DACK_MSBK_BACKUP_NUM; i++) {
843 		rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x0);
844 		value = dm_info->dack_msbk[path][0][i];
845 		rtw_write32_mask(rtwdev, w_i + 0x4, 0xff8, value);
846 		rtw_write32_mask(rtwdev, w_i, 0xf0000000, i);
847 		rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x1);
848 	}
849 
850 	rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x0);
851 
852 	if (!rtw8822c_dac_cal_restore_wait(rtwdev, r_q, w_q + 0x8))
853 		return false;
854 
855 	for (i = 0; i < DACK_MSBK_BACKUP_NUM; i++) {
856 		rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x0);
857 		value = dm_info->dack_msbk[path][1][i];
858 		rtw_write32_mask(rtwdev, w_q + 0x4, 0xff8, value);
859 		rtw_write32_mask(rtwdev, w_q, 0xf0000000, i);
860 		rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x1);
861 	}
862 	rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x0);
863 
864 	rtw_write32_mask(rtwdev, w_i + 0x8, BIT(26) | BIT(25), 0x0);
865 	rtw_write32_mask(rtwdev, w_q + 0x8, BIT(26) | BIT(25), 0x0);
866 	rtw_write32_mask(rtwdev, w_i + 0x4, BIT(0), 0x0);
867 	rtw_write32_mask(rtwdev, w_q + 0x4, BIT(0), 0x0);
868 
869 	return true;
870 }
871 
872 static bool __rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev)
873 {
874 	if (!rtw8822c_dac_cal_restore_path(rtwdev, RF_PATH_A))
875 		return false;
876 
877 	if (!rtw8822c_dac_cal_restore_path(rtwdev, RF_PATH_B))
878 		return false;
879 
880 	return true;
881 }
882 
883 static bool rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev)
884 {
885 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
886 	u32 temp[3];
887 
888 	/* sample the first element for both path's IQ vector */
889 	if (dm_info->dack_msbk[RF_PATH_A][0][0] == 0 &&
890 	    dm_info->dack_msbk[RF_PATH_A][1][0] == 0 &&
891 	    dm_info->dack_msbk[RF_PATH_B][0][0] == 0 &&
892 	    dm_info->dack_msbk[RF_PATH_B][1][0] == 0)
893 		return false;
894 
895 	temp[0] = rtw_read32(rtwdev, 0x1860);
896 	temp[1] = rtw_read32(rtwdev, 0x4160);
897 	temp[2] = rtw_read32(rtwdev, 0x9b4);
898 
899 	rtw8822c_dac_cal_restore_prepare(rtwdev);
900 	if (!check_hw_ready(rtwdev, 0x2808, 0x7fff80, 0xffff) ||
901 	    !check_hw_ready(rtwdev, 0x2834, 0x7fff80, 0xffff) ||
902 	    !check_hw_ready(rtwdev, 0x4508, 0x7fff80, 0xffff) ||
903 	    !check_hw_ready(rtwdev, 0x4534, 0x7fff80, 0xffff))
904 		return false;
905 
906 	if (!__rtw8822c_dac_cal_restore(rtwdev)) {
907 		rtw_err(rtwdev, "failed to restore dack vectors\n");
908 		return false;
909 	}
910 
911 	rtw_write32_mask(rtwdev, 0x1830, BIT(30), 0x1);
912 	rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x1);
913 	rtw_write32(rtwdev, 0x1860, temp[0]);
914 	rtw_write32(rtwdev, 0x4160, temp[1]);
915 	rtw_write32_mask(rtwdev, 0x18b0, BIT(27), 0x1);
916 	rtw_write32_mask(rtwdev, 0x18cc, BIT(27), 0x1);
917 	rtw_write32_mask(rtwdev, 0x41b0, BIT(27), 0x1);
918 	rtw_write32_mask(rtwdev, 0x41cc, BIT(27), 0x1);
919 	rtw_write32(rtwdev, 0x9b4, temp[2]);
920 
921 	return true;
922 }
923 
924 static void rtw8822c_rf_dac_cal(struct rtw_dev *rtwdev)
925 {
926 	struct rtw_backup_info backup_rf[DACK_RF_8822C * DACK_PATH_8822C];
927 	struct rtw_backup_info backup[DACK_REG_8822C];
928 	u32 ic = 0, qc = 0, i;
929 	u32 i_a = 0x0, q_a = 0x0, i_b = 0x0, q_b = 0x0;
930 	u32 ic_a = 0x0, qc_a = 0x0, ic_b = 0x0, qc_b = 0x0;
931 	u32 adc_ic_a = 0x0, adc_qc_a = 0x0, adc_ic_b = 0x0, adc_qc_b = 0x0;
932 
933 	if (rtw8822c_dac_cal_restore(rtwdev))
934 		return;
935 
936 	/* not able to restore, do it */
937 
938 	rtw8822c_dac_backup_reg(rtwdev, backup, backup_rf);
939 
940 	rtw8822c_dac_bb_setting(rtwdev);
941 
942 	/* path-A */
943 	rtw8822c_dac_cal_adc(rtwdev, RF_PATH_A, &adc_ic_a, &adc_qc_a);
944 	for (i = 0; i < 10; i++) {
945 		rtw8822c_dac_cal_step1(rtwdev, RF_PATH_A);
946 		rtw8822c_dac_cal_step2(rtwdev, RF_PATH_A, &ic, &qc);
947 		ic_a = ic;
948 		qc_a = qc;
949 
950 		rtw8822c_dac_cal_step3(rtwdev, RF_PATH_A, adc_ic_a, adc_qc_a,
951 				       &ic, &qc, &i_a, &q_a);
952 
953 		if (ic < 5 && qc < 5)
954 			break;
955 	}
956 	rtw8822c_dac_cal_step4(rtwdev, RF_PATH_A);
957 
958 	/* path-B */
959 	rtw8822c_dac_cal_adc(rtwdev, RF_PATH_B, &adc_ic_b, &adc_qc_b);
960 	for (i = 0; i < 10; i++) {
961 		rtw8822c_dac_cal_step1(rtwdev, RF_PATH_B);
962 		rtw8822c_dac_cal_step2(rtwdev, RF_PATH_B, &ic, &qc);
963 		ic_b = ic;
964 		qc_b = qc;
965 
966 		rtw8822c_dac_cal_step3(rtwdev, RF_PATH_B, adc_ic_b, adc_qc_b,
967 				       &ic, &qc, &i_b, &q_b);
968 
969 		if (ic < 5 && qc < 5)
970 			break;
971 	}
972 	rtw8822c_dac_cal_step4(rtwdev, RF_PATH_B);
973 
974 	rtw_write32(rtwdev, 0x1b00, 0x00000008);
975 	rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x1);
976 	rtw_write8(rtwdev, 0x1bcc, 0x0);
977 	rtw_write32(rtwdev, 0x1b00, 0x0000000a);
978 	rtw_write8(rtwdev, 0x1bcc, 0x0);
979 
980 	rtw8822c_dac_restore_reg(rtwdev, backup, backup_rf);
981 
982 	/* backup results to restore, saving a lot of time */
983 	rtw8822c_dac_cal_backup(rtwdev);
984 
985 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path A: ic=0x%x, qc=0x%x\n", ic_a, qc_a);
986 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path B: ic=0x%x, qc=0x%x\n", ic_b, qc_b);
987 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path A: i=0x%x, q=0x%x\n", i_a, q_a);
988 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path B: i=0x%x, q=0x%x\n", i_b, q_b);
989 }
990 
991 static void rtw8822c_rf_x2_check(struct rtw_dev *rtwdev)
992 {
993 	u8 x2k_busy;
994 
995 	mdelay(1);
996 	x2k_busy = rtw_read_rf(rtwdev, RF_PATH_A, 0xb8, BIT(15));
997 	if (x2k_busy == 1) {
998 		rtw_write_rf(rtwdev, RF_PATH_A, 0xb8, RFREG_MASK, 0xC4440);
999 		rtw_write_rf(rtwdev, RF_PATH_A, 0xba, RFREG_MASK, 0x6840D);
1000 		rtw_write_rf(rtwdev, RF_PATH_A, 0xb8, RFREG_MASK, 0x80440);
1001 		mdelay(1);
1002 	}
1003 }
1004 
1005 static void rtw8822c_set_power_trim(struct rtw_dev *rtwdev, s8 bb_gain[2][8])
1006 {
1007 #define RF_SET_POWER_TRIM(_path, _seq, _idx)					\
1008 		do {								\
1009 			rtw_write_rf(rtwdev, _path, 0x33, RFREG_MASK, _seq);	\
1010 			rtw_write_rf(rtwdev, _path, 0x3f, RFREG_MASK,		\
1011 				     bb_gain[_path][_idx]);			\
1012 		} while (0)
1013 	u8 path;
1014 
1015 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1016 		rtw_write_rf(rtwdev, path, 0xee, BIT(19), 1);
1017 		RF_SET_POWER_TRIM(path, 0x0, 0);
1018 		RF_SET_POWER_TRIM(path, 0x1, 1);
1019 		RF_SET_POWER_TRIM(path, 0x2, 2);
1020 		RF_SET_POWER_TRIM(path, 0x3, 2);
1021 		RF_SET_POWER_TRIM(path, 0x4, 3);
1022 		RF_SET_POWER_TRIM(path, 0x5, 4);
1023 		RF_SET_POWER_TRIM(path, 0x6, 5);
1024 		RF_SET_POWER_TRIM(path, 0x7, 6);
1025 		RF_SET_POWER_TRIM(path, 0x8, 7);
1026 		RF_SET_POWER_TRIM(path, 0x9, 3);
1027 		RF_SET_POWER_TRIM(path, 0xa, 4);
1028 		RF_SET_POWER_TRIM(path, 0xb, 5);
1029 		RF_SET_POWER_TRIM(path, 0xc, 6);
1030 		RF_SET_POWER_TRIM(path, 0xd, 7);
1031 		RF_SET_POWER_TRIM(path, 0xe, 7);
1032 		rtw_write_rf(rtwdev, path, 0xee, BIT(19), 0);
1033 	}
1034 #undef RF_SET_POWER_TRIM
1035 }
1036 
1037 static void rtw8822c_power_trim(struct rtw_dev *rtwdev)
1038 {
1039 	u8 pg_pwr = 0xff, i, path, idx;
1040 	s8 bb_gain[2][8] = {};
1041 	u16 rf_efuse_2g[3] = {PPG_2GL_TXAB, PPG_2GM_TXAB, PPG_2GH_TXAB};
1042 	u16 rf_efuse_5g[2][5] = {{PPG_5GL1_TXA, PPG_5GL2_TXA, PPG_5GM1_TXA,
1043 				  PPG_5GM2_TXA, PPG_5GH1_TXA},
1044 				 {PPG_5GL1_TXB, PPG_5GL2_TXB, PPG_5GM1_TXB,
1045 				  PPG_5GM2_TXB, PPG_5GH1_TXB} };
1046 	bool set = false;
1047 
1048 	for (i = 0; i < ARRAY_SIZE(rf_efuse_2g); i++) {
1049 		rtw_read8_physical_efuse(rtwdev, rf_efuse_2g[i], &pg_pwr);
1050 		if (pg_pwr == EFUSE_READ_FAIL)
1051 			continue;
1052 		set = true;
1053 		bb_gain[RF_PATH_A][i] = FIELD_GET(PPG_2G_A_MASK, pg_pwr);
1054 		bb_gain[RF_PATH_B][i] = FIELD_GET(PPG_2G_B_MASK, pg_pwr);
1055 	}
1056 
1057 	for (i = 0; i < ARRAY_SIZE(rf_efuse_5g[0]); i++) {
1058 		for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1059 			rtw_read8_physical_efuse(rtwdev, rf_efuse_5g[path][i],
1060 						 &pg_pwr);
1061 			if (pg_pwr == EFUSE_READ_FAIL)
1062 				continue;
1063 			set = true;
1064 			idx = i + ARRAY_SIZE(rf_efuse_2g);
1065 			bb_gain[path][idx] = FIELD_GET(PPG_5G_MASK, pg_pwr);
1066 		}
1067 	}
1068 	if (set)
1069 		rtw8822c_set_power_trim(rtwdev, bb_gain);
1070 
1071 	rtw_write32_mask(rtwdev, REG_DIS_DPD, DIS_DPD_MASK, DIS_DPD_RATEALL);
1072 }
1073 
1074 static void rtw8822c_thermal_trim(struct rtw_dev *rtwdev)
1075 {
1076 	u16 rf_efuse[2] = {PPG_THERMAL_A, PPG_THERMAL_B};
1077 	u8 pg_therm = 0xff, thermal[2] = {0}, path;
1078 
1079 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1080 		rtw_read8_physical_efuse(rtwdev, rf_efuse[path], &pg_therm);
1081 		if (pg_therm == EFUSE_READ_FAIL)
1082 			return;
1083 		/* Efuse value of BIT(0) shall be move to BIT(3), and the value
1084 		 * of BIT(1) to BIT(3) should be right shifted 1 bit.
1085 		 */
1086 		thermal[path] = FIELD_GET(GENMASK(3, 1), pg_therm);
1087 		thermal[path] |= FIELD_PREP(BIT(3), pg_therm & BIT(0));
1088 		rtw_write_rf(rtwdev, path, 0x43, RF_THEMAL_MASK, thermal[path]);
1089 	}
1090 }
1091 
1092 static void rtw8822c_pa_bias(struct rtw_dev *rtwdev)
1093 {
1094 	u16 rf_efuse_2g[2] = {PPG_PABIAS_2GA, PPG_PABIAS_2GB};
1095 	u16 rf_efuse_5g[2] = {PPG_PABIAS_5GA, PPG_PABIAS_5GB};
1096 	u8 pg_pa_bias = 0xff, path;
1097 
1098 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1099 		rtw_read8_physical_efuse(rtwdev, rf_efuse_2g[path],
1100 					 &pg_pa_bias);
1101 		if (pg_pa_bias == EFUSE_READ_FAIL)
1102 			return;
1103 		pg_pa_bias = FIELD_GET(PPG_PABIAS_MASK, pg_pa_bias);
1104 		rtw_write_rf(rtwdev, path, 0x60, RF_PABIAS_2G_MASK, pg_pa_bias);
1105 	}
1106 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1107 		rtw_read8_physical_efuse(rtwdev, rf_efuse_5g[path],
1108 					 &pg_pa_bias);
1109 		pg_pa_bias = FIELD_GET(PPG_PABIAS_MASK, pg_pa_bias);
1110 		rtw_write_rf(rtwdev, path, 0x60, RF_PABIAS_5G_MASK, pg_pa_bias);
1111 	}
1112 }
1113 
1114 static void rtw8822c_rf_init(struct rtw_dev *rtwdev)
1115 {
1116 	rtw8822c_rf_dac_cal(rtwdev);
1117 	rtw8822c_rf_x2_check(rtwdev);
1118 	rtw8822c_thermal_trim(rtwdev);
1119 	rtw8822c_power_trim(rtwdev);
1120 	rtw8822c_pa_bias(rtwdev);
1121 }
1122 
1123 static void rtw8822c_pwrtrack_init(struct rtw_dev *rtwdev)
1124 {
1125 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1126 	u8 path;
1127 
1128 	for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++) {
1129 		dm_info->delta_power_index[path] = 0;
1130 		ewma_thermal_init(&dm_info->avg_thermal[path]);
1131 		dm_info->thermal_avg[path] = 0xff;
1132 	}
1133 
1134 	dm_info->pwr_trk_triggered = false;
1135 	dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
1136 }
1137 
1138 static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev)
1139 {
1140 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1141 	struct rtw_hal *hal = &rtwdev->hal;
1142 	u8 crystal_cap;
1143 	u8 cck_gi_u_bnd_msb = 0;
1144 	u8 cck_gi_u_bnd_lsb = 0;
1145 	u8 cck_gi_l_bnd_msb = 0;
1146 	u8 cck_gi_l_bnd_lsb = 0;
1147 	bool is_tx2_path;
1148 
1149 	/* power on BB/RF domain */
1150 	rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
1151 		       BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
1152 	rtw_write8_set(rtwdev, REG_RF_CTRL,
1153 		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
1154 	rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN);
1155 
1156 	/* disable low rate DPD */
1157 	rtw_write32_mask(rtwdev, REG_DIS_DPD, DIS_DPD_MASK, DIS_DPD_RATEALL);
1158 
1159 	/* pre init before header files config */
1160 	rtw8822c_header_file_init(rtwdev, true);
1161 
1162 	rtw_phy_load_tables(rtwdev);
1163 
1164 	crystal_cap = rtwdev->efuse.crystal_cap & 0x7f;
1165 	rtw_write32_mask(rtwdev, REG_ANAPAR_XTAL_0, 0xfffc00,
1166 			 crystal_cap | (crystal_cap << 7));
1167 
1168 	/* post init after header files config */
1169 	rtw8822c_header_file_init(rtwdev, false);
1170 
1171 	is_tx2_path = false;
1172 	rtw8822c_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx,
1173 				 is_tx2_path);
1174 	rtw_phy_init(rtwdev);
1175 
1176 	cck_gi_u_bnd_msb = (u8)rtw_read32_mask(rtwdev, 0x1a98, 0xc000);
1177 	cck_gi_u_bnd_lsb = (u8)rtw_read32_mask(rtwdev, 0x1aa8, 0xf0000);
1178 	cck_gi_l_bnd_msb = (u8)rtw_read32_mask(rtwdev, 0x1a98, 0xc0);
1179 	cck_gi_l_bnd_lsb = (u8)rtw_read32_mask(rtwdev, 0x1a70, 0x0f000000);
1180 
1181 	dm_info->cck_gi_u_bnd = ((cck_gi_u_bnd_msb << 4) | (cck_gi_u_bnd_lsb));
1182 	dm_info->cck_gi_l_bnd = ((cck_gi_l_bnd_msb << 4) | (cck_gi_l_bnd_lsb));
1183 
1184 	rtw8822c_rf_init(rtwdev);
1185 	rtw8822c_pwrtrack_init(rtwdev);
1186 
1187 	rtw_bf_phy_init(rtwdev);
1188 }
1189 
1190 #define WLAN_TXQ_RPT_EN		0x1F
1191 #define WLAN_SLOT_TIME		0x09
1192 #define WLAN_PIFS_TIME		0x1C
1193 #define WLAN_SIFS_CCK_CONT_TX	0x0A
1194 #define WLAN_SIFS_OFDM_CONT_TX	0x0E
1195 #define WLAN_SIFS_CCK_TRX	0x0A
1196 #define WLAN_SIFS_OFDM_TRX	0x10
1197 #define WLAN_NAV_MAX		0xC8
1198 #define WLAN_RDG_NAV		0x05
1199 #define WLAN_TXOP_NAV		0x1B
1200 #define WLAN_CCK_RX_TSF		0x30
1201 #define WLAN_OFDM_RX_TSF	0x30
1202 #define WLAN_TBTT_PROHIBIT	0x04 /* unit : 32us */
1203 #define WLAN_TBTT_HOLD_TIME	0x064 /* unit : 32us */
1204 #define WLAN_DRV_EARLY_INT	0x04
1205 #define WLAN_BCN_CTRL_CLT0	0x10
1206 #define WLAN_BCN_DMA_TIME	0x02
1207 #define WLAN_BCN_MAX_ERR	0xFF
1208 #define WLAN_SIFS_CCK_DUR_TUNE	0x0A
1209 #define WLAN_SIFS_OFDM_DUR_TUNE	0x10
1210 #define WLAN_SIFS_CCK_CTX	0x0A
1211 #define WLAN_SIFS_CCK_IRX	0x0A
1212 #define WLAN_SIFS_OFDM_CTX	0x0E
1213 #define WLAN_SIFS_OFDM_IRX	0x0E
1214 #define WLAN_EIFS_DUR_TUNE	0x40
1215 #define WLAN_EDCA_VO_PARAM	0x002FA226
1216 #define WLAN_EDCA_VI_PARAM	0x005EA328
1217 #define WLAN_EDCA_BE_PARAM	0x005EA42B
1218 #define WLAN_EDCA_BK_PARAM	0x0000A44F
1219 
1220 #define WLAN_RX_FILTER0		0xFFFFFFFF
1221 #define WLAN_RX_FILTER2		0xFFFF
1222 #define WLAN_RCR_CFG		0xE400220E
1223 #define WLAN_RXPKT_MAX_SZ	12288
1224 #define WLAN_RXPKT_MAX_SZ_512	(WLAN_RXPKT_MAX_SZ >> 9)
1225 
1226 #define WLAN_AMPDU_MAX_TIME		0x70
1227 #define WLAN_RTS_LEN_TH			0xFF
1228 #define WLAN_RTS_TX_TIME_TH		0x08
1229 #define WLAN_MAX_AGG_PKT_LIMIT		0x3f
1230 #define WLAN_RTS_MAX_AGG_PKT_LIMIT	0x3f
1231 #define WLAN_PRE_TXCNT_TIME_TH		0x1E0
1232 #define FAST_EDCA_VO_TH		0x06
1233 #define FAST_EDCA_VI_TH		0x06
1234 #define FAST_EDCA_BE_TH		0x06
1235 #define FAST_EDCA_BK_TH		0x06
1236 #define WLAN_BAR_RETRY_LIMIT		0x01
1237 #define WLAN_BAR_ACK_TYPE		0x05
1238 #define WLAN_RA_TRY_RATE_AGG_LIMIT	0x08
1239 #define WLAN_RESP_TXRATE		0x84
1240 #define WLAN_ACK_TO			0x21
1241 #define WLAN_ACK_TO_CCK			0x6A
1242 #define WLAN_DATA_RATE_FB_CNT_1_4	0x01000000
1243 #define WLAN_DATA_RATE_FB_CNT_5_8	0x08070504
1244 #define WLAN_RTS_RATE_FB_CNT_5_8	0x08070504
1245 #define WLAN_DATA_RATE_FB_RATE0		0xFE01F010
1246 #define WLAN_DATA_RATE_FB_RATE0_H	0x40000000
1247 #define WLAN_RTS_RATE_FB_RATE1		0x003FF010
1248 #define WLAN_RTS_RATE_FB_RATE1_H	0x40000000
1249 #define WLAN_RTS_RATE_FB_RATE4		0x0600F010
1250 #define WLAN_RTS_RATE_FB_RATE4_H	0x400003E0
1251 #define WLAN_RTS_RATE_FB_RATE5		0x0600F015
1252 #define WLAN_RTS_RATE_FB_RATE5_H	0x000000E0
1253 #define WLAN_MULTI_ADDR			0xFFFFFFFF
1254 
1255 #define WLAN_TX_FUNC_CFG1		0x30
1256 #define WLAN_TX_FUNC_CFG2		0x30
1257 #define WLAN_MAC_OPT_NORM_FUNC1		0x98
1258 #define WLAN_MAC_OPT_LB_FUNC1		0x80
1259 #define WLAN_MAC_OPT_FUNC2		0x30810041
1260 #define WLAN_MAC_INT_MIG_CFG		0x33330000
1261 
1262 #define WLAN_SIFS_CFG	(WLAN_SIFS_CCK_CONT_TX | \
1263 			(WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \
1264 			(WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \
1265 			(WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX))
1266 
1267 #define WLAN_SIFS_DUR_TUNE	(WLAN_SIFS_CCK_DUR_TUNE | \
1268 				(WLAN_SIFS_OFDM_DUR_TUNE << 8))
1269 
1270 #define WLAN_TBTT_TIME	(WLAN_TBTT_PROHIBIT |\
1271 			(WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
1272 
1273 #define WLAN_NAV_CFG		(WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16))
1274 #define WLAN_RX_TSF_CFG		(WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8)
1275 
1276 #define MAC_CLK_SPEED	80 /* 80M */
1277 #define EFUSE_PCB_INFO_OFFSET	0xCA
1278 
1279 static int rtw8822c_mac_init(struct rtw_dev *rtwdev)
1280 {
1281 	u8 value8;
1282 	u16 value16;
1283 	u32 value32;
1284 	u16 pre_txcnt;
1285 
1286 	/* txq control */
1287 	value8 = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL);
1288 	value8 |= (BIT(7) & ~BIT(1) & ~BIT(2));
1289 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL, value8);
1290 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
1291 	/* sifs control */
1292 	rtw_write16(rtwdev, REG_SPEC_SIFS, WLAN_SIFS_DUR_TUNE);
1293 	rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG);
1294 	rtw_write16(rtwdev, REG_RESP_SIFS_CCK,
1295 		    WLAN_SIFS_CCK_CTX | WLAN_SIFS_CCK_IRX << 8);
1296 	rtw_write16(rtwdev, REG_RESP_SIFS_OFDM,
1297 		    WLAN_SIFS_OFDM_CTX | WLAN_SIFS_OFDM_IRX << 8);
1298 	/* rate fallback control */
1299 	rtw_write32(rtwdev, REG_DARFRC, WLAN_DATA_RATE_FB_CNT_1_4);
1300 	rtw_write32(rtwdev, REG_DARFRCH, WLAN_DATA_RATE_FB_CNT_5_8);
1301 	rtw_write32(rtwdev, REG_RARFRCH, WLAN_RTS_RATE_FB_CNT_5_8);
1302 	rtw_write32(rtwdev, REG_ARFR0, WLAN_DATA_RATE_FB_RATE0);
1303 	rtw_write32(rtwdev, REG_ARFRH0, WLAN_DATA_RATE_FB_RATE0_H);
1304 	rtw_write32(rtwdev, REG_ARFR1_V1, WLAN_RTS_RATE_FB_RATE1);
1305 	rtw_write32(rtwdev, REG_ARFRH1_V1, WLAN_RTS_RATE_FB_RATE1_H);
1306 	rtw_write32(rtwdev, REG_ARFR4, WLAN_RTS_RATE_FB_RATE4);
1307 	rtw_write32(rtwdev, REG_ARFRH4, WLAN_RTS_RATE_FB_RATE4_H);
1308 	rtw_write32(rtwdev, REG_ARFR5, WLAN_RTS_RATE_FB_RATE5);
1309 	rtw_write32(rtwdev, REG_ARFRH5, WLAN_RTS_RATE_FB_RATE5_H);
1310 	/* protocol configuration */
1311 	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
1312 	rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
1313 	pre_txcnt = WLAN_PRE_TXCNT_TIME_TH | BIT_EN_PRECNT;
1314 	rtw_write8(rtwdev, REG_PRECNT_CTRL, (u8)(pre_txcnt & 0xFF));
1315 	rtw_write8(rtwdev, REG_PRECNT_CTRL + 1, (u8)(pre_txcnt >> 8));
1316 	value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
1317 		  (WLAN_MAX_AGG_PKT_LIMIT << 16) |
1318 		  (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24);
1319 	rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32);
1320 	rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2,
1321 		    WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
1322 	rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH);
1323 	rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH);
1324 	rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH);
1325 	rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH);
1326 	/* close BA parser */
1327 	rtw_write8_clr(rtwdev, REG_LIFETIME_EN, BIT_BA_PARSER_EN);
1328 	rtw_write32_clr(rtwdev, REG_RRSR, BITS_RRSR_RSC);
1329 
1330 	/* EDCA configuration */
1331 	rtw_write32(rtwdev, REG_EDCA_VO_PARAM, WLAN_EDCA_VO_PARAM);
1332 	rtw_write32(rtwdev, REG_EDCA_VI_PARAM, WLAN_EDCA_VI_PARAM);
1333 	rtw_write32(rtwdev, REG_EDCA_BE_PARAM, WLAN_EDCA_BE_PARAM);
1334 	rtw_write32(rtwdev, REG_EDCA_BK_PARAM, WLAN_EDCA_BK_PARAM);
1335 	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME);
1336 	rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
1337 	rtw_write8_set(rtwdev, REG_RD_CTRL + 1,
1338 		       (BIT_DIS_TXOP_CFE | BIT_DIS_LSIG_CFE |
1339 			BIT_DIS_STBC_CFE) >> 8);
1340 
1341 	/* MAC clock configuration */
1342 	rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BIT_MAC_CLK_SEL);
1343 	rtw_write8(rtwdev, REG_USTIME_TSF, MAC_CLK_SPEED);
1344 	rtw_write8(rtwdev, REG_USTIME_EDCA, MAC_CLK_SPEED);
1345 
1346 	rtw_write8_set(rtwdev, REG_MISC_CTRL,
1347 		       BIT_EN_FREE_CNT | BIT_DIS_SECOND_CCA);
1348 	rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0);
1349 	rtw_write16(rtwdev, REG_TXPAUSE, 0x0000);
1350 	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
1351 	rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG);
1352 	rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
1353 	/* Set beacon cotnrol - enable TSF and other related functions */
1354 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
1355 	/* Set send beacon related registers */
1356 	rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
1357 	rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
1358 	rtw_write8(rtwdev, REG_BCN_CTRL_CLINT0, WLAN_BCN_CTRL_CLT0);
1359 	rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
1360 	rtw_write8(rtwdev, REG_BCN_MAX_ERR, WLAN_BCN_MAX_ERR);
1361 
1362 	/* WMAC configuration */
1363 	rtw_write32(rtwdev, REG_MAR, WLAN_MULTI_ADDR);
1364 	rtw_write32(rtwdev, REG_MAR + 4, WLAN_MULTI_ADDR);
1365 	rtw_write8(rtwdev, REG_BBPSF_CTRL + 2, WLAN_RESP_TXRATE);
1366 	rtw_write8(rtwdev, REG_ACKTO, WLAN_ACK_TO);
1367 	rtw_write8(rtwdev, REG_ACKTO_CCK, WLAN_ACK_TO_CCK);
1368 	rtw_write16(rtwdev, REG_EIFS, WLAN_EIFS_DUR_TUNE);
1369 	rtw_write8(rtwdev, REG_NAV_CTRL + 2, WLAN_NAV_MAX);
1370 	rtw_write8(rtwdev, REG_WMAC_TRXPTCL_CTL_H  + 2, WLAN_BAR_ACK_TYPE);
1371 	rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
1372 	rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
1373 	rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
1374 	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
1375 	rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2);
1376 	rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
1377 	rtw_write32_set(rtwdev, REG_GENERAL_OPTION, BIT_DUMMY_FCS_READY_MASK_EN);
1378 	rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
1379 	rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION_1, WLAN_MAC_OPT_NORM_FUNC1);
1380 
1381 	/* init low power */
1382 	value16 = rtw_read16(rtwdev, REG_RXPSF_CTRL + 2) & 0xF00F;
1383 	value16 |= (BIT_RXGCK_VHT_FIFOTHR(1) | BIT_RXGCK_HT_FIFOTHR(1) |
1384 		    BIT_RXGCK_OFDM_FIFOTHR(1) | BIT_RXGCK_CCK_FIFOTHR(1)) >> 16;
1385 	rtw_write16(rtwdev, REG_RXPSF_CTRL + 2, value16);
1386 	value16 = 0;
1387 	value16 = BIT_SET_RXPSF_PKTLENTHR(value16, 1);
1388 	value16 |= BIT_RXPSF_CTRLEN | BIT_RXPSF_VHTCHKEN | BIT_RXPSF_HTCHKEN
1389 		| BIT_RXPSF_OFDMCHKEN | BIT_RXPSF_CCKCHKEN
1390 		| BIT_RXPSF_OFDMRST;
1391 	rtw_write16(rtwdev, REG_RXPSF_CTRL, value16);
1392 	rtw_write32(rtwdev, REG_RXPSF_TYPE_CTRL, 0xFFFFFFFF);
1393 	/* rx ignore configuration */
1394 	value16 = rtw_read16(rtwdev, REG_RXPSF_CTRL);
1395 	value16 &= ~(BIT_RXPSF_MHCHKEN | BIT_RXPSF_CCKRST |
1396 		     BIT_RXPSF_CONT_ERRCHKEN);
1397 	value16 = BIT_SET_RXPSF_ERRTHR(value16, 0x07);
1398 	rtw_write16(rtwdev, REG_RXPSF_CTRL, value16);
1399 
1400 	/* Interrupt migration configuration */
1401 	rtw_write32(rtwdev, REG_INT_MIG, WLAN_MAC_INT_MIG_CFG);
1402 
1403 	return 0;
1404 }
1405 
1406 static void rtw8822c_rstb_3wire(struct rtw_dev *rtwdev, bool enable)
1407 {
1408 	if (enable) {
1409 		rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x1);
1410 		rtw_write32_mask(rtwdev, REG_ANAPAR_A, BIT_ANAPAR_UPDATE, 0x1);
1411 		rtw_write32_mask(rtwdev, REG_ANAPAR_B, BIT_ANAPAR_UPDATE, 0x1);
1412 	} else {
1413 		rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x0);
1414 	}
1415 }
1416 
1417 static void rtw8822c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
1418 {
1419 #define RF18_BAND_MASK		(BIT(16) | BIT(9) | BIT(8))
1420 #define RF18_BAND_2G		(0)
1421 #define RF18_BAND_5G		(BIT(16) | BIT(8))
1422 #define RF18_CHANNEL_MASK	(MASKBYTE0)
1423 #define RF18_RFSI_MASK		(BIT(18) | BIT(17))
1424 #define RF18_RFSI_GE_CH80	(BIT(17))
1425 #define RF18_RFSI_GT_CH140	(BIT(18))
1426 #define RF18_BW_MASK		(BIT(13) | BIT(12))
1427 #define RF18_BW_20M		(BIT(13) | BIT(12))
1428 #define RF18_BW_40M		(BIT(13))
1429 #define RF18_BW_80M		(BIT(12))
1430 
1431 	u32 rf_reg18 = 0;
1432 	u32 rf_rxbb = 0;
1433 
1434 	rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
1435 
1436 	rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK |
1437 		      RF18_BW_MASK);
1438 
1439 	rf_reg18 |= (IS_CH_2G_BAND(channel) ? RF18_BAND_2G : RF18_BAND_5G);
1440 	rf_reg18 |= (channel & RF18_CHANNEL_MASK);
1441 	if (IS_CH_5G_BAND_4(channel))
1442 		rf_reg18 |= RF18_RFSI_GT_CH140;
1443 	else if (IS_CH_5G_BAND_3(channel))
1444 		rf_reg18 |= RF18_RFSI_GE_CH80;
1445 
1446 	switch (bw) {
1447 	case RTW_CHANNEL_WIDTH_5:
1448 	case RTW_CHANNEL_WIDTH_10:
1449 	case RTW_CHANNEL_WIDTH_20:
1450 	default:
1451 		rf_reg18 |= RF18_BW_20M;
1452 		rf_rxbb = 0x18;
1453 		break;
1454 	case RTW_CHANNEL_WIDTH_40:
1455 		/* RF bandwidth */
1456 		rf_reg18 |= RF18_BW_40M;
1457 		rf_rxbb = 0x10;
1458 		break;
1459 	case RTW_CHANNEL_WIDTH_80:
1460 		rf_reg18 |= RF18_BW_80M;
1461 		rf_rxbb = 0x8;
1462 		break;
1463 	}
1464 
1465 	rtw8822c_rstb_3wire(rtwdev, false);
1466 
1467 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, 0x04, 0x01);
1468 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, 0x1f, 0x12);
1469 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, 0xfffff, rf_rxbb);
1470 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, 0x04, 0x00);
1471 
1472 	rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE2, 0x04, 0x01);
1473 	rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWA, 0x1f, 0x12);
1474 	rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWD0, 0xfffff, rf_rxbb);
1475 	rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE2, 0x04, 0x00);
1476 
1477 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_reg18);
1478 	rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_reg18);
1479 
1480 	rtw8822c_rstb_3wire(rtwdev, true);
1481 }
1482 
1483 static void rtw8822c_toggle_igi(struct rtw_dev *rtwdev)
1484 {
1485 	u32 igi;
1486 
1487 	igi = rtw_read32_mask(rtwdev, REG_RXIGI, 0x7f);
1488 	rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f, igi - 2);
1489 	rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f00, igi - 2);
1490 	rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f, igi);
1491 	rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f00, igi);
1492 }
1493 
1494 static void rtw8822c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
1495 				    u8 primary_ch_idx)
1496 {
1497 	if (IS_CH_2G_BAND(channel)) {
1498 		rtw_write32_clr(rtwdev, REG_BGCTRL, BITS_RX_IQ_WEIGHT);
1499 		rtw_write32_set(rtwdev, REG_TXF4, BIT(20));
1500 		rtw_write32_clr(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN);
1501 		rtw_write32_clr(rtwdev, REG_CCKTXONLY, BIT_BB_CCK_CHECK_EN);
1502 		rtw_write32_mask(rtwdev, REG_CCAMSK, 0x3F000000, 0xF);
1503 
1504 		switch (bw) {
1505 		case RTW_CHANNEL_WIDTH_20:
1506 			rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_CCK,
1507 					 0x5);
1508 			rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_CCK,
1509 					 0x5);
1510 			rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
1511 					 0x6);
1512 			rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
1513 					 0x6);
1514 			break;
1515 		case RTW_CHANNEL_WIDTH_40:
1516 			rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_CCK,
1517 					 0x4);
1518 			rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_CCK,
1519 					 0x4);
1520 			rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
1521 					 0x0);
1522 			rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
1523 					 0x0);
1524 			break;
1525 		}
1526 		if (channel == 13 || channel == 14)
1527 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x969);
1528 		else if (channel == 11 || channel == 12)
1529 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x96a);
1530 		else
1531 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x9aa);
1532 		if (channel == 14) {
1533 			rtw_write32_mask(rtwdev, REG_TXF0, MASKHWORD, 0x3da0);
1534 			rtw_write32_mask(rtwdev, REG_TXF1, MASKDWORD,
1535 					 0x4962c931);
1536 			rtw_write32_mask(rtwdev, REG_TXF2, MASKLWORD, 0x6aa3);
1537 			rtw_write32_mask(rtwdev, REG_TXF3, MASKHWORD, 0xaa7b);
1538 			rtw_write32_mask(rtwdev, REG_TXF4, MASKLWORD, 0xf3d7);
1539 			rtw_write32_mask(rtwdev, REG_TXF5, MASKDWORD, 0x0);
1540 			rtw_write32_mask(rtwdev, REG_TXF6, MASKDWORD,
1541 					 0xff012455);
1542 			rtw_write32_mask(rtwdev, REG_TXF7, MASKDWORD, 0xffff);
1543 		} else {
1544 			rtw_write32_mask(rtwdev, REG_TXF0, MASKHWORD, 0x5284);
1545 			rtw_write32_mask(rtwdev, REG_TXF1, MASKDWORD,
1546 					 0x3e18fec8);
1547 			rtw_write32_mask(rtwdev, REG_TXF2, MASKLWORD, 0x0a88);
1548 			rtw_write32_mask(rtwdev, REG_TXF3, MASKHWORD, 0xacc4);
1549 			rtw_write32_mask(rtwdev, REG_TXF4, MASKLWORD, 0xc8b2);
1550 			rtw_write32_mask(rtwdev, REG_TXF5, MASKDWORD,
1551 					 0x00faf0de);
1552 			rtw_write32_mask(rtwdev, REG_TXF6, MASKDWORD,
1553 					 0x00122344);
1554 			rtw_write32_mask(rtwdev, REG_TXF7, MASKDWORD,
1555 					 0x0fffffff);
1556 		}
1557 		if (channel == 13)
1558 			rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x3);
1559 		else
1560 			rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x1);
1561 	} else if (IS_CH_5G_BAND(channel)) {
1562 		rtw_write32_set(rtwdev, REG_CCKTXONLY, BIT_BB_CCK_CHECK_EN);
1563 		rtw_write32_set(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN);
1564 		rtw_write32_set(rtwdev, REG_BGCTRL, BITS_RX_IQ_WEIGHT);
1565 		rtw_write32_clr(rtwdev, REG_TXF4, BIT(20));
1566 		rtw_write32_mask(rtwdev, REG_CCAMSK, 0x3F000000, 0x22);
1567 		rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x3);
1568 		if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel)) {
1569 			rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
1570 					 0x1);
1571 			rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
1572 					 0x1);
1573 		} else if (IS_CH_5G_BAND_3(channel)) {
1574 			rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
1575 					 0x2);
1576 			rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
1577 					 0x2);
1578 		} else if (IS_CH_5G_BAND_4(channel)) {
1579 			rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM,
1580 					 0x3);
1581 			rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM,
1582 					 0x3);
1583 		}
1584 
1585 		if (channel >= 36 && channel <= 51)
1586 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x494);
1587 		else if (channel >= 52 && channel <= 55)
1588 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x493);
1589 		else if (channel >= 56 && channel <= 111)
1590 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x453);
1591 		else if (channel >= 112 && channel <= 119)
1592 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x452);
1593 		else if (channel >= 120 && channel <= 172)
1594 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x412);
1595 		else if (channel >= 173 && channel <= 177)
1596 			rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x411);
1597 	}
1598 
1599 	switch (bw) {
1600 	case RTW_CHANNEL_WIDTH_20:
1601 		rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x19B);
1602 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0);
1603 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x0);
1604 		rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x7);
1605 		rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x6);
1606 		rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0);
1607 		rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
1608 		rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0);
1609 		break;
1610 	case RTW_CHANNEL_WIDTH_40:
1611 		rtw_write32_mask(rtwdev, REG_CCKSB, BIT(4),
1612 				 (primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0));
1613 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x5);
1614 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xc0, 0x0);
1615 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xff00,
1616 				 (primary_ch_idx | (primary_ch_idx << 4)));
1617 		rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x1);
1618 		rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
1619 		rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x1);
1620 		break;
1621 	case RTW_CHANNEL_WIDTH_80:
1622 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0xa);
1623 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xc0, 0x0);
1624 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xff00,
1625 				 (primary_ch_idx | (primary_ch_idx << 4)));
1626 		rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x6);
1627 		rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x1);
1628 		break;
1629 	case RTW_CHANNEL_WIDTH_5:
1630 		rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x2AB);
1631 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0);
1632 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x1);
1633 		rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x4);
1634 		rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x4);
1635 		rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0);
1636 		rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
1637 		rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0);
1638 		break;
1639 	case RTW_CHANNEL_WIDTH_10:
1640 		rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x2AB);
1641 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0);
1642 		rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x2);
1643 		rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x6);
1644 		rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x5);
1645 		rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0);
1646 		rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1);
1647 		rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0);
1648 		break;
1649 	}
1650 }
1651 
1652 static void rtw8822c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
1653 				 u8 primary_chan_idx)
1654 {
1655 	rtw8822c_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
1656 	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
1657 	rtw8822c_set_channel_rf(rtwdev, channel, bw);
1658 	rtw8822c_toggle_igi(rtwdev);
1659 }
1660 
1661 static void rtw8822c_config_cck_rx_path(struct rtw_dev *rtwdev, u8 rx_path)
1662 {
1663 	if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
1664 		rtw_write32_mask(rtwdev, REG_CCANRX, 0x00060000, 0x0);
1665 		rtw_write32_mask(rtwdev, REG_CCANRX, 0x00600000, 0x0);
1666 	} else if (rx_path == BB_PATH_AB) {
1667 		rtw_write32_mask(rtwdev, REG_CCANRX, 0x00600000, 0x1);
1668 		rtw_write32_mask(rtwdev, REG_CCANRX, 0x00060000, 0x1);
1669 	}
1670 
1671 	if (rx_path == BB_PATH_A)
1672 		rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x0);
1673 	else if (rx_path == BB_PATH_B)
1674 		rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x5);
1675 	else if (rx_path == BB_PATH_AB)
1676 		rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x1);
1677 }
1678 
1679 static void rtw8822c_config_ofdm_rx_path(struct rtw_dev *rtwdev, u8 rx_path)
1680 {
1681 	if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
1682 		rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x300, 0x0);
1683 		rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x600000, 0x0);
1684 		rtw_write32_mask(rtwdev, REG_AGCSWSH, BIT(17), 0x0);
1685 		rtw_write32_mask(rtwdev, REG_ANTWTPD, BIT(20), 0x0);
1686 		rtw_write32_mask(rtwdev, REG_MRCM, BIT(24), 0x0);
1687 	} else if (rx_path == BB_PATH_AB) {
1688 		rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x300, 0x1);
1689 		rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x600000, 0x1);
1690 		rtw_write32_mask(rtwdev, REG_AGCSWSH, BIT(17), 0x1);
1691 		rtw_write32_mask(rtwdev, REG_ANTWTPD, BIT(20), 0x1);
1692 		rtw_write32_mask(rtwdev, REG_MRCM, BIT(24), 0x1);
1693 	}
1694 
1695 	rtw_write32_mask(rtwdev, 0x824, 0x0f000000, rx_path);
1696 	rtw_write32_mask(rtwdev, 0x824, 0x000f0000, rx_path);
1697 }
1698 
1699 static void rtw8822c_config_rx_path(struct rtw_dev *rtwdev, u8 rx_path)
1700 {
1701 	rtw8822c_config_cck_rx_path(rtwdev, rx_path);
1702 	rtw8822c_config_ofdm_rx_path(rtwdev, rx_path);
1703 }
1704 
1705 static void rtw8822c_config_cck_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
1706 					bool is_tx2_path)
1707 {
1708 	if (tx_path == BB_PATH_A) {
1709 		rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8);
1710 	} else if (tx_path == BB_PATH_B) {
1711 		rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x4);
1712 	} else {
1713 		if (is_tx2_path)
1714 			rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0xc);
1715 		else
1716 			rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8);
1717 	}
1718 }
1719 
1720 static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
1721 					 bool is_tx2_path)
1722 {
1723 	if (tx_path == BB_PATH_A) {
1724 		rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x11);
1725 		rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0);
1726 	} else if (tx_path == BB_PATH_B) {
1727 		rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x12);
1728 		rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0);
1729 	} else {
1730 		if (is_tx2_path) {
1731 			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x33);
1732 			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0404);
1733 		} else {
1734 			rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x31);
1735 			rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400);
1736 		}
1737 	}
1738 }
1739 
1740 static void rtw8822c_config_tx_path(struct rtw_dev *rtwdev, u8 tx_path,
1741 				    bool is_tx2_path)
1742 {
1743 	rtw8822c_config_cck_tx_path(rtwdev, tx_path, is_tx2_path);
1744 	rtw8822c_config_ofdm_tx_path(rtwdev, tx_path, is_tx2_path);
1745 }
1746 
1747 static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
1748 				     u8 rx_path, bool is_tx2_path)
1749 {
1750 	if ((tx_path | rx_path) & BB_PATH_A)
1751 		rtw_write32_mask(rtwdev, REG_ORITXCODE, MASK20BITS, 0x33312);
1752 	else
1753 		rtw_write32_mask(rtwdev, REG_ORITXCODE, MASK20BITS, 0x11111);
1754 	if ((tx_path | rx_path) & BB_PATH_B)
1755 		rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x33312);
1756 	else
1757 		rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x11111);
1758 
1759 	rtw8822c_config_rx_path(rtwdev, rx_path);
1760 	rtw8822c_config_tx_path(rtwdev, tx_path, is_tx2_path);
1761 
1762 	rtw8822c_toggle_igi(rtwdev);
1763 }
1764 
1765 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
1766 				   struct rtw_rx_pkt_stat *pkt_stat)
1767 {
1768 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1769 	u8 l_bnd, u_bnd;
1770 	u8 gain_a, gain_b;
1771 	s8 rx_power[RTW_RF_PATH_MAX];
1772 	s8 min_rx_power = -120;
1773 	u8 rssi;
1774 	int path;
1775 
1776 	rx_power[RF_PATH_A] = GET_PHY_STAT_P0_PWDB_A(phy_status);
1777 	rx_power[RF_PATH_B] = GET_PHY_STAT_P0_PWDB_B(phy_status);
1778 	l_bnd = dm_info->cck_gi_l_bnd;
1779 	u_bnd = dm_info->cck_gi_u_bnd;
1780 	gain_a = GET_PHY_STAT_P0_GAIN_A(phy_status);
1781 	gain_b = GET_PHY_STAT_P0_GAIN_B(phy_status);
1782 	if (gain_a < l_bnd)
1783 		rx_power[RF_PATH_A] += (l_bnd - gain_a) << 1;
1784 	else if (gain_a > u_bnd)
1785 		rx_power[RF_PATH_A] -= (gain_a - u_bnd) << 1;
1786 	if (gain_b < l_bnd)
1787 		rx_power[RF_PATH_B] += (l_bnd - gain_b) << 1;
1788 	else if (gain_b > u_bnd)
1789 		rx_power[RF_PATH_B] -= (gain_b - u_bnd) << 1;
1790 
1791 	rx_power[RF_PATH_A] -= 110;
1792 	rx_power[RF_PATH_B] -= 110;
1793 
1794 	pkt_stat->rx_power[RF_PATH_A] = rx_power[RF_PATH_A];
1795 	pkt_stat->rx_power[RF_PATH_B] = rx_power[RF_PATH_B];
1796 
1797 	for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
1798 		rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
1799 		dm_info->rssi[path] = rssi;
1800 	}
1801 
1802 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
1803 	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
1804 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
1805 				     min_rx_power);
1806 }
1807 
1808 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
1809 				   struct rtw_rx_pkt_stat *pkt_stat)
1810 {
1811 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1812 	u8 rxsc, bw;
1813 	s8 min_rx_power = -120;
1814 	s8 rx_evm;
1815 	u8 evm_dbm = 0;
1816 	u8 rssi;
1817 	int path;
1818 
1819 	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
1820 		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
1821 	else
1822 		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
1823 
1824 	if (rxsc >= 9 && rxsc <= 12)
1825 		bw = RTW_CHANNEL_WIDTH_40;
1826 	else if (rxsc >= 13)
1827 		bw = RTW_CHANNEL_WIDTH_80;
1828 	else
1829 		bw = RTW_CHANNEL_WIDTH_20;
1830 
1831 	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
1832 	pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110;
1833 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 2);
1834 	pkt_stat->bw = bw;
1835 	pkt_stat->signal_power = max3(pkt_stat->rx_power[RF_PATH_A],
1836 				      pkt_stat->rx_power[RF_PATH_B],
1837 				      min_rx_power);
1838 
1839 	dm_info->curr_rx_rate = pkt_stat->rate;
1840 
1841 	pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
1842 	pkt_stat->rx_evm[RF_PATH_B] = GET_PHY_STAT_P1_RXEVM_B(phy_status);
1843 
1844 	pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
1845 	pkt_stat->rx_snr[RF_PATH_B] = GET_PHY_STAT_P1_RXSNR_B(phy_status);
1846 
1847 	pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
1848 	pkt_stat->cfo_tail[RF_PATH_B] = GET_PHY_STAT_P1_CFO_TAIL_B(phy_status);
1849 
1850 	for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
1851 		rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
1852 		dm_info->rssi[path] = rssi;
1853 		dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1;
1854 		dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1;
1855 
1856 		rx_evm = pkt_stat->rx_evm[path];
1857 
1858 		if (rx_evm < 0) {
1859 			if (rx_evm == S8_MIN)
1860 				evm_dbm = 0;
1861 			else
1862 				evm_dbm = ((u8)-rx_evm >> 1);
1863 		}
1864 		dm_info->rx_evm_dbm[path] = evm_dbm;
1865 	}
1866 }
1867 
1868 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
1869 			     struct rtw_rx_pkt_stat *pkt_stat)
1870 {
1871 	u8 page;
1872 
1873 	page = *phy_status & 0xf;
1874 
1875 	switch (page) {
1876 	case 0:
1877 		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
1878 		break;
1879 	case 1:
1880 		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
1881 		break;
1882 	default:
1883 		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
1884 		return;
1885 	}
1886 }
1887 
1888 static void rtw8822c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
1889 				   struct rtw_rx_pkt_stat *pkt_stat,
1890 				   struct ieee80211_rx_status *rx_status)
1891 {
1892 	struct ieee80211_hdr *hdr;
1893 	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
1894 	u8 *phy_status = NULL;
1895 
1896 	memset(pkt_stat, 0, sizeof(*pkt_stat));
1897 
1898 	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
1899 	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
1900 	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
1901 	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
1902 			      GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
1903 	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
1904 	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
1905 	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
1906 	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
1907 	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
1908 	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
1909 	pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
1910 	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
1911 
1912 	/* drv_info_sz is in unit of 8-bytes */
1913 	pkt_stat->drv_info_sz *= 8;
1914 
1915 	/* c2h cmd pkt's rx/phy status is not interested */
1916 	if (pkt_stat->is_c2h)
1917 		return;
1918 
1919 	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
1920 				       pkt_stat->drv_info_sz);
1921 	if (pkt_stat->phy_status) {
1922 		phy_status = rx_desc + desc_sz + pkt_stat->shift;
1923 		query_phy_status(rtwdev, phy_status, pkt_stat);
1924 	}
1925 
1926 	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
1927 }
1928 
1929 static void
1930 rtw8822c_set_write_tx_power_ref(struct rtw_dev *rtwdev, u8 *tx_pwr_ref_cck,
1931 				u8 *tx_pwr_ref_ofdm)
1932 {
1933 	struct rtw_hal *hal = &rtwdev->hal;
1934 	u32 txref_cck[2] = {0x18a0, 0x41a0};
1935 	u32 txref_ofdm[2] = {0x18e8, 0x41e8};
1936 	u8 path;
1937 
1938 	for (path = 0; path < hal->rf_path_num; path++) {
1939 		rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0);
1940 		rtw_write32_mask(rtwdev, txref_cck[path], 0x7f0000,
1941 				 tx_pwr_ref_cck[path]);
1942 	}
1943 	for (path = 0; path < hal->rf_path_num; path++) {
1944 		rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0);
1945 		rtw_write32_mask(rtwdev, txref_ofdm[path], 0x1fc00,
1946 				 tx_pwr_ref_ofdm[path]);
1947 	}
1948 }
1949 
1950 static void rtw8822c_set_tx_power_diff(struct rtw_dev *rtwdev, u8 rate,
1951 				       s8 *diff_idx)
1952 {
1953 	u32 offset_txagc = 0x3a00;
1954 	u8 rate_idx = rate & 0xfc;
1955 	u8 pwr_idx[4];
1956 	u32 phy_pwr_idx;
1957 	int i;
1958 
1959 	for (i = 0; i < 4; i++)
1960 		pwr_idx[i] = diff_idx[i] & 0x7f;
1961 
1962 	phy_pwr_idx = pwr_idx[0] |
1963 		      (pwr_idx[1] << 8) |
1964 		      (pwr_idx[2] << 16) |
1965 		      (pwr_idx[3] << 24);
1966 
1967 	rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0x0);
1968 	rtw_write32_mask(rtwdev, offset_txagc + rate_idx, MASKDWORD,
1969 			 phy_pwr_idx);
1970 }
1971 
1972 static void rtw8822c_set_tx_power_index(struct rtw_dev *rtwdev)
1973 {
1974 	struct rtw_hal *hal = &rtwdev->hal;
1975 	u8 rs, rate, j;
1976 	u8 pwr_ref_cck[2] = {hal->tx_pwr_tbl[RF_PATH_A][DESC_RATE11M],
1977 			     hal->tx_pwr_tbl[RF_PATH_B][DESC_RATE11M]};
1978 	u8 pwr_ref_ofdm[2] = {hal->tx_pwr_tbl[RF_PATH_A][DESC_RATEMCS7],
1979 			      hal->tx_pwr_tbl[RF_PATH_B][DESC_RATEMCS7]};
1980 	s8 diff_a, diff_b;
1981 	u8 pwr_a, pwr_b;
1982 	s8 diff_idx[4];
1983 
1984 	rtw8822c_set_write_tx_power_ref(rtwdev, pwr_ref_cck, pwr_ref_ofdm);
1985 	for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) {
1986 		for (j = 0; j < rtw_rate_size[rs]; j++) {
1987 			rate = rtw_rate_section[rs][j];
1988 			pwr_a = hal->tx_pwr_tbl[RF_PATH_A][rate];
1989 			pwr_b = hal->tx_pwr_tbl[RF_PATH_B][rate];
1990 			if (rs == 0) {
1991 				diff_a = (s8)pwr_a - (s8)pwr_ref_cck[0];
1992 				diff_b = (s8)pwr_b - (s8)pwr_ref_cck[1];
1993 			} else {
1994 				diff_a = (s8)pwr_a - (s8)pwr_ref_ofdm[0];
1995 				diff_b = (s8)pwr_b - (s8)pwr_ref_ofdm[1];
1996 			}
1997 			diff_idx[rate % 4] = min(diff_a, diff_b);
1998 			if (rate % 4 == 3)
1999 				rtw8822c_set_tx_power_diff(rtwdev, rate - 3,
2000 							   diff_idx);
2001 		}
2002 	}
2003 }
2004 
2005 static int rtw8822c_set_antenna(struct rtw_dev *rtwdev,
2006 				u32 antenna_tx,
2007 				u32 antenna_rx)
2008 {
2009 	struct rtw_hal *hal = &rtwdev->hal;
2010 
2011 	switch (antenna_tx) {
2012 	case BB_PATH_A:
2013 	case BB_PATH_B:
2014 	case BB_PATH_AB:
2015 		break;
2016 	default:
2017 		rtw_info(rtwdev, "unsupport tx path 0x%x\n", antenna_tx);
2018 		return -EINVAL;
2019 	}
2020 
2021 	/* path B only is not available for RX */
2022 	switch (antenna_rx) {
2023 	case BB_PATH_A:
2024 	case BB_PATH_AB:
2025 		break;
2026 	default:
2027 		rtw_info(rtwdev, "unsupport rx path 0x%x\n", antenna_rx);
2028 		return -EINVAL;
2029 	}
2030 
2031 	hal->antenna_tx = antenna_tx;
2032 	hal->antenna_rx = antenna_rx;
2033 
2034 	rtw8822c_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false);
2035 
2036 	return 0;
2037 }
2038 
2039 static void rtw8822c_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
2040 {
2041 	u8 ldo_pwr;
2042 
2043 	ldo_pwr = rtw_read8(rtwdev, REG_ANAPARLDO_POW_MAC);
2044 	ldo_pwr = enable ? ldo_pwr | BIT_LDOE25_PON : ldo_pwr & ~BIT_LDOE25_PON;
2045 	rtw_write8(rtwdev, REG_ANAPARLDO_POW_MAC, ldo_pwr);
2046 }
2047 
2048 static void rtw8822c_false_alarm_statistics(struct rtw_dev *rtwdev)
2049 {
2050 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
2051 	u32 cck_enable;
2052 	u32 cck_fa_cnt;
2053 	u32 crc32_cnt;
2054 	u32 cca32_cnt;
2055 	u32 ofdm_fa_cnt;
2056 	u32 ofdm_fa_cnt1, ofdm_fa_cnt2, ofdm_fa_cnt3, ofdm_fa_cnt4, ofdm_fa_cnt5;
2057 	u16 parity_fail, rate_illegal, crc8_fail, mcs_fail, sb_search_fail,
2058 	    fast_fsync, crc8_fail_vhta, mcs_fail_vht;
2059 
2060 	cck_enable = rtw_read32(rtwdev, REG_ENCCK) & BIT_CCK_BLK_EN;
2061 	cck_fa_cnt = rtw_read16(rtwdev, REG_CCK_FACNT);
2062 
2063 	ofdm_fa_cnt1 = rtw_read32(rtwdev, REG_OFDM_FACNT1);
2064 	ofdm_fa_cnt2 = rtw_read32(rtwdev, REG_OFDM_FACNT2);
2065 	ofdm_fa_cnt3 = rtw_read32(rtwdev, REG_OFDM_FACNT3);
2066 	ofdm_fa_cnt4 = rtw_read32(rtwdev, REG_OFDM_FACNT4);
2067 	ofdm_fa_cnt5 = rtw_read32(rtwdev, REG_OFDM_FACNT5);
2068 
2069 	parity_fail	= FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt1);
2070 	rate_illegal	= FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt2);
2071 	crc8_fail	= FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt2);
2072 	crc8_fail_vhta	= FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt3);
2073 	mcs_fail	= FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt4);
2074 	mcs_fail_vht	= FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt4);
2075 	fast_fsync	= FIELD_GET(GENMASK(15, 0), ofdm_fa_cnt5);
2076 	sb_search_fail	= FIELD_GET(GENMASK(31, 16), ofdm_fa_cnt5);
2077 
2078 	ofdm_fa_cnt = parity_fail + rate_illegal + crc8_fail + crc8_fail_vhta +
2079 		      mcs_fail + mcs_fail_vht + fast_fsync + sb_search_fail;
2080 
2081 	dm_info->cck_fa_cnt = cck_fa_cnt;
2082 	dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
2083 	dm_info->total_fa_cnt = ofdm_fa_cnt;
2084 	dm_info->total_fa_cnt += cck_enable ? cck_fa_cnt : 0;
2085 
2086 	crc32_cnt = rtw_read32(rtwdev, 0x2c04);
2087 	dm_info->cck_ok_cnt = crc32_cnt & 0xffff;
2088 	dm_info->cck_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2089 	crc32_cnt = rtw_read32(rtwdev, 0x2c14);
2090 	dm_info->ofdm_ok_cnt = crc32_cnt & 0xffff;
2091 	dm_info->ofdm_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2092 	crc32_cnt = rtw_read32(rtwdev, 0x2c10);
2093 	dm_info->ht_ok_cnt = crc32_cnt & 0xffff;
2094 	dm_info->ht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2095 	crc32_cnt = rtw_read32(rtwdev, 0x2c0c);
2096 	dm_info->vht_ok_cnt = crc32_cnt & 0xffff;
2097 	dm_info->vht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
2098 
2099 	cca32_cnt = rtw_read32(rtwdev, 0x2c08);
2100 	dm_info->ofdm_cca_cnt = ((cca32_cnt & 0xffff0000) >> 16);
2101 	dm_info->cck_cca_cnt = cca32_cnt & 0xffff;
2102 	dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
2103 	if (cck_enable)
2104 		dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
2105 
2106 	rtw_write32_mask(rtwdev, REG_CCANRX, BIT_CCK_FA_RST, 0);
2107 	rtw_write32_mask(rtwdev, REG_CCANRX, BIT_CCK_FA_RST, 2);
2108 	rtw_write32_mask(rtwdev, REG_CCANRX, BIT_OFDM_FA_RST, 0);
2109 	rtw_write32_mask(rtwdev, REG_CCANRX, BIT_OFDM_FA_RST, 2);
2110 
2111 	/* disable rx clk gating to reset counters */
2112 	rtw_write32_clr(rtwdev, REG_RX_BREAK, BIT_COM_RX_GCK_EN);
2113 	rtw_write32_set(rtwdev, REG_CNT_CTRL, BIT_ALL_CNT_RST);
2114 	rtw_write32_clr(rtwdev, REG_CNT_CTRL, BIT_ALL_CNT_RST);
2115 	rtw_write32_set(rtwdev, REG_RX_BREAK, BIT_COM_RX_GCK_EN);
2116 }
2117 
2118 static void rtw8822c_do_iqk(struct rtw_dev *rtwdev)
2119 {
2120 	struct rtw_iqk_para para = {0};
2121 	u8 iqk_chk;
2122 	int counter;
2123 
2124 	para.clear = 1;
2125 	rtw_fw_do_iqk(rtwdev, &para);
2126 
2127 	for (counter = 0; counter < 300; counter++) {
2128 		iqk_chk = rtw_read8(rtwdev, REG_RPT_CIP);
2129 		if (iqk_chk == 0xaa)
2130 			break;
2131 		msleep(20);
2132 	}
2133 	rtw_write8(rtwdev, REG_IQKSTAT, 0x0);
2134 
2135 	rtw_dbg(rtwdev, RTW_DBG_RFK, "iqk counter=%d\n", counter);
2136 }
2137 
2138 /* for coex */
2139 static void rtw8822c_coex_cfg_init(struct rtw_dev *rtwdev)
2140 {
2141 	/* enable TBTT nterrupt */
2142 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
2143 
2144 	/* BT report packet sample rate	 */
2145 	/* 0x790[5:0]=0x5 */
2146 	rtw_write8_set(rtwdev, REG_BT_TDMA_TIME, 0x05);
2147 
2148 	/* enable BT counter statistics */
2149 	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
2150 
2151 	/* enable PTA (3-wire function form BT side) */
2152 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
2153 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_AOD_GPIO3);
2154 
2155 	/* enable PTA (tx/rx signal form WiFi side) */
2156 	rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
2157 	/* wl tx signal to PTA not case EDCCA */
2158 	rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
2159 	/* GNT_BT=1 while select both */
2160 	rtw_write8_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY);
2161 	/* BT_CCA = ~GNT_WL_BB, (not or GNT_BT_BB, LTE_Rx */
2162 	rtw_write8_clr(rtwdev, REG_DUMMY_PAGE4_V1, BIT_BTCCA_CTRL);
2163 
2164 	/* to avoid RF parameter error */
2165 	rtw_write_rf(rtwdev, RF_PATH_B, 0x1, 0xfffff, 0x40000);
2166 }
2167 
2168 static void rtw8822c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
2169 {
2170 	struct rtw_coex *coex = &rtwdev->coex;
2171 	struct rtw_coex_stat *coex_stat = &coex->stat;
2172 	struct rtw_efuse *efuse = &rtwdev->efuse;
2173 	u32 rf_0x1;
2174 
2175 	if (coex_stat->gnt_workaround_state == coex_stat->wl_coex_mode)
2176 		return;
2177 
2178 	coex_stat->gnt_workaround_state = coex_stat->wl_coex_mode;
2179 
2180 	if ((coex_stat->kt_ver == 0 && coex->under_5g) || coex->freerun)
2181 		rf_0x1 = 0x40021;
2182 	else
2183 		rf_0x1 = 0x40000;
2184 
2185 	/* BT at S1 for Shared-Ant */
2186 	if (efuse->share_ant)
2187 		rf_0x1 |= BIT(13);
2188 
2189 	rtw_write_rf(rtwdev, RF_PATH_B, 0x1, 0xfffff, rf_0x1);
2190 
2191 	/* WL-S0 2G RF TRX cannot be masked by GNT_BT
2192 	 * enable "WLS0 BB chage RF mode if GNT_BT = 1" for shared-antenna type
2193 	 * disable:0x1860[3] = 1, enable:0x1860[3] = 0
2194 	 *
2195 	 * enable "DAC off if GNT_WL = 0" for non-shared-antenna
2196 	 * disable 0x1c30[22] = 0,
2197 	 * enable: 0x1c30[22] = 1, 0x1c38[12] = 0, 0x1c38[28] = 1
2198 	 *
2199 	 * disable WL-S1 BB chage RF mode if GNT_BT
2200 	 * since RF TRx mask can do it
2201 	 */
2202 	rtw_write8_mask(rtwdev, 0x1c32, BIT(6), 1);
2203 	rtw_write8_mask(rtwdev, 0x1c39, BIT(4), 0);
2204 	rtw_write8_mask(rtwdev, 0x1c3b, BIT(4), 1);
2205 	rtw_write8_mask(rtwdev, 0x4160, BIT(3), 1);
2206 
2207 	/* disable WL-S0 BB chage RF mode if wifi is at 5G,
2208 	 * or antenna path is separated
2209 	 */
2210 	if (coex_stat->wl_coex_mode == COEX_WLINK_5G ||
2211 	    coex->under_5g || !efuse->share_ant) {
2212 		if (coex_stat->kt_ver >= 3) {
2213 			rtw_write8_mask(rtwdev, 0x1860, BIT(3), 0);
2214 			rtw_write8_mask(rtwdev, 0x1ca7, BIT(3), 1);
2215 		} else {
2216 			rtw_write8_mask(rtwdev, 0x1860, BIT(3), 1);
2217 		}
2218 	} else {
2219 		/* shared-antenna */
2220 		rtw_write8_mask(rtwdev, 0x1860, BIT(3), 0);
2221 		if (coex_stat->kt_ver >= 3)
2222 			rtw_write8_mask(rtwdev, 0x1ca7, BIT(3), 0);
2223 	}
2224 }
2225 
2226 static void rtw8822c_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
2227 {
2228 	rtw_write8_mask(rtwdev, 0x66, BIT(4), 0);
2229 	rtw_write8_mask(rtwdev, 0x67, BIT(0), 0);
2230 	rtw_write8_mask(rtwdev, 0x42, BIT(3), 0);
2231 	rtw_write8_mask(rtwdev, 0x65, BIT(7), 0);
2232 	rtw_write8_mask(rtwdev, 0x73, BIT(3), 0);
2233 }
2234 
2235 static void rtw8822c_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
2236 {
2237 	struct rtw_coex *coex = &rtwdev->coex;
2238 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
2239 	struct rtw_efuse *efuse = &rtwdev->efuse;
2240 
2241 	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
2242 	coex_rfe->ant_switch_polarity = 0;
2243 	coex_rfe->ant_switch_exist = false;
2244 	coex_rfe->ant_switch_with_bt = false;
2245 	coex_rfe->ant_switch_diversity = false;
2246 
2247 	if (efuse->share_ant)
2248 		coex_rfe->wlg_at_btg = true;
2249 	else
2250 		coex_rfe->wlg_at_btg = false;
2251 
2252 	/* disable LTE coex in wifi side */
2253 	rtw_coex_write_indirect_reg(rtwdev, 0x38, BIT_LTE_COEX_EN, 0x0);
2254 	rtw_coex_write_indirect_reg(rtwdev, 0xa0, MASKLWORD, 0xffff);
2255 	rtw_coex_write_indirect_reg(rtwdev, 0xa4, MASKLWORD, 0xffff);
2256 }
2257 
2258 static void rtw8822c_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
2259 {
2260 	struct rtw_coex *coex = &rtwdev->coex;
2261 	struct rtw_coex_dm *coex_dm = &coex->dm;
2262 
2263 	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
2264 		return;
2265 
2266 	coex_dm->cur_wl_pwr_lvl = wl_pwr;
2267 }
2268 
2269 static void rtw8822c_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
2270 {
2271 	struct rtw_coex *coex = &rtwdev->coex;
2272 	struct rtw_coex_dm *coex_dm = &coex->dm;
2273 
2274 	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
2275 		return;
2276 
2277 	coex_dm->cur_wl_rx_low_gain_en = low_gain;
2278 
2279 	if (coex_dm->cur_wl_rx_low_gain_en) {
2280 		/* set Rx filter corner RCK offset */
2281 		rtw_write_rf(rtwdev, RF_PATH_A, 0xde, 0xfffff, 0x22);
2282 		rtw_write_rf(rtwdev, RF_PATH_A, 0x1d, 0xfffff, 0x36);
2283 		rtw_write_rf(rtwdev, RF_PATH_B, 0xde, 0xfffff, 0x22);
2284 		rtw_write_rf(rtwdev, RF_PATH_B, 0x1d, 0xfffff, 0x36);
2285 	} else {
2286 		/* set Rx filter corner RCK offset */
2287 		rtw_write_rf(rtwdev, RF_PATH_A, 0xde, 0xfffff, 0x20);
2288 		rtw_write_rf(rtwdev, RF_PATH_A, 0x1d, 0xfffff, 0x0);
2289 		rtw_write_rf(rtwdev, RF_PATH_B, 0x1d, 0xfffff, 0x0);
2290 	}
2291 }
2292 
2293 static void rtw8822c_bf_enable_bfee_su(struct rtw_dev *rtwdev,
2294 				       struct rtw_vif *vif,
2295 				       struct rtw_bfee *bfee)
2296 {
2297 	u8 csi_rsc = 0;
2298 	u32 tmp6dc;
2299 
2300 	rtw_bf_enable_bfee_su(rtwdev, vif, bfee);
2301 
2302 	tmp6dc = rtw_read32(rtwdev, REG_BBPSF_CTRL) |
2303 			    BIT_WMAC_USE_NDPARATE |
2304 			    (csi_rsc << 13);
2305 	if (vif->net_type == RTW_NET_AP_MODE)
2306 		rtw_write32(rtwdev, REG_BBPSF_CTRL, tmp6dc | BIT(12));
2307 	else
2308 		rtw_write32(rtwdev, REG_BBPSF_CTRL, tmp6dc & ~BIT(12));
2309 
2310 	rtw_write32(rtwdev, REG_CSI_RRSR, 0x550);
2311 }
2312 
2313 static void rtw8822c_bf_config_bfee_su(struct rtw_dev *rtwdev,
2314 				       struct rtw_vif *vif,
2315 				       struct rtw_bfee *bfee, bool enable)
2316 {
2317 	if (enable)
2318 		rtw8822c_bf_enable_bfee_su(rtwdev, vif, bfee);
2319 	else
2320 		rtw_bf_remove_bfee_su(rtwdev, bfee);
2321 }
2322 
2323 static void rtw8822c_bf_config_bfee_mu(struct rtw_dev *rtwdev,
2324 				       struct rtw_vif *vif,
2325 				       struct rtw_bfee *bfee, bool enable)
2326 {
2327 	if (enable)
2328 		rtw_bf_enable_bfee_mu(rtwdev, vif, bfee);
2329 	else
2330 		rtw_bf_remove_bfee_mu(rtwdev, bfee);
2331 }
2332 
2333 static void rtw8822c_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
2334 				    struct rtw_bfee *bfee, bool enable)
2335 {
2336 	if (bfee->role == RTW_BFEE_SU)
2337 		rtw8822c_bf_config_bfee_su(rtwdev, vif, bfee, enable);
2338 	else if (bfee->role == RTW_BFEE_MU)
2339 		rtw8822c_bf_config_bfee_mu(rtwdev, vif, bfee, enable);
2340 	else
2341 		rtw_warn(rtwdev, "wrong bfee role\n");
2342 }
2343 
2344 struct dpk_cfg_pair {
2345 	u32 addr;
2346 	u32 bitmask;
2347 	u32 data;
2348 };
2349 
2350 void rtw8822c_parse_tbl_dpk(struct rtw_dev *rtwdev,
2351 			    const struct rtw_table *tbl)
2352 {
2353 	const struct dpk_cfg_pair *p = tbl->data;
2354 	const struct dpk_cfg_pair *end = p + tbl->size / 3;
2355 
2356 	BUILD_BUG_ON(sizeof(struct dpk_cfg_pair) != sizeof(u32) * 3);
2357 
2358 	for (; p < end; p++)
2359 		rtw_write32_mask(rtwdev, p->addr, p->bitmask, p->data);
2360 }
2361 
2362 static void rtw8822c_dpk_set_gnt_wl(struct rtw_dev *rtwdev, bool is_before_k)
2363 {
2364 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
2365 
2366 	if (is_before_k) {
2367 		dpk_info->gnt_control = rtw_read32(rtwdev, 0x70);
2368 		dpk_info->gnt_value = rtw_coex_read_indirect_reg(rtwdev, 0x38);
2369 		rtw_write32_mask(rtwdev, 0x70, BIT(26), 0x1);
2370 		rtw_coex_write_indirect_reg(rtwdev, 0x38, MASKBYTE1, 0x77);
2371 	} else {
2372 		rtw_coex_write_indirect_reg(rtwdev, 0x38, MASKDWORD,
2373 					    dpk_info->gnt_value);
2374 		rtw_write32(rtwdev, 0x70, dpk_info->gnt_control);
2375 	}
2376 }
2377 
2378 static void
2379 rtw8822c_dpk_restore_registers(struct rtw_dev *rtwdev, u32 reg_num,
2380 			       struct rtw_backup_info *bckp)
2381 {
2382 	rtw_restore_reg(rtwdev, bckp, reg_num);
2383 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
2384 	rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_DPD_CLK, 0x4);
2385 }
2386 
2387 static void
2388 rtw8822c_dpk_backup_registers(struct rtw_dev *rtwdev, u32 *reg,
2389 			      u32 reg_num, struct rtw_backup_info *bckp)
2390 {
2391 	u32 i;
2392 
2393 	for (i = 0; i < reg_num; i++) {
2394 		bckp[i].len = 4;
2395 		bckp[i].reg = reg[i];
2396 		bckp[i].val = rtw_read32(rtwdev, reg[i]);
2397 	}
2398 }
2399 
2400 static void rtw8822c_dpk_backup_rf_registers(struct rtw_dev *rtwdev,
2401 					     u32 *rf_reg,
2402 					     u32 rf_reg_bak[][2])
2403 {
2404 	u32 i;
2405 
2406 	for (i = 0; i < DPK_RF_REG_NUM; i++) {
2407 		rf_reg_bak[i][RF_PATH_A] = rtw_read_rf(rtwdev, RF_PATH_A,
2408 						       rf_reg[i], RFREG_MASK);
2409 		rf_reg_bak[i][RF_PATH_B] = rtw_read_rf(rtwdev, RF_PATH_B,
2410 						       rf_reg[i], RFREG_MASK);
2411 	}
2412 }
2413 
2414 static void rtw8822c_dpk_reload_rf_registers(struct rtw_dev *rtwdev,
2415 					     u32 *rf_reg,
2416 					     u32 rf_reg_bak[][2])
2417 {
2418 	u32 i;
2419 
2420 	for (i = 0; i < DPK_RF_REG_NUM; i++) {
2421 		rtw_write_rf(rtwdev, RF_PATH_A, rf_reg[i], RFREG_MASK,
2422 			     rf_reg_bak[i][RF_PATH_A]);
2423 		rtw_write_rf(rtwdev, RF_PATH_B, rf_reg[i], RFREG_MASK,
2424 			     rf_reg_bak[i][RF_PATH_B]);
2425 	}
2426 }
2427 
2428 static void rtw8822c_dpk_information(struct rtw_dev *rtwdev)
2429 {
2430 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
2431 	u32  reg;
2432 	u8 band_shift;
2433 
2434 	reg = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
2435 
2436 	band_shift = FIELD_GET(BIT(16), reg);
2437 	dpk_info->dpk_band = 1 << band_shift;
2438 	dpk_info->dpk_ch = FIELD_GET(0xff, reg);
2439 	dpk_info->dpk_bw = FIELD_GET(0x3000, reg);
2440 }
2441 
2442 static void rtw8822c_dpk_rxbb_dc_cal(struct rtw_dev *rtwdev, u8 path)
2443 {
2444 	rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84800);
2445 	udelay(5);
2446 	rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84801);
2447 	usleep_range(600, 610);
2448 	rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84800);
2449 }
2450 
2451 static u8 rtw8822c_dpk_dc_corr_check(struct rtw_dev *rtwdev, u8 path)
2452 {
2453 	u16 dc_i, dc_q;
2454 	u8 corr_val, corr_idx;
2455 
2456 	rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000900f0);
2457 	dc_i = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(27, 16));
2458 	dc_q = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(11, 0));
2459 
2460 	if (dc_i & BIT(11))
2461 		dc_i = 0x1000 - dc_i;
2462 	if (dc_q & BIT(11))
2463 		dc_q = 0x1000 - dc_q;
2464 
2465 	rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0);
2466 	corr_idx = (u8)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(7, 0));
2467 	corr_val = (u8)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(15, 8));
2468 
2469 	if (dc_i > 200 || dc_q > 200 || corr_idx < 40 || corr_idx > 65)
2470 		return 1;
2471 	else
2472 		return 0;
2473 
2474 }
2475 
2476 static void rtw8822c_dpk_tx_pause(struct rtw_dev *rtwdev)
2477 {
2478 	u8 reg_a, reg_b;
2479 	u16 count = 0;
2480 
2481 	rtw_write8(rtwdev, 0x522, 0xff);
2482 	rtw_write32_mask(rtwdev, 0x1e70, 0xf, 0x2);
2483 
2484 	do {
2485 		reg_a = (u8)rtw_read_rf(rtwdev, RF_PATH_A, 0x00, 0xf0000);
2486 		reg_b = (u8)rtw_read_rf(rtwdev, RF_PATH_B, 0x00, 0xf0000);
2487 		udelay(2);
2488 		count++;
2489 	} while ((reg_a == 2 || reg_b == 2) && count < 2500);
2490 }
2491 
2492 static void rtw8822c_dpk_mac_bb_setting(struct rtw_dev *rtwdev)
2493 {
2494 	rtw8822c_dpk_tx_pause(rtwdev);
2495 	rtw_load_table(rtwdev, &rtw8822c_dpk_mac_bb_tbl);
2496 }
2497 
2498 static void rtw8822c_dpk_afe_setting(struct rtw_dev *rtwdev, bool is_do_dpk)
2499 {
2500 	if (is_do_dpk)
2501 		rtw_load_table(rtwdev, &rtw8822c_dpk_afe_is_dpk_tbl);
2502 	else
2503 		rtw_load_table(rtwdev, &rtw8822c_dpk_afe_no_dpk_tbl);
2504 }
2505 
2506 static void rtw8822c_dpk_pre_setting(struct rtw_dev *rtwdev)
2507 {
2508 	u8 path;
2509 
2510 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
2511 		rtw_write_rf(rtwdev, path, RF_RXAGC_OFFSET, RFREG_MASK, 0x0);
2512 		rtw_write32(rtwdev, REG_NCTL0, 0x8 | (path << 1));
2513 		if (rtwdev->dm_info.dpk_info.dpk_band == RTW_BAND_2G)
2514 			rtw_write32(rtwdev, REG_DPD_LUT3, 0x1f100000);
2515 		else
2516 			rtw_write32(rtwdev, REG_DPD_LUT3, 0x1f0d0000);
2517 		rtw_write32_mask(rtwdev, REG_DPD_LUT0, BIT_GLOSS_DB, 0x4);
2518 		rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x3);
2519 	}
2520 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
2521 	rtw_write32(rtwdev, REG_DPD_CTL11, 0x3b23170b);
2522 	rtw_write32(rtwdev, REG_DPD_CTL12, 0x775f5347);
2523 }
2524 
2525 static u32 rtw8822c_dpk_rf_setting(struct rtw_dev *rtwdev, u8 path)
2526 {
2527 	u32 ori_txbb;
2528 
2529 	rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x50017);
2530 	ori_txbb = rtw_read_rf(rtwdev, path, RF_TX_GAIN, RFREG_MASK);
2531 
2532 	rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x1);
2533 	rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_PWR_TRIM, 0x1);
2534 	rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_TX_OFFSET_VAL, 0x0);
2535 	rtw_write_rf(rtwdev, path, RF_TX_GAIN, RFREG_MASK, ori_txbb);
2536 
2537 	if (rtwdev->dm_info.dpk_info.dpk_band == RTW_BAND_2G) {
2538 		rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_LB_ATT, 0x1);
2539 		rtw_write_rf(rtwdev, path, RF_RXG_GAIN, BIT_RXG_GAIN, 0x0);
2540 	} else {
2541 		rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_TXA_LB_ATT, 0x0);
2542 		rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_ATT, 0x6);
2543 		rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_SW, 0x1);
2544 		rtw_write_rf(rtwdev, path, RF_RXA_MIX_GAIN, BIT_RXA_MIX_GAIN, 0);
2545 	}
2546 
2547 	rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RXAGC, 0xf);
2548 	rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x1);
2549 	rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_RXBB, 0x0);
2550 
2551 	if (rtwdev->dm_info.dpk_info.dpk_bw == DPK_CHANNEL_WIDTH_80)
2552 		rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x2);
2553 	else
2554 		rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x1);
2555 
2556 	rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT(1), 0x1);
2557 
2558 	usleep_range(100, 110);
2559 
2560 	return ori_txbb & 0x1f;
2561 }
2562 
2563 static u16 rtw8822c_dpk_get_cmd(struct rtw_dev *rtwdev, u8 action, u8 path)
2564 {
2565 	u16 cmd;
2566 	u8 bw = rtwdev->dm_info.dpk_info.dpk_bw == DPK_CHANNEL_WIDTH_80 ? 2 : 0;
2567 
2568 	switch (action) {
2569 	case RTW_DPK_GAIN_LOSS:
2570 		cmd = 0x14 + path;
2571 		break;
2572 	case RTW_DPK_DO_DPK:
2573 		cmd = 0x16 + path + bw;
2574 		break;
2575 	case RTW_DPK_DPK_ON:
2576 		cmd = 0x1a + path;
2577 		break;
2578 	case RTW_DPK_DAGC:
2579 		cmd = 0x1c + path + bw;
2580 		break;
2581 	default:
2582 		return 0;
2583 	}
2584 
2585 	return (cmd << 8) | 0x48;
2586 }
2587 
2588 static u8 rtw8822c_dpk_one_shot(struct rtw_dev *rtwdev, u8 path, u8 action)
2589 {
2590 	u16 dpk_cmd;
2591 	u8 result = 0;
2592 
2593 	rtw8822c_dpk_set_gnt_wl(rtwdev, true);
2594 
2595 	if (action == RTW_DPK_CAL_PWR) {
2596 		rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(12), 0x1);
2597 		rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(12), 0x0);
2598 		rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x0);
2599 		msleep(10);
2600 		if (!check_hw_ready(rtwdev, REG_STAT_RPT, BIT(31), 0x1)) {
2601 			result = 1;
2602 			rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] one-shot over 20ms\n");
2603 		}
2604 	} else {
2605 		rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
2606 				 0x8 | (path << 1));
2607 		rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x9);
2608 
2609 		dpk_cmd = rtw8822c_dpk_get_cmd(rtwdev, action, path);
2610 		rtw_write32(rtwdev, REG_NCTL0, dpk_cmd);
2611 		rtw_write32(rtwdev, REG_NCTL0, dpk_cmd + 1);
2612 		msleep(10);
2613 		if (!check_hw_ready(rtwdev, 0x2d9c, 0xff, 0x55)) {
2614 			result = 1;
2615 			rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] one-shot over 20ms\n");
2616 		}
2617 		rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
2618 				 0x8 | (path << 1));
2619 		rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x0);
2620 	}
2621 
2622 	rtw8822c_dpk_set_gnt_wl(rtwdev, false);
2623 
2624 	rtw_write8(rtwdev, 0x1b10, 0x0);
2625 
2626 	return result;
2627 }
2628 
2629 static u16 rtw8822c_dpk_dgain_read(struct rtw_dev *rtwdev, u8 path)
2630 {
2631 	u16 dgain;
2632 
2633 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
2634 	rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, 0x00ff0000, 0x0);
2635 
2636 	dgain = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(27, 16));
2637 
2638 	return dgain;
2639 }
2640 
2641 static u8 rtw8822c_dpk_thermal_read(struct rtw_dev *rtwdev, u8 path)
2642 {
2643 	rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x1);
2644 	rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x0);
2645 	rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x1);
2646 	udelay(15);
2647 
2648 	return (u8)rtw_read_rf(rtwdev, path, RF_T_METER, 0x0007e);
2649 }
2650 
2651 static u32 rtw8822c_dpk_pas_read(struct rtw_dev *rtwdev, u8 path)
2652 {
2653 	u32 i_val, q_val;
2654 
2655 	rtw_write32(rtwdev, REG_NCTL0, 0x8 | (path << 1));
2656 	rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x0);
2657 	rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x00060001);
2658 	rtw_write32(rtwdev, 0x1b4c, 0x00000000);
2659 	rtw_write32(rtwdev, 0x1b4c, 0x00080000);
2660 
2661 	q_val = rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKHWORD);
2662 	i_val = rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKLWORD);
2663 
2664 	if (i_val & BIT(15))
2665 		i_val = 0x10000 - i_val;
2666 	if (q_val & BIT(15))
2667 		q_val = 0x10000 - q_val;
2668 
2669 	rtw_write32(rtwdev, 0x1b4c, 0x00000000);
2670 
2671 	return i_val * i_val + q_val * q_val;
2672 }
2673 
2674 static u32 rtw8822c_psd_log2base(u32 val)
2675 {
2676 	u32 tmp, val_integerd_b, tindex;
2677 	u32 result, val_fractiond_b;
2678 	u32 table_fraction[21] = {0, 432, 332, 274, 232, 200, 174,
2679 				  151, 132, 115, 100, 86, 74, 62, 51,
2680 				  42, 32, 23, 15, 7, 0};
2681 
2682 	if (val == 0)
2683 		return 0;
2684 
2685 	val_integerd_b = __fls(val) + 1;
2686 
2687 	tmp = (val * 100) / (1 << val_integerd_b);
2688 	tindex = tmp / 5;
2689 
2690 	if (tindex >= ARRAY_SIZE(table_fraction))
2691 		tindex = ARRAY_SIZE(table_fraction) - 1;
2692 
2693 	val_fractiond_b = table_fraction[tindex];
2694 
2695 	result = val_integerd_b * 100 - val_fractiond_b;
2696 
2697 	return result;
2698 }
2699 
2700 static u8 rtw8822c_dpk_gainloss_result(struct rtw_dev *rtwdev, u8 path)
2701 {
2702 	u8 result;
2703 
2704 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
2705 	rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x1);
2706 	rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x00060000);
2707 
2708 	result = (u8)rtw_read32_mask(rtwdev, REG_STAT_RPT, 0x000000f0);
2709 
2710 	rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x0);
2711 
2712 	return result;
2713 }
2714 
2715 static u8 rtw8822c_dpk_agc_gain_chk(struct rtw_dev *rtwdev, u8 path,
2716 				    u8 limited_pga)
2717 {
2718 	u8 result = 0;
2719 	u16 dgain;
2720 
2721 	rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC);
2722 	dgain = rtw8822c_dpk_dgain_read(rtwdev, path);
2723 
2724 	if (dgain > 1535 && !limited_pga)
2725 		return RTW_DPK_GAIN_LESS;
2726 	else if (dgain < 768 && !limited_pga)
2727 		return RTW_DPK_GAIN_LARGE;
2728 	else
2729 		return result;
2730 }
2731 
2732 static u8 rtw8822c_dpk_agc_loss_chk(struct rtw_dev *rtwdev, u8 path)
2733 {
2734 	u32 loss, loss_db;
2735 
2736 	loss = rtw8822c_dpk_pas_read(rtwdev, path);
2737 	if (loss < 0x4000000)
2738 		return RTW_DPK_GL_LESS;
2739 	loss_db = 3 * rtw8822c_psd_log2base(loss >> 13) - 3870;
2740 
2741 	if (loss_db > 1000)
2742 		return RTW_DPK_GL_LARGE;
2743 	else if (loss_db < 250)
2744 		return RTW_DPK_GL_LESS;
2745 	else
2746 		return RTW_DPK_AGC_OUT;
2747 }
2748 
2749 struct rtw8822c_dpk_data {
2750 	u8 txbb;
2751 	u8 pga;
2752 	u8 limited_pga;
2753 	u8 agc_cnt;
2754 	bool loss_only;
2755 	bool gain_only;
2756 	u8 path;
2757 };
2758 
2759 static u8 rtw8822c_gain_check_state(struct rtw_dev *rtwdev,
2760 				    struct rtw8822c_dpk_data *data)
2761 {
2762 	u8 state;
2763 
2764 	data->txbb = (u8)rtw_read_rf(rtwdev, data->path, RF_TX_GAIN,
2765 				     BIT_GAIN_TXBB);
2766 	data->pga = (u8)rtw_read_rf(rtwdev, data->path, RF_MODE_TRXAGC,
2767 				    BIT_RXAGC);
2768 
2769 	if (data->loss_only) {
2770 		state = RTW_DPK_LOSS_CHECK;
2771 		goto check_end;
2772 	}
2773 
2774 	state = rtw8822c_dpk_agc_gain_chk(rtwdev, data->path,
2775 					  data->limited_pga);
2776 	if (state == RTW_DPK_GAIN_CHECK && data->gain_only)
2777 		state = RTW_DPK_AGC_OUT;
2778 	else if (state == RTW_DPK_GAIN_CHECK)
2779 		state = RTW_DPK_LOSS_CHECK;
2780 
2781 check_end:
2782 	data->agc_cnt++;
2783 	if (data->agc_cnt >= 6)
2784 		state = RTW_DPK_AGC_OUT;
2785 
2786 	return state;
2787 }
2788 
2789 static u8 rtw8822c_gain_large_state(struct rtw_dev *rtwdev,
2790 				    struct rtw8822c_dpk_data *data)
2791 {
2792 	u8 pga = data->pga;
2793 
2794 	if (pga > 0xe)
2795 		rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xc);
2796 	else if (pga > 0xb && pga < 0xf)
2797 		rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0x0);
2798 	else if (pga < 0xc)
2799 		data->limited_pga = 1;
2800 
2801 	return RTW_DPK_GAIN_CHECK;
2802 }
2803 
2804 static u8 rtw8822c_gain_less_state(struct rtw_dev *rtwdev,
2805 				   struct rtw8822c_dpk_data *data)
2806 {
2807 	u8 pga = data->pga;
2808 
2809 	if (pga < 0xc)
2810 		rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xc);
2811 	else if (pga > 0xb && pga < 0xf)
2812 		rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xf);
2813 	else if (pga > 0xe)
2814 		data->limited_pga = 1;
2815 
2816 	return RTW_DPK_GAIN_CHECK;
2817 }
2818 
2819 static u8 rtw8822c_gl_state(struct rtw_dev *rtwdev,
2820 			    struct rtw8822c_dpk_data *data, u8 is_large)
2821 {
2822 	u8 txbb_bound[] = {0x1f, 0};
2823 
2824 	if (data->txbb == txbb_bound[is_large])
2825 		return RTW_DPK_AGC_OUT;
2826 
2827 	if (is_large == 1)
2828 		data->txbb -= 2;
2829 	else
2830 		data->txbb += 3;
2831 
2832 	rtw_write_rf(rtwdev, data->path, RF_TX_GAIN, BIT_GAIN_TXBB, data->txbb);
2833 	data->limited_pga = 0;
2834 
2835 	return RTW_DPK_GAIN_CHECK;
2836 }
2837 
2838 static u8 rtw8822c_gl_large_state(struct rtw_dev *rtwdev,
2839 				  struct rtw8822c_dpk_data *data)
2840 {
2841 	return rtw8822c_gl_state(rtwdev, data, 1);
2842 }
2843 
2844 static u8 rtw8822c_gl_less_state(struct rtw_dev *rtwdev,
2845 				 struct rtw8822c_dpk_data *data)
2846 {
2847 	return rtw8822c_gl_state(rtwdev, data, 0);
2848 }
2849 
2850 static u8 rtw8822c_loss_check_state(struct rtw_dev *rtwdev,
2851 				    struct rtw8822c_dpk_data *data)
2852 {
2853 	u8 path = data->path;
2854 	u8 state;
2855 
2856 	rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_GAIN_LOSS);
2857 	state = rtw8822c_dpk_agc_loss_chk(rtwdev, path);
2858 
2859 	return state;
2860 }
2861 
2862 static u8 (*dpk_state[])(struct rtw_dev *rtwdev,
2863 			  struct rtw8822c_dpk_data *data) = {
2864 	rtw8822c_gain_check_state, rtw8822c_gain_large_state,
2865 	rtw8822c_gain_less_state, rtw8822c_gl_large_state,
2866 	rtw8822c_gl_less_state, rtw8822c_loss_check_state };
2867 
2868 static u8 rtw8822c_dpk_pas_agc(struct rtw_dev *rtwdev, u8 path,
2869 			       bool gain_only, bool loss_only)
2870 {
2871 	struct rtw8822c_dpk_data data = {0};
2872 	u8 (*func)(struct rtw_dev *rtwdev, struct rtw8822c_dpk_data *data);
2873 	u8 state = RTW_DPK_GAIN_CHECK;
2874 
2875 	data.loss_only = loss_only;
2876 	data.gain_only = gain_only;
2877 	data.path = path;
2878 
2879 	for (;;) {
2880 		func = dpk_state[state];
2881 		state = func(rtwdev, &data);
2882 		if (state == RTW_DPK_AGC_OUT)
2883 			break;
2884 	}
2885 
2886 	return data.txbb;
2887 }
2888 
2889 static bool rtw8822c_dpk_coef_iq_check(struct rtw_dev *rtwdev,
2890 				       u16 coef_i, u16 coef_q)
2891 {
2892 	if (coef_i == 0x1000 || coef_i == 0x0fff ||
2893 	    coef_q == 0x1000 || coef_q == 0x0fff)
2894 		return true;
2895 
2896 	return false;
2897 }
2898 
2899 static u32 rtw8822c_dpk_coef_transfer(struct rtw_dev *rtwdev)
2900 {
2901 	u32 reg = 0;
2902 	u16 coef_i = 0, coef_q = 0;
2903 
2904 	reg = rtw_read32(rtwdev, REG_STAT_RPT);
2905 
2906 	coef_i = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKHWORD) & 0x1fff;
2907 	coef_q = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKLWORD) & 0x1fff;
2908 
2909 	coef_q = ((0x2000 - coef_q) & 0x1fff) - 1;
2910 
2911 	reg = (coef_i << 16) | coef_q;
2912 
2913 	return reg;
2914 }
2915 
2916 static const u32 rtw8822c_dpk_get_coef_tbl[] = {
2917 	0x000400f0, 0x040400f0, 0x080400f0, 0x010400f0, 0x050400f0,
2918 	0x090400f0, 0x020400f0, 0x060400f0, 0x0a0400f0, 0x030400f0,
2919 	0x070400f0, 0x0b0400f0, 0x0c0400f0, 0x100400f0, 0x0d0400f0,
2920 	0x110400f0, 0x0e0400f0, 0x120400f0, 0x0f0400f0, 0x130400f0,
2921 };
2922 
2923 static void rtw8822c_dpk_coef_tbl_apply(struct rtw_dev *rtwdev, u8 path)
2924 {
2925 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
2926 	int i;
2927 
2928 	for (i = 0; i < 20; i++) {
2929 		rtw_write32(rtwdev, REG_RXSRAM_CTL,
2930 			    rtw8822c_dpk_get_coef_tbl[i]);
2931 		dpk_info->coef[path][i] = rtw8822c_dpk_coef_transfer(rtwdev);
2932 	}
2933 }
2934 
2935 static void rtw8822c_dpk_get_coef(struct rtw_dev *rtwdev, u8 path)
2936 {
2937 	rtw_write32(rtwdev, REG_NCTL0, 0x0000000c);
2938 
2939 	if (path == RF_PATH_A) {
2940 		rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(24), 0x0);
2941 		rtw_write32(rtwdev, REG_DPD_CTL0_S0, 0x30000080);
2942 	} else if (path == RF_PATH_B) {
2943 		rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(24), 0x1);
2944 		rtw_write32(rtwdev, REG_DPD_CTL0_S1, 0x30000080);
2945 	}
2946 
2947 	rtw8822c_dpk_coef_tbl_apply(rtwdev, path);
2948 }
2949 
2950 static u8 rtw8822c_dpk_coef_read(struct rtw_dev *rtwdev, u8 path)
2951 {
2952 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
2953 	u8 addr, result = 1;
2954 	u16 coef_i, coef_q;
2955 
2956 	for (addr = 0; addr < 20; addr++) {
2957 		coef_i = FIELD_GET(0x1fff0000, dpk_info->coef[path][addr]);
2958 		coef_q = FIELD_GET(0x1fff, dpk_info->coef[path][addr]);
2959 
2960 		if (rtw8822c_dpk_coef_iq_check(rtwdev, coef_i, coef_q)) {
2961 			result = 0;
2962 			break;
2963 		}
2964 	}
2965 	return result;
2966 }
2967 
2968 static void rtw8822c_dpk_coef_write(struct rtw_dev *rtwdev, u8 path, u8 result)
2969 {
2970 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
2971 	u16 reg[DPK_RF_PATH_NUM] = {0x1b0c, 0x1b64};
2972 	u32 coef;
2973 	u8 addr;
2974 
2975 	rtw_write32(rtwdev, REG_NCTL0, 0x0000000c);
2976 	rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0);
2977 
2978 	for (addr = 0; addr < 20; addr++) {
2979 		if (result == 0) {
2980 			if (addr == 3)
2981 				coef = 0x04001fff;
2982 			else
2983 				coef = 0x00001fff;
2984 		} else {
2985 			coef = dpk_info->coef[path][addr];
2986 		}
2987 		rtw_write32(rtwdev, reg[path] + addr * 4, coef);
2988 	}
2989 }
2990 
2991 static void rtw8822c_dpk_fill_result(struct rtw_dev *rtwdev, u32 dpk_txagc,
2992 				     u8 path, u8 result)
2993 {
2994 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
2995 
2996 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
2997 
2998 	if (result)
2999 		rtw_write8(rtwdev, REG_DPD_AGC, (u8)(dpk_txagc - 6));
3000 	else
3001 		rtw_write8(rtwdev, REG_DPD_AGC, 0x00);
3002 
3003 	dpk_info->result[path] = result;
3004 	dpk_info->dpk_txagc[path] = rtw_read8(rtwdev, REG_DPD_AGC);
3005 
3006 	rtw8822c_dpk_coef_write(rtwdev, path, result);
3007 }
3008 
3009 static u32 rtw8822c_dpk_gainloss(struct rtw_dev *rtwdev, u8 path)
3010 {
3011 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3012 	u8 tx_agc, tx_bb, ori_txbb, ori_txagc, tx_agc_search, t1, t2;
3013 
3014 	ori_txbb = rtw8822c_dpk_rf_setting(rtwdev, path);
3015 	ori_txagc = (u8)rtw_read_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_TXAGC);
3016 
3017 	rtw8822c_dpk_rxbb_dc_cal(rtwdev, path);
3018 	rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC);
3019 	rtw8822c_dpk_dgain_read(rtwdev, path);
3020 
3021 	if (rtw8822c_dpk_dc_corr_check(rtwdev, path)) {
3022 		rtw8822c_dpk_rxbb_dc_cal(rtwdev, path);
3023 		rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC);
3024 		rtw8822c_dpk_dc_corr_check(rtwdev, path);
3025 	}
3026 
3027 	t1 = rtw8822c_dpk_thermal_read(rtwdev, path);
3028 	tx_bb = rtw8822c_dpk_pas_agc(rtwdev, path, false, true);
3029 	tx_agc_search = rtw8822c_dpk_gainloss_result(rtwdev, path);
3030 
3031 	if (tx_bb < tx_agc_search)
3032 		tx_bb = 0;
3033 	else
3034 		tx_bb = tx_bb - tx_agc_search;
3035 
3036 	rtw_write_rf(rtwdev, path, RF_TX_GAIN, BIT_GAIN_TXBB, tx_bb);
3037 
3038 	tx_agc = ori_txagc - (ori_txbb - tx_bb);
3039 
3040 	t2 = rtw8822c_dpk_thermal_read(rtwdev, path);
3041 
3042 	dpk_info->thermal_dpk_delta[path] = abs(t2 - t1);
3043 
3044 	return tx_agc;
3045 }
3046 
3047 static u8 rtw8822c_dpk_by_path(struct rtw_dev *rtwdev, u32 tx_agc, u8 path)
3048 {
3049 	u8 result;
3050 
3051 	result = rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DO_DPK);
3052 
3053 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3054 
3055 	result = result | (u8)rtw_read32_mask(rtwdev, REG_DPD_CTL1_S0, BIT(26));
3056 
3057 	rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x33e14);
3058 
3059 	rtw8822c_dpk_get_coef(rtwdev, path);
3060 
3061 	return result;
3062 }
3063 
3064 static void rtw8822c_dpk_cal_gs(struct rtw_dev *rtwdev, u8 path)
3065 {
3066 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3067 	u32 tmp_gs = 0;
3068 
3069 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3070 	rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_BYPASS_DPD, 0x0);
3071 	rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
3072 	rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x9);
3073 	rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_INNER_LB, 0x1);
3074 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3075 	rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_DPD_CLK, 0xf);
3076 
3077 	if (path == RF_PATH_A) {
3078 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF,
3079 				 0x1066680);
3080 		rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_DPD_EN, 0x1);
3081 	} else {
3082 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF,
3083 				 0x1066680);
3084 		rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, BIT_DPD_EN, 0x1);
3085 	}
3086 
3087 	if (dpk_info->dpk_bw == DPK_CHANNEL_WIDTH_80) {
3088 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x80001310);
3089 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x00001310);
3090 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x810000db);
3091 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x010000db);
3092 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x0000b428);
3093 		rtw_write32(rtwdev, REG_DPD_CTL15,
3094 			    0x05020000 | (BIT(path) << 28));
3095 	} else {
3096 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x8200190c);
3097 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x0200190c);
3098 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x8301ee14);
3099 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x0301ee14);
3100 		rtw_write32(rtwdev, REG_DPD_CTL16, 0x0000b428);
3101 		rtw_write32(rtwdev, REG_DPD_CTL15,
3102 			    0x05020008 | (BIT(path) << 28));
3103 	}
3104 
3105 	rtw_write32_mask(rtwdev, REG_DPD_CTL0, MASKBYTE3, 0x8 | path);
3106 
3107 	rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_CAL_PWR);
3108 
3109 	rtw_write32_mask(rtwdev, REG_DPD_CTL15, MASKBYTE3, 0x0);
3110 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3111 	rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x0);
3112 	rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_INNER_LB, 0x0);
3113 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3114 
3115 	if (path == RF_PATH_A)
3116 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, 0x5b);
3117 	else
3118 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, 0x5b);
3119 
3120 	rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x0);
3121 
3122 	tmp_gs = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, BIT_RPT_DGAIN);
3123 	tmp_gs = (tmp_gs * 910) >> 10;
3124 	tmp_gs = DIV_ROUND_CLOSEST(tmp_gs, 10);
3125 
3126 	if (path == RF_PATH_A)
3127 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, tmp_gs);
3128 	else
3129 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, tmp_gs);
3130 
3131 	dpk_info->dpk_gs[path] = tmp_gs;
3132 }
3133 
3134 static void rtw8822c_dpk_cal_coef1(struct rtw_dev *rtwdev)
3135 {
3136 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3137 	u32 offset[DPK_RF_PATH_NUM] = {0, 0x58};
3138 	u32 i_scaling;
3139 	u8 path;
3140 
3141 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c);
3142 	rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0);
3143 	rtw_write32(rtwdev, REG_NCTL0, 0x00001148);
3144 	rtw_write32(rtwdev, REG_NCTL0, 0x00001149);
3145 
3146 	check_hw_ready(rtwdev, 0x2d9c, MASKBYTE0, 0x55);
3147 
3148 	rtw_write8(rtwdev, 0x1b10, 0x0);
3149 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c);
3150 
3151 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
3152 		i_scaling = 0x16c00 / dpk_info->dpk_gs[path];
3153 
3154 		rtw_write32_mask(rtwdev, 0x1b18 + offset[path], MASKHWORD,
3155 				 i_scaling);
3156 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path],
3157 				 GENMASK(31, 28), 0x9);
3158 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path],
3159 				 GENMASK(31, 28), 0x1);
3160 		rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path],
3161 				 GENMASK(31, 28), 0x0);
3162 		rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0 + offset[path],
3163 				 BIT(14), 0x0);
3164 	}
3165 }
3166 
3167 static void rtw8822c_dpk_on(struct rtw_dev *rtwdev, u8 path)
3168 {
3169 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3170 
3171 	rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DPK_ON);
3172 
3173 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1));
3174 	rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0);
3175 
3176 	if (test_bit(path, dpk_info->dpk_path_ok))
3177 		rtw8822c_dpk_cal_gs(rtwdev, path);
3178 }
3179 
3180 static bool rtw8822c_dpk_check_pass(struct rtw_dev *rtwdev, bool is_fail,
3181 				    u32 dpk_txagc, u8 path)
3182 {
3183 	bool result;
3184 
3185 	if (!is_fail) {
3186 		if (rtw8822c_dpk_coef_read(rtwdev, path))
3187 			result = true;
3188 		else
3189 			result = false;
3190 	} else {
3191 		result = false;
3192 	}
3193 
3194 	rtw8822c_dpk_fill_result(rtwdev, dpk_txagc, path, result);
3195 
3196 	return result;
3197 }
3198 
3199 static void rtw8822c_dpk_result_reset(struct rtw_dev *rtwdev)
3200 {
3201 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3202 	u8 path;
3203 
3204 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
3205 		clear_bit(path, dpk_info->dpk_path_ok);
3206 		rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
3207 				 0x8 | (path << 1));
3208 		rtw_write32_mask(rtwdev, 0x1b58, 0x0000007f, 0x0);
3209 
3210 		dpk_info->dpk_txagc[path] = 0;
3211 		dpk_info->result[path] = 0;
3212 		dpk_info->dpk_gs[path] = 0x5b;
3213 		dpk_info->pre_pwsf[path] = 0;
3214 		dpk_info->thermal_dpk[path] = rtw8822c_dpk_thermal_read(rtwdev,
3215 									path);
3216 	}
3217 }
3218 
3219 static void rtw8822c_dpk_calibrate(struct rtw_dev *rtwdev, u8 path)
3220 {
3221 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3222 	u32 dpk_txagc;
3223 	u8 dpk_fail;
3224 
3225 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] s%d dpk start\n", path);
3226 
3227 	dpk_txagc = rtw8822c_dpk_gainloss(rtwdev, path);
3228 
3229 	dpk_fail = rtw8822c_dpk_by_path(rtwdev, dpk_txagc, path);
3230 
3231 	if (!rtw8822c_dpk_check_pass(rtwdev, dpk_fail, dpk_txagc, path))
3232 		rtw_err(rtwdev, "failed to do dpk calibration\n");
3233 
3234 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] s%d dpk finish\n", path);
3235 
3236 	if (dpk_info->result[path])
3237 		set_bit(path, dpk_info->dpk_path_ok);
3238 }
3239 
3240 static void rtw8822c_dpk_path_select(struct rtw_dev *rtwdev)
3241 {
3242 	rtw8822c_dpk_calibrate(rtwdev, RF_PATH_A);
3243 	rtw8822c_dpk_calibrate(rtwdev, RF_PATH_B);
3244 	rtw8822c_dpk_on(rtwdev, RF_PATH_A);
3245 	rtw8822c_dpk_on(rtwdev, RF_PATH_B);
3246 	rtw8822c_dpk_cal_coef1(rtwdev);
3247 }
3248 
3249 static void rtw8822c_dpk_enable_disable(struct rtw_dev *rtwdev)
3250 {
3251 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3252 	u32 mask = BIT(15) | BIT(14);
3253 
3254 	rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3255 
3256 	rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_DPD_EN,
3257 			 dpk_info->is_dpk_pwr_on);
3258 	rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, BIT_DPD_EN,
3259 			 dpk_info->is_dpk_pwr_on);
3260 
3261 	if (test_bit(RF_PATH_A, dpk_info->dpk_path_ok)) {
3262 		rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, mask, 0x0);
3263 		rtw_write8(rtwdev, REG_DPD_CTL0_S0, dpk_info->dpk_gs[RF_PATH_A]);
3264 	}
3265 	if (test_bit(RF_PATH_B, dpk_info->dpk_path_ok)) {
3266 		rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, mask, 0x0);
3267 		rtw_write8(rtwdev, REG_DPD_CTL0_S1, dpk_info->dpk_gs[RF_PATH_B]);
3268 	}
3269 }
3270 
3271 static void rtw8822c_dpk_reload_data(struct rtw_dev *rtwdev)
3272 {
3273 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3274 	u8 path;
3275 
3276 	if (!test_bit(RF_PATH_A, dpk_info->dpk_path_ok) &&
3277 	    !test_bit(RF_PATH_B, dpk_info->dpk_path_ok) &&
3278 	    dpk_info->dpk_ch == 0)
3279 		return;
3280 
3281 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
3282 		rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
3283 				 0x8 | (path << 1));
3284 		if (dpk_info->dpk_band == RTW_BAND_2G)
3285 			rtw_write32(rtwdev, REG_DPD_LUT3, 0x1f100000);
3286 		else
3287 			rtw_write32(rtwdev, REG_DPD_LUT3, 0x1f0d0000);
3288 
3289 		rtw_write8(rtwdev, REG_DPD_AGC, dpk_info->dpk_txagc[path]);
3290 
3291 		rtw8822c_dpk_coef_write(rtwdev, path,
3292 					test_bit(path, dpk_info->dpk_path_ok));
3293 
3294 		rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DPK_ON);
3295 
3296 		rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc);
3297 
3298 		if (path == RF_PATH_A)
3299 			rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF,
3300 					 dpk_info->dpk_gs[path]);
3301 		else
3302 			rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF,
3303 					 dpk_info->dpk_gs[path]);
3304 	}
3305 	rtw8822c_dpk_cal_coef1(rtwdev);
3306 }
3307 
3308 static bool rtw8822c_dpk_reload(struct rtw_dev *rtwdev)
3309 {
3310 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3311 	u8 channel;
3312 
3313 	dpk_info->is_reload = false;
3314 
3315 	channel = (u8)(rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK) & 0xff);
3316 
3317 	if (channel == dpk_info->dpk_ch) {
3318 		rtw_dbg(rtwdev, RTW_DBG_RFK,
3319 			"[DPK] DPK reload for CH%d!!\n", dpk_info->dpk_ch);
3320 		rtw8822c_dpk_reload_data(rtwdev);
3321 		dpk_info->is_reload = true;
3322 	}
3323 
3324 	return dpk_info->is_reload;
3325 }
3326 
3327 static void rtw8822c_do_dpk(struct rtw_dev *rtwdev)
3328 {
3329 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3330 	struct rtw_backup_info bckp[DPK_BB_REG_NUM];
3331 	u32 rf_reg_backup[DPK_RF_REG_NUM][DPK_RF_PATH_NUM];
3332 	u32 bb_reg[DPK_BB_REG_NUM] = {
3333 		0x520, 0x820, 0x824, 0x1c3c, 0x1d58, 0x1864,
3334 		0x4164, 0x180c, 0x410c, 0x186c, 0x416c,
3335 		0x1a14, 0x1e70, 0x80c, 0x1d70, 0x1e7c, 0x18a4, 0x41a4};
3336 	u32 rf_reg[DPK_RF_REG_NUM] = {
3337 		0x0, 0x1a, 0x55, 0x63, 0x87, 0x8f, 0xde};
3338 	u8 path;
3339 
3340 	if (!dpk_info->is_dpk_pwr_on) {
3341 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] Skip DPK due to DPD PWR off\n");
3342 		return;
3343 	} else if (rtw8822c_dpk_reload(rtwdev)) {
3344 		return;
3345 	}
3346 
3347 	for (path = RF_PATH_A; path < DPK_RF_PATH_NUM; path++)
3348 		ewma_thermal_init(&dpk_info->avg_thermal[path]);
3349 
3350 	rtw8822c_dpk_information(rtwdev);
3351 
3352 	rtw8822c_dpk_backup_registers(rtwdev, bb_reg, DPK_BB_REG_NUM, bckp);
3353 	rtw8822c_dpk_backup_rf_registers(rtwdev, rf_reg, rf_reg_backup);
3354 
3355 	rtw8822c_dpk_mac_bb_setting(rtwdev);
3356 	rtw8822c_dpk_afe_setting(rtwdev, true);
3357 	rtw8822c_dpk_pre_setting(rtwdev);
3358 	rtw8822c_dpk_result_reset(rtwdev);
3359 	rtw8822c_dpk_path_select(rtwdev);
3360 	rtw8822c_dpk_afe_setting(rtwdev, false);
3361 	rtw8822c_dpk_enable_disable(rtwdev);
3362 
3363 	rtw8822c_dpk_reload_rf_registers(rtwdev, rf_reg, rf_reg_backup);
3364 	for (path = 0; path < rtwdev->hal.rf_path_num; path++)
3365 		rtw8822c_dpk_rxbb_dc_cal(rtwdev, path);
3366 	rtw8822c_dpk_restore_registers(rtwdev, DPK_BB_REG_NUM, bckp);
3367 }
3368 
3369 static void rtw8822c_phy_calibration(struct rtw_dev *rtwdev)
3370 {
3371 	rtw8822c_do_iqk(rtwdev);
3372 	rtw8822c_do_dpk(rtwdev);
3373 }
3374 
3375 static void rtw8822c_dpk_track(struct rtw_dev *rtwdev)
3376 {
3377 	struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
3378 	u8 path;
3379 	u8 thermal_value[DPK_RF_PATH_NUM] = {0};
3380 	s8 offset[DPK_RF_PATH_NUM], delta_dpk[DPK_RF_PATH_NUM];
3381 
3382 	if (dpk_info->thermal_dpk[0] == 0 && dpk_info->thermal_dpk[1] == 0)
3383 		return;
3384 
3385 	for (path = 0; path < DPK_RF_PATH_NUM; path++) {
3386 		thermal_value[path] = rtw8822c_dpk_thermal_read(rtwdev, path);
3387 		ewma_thermal_add(&dpk_info->avg_thermal[path],
3388 				 thermal_value[path]);
3389 		thermal_value[path] =
3390 			ewma_thermal_read(&dpk_info->avg_thermal[path]);
3391 		delta_dpk[path] = dpk_info->thermal_dpk[path] -
3392 				  thermal_value[path];
3393 		offset[path] = delta_dpk[path] -
3394 			       dpk_info->thermal_dpk_delta[path];
3395 		offset[path] &= 0x7f;
3396 
3397 		if (offset[path] != dpk_info->pre_pwsf[path]) {
3398 			rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE,
3399 					 0x8 | (path << 1));
3400 			rtw_write32_mask(rtwdev, 0x1b58, GENMASK(6, 0),
3401 					 offset[path]);
3402 			dpk_info->pre_pwsf[path] = offset[path];
3403 		}
3404 	}
3405 }
3406 
3407 static const struct rtw_phy_cck_pd_reg
3408 rtw8822c_cck_pd_reg[RTW_CHANNEL_WIDTH_40 + 1][RTW_RF_PATH_MAX] = {
3409 	{
3410 		{0x1ac8, 0x00ff, 0x1ad0, 0x01f},
3411 		{0x1ac8, 0xff00, 0x1ad0, 0x3e0}
3412 	},
3413 	{
3414 		{0x1acc, 0x00ff, 0x1ad0, 0x01F00000},
3415 		{0x1acc, 0xff00, 0x1ad0, 0x3E000000}
3416 	},
3417 };
3418 
3419 #define RTW_CCK_PD_MAX 255
3420 #define RTW_CCK_CS_MAX 31
3421 #define RTW_CCK_CS_ERR1 27
3422 #define RTW_CCK_CS_ERR2 29
3423 static void
3424 rtw8822c_phy_cck_pd_set_reg(struct rtw_dev *rtwdev,
3425 			    s8 pd_diff, s8 cs_diff, u8 bw, u8 nrx)
3426 {
3427 	u32 pd, cs;
3428 
3429 	if (WARN_ON(bw > RTW_CHANNEL_WIDTH_40 || nrx >= RTW_RF_PATH_MAX))
3430 		return;
3431 
3432 	pd = rtw_read32_mask(rtwdev,
3433 			     rtw8822c_cck_pd_reg[bw][nrx].reg_pd,
3434 			     rtw8822c_cck_pd_reg[bw][nrx].mask_pd);
3435 	cs = rtw_read32_mask(rtwdev,
3436 			     rtw8822c_cck_pd_reg[bw][nrx].reg_cs,
3437 			     rtw8822c_cck_pd_reg[bw][nrx].mask_cs);
3438 	pd += pd_diff;
3439 	cs += cs_diff;
3440 	if (pd > RTW_CCK_PD_MAX)
3441 		pd = RTW_CCK_PD_MAX;
3442 	if (cs == RTW_CCK_CS_ERR1 || cs == RTW_CCK_CS_ERR2)
3443 		cs++;
3444 	else if (cs > RTW_CCK_CS_MAX)
3445 		cs = RTW_CCK_CS_MAX;
3446 	rtw_write32_mask(rtwdev,
3447 			 rtw8822c_cck_pd_reg[bw][nrx].reg_pd,
3448 			 rtw8822c_cck_pd_reg[bw][nrx].mask_pd,
3449 			 pd);
3450 	rtw_write32_mask(rtwdev,
3451 			 rtw8822c_cck_pd_reg[bw][nrx].reg_cs,
3452 			 rtw8822c_cck_pd_reg[bw][nrx].mask_cs,
3453 			 cs);
3454 }
3455 
3456 static void rtw8822c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
3457 {
3458 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
3459 	s8 pd_lvl[CCK_PD_LV_MAX] = {0, 2, 4, 6, 8};
3460 	s8 cs_lvl[CCK_PD_LV_MAX] = {0, 2, 2, 2, 4};
3461 	u8 cur_lvl;
3462 	u8 nrx, bw;
3463 
3464 	nrx = (u8)rtw_read32_mask(rtwdev, 0x1a2c, 0x60000);
3465 	bw = (u8)rtw_read32_mask(rtwdev, 0x9b0, 0xc);
3466 
3467 	if (dm_info->cck_pd_lv[bw][nrx] == new_lvl)
3468 		return;
3469 
3470 	cur_lvl = dm_info->cck_pd_lv[bw][nrx];
3471 
3472 	/* update cck pd info */
3473 	dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
3474 
3475 	rtw8822c_phy_cck_pd_set_reg(rtwdev,
3476 				    pd_lvl[new_lvl] - pd_lvl[cur_lvl],
3477 				    cs_lvl[new_lvl] - cs_lvl[cur_lvl],
3478 				    bw, nrx);
3479 	dm_info->cck_pd_lv[bw][nrx] = new_lvl;
3480 }
3481 
3482 #define PWR_TRACK_MASK 0x7f
3483 static void rtw8822c_pwrtrack_set(struct rtw_dev *rtwdev, u8 rf_path)
3484 {
3485 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
3486 
3487 	switch (rf_path) {
3488 	case RF_PATH_A:
3489 		rtw_write32_mask(rtwdev, 0x18a0, PWR_TRACK_MASK,
3490 				 dm_info->delta_power_index[rf_path]);
3491 		break;
3492 	case RF_PATH_B:
3493 		rtw_write32_mask(rtwdev, 0x41a0, PWR_TRACK_MASK,
3494 				 dm_info->delta_power_index[rf_path]);
3495 		break;
3496 	default:
3497 		break;
3498 	}
3499 }
3500 
3501 static void rtw8822c_pwr_track_path(struct rtw_dev *rtwdev,
3502 				    struct rtw_swing_table *swing_table,
3503 				    u8 path)
3504 {
3505 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
3506 	u8 thermal_value, delta;
3507 
3508 	if (rtwdev->efuse.thermal_meter[path] == 0xff)
3509 		return;
3510 
3511 	thermal_value = rtw_read_rf(rtwdev, path, RF_T_METER, 0x7e);
3512 
3513 	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, path);
3514 
3515 	delta = rtw_phy_pwrtrack_get_delta(rtwdev, path);
3516 
3517 	dm_info->delta_power_index[path] =
3518 		rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table, path, path,
3519 					    delta);
3520 
3521 	rtw8822c_pwrtrack_set(rtwdev, path);
3522 }
3523 
3524 static void __rtw8822c_pwr_track(struct rtw_dev *rtwdev)
3525 {
3526 	struct rtw_swing_table swing_table;
3527 	u8 i;
3528 
3529 	rtw_phy_config_swing_table(rtwdev, &swing_table);
3530 
3531 	for (i = 0; i < rtwdev->hal.rf_path_num; i++)
3532 		rtw8822c_pwr_track_path(rtwdev, &swing_table, i);
3533 
3534 	if (rtw_phy_pwrtrack_need_iqk(rtwdev))
3535 		rtw8822c_do_iqk(rtwdev);
3536 }
3537 
3538 static void rtw8822c_pwr_track(struct rtw_dev *rtwdev)
3539 {
3540 	struct rtw_efuse *efuse = &rtwdev->efuse;
3541 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
3542 
3543 	if (efuse->power_track_type != 0)
3544 		return;
3545 
3546 	if (!dm_info->pwr_trk_triggered) {
3547 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x01);
3548 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x00);
3549 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x01);
3550 
3551 		rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x01);
3552 		rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x00);
3553 		rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x01);
3554 
3555 		dm_info->pwr_trk_triggered = true;
3556 		return;
3557 	}
3558 
3559 	__rtw8822c_pwr_track(rtwdev);
3560 	dm_info->pwr_trk_triggered = false;
3561 }
3562 
3563 static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822c[] = {
3564 	{0x0086,
3565 	 RTW_PWR_CUT_ALL_MSK,
3566 	 RTW_PWR_INTF_SDIO_MSK,
3567 	 RTW_PWR_ADDR_SDIO,
3568 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
3569 	{0x0086,
3570 	 RTW_PWR_CUT_ALL_MSK,
3571 	 RTW_PWR_INTF_SDIO_MSK,
3572 	 RTW_PWR_ADDR_SDIO,
3573 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
3574 	{0x002E,
3575 	 RTW_PWR_CUT_ALL_MSK,
3576 	 RTW_PWR_INTF_ALL_MSK,
3577 	 RTW_PWR_ADDR_MAC,
3578 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
3579 	{0x002D,
3580 	 RTW_PWR_CUT_ALL_MSK,
3581 	 RTW_PWR_INTF_ALL_MSK,
3582 	 RTW_PWR_ADDR_MAC,
3583 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
3584 	{0x007F,
3585 	 RTW_PWR_CUT_ALL_MSK,
3586 	 RTW_PWR_INTF_ALL_MSK,
3587 	 RTW_PWR_ADDR_MAC,
3588 	 RTW_PWR_CMD_WRITE, BIT(7), 0},
3589 	{0x004A,
3590 	 RTW_PWR_CUT_ALL_MSK,
3591 	 RTW_PWR_INTF_USB_MSK,
3592 	 RTW_PWR_ADDR_MAC,
3593 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
3594 	{0x0005,
3595 	 RTW_PWR_CUT_ALL_MSK,
3596 	 RTW_PWR_INTF_ALL_MSK,
3597 	 RTW_PWR_ADDR_MAC,
3598 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0},
3599 	{0xFFFF,
3600 	 RTW_PWR_CUT_ALL_MSK,
3601 	 RTW_PWR_INTF_ALL_MSK,
3602 	 0,
3603 	 RTW_PWR_CMD_END, 0, 0},
3604 };
3605 
3606 static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822c[] = {
3607 	{0x0000,
3608 	 RTW_PWR_CUT_ALL_MSK,
3609 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
3610 	 RTW_PWR_ADDR_MAC,
3611 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
3612 	{0x0005,
3613 	 RTW_PWR_CUT_ALL_MSK,
3614 	 RTW_PWR_INTF_ALL_MSK,
3615 	 RTW_PWR_ADDR_MAC,
3616 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
3617 	{0x0075,
3618 	 RTW_PWR_CUT_ALL_MSK,
3619 	 RTW_PWR_INTF_PCI_MSK,
3620 	 RTW_PWR_ADDR_MAC,
3621 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
3622 	{0x0006,
3623 	 RTW_PWR_CUT_ALL_MSK,
3624 	 RTW_PWR_INTF_ALL_MSK,
3625 	 RTW_PWR_ADDR_MAC,
3626 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
3627 	{0x0075,
3628 	 RTW_PWR_CUT_ALL_MSK,
3629 	 RTW_PWR_INTF_PCI_MSK,
3630 	 RTW_PWR_ADDR_MAC,
3631 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
3632 	{0xFF1A,
3633 	 RTW_PWR_CUT_ALL_MSK,
3634 	 RTW_PWR_INTF_USB_MSK,
3635 	 RTW_PWR_ADDR_MAC,
3636 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
3637 	{0x002E,
3638 	 RTW_PWR_CUT_ALL_MSK,
3639 	 RTW_PWR_INTF_ALL_MSK,
3640 	 RTW_PWR_ADDR_MAC,
3641 	 RTW_PWR_CMD_WRITE, BIT(3), 0},
3642 	{0x0006,
3643 	 RTW_PWR_CUT_ALL_MSK,
3644 	 RTW_PWR_INTF_ALL_MSK,
3645 	 RTW_PWR_ADDR_MAC,
3646 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
3647 	{0x0005,
3648 	 RTW_PWR_CUT_ALL_MSK,
3649 	 RTW_PWR_INTF_ALL_MSK,
3650 	 RTW_PWR_ADDR_MAC,
3651 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
3652 	{0x1018,
3653 	 RTW_PWR_CUT_ALL_MSK,
3654 	 RTW_PWR_INTF_ALL_MSK,
3655 	 RTW_PWR_ADDR_MAC,
3656 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
3657 	{0x0005,
3658 	 RTW_PWR_CUT_ALL_MSK,
3659 	 RTW_PWR_INTF_ALL_MSK,
3660 	 RTW_PWR_ADDR_MAC,
3661 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
3662 	{0x0005,
3663 	 RTW_PWR_CUT_ALL_MSK,
3664 	 RTW_PWR_INTF_ALL_MSK,
3665 	 RTW_PWR_ADDR_MAC,
3666 	 RTW_PWR_CMD_POLLING, BIT(0), 0},
3667 	{0x0074,
3668 	 RTW_PWR_CUT_ALL_MSK,
3669 	 RTW_PWR_INTF_PCI_MSK,
3670 	 RTW_PWR_ADDR_MAC,
3671 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
3672 	{0x0071,
3673 	 RTW_PWR_CUT_ALL_MSK,
3674 	 RTW_PWR_INTF_PCI_MSK,
3675 	 RTW_PWR_ADDR_MAC,
3676 	 RTW_PWR_CMD_WRITE, BIT(4), 0},
3677 	{0x0062,
3678 	 RTW_PWR_CUT_ALL_MSK,
3679 	 RTW_PWR_INTF_PCI_MSK,
3680 	 RTW_PWR_ADDR_MAC,
3681 	 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)),
3682 	 (BIT(7) | BIT(6) | BIT(5))},
3683 	{0x0061,
3684 	 RTW_PWR_CUT_ALL_MSK,
3685 	 RTW_PWR_INTF_PCI_MSK,
3686 	 RTW_PWR_ADDR_MAC,
3687 	 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)), 0},
3688 	{0x001F,
3689 	 RTW_PWR_CUT_ALL_MSK,
3690 	 RTW_PWR_INTF_ALL_MSK,
3691 	 RTW_PWR_ADDR_MAC,
3692 	 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6)), BIT(7)},
3693 	{0x00EF,
3694 	 RTW_PWR_CUT_ALL_MSK,
3695 	 RTW_PWR_INTF_ALL_MSK,
3696 	 RTW_PWR_ADDR_MAC,
3697 	 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6)), BIT(7)},
3698 	{0x1045,
3699 	 RTW_PWR_CUT_ALL_MSK,
3700 	 RTW_PWR_INTF_ALL_MSK,
3701 	 RTW_PWR_ADDR_MAC,
3702 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
3703 	{0x0010,
3704 	 RTW_PWR_CUT_ALL_MSK,
3705 	 RTW_PWR_INTF_ALL_MSK,
3706 	 RTW_PWR_ADDR_MAC,
3707 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
3708 	{0x1064,
3709 	 RTW_PWR_CUT_ALL_MSK,
3710 	 RTW_PWR_INTF_ALL_MSK,
3711 	 RTW_PWR_ADDR_MAC,
3712 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
3713 	{0xFFFF,
3714 	 RTW_PWR_CUT_ALL_MSK,
3715 	 RTW_PWR_INTF_ALL_MSK,
3716 	 0,
3717 	 RTW_PWR_CMD_END, 0, 0},
3718 };
3719 
3720 static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822c[] = {
3721 	{0x0093,
3722 	 RTW_PWR_CUT_ALL_MSK,
3723 	 RTW_PWR_INTF_ALL_MSK,
3724 	 RTW_PWR_ADDR_MAC,
3725 	 RTW_PWR_CMD_WRITE, BIT(3), 0},
3726 	{0x001F,
3727 	 RTW_PWR_CUT_ALL_MSK,
3728 	 RTW_PWR_INTF_ALL_MSK,
3729 	 RTW_PWR_ADDR_MAC,
3730 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
3731 	{0x00EF,
3732 	 RTW_PWR_CUT_ALL_MSK,
3733 	 RTW_PWR_INTF_ALL_MSK,
3734 	 RTW_PWR_ADDR_MAC,
3735 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
3736 	{0x1045,
3737 	 RTW_PWR_CUT_ALL_MSK,
3738 	 RTW_PWR_INTF_ALL_MSK,
3739 	 RTW_PWR_ADDR_MAC,
3740 	 RTW_PWR_CMD_WRITE, BIT(4), 0},
3741 	{0xFF1A,
3742 	 RTW_PWR_CUT_ALL_MSK,
3743 	 RTW_PWR_INTF_USB_MSK,
3744 	 RTW_PWR_ADDR_MAC,
3745 	 RTW_PWR_CMD_WRITE, 0xFF, 0x30},
3746 	{0x0049,
3747 	 RTW_PWR_CUT_ALL_MSK,
3748 	 RTW_PWR_INTF_ALL_MSK,
3749 	 RTW_PWR_ADDR_MAC,
3750 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
3751 	{0x0006,
3752 	 RTW_PWR_CUT_ALL_MSK,
3753 	 RTW_PWR_INTF_ALL_MSK,
3754 	 RTW_PWR_ADDR_MAC,
3755 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
3756 	{0x0002,
3757 	 RTW_PWR_CUT_ALL_MSK,
3758 	 RTW_PWR_INTF_ALL_MSK,
3759 	 RTW_PWR_ADDR_MAC,
3760 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
3761 	{0x0005,
3762 	 RTW_PWR_CUT_ALL_MSK,
3763 	 RTW_PWR_INTF_ALL_MSK,
3764 	 RTW_PWR_ADDR_MAC,
3765 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
3766 	{0x0005,
3767 	 RTW_PWR_CUT_ALL_MSK,
3768 	 RTW_PWR_INTF_ALL_MSK,
3769 	 RTW_PWR_ADDR_MAC,
3770 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
3771 	{0x0000,
3772 	 RTW_PWR_CUT_ALL_MSK,
3773 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
3774 	 RTW_PWR_ADDR_MAC,
3775 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
3776 	{0xFFFF,
3777 	 RTW_PWR_CUT_ALL_MSK,
3778 	 RTW_PWR_INTF_ALL_MSK,
3779 	 0,
3780 	 RTW_PWR_CMD_END, 0, 0},
3781 };
3782 
3783 static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822c[] = {
3784 	{0x0005,
3785 	 RTW_PWR_CUT_ALL_MSK,
3786 	 RTW_PWR_INTF_SDIO_MSK,
3787 	 RTW_PWR_ADDR_MAC,
3788 	 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
3789 	{0x0007,
3790 	 RTW_PWR_CUT_ALL_MSK,
3791 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
3792 	 RTW_PWR_ADDR_MAC,
3793 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
3794 	{0x0067,
3795 	 RTW_PWR_CUT_ALL_MSK,
3796 	 RTW_PWR_INTF_ALL_MSK,
3797 	 RTW_PWR_ADDR_MAC,
3798 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
3799 	{0x004A,
3800 	 RTW_PWR_CUT_ALL_MSK,
3801 	 RTW_PWR_INTF_USB_MSK,
3802 	 RTW_PWR_ADDR_MAC,
3803 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
3804 	{0x0081,
3805 	 RTW_PWR_CUT_ALL_MSK,
3806 	 RTW_PWR_INTF_ALL_MSK,
3807 	 RTW_PWR_ADDR_MAC,
3808 	 RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0},
3809 	{0x0090,
3810 	 RTW_PWR_CUT_ALL_MSK,
3811 	 RTW_PWR_INTF_ALL_MSK,
3812 	 RTW_PWR_ADDR_MAC,
3813 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
3814 	{0x0092,
3815 	 RTW_PWR_CUT_ALL_MSK,
3816 	 RTW_PWR_INTF_PCI_MSK,
3817 	 RTW_PWR_ADDR_MAC,
3818 	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
3819 	{0x0093,
3820 	 RTW_PWR_CUT_ALL_MSK,
3821 	 RTW_PWR_INTF_PCI_MSK,
3822 	 RTW_PWR_ADDR_MAC,
3823 	 RTW_PWR_CMD_WRITE, 0xFF, 0x04},
3824 	{0x0005,
3825 	 RTW_PWR_CUT_ALL_MSK,
3826 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
3827 	 RTW_PWR_ADDR_MAC,
3828 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
3829 	{0x0005,
3830 	 RTW_PWR_CUT_ALL_MSK,
3831 	 RTW_PWR_INTF_PCI_MSK,
3832 	 RTW_PWR_ADDR_MAC,
3833 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
3834 	{0x0086,
3835 	 RTW_PWR_CUT_ALL_MSK,
3836 	 RTW_PWR_INTF_SDIO_MSK,
3837 	 RTW_PWR_ADDR_SDIO,
3838 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
3839 	{0xFFFF,
3840 	 RTW_PWR_CUT_ALL_MSK,
3841 	 RTW_PWR_INTF_ALL_MSK,
3842 	 0,
3843 	 RTW_PWR_CMD_END, 0, 0},
3844 };
3845 
3846 static const struct rtw_pwr_seq_cmd *card_enable_flow_8822c[] = {
3847 	trans_carddis_to_cardemu_8822c,
3848 	trans_cardemu_to_act_8822c,
3849 	NULL
3850 };
3851 
3852 static const struct rtw_pwr_seq_cmd *card_disable_flow_8822c[] = {
3853 	trans_act_to_cardemu_8822c,
3854 	trans_cardemu_to_carddis_8822c,
3855 	NULL
3856 };
3857 
3858 static const struct rtw_intf_phy_para usb2_param_8822c[] = {
3859 	{0xFFFF, 0x00,
3860 	 RTW_IP_SEL_PHY,
3861 	 RTW_INTF_PHY_CUT_ALL,
3862 	 RTW_INTF_PHY_PLATFORM_ALL},
3863 };
3864 
3865 static const struct rtw_intf_phy_para usb3_param_8822c[] = {
3866 	{0xFFFF, 0x0000,
3867 	 RTW_IP_SEL_PHY,
3868 	 RTW_INTF_PHY_CUT_ALL,
3869 	 RTW_INTF_PHY_PLATFORM_ALL},
3870 };
3871 
3872 static const struct rtw_intf_phy_para pcie_gen1_param_8822c[] = {
3873 	{0xFFFF, 0x0000,
3874 	 RTW_IP_SEL_PHY,
3875 	 RTW_INTF_PHY_CUT_ALL,
3876 	 RTW_INTF_PHY_PLATFORM_ALL},
3877 };
3878 
3879 static const struct rtw_intf_phy_para pcie_gen2_param_8822c[] = {
3880 	{0xFFFF, 0x0000,
3881 	 RTW_IP_SEL_PHY,
3882 	 RTW_INTF_PHY_CUT_ALL,
3883 	 RTW_INTF_PHY_PLATFORM_ALL},
3884 };
3885 
3886 static const struct rtw_intf_phy_para_table phy_para_table_8822c = {
3887 	.usb2_para	= usb2_param_8822c,
3888 	.usb3_para	= usb3_param_8822c,
3889 	.gen1_para	= pcie_gen1_param_8822c,
3890 	.gen2_para	= pcie_gen2_param_8822c,
3891 	.n_usb2_para	= ARRAY_SIZE(usb2_param_8822c),
3892 	.n_usb3_para	= ARRAY_SIZE(usb2_param_8822c),
3893 	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8822c),
3894 	.n_gen2_para	= ARRAY_SIZE(pcie_gen2_param_8822c),
3895 };
3896 
3897 static const struct rtw_rfe_def rtw8822c_rfe_defs[] = {
3898 	[0] = RTW_DEF_RFE(8822c, 0, 0),
3899 	[1] = RTW_DEF_RFE(8822c, 0, 0),
3900 	[2] = RTW_DEF_RFE(8822c, 0, 0),
3901 	[5] = RTW_DEF_RFE(8822c, 0, 5),
3902 };
3903 
3904 static const struct rtw_hw_reg rtw8822c_dig[] = {
3905 	[0] = { .addr = 0x1d70, .mask = 0x7f },
3906 	[1] = { .addr = 0x1d70, .mask = 0x7f00 },
3907 };
3908 
3909 static const struct rtw_ltecoex_addr rtw8822c_ltecoex_addr = {
3910 	.ctrl = LTECOEX_ACCESS_CTRL,
3911 	.wdata = LTECOEX_WRITE_DATA,
3912 	.rdata = LTECOEX_READ_DATA,
3913 };
3914 
3915 static const struct rtw_page_table page_table_8822c[] = {
3916 	{64, 64, 64, 64, 1},
3917 	{64, 64, 64, 64, 1},
3918 	{64, 64, 0, 0, 1},
3919 	{64, 64, 64, 0, 1},
3920 	{64, 64, 64, 64, 1},
3921 };
3922 
3923 static const struct rtw_rqpn rqpn_table_8822c[] = {
3924 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
3925 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
3926 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
3927 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
3928 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
3929 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
3930 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
3931 	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
3932 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
3933 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
3934 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
3935 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
3936 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
3937 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
3938 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
3939 };
3940 
3941 static struct rtw_prioq_addrs prioq_addrs_8822c = {
3942 	.prio[RTW_DMA_MAPPING_EXTRA] = {
3943 		.rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
3944 	},
3945 	.prio[RTW_DMA_MAPPING_LOW] = {
3946 		.rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2,
3947 	},
3948 	.prio[RTW_DMA_MAPPING_NORMAL] = {
3949 		.rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2,
3950 	},
3951 	.prio[RTW_DMA_MAPPING_HIGH] = {
3952 		.rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2,
3953 	},
3954 	.wsize = true,
3955 };
3956 
3957 static struct rtw_chip_ops rtw8822c_ops = {
3958 	.phy_set_param		= rtw8822c_phy_set_param,
3959 	.read_efuse		= rtw8822c_read_efuse,
3960 	.query_rx_desc		= rtw8822c_query_rx_desc,
3961 	.set_channel		= rtw8822c_set_channel,
3962 	.mac_init		= rtw8822c_mac_init,
3963 	.read_rf		= rtw_phy_read_rf,
3964 	.write_rf		= rtw_phy_write_rf_reg_mix,
3965 	.set_tx_power_index	= rtw8822c_set_tx_power_index,
3966 	.set_antenna		= rtw8822c_set_antenna,
3967 	.cfg_ldo25		= rtw8822c_cfg_ldo25,
3968 	.false_alarm_statistics	= rtw8822c_false_alarm_statistics,
3969 	.dpk_track		= rtw8822c_dpk_track,
3970 	.phy_calibration	= rtw8822c_phy_calibration,
3971 	.cck_pd_set		= rtw8822c_phy_cck_pd_set,
3972 	.pwr_track		= rtw8822c_pwr_track,
3973 	.config_bfee		= rtw8822c_bf_config_bfee,
3974 	.set_gid_table		= rtw_bf_set_gid_table,
3975 	.cfg_csi_rate		= rtw_bf_cfg_csi_rate,
3976 
3977 	.coex_set_init		= rtw8822c_coex_cfg_init,
3978 	.coex_set_ant_switch	= NULL,
3979 	.coex_set_gnt_fix	= rtw8822c_coex_cfg_gnt_fix,
3980 	.coex_set_gnt_debug	= rtw8822c_coex_cfg_gnt_debug,
3981 	.coex_set_rfe_type	= rtw8822c_coex_cfg_rfe_type,
3982 	.coex_set_wl_tx_power	= rtw8822c_coex_cfg_wl_tx_power,
3983 	.coex_set_wl_rx_gain	= rtw8822c_coex_cfg_wl_rx_gain,
3984 };
3985 
3986 /* Shared-Antenna Coex Table */
3987 static const struct coex_table_para table_sant_8822c[] = {
3988 	{0xffffffff, 0xffffffff}, /* case-0 */
3989 	{0x55555555, 0x55555555},
3990 	{0x66555555, 0x66555555},
3991 	{0xaaaaaaaa, 0xaaaaaaaa},
3992 	{0x5a5a5a5a, 0x5a5a5a5a},
3993 	{0xfafafafa, 0xfafafafa}, /* case-5 */
3994 	{0x6a5a6a5a, 0xaaaaaaaa},
3995 	{0x6a5a56aa, 0x6a5a56aa},
3996 	{0x6a5a5a5a, 0x6a5a5a5a},
3997 	{0x66555555, 0x5a5a5a5a},
3998 	{0x66555555, 0x6a5a5a5a}, /* case-10 */
3999 	{0x66555555, 0xfafafafa},
4000 	{0x66555555, 0x6a5a5aaa},
4001 	{0x66555555, 0x5aaa5aaa},
4002 	{0x66555555, 0xaaaa5aaa},
4003 	{0x66555555, 0xaaaaaaaa}, /* case-15 */
4004 	{0xffff55ff, 0xfafafafa},
4005 	{0xffff55ff, 0x6afa5afa},
4006 	{0xaaffffaa, 0xfafafafa},
4007 	{0xaa5555aa, 0x5a5a5a5a},
4008 	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
4009 	{0xaa5555aa, 0xaaaaaaaa},
4010 	{0xffffffff, 0x5a5a5a5a},
4011 	{0xffffffff, 0x6a5a5a5a},
4012 	{0xffffffff, 0x55555555},
4013 	{0xffffffff, 0x6a5a5aaa}, /* case-25 */
4014 	{0x55555555, 0x5a5a5a5a},
4015 	{0x55555555, 0xaaaaaaaa},
4016 	{0x55555555, 0x6a5a6a5a},
4017 	{0x66556655, 0x66556655}
4018 };
4019 
4020 /* Non-Shared-Antenna Coex Table */
4021 static const struct coex_table_para table_nsant_8822c[] = {
4022 	{0xffffffff, 0xffffffff}, /* case-100 */
4023 	{0x55555555, 0x55555555},
4024 	{0x66555555, 0x66555555},
4025 	{0xaaaaaaaa, 0xaaaaaaaa},
4026 	{0x5a5a5a5a, 0x5a5a5a5a},
4027 	{0xfafafafa, 0xfafafafa}, /* case-105 */
4028 	{0x5afa5afa, 0x5afa5afa},
4029 	{0x55555555, 0xfafafafa},
4030 	{0x66555555, 0xfafafafa},
4031 	{0x66555555, 0x5a5a5a5a},
4032 	{0x66555555, 0x6a5a5a5a}, /* case-110 */
4033 	{0x66555555, 0xaaaaaaaa},
4034 	{0xffff55ff, 0xfafafafa},
4035 	{0xffff55ff, 0x5afa5afa},
4036 	{0xffff55ff, 0xaaaaaaaa},
4037 	{0xaaffffaa, 0xfafafafa}, /* case-115 */
4038 	{0xaaffffaa, 0x5afa5afa},
4039 	{0xaaffffaa, 0xaaaaaaaa},
4040 	{0xffffffff, 0xfafafafa},
4041 	{0xffffffff, 0x5afa5afa},
4042 	{0xffffffff, 0xaaaaaaaa},/* case-120 */
4043 	{0x55ff55ff, 0x5afa5afa},
4044 	{0x55ff55ff, 0xaaaaaaaa},
4045 	{0x55ff55ff, 0x55ff55ff}
4046 };
4047 
4048 /* Shared-Antenna TDMA */
4049 static const struct coex_tdma_para tdma_sant_8822c[] = {
4050 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
4051 	{ {0x61, 0x45, 0x03, 0x11, 0x11} },
4052 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
4053 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
4054 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
4055 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
4056 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
4057 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
4058 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
4059 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
4060 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
4061 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
4062 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
4063 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
4064 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
4065 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
4066 	{ {0x51, 0x45, 0x03, 0x10, 0x10} },
4067 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
4068 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
4069 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
4070 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
4071 	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
4072 	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
4073 	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
4074 	{ {0x65, 0x10, 0x03, 0x11, 0x11} },
4075 	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
4076 	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
4077 };
4078 
4079 /* Non-Shared-Antenna TDMA */
4080 static const struct coex_tdma_para tdma_nsant_8822c[] = {
4081 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-100 */
4082 	{ {0x61, 0x45, 0x03, 0x11, 0x11} },
4083 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
4084 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
4085 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
4086 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
4087 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
4088 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
4089 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
4090 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
4091 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
4092 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
4093 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
4094 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
4095 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
4096 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
4097 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
4098 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
4099 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
4100 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
4101 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }  /* case-120 */
4102 };
4103 
4104 /* rssi in percentage % (dbm = % - 100) */
4105 static const u8 wl_rssi_step_8822c[] = {60, 50, 44, 30};
4106 static const u8 bt_rssi_step_8822c[] = {8, 15, 20, 25};
4107 static const struct coex_5g_afh_map afh_5g_8822c[] = { {0, 0, 0} };
4108 
4109 /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
4110 static const struct coex_rf_para rf_para_tx_8822c[] = {
4111 	{0, 0, false, 7},  /* for normal */
4112 	{0, 16, false, 7}, /* for WL-CPT */
4113 	{8, 17, true, 4},
4114 	{7, 18, true, 4},
4115 	{6, 19, true, 4},
4116 	{5, 20, true, 4}
4117 };
4118 
4119 static const struct coex_rf_para rf_para_rx_8822c[] = {
4120 	{0, 0, false, 7},  /* for normal */
4121 	{0, 16, false, 7}, /* for WL-CPT */
4122 	{3, 24, true, 5},
4123 	{2, 26, true, 5},
4124 	{1, 27, true, 5},
4125 	{0, 28, true, 5}
4126 };
4127 
4128 static_assert(ARRAY_SIZE(rf_para_tx_8822c) == ARRAY_SIZE(rf_para_rx_8822c));
4129 
4130 static const u8
4131 rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
4132 	{ 0,  1,  2,  3,  5,  6,  7,  8,  9, 10,
4133 	 11, 12, 13, 14, 15, 16, 18, 19, 20, 21,
4134 	 22, 23, 24, 25, 26, 27, 28, 29, 30, 32 },
4135 	{ 0,  1,  2,  3,  5,  6,  7,  8,  9, 10,
4136 	 11, 12, 13, 14, 15, 16, 18, 19, 20, 21,
4137 	 22, 23, 24, 25, 26, 27, 28, 29, 30, 32 },
4138 	{ 0,  1,  2,  3,  5,  6,  7,  8,  9, 10,
4139 	 11, 12, 13, 14, 15, 16, 18, 19, 20, 21,
4140 	 22, 23, 24, 25, 26, 27, 28, 29, 30, 32 },
4141 };
4142 
4143 static const u8
4144 rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
4145 	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4146 	 10, 10, 11, 12, 13, 14, 15, 16, 17, 18,
4147 	 19, 20, 21, 22, 22, 23, 24, 25, 26, 27 },
4148 	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4149 	 10, 10, 11, 12, 13, 14, 15, 16, 17, 18,
4150 	 19, 20, 21, 22, 22, 23, 24, 25, 26, 27 },
4151 	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4152 	 10, 10, 11, 12, 13, 14, 15, 16, 17, 18,
4153 	 19, 20, 21, 22, 22, 23, 24, 25, 26, 27 },
4154 };
4155 
4156 static const u8
4157 rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
4158 	{ 0,  1,  2,  4,  5,  6,  7,  8,  9, 10,
4159 	 11, 13, 14, 15, 16, 17, 18, 19, 20, 21,
4160 	 23, 24, 25, 26, 27, 28, 29, 30, 31, 33 },
4161 	{ 0,  1,  2,  4,  5,  6,  7,  8,  9, 10,
4162 	 11, 13, 14, 15, 16, 17, 18, 19, 20, 21,
4163 	 23, 24, 25, 26, 27, 28, 29, 30, 31, 33 },
4164 	{ 0,  1,  2,  4,  5,  6,  7,  8,  9, 10,
4165 	 11, 13, 14, 15, 16, 17, 18, 19, 20, 21,
4166 	 23, 24, 25, 26, 27, 28, 29, 30, 31, 33 },
4167 };
4168 
4169 static const u8
4170 rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
4171 	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4172 	 10, 11, 12, 13, 14, 15, 16, 17, 18, 20,
4173 	 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
4174 	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4175 	 10, 11, 12, 13, 14, 15, 16, 17, 18, 20,
4176 	 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
4177 	{ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4178 	 10, 11, 12, 13, 14, 15, 16, 17, 18, 20,
4179 	 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
4180 };
4181 
4182 static const u8 rtw8822c_pwrtrk_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
4183 	 0,  1,  2,  3,  4,  4,  5,  6,  7,  8,
4184 	 9,  9, 10, 11, 12, 13, 14, 15, 15, 16,
4185 	17, 18, 19, 20, 20, 21, 22, 23, 24, 25
4186 };
4187 
4188 static const u8 rtw8822c_pwrtrk_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
4189 	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4190 	10, 11, 12, 13, 14, 14, 15, 16, 17, 18,
4191 	19, 20, 21, 22, 23, 24, 25, 26, 27, 28
4192 };
4193 
4194 static const u8 rtw8822c_pwrtrk_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
4195 	 0,  1,  2,  2,  3,  4,  4,  5,  6,  6,
4196 	 7,  8,  8,  9,  9, 10, 11, 11, 12, 13,
4197 	13, 14, 15, 15, 16, 17, 17, 18, 19, 19
4198 };
4199 
4200 static const u8 rtw8822c_pwrtrk_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
4201 	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4202 	10, 11, 11, 12, 13, 14, 15, 16, 17, 18,
4203 	19, 20, 21, 22, 23, 24, 25, 25, 26, 27
4204 };
4205 
4206 static const u8 rtw8822c_pwrtrk_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
4207 	 0,  1,  2,  3,  4,  5,  5,  6,  7,  8,
4208 	 9, 10, 11, 11, 12, 13, 14, 15, 16, 17,
4209 	17, 18, 19, 20, 21, 22, 23, 23, 24, 25
4210 };
4211 
4212 static const u8 rtw8822c_pwrtrk_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
4213 	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
4214 	10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
4215 	20, 21, 22, 23, 24, 25, 26, 27, 28, 29
4216 };
4217 
4218 static const u8 rtw8822c_pwrtrk_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
4219 	 0,  1,  2,  3,  3,  4,  5,  6,  6,  7,
4220 	 8,  9,  9, 10, 11, 12, 12, 13, 14, 15,
4221 	15, 16, 17, 18, 18, 19, 20, 21, 21, 22
4222 };
4223 
4224 static const u8 rtw8822c_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
4225 	 0,  1,  2,  3,  4,  5,  5,  6,  7,  8,
4226 	 9, 10, 11, 11, 12, 13, 14, 15, 16, 17,
4227 	18, 18, 19, 20, 21, 22, 23, 24, 24, 25
4228 };
4229 
4230 static const struct rtw_pwr_track_tbl rtw8822c_rtw_pwr_track_tbl = {
4231 	.pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
4232 	.pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
4233 	.pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
4234 	.pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_1],
4235 	.pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_2],
4236 	.pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5gb_p[RTW_PWR_TRK_5G_3],
4237 	.pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_1],
4238 	.pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_2],
4239 	.pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5ga_n[RTW_PWR_TRK_5G_3],
4240 	.pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_1],
4241 	.pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_2],
4242 	.pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5ga_p[RTW_PWR_TRK_5G_3],
4243 	.pwrtrk_2gb_n = rtw8822c_pwrtrk_2gb_n,
4244 	.pwrtrk_2gb_p = rtw8822c_pwrtrk_2gb_p,
4245 	.pwrtrk_2ga_n = rtw8822c_pwrtrk_2ga_n,
4246 	.pwrtrk_2ga_p = rtw8822c_pwrtrk_2ga_p,
4247 	.pwrtrk_2g_cckb_n = rtw8822c_pwrtrk_2g_cck_b_n,
4248 	.pwrtrk_2g_cckb_p = rtw8822c_pwrtrk_2g_cck_b_p,
4249 	.pwrtrk_2g_ccka_n = rtw8822c_pwrtrk_2g_cck_a_n,
4250 	.pwrtrk_2g_ccka_p = rtw8822c_pwrtrk_2g_cck_a_p,
4251 };
4252 
4253 #ifdef CONFIG_PM
4254 static const struct wiphy_wowlan_support rtw_wowlan_stub_8822c = {
4255 	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_GTK_REKEY_FAILURE |
4256 		 WIPHY_WOWLAN_DISCONNECT | WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
4257 		 WIPHY_WOWLAN_NET_DETECT,
4258 	.n_patterns = RTW_MAX_PATTERN_NUM,
4259 	.pattern_max_len = RTW_MAX_PATTERN_SIZE,
4260 	.pattern_min_len = 1,
4261 	.max_nd_match_sets = 4,
4262 };
4263 #endif
4264 
4265 static const struct rtw_reg_domain coex_info_hw_regs_8822c[] = {
4266 	{0x1860, BIT(3), RTW_REG_DOMAIN_MAC8},
4267 	{0x4160, BIT(3), RTW_REG_DOMAIN_MAC8},
4268 	{0x1c32, BIT(6), RTW_REG_DOMAIN_MAC8},
4269 	{0x1c38, BIT(28), RTW_REG_DOMAIN_MAC32},
4270 	{0, 0, RTW_REG_DOMAIN_NL},
4271 	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
4272 	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
4273 	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
4274 	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
4275 	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
4276 	{0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
4277 	{0, 0, RTW_REG_DOMAIN_NL},
4278 	{0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
4279 	{0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
4280 	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
4281 	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
4282 	{0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B},
4283 	{0, 0, RTW_REG_DOMAIN_NL},
4284 	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
4285 	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
4286 	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
4287 	{0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
4288 };
4289 
4290 struct rtw_chip_info rtw8822c_hw_spec = {
4291 	.ops = &rtw8822c_ops,
4292 	.id = RTW_CHIP_TYPE_8822C,
4293 	.fw_name = "rtw88/rtw8822c_fw.bin",
4294 	.wlan_cpu = RTW_WCPU_11AC,
4295 	.tx_pkt_desc_sz = 48,
4296 	.tx_buf_desc_sz = 16,
4297 	.rx_pkt_desc_sz = 24,
4298 	.rx_buf_desc_sz = 8,
4299 	.phy_efuse_size = 512,
4300 	.log_efuse_size = 768,
4301 	.ptct_efuse_size = 124,
4302 	.txff_size = 262144,
4303 	.rxff_size = 24576,
4304 	.txgi_factor = 2,
4305 	.is_pwr_by_rate_dec = false,
4306 	.max_power_index = 0x7f,
4307 	.csi_buf_pg_num = 50,
4308 	.band = RTW_BAND_2G | RTW_BAND_5G,
4309 	.page_size = 128,
4310 	.dig_min = 0x20,
4311 	.ht_supported = true,
4312 	.vht_supported = true,
4313 	.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK) | BIT(LPS_DEEP_MODE_PG),
4314 	.sys_func_en = 0xD8,
4315 	.pwr_on_seq = card_enable_flow_8822c,
4316 	.pwr_off_seq = card_disable_flow_8822c,
4317 	.page_table = page_table_8822c,
4318 	.rqpn_table = rqpn_table_8822c,
4319 	.prioq_addrs = &prioq_addrs_8822c,
4320 	.intf_table = &phy_para_table_8822c,
4321 	.dig = rtw8822c_dig,
4322 	.dig_cck = NULL,
4323 	.rf_base_addr = {0x3c00, 0x4c00},
4324 	.rf_sipi_addr = {0x1808, 0x4108},
4325 	.ltecoex_addr = &rtw8822c_ltecoex_addr,
4326 	.mac_tbl = &rtw8822c_mac_tbl,
4327 	.agc_tbl = &rtw8822c_agc_tbl,
4328 	.bb_tbl = &rtw8822c_bb_tbl,
4329 	.rfk_init_tbl = &rtw8822c_array_mp_cal_init_tbl,
4330 	.rf_tbl = {&rtw8822c_rf_b_tbl, &rtw8822c_rf_a_tbl},
4331 	.rfe_defs = rtw8822c_rfe_defs,
4332 	.rfe_defs_size = ARRAY_SIZE(rtw8822c_rfe_defs),
4333 	.en_dis_dpd = true,
4334 	.dpd_ratemask = DIS_DPD_RATEALL,
4335 	.pwr_track_tbl = &rtw8822c_rtw_pwr_track_tbl,
4336 	.iqk_threshold = 8,
4337 	.bfer_su_max_num = 2,
4338 	.bfer_mu_max_num = 1,
4339 	.rx_ldpc = true,
4340 
4341 #ifdef CONFIG_PM
4342 	.wow_fw_name = "rtw88/rtw8822c_wow_fw.bin",
4343 	.wowlan_stub = &rtw_wowlan_stub_8822c,
4344 	.max_sched_scan_ssids = 4,
4345 #endif
4346 	.coex_para_ver = 0x19062706,
4347 	.bt_desired_ver = 0x6,
4348 	.scbd_support = true,
4349 	.new_scbd10_def = true,
4350 	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
4351 	.bt_rssi_type = COEX_BTRSSI_DBM,
4352 	.ant_isolation = 15,
4353 	.rssi_tolerance = 2,
4354 	.wl_rssi_step = wl_rssi_step_8822c,
4355 	.bt_rssi_step = bt_rssi_step_8822c,
4356 	.table_sant_num = ARRAY_SIZE(table_sant_8822c),
4357 	.table_sant = table_sant_8822c,
4358 	.table_nsant_num = ARRAY_SIZE(table_nsant_8822c),
4359 	.table_nsant = table_nsant_8822c,
4360 	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8822c),
4361 	.tdma_sant = tdma_sant_8822c,
4362 	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8822c),
4363 	.tdma_nsant = tdma_nsant_8822c,
4364 	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8822c),
4365 	.wl_rf_para_tx = rf_para_tx_8822c,
4366 	.wl_rf_para_rx = rf_para_rx_8822c,
4367 	.bt_afh_span_bw20 = 0x24,
4368 	.bt_afh_span_bw40 = 0x36,
4369 	.afh_5g_num = ARRAY_SIZE(afh_5g_8822c),
4370 	.afh_5g = afh_5g_8822c,
4371 
4372 	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822c),
4373 	.coex_info_hw_regs = coex_info_hw_regs_8822c,
4374 };
4375 EXPORT_SYMBOL(rtw8822c_hw_spec);
4376 
4377 MODULE_FIRMWARE("rtw88/rtw8822c_fw.bin");
4378 MODULE_FIRMWARE("rtw88/rtw8822c_wow_fw.bin");
4379 
4380 MODULE_AUTHOR("Realtek Corporation");
4381 MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822c driver");
4382 MODULE_LICENSE("Dual BSD/GPL");
4383