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