Lines Matching refs:rtwdev

23 static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
32 static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) in rtw8822c_read_efuse() argument
34 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw8822c_read_efuse()
57 switch (rtw_hci_type(rtwdev)) { in rtw8822c_read_efuse()
69 static void rtw8822c_header_file_init(struct rtw_dev *rtwdev, bool pre) in rtw8822c_header_file_init() argument
71 rtw_write32_set(rtwdev, REG_3WIRE, BIT_3WIRE_TX_EN | BIT_3WIRE_RX_EN); in rtw8822c_header_file_init()
72 rtw_write32_set(rtwdev, REG_3WIRE, BIT_3WIRE_PI_ON); in rtw8822c_header_file_init()
73 rtw_write32_set(rtwdev, REG_3WIRE2, BIT_3WIRE_TX_EN | BIT_3WIRE_RX_EN); in rtw8822c_header_file_init()
74 rtw_write32_set(rtwdev, REG_3WIRE2, BIT_3WIRE_PI_ON); in rtw8822c_header_file_init()
77 rtw_write32_clr(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN); in rtw8822c_header_file_init()
79 rtw_write32_set(rtwdev, REG_ENCCK, BIT_CCK_OFDM_BLK_EN); in rtw8822c_header_file_init()
82 static void rtw8822c_bb_reset(struct rtw_dev *rtwdev) in rtw8822c_bb_reset() argument
84 rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB); in rtw8822c_bb_reset()
85 rtw_write16_clr(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB); in rtw8822c_bb_reset()
86 rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_BB_RSTB); in rtw8822c_bb_reset()
89 static void rtw8822c_dac_backup_reg(struct rtw_dev *rtwdev, in rtw8822c_dac_backup_reg() argument
105 backup[i].val = rtw_read32(rtwdev, addrs[i]); in rtw8822c_dac_backup_reg()
111 val = rtw_read_rf(rtwdev, path, reg, RFREG_MASK); in rtw8822c_dac_backup_reg()
118 static void rtw8822c_dac_restore_reg(struct rtw_dev *rtwdev, in rtw8822c_dac_restore_reg() argument
126 rtw_restore_reg(rtwdev, backup, DACK_REG_8822C); in rtw8822c_dac_restore_reg()
132 rtw_write_rf(rtwdev, path, reg, RFREG_MASK, val); in rtw8822c_dac_restore_reg()
137 static void rtw8822c_rf_minmax_cmp(struct rtw_dev *rtwdev, u32 value, in rtw8822c_rf_minmax_cmp() argument
166 static void __rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *v1, u32 *v2) in __rtw8822c_dac_iq_sort() argument
179 static void rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *iv, u32 *qv) in rtw8822c_dac_iq_sort() argument
185 __rtw8822c_dac_iq_sort(rtwdev, &iv[j], &iv[j + 1]); in rtw8822c_dac_iq_sort()
186 __rtw8822c_dac_iq_sort(rtwdev, &qv[j], &qv[j + 1]); in rtw8822c_dac_iq_sort()
191 static void rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, u32 *vec, u32 *val) in rtw8822c_dac_iq_offset() argument
255 static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, u32 value) in rtw8822c_dac_iq_check() argument
262 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] Error overflow\n"); in rtw8822c_dac_iq_check()
268 static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv) in rtw8822c_dac_cal_iq_sample() argument
275 temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff); in rtw8822c_dac_cal_iq_sample()
279 if (rtw8822c_dac_iq_check(rtwdev, iv[i]) && in rtw8822c_dac_cal_iq_sample()
280 rtw8822c_dac_iq_check(rtwdev, qv[i])) in rtw8822c_dac_cal_iq_sample()
285 static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev, in rtw8822c_dac_cal_iq_search() argument
300 rtw8822c_rf_minmax_cmp(rtwdev, iv[i], &i_min, &i_max); in rtw8822c_dac_cal_iq_search()
301 rtw8822c_rf_minmax_cmp(rtwdev, qv[i], &q_min, &q_max); in rtw8822c_dac_cal_iq_search()
318 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_dac_cal_iq_search()
321 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_dac_cal_iq_search()
325 rtw8822c_dac_iq_sort(rtwdev, iv, qv); in rtw8822c_dac_cal_iq_search()
328 temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff); in rtw8822c_dac_cal_iq_search()
331 temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff); in rtw8822c_dac_cal_iq_search()
339 rtw8822c_dac_iq_offset(rtwdev, iv, i_value); in rtw8822c_dac_cal_iq_search()
340 rtw8822c_dac_iq_offset(rtwdev, qv, q_value); in rtw8822c_dac_cal_iq_search()
343 static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev, in rtw8822c_dac_cal_rf_mode() argument
349 rf_a = rtw_read_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK); in rtw8822c_dac_cal_rf_mode()
350 rf_b = rtw_read_rf(rtwdev, RF_PATH_B, 0x0, RFREG_MASK); in rtw8822c_dac_cal_rf_mode()
352 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] RF path-A=0x%05x\n", rf_a); in rtw8822c_dac_cal_rf_mode()
353 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] RF path-B=0x%05x\n", rf_b); in rtw8822c_dac_cal_rf_mode()
355 rtw8822c_dac_cal_iq_sample(rtwdev, iv, qv); in rtw8822c_dac_cal_rf_mode()
356 rtw8822c_dac_cal_iq_search(rtwdev, iv, qv, i_value, q_value); in rtw8822c_dac_cal_rf_mode()
359 static void rtw8822c_dac_bb_setting(struct rtw_dev *rtwdev) in rtw8822c_dac_bb_setting() argument
361 rtw_write32_mask(rtwdev, 0x1d58, 0xff8, 0x1ff); in rtw8822c_dac_bb_setting()
362 rtw_write32_mask(rtwdev, 0x1a00, 0x3, 0x2); in rtw8822c_dac_bb_setting()
363 rtw_write32_mask(rtwdev, 0x1a14, 0x300, 0x3); in rtw8822c_dac_bb_setting()
364 rtw_write32(rtwdev, 0x1d70, 0x7e7e7e7e); in rtw8822c_dac_bb_setting()
365 rtw_write32_mask(rtwdev, 0x180c, 0x3, 0x0); in rtw8822c_dac_bb_setting()
366 rtw_write32_mask(rtwdev, 0x410c, 0x3, 0x0); in rtw8822c_dac_bb_setting()
367 rtw_write32(rtwdev, 0x1b00, 0x00000008); in rtw8822c_dac_bb_setting()
368 rtw_write8(rtwdev, 0x1bcc, 0x3f); in rtw8822c_dac_bb_setting()
369 rtw_write32(rtwdev, 0x1b00, 0x0000000a); in rtw8822c_dac_bb_setting()
370 rtw_write8(rtwdev, 0x1bcc, 0x3f); in rtw8822c_dac_bb_setting()
371 rtw_write32_mask(rtwdev, 0x1e24, BIT(31), 0x0); in rtw8822c_dac_bb_setting()
372 rtw_write32_mask(rtwdev, 0x1e28, 0xf, 0x3); in rtw8822c_dac_bb_setting()
375 static void rtw8822c_dac_cal_adc(struct rtw_dev *rtwdev, in rtw8822c_dac_cal_adc() argument
378 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_dac_cal_adc()
384 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK path(%d)\n", path); in rtw8822c_dac_cal_adc()
400 rtw_write32_mask(rtwdev, base_addr + 0x30, BIT(30), 0x0); in rtw8822c_dac_cal_adc()
402 rtw_write32(rtwdev, base_addr + 0x30, 0x30db8041); in rtw8822c_dac_cal_adc()
403 rtw_write32(rtwdev, base_addr + 0x60, 0xf0040ff0); in rtw8822c_dac_cal_adc()
404 rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220); in rtw8822c_dac_cal_adc()
405 rtw_write32(rtwdev, base_addr + 0x10, 0x02dd08c4); in rtw8822c_dac_cal_adc()
406 rtw_write32(rtwdev, base_addr + 0x0c, 0x10000260); in rtw8822c_dac_cal_adc()
407 rtw_write_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK, 0x10000); in rtw8822c_dac_cal_adc()
408 rtw_write_rf(rtwdev, RF_PATH_B, 0x0, RFREG_MASK, 0x10000); in rtw8822c_dac_cal_adc()
410 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK count=%d\n", i); in rtw8822c_dac_cal_adc()
411 rtw_write32(rtwdev, 0x1c3c, path_sel + 0x8003); in rtw8822c_dac_cal_adc()
412 rtw_write32(rtwdev, 0x1c24, 0x00010002); in rtw8822c_dac_cal_adc()
413 rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc); in rtw8822c_dac_cal_adc()
414 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_dac_cal_adc()
427 rtw_write32(rtwdev, base_addr + 0x68, temp); in rtw8822c_dac_cal_adc()
429 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] ADCK 0x%08x=0x08%x\n", in rtw8822c_dac_cal_adc()
432 rtw_write32(rtwdev, 0x1c3c, path_sel + 0x8103); in rtw8822c_dac_cal_adc()
433 rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc); in rtw8822c_dac_cal_adc()
434 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_dac_cal_adc()
445 rtw_write32(rtwdev, 0x1c3c, 0x00000003); in rtw8822c_dac_cal_adc()
446 rtw_write32(rtwdev, base_addr + 0x0c, 0x10000260); in rtw8822c_dac_cal_adc()
447 rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c4); in rtw8822c_dac_cal_adc()
450 rtw_write_rf(rtwdev, path, 0x8f, BIT(13), 0x1); in rtw8822c_dac_cal_adc()
453 static void rtw8822c_dac_cal_step1(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dac_cal_step1() argument
455 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_dac_cal_step1()
462 rtw_write32(rtwdev, base_addr + 0x68, dm_info->dack_adck[path]); in rtw8822c_dac_cal_step1()
463 rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220); in rtw8822c_dac_cal_step1()
465 rtw_write32(rtwdev, base_addr + 0x60, 0xf0040ff0); in rtw8822c_dac_cal_step1()
466 rtw_write32(rtwdev, 0x1c38, 0xffffffff); in rtw8822c_dac_cal_step1()
468 rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5); in rtw8822c_dac_cal_step1()
469 rtw_write32(rtwdev, 0x9b4, 0xdb66db00); in rtw8822c_dac_cal_step1()
470 rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb88); in rtw8822c_dac_cal_step1()
471 rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff81); in rtw8822c_dac_cal_step1()
472 rtw_write32(rtwdev, base_addr + 0xc0, 0x0003d208); in rtw8822c_dac_cal_step1()
473 rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb88); in rtw8822c_dac_cal_step1()
474 rtw_write32(rtwdev, base_addr + 0xd8, 0x0008ff81); in rtw8822c_dac_cal_step1()
475 rtw_write32(rtwdev, base_addr + 0xdc, 0x0003d208); in rtw8822c_dac_cal_step1()
476 rtw_write32(rtwdev, base_addr + 0xb8, 0x60000000); in rtw8822c_dac_cal_step1()
478 rtw_write32(rtwdev, base_addr + 0xbc, 0x000aff8d); in rtw8822c_dac_cal_step1()
480 rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb89); in rtw8822c_dac_cal_step1()
481 rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb89); in rtw8822c_dac_cal_step1()
483 rtw_write32(rtwdev, base_addr + 0xb8, 0x62000000); in rtw8822c_dac_cal_step1()
484 rtw_write32(rtwdev, base_addr + 0xd4, 0x62000000); in rtw8822c_dac_cal_step1()
486 if (!check_hw_ready(rtwdev, read_addr + 0x08, 0x7fff80, 0xffff) || in rtw8822c_dac_cal_step1()
487 !check_hw_ready(rtwdev, read_addr + 0x34, 0x7fff80, 0xffff)) in rtw8822c_dac_cal_step1()
488 rtw_err(rtwdev, "failed to wait for dack ready\n"); in rtw8822c_dac_cal_step1()
489 rtw_write32(rtwdev, base_addr + 0xb8, 0x02000000); in rtw8822c_dac_cal_step1()
491 rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff87); in rtw8822c_dac_cal_step1()
492 rtw_write32(rtwdev, 0x9b4, 0xdb6db600); in rtw8822c_dac_cal_step1()
493 rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5); in rtw8822c_dac_cal_step1()
494 rtw_write32(rtwdev, base_addr + 0xbc, 0x0008ff87); in rtw8822c_dac_cal_step1()
495 rtw_write32(rtwdev, base_addr + 0x60, 0xf0000000); in rtw8822c_dac_cal_step1()
498 static void rtw8822c_dac_cal_step2(struct rtw_dev *rtwdev, in rtw8822c_dac_cal_step2() argument
505 rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xf0000000, 0x0); in rtw8822c_dac_cal_step2()
506 rtw_write32_mask(rtwdev, base_addr + 0xc0, 0xf, 0x8); in rtw8822c_dac_cal_step2()
507 rtw_write32_mask(rtwdev, base_addr + 0xd8, 0xf0000000, 0x0); in rtw8822c_dac_cal_step2()
508 rtw_write32_mask(rtwdev, base_addr + 0xdc, 0xf, 0x8); in rtw8822c_dac_cal_step2()
510 rtw_write32(rtwdev, 0x1b00, 0x00000008); in rtw8822c_dac_cal_step2()
511 rtw_write8(rtwdev, 0x1bcc, 0x03f); in rtw8822c_dac_cal_step2()
512 rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220); in rtw8822c_dac_cal_step2()
513 rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5); in rtw8822c_dac_cal_step2()
514 rtw_write32(rtwdev, 0x1c3c, 0x00088103); in rtw8822c_dac_cal_step2()
516 rtw8822c_dac_cal_rf_mode(rtwdev, &ic_in, &qc_in); in rtw8822c_dac_cal_step2()
543 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] before i=0x%x, q=0x%x\n", ic_in, qc_in); in rtw8822c_dac_cal_step2()
544 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] after i=0x%x, q=0x%x\n", ic, qc); in rtw8822c_dac_cal_step2()
547 static void rtw8822c_dac_cal_step3(struct rtw_dev *rtwdev, u8 path, in rtw8822c_dac_cal_step3() argument
562 rtw_write32(rtwdev, base_addr + 0x0c, 0xdff00220); in rtw8822c_dac_cal_step3()
563 rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5); in rtw8822c_dac_cal_step3()
564 rtw_write32(rtwdev, 0x9b4, 0xdb66db00); in rtw8822c_dac_cal_step3()
565 rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb88); in rtw8822c_dac_cal_step3()
566 rtw_write32(rtwdev, base_addr + 0xbc, 0xc008ff81); in rtw8822c_dac_cal_step3()
567 rtw_write32(rtwdev, base_addr + 0xc0, 0x0003d208); in rtw8822c_dac_cal_step3()
568 rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xf0000000, ic & 0xf); in rtw8822c_dac_cal_step3()
569 rtw_write32_mask(rtwdev, base_addr + 0xc0, 0xf, (ic & 0xf0) >> 4); in rtw8822c_dac_cal_step3()
570 rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb88); in rtw8822c_dac_cal_step3()
571 rtw_write32(rtwdev, base_addr + 0xd8, 0xe008ff81); in rtw8822c_dac_cal_step3()
572 rtw_write32(rtwdev, base_addr + 0xdc, 0x0003d208); in rtw8822c_dac_cal_step3()
573 rtw_write32_mask(rtwdev, base_addr + 0xd8, 0xf0000000, qc & 0xf); in rtw8822c_dac_cal_step3()
574 rtw_write32_mask(rtwdev, base_addr + 0xdc, 0xf, (qc & 0xf0) >> 4); in rtw8822c_dac_cal_step3()
575 rtw_write32(rtwdev, base_addr + 0xb8, 0x60000000); in rtw8822c_dac_cal_step3()
577 rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xe, 0x6); in rtw8822c_dac_cal_step3()
579 rtw_write32(rtwdev, base_addr + 0xb0, 0x0a11fb89); in rtw8822c_dac_cal_step3()
580 rtw_write32(rtwdev, base_addr + 0xcc, 0x0a11fb89); in rtw8822c_dac_cal_step3()
582 rtw_write32(rtwdev, base_addr + 0xb8, 0x62000000); in rtw8822c_dac_cal_step3()
583 rtw_write32(rtwdev, base_addr + 0xd4, 0x62000000); in rtw8822c_dac_cal_step3()
585 if (!check_hw_ready(rtwdev, read_addr + 0x24, 0x07f80000, ic) || in rtw8822c_dac_cal_step3()
586 !check_hw_ready(rtwdev, read_addr + 0x50, 0x07f80000, qc)) in rtw8822c_dac_cal_step3()
587 rtw_err(rtwdev, "failed to write IQ vector to hardware\n"); in rtw8822c_dac_cal_step3()
588 rtw_write32(rtwdev, base_addr + 0xb8, 0x02000000); in rtw8822c_dac_cal_step3()
590 rtw_write32_mask(rtwdev, base_addr + 0xbc, 0xe, 0x3); in rtw8822c_dac_cal_step3()
591 rtw_write32(rtwdev, 0x9b4, 0xdb6db600); in rtw8822c_dac_cal_step3()
595 rtw_write32(rtwdev, base_addr + 0x68, temp); in rtw8822c_dac_cal_step3()
596 rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c5); in rtw8822c_dac_cal_step3()
597 rtw_write32(rtwdev, base_addr + 0x60, 0xf0000000); in rtw8822c_dac_cal_step3()
598 rtw8822c_dac_cal_rf_mode(rtwdev, &ic, &qc); in rtw8822c_dac_cal_step3()
620 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_dac_cal_step3()
624 static void rtw8822c_dac_cal_step4(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dac_cal_step4() argument
628 rtw_write32(rtwdev, base_addr + 0x68, 0x0); in rtw8822c_dac_cal_step4()
629 rtw_write32(rtwdev, base_addr + 0x10, 0x02d508c4); in rtw8822c_dac_cal_step4()
630 rtw_write32_mask(rtwdev, base_addr + 0xbc, 0x1, 0x0); in rtw8822c_dac_cal_step4()
631 rtw_write32_mask(rtwdev, base_addr + 0x30, BIT(30), 0x1); in rtw8822c_dac_cal_step4()
634 static void rtw8822c_dac_cal_backup_vec(struct rtw_dev *rtwdev, in rtw8822c_dac_cal_backup_vec() argument
637 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_dac_cal_backup_vec()
645 rtw_write32_mask(rtwdev, w_addr, 0xf0000000, i); in rtw8822c_dac_cal_backup_vec()
646 val = (u16)rtw_read32_mask(rtwdev, r_addr, 0x7fc0000); in rtw8822c_dac_cal_backup_vec()
651 static void rtw8822c_dac_cal_backup_path(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dac_cal_backup_path() argument
663 rtw8822c_dac_cal_backup_vec(rtwdev, path, 0, w_addr, r_addr); in rtw8822c_dac_cal_backup_path()
668 rtw8822c_dac_cal_backup_vec(rtwdev, path, 1, w_addr, r_addr); in rtw8822c_dac_cal_backup_path()
671 static void rtw8822c_dac_cal_backup_dck(struct rtw_dev *rtwdev) in rtw8822c_dac_cal_backup_dck() argument
673 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_dac_cal_backup_dck()
676 val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_I_0, 0xf0000000); in rtw8822c_dac_cal_backup_dck()
678 val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_I_1, 0xf); in rtw8822c_dac_cal_backup_dck()
680 val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_Q_0, 0xf0000000); in rtw8822c_dac_cal_backup_dck()
682 val = (u8)rtw_read32_mask(rtwdev, REG_DCKA_Q_1, 0xf); in rtw8822c_dac_cal_backup_dck()
685 val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_I_0, 0xf0000000); in rtw8822c_dac_cal_backup_dck()
687 val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_I_1, 0xf); in rtw8822c_dac_cal_backup_dck()
689 val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_Q_0, 0xf0000000); in rtw8822c_dac_cal_backup_dck()
691 val = (u8)rtw_read32_mask(rtwdev, REG_DCKB_Q_1, 0xf); in rtw8822c_dac_cal_backup_dck()
695 static void rtw8822c_dac_cal_backup(struct rtw_dev *rtwdev) in rtw8822c_dac_cal_backup() argument
699 temp[0] = rtw_read32(rtwdev, 0x1860); in rtw8822c_dac_cal_backup()
700 temp[1] = rtw_read32(rtwdev, 0x4160); in rtw8822c_dac_cal_backup()
701 temp[2] = rtw_read32(rtwdev, 0x9b4); in rtw8822c_dac_cal_backup()
704 rtw_write32(rtwdev, 0x9b4, 0xdb66db00); in rtw8822c_dac_cal_backup()
707 rtw_write32_clr(rtwdev, 0x1830, BIT(30)); in rtw8822c_dac_cal_backup()
708 rtw_write32_mask(rtwdev, 0x1860, 0xfc000000, 0x3c); in rtw8822c_dac_cal_backup()
709 rtw8822c_dac_cal_backup_path(rtwdev, RF_PATH_A); in rtw8822c_dac_cal_backup()
712 rtw_write32_clr(rtwdev, 0x4130, BIT(30)); in rtw8822c_dac_cal_backup()
713 rtw_write32_mask(rtwdev, 0x4160, 0xfc000000, 0x3c); in rtw8822c_dac_cal_backup()
714 rtw8822c_dac_cal_backup_path(rtwdev, RF_PATH_B); in rtw8822c_dac_cal_backup()
716 rtw8822c_dac_cal_backup_dck(rtwdev); in rtw8822c_dac_cal_backup()
717 rtw_write32_set(rtwdev, 0x1830, BIT(30)); in rtw8822c_dac_cal_backup()
718 rtw_write32_set(rtwdev, 0x4130, BIT(30)); in rtw8822c_dac_cal_backup()
720 rtw_write32(rtwdev, 0x1860, temp[0]); in rtw8822c_dac_cal_backup()
721 rtw_write32(rtwdev, 0x4160, temp[1]); in rtw8822c_dac_cal_backup()
722 rtw_write32(rtwdev, 0x9b4, temp[2]); in rtw8822c_dac_cal_backup()
725 static void rtw8822c_dac_cal_restore_dck(struct rtw_dev *rtwdev) in rtw8822c_dac_cal_restore_dck() argument
727 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_dac_cal_restore_dck()
730 rtw_write32_set(rtwdev, REG_DCKA_I_0, BIT(19)); in rtw8822c_dac_cal_restore_dck()
732 rtw_write32_mask(rtwdev, REG_DCKA_I_0, 0xf0000000, val); in rtw8822c_dac_cal_restore_dck()
734 rtw_write32_mask(rtwdev, REG_DCKA_I_1, 0xf, val); in rtw8822c_dac_cal_restore_dck()
736 rtw_write32_set(rtwdev, REG_DCKA_Q_0, BIT(19)); in rtw8822c_dac_cal_restore_dck()
738 rtw_write32_mask(rtwdev, REG_DCKA_Q_0, 0xf0000000, val); in rtw8822c_dac_cal_restore_dck()
740 rtw_write32_mask(rtwdev, REG_DCKA_Q_1, 0xf, val); in rtw8822c_dac_cal_restore_dck()
742 rtw_write32_set(rtwdev, REG_DCKB_I_0, BIT(19)); in rtw8822c_dac_cal_restore_dck()
744 rtw_write32_mask(rtwdev, REG_DCKB_I_0, 0xf0000000, val); in rtw8822c_dac_cal_restore_dck()
746 rtw_write32_mask(rtwdev, REG_DCKB_I_1, 0xf, val); in rtw8822c_dac_cal_restore_dck()
748 rtw_write32_set(rtwdev, REG_DCKB_Q_0, BIT(19)); in rtw8822c_dac_cal_restore_dck()
750 rtw_write32_mask(rtwdev, REG_DCKB_Q_0, 0xf0000000, val); in rtw8822c_dac_cal_restore_dck()
752 rtw_write32_mask(rtwdev, REG_DCKB_Q_1, 0xf, val); in rtw8822c_dac_cal_restore_dck()
755 static void rtw8822c_dac_cal_restore_prepare(struct rtw_dev *rtwdev) in rtw8822c_dac_cal_restore_prepare() argument
757 rtw_write32(rtwdev, 0x9b4, 0xdb66db00); in rtw8822c_dac_cal_restore_prepare()
759 rtw_write32_mask(rtwdev, 0x18b0, BIT(27), 0x0); in rtw8822c_dac_cal_restore_prepare()
760 rtw_write32_mask(rtwdev, 0x18cc, BIT(27), 0x0); in rtw8822c_dac_cal_restore_prepare()
761 rtw_write32_mask(rtwdev, 0x41b0, BIT(27), 0x0); in rtw8822c_dac_cal_restore_prepare()
762 rtw_write32_mask(rtwdev, 0x41cc, BIT(27), 0x0); in rtw8822c_dac_cal_restore_prepare()
764 rtw_write32_mask(rtwdev, 0x1830, BIT(30), 0x0); in rtw8822c_dac_cal_restore_prepare()
765 rtw_write32_mask(rtwdev, 0x1860, 0xfc000000, 0x3c); in rtw8822c_dac_cal_restore_prepare()
766 rtw_write32_mask(rtwdev, 0x18b4, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
767 rtw_write32_mask(rtwdev, 0x18d0, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
769 rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x0); in rtw8822c_dac_cal_restore_prepare()
770 rtw_write32_mask(rtwdev, 0x4160, 0xfc000000, 0x3c); in rtw8822c_dac_cal_restore_prepare()
771 rtw_write32_mask(rtwdev, 0x41b4, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
772 rtw_write32_mask(rtwdev, 0x41d0, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
774 rtw_write32_mask(rtwdev, 0x18b0, 0xf00, 0x0); in rtw8822c_dac_cal_restore_prepare()
775 rtw_write32_mask(rtwdev, 0x18c0, BIT(14), 0x0); in rtw8822c_dac_cal_restore_prepare()
776 rtw_write32_mask(rtwdev, 0x18cc, 0xf00, 0x0); in rtw8822c_dac_cal_restore_prepare()
777 rtw_write32_mask(rtwdev, 0x18dc, BIT(14), 0x0); in rtw8822c_dac_cal_restore_prepare()
779 rtw_write32_mask(rtwdev, 0x18b0, BIT(0), 0x0); in rtw8822c_dac_cal_restore_prepare()
780 rtw_write32_mask(rtwdev, 0x18cc, BIT(0), 0x0); in rtw8822c_dac_cal_restore_prepare()
781 rtw_write32_mask(rtwdev, 0x18b0, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
782 rtw_write32_mask(rtwdev, 0x18cc, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
784 rtw8822c_dac_cal_restore_dck(rtwdev); in rtw8822c_dac_cal_restore_prepare()
786 rtw_write32_mask(rtwdev, 0x18c0, 0x38000, 0x7); in rtw8822c_dac_cal_restore_prepare()
787 rtw_write32_mask(rtwdev, 0x18dc, 0x38000, 0x7); in rtw8822c_dac_cal_restore_prepare()
788 rtw_write32_mask(rtwdev, 0x41c0, 0x38000, 0x7); in rtw8822c_dac_cal_restore_prepare()
789 rtw_write32_mask(rtwdev, 0x41dc, 0x38000, 0x7); in rtw8822c_dac_cal_restore_prepare()
791 rtw_write32_mask(rtwdev, 0x18b8, BIT(26) | BIT(25), 0x1); in rtw8822c_dac_cal_restore_prepare()
792 rtw_write32_mask(rtwdev, 0x18d4, BIT(26) | BIT(25), 0x1); in rtw8822c_dac_cal_restore_prepare()
794 rtw_write32_mask(rtwdev, 0x41b0, 0xf00, 0x0); in rtw8822c_dac_cal_restore_prepare()
795 rtw_write32_mask(rtwdev, 0x41c0, BIT(14), 0x0); in rtw8822c_dac_cal_restore_prepare()
796 rtw_write32_mask(rtwdev, 0x41cc, 0xf00, 0x0); in rtw8822c_dac_cal_restore_prepare()
797 rtw_write32_mask(rtwdev, 0x41dc, BIT(14), 0x0); in rtw8822c_dac_cal_restore_prepare()
799 rtw_write32_mask(rtwdev, 0x41b0, BIT(0), 0x0); in rtw8822c_dac_cal_restore_prepare()
800 rtw_write32_mask(rtwdev, 0x41cc, BIT(0), 0x0); in rtw8822c_dac_cal_restore_prepare()
801 rtw_write32_mask(rtwdev, 0x41b0, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
802 rtw_write32_mask(rtwdev, 0x41cc, BIT(0), 0x1); in rtw8822c_dac_cal_restore_prepare()
804 rtw_write32_mask(rtwdev, 0x41b8, BIT(26) | BIT(25), 0x1); in rtw8822c_dac_cal_restore_prepare()
805 rtw_write32_mask(rtwdev, 0x41d4, BIT(26) | BIT(25), 0x1); in rtw8822c_dac_cal_restore_prepare()
808 static bool rtw8822c_dac_cal_restore_wait(struct rtw_dev *rtwdev, in rtw8822c_dac_cal_restore_wait() argument
814 rtw_write32_mask(rtwdev, toggle_addr, BIT(26) | BIT(25), 0x0); in rtw8822c_dac_cal_restore_wait()
815 rtw_write32_mask(rtwdev, toggle_addr, BIT(26) | BIT(25), 0x2); in rtw8822c_dac_cal_restore_wait()
817 if (rtw_read32_mask(rtwdev, target_addr, 0xf) == 0x6) in rtw8822c_dac_cal_restore_wait()
825 static bool rtw8822c_dac_cal_restore_path(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dac_cal_restore_path() argument
827 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_dac_cal_restore_path()
839 if (!rtw8822c_dac_cal_restore_wait(rtwdev, r_i, w_i + 0x8)) in rtw8822c_dac_cal_restore_path()
843 rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x0); in rtw8822c_dac_cal_restore_path()
845 rtw_write32_mask(rtwdev, w_i + 0x4, 0xff8, value); in rtw8822c_dac_cal_restore_path()
846 rtw_write32_mask(rtwdev, w_i, 0xf0000000, i); in rtw8822c_dac_cal_restore_path()
847 rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x1); in rtw8822c_dac_cal_restore_path()
850 rtw_write32_mask(rtwdev, w_i + 0x4, BIT(2), 0x0); in rtw8822c_dac_cal_restore_path()
852 if (!rtw8822c_dac_cal_restore_wait(rtwdev, r_q, w_q + 0x8)) in rtw8822c_dac_cal_restore_path()
856 rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x0); in rtw8822c_dac_cal_restore_path()
858 rtw_write32_mask(rtwdev, w_q + 0x4, 0xff8, value); in rtw8822c_dac_cal_restore_path()
859 rtw_write32_mask(rtwdev, w_q, 0xf0000000, i); in rtw8822c_dac_cal_restore_path()
860 rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x1); in rtw8822c_dac_cal_restore_path()
862 rtw_write32_mask(rtwdev, w_q + 0x4, BIT(2), 0x0); in rtw8822c_dac_cal_restore_path()
864 rtw_write32_mask(rtwdev, w_i + 0x8, BIT(26) | BIT(25), 0x0); in rtw8822c_dac_cal_restore_path()
865 rtw_write32_mask(rtwdev, w_q + 0x8, BIT(26) | BIT(25), 0x0); in rtw8822c_dac_cal_restore_path()
866 rtw_write32_mask(rtwdev, w_i + 0x4, BIT(0), 0x0); in rtw8822c_dac_cal_restore_path()
867 rtw_write32_mask(rtwdev, w_q + 0x4, BIT(0), 0x0); in rtw8822c_dac_cal_restore_path()
872 static bool __rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev) in __rtw8822c_dac_cal_restore() argument
874 if (!rtw8822c_dac_cal_restore_path(rtwdev, RF_PATH_A)) in __rtw8822c_dac_cal_restore()
877 if (!rtw8822c_dac_cal_restore_path(rtwdev, RF_PATH_B)) in __rtw8822c_dac_cal_restore()
883 static bool rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev) in rtw8822c_dac_cal_restore() argument
885 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_dac_cal_restore()
895 temp[0] = rtw_read32(rtwdev, 0x1860); in rtw8822c_dac_cal_restore()
896 temp[1] = rtw_read32(rtwdev, 0x4160); in rtw8822c_dac_cal_restore()
897 temp[2] = rtw_read32(rtwdev, 0x9b4); in rtw8822c_dac_cal_restore()
899 rtw8822c_dac_cal_restore_prepare(rtwdev); in rtw8822c_dac_cal_restore()
900 if (!check_hw_ready(rtwdev, 0x2808, 0x7fff80, 0xffff) || in rtw8822c_dac_cal_restore()
901 !check_hw_ready(rtwdev, 0x2834, 0x7fff80, 0xffff) || in rtw8822c_dac_cal_restore()
902 !check_hw_ready(rtwdev, 0x4508, 0x7fff80, 0xffff) || in rtw8822c_dac_cal_restore()
903 !check_hw_ready(rtwdev, 0x4534, 0x7fff80, 0xffff)) in rtw8822c_dac_cal_restore()
906 if (!__rtw8822c_dac_cal_restore(rtwdev)) { in rtw8822c_dac_cal_restore()
907 rtw_err(rtwdev, "failed to restore dack vectors\n"); in rtw8822c_dac_cal_restore()
911 rtw_write32_mask(rtwdev, 0x1830, BIT(30), 0x1); in rtw8822c_dac_cal_restore()
912 rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x1); in rtw8822c_dac_cal_restore()
913 rtw_write32(rtwdev, 0x1860, temp[0]); in rtw8822c_dac_cal_restore()
914 rtw_write32(rtwdev, 0x4160, temp[1]); in rtw8822c_dac_cal_restore()
915 rtw_write32_mask(rtwdev, 0x18b0, BIT(27), 0x1); in rtw8822c_dac_cal_restore()
916 rtw_write32_mask(rtwdev, 0x18cc, BIT(27), 0x1); in rtw8822c_dac_cal_restore()
917 rtw_write32_mask(rtwdev, 0x41b0, BIT(27), 0x1); in rtw8822c_dac_cal_restore()
918 rtw_write32_mask(rtwdev, 0x41cc, BIT(27), 0x1); in rtw8822c_dac_cal_restore()
919 rtw_write32(rtwdev, 0x9b4, temp[2]); in rtw8822c_dac_cal_restore()
924 static void rtw8822c_rf_dac_cal(struct rtw_dev *rtwdev) in rtw8822c_rf_dac_cal() argument
933 if (rtw8822c_dac_cal_restore(rtwdev)) in rtw8822c_rf_dac_cal()
938 rtw8822c_dac_backup_reg(rtwdev, backup, backup_rf); in rtw8822c_rf_dac_cal()
940 rtw8822c_dac_bb_setting(rtwdev); in rtw8822c_rf_dac_cal()
943 rtw8822c_dac_cal_adc(rtwdev, RF_PATH_A, &adc_ic_a, &adc_qc_a); in rtw8822c_rf_dac_cal()
945 rtw8822c_dac_cal_step1(rtwdev, RF_PATH_A); in rtw8822c_rf_dac_cal()
946 rtw8822c_dac_cal_step2(rtwdev, RF_PATH_A, &ic, &qc); in rtw8822c_rf_dac_cal()
950 rtw8822c_dac_cal_step3(rtwdev, RF_PATH_A, adc_ic_a, adc_qc_a, in rtw8822c_rf_dac_cal()
956 rtw8822c_dac_cal_step4(rtwdev, RF_PATH_A); in rtw8822c_rf_dac_cal()
959 rtw8822c_dac_cal_adc(rtwdev, RF_PATH_B, &adc_ic_b, &adc_qc_b); in rtw8822c_rf_dac_cal()
961 rtw8822c_dac_cal_step1(rtwdev, RF_PATH_B); in rtw8822c_rf_dac_cal()
962 rtw8822c_dac_cal_step2(rtwdev, RF_PATH_B, &ic, &qc); in rtw8822c_rf_dac_cal()
966 rtw8822c_dac_cal_step3(rtwdev, RF_PATH_B, adc_ic_b, adc_qc_b, in rtw8822c_rf_dac_cal()
972 rtw8822c_dac_cal_step4(rtwdev, RF_PATH_B); in rtw8822c_rf_dac_cal()
974 rtw_write32(rtwdev, 0x1b00, 0x00000008); in rtw8822c_rf_dac_cal()
975 rtw_write32_mask(rtwdev, 0x4130, BIT(30), 0x1); in rtw8822c_rf_dac_cal()
976 rtw_write8(rtwdev, 0x1bcc, 0x0); in rtw8822c_rf_dac_cal()
977 rtw_write32(rtwdev, 0x1b00, 0x0000000a); in rtw8822c_rf_dac_cal()
978 rtw_write8(rtwdev, 0x1bcc, 0x0); in rtw8822c_rf_dac_cal()
980 rtw8822c_dac_restore_reg(rtwdev, backup, backup_rf); in rtw8822c_rf_dac_cal()
983 rtw8822c_dac_cal_backup(rtwdev); in rtw8822c_rf_dac_cal()
985 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path A: ic=0x%x, qc=0x%x\n", ic_a, qc_a); in rtw8822c_rf_dac_cal()
986 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path B: ic=0x%x, qc=0x%x\n", ic_b, qc_b); in rtw8822c_rf_dac_cal()
987 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path A: i=0x%x, q=0x%x\n", i_a, q_a); in rtw8822c_rf_dac_cal()
988 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] path B: i=0x%x, q=0x%x\n", i_b, q_b); in rtw8822c_rf_dac_cal()
991 static void rtw8822c_rf_x2_check(struct rtw_dev *rtwdev) in rtw8822c_rf_x2_check() argument
996 x2k_busy = rtw_read_rf(rtwdev, RF_PATH_A, 0xb8, BIT(15)); in rtw8822c_rf_x2_check()
998 rtw_write_rf(rtwdev, RF_PATH_A, 0xb8, RFREG_MASK, 0xC4440); in rtw8822c_rf_x2_check()
999 rtw_write_rf(rtwdev, RF_PATH_A, 0xba, RFREG_MASK, 0x6840D); in rtw8822c_rf_x2_check()
1000 rtw_write_rf(rtwdev, RF_PATH_A, 0xb8, RFREG_MASK, 0x80440); in rtw8822c_rf_x2_check()
1005 static void rtw8822c_set_power_trim(struct rtw_dev *rtwdev, s8 bb_gain[2][8]) in rtw8822c_set_power_trim() argument
1009 rtw_write_rf(rtwdev, _path, 0x33, RFREG_MASK, _seq); \ in rtw8822c_set_power_trim()
1010 rtw_write_rf(rtwdev, _path, 0x3f, RFREG_MASK, \ in rtw8822c_set_power_trim()
1015 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_set_power_trim()
1016 rtw_write_rf(rtwdev, path, 0xee, BIT(19), 1); in rtw8822c_set_power_trim()
1032 rtw_write_rf(rtwdev, path, 0xee, BIT(19), 0); in rtw8822c_set_power_trim()
1037 static void rtw8822c_power_trim(struct rtw_dev *rtwdev) in rtw8822c_power_trim() argument
1049 rtw_read8_physical_efuse(rtwdev, rf_efuse_2g[i], &pg_pwr); in rtw8822c_power_trim()
1058 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_power_trim()
1059 rtw_read8_physical_efuse(rtwdev, rf_efuse_5g[path][i], in rtw8822c_power_trim()
1069 rtw8822c_set_power_trim(rtwdev, bb_gain); in rtw8822c_power_trim()
1071 rtw_write32_mask(rtwdev, REG_DIS_DPD, DIS_DPD_MASK, DIS_DPD_RATEALL); in rtw8822c_power_trim()
1074 static void rtw8822c_thermal_trim(struct rtw_dev *rtwdev) in rtw8822c_thermal_trim() argument
1079 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_thermal_trim()
1080 rtw_read8_physical_efuse(rtwdev, rf_efuse[path], &pg_therm); in rtw8822c_thermal_trim()
1088 rtw_write_rf(rtwdev, path, 0x43, RF_THEMAL_MASK, thermal[path]); in rtw8822c_thermal_trim()
1092 static void rtw8822c_pa_bias(struct rtw_dev *rtwdev) in rtw8822c_pa_bias() argument
1098 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_pa_bias()
1099 rtw_read8_physical_efuse(rtwdev, rf_efuse_2g[path], in rtw8822c_pa_bias()
1104 rtw_write_rf(rtwdev, path, RF_PA, RF_PABIAS_2G_MASK, pg_pa_bias); in rtw8822c_pa_bias()
1106 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_pa_bias()
1107 rtw_read8_physical_efuse(rtwdev, rf_efuse_5g[path], in rtw8822c_pa_bias()
1110 rtw_write_rf(rtwdev, path, RF_PA, RF_PABIAS_5G_MASK, pg_pa_bias); in rtw8822c_pa_bias()
1114 static void rtw8822c_rfk_handshake(struct rtw_dev *rtwdev, bool is_before_k) in rtw8822c_rfk_handshake() argument
1116 struct rtw_dm_info *dm = &rtwdev->dm_info; in rtw8822c_rfk_handshake()
1122 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_rfk_handshake()
1128 rtwdev, REG_PMC_DBG_CTRL1, in rtw8822c_rfk_handshake()
1131 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_rfk_handshake()
1137 rtw_fw_inform_rfk_status(rtwdev, true); in rtw8822c_rfk_handshake()
1141 rtwdev, REG_ARFR4, BIT_WL_RFK); in rtw8822c_rfk_handshake()
1143 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_rfk_handshake()
1146 rtw_fw_inform_rfk_status(rtwdev, false); in rtw8822c_rfk_handshake()
1149 rtwdev, REG_ARFR4, in rtw8822c_rfk_handshake()
1152 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_rfk_handshake()
1155 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_rfk_handshake()
1160 static void rtw8822c_rfk_power_save(struct rtw_dev *rtwdev, in rtw8822c_rfk_power_save() argument
1165 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_rfk_power_save()
1166 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path); in rtw8822c_rfk_power_save()
1167 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_PS_EN, in rtw8822c_rfk_power_save()
1172 static void rtw8822c_txgapk_backup_bb_reg(struct rtw_dev *rtwdev, const u32 reg[], in rtw8822c_txgapk_backup_bb_reg() argument
1178 reg_backup[i] = rtw_read32(rtwdev, reg[i]); in rtw8822c_txgapk_backup_bb_reg()
1180 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] Backup BB 0x%x = 0x%x\n", in rtw8822c_txgapk_backup_bb_reg()
1185 static void rtw8822c_txgapk_reload_bb_reg(struct rtw_dev *rtwdev, in rtw8822c_txgapk_reload_bb_reg() argument
1192 rtw_write32(rtwdev, reg[i], reg_backup[i]); in rtw8822c_txgapk_reload_bb_reg()
1193 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] Reload BB 0x%x = 0x%x\n", in rtw8822c_txgapk_reload_bb_reg()
1198 static bool check_rf_status(struct rtw_dev *rtwdev, u8 status) in check_rf_status() argument
1202 reg_rf0_a = (u8)rtw_read_rf(rtwdev, RF_PATH_A, in check_rf_status()
1204 reg_rf0_b = (u8)rtw_read_rf(rtwdev, RF_PATH_B, in check_rf_status()
1213 static void rtw8822c_txgapk_tx_pause(struct rtw_dev *rtwdev) in rtw8822c_txgapk_tx_pause() argument
1218 rtw_write8(rtwdev, REG_TXPAUSE, BIT_AC_QUEUE); in rtw8822c_txgapk_tx_pause()
1219 rtw_write32_mask(rtwdev, REG_TX_FIFO, BIT_STOP_TX, 0x2); in rtw8822c_txgapk_tx_pause()
1222 2, 5000, false, rtwdev, 2); in rtw8822c_txgapk_tx_pause()
1224 rtw_warn(rtwdev, "failed to pause TX\n"); in rtw8822c_txgapk_tx_pause()
1226 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] Tx pause!!\n"); in rtw8822c_txgapk_tx_pause()
1229 static void rtw8822c_txgapk_bb_dpk(struct rtw_dev *rtwdev, u8 path) in rtw8822c_txgapk_bb_dpk() argument
1231 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_bb_dpk()
1233 rtw_write32_mask(rtwdev, REG_ENFN, BIT_IQK_DPK_EN, 0x1); in rtw8822c_txgapk_bb_dpk()
1234 rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2, in rtw8822c_txgapk_bb_dpk()
1236 rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2, in rtw8822c_txgapk_bb_dpk()
1238 rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2, BIT_EN_IOQ_IQK_DPK, 0x1); in rtw8822c_txgapk_bb_dpk()
1239 rtw_write32_mask(rtwdev, REG_CH_DELAY_EXTR2, BIT_TST_IQK2SET_SRC, 0x0); in rtw8822c_txgapk_bb_dpk()
1240 rtw_write32_mask(rtwdev, REG_CCA_OFF, BIT_CCA_ON_BY_PW, 0x1ff); in rtw8822c_txgapk_bb_dpk()
1243 rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_A, in rtw8822c_txgapk_bb_dpk()
1245 rtw_write32_mask(rtwdev, REG_3WIRE, BIT_DIS_SHARERX_TXGAT, 0x1); in rtw8822c_txgapk_bb_dpk()
1246 rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_A, in rtw8822c_txgapk_bb_dpk()
1248 rtw_write32_mask(rtwdev, REG_3WIRE, BIT_3WIRE_EN, 0x0); in rtw8822c_txgapk_bb_dpk()
1250 rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_B, in rtw8822c_txgapk_bb_dpk()
1252 rtw_write32_mask(rtwdev, REG_3WIRE2, in rtw8822c_txgapk_bb_dpk()
1254 rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_B, in rtw8822c_txgapk_bb_dpk()
1256 rtw_write32_mask(rtwdev, REG_3WIRE2, BIT_3WIRE_EN, 0x0); in rtw8822c_txgapk_bb_dpk()
1258 rtw_write32_mask(rtwdev, REG_CCKSB, BIT_BBMODE, 0x2); in rtw8822c_txgapk_bb_dpk()
1261 static void rtw8822c_txgapk_afe_dpk(struct rtw_dev *rtwdev, u8 path) in rtw8822c_txgapk_afe_dpk() argument
1265 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_afe_dpk()
1272 rtw_err(rtwdev, "[TXGAPK] unknown path %d!!\n", path); in rtw8822c_txgapk_afe_dpk()
1276 rtw_write32_mask(rtwdev, REG_IQK_CTRL, MASKDWORD, MASKDWORD); in rtw8822c_txgapk_afe_dpk()
1277 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x700f0001); in rtw8822c_txgapk_afe_dpk()
1278 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x700f0001); in rtw8822c_txgapk_afe_dpk()
1279 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x701f0001); in rtw8822c_txgapk_afe_dpk()
1280 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x702f0001); in rtw8822c_txgapk_afe_dpk()
1281 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x703f0001); in rtw8822c_txgapk_afe_dpk()
1282 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x704f0001); in rtw8822c_txgapk_afe_dpk()
1283 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x705f0001); in rtw8822c_txgapk_afe_dpk()
1284 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x706f0001); in rtw8822c_txgapk_afe_dpk()
1285 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x707f0001); in rtw8822c_txgapk_afe_dpk()
1286 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x708f0001); in rtw8822c_txgapk_afe_dpk()
1287 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x709f0001); in rtw8822c_txgapk_afe_dpk()
1288 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70af0001); in rtw8822c_txgapk_afe_dpk()
1289 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70bf0001); in rtw8822c_txgapk_afe_dpk()
1290 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70cf0001); in rtw8822c_txgapk_afe_dpk()
1291 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70df0001); in rtw8822c_txgapk_afe_dpk()
1292 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ef0001); in rtw8822c_txgapk_afe_dpk()
1293 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ff0001); in rtw8822c_txgapk_afe_dpk()
1294 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ff0001); in rtw8822c_txgapk_afe_dpk()
1297 static void rtw8822c_txgapk_afe_dpk_restore(struct rtw_dev *rtwdev, u8 path) in rtw8822c_txgapk_afe_dpk_restore() argument
1301 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_afe_dpk_restore()
1308 rtw_err(rtwdev, "[TXGAPK] unknown path %d!!\n", path); in rtw8822c_txgapk_afe_dpk_restore()
1311 rtw_write32_mask(rtwdev, REG_IQK_CTRL, MASKDWORD, 0xffa1005e); in rtw8822c_txgapk_afe_dpk_restore()
1312 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x700b8041); in rtw8822c_txgapk_afe_dpk_restore()
1313 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70144041); in rtw8822c_txgapk_afe_dpk_restore()
1314 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70244041); in rtw8822c_txgapk_afe_dpk_restore()
1315 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70344041); in rtw8822c_txgapk_afe_dpk_restore()
1316 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70444041); in rtw8822c_txgapk_afe_dpk_restore()
1317 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x705b8041); in rtw8822c_txgapk_afe_dpk_restore()
1318 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70644041); in rtw8822c_txgapk_afe_dpk_restore()
1319 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x707b8041); in rtw8822c_txgapk_afe_dpk_restore()
1320 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x708b8041); in rtw8822c_txgapk_afe_dpk_restore()
1321 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x709b8041); in rtw8822c_txgapk_afe_dpk_restore()
1322 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70ab8041); in rtw8822c_txgapk_afe_dpk_restore()
1323 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70bb8041); in rtw8822c_txgapk_afe_dpk_restore()
1324 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70cb8041); in rtw8822c_txgapk_afe_dpk_restore()
1325 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70db8041); in rtw8822c_txgapk_afe_dpk_restore()
1326 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70eb8041); in rtw8822c_txgapk_afe_dpk_restore()
1327 rtw_write32_mask(rtwdev, reg, MASKDWORD, 0x70fb8041); in rtw8822c_txgapk_afe_dpk_restore()
1330 static void rtw8822c_txgapk_bb_dpk_restore(struct rtw_dev *rtwdev, u8 path) in rtw8822c_txgapk_bb_dpk_restore() argument
1332 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_bb_dpk_restore()
1334 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1335 rtw_write_rf(rtwdev, path, RF_DIS_BYPASS_TXBB, BIT_TIA_BYPASS, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1336 rtw_write_rf(rtwdev, path, RF_DIS_BYPASS_TXBB, BIT_TXBB, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1338 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1339 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1340 rtw_write32_mask(rtwdev, REG_SINGLE_TONE_SW, BIT_IRQ_TEST_MODE, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1341 rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, 0x00); in rtw8822c_txgapk_bb_dpk_restore()
1342 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, 0x1); in rtw8822c_txgapk_bb_dpk_restore()
1343 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1344 rtw_write32_mask(rtwdev, REG_SINGLE_TONE_SW, BIT_IRQ_TEST_MODE, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1345 rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, 0x00); in rtw8822c_txgapk_bb_dpk_restore()
1346 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1347 rtw_write32_mask(rtwdev, REG_CCA_OFF, BIT_CCA_ON_BY_PW, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1350 rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_A, in rtw8822c_txgapk_bb_dpk_restore()
1352 rtw_write32_mask(rtwdev, REG_3WIRE, BIT_DIS_SHARERX_TXGAT, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1353 rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_A, in rtw8822c_txgapk_bb_dpk_restore()
1355 rtw_write32_mask(rtwdev, REG_3WIRE, BIT_3WIRE_EN, 0x3); in rtw8822c_txgapk_bb_dpk_restore()
1357 rtw_write32_mask(rtwdev, REG_RFTXEN_GCK_B, in rtw8822c_txgapk_bb_dpk_restore()
1359 rtw_write32_mask(rtwdev, REG_3WIRE2, in rtw8822c_txgapk_bb_dpk_restore()
1361 rtw_write32_mask(rtwdev, REG_DIS_SHARE_RX_B, in rtw8822c_txgapk_bb_dpk_restore()
1363 rtw_write32_mask(rtwdev, REG_3WIRE2, BIT_3WIRE_EN, 0x3); in rtw8822c_txgapk_bb_dpk_restore()
1366 rtw_write32_mask(rtwdev, REG_CCKSB, BIT_BBMODE, 0x0); in rtw8822c_txgapk_bb_dpk_restore()
1367 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_CFIR_EN, 0x5); in rtw8822c_txgapk_bb_dpk_restore()
1370 static bool _rtw8822c_txgapk_gain_valid(struct rtw_dev *rtwdev, u32 gain) in _rtw8822c_txgapk_gain_valid() argument
1379 static void _rtw8822c_txgapk_write_gain_bb_table(struct rtw_dev *rtwdev, in _rtw8822c_txgapk_write_gain_bb_table() argument
1382 struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk; in _rtw8822c_txgapk_write_gain_bb_table()
1386 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path); in _rtw8822c_txgapk_write_gain_bb_table()
1390 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x0); in _rtw8822c_txgapk_write_gain_bb_table()
1393 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x2); in _rtw8822c_txgapk_write_gain_bb_table()
1396 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x3); in _rtw8822c_txgapk_write_gain_bb_table()
1399 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x4); in _rtw8822c_txgapk_write_gain_bb_table()
1405 rtw_write32_mask(rtwdev, REG_TX_GAIN_SET, MASKBYTE0, 0x88); in _rtw8822c_txgapk_write_gain_bb_table()
1410 if (_rtw8822c_txgapk_gain_valid(rtwdev, v)) { in _rtw8822c_txgapk_write_gain_bb_table()
1415 rtw_dbg(rtwdev, RTW_DBG_RFK, in _rtw8822c_txgapk_write_gain_bb_table()
1422 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN, tmp_3f); in _rtw8822c_txgapk_write_gain_bb_table()
1423 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_I_GAIN, gain); in _rtw8822c_txgapk_write_gain_bb_table()
1424 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_GAIN_RST, 0x1); in _rtw8822c_txgapk_write_gain_bb_table()
1425 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_GAIN_RST, 0x0); in _rtw8822c_txgapk_write_gain_bb_table()
1427 rtw_dbg(rtwdev, RTW_DBG_RFK, in _rtw8822c_txgapk_write_gain_bb_table()
1433 static void rtw8822c_txgapk_write_gain_bb_table(struct rtw_dev *rtwdev) in rtw8822c_txgapk_write_gain_bb_table() argument
1437 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s channel=%d\n", in rtw8822c_txgapk_write_gain_bb_table()
1438 __func__, rtwdev->dm_info.gapk.channel); in rtw8822c_txgapk_write_gain_bb_table()
1441 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_txgapk_write_gain_bb_table()
1442 _rtw8822c_txgapk_write_gain_bb_table(rtwdev, in rtw8822c_txgapk_write_gain_bb_table()
1448 static void rtw8822c_txgapk_read_offset(struct rtw_dev *rtwdev, u8 path) in rtw8822c_txgapk_read_offset() argument
1454 struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk; in rtw8822c_txgapk_read_offset()
1463 rtw_warn(rtwdev, "[TXGAPK] wrong path %d\n", path); in rtw8822c_txgapk_read_offset()
1467 rtw_write32_mask(rtwdev, REG_ANTMAP0, BIT_ANT_PATH, path + 1); in rtw8822c_txgapk_read_offset()
1468 rtw_write32_mask(rtwdev, REG_TXLGMAP, MASKDWORD, 0xe4e40000); in rtw8822c_txgapk_read_offset()
1469 rtw_write32_mask(rtwdev, REG_TXANTSEG, BIT_ANTSEG, 0x3); in rtw8822c_txgapk_read_offset()
1470 rtw_write32_mask(rtwdev, path_setting[path], MASK20BITS, 0x33312); in rtw8822c_txgapk_read_offset()
1471 rtw_write32_mask(rtwdev, path_setting[path], BIT_PATH_EN, 0x1); in rtw8822c_txgapk_read_offset()
1472 rtw_write32_mask(rtwdev, set_pi[path], BITS_RFC_DIRECT, 0x0); in rtw8822c_txgapk_read_offset()
1473 rtw_write_rf(rtwdev, path, RF_LUTDBG, BIT_TXA_TANK, 0x1); in rtw8822c_txgapk_read_offset()
1474 rtw_write_rf(rtwdev, path, RF_IDAC, BIT_TX_MODE, 0x820); in rtw8822c_txgapk_read_offset()
1475 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path); in rtw8822c_txgapk_read_offset()
1476 rtw_write32_mask(rtwdev, REG_IQKSTAT, MASKBYTE0, 0x0); in rtw8822c_txgapk_read_offset()
1478 rtw_write32_mask(rtwdev, REG_TX_TONE_IDX, MASKBYTE0, 0x018); in rtw8822c_txgapk_read_offset()
1481 rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, BIT_2G_SWING); in rtw8822c_txgapk_read_offset()
1483 rtw_write32_mask(rtwdev, REG_R_CONFIG, MASKBYTE0, BIT_5G_SWING); in rtw8822c_txgapk_read_offset()
1486 rtw_write32_mask(rtwdev, REG_NCTL0, MASKDWORD, cfg1_1b00[path]); in rtw8822c_txgapk_read_offset()
1487 rtw_write32_mask(rtwdev, REG_NCTL0, MASKDWORD, cfg2_1b00[path]); in rtw8822c_txgapk_read_offset()
1491 rtwdev, REG_RPT_CIP, BIT_RPT_CIP_STATUS); in rtw8822c_txgapk_read_offset()
1493 rtw_write32_mask(rtwdev, set_pi[path], BITS_RFC_DIRECT, 0x2); in rtw8822c_txgapk_read_offset()
1494 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path); in rtw8822c_txgapk_read_offset()
1495 rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_EN, 0x1); in rtw8822c_txgapk_read_offset()
1496 rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x12); in rtw8822c_txgapk_read_offset()
1497 rtw_write32_mask(rtwdev, REG_TX_GAIN_SET, BIT_GAPK_RPT_IDX, 0x3); in rtw8822c_txgapk_read_offset()
1498 val = rtw_read32(rtwdev, REG_STAT_RPT); in rtw8822c_txgapk_read_offset()
1509 rtw_write32_mask(rtwdev, REG_TX_GAIN_SET, BIT_GAPK_RPT_IDX, 0x4); in rtw8822c_txgapk_read_offset()
1510 val = rtw_read32(rtwdev, REG_STAT_RPT); in rtw8822c_txgapk_read_offset()
1520 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_read_offset()
1525 static void rtw8822c_txgapk_calculate_offset(struct rtw_dev *rtwdev, u8 path) in rtw8822c_txgapk_calculate_offset() argument
1529 struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk; in rtw8822c_txgapk_calculate_offset()
1533 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s channel=%d\n", in rtw8822c_txgapk_calculate_offset()
1536 rtw8822c_txgapk_backup_bb_reg(rtwdev, bb_reg, in rtw8822c_txgapk_calculate_offset()
1540 rtw_write32_mask(rtwdev, in rtw8822c_txgapk_calculate_offset()
1542 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path); in rtw8822c_txgapk_calculate_offset()
1543 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x3f); in rtw8822c_txgapk_calculate_offset()
1544 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0); in rtw8822c_txgapk_calculate_offset()
1545 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x1); in rtw8822c_txgapk_calculate_offset()
1546 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x5000f); in rtw8822c_txgapk_calculate_offset()
1547 rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_RF_GAIN, 0x0); in rtw8822c_txgapk_calculate_offset()
1548 rtw_write_rf(rtwdev, path, RF_RXG_GAIN, BIT_RXG_GAIN, 0x1); in rtw8822c_txgapk_calculate_offset()
1549 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RXAGC, 0x0f); in rtw8822c_txgapk_calculate_offset()
1550 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x1); in rtw8822c_txgapk_calculate_offset()
1551 rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x1); in rtw8822c_txgapk_calculate_offset()
1552 rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_RXBB, 0x0); in rtw8822c_txgapk_calculate_offset()
1553 rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT_PW_EXT_TIA, 0x1); in rtw8822c_txgapk_calculate_offset()
1555 rtw_write32_mask(rtwdev, REG_IQKSTAT, MASKBYTE0, 0x00); in rtw8822c_txgapk_calculate_offset()
1556 rtw_write32_mask(rtwdev, REG_TABLE_SEL, BIT_Q_GAIN_SEL, 0x0); in rtw8822c_txgapk_calculate_offset()
1558 rtw8822c_txgapk_read_offset(rtwdev, path); in rtw8822c_txgapk_calculate_offset()
1559 rtw_dbg(rtwdev, RTW_DBG_RFK, "=============================\n"); in rtw8822c_txgapk_calculate_offset()
1562 rtw_write32_mask(rtwdev, in rtw8822c_txgapk_calculate_offset()
1564 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SEL_PATH, path); in rtw8822c_txgapk_calculate_offset()
1565 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x3f); in rtw8822c_txgapk_calculate_offset()
1566 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0); in rtw8822c_txgapk_calculate_offset()
1567 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x1); in rtw8822c_txgapk_calculate_offset()
1568 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x50011); in rtw8822c_txgapk_calculate_offset()
1569 rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_TXA_LB_ATT, 0x3); in rtw8822c_txgapk_calculate_offset()
1570 rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_ATT, 0x3); in rtw8822c_txgapk_calculate_offset()
1571 rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_SW, 0x1); in rtw8822c_txgapk_calculate_offset()
1572 rtw_write_rf(rtwdev, path, in rtw8822c_txgapk_calculate_offset()
1574 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RXAGC, 0x12); in rtw8822c_txgapk_calculate_offset()
1575 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x1); in rtw8822c_txgapk_calculate_offset()
1576 rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_RXBB, 0x0); in rtw8822c_txgapk_calculate_offset()
1577 rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT_PW_EXT_TIA, 0x1); in rtw8822c_txgapk_calculate_offset()
1578 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RF_MODE, 0x5); in rtw8822c_txgapk_calculate_offset()
1580 rtw_write32_mask(rtwdev, REG_IQKSTAT, MASKBYTE0, 0x0); in rtw8822c_txgapk_calculate_offset()
1583 rtw_write32_mask(rtwdev, in rtw8822c_txgapk_calculate_offset()
1586 rtw_write32_mask(rtwdev, in rtw8822c_txgapk_calculate_offset()
1589 rtw_write32_mask(rtwdev, in rtw8822c_txgapk_calculate_offset()
1592 rtw8822c_txgapk_read_offset(rtwdev, path); in rtw8822c_txgapk_calculate_offset()
1593 rtw_dbg(rtwdev, RTW_DBG_RFK, "=============================\n"); in rtw8822c_txgapk_calculate_offset()
1595 rtw8822c_txgapk_reload_bb_reg(rtwdev, bb_reg, in rtw8822c_txgapk_calculate_offset()
1599 static void rtw8822c_txgapk_rf_restore(struct rtw_dev *rtwdev, u8 path) in rtw8822c_txgapk_rf_restore() argument
1601 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_rf_restore()
1603 if (path >= rtwdev->hal.rf_path_num) in rtw8822c_txgapk_rf_restore()
1606 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RF_MODE, 0x3); in rtw8822c_txgapk_rf_restore()
1607 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x0); in rtw8822c_txgapk_rf_restore()
1608 rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT_PW_EXT_TIA, 0x0); in rtw8822c_txgapk_rf_restore()
1611 static u32 rtw8822c_txgapk_cal_gain(struct rtw_dev *rtwdev, u32 gain, s8 offset) in rtw8822c_txgapk_cal_gain() argument
1615 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_cal_gain()
1617 if (_rtw8822c_txgapk_gain_valid(rtwdev, gain)) { in rtw8822c_txgapk_cal_gain()
1619 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_cal_gain()
1628 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_cal_gain()
1635 static void rtw8822c_txgapk_write_tx_gain(struct rtw_dev *rtwdev) in rtw8822c_txgapk_write_tx_gain() argument
1637 struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk; in rtw8822c_txgapk_write_tx_gain()
1642 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_write_tx_gain()
1657 rtw_err(rtwdev, "[TXGAPK] unknown channel %d!!\n", channel); in rtw8822c_txgapk_write_tx_gain()
1661 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_txgapk_write_tx_gain()
1666 if (_rtw8822c_txgapk_gain_valid(rtwdev, v)) in rtw8822c_txgapk_write_tx_gain()
1674 if (_rtw8822c_txgapk_gain_valid(rtwdev, v)) { in rtw8822c_txgapk_write_tx_gain()
1675 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_write_tx_gain()
1680 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_write_tx_gain()
1686 rtw_write_rf(rtwdev, path, RF_LUTWE2, RFREG_MASK, 0x10000); in rtw8822c_txgapk_write_tx_gain()
1688 rtw_write_rf(rtwdev, path, in rtw8822c_txgapk_write_tx_gain()
1691 tmp_3f = rtw8822c_txgapk_cal_gain(rtwdev, in rtw8822c_txgapk_write_tx_gain()
1694 rtw_write_rf(rtwdev, path, RF_LUTWD0, in rtw8822c_txgapk_write_tx_gain()
1697 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_write_tx_gain()
1701 rtw_write_rf(rtwdev, path, RF_LUTWE2, RFREG_MASK, 0x0); in rtw8822c_txgapk_write_tx_gain()
1705 static void rtw8822c_txgapk_save_all_tx_gain_table(struct rtw_dev *rtwdev) in rtw8822c_txgapk_save_all_tx_gain_table() argument
1707 struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk; in rtw8822c_txgapk_save_all_tx_gain_table()
1715 if (rtwdev->dm_info.dm_flags & BIT(RTW_DM_CAP_TXGAPK)) in rtw8822c_txgapk_save_all_tx_gain_table()
1718 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk_save_all_tx_gain_table()
1721 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_save_all_tx_gain_table()
1723 rtw8822c_txgapk_write_gain_bb_table(rtwdev); in rtw8822c_txgapk_save_all_tx_gain_table()
1728 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_txgapk_save_all_tx_gain_table()
1729 rf18 = rtw_read_rf(rtwdev, path, RF_CFGCH, RFREG_MASK); in rtw8822c_txgapk_save_all_tx_gain_table()
1731 rtw_write32_mask(rtwdev, in rtw8822c_txgapk_save_all_tx_gain_table()
1733 rtw_write_rf(rtwdev, path, in rtw8822c_txgapk_save_all_tx_gain_table()
1735 rtw_write_rf(rtwdev, path, in rtw8822c_txgapk_save_all_tx_gain_table()
1737 rtw_write_rf(rtwdev, path, in rtw8822c_txgapk_save_all_tx_gain_table()
1739 rtw_write_rf(rtwdev, path, in rtw8822c_txgapk_save_all_tx_gain_table()
1743 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, in rtw8822c_txgapk_save_all_tx_gain_table()
1745 v = rtw_read_rf(rtwdev, path, in rtw8822c_txgapk_save_all_tx_gain_table()
1749 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk_save_all_tx_gain_table()
1755 rtw_write_rf(rtwdev, path, RF_CFGCH, RFREG_MASK, rf18); in rtw8822c_txgapk_save_all_tx_gain_table()
1756 rtw_write32_mask(rtwdev, in rtw8822c_txgapk_save_all_tx_gain_table()
1760 rtw8822c_txgapk_write_gain_bb_table(rtwdev); in rtw8822c_txgapk_save_all_tx_gain_table()
1764 static void rtw8822c_txgapk(struct rtw_dev *rtwdev) in rtw8822c_txgapk() argument
1767 struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk; in rtw8822c_txgapk()
1771 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] ======>%s\n", __func__); in rtw8822c_txgapk()
1773 rtw8822c_txgapk_save_all_tx_gain_table(rtwdev); in rtw8822c_txgapk()
1776 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk()
1781 if (rtwdev->efuse.power_track_type >= 4 && in rtw8822c_txgapk()
1782 rtwdev->efuse.power_track_type <= 7) { in rtw8822c_txgapk()
1783 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_txgapk()
1788 rtw8822c_txgapk_backup_bb_reg(rtwdev, bb_reg, in rtw8822c_txgapk()
1790 rtw8822c_txgapk_tx_pause(rtwdev); in rtw8822c_txgapk()
1791 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_txgapk()
1792 txgapk->channel = rtw_read_rf(rtwdev, path, in rtw8822c_txgapk()
1794 rtw8822c_txgapk_bb_dpk(rtwdev, path); in rtw8822c_txgapk()
1795 rtw8822c_txgapk_afe_dpk(rtwdev, path); in rtw8822c_txgapk()
1796 rtw8822c_txgapk_calculate_offset(rtwdev, path); in rtw8822c_txgapk()
1797 rtw8822c_txgapk_rf_restore(rtwdev, path); in rtw8822c_txgapk()
1798 rtw8822c_txgapk_afe_dpk_restore(rtwdev, path); in rtw8822c_txgapk()
1799 rtw8822c_txgapk_bb_dpk_restore(rtwdev, path); in rtw8822c_txgapk()
1801 rtw8822c_txgapk_write_tx_gain(rtwdev); in rtw8822c_txgapk()
1802 rtw8822c_txgapk_reload_bb_reg(rtwdev, bb_reg, in rtw8822c_txgapk()
1806 static void rtw8822c_do_gapk(struct rtw_dev *rtwdev) in rtw8822c_do_gapk() argument
1808 struct rtw_dm_info *dm = &rtwdev->dm_info; in rtw8822c_do_gapk()
1811 rtw_dbg(rtwdev, RTW_DBG_RFK, "[TXGAPK] feature disable!!!\n"); in rtw8822c_do_gapk()
1814 rtw8822c_rfk_handshake(rtwdev, true); in rtw8822c_do_gapk()
1815 rtw8822c_txgapk(rtwdev); in rtw8822c_do_gapk()
1816 rtw8822c_rfk_handshake(rtwdev, false); in rtw8822c_do_gapk()
1819 static void rtw8822c_rf_init(struct rtw_dev *rtwdev) in rtw8822c_rf_init() argument
1821 rtw8822c_rf_dac_cal(rtwdev); in rtw8822c_rf_init()
1822 rtw8822c_rf_x2_check(rtwdev); in rtw8822c_rf_init()
1823 rtw8822c_thermal_trim(rtwdev); in rtw8822c_rf_init()
1824 rtw8822c_power_trim(rtwdev); in rtw8822c_rf_init()
1825 rtw8822c_pa_bias(rtwdev); in rtw8822c_rf_init()
1828 static void rtw8822c_pwrtrack_init(struct rtw_dev *rtwdev) in rtw8822c_pwrtrack_init() argument
1830 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_pwrtrack_init()
1840 dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k; in rtw8822c_pwrtrack_init()
1841 dm_info->thermal_meter_lck = rtwdev->efuse.thermal_meter_k; in rtw8822c_pwrtrack_init()
1844 static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev) in rtw8822c_phy_set_param() argument
1846 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_phy_set_param()
1847 struct rtw_hal *hal = &rtwdev->hal; in rtw8822c_phy_set_param()
1856 rtw_write8_set(rtwdev, REG_SYS_FUNC_EN, in rtw8822c_phy_set_param()
1858 rtw_write8_set(rtwdev, REG_RF_CTRL, in rtw8822c_phy_set_param()
1860 rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN); in rtw8822c_phy_set_param()
1863 rtw_write32_mask(rtwdev, REG_DIS_DPD, DIS_DPD_MASK, DIS_DPD_RATEALL); in rtw8822c_phy_set_param()
1866 rtw8822c_header_file_init(rtwdev, true); in rtw8822c_phy_set_param()
1868 rtw_phy_load_tables(rtwdev); in rtw8822c_phy_set_param()
1870 crystal_cap = rtwdev->efuse.crystal_cap & 0x7f; in rtw8822c_phy_set_param()
1871 rtw_write32_mask(rtwdev, REG_ANAPAR_XTAL_0, 0xfffc00, in rtw8822c_phy_set_param()
1875 rtw8822c_header_file_init(rtwdev, false); in rtw8822c_phy_set_param()
1878 rtw8822c_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx, in rtw8822c_phy_set_param()
1880 rtw_phy_init(rtwdev); in rtw8822c_phy_set_param()
1882 cck_gi_u_bnd_msb = (u8)rtw_read32_mask(rtwdev, 0x1a98, 0xc000); in rtw8822c_phy_set_param()
1883 cck_gi_u_bnd_lsb = (u8)rtw_read32_mask(rtwdev, 0x1aa8, 0xf0000); in rtw8822c_phy_set_param()
1884 cck_gi_l_bnd_msb = (u8)rtw_read32_mask(rtwdev, 0x1a98, 0xc0); in rtw8822c_phy_set_param()
1885 cck_gi_l_bnd_lsb = (u8)rtw_read32_mask(rtwdev, 0x1a70, 0x0f000000); in rtw8822c_phy_set_param()
1890 rtw8822c_rf_init(rtwdev); in rtw8822c_phy_set_param()
1891 rtw8822c_pwrtrack_init(rtwdev); in rtw8822c_phy_set_param()
1893 rtw_bf_phy_init(rtwdev); in rtw8822c_phy_set_param()
1985 static int rtw8822c_mac_init(struct rtw_dev *rtwdev) in rtw8822c_mac_init() argument
1993 value8 = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL); in rtw8822c_mac_init()
1995 rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL, value8); in rtw8822c_mac_init()
1996 rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN); in rtw8822c_mac_init()
1998 rtw_write16(rtwdev, REG_SPEC_SIFS, WLAN_SIFS_DUR_TUNE); in rtw8822c_mac_init()
1999 rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG); in rtw8822c_mac_init()
2000 rtw_write16(rtwdev, REG_RESP_SIFS_CCK, in rtw8822c_mac_init()
2002 rtw_write16(rtwdev, REG_RESP_SIFS_OFDM, in rtw8822c_mac_init()
2005 rtw_write32(rtwdev, REG_DARFRC, WLAN_DATA_RATE_FB_CNT_1_4); in rtw8822c_mac_init()
2006 rtw_write32(rtwdev, REG_DARFRCH, WLAN_DATA_RATE_FB_CNT_5_8); in rtw8822c_mac_init()
2007 rtw_write32(rtwdev, REG_RARFRCH, WLAN_RTS_RATE_FB_CNT_5_8); in rtw8822c_mac_init()
2008 rtw_write32(rtwdev, REG_ARFR0, WLAN_DATA_RATE_FB_RATE0); in rtw8822c_mac_init()
2009 rtw_write32(rtwdev, REG_ARFRH0, WLAN_DATA_RATE_FB_RATE0_H); in rtw8822c_mac_init()
2010 rtw_write32(rtwdev, REG_ARFR1_V1, WLAN_RTS_RATE_FB_RATE1); in rtw8822c_mac_init()
2011 rtw_write32(rtwdev, REG_ARFRH1_V1, WLAN_RTS_RATE_FB_RATE1_H); in rtw8822c_mac_init()
2012 rtw_write32(rtwdev, REG_ARFR4, WLAN_RTS_RATE_FB_RATE4); in rtw8822c_mac_init()
2013 rtw_write32(rtwdev, REG_ARFRH4, WLAN_RTS_RATE_FB_RATE4_H); in rtw8822c_mac_init()
2014 rtw_write32(rtwdev, REG_ARFR5, WLAN_RTS_RATE_FB_RATE5); in rtw8822c_mac_init()
2015 rtw_write32(rtwdev, REG_ARFRH5, WLAN_RTS_RATE_FB_RATE5_H); in rtw8822c_mac_init()
2017 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME); in rtw8822c_mac_init()
2018 rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1); in rtw8822c_mac_init()
2020 rtw_write8(rtwdev, REG_PRECNT_CTRL, (u8)(pre_txcnt & 0xFF)); in rtw8822c_mac_init()
2021 rtw_write8(rtwdev, REG_PRECNT_CTRL + 1, (u8)(pre_txcnt >> 8)); in rtw8822c_mac_init()
2025 rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32); in rtw8822c_mac_init()
2026 rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2, in rtw8822c_mac_init()
2028 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH); in rtw8822c_mac_init()
2029 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH); in rtw8822c_mac_init()
2030 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH); in rtw8822c_mac_init()
2031 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH); in rtw8822c_mac_init()
2033 rtw_write8_clr(rtwdev, REG_LIFETIME_EN, BIT_BA_PARSER_EN); in rtw8822c_mac_init()
2034 rtw_write32_clr(rtwdev, REG_RRSR, BITS_RRSR_RSC); in rtw8822c_mac_init()
2037 rtw_write32(rtwdev, REG_EDCA_VO_PARAM, WLAN_EDCA_VO_PARAM); in rtw8822c_mac_init()
2038 rtw_write32(rtwdev, REG_EDCA_VI_PARAM, WLAN_EDCA_VI_PARAM); in rtw8822c_mac_init()
2039 rtw_write32(rtwdev, REG_EDCA_BE_PARAM, WLAN_EDCA_BE_PARAM); in rtw8822c_mac_init()
2040 rtw_write32(rtwdev, REG_EDCA_BK_PARAM, WLAN_EDCA_BK_PARAM); in rtw8822c_mac_init()
2041 rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME); in rtw8822c_mac_init()
2042 rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8); in rtw8822c_mac_init()
2043 rtw_write8_set(rtwdev, REG_RD_CTRL + 1, in rtw8822c_mac_init()
2048 rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BIT_MAC_CLK_SEL); in rtw8822c_mac_init()
2049 rtw_write8(rtwdev, REG_USTIME_TSF, MAC_CLK_SPEED); in rtw8822c_mac_init()
2050 rtw_write8(rtwdev, REG_USTIME_EDCA, MAC_CLK_SPEED); in rtw8822c_mac_init()
2052 rtw_write8_set(rtwdev, REG_MISC_CTRL, in rtw8822c_mac_init()
2054 rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0); in rtw8822c_mac_init()
2055 rtw_write16(rtwdev, REG_TXPAUSE, 0x0000); in rtw8822c_mac_init()
2056 rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME); in rtw8822c_mac_init()
2057 rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG); in rtw8822c_mac_init()
2058 rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG); in rtw8822c_mac_init()
2060 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); in rtw8822c_mac_init()
2062 rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME); in rtw8822c_mac_init()
2063 rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT); in rtw8822c_mac_init()
2064 rtw_write8(rtwdev, REG_BCN_CTRL_CLINT0, WLAN_BCN_CTRL_CLT0); in rtw8822c_mac_init()
2065 rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME); in rtw8822c_mac_init()
2066 rtw_write8(rtwdev, REG_BCN_MAX_ERR, WLAN_BCN_MAX_ERR); in rtw8822c_mac_init()
2069 rtw_write32(rtwdev, REG_MAR, WLAN_MULTI_ADDR); in rtw8822c_mac_init()
2070 rtw_write32(rtwdev, REG_MAR + 4, WLAN_MULTI_ADDR); in rtw8822c_mac_init()
2071 rtw_write8(rtwdev, REG_BBPSF_CTRL + 2, WLAN_RESP_TXRATE); in rtw8822c_mac_init()
2072 rtw_write8(rtwdev, REG_ACKTO, WLAN_ACK_TO); in rtw8822c_mac_init()
2073 rtw_write8(rtwdev, REG_ACKTO_CCK, WLAN_ACK_TO_CCK); in rtw8822c_mac_init()
2074 rtw_write16(rtwdev, REG_EIFS, WLAN_EIFS_DUR_TUNE); in rtw8822c_mac_init()
2075 rtw_write8(rtwdev, REG_NAV_CTRL + 2, WLAN_NAV_MAX); in rtw8822c_mac_init()
2076 rtw_write8(rtwdev, REG_WMAC_TRXPTCL_CTL_H + 2, WLAN_BAR_ACK_TYPE); in rtw8822c_mac_init()
2077 rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0); in rtw8822c_mac_init()
2078 rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2); in rtw8822c_mac_init()
2079 rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG); in rtw8822c_mac_init()
2080 rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512); in rtw8822c_mac_init()
2081 rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2); in rtw8822c_mac_init()
2082 rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1); in rtw8822c_mac_init()
2083 rtw_write32_set(rtwdev, REG_GENERAL_OPTION, BIT_DUMMY_FCS_READY_MASK_EN); in rtw8822c_mac_init()
2084 rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2); in rtw8822c_mac_init()
2085 rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION_1, WLAN_MAC_OPT_NORM_FUNC1); in rtw8822c_mac_init()
2088 value16 = rtw_read16(rtwdev, REG_RXPSF_CTRL + 2) & 0xF00F; in rtw8822c_mac_init()
2091 rtw_write16(rtwdev, REG_RXPSF_CTRL + 2, value16); in rtw8822c_mac_init()
2097 rtw_write16(rtwdev, REG_RXPSF_CTRL, value16); in rtw8822c_mac_init()
2098 rtw_write32(rtwdev, REG_RXPSF_TYPE_CTRL, 0xFFFFFFFF); in rtw8822c_mac_init()
2100 value16 = rtw_read16(rtwdev, REG_RXPSF_CTRL); in rtw8822c_mac_init()
2104 rtw_write16(rtwdev, REG_RXPSF_CTRL, value16); in rtw8822c_mac_init()
2107 rtw_write32(rtwdev, REG_INT_MIG, WLAN_MAC_INT_MIG_CFG); in rtw8822c_mac_init()
2131 static int rtw8822c_dump_fw_crash(struct rtw_dev *rtwdev) in rtw8822c_dump_fw_crash() argument
2138 ret = rtw_dump_reg(rtwdev, 0x0, FWCD_SIZE_REG_8822C); in rtw8822c_dump_fw_crash()
2141 ret = __dump_fw_8822c(rtwdev, DMEM); in rtw8822c_dump_fw_crash()
2144 ret = __dump_fw_8822c(rtwdev, IMEM); in rtw8822c_dump_fw_crash()
2147 ret = __dump_fw_8822c(rtwdev, EMEM); in rtw8822c_dump_fw_crash()
2150 ret = __dump_fw_8822c(rtwdev, ROM); in rtw8822c_dump_fw_crash()
2159 static void rtw8822c_rstb_3wire(struct rtw_dev *rtwdev, bool enable) in rtw8822c_rstb_3wire() argument
2162 rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x1); in rtw8822c_rstb_3wire()
2163 rtw_write32_mask(rtwdev, REG_ANAPAR_A, BIT_ANAPAR_UPDATE, 0x1); in rtw8822c_rstb_3wire()
2164 rtw_write32_mask(rtwdev, REG_ANAPAR_B, BIT_ANAPAR_UPDATE, 0x1); in rtw8822c_rstb_3wire()
2166 rtw_write32_mask(rtwdev, REG_RSTB, BIT_RSTB_3WIRE, 0x0); in rtw8822c_rstb_3wire()
2170 static void rtw8822c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) in rtw8822c_set_channel_rf() argument
2187 rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); in rtw8822c_set_channel_rf()
2218 rtw8822c_rstb_3wire(rtwdev, false); in rtw8822c_set_channel_rf()
2220 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, 0x04, 0x01); in rtw8822c_set_channel_rf()
2221 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, 0x1f, 0x12); in rtw8822c_set_channel_rf()
2222 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, 0xfffff, rf_rxbb); in rtw8822c_set_channel_rf()
2223 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, 0x04, 0x00); in rtw8822c_set_channel_rf()
2225 rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE2, 0x04, 0x01); in rtw8822c_set_channel_rf()
2226 rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWA, 0x1f, 0x12); in rtw8822c_set_channel_rf()
2227 rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWD0, 0xfffff, rf_rxbb); in rtw8822c_set_channel_rf()
2228 rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE2, 0x04, 0x00); in rtw8822c_set_channel_rf()
2230 rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_reg18); in rtw8822c_set_channel_rf()
2231 rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_reg18); in rtw8822c_set_channel_rf()
2233 rtw8822c_rstb_3wire(rtwdev, true); in rtw8822c_set_channel_rf()
2236 static void rtw8822c_toggle_igi(struct rtw_dev *rtwdev) in rtw8822c_toggle_igi() argument
2240 igi = rtw_read32_mask(rtwdev, REG_RXIGI, 0x7f); in rtw8822c_toggle_igi()
2241 rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f, igi - 2); in rtw8822c_toggle_igi()
2242 rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f00, igi - 2); in rtw8822c_toggle_igi()
2243 rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f, igi); in rtw8822c_toggle_igi()
2244 rtw_write32_mask(rtwdev, REG_RXIGI, 0x7f00, igi); in rtw8822c_toggle_igi()
2247 static void rtw8822c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw, in rtw8822c_set_channel_bb() argument
2251 rtw_write32_clr(rtwdev, REG_BGCTRL, BITS_RX_IQ_WEIGHT); in rtw8822c_set_channel_bb()
2252 rtw_write32_set(rtwdev, REG_TXF4, BIT(20)); in rtw8822c_set_channel_bb()
2253 rtw_write32_clr(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN); in rtw8822c_set_channel_bb()
2254 rtw_write32_clr(rtwdev, REG_CCKTXONLY, BIT_BB_CCK_CHECK_EN); in rtw8822c_set_channel_bb()
2255 rtw_write32_mask(rtwdev, REG_CCAMSK, 0x3F000000, 0xF); in rtw8822c_set_channel_bb()
2259 rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_CCK, in rtw8822c_set_channel_bb()
2261 rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_CCK, in rtw8822c_set_channel_bb()
2263 rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2265 rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2269 rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_CCK, in rtw8822c_set_channel_bb()
2271 rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_CCK, in rtw8822c_set_channel_bb()
2273 rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2275 rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2280 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x969); in rtw8822c_set_channel_bb()
2282 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x96a); in rtw8822c_set_channel_bb()
2284 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x9aa); in rtw8822c_set_channel_bb()
2286 rtw_write32_mask(rtwdev, REG_TXF0, MASKHWORD, 0x3da0); in rtw8822c_set_channel_bb()
2287 rtw_write32_mask(rtwdev, REG_TXF1, MASKDWORD, in rtw8822c_set_channel_bb()
2289 rtw_write32_mask(rtwdev, REG_TXF2, MASKLWORD, 0x6aa3); in rtw8822c_set_channel_bb()
2290 rtw_write32_mask(rtwdev, REG_TXF3, MASKHWORD, 0xaa7b); in rtw8822c_set_channel_bb()
2291 rtw_write32_mask(rtwdev, REG_TXF4, MASKLWORD, 0xf3d7); in rtw8822c_set_channel_bb()
2292 rtw_write32_mask(rtwdev, REG_TXF5, MASKDWORD, 0x0); in rtw8822c_set_channel_bb()
2293 rtw_write32_mask(rtwdev, REG_TXF6, MASKDWORD, in rtw8822c_set_channel_bb()
2295 rtw_write32_mask(rtwdev, REG_TXF7, MASKDWORD, 0xffff); in rtw8822c_set_channel_bb()
2297 rtw_write32_mask(rtwdev, REG_TXF0, MASKHWORD, 0x5284); in rtw8822c_set_channel_bb()
2298 rtw_write32_mask(rtwdev, REG_TXF1, MASKDWORD, in rtw8822c_set_channel_bb()
2300 rtw_write32_mask(rtwdev, REG_TXF2, MASKLWORD, 0x0a88); in rtw8822c_set_channel_bb()
2301 rtw_write32_mask(rtwdev, REG_TXF3, MASKHWORD, 0xacc4); in rtw8822c_set_channel_bb()
2302 rtw_write32_mask(rtwdev, REG_TXF4, MASKLWORD, 0xc8b2); in rtw8822c_set_channel_bb()
2303 rtw_write32_mask(rtwdev, REG_TXF5, MASKDWORD, in rtw8822c_set_channel_bb()
2305 rtw_write32_mask(rtwdev, REG_TXF6, MASKDWORD, in rtw8822c_set_channel_bb()
2307 rtw_write32_mask(rtwdev, REG_TXF7, MASKDWORD, in rtw8822c_set_channel_bb()
2311 rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x3); in rtw8822c_set_channel_bb()
2313 rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x1); in rtw8822c_set_channel_bb()
2315 rtw_write32_set(rtwdev, REG_CCKTXONLY, BIT_BB_CCK_CHECK_EN); in rtw8822c_set_channel_bb()
2316 rtw_write32_set(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN); in rtw8822c_set_channel_bb()
2317 rtw_write32_set(rtwdev, REG_BGCTRL, BITS_RX_IQ_WEIGHT); in rtw8822c_set_channel_bb()
2318 rtw_write32_clr(rtwdev, REG_TXF4, BIT(20)); in rtw8822c_set_channel_bb()
2319 rtw_write32_mask(rtwdev, REG_CCAMSK, 0x3F000000, 0x22); in rtw8822c_set_channel_bb()
2320 rtw_write32_mask(rtwdev, REG_TXDFIR0, 0x70, 0x3); in rtw8822c_set_channel_bb()
2322 rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2324 rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2327 rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2329 rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2332 rtw_write32_mask(rtwdev, REG_RXAGCCTL0, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2334 rtw_write32_mask(rtwdev, REG_RXAGCCTL, BITS_RXAGC_OFDM, in rtw8822c_set_channel_bb()
2339 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x494); in rtw8822c_set_channel_bb()
2341 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x493); in rtw8822c_set_channel_bb()
2343 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x453); in rtw8822c_set_channel_bb()
2345 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x452); in rtw8822c_set_channel_bb()
2347 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x412); in rtw8822c_set_channel_bb()
2349 rtw_write32_mask(rtwdev, REG_SCOTRK, 0xfff, 0x411); in rtw8822c_set_channel_bb()
2354 rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x19B); in rtw8822c_set_channel_bb()
2355 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0); in rtw8822c_set_channel_bb()
2356 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x0); in rtw8822c_set_channel_bb()
2357 rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x7); in rtw8822c_set_channel_bb()
2358 rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x6); in rtw8822c_set_channel_bb()
2359 rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0); in rtw8822c_set_channel_bb()
2360 rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1); in rtw8822c_set_channel_bb()
2361 rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0); in rtw8822c_set_channel_bb()
2364 rtw_write32_mask(rtwdev, REG_CCKSB, BIT(4), in rtw8822c_set_channel_bb()
2366 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x5); in rtw8822c_set_channel_bb()
2367 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xc0, 0x0); in rtw8822c_set_channel_bb()
2368 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xff00, in rtw8822c_set_channel_bb()
2370 rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x1); in rtw8822c_set_channel_bb()
2371 rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1); in rtw8822c_set_channel_bb()
2372 rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x1); in rtw8822c_set_channel_bb()
2375 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0xa); in rtw8822c_set_channel_bb()
2376 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xc0, 0x0); in rtw8822c_set_channel_bb()
2377 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xff00, in rtw8822c_set_channel_bb()
2379 rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x6); in rtw8822c_set_channel_bb()
2380 rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x1); in rtw8822c_set_channel_bb()
2383 rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x2AB); in rtw8822c_set_channel_bb()
2384 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0); in rtw8822c_set_channel_bb()
2385 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x1); in rtw8822c_set_channel_bb()
2386 rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x4); in rtw8822c_set_channel_bb()
2387 rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x4); in rtw8822c_set_channel_bb()
2388 rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0); in rtw8822c_set_channel_bb()
2389 rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1); in rtw8822c_set_channel_bb()
2390 rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0); in rtw8822c_set_channel_bb()
2393 rtw_write32_mask(rtwdev, REG_DFIRBW, 0x3FF0, 0x2AB); in rtw8822c_set_channel_bb()
2394 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xf, 0x0); in rtw8822c_set_channel_bb()
2395 rtw_write32_mask(rtwdev, REG_TXBWCTL, 0xffc0, 0x2); in rtw8822c_set_channel_bb()
2396 rtw_write32_mask(rtwdev, REG_TXCLK, 0x700, 0x6); in rtw8822c_set_channel_bb()
2397 rtw_write32_mask(rtwdev, REG_TXCLK, 0x700000, 0x5); in rtw8822c_set_channel_bb()
2398 rtw_write32_mask(rtwdev, REG_CCK_SOURCE, BIT_NBI_EN, 0x0); in rtw8822c_set_channel_bb()
2399 rtw_write32_mask(rtwdev, REG_SBD, BITS_SUBTUNE, 0x1); in rtw8822c_set_channel_bb()
2400 rtw_write32_mask(rtwdev, REG_PT_CHSMO, BIT_PT_OPT, 0x0); in rtw8822c_set_channel_bb()
2405 static void rtw8822c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw, in rtw8822c_set_channel() argument
2408 rtw8822c_set_channel_bb(rtwdev, channel, bw, primary_chan_idx); in rtw8822c_set_channel()
2409 rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx); in rtw8822c_set_channel()
2410 rtw8822c_set_channel_rf(rtwdev, channel, bw); in rtw8822c_set_channel()
2411 rtw8822c_toggle_igi(rtwdev); in rtw8822c_set_channel()
2414 static void rtw8822c_config_cck_rx_path(struct rtw_dev *rtwdev, u8 rx_path) in rtw8822c_config_cck_rx_path() argument
2417 rtw_write32_mask(rtwdev, REG_CCANRX, 0x00060000, 0x0); in rtw8822c_config_cck_rx_path()
2418 rtw_write32_mask(rtwdev, REG_CCANRX, 0x00600000, 0x0); in rtw8822c_config_cck_rx_path()
2420 rtw_write32_mask(rtwdev, REG_CCANRX, 0x00600000, 0x1); in rtw8822c_config_cck_rx_path()
2421 rtw_write32_mask(rtwdev, REG_CCANRX, 0x00060000, 0x1); in rtw8822c_config_cck_rx_path()
2425 rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x0); in rtw8822c_config_cck_rx_path()
2427 rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x5); in rtw8822c_config_cck_rx_path()
2429 rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0x0f000000, 0x1); in rtw8822c_config_cck_rx_path()
2432 static void rtw8822c_config_ofdm_rx_path(struct rtw_dev *rtwdev, u8 rx_path) in rtw8822c_config_ofdm_rx_path() argument
2435 rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x300, 0x0); in rtw8822c_config_ofdm_rx_path()
2436 rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x600000, 0x0); in rtw8822c_config_ofdm_rx_path()
2437 rtw_write32_mask(rtwdev, REG_AGCSWSH, BIT(17), 0x0); in rtw8822c_config_ofdm_rx_path()
2438 rtw_write32_mask(rtwdev, REG_ANTWTPD, BIT(20), 0x0); in rtw8822c_config_ofdm_rx_path()
2439 rtw_write32_mask(rtwdev, REG_MRCM, BIT(24), 0x0); in rtw8822c_config_ofdm_rx_path()
2441 rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x300, 0x1); in rtw8822c_config_ofdm_rx_path()
2442 rtw_write32_mask(rtwdev, REG_RXFNCTL, 0x600000, 0x1); in rtw8822c_config_ofdm_rx_path()
2443 rtw_write32_mask(rtwdev, REG_AGCSWSH, BIT(17), 0x1); in rtw8822c_config_ofdm_rx_path()
2444 rtw_write32_mask(rtwdev, REG_ANTWTPD, BIT(20), 0x1); in rtw8822c_config_ofdm_rx_path()
2445 rtw_write32_mask(rtwdev, REG_MRCM, BIT(24), 0x1); in rtw8822c_config_ofdm_rx_path()
2448 rtw_write32_mask(rtwdev, 0x824, 0x0f000000, rx_path); in rtw8822c_config_ofdm_rx_path()
2449 rtw_write32_mask(rtwdev, 0x824, 0x000f0000, rx_path); in rtw8822c_config_ofdm_rx_path()
2452 static void rtw8822c_config_rx_path(struct rtw_dev *rtwdev, u8 rx_path) in rtw8822c_config_rx_path() argument
2454 rtw8822c_config_cck_rx_path(rtwdev, rx_path); in rtw8822c_config_rx_path()
2455 rtw8822c_config_ofdm_rx_path(rtwdev, rx_path); in rtw8822c_config_rx_path()
2458 static void rtw8822c_config_cck_tx_path(struct rtw_dev *rtwdev, u8 tx_path, in rtw8822c_config_cck_tx_path() argument
2462 rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8); in rtw8822c_config_cck_tx_path()
2464 rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x4); in rtw8822c_config_cck_tx_path()
2467 rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0xc); in rtw8822c_config_cck_tx_path()
2469 rtw_write32_mask(rtwdev, REG_RXCCKSEL, 0xf0000000, 0x8); in rtw8822c_config_cck_tx_path()
2471 rtw8822c_bb_reset(rtwdev); in rtw8822c_config_cck_tx_path()
2474 static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path, in rtw8822c_config_ofdm_tx_path() argument
2478 rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x11); in rtw8822c_config_ofdm_tx_path()
2479 rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0); in rtw8822c_config_ofdm_tx_path()
2481 rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x12); in rtw8822c_config_ofdm_tx_path()
2482 rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xff, 0x0); in rtw8822c_config_ofdm_tx_path()
2485 rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x33); in rtw8822c_config_ofdm_tx_path()
2486 rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0404); in rtw8822c_config_ofdm_tx_path()
2488 rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x32); in rtw8822c_config_ofdm_tx_path()
2489 rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400); in rtw8822c_config_ofdm_tx_path()
2491 rtw_write32_mask(rtwdev, REG_ANTMAP0, 0xff, 0x31); in rtw8822c_config_ofdm_tx_path()
2492 rtw_write32_mask(rtwdev, REG_TXLGMAP, 0xffff, 0x0400); in rtw8822c_config_ofdm_tx_path()
2495 rtw8822c_bb_reset(rtwdev); in rtw8822c_config_ofdm_tx_path()
2498 static void rtw8822c_config_tx_path(struct rtw_dev *rtwdev, u8 tx_path, in rtw8822c_config_tx_path() argument
2503 rtw8822c_config_cck_tx_path(rtwdev, tx_path_cck, is_tx2_path); in rtw8822c_config_tx_path()
2504 rtw8822c_config_ofdm_tx_path(rtwdev, tx_path, tx_path_sel_1ss); in rtw8822c_config_tx_path()
2505 rtw8822c_bb_reset(rtwdev); in rtw8822c_config_tx_path()
2508 static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path, in rtw8822c_config_trx_mode() argument
2512 rtw_write32_mask(rtwdev, REG_ORITXCODE, MASK20BITS, 0x33312); in rtw8822c_config_trx_mode()
2514 rtw_write32_mask(rtwdev, REG_ORITXCODE, MASK20BITS, 0x11111); in rtw8822c_config_trx_mode()
2516 rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x33312); in rtw8822c_config_trx_mode()
2518 rtw_write32_mask(rtwdev, REG_ORITXCODE2, MASK20BITS, 0x11111); in rtw8822c_config_trx_mode()
2520 rtw8822c_config_rx_path(rtwdev, rx_path); in rtw8822c_config_trx_mode()
2521 rtw8822c_config_tx_path(rtwdev, tx_path, BB_PATH_A, BB_PATH_A, in rtw8822c_config_trx_mode()
2524 rtw8822c_toggle_igi(rtwdev); in rtw8822c_config_trx_mode()
2527 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status, in query_phy_status_page0() argument
2530 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in query_phy_status_page0()
2559 for (path = 0; path <= rtwdev->hal.rf_path_num; path++) { in query_phy_status_page0()
2570 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status, in query_phy_status_page1() argument
2573 struct rtw_path_div *p_div = &rtwdev->dm_path_div; in query_phy_status_page1()
2574 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in query_phy_status_page1()
2613 for (path = 0; path <= rtwdev->hal.rf_path_num; path++) { in query_phy_status_page1()
2636 rtw_phy_parsing_cfo(rtwdev, pkt_stat); in query_phy_status_page1()
2639 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status, in query_phy_status() argument
2648 query_phy_status_page0(rtwdev, phy_status, pkt_stat); in query_phy_status()
2651 query_phy_status_page1(rtwdev, phy_status, pkt_stat); in query_phy_status()
2654 rtw_warn(rtwdev, "unused phy status page (%d)\n", page); in query_phy_status()
2659 static void rtw8822c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc, in rtw8822c_query_rx_desc() argument
2664 u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz; in rtw8822c_query_rx_desc()
2695 query_phy_status(rtwdev, phy_status, pkt_stat); in rtw8822c_query_rx_desc()
2698 rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status); in rtw8822c_query_rx_desc()
2702 rtw8822c_set_write_tx_power_ref(struct rtw_dev *rtwdev, u8 *tx_pwr_ref_cck, in rtw8822c_set_write_tx_power_ref() argument
2705 struct rtw_hal *hal = &rtwdev->hal; in rtw8822c_set_write_tx_power_ref()
2711 rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0); in rtw8822c_set_write_tx_power_ref()
2712 rtw_write32_mask(rtwdev, txref_cck[path], 0x7f0000, in rtw8822c_set_write_tx_power_ref()
2716 rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0); in rtw8822c_set_write_tx_power_ref()
2717 rtw_write32_mask(rtwdev, txref_ofdm[path], 0x1fc00, in rtw8822c_set_write_tx_power_ref()
2722 static void rtw8822c_set_tx_power_diff(struct rtw_dev *rtwdev, u8 rate, in rtw8822c_set_tx_power_diff() argument
2739 rtw_write32_mask(rtwdev, 0x1c90, BIT(15), 0x0); in rtw8822c_set_tx_power_diff()
2740 rtw_write32_mask(rtwdev, offset_txagc + rate_idx, MASKDWORD, in rtw8822c_set_tx_power_diff()
2744 static void rtw8822c_set_tx_power_index(struct rtw_dev *rtwdev) in rtw8822c_set_tx_power_index() argument
2746 struct rtw_hal *hal = &rtwdev->hal; in rtw8822c_set_tx_power_index()
2756 rtw8822c_set_write_tx_power_ref(rtwdev, pwr_ref_cck, pwr_ref_ofdm); in rtw8822c_set_tx_power_index()
2771 rtw8822c_set_tx_power_diff(rtwdev, rate - 3, in rtw8822c_set_tx_power_index()
2777 static int rtw8822c_set_antenna(struct rtw_dev *rtwdev, in rtw8822c_set_antenna() argument
2781 struct rtw_hal *hal = &rtwdev->hal; in rtw8822c_set_antenna()
2789 rtw_info(rtwdev, "unsupported tx path 0x%x\n", antenna_tx); in rtw8822c_set_antenna()
2799 rtw_info(rtwdev, "unsupported rx path 0x%x\n", antenna_rx); in rtw8822c_set_antenna()
2806 rtw8822c_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false); in rtw8822c_set_antenna()
2811 static void rtw8822c_cfg_ldo25(struct rtw_dev *rtwdev, bool enable) in rtw8822c_cfg_ldo25() argument
2815 ldo_pwr = rtw_read8(rtwdev, REG_ANAPARLDO_POW_MAC); in rtw8822c_cfg_ldo25()
2817 rtw_write8(rtwdev, REG_ANAPARLDO_POW_MAC, ldo_pwr); in rtw8822c_cfg_ldo25()
2820 static void rtw8822c_false_alarm_statistics(struct rtw_dev *rtwdev) in rtw8822c_false_alarm_statistics() argument
2822 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_false_alarm_statistics()
2832 cck_enable = rtw_read32(rtwdev, REG_ENCCK) & BIT_CCK_BLK_EN; in rtw8822c_false_alarm_statistics()
2833 cck_fa_cnt = rtw_read16(rtwdev, REG_CCK_FACNT); in rtw8822c_false_alarm_statistics()
2835 ofdm_fa_cnt1 = rtw_read32(rtwdev, REG_OFDM_FACNT1); in rtw8822c_false_alarm_statistics()
2836 ofdm_fa_cnt2 = rtw_read32(rtwdev, REG_OFDM_FACNT2); in rtw8822c_false_alarm_statistics()
2837 ofdm_fa_cnt3 = rtw_read32(rtwdev, REG_OFDM_FACNT3); in rtw8822c_false_alarm_statistics()
2838 ofdm_fa_cnt4 = rtw_read32(rtwdev, REG_OFDM_FACNT4); in rtw8822c_false_alarm_statistics()
2839 ofdm_fa_cnt5 = rtw_read32(rtwdev, REG_OFDM_FACNT5); in rtw8822c_false_alarm_statistics()
2858 crc32_cnt = rtw_read32(rtwdev, 0x2c04); in rtw8822c_false_alarm_statistics()
2861 crc32_cnt = rtw_read32(rtwdev, 0x2c14); in rtw8822c_false_alarm_statistics()
2864 crc32_cnt = rtw_read32(rtwdev, 0x2c10); in rtw8822c_false_alarm_statistics()
2867 crc32_cnt = rtw_read32(rtwdev, 0x2c0c); in rtw8822c_false_alarm_statistics()
2871 cca32_cnt = rtw_read32(rtwdev, 0x2c08); in rtw8822c_false_alarm_statistics()
2878 rtw_write32_mask(rtwdev, REG_CCANRX, BIT_CCK_FA_RST, 0); in rtw8822c_false_alarm_statistics()
2879 rtw_write32_mask(rtwdev, REG_CCANRX, BIT_CCK_FA_RST, 2); in rtw8822c_false_alarm_statistics()
2880 rtw_write32_mask(rtwdev, REG_CCANRX, BIT_OFDM_FA_RST, 0); in rtw8822c_false_alarm_statistics()
2881 rtw_write32_mask(rtwdev, REG_CCANRX, BIT_OFDM_FA_RST, 2); in rtw8822c_false_alarm_statistics()
2884 rtw_write32_clr(rtwdev, REG_RX_BREAK, BIT_COM_RX_GCK_EN); in rtw8822c_false_alarm_statistics()
2885 rtw_write32_set(rtwdev, REG_CNT_CTRL, BIT_ALL_CNT_RST); in rtw8822c_false_alarm_statistics()
2886 rtw_write32_clr(rtwdev, REG_CNT_CTRL, BIT_ALL_CNT_RST); in rtw8822c_false_alarm_statistics()
2887 rtw_write32_set(rtwdev, REG_RX_BREAK, BIT_COM_RX_GCK_EN); in rtw8822c_false_alarm_statistics()
2890 static void rtw8822c_do_lck(struct rtw_dev *rtwdev) in rtw8822c_do_lck() argument
2894 rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_CTRL, RFREG_MASK, 0x80010); in rtw8822c_do_lck()
2895 rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_PFD, RFREG_MASK, 0x1F0FA); in rtw8822c_do_lck()
2897 rtw_write_rf(rtwdev, RF_PATH_A, RF_AAC_CTRL, RFREG_MASK, 0x80000); in rtw8822c_do_lck()
2898 rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_AAC, RFREG_MASK, 0x80001); in rtw8822c_do_lck()
2900 true, rtwdev, RF_PATH_A, RF_AAC_CTRL, 0x1000); in rtw8822c_do_lck()
2901 rtw_write_rf(rtwdev, RF_PATH_A, RF_SYN_PFD, RFREG_MASK, 0x1F0F8); in rtw8822c_do_lck()
2902 rtw_write_rf(rtwdev, RF_PATH_B, RF_SYN_CTRL, RFREG_MASK, 0x80010); in rtw8822c_do_lck()
2904 rtw_write_rf(rtwdev, RF_PATH_A, RF_FAST_LCK, RFREG_MASK, 0x0f000); in rtw8822c_do_lck()
2905 rtw_write_rf(rtwdev, RF_PATH_A, RF_FAST_LCK, RFREG_MASK, 0x4f000); in rtw8822c_do_lck()
2907 rtw_write_rf(rtwdev, RF_PATH_A, RF_FAST_LCK, RFREG_MASK, 0x0f000); in rtw8822c_do_lck()
2910 static void rtw8822c_do_iqk(struct rtw_dev *rtwdev) in rtw8822c_do_iqk() argument
2917 rtw_fw_do_iqk(rtwdev, &para); in rtw8822c_do_iqk()
2920 20000, 300000, false, rtwdev, REG_RPT_CIP); in rtw8822c_do_iqk()
2922 rtw_warn(rtwdev, "failed to poll iqk status bit\n"); in rtw8822c_do_iqk()
2924 rtw_write8(rtwdev, REG_IQKSTAT, 0x0); in rtw8822c_do_iqk()
2928 static void rtw8822c_coex_cfg_init(struct rtw_dev *rtwdev) in rtw8822c_coex_cfg_init() argument
2931 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); in rtw8822c_coex_cfg_init()
2935 rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5); in rtw8822c_coex_cfg_init()
2938 rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1); in rtw8822c_coex_cfg_init()
2941 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN); in rtw8822c_coex_cfg_init()
2942 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS); in rtw8822c_coex_cfg_init()
2945 rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN); in rtw8822c_coex_cfg_init()
2947 rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN); in rtw8822c_coex_cfg_init()
2949 rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY); in rtw8822c_coex_cfg_init()
2951 rtw_write8_clr(rtwdev, REG_DUMMY_PAGE4_V1, BIT_BTCCA_CTRL); in rtw8822c_coex_cfg_init()
2954 rtw_write_rf(rtwdev, RF_PATH_B, RF_MODOPT, 0xfffff, 0x40000); in rtw8822c_coex_cfg_init()
2957 static void rtw8822c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev) in rtw8822c_coex_cfg_gnt_fix() argument
2959 struct rtw_coex *coex = &rtwdev->coex; in rtw8822c_coex_cfg_gnt_fix()
2961 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw8822c_coex_cfg_gnt_fix()
2978 rtw_write_rf(rtwdev, RF_PATH_B, 0x1, 0xfffff, rf_0x1); in rtw8822c_coex_cfg_gnt_fix()
2991 rtw_write8_mask(rtwdev, REG_ANAPAR + 2, BIT_ANAPAR_BTPS >> 16, 1); in rtw8822c_coex_cfg_gnt_fix()
2992 rtw_write8_mask(rtwdev, REG_RSTB_SEL + 1, BIT_DAC_OFF_ENABLE, 0); in rtw8822c_coex_cfg_gnt_fix()
2993 rtw_write8_mask(rtwdev, REG_RSTB_SEL + 3, BIT_DAC_OFF_ENABLE, 1); in rtw8822c_coex_cfg_gnt_fix()
2994 rtw_write8_mask(rtwdev, REG_IGN_GNTBT4, BIT_PI_IGNORE_GNT_BT, 1); in rtw8822c_coex_cfg_gnt_fix()
3002 rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1, in rtw8822c_coex_cfg_gnt_fix()
3004 rtw_write8_mask(rtwdev, REG_NOMASK_TXBT, in rtw8822c_coex_cfg_gnt_fix()
3007 rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1, in rtw8822c_coex_cfg_gnt_fix()
3012 rtw_write8_mask(rtwdev, REG_IGN_GNT_BT1, in rtw8822c_coex_cfg_gnt_fix()
3015 rtw_write8_mask(rtwdev, REG_NOMASK_TXBT, in rtw8822c_coex_cfg_gnt_fix()
3021 static void rtw8822c_coex_cfg_gnt_debug(struct rtw_dev *rtwdev) in rtw8822c_coex_cfg_gnt_debug() argument
3023 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT_BTGP_SPI_EN >> 16, 0); in rtw8822c_coex_cfg_gnt_debug()
3024 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT_BTGP_JTAG_EN >> 24, 0); in rtw8822c_coex_cfg_gnt_debug()
3025 rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT_FSPI_EN >> 16, 0); in rtw8822c_coex_cfg_gnt_debug()
3026 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 1, BIT_LED1DIS >> 8, 0); in rtw8822c_coex_cfg_gnt_debug()
3027 rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT_DBG_GNT_WL_BT >> 24, 0); in rtw8822c_coex_cfg_gnt_debug()
3030 static void rtw8822c_coex_cfg_rfe_type(struct rtw_dev *rtwdev) in rtw8822c_coex_cfg_rfe_type() argument
3032 struct rtw_coex *coex = &rtwdev->coex; in rtw8822c_coex_cfg_rfe_type()
3034 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw8822c_coex_cfg_rfe_type()
3036 coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option; in rtw8822c_coex_cfg_rfe_type()
3048 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0); in rtw8822c_coex_cfg_rfe_type()
3049 rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff); in rtw8822c_coex_cfg_rfe_type()
3050 rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff); in rtw8822c_coex_cfg_rfe_type()
3053 static void rtw8822c_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr) in rtw8822c_coex_cfg_wl_tx_power() argument
3055 struct rtw_coex *coex = &rtwdev->coex; in rtw8822c_coex_cfg_wl_tx_power()
3064 static void rtw8822c_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain) in rtw8822c_coex_cfg_wl_rx_gain() argument
3066 struct rtw_coex *coex = &rtwdev->coex; in rtw8822c_coex_cfg_wl_rx_gain()
3075 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table On!\n"); in rtw8822c_coex_cfg_wl_rx_gain()
3078 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, RFREG_MASK, 0x22); in rtw8822c_coex_cfg_wl_rx_gain()
3079 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, RFREG_MASK, 0x36); in rtw8822c_coex_cfg_wl_rx_gain()
3080 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, RFREG_MASK, 0x22); in rtw8822c_coex_cfg_wl_rx_gain()
3081 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, RFREG_MASK, 0x36); in rtw8822c_coex_cfg_wl_rx_gain()
3084 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table Off!\n"); in rtw8822c_coex_cfg_wl_rx_gain()
3087 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, RFREG_MASK, 0x20); in rtw8822c_coex_cfg_wl_rx_gain()
3088 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, RFREG_MASK, 0x0); in rtw8822c_coex_cfg_wl_rx_gain()
3089 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, RFREG_MASK, 0x20); in rtw8822c_coex_cfg_wl_rx_gain()
3090 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, RFREG_MASK, 0x0); in rtw8822c_coex_cfg_wl_rx_gain()
3094 static void rtw8822c_bf_enable_bfee_su(struct rtw_dev *rtwdev, in rtw8822c_bf_enable_bfee_su() argument
3101 rtw_bf_enable_bfee_su(rtwdev, vif, bfee); in rtw8822c_bf_enable_bfee_su()
3103 tmp6dc = rtw_read32(rtwdev, REG_BBPSF_CTRL) | in rtw8822c_bf_enable_bfee_su()
3107 rtw_write32(rtwdev, REG_BBPSF_CTRL, tmp6dc | BIT(12)); in rtw8822c_bf_enable_bfee_su()
3109 rtw_write32(rtwdev, REG_BBPSF_CTRL, tmp6dc & ~BIT(12)); in rtw8822c_bf_enable_bfee_su()
3111 rtw_write32(rtwdev, REG_CSI_RRSR, 0x550); in rtw8822c_bf_enable_bfee_su()
3114 static void rtw8822c_bf_config_bfee_su(struct rtw_dev *rtwdev, in rtw8822c_bf_config_bfee_su() argument
3119 rtw8822c_bf_enable_bfee_su(rtwdev, vif, bfee); in rtw8822c_bf_config_bfee_su()
3121 rtw_bf_remove_bfee_su(rtwdev, bfee); in rtw8822c_bf_config_bfee_su()
3124 static void rtw8822c_bf_config_bfee_mu(struct rtw_dev *rtwdev, in rtw8822c_bf_config_bfee_mu() argument
3129 rtw_bf_enable_bfee_mu(rtwdev, vif, bfee); in rtw8822c_bf_config_bfee_mu()
3131 rtw_bf_remove_bfee_mu(rtwdev, bfee); in rtw8822c_bf_config_bfee_mu()
3134 static void rtw8822c_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif, in rtw8822c_bf_config_bfee() argument
3138 rtw8822c_bf_config_bfee_su(rtwdev, vif, bfee, enable); in rtw8822c_bf_config_bfee()
3140 rtw8822c_bf_config_bfee_mu(rtwdev, vif, bfee, enable); in rtw8822c_bf_config_bfee()
3142 rtw_warn(rtwdev, "wrong bfee role\n"); in rtw8822c_bf_config_bfee()
3151 void rtw8822c_parse_tbl_dpk(struct rtw_dev *rtwdev, in rtw8822c_parse_tbl_dpk() argument
3160 rtw_write32_mask(rtwdev, p->addr, p->bitmask, p->data); in rtw8822c_parse_tbl_dpk()
3163 static void rtw8822c_dpk_set_gnt_wl(struct rtw_dev *rtwdev, bool is_before_k) in rtw8822c_dpk_set_gnt_wl() argument
3165 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_set_gnt_wl()
3168 dpk_info->gnt_control = rtw_read32(rtwdev, 0x70); in rtw8822c_dpk_set_gnt_wl()
3169 dpk_info->gnt_value = rtw_coex_read_indirect_reg(rtwdev, 0x38); in rtw8822c_dpk_set_gnt_wl()
3170 rtw_write32_mask(rtwdev, 0x70, BIT(26), 0x1); in rtw8822c_dpk_set_gnt_wl()
3171 rtw_coex_write_indirect_reg(rtwdev, 0x38, MASKBYTE1, 0x77); in rtw8822c_dpk_set_gnt_wl()
3173 rtw_coex_write_indirect_reg(rtwdev, 0x38, MASKDWORD, in rtw8822c_dpk_set_gnt_wl()
3175 rtw_write32(rtwdev, 0x70, dpk_info->gnt_control); in rtw8822c_dpk_set_gnt_wl()
3180 rtw8822c_dpk_restore_registers(struct rtw_dev *rtwdev, u32 reg_num, in rtw8822c_dpk_restore_registers() argument
3183 rtw_restore_reg(rtwdev, bckp, reg_num); in rtw8822c_dpk_restore_registers()
3184 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc); in rtw8822c_dpk_restore_registers()
3185 rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_DPD_CLK, 0x4); in rtw8822c_dpk_restore_registers()
3189 rtw8822c_dpk_backup_registers(struct rtw_dev *rtwdev, u32 *reg, in rtw8822c_dpk_backup_registers() argument
3197 bckp[i].val = rtw_read32(rtwdev, reg[i]); in rtw8822c_dpk_backup_registers()
3201 static void rtw8822c_dpk_backup_rf_registers(struct rtw_dev *rtwdev, in rtw8822c_dpk_backup_rf_registers() argument
3208 rf_reg_bak[i][RF_PATH_A] = rtw_read_rf(rtwdev, RF_PATH_A, in rtw8822c_dpk_backup_rf_registers()
3210 rf_reg_bak[i][RF_PATH_B] = rtw_read_rf(rtwdev, RF_PATH_B, in rtw8822c_dpk_backup_rf_registers()
3215 static void rtw8822c_dpk_reload_rf_registers(struct rtw_dev *rtwdev, in rtw8822c_dpk_reload_rf_registers() argument
3222 rtw_write_rf(rtwdev, RF_PATH_A, rf_reg[i], RFREG_MASK, in rtw8822c_dpk_reload_rf_registers()
3224 rtw_write_rf(rtwdev, RF_PATH_B, rf_reg[i], RFREG_MASK, in rtw8822c_dpk_reload_rf_registers()
3229 static void rtw8822c_dpk_information(struct rtw_dev *rtwdev) in rtw8822c_dpk_information() argument
3231 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_information()
3235 reg = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); in rtw8822c_dpk_information()
3243 static void rtw8822c_dpk_rxbb_dc_cal(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_rxbb_dc_cal() argument
3245 rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84800); in rtw8822c_dpk_rxbb_dc_cal()
3247 rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84801); in rtw8822c_dpk_rxbb_dc_cal()
3249 rtw_write_rf(rtwdev, path, 0x92, RFREG_MASK, 0x84800); in rtw8822c_dpk_rxbb_dc_cal()
3252 static u8 rtw8822c_dpk_dc_corr_check(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_dc_corr_check() argument
3257 rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000900f0); in rtw8822c_dpk_dc_corr_check()
3258 dc_i = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(27, 16)); in rtw8822c_dpk_dc_corr_check()
3259 dc_q = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(11, 0)); in rtw8822c_dpk_dc_corr_check()
3266 rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0); in rtw8822c_dpk_dc_corr_check()
3267 corr_idx = (u8)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(7, 0)); in rtw8822c_dpk_dc_corr_check()
3268 rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(15, 8)); in rtw8822c_dpk_dc_corr_check()
3277 static void rtw8822c_dpk_tx_pause(struct rtw_dev *rtwdev) in rtw8822c_dpk_tx_pause() argument
3282 rtw_write8(rtwdev, 0x522, 0xff); in rtw8822c_dpk_tx_pause()
3283 rtw_write32_mask(rtwdev, 0x1e70, 0xf, 0x2); in rtw8822c_dpk_tx_pause()
3286 reg_a = (u8)rtw_read_rf(rtwdev, RF_PATH_A, 0x00, 0xf0000); in rtw8822c_dpk_tx_pause()
3287 reg_b = (u8)rtw_read_rf(rtwdev, RF_PATH_B, 0x00, 0xf0000); in rtw8822c_dpk_tx_pause()
3293 static void rtw8822c_dpk_mac_bb_setting(struct rtw_dev *rtwdev) in rtw8822c_dpk_mac_bb_setting() argument
3295 rtw8822c_dpk_tx_pause(rtwdev); in rtw8822c_dpk_mac_bb_setting()
3296 rtw_load_table(rtwdev, &rtw8822c_dpk_mac_bb_tbl); in rtw8822c_dpk_mac_bb_setting()
3299 static void rtw8822c_dpk_afe_setting(struct rtw_dev *rtwdev, bool is_do_dpk) in rtw8822c_dpk_afe_setting() argument
3302 rtw_load_table(rtwdev, &rtw8822c_dpk_afe_is_dpk_tbl); in rtw8822c_dpk_afe_setting()
3304 rtw_load_table(rtwdev, &rtw8822c_dpk_afe_no_dpk_tbl); in rtw8822c_dpk_afe_setting()
3307 static void rtw8822c_dpk_pre_setting(struct rtw_dev *rtwdev) in rtw8822c_dpk_pre_setting() argument
3311 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_dpk_pre_setting()
3312 rtw_write_rf(rtwdev, path, RF_RXAGC_OFFSET, RFREG_MASK, 0x0); in rtw8822c_dpk_pre_setting()
3313 rtw_write32(rtwdev, REG_NCTL0, 0x8 | (path << 1)); in rtw8822c_dpk_pre_setting()
3314 if (rtwdev->dm_info.dpk_info.dpk_band == RTW_BAND_2G) in rtw8822c_dpk_pre_setting()
3315 rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f100000); in rtw8822c_dpk_pre_setting()
3317 rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f0d0000); in rtw8822c_dpk_pre_setting()
3318 rtw_write32_mask(rtwdev, REG_DPD_LUT0, BIT_GLOSS_DB, 0x4); in rtw8822c_dpk_pre_setting()
3319 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x3); in rtw8822c_dpk_pre_setting()
3321 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc); in rtw8822c_dpk_pre_setting()
3322 rtw_write32(rtwdev, REG_DPD_CTL11, 0x3b23170b); in rtw8822c_dpk_pre_setting()
3323 rtw_write32(rtwdev, REG_DPD_CTL12, 0x775f5347); in rtw8822c_dpk_pre_setting()
3326 static u32 rtw8822c_dpk_rf_setting(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_rf_setting() argument
3330 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x50017); in rtw8822c_dpk_rf_setting()
3331 ori_txbb = rtw_read_rf(rtwdev, path, RF_TX_GAIN, RFREG_MASK); in rtw8822c_dpk_rf_setting()
3333 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TX_GAIN, 0x1); in rtw8822c_dpk_rf_setting()
3334 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_PWR_TRIM, 0x1); in rtw8822c_dpk_rf_setting()
3335 rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_BB_GAIN, 0x0); in rtw8822c_dpk_rf_setting()
3336 rtw_write_rf(rtwdev, path, RF_TX_GAIN, RFREG_MASK, ori_txbb); in rtw8822c_dpk_rf_setting()
3338 if (rtwdev->dm_info.dpk_info.dpk_band == RTW_BAND_2G) { in rtw8822c_dpk_rf_setting()
3339 rtw_write_rf(rtwdev, path, RF_TX_GAIN_OFFSET, BIT_RF_GAIN, 0x1); in rtw8822c_dpk_rf_setting()
3340 rtw_write_rf(rtwdev, path, RF_RXG_GAIN, BIT_RXG_GAIN, 0x0); in rtw8822c_dpk_rf_setting()
3342 rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_TXA_LB_ATT, 0x0); in rtw8822c_dpk_rf_setting()
3343 rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_ATT, 0x6); in rtw8822c_dpk_rf_setting()
3344 rtw_write_rf(rtwdev, path, RF_TXA_LB_SW, BIT_LB_SW, 0x1); in rtw8822c_dpk_rf_setting()
3345 rtw_write_rf(rtwdev, path, RF_RXA_MIX_GAIN, BIT_RXA_MIX_GAIN, 0); in rtw8822c_dpk_rf_setting()
3348 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_RXAGC, 0xf); in rtw8822c_dpk_rf_setting()
3349 rtw_write_rf(rtwdev, path, RF_DEBUG, BIT_DE_TRXBW, 0x1); in rtw8822c_dpk_rf_setting()
3350 rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_RXBB, 0x0); in rtw8822c_dpk_rf_setting()
3352 if (rtwdev->dm_info.dpk_info.dpk_bw == DPK_CHANNEL_WIDTH_80) in rtw8822c_dpk_rf_setting()
3353 rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x2); in rtw8822c_dpk_rf_setting()
3355 rtw_write_rf(rtwdev, path, RF_BW_TRXBB, BIT_BW_TXBB, 0x1); in rtw8822c_dpk_rf_setting()
3357 rtw_write_rf(rtwdev, path, RF_EXT_TIA_BW, BIT(1), 0x1); in rtw8822c_dpk_rf_setting()
3364 static u16 rtw8822c_dpk_get_cmd(struct rtw_dev *rtwdev, u8 action, u8 path) in rtw8822c_dpk_get_cmd() argument
3367 u8 bw = rtwdev->dm_info.dpk_info.dpk_bw == DPK_CHANNEL_WIDTH_80 ? 2 : 0; in rtw8822c_dpk_get_cmd()
3389 static u8 rtw8822c_dpk_one_shot(struct rtw_dev *rtwdev, u8 path, u8 action) in rtw8822c_dpk_one_shot() argument
3394 rtw8822c_dpk_set_gnt_wl(rtwdev, true); in rtw8822c_dpk_one_shot()
3397 rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(12), 0x1); in rtw8822c_dpk_one_shot()
3398 rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(12), 0x0); in rtw8822c_dpk_one_shot()
3399 rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x0); in rtw8822c_dpk_one_shot()
3401 if (!check_hw_ready(rtwdev, REG_STAT_RPT, BIT(31), 0x1)) { in rtw8822c_dpk_one_shot()
3403 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] one-shot over 20ms\n"); in rtw8822c_dpk_one_shot()
3406 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, in rtw8822c_dpk_one_shot()
3408 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x9); in rtw8822c_dpk_one_shot()
3410 dpk_cmd = rtw8822c_dpk_get_cmd(rtwdev, action, path); in rtw8822c_dpk_one_shot()
3411 rtw_write32(rtwdev, REG_NCTL0, dpk_cmd); in rtw8822c_dpk_one_shot()
3412 rtw_write32(rtwdev, REG_NCTL0, dpk_cmd + 1); in rtw8822c_dpk_one_shot()
3414 if (!check_hw_ready(rtwdev, 0x2d9c, 0xff, 0x55)) { in rtw8822c_dpk_one_shot()
3416 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] one-shot over 20ms\n"); in rtw8822c_dpk_one_shot()
3418 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, in rtw8822c_dpk_one_shot()
3420 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x0); in rtw8822c_dpk_one_shot()
3423 rtw8822c_dpk_set_gnt_wl(rtwdev, false); in rtw8822c_dpk_one_shot()
3425 rtw_write8(rtwdev, 0x1b10, 0x0); in rtw8822c_dpk_one_shot()
3430 static u16 rtw8822c_dpk_dgain_read(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_dgain_read() argument
3434 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc); in rtw8822c_dpk_dgain_read()
3435 rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, 0x00ff0000, 0x0); in rtw8822c_dpk_dgain_read()
3437 dgain = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, GENMASK(27, 16)); in rtw8822c_dpk_dgain_read()
3442 static u8 rtw8822c_dpk_thermal_read(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_thermal_read() argument
3444 rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x1); in rtw8822c_dpk_thermal_read()
3445 rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x0); in rtw8822c_dpk_thermal_read()
3446 rtw_write_rf(rtwdev, path, RF_T_METER, BIT(19), 0x1); in rtw8822c_dpk_thermal_read()
3449 return (u8)rtw_read_rf(rtwdev, path, RF_T_METER, 0x0007e); in rtw8822c_dpk_thermal_read()
3452 static u32 rtw8822c_dpk_pas_read(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_pas_read() argument
3456 rtw_write32(rtwdev, REG_NCTL0, 0x8 | (path << 1)); in rtw8822c_dpk_pas_read()
3457 rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x0); in rtw8822c_dpk_pas_read()
3458 rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x00060001); in rtw8822c_dpk_pas_read()
3459 rtw_write32(rtwdev, 0x1b4c, 0x00000000); in rtw8822c_dpk_pas_read()
3460 rtw_write32(rtwdev, 0x1b4c, 0x00080000); in rtw8822c_dpk_pas_read()
3462 q_val = rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKHWORD); in rtw8822c_dpk_pas_read()
3463 i_val = rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKLWORD); in rtw8822c_dpk_pas_read()
3470 rtw_write32(rtwdev, 0x1b4c, 0x00000000); in rtw8822c_dpk_pas_read()
3501 static u8 rtw8822c_dpk_gainloss_result(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_gainloss_result() argument
3505 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1)); in rtw8822c_dpk_gainloss_result()
3506 rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x1); in rtw8822c_dpk_gainloss_result()
3507 rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x00060000); in rtw8822c_dpk_gainloss_result()
3509 result = (u8)rtw_read32_mask(rtwdev, REG_STAT_RPT, 0x000000f0); in rtw8822c_dpk_gainloss_result()
3511 rtw_write32_mask(rtwdev, 0x1b48, BIT(14), 0x0); in rtw8822c_dpk_gainloss_result()
3516 static u8 rtw8822c_dpk_agc_gain_chk(struct rtw_dev *rtwdev, u8 path, in rtw8822c_dpk_agc_gain_chk() argument
3522 rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC); in rtw8822c_dpk_agc_gain_chk()
3523 dgain = rtw8822c_dpk_dgain_read(rtwdev, path); in rtw8822c_dpk_agc_gain_chk()
3533 static u8 rtw8822c_dpk_agc_loss_chk(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_agc_loss_chk() argument
3537 loss = rtw8822c_dpk_pas_read(rtwdev, path); in rtw8822c_dpk_agc_loss_chk()
3560 static u8 rtw8822c_gain_check_state(struct rtw_dev *rtwdev, in rtw8822c_gain_check_state() argument
3565 data->txbb = (u8)rtw_read_rf(rtwdev, data->path, RF_TX_GAIN, in rtw8822c_gain_check_state()
3567 data->pga = (u8)rtw_read_rf(rtwdev, data->path, RF_MODE_TRXAGC, in rtw8822c_gain_check_state()
3575 state = rtw8822c_dpk_agc_gain_chk(rtwdev, data->path, in rtw8822c_gain_check_state()
3590 static u8 rtw8822c_gain_large_state(struct rtw_dev *rtwdev, in rtw8822c_gain_large_state() argument
3596 rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xc); in rtw8822c_gain_large_state()
3598 rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0x0); in rtw8822c_gain_large_state()
3605 static u8 rtw8822c_gain_less_state(struct rtw_dev *rtwdev, in rtw8822c_gain_less_state() argument
3611 rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xc); in rtw8822c_gain_less_state()
3613 rtw_write_rf(rtwdev, data->path, RF_MODE_TRXAGC, BIT_RXAGC, 0xf); in rtw8822c_gain_less_state()
3620 static u8 rtw8822c_gl_state(struct rtw_dev *rtwdev, in rtw8822c_gl_state() argument
3633 rtw_write_rf(rtwdev, data->path, RF_TX_GAIN, BIT_GAIN_TXBB, data->txbb); in rtw8822c_gl_state()
3639 static u8 rtw8822c_gl_large_state(struct rtw_dev *rtwdev, in rtw8822c_gl_large_state() argument
3642 return rtw8822c_gl_state(rtwdev, data, 1); in rtw8822c_gl_large_state()
3645 static u8 rtw8822c_gl_less_state(struct rtw_dev *rtwdev, in rtw8822c_gl_less_state() argument
3648 return rtw8822c_gl_state(rtwdev, data, 0); in rtw8822c_gl_less_state()
3651 static u8 rtw8822c_loss_check_state(struct rtw_dev *rtwdev, in rtw8822c_loss_check_state() argument
3657 rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_GAIN_LOSS); in rtw8822c_loss_check_state()
3658 state = rtw8822c_dpk_agc_loss_chk(rtwdev, path); in rtw8822c_loss_check_state()
3663 static u8 (*dpk_state[])(struct rtw_dev *rtwdev,
3669 static u8 rtw8822c_dpk_pas_agc(struct rtw_dev *rtwdev, u8 path, in rtw8822c_dpk_pas_agc() argument
3673 u8 (*func)(struct rtw_dev *rtwdev, struct rtw8822c_dpk_data *data); in rtw8822c_dpk_pas_agc()
3682 state = func(rtwdev, &data); in rtw8822c_dpk_pas_agc()
3690 static bool rtw8822c_dpk_coef_iq_check(struct rtw_dev *rtwdev, in rtw8822c_dpk_coef_iq_check() argument
3700 static u32 rtw8822c_dpk_coef_transfer(struct rtw_dev *rtwdev) in rtw8822c_dpk_coef_transfer() argument
3705 reg = rtw_read32(rtwdev, REG_STAT_RPT); in rtw8822c_dpk_coef_transfer()
3707 coef_i = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKHWORD) & 0x1fff; in rtw8822c_dpk_coef_transfer()
3708 coef_q = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, MASKLWORD) & 0x1fff; in rtw8822c_dpk_coef_transfer()
3724 static void rtw8822c_dpk_coef_tbl_apply(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_coef_tbl_apply() argument
3726 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_coef_tbl_apply()
3730 rtw_write32(rtwdev, REG_RXSRAM_CTL, in rtw8822c_dpk_coef_tbl_apply()
3732 dpk_info->coef[path][i] = rtw8822c_dpk_coef_transfer(rtwdev); in rtw8822c_dpk_coef_tbl_apply()
3736 static void rtw8822c_dpk_get_coef(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_get_coef() argument
3738 rtw_write32(rtwdev, REG_NCTL0, 0x0000000c); in rtw8822c_dpk_get_coef()
3741 rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(24), 0x0); in rtw8822c_dpk_get_coef()
3742 rtw_write32(rtwdev, REG_DPD_CTL0_S0, 0x30000080); in rtw8822c_dpk_get_coef()
3744 rtw_write32_mask(rtwdev, REG_DPD_CTL0, BIT(24), 0x1); in rtw8822c_dpk_get_coef()
3745 rtw_write32(rtwdev, REG_DPD_CTL0_S1, 0x30000080); in rtw8822c_dpk_get_coef()
3748 rtw8822c_dpk_coef_tbl_apply(rtwdev, path); in rtw8822c_dpk_get_coef()
3751 static u8 rtw8822c_dpk_coef_read(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_coef_read() argument
3753 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_coef_read()
3761 if (rtw8822c_dpk_coef_iq_check(rtwdev, coef_i, coef_q)) { in rtw8822c_dpk_coef_read()
3769 static void rtw8822c_dpk_coef_write(struct rtw_dev *rtwdev, u8 path, u8 result) in rtw8822c_dpk_coef_write() argument
3771 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_coef_write()
3776 rtw_write32(rtwdev, REG_NCTL0, 0x0000000c); in rtw8822c_dpk_coef_write()
3777 rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0); in rtw8822c_dpk_coef_write()
3788 rtw_write32(rtwdev, reg[path] + addr * 4, coef); in rtw8822c_dpk_coef_write()
3792 static void rtw8822c_dpk_fill_result(struct rtw_dev *rtwdev, u32 dpk_txagc, in rtw8822c_dpk_fill_result() argument
3795 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_fill_result()
3797 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1)); in rtw8822c_dpk_fill_result()
3800 rtw_write8(rtwdev, REG_DPD_AGC, (u8)(dpk_txagc - 6)); in rtw8822c_dpk_fill_result()
3802 rtw_write8(rtwdev, REG_DPD_AGC, 0x00); in rtw8822c_dpk_fill_result()
3805 dpk_info->dpk_txagc[path] = rtw_read8(rtwdev, REG_DPD_AGC); in rtw8822c_dpk_fill_result()
3807 rtw8822c_dpk_coef_write(rtwdev, path, result); in rtw8822c_dpk_fill_result()
3810 static u32 rtw8822c_dpk_gainloss(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_gainloss() argument
3812 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_gainloss()
3815 ori_txbb = rtw8822c_dpk_rf_setting(rtwdev, path); in rtw8822c_dpk_gainloss()
3816 ori_txagc = (u8)rtw_read_rf(rtwdev, path, RF_MODE_TRXAGC, BIT_TXAGC); in rtw8822c_dpk_gainloss()
3818 rtw8822c_dpk_rxbb_dc_cal(rtwdev, path); in rtw8822c_dpk_gainloss()
3819 rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC); in rtw8822c_dpk_gainloss()
3820 rtw8822c_dpk_dgain_read(rtwdev, path); in rtw8822c_dpk_gainloss()
3822 if (rtw8822c_dpk_dc_corr_check(rtwdev, path)) { in rtw8822c_dpk_gainloss()
3823 rtw8822c_dpk_rxbb_dc_cal(rtwdev, path); in rtw8822c_dpk_gainloss()
3824 rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DAGC); in rtw8822c_dpk_gainloss()
3825 rtw8822c_dpk_dc_corr_check(rtwdev, path); in rtw8822c_dpk_gainloss()
3828 t1 = rtw8822c_dpk_thermal_read(rtwdev, path); in rtw8822c_dpk_gainloss()
3829 tx_bb = rtw8822c_dpk_pas_agc(rtwdev, path, false, true); in rtw8822c_dpk_gainloss()
3830 tx_agc_search = rtw8822c_dpk_gainloss_result(rtwdev, path); in rtw8822c_dpk_gainloss()
3837 rtw_write_rf(rtwdev, path, RF_TX_GAIN, BIT_GAIN_TXBB, tx_bb); in rtw8822c_dpk_gainloss()
3841 t2 = rtw8822c_dpk_thermal_read(rtwdev, path); in rtw8822c_dpk_gainloss()
3848 static u8 rtw8822c_dpk_by_path(struct rtw_dev *rtwdev, u32 tx_agc, u8 path) in rtw8822c_dpk_by_path() argument
3852 result = rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DO_DPK); in rtw8822c_dpk_by_path()
3854 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1)); in rtw8822c_dpk_by_path()
3856 result = result | (u8)rtw_read32_mask(rtwdev, REG_DPD_CTL1_S0, BIT(26)); in rtw8822c_dpk_by_path()
3858 rtw_write_rf(rtwdev, path, RF_MODE_TRXAGC, RFREG_MASK, 0x33e14); in rtw8822c_dpk_by_path()
3860 rtw8822c_dpk_get_coef(rtwdev, path); in rtw8822c_dpk_by_path()
3865 static void rtw8822c_dpk_cal_gs(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_cal_gs() argument
3867 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_cal_gs()
3870 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1)); in rtw8822c_dpk_cal_gs()
3871 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_BYPASS_DPD, 0x0); in rtw8822c_dpk_cal_gs()
3872 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0); in rtw8822c_dpk_cal_gs()
3873 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x9); in rtw8822c_dpk_cal_gs()
3874 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_INNER_LB, 0x1); in rtw8822c_dpk_cal_gs()
3875 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc); in rtw8822c_dpk_cal_gs()
3876 rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_DPD_CLK, 0xf); in rtw8822c_dpk_cal_gs()
3879 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, in rtw8822c_dpk_cal_gs()
3881 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_DPD_EN, 0x1); in rtw8822c_dpk_cal_gs()
3883 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, in rtw8822c_dpk_cal_gs()
3885 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, BIT_DPD_EN, 0x1); in rtw8822c_dpk_cal_gs()
3889 rtw_write32(rtwdev, REG_DPD_CTL16, 0x80001310); in rtw8822c_dpk_cal_gs()
3890 rtw_write32(rtwdev, REG_DPD_CTL16, 0x00001310); in rtw8822c_dpk_cal_gs()
3891 rtw_write32(rtwdev, REG_DPD_CTL16, 0x810000db); in rtw8822c_dpk_cal_gs()
3892 rtw_write32(rtwdev, REG_DPD_CTL16, 0x010000db); in rtw8822c_dpk_cal_gs()
3893 rtw_write32(rtwdev, REG_DPD_CTL16, 0x0000b428); in rtw8822c_dpk_cal_gs()
3894 rtw_write32(rtwdev, REG_DPD_CTL15, in rtw8822c_dpk_cal_gs()
3897 rtw_write32(rtwdev, REG_DPD_CTL16, 0x8200190c); in rtw8822c_dpk_cal_gs()
3898 rtw_write32(rtwdev, REG_DPD_CTL16, 0x0200190c); in rtw8822c_dpk_cal_gs()
3899 rtw_write32(rtwdev, REG_DPD_CTL16, 0x8301ee14); in rtw8822c_dpk_cal_gs()
3900 rtw_write32(rtwdev, REG_DPD_CTL16, 0x0301ee14); in rtw8822c_dpk_cal_gs()
3901 rtw_write32(rtwdev, REG_DPD_CTL16, 0x0000b428); in rtw8822c_dpk_cal_gs()
3902 rtw_write32(rtwdev, REG_DPD_CTL15, in rtw8822c_dpk_cal_gs()
3906 rtw_write32_mask(rtwdev, REG_DPD_CTL0, MASKBYTE3, 0x8 | path); in rtw8822c_dpk_cal_gs()
3908 rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_CAL_PWR); in rtw8822c_dpk_cal_gs()
3910 rtw_write32_mask(rtwdev, REG_DPD_CTL15, MASKBYTE3, 0x0); in rtw8822c_dpk_cal_gs()
3911 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1)); in rtw8822c_dpk_cal_gs()
3912 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_IQ_SWITCH, 0x0); in rtw8822c_dpk_cal_gs()
3913 rtw_write32_mask(rtwdev, REG_R_CONFIG, BIT_INNER_LB, 0x0); in rtw8822c_dpk_cal_gs()
3914 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc); in rtw8822c_dpk_cal_gs()
3917 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, 0x5b); in rtw8822c_dpk_cal_gs()
3919 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, 0x5b); in rtw8822c_dpk_cal_gs()
3921 rtw_write32_mask(rtwdev, REG_RXSRAM_CTL, BIT_RPT_SEL, 0x0); in rtw8822c_dpk_cal_gs()
3923 tmp_gs = (u16)rtw_read32_mask(rtwdev, REG_STAT_RPT, BIT_RPT_DGAIN); in rtw8822c_dpk_cal_gs()
3928 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, tmp_gs); in rtw8822c_dpk_cal_gs()
3930 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, tmp_gs); in rtw8822c_dpk_cal_gs()
3935 static void rtw8822c_dpk_cal_coef1(struct rtw_dev *rtwdev) in rtw8822c_dpk_cal_coef1() argument
3937 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_cal_coef1()
3942 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c); in rtw8822c_dpk_cal_coef1()
3943 rtw_write32(rtwdev, REG_RXSRAM_CTL, 0x000000f0); in rtw8822c_dpk_cal_coef1()
3944 rtw_write32(rtwdev, REG_NCTL0, 0x00001148); in rtw8822c_dpk_cal_coef1()
3945 rtw_write32(rtwdev, REG_NCTL0, 0x00001149); in rtw8822c_dpk_cal_coef1()
3947 check_hw_ready(rtwdev, 0x2d9c, MASKBYTE0, 0x55); in rtw8822c_dpk_cal_coef1()
3949 rtw_write8(rtwdev, 0x1b10, 0x0); in rtw8822c_dpk_cal_coef1()
3950 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x0000000c); in rtw8822c_dpk_cal_coef1()
3952 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_dpk_cal_coef1()
3955 rtw_write32_mask(rtwdev, 0x1b18 + offset[path], MASKHWORD, in rtw8822c_dpk_cal_coef1()
3957 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path], in rtw8822c_dpk_cal_coef1()
3959 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path], in rtw8822c_dpk_cal_coef1()
3961 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0 + offset[path], in rtw8822c_dpk_cal_coef1()
3963 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0 + offset[path], in rtw8822c_dpk_cal_coef1()
3968 static void rtw8822c_dpk_on(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_on() argument
3970 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_on()
3972 rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DPK_ON); in rtw8822c_dpk_on()
3974 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0x8 | (path << 1)); in rtw8822c_dpk_on()
3975 rtw_write32_mask(rtwdev, REG_IQK_CTL1, BIT_TX_CFIR, 0x0); in rtw8822c_dpk_on()
3978 rtw8822c_dpk_cal_gs(rtwdev, path); in rtw8822c_dpk_on()
3981 static bool rtw8822c_dpk_check_pass(struct rtw_dev *rtwdev, bool is_fail, in rtw8822c_dpk_check_pass() argument
3987 if (rtw8822c_dpk_coef_read(rtwdev, path)) in rtw8822c_dpk_check_pass()
3995 rtw8822c_dpk_fill_result(rtwdev, dpk_txagc, path, result); in rtw8822c_dpk_check_pass()
4000 static void rtw8822c_dpk_result_reset(struct rtw_dev *rtwdev) in rtw8822c_dpk_result_reset() argument
4002 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_result_reset()
4005 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_dpk_result_reset()
4007 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, in rtw8822c_dpk_result_reset()
4009 rtw_write32_mask(rtwdev, 0x1b58, 0x0000007f, 0x0); in rtw8822c_dpk_result_reset()
4015 dpk_info->thermal_dpk[path] = rtw8822c_dpk_thermal_read(rtwdev, in rtw8822c_dpk_result_reset()
4020 static void rtw8822c_dpk_calibrate(struct rtw_dev *rtwdev, u8 path) in rtw8822c_dpk_calibrate() argument
4022 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_calibrate()
4026 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] s%d dpk start\n", path); in rtw8822c_dpk_calibrate()
4028 dpk_txagc = rtw8822c_dpk_gainloss(rtwdev, path); in rtw8822c_dpk_calibrate()
4030 dpk_fail = rtw8822c_dpk_by_path(rtwdev, dpk_txagc, path); in rtw8822c_dpk_calibrate()
4032 if (!rtw8822c_dpk_check_pass(rtwdev, dpk_fail, dpk_txagc, path)) in rtw8822c_dpk_calibrate()
4033 rtw_err(rtwdev, "failed to do dpk calibration\n"); in rtw8822c_dpk_calibrate()
4035 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] s%d dpk finish\n", path); in rtw8822c_dpk_calibrate()
4041 static void rtw8822c_dpk_path_select(struct rtw_dev *rtwdev) in rtw8822c_dpk_path_select() argument
4043 rtw8822c_dpk_calibrate(rtwdev, RF_PATH_A); in rtw8822c_dpk_path_select()
4044 rtw8822c_dpk_calibrate(rtwdev, RF_PATH_B); in rtw8822c_dpk_path_select()
4045 rtw8822c_dpk_on(rtwdev, RF_PATH_A); in rtw8822c_dpk_path_select()
4046 rtw8822c_dpk_on(rtwdev, RF_PATH_B); in rtw8822c_dpk_path_select()
4047 rtw8822c_dpk_cal_coef1(rtwdev); in rtw8822c_dpk_path_select()
4050 static void rtw8822c_dpk_enable_disable(struct rtw_dev *rtwdev) in rtw8822c_dpk_enable_disable() argument
4052 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_enable_disable()
4055 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc); in rtw8822c_dpk_enable_disable()
4057 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, BIT_DPD_EN, in rtw8822c_dpk_enable_disable()
4059 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, BIT_DPD_EN, in rtw8822c_dpk_enable_disable()
4063 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S0, mask, 0x0); in rtw8822c_dpk_enable_disable()
4064 rtw_write8(rtwdev, REG_DPD_CTL0_S0, dpk_info->dpk_gs[RF_PATH_A]); in rtw8822c_dpk_enable_disable()
4067 rtw_write32_mask(rtwdev, REG_DPD_CTL1_S1, mask, 0x0); in rtw8822c_dpk_enable_disable()
4068 rtw_write8(rtwdev, REG_DPD_CTL0_S1, dpk_info->dpk_gs[RF_PATH_B]); in rtw8822c_dpk_enable_disable()
4072 static void rtw8822c_dpk_reload_data(struct rtw_dev *rtwdev) in rtw8822c_dpk_reload_data() argument
4074 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_reload_data()
4082 for (path = 0; path < rtwdev->hal.rf_path_num; path++) { in rtw8822c_dpk_reload_data()
4083 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, in rtw8822c_dpk_reload_data()
4086 rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f100000); in rtw8822c_dpk_reload_data()
4088 rtw_write32(rtwdev, REG_DPD_CTL1_S1, 0x1f0d0000); in rtw8822c_dpk_reload_data()
4090 rtw_write8(rtwdev, REG_DPD_AGC, dpk_info->dpk_txagc[path]); in rtw8822c_dpk_reload_data()
4092 rtw8822c_dpk_coef_write(rtwdev, path, in rtw8822c_dpk_reload_data()
4095 rtw8822c_dpk_one_shot(rtwdev, path, RTW_DPK_DPK_ON); in rtw8822c_dpk_reload_data()
4097 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, 0xc); in rtw8822c_dpk_reload_data()
4100 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S0, BIT_GS_PWSF, in rtw8822c_dpk_reload_data()
4103 rtw_write32_mask(rtwdev, REG_DPD_CTL0_S1, BIT_GS_PWSF, in rtw8822c_dpk_reload_data()
4106 rtw8822c_dpk_cal_coef1(rtwdev); in rtw8822c_dpk_reload_data()
4109 static bool rtw8822c_dpk_reload(struct rtw_dev *rtwdev) in rtw8822c_dpk_reload() argument
4111 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_reload()
4116 channel = (u8)(rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK) & 0xff); in rtw8822c_dpk_reload()
4119 rtw_dbg(rtwdev, RTW_DBG_RFK, in rtw8822c_dpk_reload()
4121 rtw8822c_dpk_reload_data(rtwdev); in rtw8822c_dpk_reload()
4128 static void rtw8822c_do_dpk(struct rtw_dev *rtwdev) in rtw8822c_do_dpk() argument
4130 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_do_dpk()
4142 rtw_dbg(rtwdev, RTW_DBG_RFK, "[DPK] Skip DPK due to DPD PWR off\n"); in rtw8822c_do_dpk()
4144 } else if (rtw8822c_dpk_reload(rtwdev)) { in rtw8822c_do_dpk()
4151 rtw8822c_dpk_information(rtwdev); in rtw8822c_do_dpk()
4153 rtw8822c_dpk_backup_registers(rtwdev, bb_reg, DPK_BB_REG_NUM, bckp); in rtw8822c_do_dpk()
4154 rtw8822c_dpk_backup_rf_registers(rtwdev, rf_reg, rf_reg_backup); in rtw8822c_do_dpk()
4156 rtw8822c_dpk_mac_bb_setting(rtwdev); in rtw8822c_do_dpk()
4157 rtw8822c_dpk_afe_setting(rtwdev, true); in rtw8822c_do_dpk()
4158 rtw8822c_dpk_pre_setting(rtwdev); in rtw8822c_do_dpk()
4159 rtw8822c_dpk_result_reset(rtwdev); in rtw8822c_do_dpk()
4160 rtw8822c_dpk_path_select(rtwdev); in rtw8822c_do_dpk()
4161 rtw8822c_dpk_afe_setting(rtwdev, false); in rtw8822c_do_dpk()
4162 rtw8822c_dpk_enable_disable(rtwdev); in rtw8822c_do_dpk()
4164 rtw8822c_dpk_reload_rf_registers(rtwdev, rf_reg, rf_reg_backup); in rtw8822c_do_dpk()
4165 for (path = 0; path < rtwdev->hal.rf_path_num; path++) in rtw8822c_do_dpk()
4166 rtw8822c_dpk_rxbb_dc_cal(rtwdev, path); in rtw8822c_do_dpk()
4167 rtw8822c_dpk_restore_registers(rtwdev, DPK_BB_REG_NUM, bckp); in rtw8822c_do_dpk()
4170 static void rtw8822c_phy_calibration(struct rtw_dev *rtwdev) in rtw8822c_phy_calibration() argument
4172 rtw8822c_rfk_power_save(rtwdev, false); in rtw8822c_phy_calibration()
4173 rtw8822c_do_gapk(rtwdev); in rtw8822c_phy_calibration()
4174 rtw8822c_do_iqk(rtwdev); in rtw8822c_phy_calibration()
4175 rtw8822c_do_dpk(rtwdev); in rtw8822c_phy_calibration()
4176 rtw8822c_rfk_power_save(rtwdev, true); in rtw8822c_phy_calibration()
4179 static void rtw8822c_dpk_track(struct rtw_dev *rtwdev) in rtw8822c_dpk_track() argument
4181 struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info; in rtw8822c_dpk_track()
4190 thermal_value[path] = rtw8822c_dpk_thermal_read(rtwdev, path); in rtw8822c_dpk_track()
4202 rtw_write32_mask(rtwdev, REG_NCTL0, BIT_SUBPAGE, in rtw8822c_dpk_track()
4204 rtw_write32_mask(rtwdev, 0x1b58, GENMASK(6, 0), in rtw8822c_dpk_track()
4212 static void rtw8822c_set_crystal_cap_reg(struct rtw_dev *rtwdev, u8 crystal_cap) in rtw8822c_set_crystal_cap_reg() argument
4214 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_set_crystal_cap_reg()
4220 rtw_write32_mask(rtwdev, REG_ANAPAR_XTAL_0, BIT_XCAP_0, val); in rtw8822c_set_crystal_cap_reg()
4223 static void rtw8822c_set_crystal_cap(struct rtw_dev *rtwdev, u8 crystal_cap) in rtw8822c_set_crystal_cap() argument
4225 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_set_crystal_cap()
4231 rtw8822c_set_crystal_cap_reg(rtwdev, crystal_cap); in rtw8822c_set_crystal_cap()
4234 static void rtw8822c_cfo_tracking_reset(struct rtw_dev *rtwdev) in rtw8822c_cfo_tracking_reset() argument
4236 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_cfo_tracking_reset()
4241 if (cfo->crystal_cap > rtwdev->efuse.crystal_cap) in rtw8822c_cfo_tracking_reset()
4242 rtw8822c_set_crystal_cap(rtwdev, cfo->crystal_cap - 1); in rtw8822c_cfo_tracking_reset()
4243 else if (cfo->crystal_cap < rtwdev->efuse.crystal_cap) in rtw8822c_cfo_tracking_reset()
4244 rtw8822c_set_crystal_cap(rtwdev, cfo->crystal_cap + 1); in rtw8822c_cfo_tracking_reset()
4247 static void rtw8822c_cfo_init(struct rtw_dev *rtwdev) in rtw8822c_cfo_init() argument
4249 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_cfo_init()
4252 cfo->crystal_cap = rtwdev->efuse.crystal_cap; in rtw8822c_cfo_init()
4257 static s32 rtw8822c_cfo_calc_avg(struct rtw_dev *rtwdev, u8 path_num) in rtw8822c_cfo_calc_avg() argument
4259 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_cfo_calc_avg()
4283 static void rtw8822c_cfo_need_adjust(struct rtw_dev *rtwdev, s32 cfo_avg) in rtw8822c_cfo_need_adjust() argument
4285 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_cfo_need_adjust()
4296 if (!rtw_coex_disabled(rtwdev)) { in rtw8822c_cfo_need_adjust()
4298 rtw8822c_set_crystal_cap(rtwdev, rtwdev->efuse.crystal_cap); in rtw8822c_cfo_need_adjust()
4302 static void rtw8822c_cfo_track(struct rtw_dev *rtwdev) in rtw8822c_cfo_track() argument
4304 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_cfo_track()
4306 u8 path_num = rtwdev->hal.rf_path_num; in rtw8822c_cfo_track()
4310 if (rtwdev->sta_cnt != 1) { in rtw8822c_cfo_track()
4311 rtw8822c_cfo_tracking_reset(rtwdev); in rtw8822c_cfo_track()
4319 cfo_avg = rtw8822c_cfo_calc_avg(rtwdev, path_num); in rtw8822c_cfo_track()
4320 rtw8822c_cfo_need_adjust(rtwdev, cfo_avg); in rtw8822c_cfo_track()
4329 rtw8822c_set_crystal_cap(rtwdev, (u8)crystal_cap); in rtw8822c_cfo_track()
4350 rtw8822c_phy_cck_pd_set_reg(struct rtw_dev *rtwdev, in rtw8822c_phy_cck_pd_set_reg() argument
4358 pd = rtw_read32_mask(rtwdev, in rtw8822c_phy_cck_pd_set_reg()
4361 cs = rtw_read32_mask(rtwdev, in rtw8822c_phy_cck_pd_set_reg()
4372 rtw_write32_mask(rtwdev, in rtw8822c_phy_cck_pd_set_reg()
4376 rtw_write32_mask(rtwdev, in rtw8822c_phy_cck_pd_set_reg()
4381 rtw_dbg(rtwdev, RTW_DBG_PHY, in rtw8822c_phy_cck_pd_set_reg()
4383 rtw_is_assoc(rtwdev), bw, nrx, cs, pd); in rtw8822c_phy_cck_pd_set_reg()
4386 static void rtw8822c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl) in rtw8822c_phy_cck_pd_set() argument
4388 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_phy_cck_pd_set()
4394 nrx = (u8)rtw_read32_mask(rtwdev, 0x1a2c, 0x60000); in rtw8822c_phy_cck_pd_set()
4395 bw = (u8)rtw_read32_mask(rtwdev, 0x9b0, 0xc); in rtw8822c_phy_cck_pd_set()
4397 rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d) bw=%d nr=%d cck_fa_avg=%d\n", in rtw8822c_phy_cck_pd_set()
4409 rtw8822c_phy_cck_pd_set_reg(rtwdev, in rtw8822c_phy_cck_pd_set()
4417 static void rtw8822c_pwrtrack_set(struct rtw_dev *rtwdev, u8 rf_path) in rtw8822c_pwrtrack_set() argument
4419 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_pwrtrack_set()
4423 rtw_write32_mask(rtwdev, 0x18a0, PWR_TRACK_MASK, in rtw8822c_pwrtrack_set()
4427 rtw_write32_mask(rtwdev, 0x41a0, PWR_TRACK_MASK, in rtw8822c_pwrtrack_set()
4435 static void rtw8822c_pwr_track_stats(struct rtw_dev *rtwdev, u8 path) in rtw8822c_pwr_track_stats() argument
4439 if (rtwdev->efuse.thermal_meter[path] == 0xff) in rtw8822c_pwr_track_stats()
4442 thermal_value = rtw_read_rf(rtwdev, path, RF_T_METER, 0x7e); in rtw8822c_pwr_track_stats()
4443 rtw_phy_pwrtrack_avg(rtwdev, thermal_value, path); in rtw8822c_pwr_track_stats()
4446 static void rtw8822c_pwr_track_path(struct rtw_dev *rtwdev, in rtw8822c_pwr_track_path() argument
4450 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_pwr_track_path()
4453 delta = rtw_phy_pwrtrack_get_delta(rtwdev, path); in rtw8822c_pwr_track_path()
4455 rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table, path, path, in rtw8822c_pwr_track_path()
4457 rtw8822c_pwrtrack_set(rtwdev, path); in rtw8822c_pwr_track_path()
4460 static void __rtw8822c_pwr_track(struct rtw_dev *rtwdev) in __rtw8822c_pwr_track() argument
4465 rtw_phy_config_swing_table(rtwdev, &swing_table); in __rtw8822c_pwr_track()
4467 for (i = 0; i < rtwdev->hal.rf_path_num; i++) in __rtw8822c_pwr_track()
4468 rtw8822c_pwr_track_stats(rtwdev, i); in __rtw8822c_pwr_track()
4469 if (rtw_phy_pwrtrack_need_lck(rtwdev)) in __rtw8822c_pwr_track()
4470 rtw8822c_do_lck(rtwdev); in __rtw8822c_pwr_track()
4471 for (i = 0; i < rtwdev->hal.rf_path_num; i++) in __rtw8822c_pwr_track()
4472 rtw8822c_pwr_track_path(rtwdev, &swing_table, i); in __rtw8822c_pwr_track()
4475 static void rtw8822c_pwr_track(struct rtw_dev *rtwdev) in rtw8822c_pwr_track() argument
4477 struct rtw_efuse *efuse = &rtwdev->efuse; in rtw8822c_pwr_track()
4478 struct rtw_dm_info *dm_info = &rtwdev->dm_info; in rtw8822c_pwr_track()
4484 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x01); in rtw8822c_pwr_track()
4485 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x00); in rtw8822c_pwr_track()
4486 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, BIT(19), 0x01); in rtw8822c_pwr_track()
4488 rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x01); in rtw8822c_pwr_track()
4489 rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x00); in rtw8822c_pwr_track()
4490 rtw_write_rf(rtwdev, RF_PATH_B, RF_T_METER, BIT(19), 0x01); in rtw8822c_pwr_track()
4496 __rtw8822c_pwr_track(rtwdev); in rtw8822c_pwr_track()