1 /******************************************************************************
3 * Copyright(c) 2016 - 2017 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 *****************************************************************************/
16 #include "mp_precomp.h"
17 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
18 #if RT_PLATFORM == PLATFORM_MACOSX
19 #include "phydm_precomp.h"
21 #include "../phydm_precomp.h"
24 #include "../../phydm_precomp.h"
27 #if (RTL8821C_SUPPORT == 1)
28 /*---------------------------Define Local Constant---------------------------*/
30 static u32 dpk_result[DPK_BACKUP_REG_NUM_8821C];
31 static boolean txgap_done[3] = {false, false, false};
32 static boolean overflowflag;
33 #define dpk_forcein_sram4 1
34 #define txgap_ref_index 0x0
35 #define txgap_k_number 0x7
37 /*---------------------------Define Local Constant---------------------------*/
38 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
39 void do_iqk_8821c(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
42 struct dm_struct *dm = (struct dm_struct *)dm_void;
43 struct dm_iqk_info *iqk_info = &dm->IQK_info;
45 dm->rf_calibrate_info.thermal_value_iqk = thermal_value;
46 halrf_segment_iqk_trigger(dm, true, iqk_info->segment_iqk);
49 /*Originally config->do_iqk is hooked phy_iq_calibrate_8821c, but do_iqk_8821c and phy_iq_calibrate_8821c have different arguments*/
50 void do_iqk_8821c(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
53 struct dm_struct *dm = (struct dm_struct *)dm_void;
54 struct dm_iqk_info *iqk_info = &dm->IQK_info;
55 /*boolean is_recovery = (boolean) delta_thermal_index;*/
56 halrf_segment_iqk_trigger(dm, true, iqk_info->segment_iqk);
59 void do_dpk_8821c(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
62 struct dm_struct *dm = (struct dm_struct *)dm_void;
63 /*boolean is_recovery = (boolean) delta_thermal_index;*/
64 phy_dp_calibrate_8821c(dm, true);
68 _iqk_check_nctl_done_8821c(struct dm_struct *dm, u8 path, u32 IQK_CMD)
70 /*this function is only used after the version of nctl8.0*/
71 boolean notready = true;
73 u32 delay_count = 0x0;
76 if ((IQK_CMD & 0x00000f00) >> 8 == 0xc) {
77 if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) == 0x1a3b5)
82 if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) == 0x12345)
92 fail = (boolean)odm_get_bb_reg(dm, R_0x1b08, BIT(26));
94 RF_DBG(dm, DBG_RF_IQK,
95 "[IQK](1)IQK_CMD =0x%x, Fail, 0x1b08=0x%x, RF08=0x%x, 1b00=0x%x,fail=0x%x, notready=0x%x!!!\n",
96 IQK_CMD, odm_read_4byte(dm, 0x1b08),
97 odm_get_rf_reg(dm, path, RF_0x08,
99 odm_read_4byte(dm, 0x1b00), fail,
104 if (delay_count >= 50) {
105 RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d IQK timeout!!!\n",
110 odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
113 RF_DBG(dm, DBG_RF_IQK,
114 "[IQK]IQK_CMD =0x%x, delay_count =0x%x RF0x08=0x%x, 0x1b08=0x%x,RF0xef=0x%x,RF0xdf=0x%x, !!!\n",
115 IQK_CMD, delay_count,
116 odm_get_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK),
117 odm_read_4byte(dm, 0x1b08),
118 odm_get_rf_reg(dm, path, RF_0xef, RFREGOFFSETMASK),
119 odm_get_rf_reg(dm, path, RF_0xdf, RFREGOFFSETMASK));
121 RF_DBG(dm, DBG_RF_IQK,
122 "[IQK](2)IQK_CMD =0x%x, Fail, 0x1b08=0x%x, RF08=0x%x!!!\n",
123 IQK_CMD, odm_read_4byte(dm, 0x1b08),
124 odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK));
129 void phydm_get_read_counter_8821c(struct dm_struct *dm)
134 if ((odm_get_rf_reg(dm, RF_PATH_A, RF_0x8, RFREGOFFSETMASK) == 0xabcde) || counter > 300)
140 odm_set_rf_reg(dm, RF_PATH_A, RF_0x8, RFREGOFFSETMASK, 0x0);
141 RF_DBG(dm, DBG_RF_IQK, "[IQK]counter = %d\n", counter);
144 void _iqk_check_coex_status(struct dm_struct *dm, boolean beforeK)
153 u1b_tmp = odm_read_1byte(dm, 0x49c);
154 RF_DBG(dm, DBG_RF_IQK,
155 "[IQK]check 0x49c[0] = 0x%x before h2c 0x6d\n", u1b_tmp);
158 u1b_tmp = odm_read_1byte(dm, 0x49c);
159 while ((u1b_tmp & BIT(1)) && (count < 100)) {
160 /*ODM_sleep_ms(10);*/
162 u1b_tmp = odm_read_1byte(dm, 0x49c);
164 RF_DBG(dm, DBG_RF_IQK,
165 "[IQK]check 0x49c[1]=0x%x, count = %d\n",
169 odm_fill_h2c_cmd(dm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);
171 u1b_tmp = odm_read_1byte(dm, 0x49c);
172 RF_DBG(dm, DBG_RF_IQK,
173 "[IQK]check 0x49c[0] = 0x%x after h2c 0x6d\n", u1b_tmp);
175 u1b_tmp = odm_read_1byte(dm, 0x49c);
176 /*check if WL IQK available form WL FW */
177 while ((!(u1b_tmp & BIT(0))) && (count < 100)) {
179 /*ODM_sleep_ms(10);*/
182 u1b_tmp = odm_read_1byte(dm, 0x49c);
184 RF_DBG(dm, DBG_RF_IQK,
185 "[IQK]check 0x49c[1]=0x%x, count = %d\n",
190 RF_DBG(dm, DBG_RF_IQK,
191 "[IQK]Polling 0x49c to 1 for WiFi calibration H2C cmd FAIL! count(%d)\n",
196 odm_set_bb_reg(dm, R_0x49c, BIT(0), 0x0);
200 u32 _iqk_indirect_read_reg(struct dm_struct *dm, u16 reg_addr)
204 /*wait for ready bit before access 0x1700*/
205 odm_write_4byte(dm, 0x1700, 0x800f0000 | reg_addr);
209 } while (((odm_read_1byte(dm, 0x1703) & BIT(5)) == 0) && (j < 30000));
211 return odm_read_4byte(dm, 0x1708); /*get read data*/
214 void _iqk_indirect_write_reg(struct dm_struct *dm, u16 reg_addr, u32 bit_mask,
217 u32 val, i = 0, j = 0, bitpos = 0;
221 if (bit_mask == 0xffffffff) {
222 odm_write_4byte(dm, 0x1704, reg_value); /*put write data*/
224 /*wait for ready bit before access 0x1700*/
227 } while (((odm_read_1byte(dm, 0x1703) & BIT(5)) == 0) && (j < 30000));
229 odm_write_4byte(dm, 0x1700, 0xc00f0000 | reg_addr);
231 for (i = 0; i <= 31; i++) {
232 if (((bit_mask >> i) & 0x1) == 0x1) {
238 /*read back register value before write*/
239 val = _iqk_indirect_read_reg(dm, reg_addr);
240 val = (val & (~bit_mask)) | (reg_value << bitpos);
242 odm_write_4byte(dm, 0x1704, val); /*put write data*/
244 /*wait for ready bit before access 0x1700*/
247 } while (((odm_read_1byte(dm, 0x1703) & BIT(5)) == 0) && (j < 30000));
249 odm_write_4byte(dm, 0x1700, 0xc00f0000 | reg_addr);
253 void _iqk_set_gnt_wl_high(struct dm_struct *dm)
256 u8 state = 0x1, sw_control = 0x1;
259 val = (sw_control) ? ((state << 1) | 0x1) : 0;
260 _iqk_indirect_write_reg(dm, 0x38, 0x3000, val); /*0x38[13:12]*/
261 _iqk_indirect_write_reg(dm, 0x38, 0x0300, val); /*0x38[9:8]*/
264 void _iqk_set_gnt_bt_low(struct dm_struct *dm)
267 u8 state = 0x0, sw_control = 0x1;
270 val = (sw_control) ? ((state << 1) | 0x1) : 0;
271 _iqk_indirect_write_reg(dm, 0x38, 0xc000, val); /*0x38[15:14]*/
272 _iqk_indirect_write_reg(dm, 0x38, 0x0c00, val); /*0x38[11:10]*/
275 void _iqk_set_gnt_wl_gnt_bt(struct dm_struct *dm, boolean beforeK)
277 struct dm_iqk_info *iqk_info = &dm->IQK_info;
280 _iqk_set_gnt_wl_high(dm);
281 _iqk_set_gnt_bt_low(dm);
283 _iqk_indirect_write_reg(dm, 0x38, MASKDWORD, iqk_info->tmp_gntwl);
287 void _iqk_fail_count_8821c(void *dm_void)
289 struct dm_struct *dm = (struct dm_struct *)dm_void;
290 struct dm_iqk_info *iqk_info = &dm->IQK_info;
294 if (odm_get_rf_reg(dm, RF_PATH_A, RF_0x1bf0, BIT(16)) == 1)
295 iqk_info->is_reload = true;
297 iqk_info->is_reload = false;
299 if (!iqk_info->is_reload) {
300 for (i = 0; i < 8; i++) {
301 if (odm_get_bb_reg(dm, R_0x1bf0, BIT(i)) == 1)
302 dm->n_iqk_fail_cnt++;
305 RF_DBG(dm, DBG_RF_IQK, "[IQK]All/Fail = %d %d\n", dm->n_iqk_cnt,
309 void _iqk_fill_iqk_report_8821c(void *dm_void, u8 channel)
311 struct dm_struct *dm = (struct dm_struct *)dm_void;
312 struct dm_iqk_info *iqk_info = &dm->IQK_info;
313 u32 tmp1 = 0x0, tmp2 = 0x0, tmp3 = 0x0;
316 for (i = 0; i < SS_8821C; i++) {
317 tmp1 = tmp1 + ((iqk_info->iqk_fail_report[channel][i][TX_IQK] & 0x1) << i);
318 tmp2 = tmp2 + ((iqk_info->iqk_fail_report[channel][i][RX_IQK] & 0x1) << (i + 4));
319 tmp3 = tmp3 + ((iqk_info->rxiqk_fail_code[channel][i] & 0x3) << (i * 2 + 8));
321 odm_write_4byte(dm, 0x1b00, 0xf8000008);
322 odm_set_bb_reg(dm, R_0x1bf0, 0x00ffffff, tmp1 | tmp2 | tmp3);
324 for (i = 0; i < SS_8821C; i++)
325 odm_write_4byte(dm, 0x1be8 + (i * 4), (iqk_info->rxiqk_agc[channel][(i * 2) + 1] << 16) | iqk_info->rxiqk_agc[channel][i * 2]);
326 RF_DBG(dm, DBG_RF_IQK, "[IQK] 0x1be8 = %x\n",
327 odm_read_4byte(dm, 0x1be8));
330 void _iqk_iqk_fail_report_8821c(struct dm_struct *dm)
335 tmp1bf0 = odm_read_4byte(dm, 0x1bf0);
337 for (i = 0; i < 4; i++) {
338 if (tmp1bf0 & (0x1 << i))
339 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
340 RF_DBG(dm, DBG_RF_IQK, "[IQK] please check S%d TXIQK\n",
343 panic_printk("[IQK] please check S%d TXIQK\n", i);
345 if (tmp1bf0 & (0x1 << (i + 12)))
346 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
347 RF_DBG(dm, DBG_RF_IQK, "[IQK] please check S%d RXIQK\n",
350 panic_printk("[IQK] please check S%d RXIQK\n", i);
355 void _iqk_backup_mac_bb_8821c(struct dm_struct *dm, u32 *MAC_backup,
356 u32 *BB_backup, u32 *backup_mac_reg,
357 u32 *backup_bb_reg, u8 num_backup_bb_reg)
361 for (i = 0; i < MAC_REG_NUM_8821C; i++)
362 MAC_backup[i] = odm_read_4byte(dm, backup_mac_reg[i]);
364 for (i = 0; i < num_backup_bb_reg; i++)
365 BB_backup[i] = odm_read_4byte(dm, backup_bb_reg[i]);
367 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]BackupMacBB Success!!!!\n"); */
371 void _iqk_backup_rf_8821c(struct dm_struct *dm, u32 RF_backup[][SS_8821C],
376 for (i = 0; i < RF_REG_NUM_8821C; i++)
377 for (j = 0; j < SS_8821C; j++)
378 RF_backup[i][j] = odm_get_rf_reg(dm, (u8)j, backup_rf_reg[i], RFREGOFFSETMASK);
380 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]BackupRF Success!!!!\n"); */
384 void _iqk_agc_bnd_int_8821c(struct dm_struct *dm)
386 /*initialize RX AGC bnd, it must do after bbreset*/
387 odm_write_4byte(dm, 0x1b00, 0xf8000008);
388 odm_write_4byte(dm, 0x1b00, 0xf80a7008);
389 odm_write_4byte(dm, 0x1b00, 0xf8015008);
390 odm_write_4byte(dm, 0x1b00, 0xf8000008);
392 /*RF_DBG(dm, DBG_RF_IQK, "[IQK]init. rx agc bnd\n");*/
396 void _iqk_bb_reset_8821c(struct dm_struct *dm)
398 boolean cca_ing = false;
401 odm_set_rf_reg(dm, RF_PATH_A, RF_0x0, RFREGOFFSETMASK, 0x10000);
402 odm_set_bb_reg(dm, R_0x8f8,
403 BIT(27) | BIT26 | BIT25 | BIT24 | BIT23 | BIT22 | BIT21 | BIT20, 0x0);
406 odm_write_4byte(dm, 0x8fc, 0x0);
407 odm_set_bb_reg(dm, R_0x198c, 0x7, 0x7);
408 cca_ing = (boolean)odm_get_bb_reg(dm, R_0xfa0, BIT(3));
417 odm_write_1byte(dm, 0x808, 0x0); /*RX ant off*/
418 odm_set_bb_reg(dm, R_0xa04, BIT(27) | BIT26 | BIT25 | BIT24, 0x0); /*CCK RX path off*/
421 odm_set_bb_reg(dm, R_0x0, BIT(16), 0x0);
422 odm_set_bb_reg(dm, R_0x0, BIT(16), 0x1);
424 if (odm_get_bb_reg(dm, R_0x660, BIT(16)))
425 odm_write_4byte(dm, 0x6b4, 0x89000006);
426 RF_DBG(dm, DBG_RF_IQK, "[IQK]BBreset!!!!\n");
432 void _iqk_afe_setting_8821c(struct dm_struct *dm, boolean do_iqk)
435 /*IQK AFE setting RX_WAIT_CCA mode */
436 odm_write_4byte(dm, 0xc60, 0x50000000);
437 odm_write_4byte(dm, 0xc60, 0x700F0040);
440 odm_write_4byte(dm, 0xc58, 0xd8000402);
441 odm_write_4byte(dm, 0xc5c, 0xd1000120);
442 odm_write_4byte(dm, 0xc6c, 0x00000a15);
443 _iqk_bb_reset_8821c(dm);
445 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]AFE setting for IQK mode!!!!\n"); */
448 /*IQK AFE setting RX_WAIT_CCA mode */
449 odm_write_4byte(dm, 0xc60, 0x50000000);
450 odm_write_4byte(dm, 0xc60, 0x700B8040);
453 odm_write_4byte(dm, 0xc58, 0xd8020402);
454 odm_write_4byte(dm, 0xc5c, 0xde000120);
455 odm_write_4byte(dm, 0xc6c, 0x0000122a);
457 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]AFE setting for Normal mode!!!!\n"); */
460 /*0x9a4[31]=0: Select da clock*/
461 odm_set_bb_reg(dm, R_0x9a4, BIT(31), 0x0);
464 void _iqk_restore_mac_bb_8821c(struct dm_struct *dm, u32 *MAC_backup,
465 u32 *BB_backup, u32 *backup_mac_reg,
466 u32 *backup_bb_reg, u8 num_backup_bb_reg)
470 for (i = 0; i < MAC_REG_NUM_8821C; i++)
471 odm_write_4byte(dm, backup_mac_reg[i], MAC_backup[i]);
472 for (i = 0; i < num_backup_bb_reg; i++)
473 odm_write_4byte(dm, backup_bb_reg[i], BB_backup[i]);
475 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]RestoreMacBB Success!!!!\n"); */
479 void _iqk_restore_rf_8821c(struct dm_struct *dm, u32 *backup_rf_reg,
480 u32 RF_backup[][SS_8821C])
484 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x0);
485 odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, RFREGOFFSETMASK, 0x0);
486 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, RF_backup[0][RF_PATH_A] & (~BIT(4)));
488 /*odm_set_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK, RF_backup[1][RF_PATH_A]|BIT(4));*/
490 odm_set_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK, RF_backup[1][RF_PATH_A] & (~BIT(4)));
492 for (i = 2; i < (RF_REG_NUM_8821C - 1); i++)
493 odm_set_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_A]);
495 odm_set_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK, (RF_backup[4][RF_PATH_A] & (~BIT(0))));
497 /*RF_DBG(dm, DBG_RF_IQK, "[IQK]RestoreRF Success!!!!\n"); */
501 void _iqk_backup_iqk_8821c(struct dm_struct *dm, u8 step, u8 path)
503 struct dm_iqk_info *iqk_info = &dm->IQK_info;
506 /*u16 iqk_apply[2] = {0xc94, 0xe94};*/
511 iqk_info->iqk_channel[1] = iqk_info->iqk_channel[0];
512 for (i = 0; i < SS_8821C; i++) {
513 iqk_info->lok_idac[1][i] = iqk_info->lok_idac[0][i];
514 iqk_info->rxiqk_agc[1][i] = iqk_info->rxiqk_agc[0][i];
515 iqk_info->bypass_iqk[1][i] = iqk_info->bypass_iqk[0][i];
516 iqk_info->rxiqk_fail_code[1][i] = iqk_info->rxiqk_fail_code[0][i];
517 for (j = 0; j < 2; j++) {
518 iqk_info->iqk_fail_report[1][i][j] = iqk_info->iqk_fail_report[0][i][j];
519 for (k = 0; k < 8; k++) {
520 iqk_info->iqk_cfir_real[1][i][j][k] = iqk_info->iqk_cfir_real[0][i][j][k];
521 iqk_info->iqk_cfir_imag[1][i][j][k] = iqk_info->iqk_cfir_imag[0][i][j][k];
525 for (i = 0; i < 4; i++) {
526 iqk_info->rxiqk_fail_code[0][i] = 0x0;
527 iqk_info->rxiqk_agc[0][i] = 0x0;
528 for (j = 0; j < 2; j++) {
529 iqk_info->iqk_fail_report[0][i][j] = true;
530 iqk_info->gs_retry_count[0][i][j] = 0x0;
532 for (j = 0; j < 3; j++)
533 iqk_info->retry_count[0][i][j] = 0x0;
536 iqk_info->iqk_channel[0] = iqk_info->rf_reg18;
538 case 1: /*LOK backup*/
539 iqk_info->lok_idac[0][path] = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x58, RFREGOFFSETMASK);
541 case 2: /*TXIQK backup*/
542 case 3: /*RXIQK backup*/
543 phydm_get_iqk_cfir(dm, (step - 2), path, false);
548 void _iqk_reload_iqk_setting_8821c(struct dm_struct *dm, u8 channel,
550 /*1: reload TX, 2: reload TX, RX*/)
552 struct dm_iqk_info *iqk_info = &dm->IQK_info;
554 u16 iqk_apply[2] = {0xc94, 0xe94};
556 for (path = 0; path < SS_8821C; path++) {
558 if (reload_idx == 2) {
559 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, BIT(4), 0x1);
560 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x58, RFREGOFFSETMASK, iqk_info->lok_idac[channel][path]);
563 for (idx = 0; idx < reload_idx; idx++) {
564 odm_set_bb_reg(dm, R_0x1b00, MASKDWORD, 0xf8000008 | path << 1);
565 odm_set_bb_reg(dm, R_0x1b2c, MASKDWORD, 0x7);
566 odm_set_bb_reg(dm, R_0x1b38, MASKDWORD, 0x20000000);
567 odm_set_bb_reg(dm, R_0x1b3c, MASKDWORD, 0x20000000);
568 odm_set_bb_reg(dm, R_0x1bcc, MASKDWORD, 0x00000000);
570 odm_set_bb_reg(dm, R_0x1b0c, BIT(13) | BIT(12), 0x3);
572 odm_set_bb_reg(dm, R_0x1b0c, BIT(13) | BIT(12), 0x1);
573 odm_set_bb_reg(dm, R_0x1bd4, BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16), 0x10);
574 for (i = 0; i < 8; i++) {
575 odm_write_4byte(dm, 0x1bd8, ((0xc0000000 >> idx) + 0x3) + (i * 4) + (iqk_info->iqk_cfir_real[channel][path][idx][i] << 9));
576 odm_write_4byte(dm, 0x1bd8, ((0xc0000000 >> idx) + 0x1) + (i * 4) + (iqk_info->iqk_cfir_imag[channel][path][idx][i] << 9));
579 odm_set_bb_reg(dm, iqk_apply[path], BIT(0), ~(u32)(iqk_info->iqk_fail_report[channel][path][idx]));
581 odm_set_bb_reg(dm, iqk_apply[path], BIT(10), ~(u32)(iqk_info->iqk_fail_report[channel][path][idx]));
583 odm_set_bb_reg(dm, R_0x1bd8, MASKDWORD, 0x0);
584 odm_set_bb_reg(dm, R_0x1b0c, BIT(13) | BIT(12), 0x0);
589 _iqk_reload_iqk_8821c(struct dm_struct *dm, boolean reset)
591 struct dm_iqk_info *iqk_info = &dm->IQK_info;
593 iqk_info->is_reload = false;
594 odm_set_bb_reg(dm, R_0x1bf0, BIT(16), 0x0); /*clear the reload flag*/
597 for (i = 0; i < SS_8821C; i++)
598 iqk_info->iqk_channel[i] = 0x0;
600 iqk_info->rf_reg18 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x18, RFREGOFFSETMASK);
602 for (i = 0; i < SS_8821C; i++) {
603 if (iqk_info->rf_reg18 == iqk_info->iqk_channel[i]) {
604 _iqk_reload_iqk_setting_8821c(dm, i, 2);
605 _iqk_fill_iqk_report_8821c(dm, i);
606 RF_DBG(dm, DBG_RF_IQK,
607 "[IQK]reload IQK result before!!!!\n");
608 odm_set_bb_reg(dm, R_0x1bf0, BIT(16), 0x1);
609 iqk_info->is_reload = true;
614 return iqk_info->is_reload;
617 void _iqk_rfe_setting_8821c(struct dm_struct *dm, boolean ext_pa_on)
621 odm_write_4byte(dm, 0xcb0, 0x77777777);
622 odm_write_4byte(dm, 0xcb4, 0x00007777);
623 odm_write_4byte(dm, 0xcbc, 0x0000083B);
625 /*odm_write_4byte(dm, 0x1990, 0x00000c30);*/
627 RF_DBG(dm, DBG_RF_IQK, "[IQK]external PA on!!!!\n");
630 odm_write_4byte(dm, 0xcb0, 0x77171117);
631 odm_write_4byte(dm, 0xcb4, 0x00001177);
632 odm_write_4byte(dm, 0xcbc, 0x00000404);
634 /*odm_write_4byte(dm, 0x1990, 0x00000c30);*/
636 RF_DBG(dm, DBG_RF_IQK, "[IQK]external PA off!!!!\n");
640 void _iqk_rfsetting_8821c(struct dm_struct *dm)
642 struct dm_iqk_info *iqk_info = &dm->IQK_info;
647 odm_write_4byte(dm, 0x1b00, 0xf8000008);
648 odm_write_4byte(dm, 0x1bb8, 0x00000000);
650 for (path = 0; path < SS_8821C; path++) {
651 /*0xdf:B11 = 1,B4 = 0, B1 = 1*/
652 tmp = odm_get_rf_reg(dm, (enum rf_path)path, RF_0xdf, RFREGOFFSETMASK);
653 tmp = (tmp & (~BIT(4))) | BIT(1) | BIT(11);
654 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, RFREGOFFSETMASK, tmp);
656 if (iqk_info->is_btg) {
657 tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK);
658 tmp = (tmp & (~BIT(4))) | BIT(15);
660 /*tmp = tmp|BIT(4)|BIT(15); //manual LOK value for A-cut*/
662 odm_set_rf_reg(dm, RF_PATH_A, RF_0xde, RFREGOFFSETMASK, tmp);
665 if (!iqk_info->is_btg) {
668 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, RFREGOFFSETMASK, 0x80000);
669 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00024);
670 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x0003f);
672 /*odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x60fde);*/
674 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0xe0fde);
675 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, RFREGOFFSETMASK, 0x00000);
676 if (*dm->band_type == ODM_BAND_5G) {
677 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x1);
678 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00026);
679 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00037);
680 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0xdefce);
681 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x0);
683 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x1);
684 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00026);
685 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00037);
686 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x5efce);
687 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x0);
692 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, RFREGOFFSETMASK, 0x01000);
693 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00004);
694 odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x01ec1);
695 odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, RFREGOFFSETMASK, 0x00000);
700 void _iqk_configure_macbb_8821c(struct dm_struct *dm)
702 /*MACBB register setting*/
703 odm_write_1byte(dm, 0x522, 0x7f);
704 odm_set_bb_reg(dm, R_0x1518, BIT(16), 0x1);
705 odm_set_bb_reg(dm, R_0x550, BIT(11) | BIT(3), 0x0);
706 odm_set_bb_reg(dm, R_0x90c, BIT(15), 0x1); /*0x90c[15]=1: dac_buf reset selection*/
708 /*0xc94[0]=1, 0xe94[0]=1: Let tx from IQK*/
709 odm_set_bb_reg(dm, R_0xc94, BIT(0), 0x1);
710 odm_set_bb_reg(dm, R_0xc94, (BIT(11) | BIT(10)), 0x1);
712 odm_write_4byte(dm, 0xc00, 0x00000004);
714 odm_set_bb_reg(dm, R_0xb00, BIT(8), 0x0);
716 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set MACBB setting for IQK!!!!\n");*/
718 /*disable CCK block*/
719 odm_set_bb_reg(dm, R_0x808, BIT(28), 0x0);
721 odm_set_bb_reg(dm, R_0x838, BIT(3) | BIT(2) | BIT(1), 0x7);
725 void _iqk_lok_setting_8821c(struct dm_struct *dm, u8 path, u8 pad_index)
727 u32 LOK0x56_2G = 0x50ef3;
728 u32 LOK0x56_5G = 0x50ee8;
730 u32 LOK0x78 = 0xbcbba;
733 struct dm_iqk_info *iqk_info = &dm->IQK_info;
736 /*add delay of MAC send packet*/
739 odm_set_bb_reg(dm, R_0x810, BIT(7) | BIT(6) | BIT(5) | BIT(4), 0x8);
741 if (iqk_info->is_btg) {
742 tmp = (LOK0x78 & 0x1c000) >> 14;
743 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
744 odm_write_4byte(dm, 0x1bcc, 0x1b);
745 odm_write_1byte(dm, 0x1b23, 0x00);
746 odm_write_1byte(dm, 0x1b2b, 0x80);
747 /*0x78[11:0] = IDAC value*/
748 LOK0x78 = LOK0x78 & (0xe3fff | ((u32)pad_index << 14));
749 odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, LOK0x78);
750 odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x05320);
751 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xac018);
752 odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(4), 0x1);
753 odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, BIT(3), 0x0);
754 RF_DBG(dm, DBG_RF_IQK, "[IQK] In the BTG\n");
756 /*tmp = (LOK0x56 & 0xe0) >> 5;*/
757 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
758 odm_write_4byte(dm, 0x1bcc, 0x9);
759 odm_write_1byte(dm, 0x1b23, 0x00);
761 switch (*dm->band_type) {
763 odm_write_1byte(dm, 0x1b2b, 0x00);
764 LOK0x56_2G = LOK0x56_2G & (0xfff1f | ((u32)pad_index << 5));
765 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, LOK0x56_2G);
766 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xadc18);
767 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, BIT(4), 0x1);
768 odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, BIT(3), 0x0);
771 odm_write_1byte(dm, 0x1b2b, 0x00);
772 LOK0x56_5G = LOK0x56_5G & (0xfff1f | ((u32)pad_index << 5));
773 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, LOK0x56_5G);
774 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xadc18);
775 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, BIT(4), 0x1);
776 odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, BIT(3), 0x1);
780 /*for IDAC LUT by PAD idx*/
781 odm_set_rf_reg(dm, path, RF_0x33, BIT(2) | BIT(1) | BIT(0), LOK0x33);
783 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set LOK setting!!!!\n");*/
787 void _iqk_txk_setting_8821c(struct dm_struct *dm, u8 path)
789 struct dm_iqk_info *iqk_info = &dm->IQK_info;
791 if (iqk_info->is_btg) {
792 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
793 odm_write_4byte(dm, 0x1bcc, 0x1b);
794 odm_write_4byte(dm, 0x1b20, 0x00840008);
796 /*0x78[11:0] = IDAC value*/
797 odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0xbcbba);
798 odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x04320);
799 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xac018);
800 odm_write_1byte(dm, 0x1b2b, 0x80);
802 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
803 odm_write_4byte(dm, 0x1bcc, 0x9);
804 odm_write_4byte(dm, 0x1b20, 0x01440008);
806 switch (*dm->band_type) {
808 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x50EF3);
809 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xadc18);
810 odm_write_1byte(dm, 0x1b2b, 0x00);
814 /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x50EF0);*/
815 /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x50Ec8);*/
817 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x5004e);
818 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c18);
819 odm_write_1byte(dm, 0x1b2b, 0x00);
824 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set TXK setting!!!!\n");*/
828 void _iqk_rxk1setting_8821c(struct dm_struct *dm, u8 path)
830 struct dm_iqk_info *iqk_info = &dm->IQK_info;
832 if (iqk_info->is_btg) {
833 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
834 odm_write_1byte(dm, 0x1b2b, 0x80);
835 odm_write_4byte(dm, 0x1bcc, 0x09);
836 odm_write_4byte(dm, 0x1b20, 0x01450008);
837 odm_write_4byte(dm, 0x1b24, 0x01460c88);
839 /*0x78[11:0] = IDAC value*/
840 odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0x8cbba);
841 odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x00320);
842 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa8018);
844 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
845 switch (*dm->band_type) {
847 odm_write_1byte(dm, 0x1bcc, 0x12);
848 odm_write_1byte(dm, 0x1b2b, 0x00);
849 odm_write_4byte(dm, 0x1b20, 0x01450008);
850 odm_write_4byte(dm, 0x1b24, 0x01461068);
852 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
853 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
856 odm_write_1byte(dm, 0x1bcc, 0x9);
857 odm_write_1byte(dm, 0x1b2b, 0x00);
858 odm_write_4byte(dm, 0x1b20, 0x00450008);
859 odm_write_4byte(dm, 0x1b24, 0x00461468);
861 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
862 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
867 /*RF_DBG(dm, DBG_RF_IQK, "[IQK]Set RXK setting!!!!\n");*/
871 static u8 btg_lna[5] = {0x0, 0x4, 0x8, 0xc, 0xf};
872 static u8 wlg_lna[5] = {0x0, 0x1, 0x2, 0x3, 0x5};
873 static u8 wla_lna[5] = {0x0, 0x1, 0x3, 0x4, 0x5};
875 void _iqk_rxk2setting_8821c(struct dm_struct *dm, u8 path, boolean is_gs)
877 struct dm_iqk_info *iqk_info = &dm->IQK_info;
879 if (iqk_info->is_btg) {
881 iqk_info->tmp1bcc = 0x1b;
882 iqk_info->lna_idx = 2;
884 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
885 odm_write_1byte(dm, 0x1b2b, 0x80);
886 odm_write_4byte(dm, 0x1bcc, iqk_info->tmp1bcc);
887 odm_write_4byte(dm, 0x1b20, 0x01450008);
888 odm_write_4byte(dm, 0x1b24, (0x01460048 | (btg_lna[iqk_info->lna_idx] << 10)));
889 /*0x78[11:0] = IDAC value*/
890 odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0x8cbba);
891 odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x00320);
892 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa8018);
894 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
895 switch (*dm->band_type) {
898 iqk_info->tmp1bcc = 0x12;
899 iqk_info->lna_idx = 2;
901 odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
902 odm_write_1byte(dm, 0x1b2b, 0x00);
903 odm_write_4byte(dm, 0x1b20, 0x01450008);
904 odm_write_4byte(dm, 0x1b24, (0x01460048 | (wlg_lna[iqk_info->lna_idx] << 10)));
905 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
906 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
910 /*iqk_info->tmp1bcc = 0x12;*/
911 iqk_info->tmp1bcc = 0x09;
912 iqk_info->lna_idx = 2;
914 odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
915 odm_write_1byte(dm, 0x1b2b, 0x00);
916 odm_write_4byte(dm, 0x1b20, 0x00450008);
917 odm_write_4byte(dm, 0x1b24, (0x01460048 | (wla_lna[iqk_info->lna_idx] << 10)));
919 /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51000);*/
921 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51060);
922 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
927 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]Set RXK setting!!!!\n");*/
932 _iqk_check_cal_8821c(struct dm_struct *dm, u32 IQK_CMD)
934 boolean notready = true, fail = true;
935 u32 delay_count = 0x0;
938 if (odm_read_4byte(dm, 0x1b00) == (IQK_CMD & 0xffffff0f)) {
939 fail = (boolean)odm_get_bb_reg(dm, R_0x1b08, BIT(26));
949 if (delay_count >= 50) {
951 RF_DBG(dm, DBG_RF_IQK, "[IQK]IQK timeout!!!\n");
957 RF_DBG(dm, DBG_RF_IQK,
958 "[IQK]delay count = 0x%x!!!\n", delay_count);
965 _iqk_rx_iqk_gain_search_fail_8821c(struct dm_struct *dm, u8 path, u8 step)
967 struct dm_iqk_info *iqk_info = &dm->IQK_info;
969 u32 IQK_CMD = 0x0, rf_reg0, tmp, rxbb;
970 u8 IQMUX[4] = {0x9, 0x12, 0x1b, 0x24}, *plna;
972 /*u8 lna_setting[5];*/
974 if (iqk_info->is_btg)
976 else if (*dm->band_type == ODM_BAND_2_4G)
981 for (idx = 0; idx < 4; idx++)
982 if (iqk_info->tmp1bcc == IQMUX[idx])
985 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
986 odm_write_4byte(dm, 0x1bcc, iqk_info->tmp1bcc);
989 RF_DBG(dm, DBG_RF_IQK,
990 "[IQK]============ S%d RXIQK GainSearch ============\n",
994 IQK_CMD = 0xf8000208 | (1 << (path + 4));
996 IQK_CMD = 0xf8000308 | (1 << (path + 4));
998 RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d GS%d_Trigger = 0x%x\n", path, step,
1001 _iqk_set_gnt_wl_gnt_bt(dm, true);
1002 odm_write_4byte(dm, 0x1b00, IQK_CMD);
1003 odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
1005 /*ODM_sleep_ms(GS_delay_8821C);*/
1007 ODM_delay_ms(GS_delay_8821C);
1008 fail = _iqk_check_cal_8821c(dm, IQK_CMD);
1009 RF_DBG(dm, DBG_RF_IQK, "[IQK]check 0x49c = %x\n",
1010 odm_read_1byte(dm, 0x49c));
1011 _iqk_set_gnt_wl_gnt_bt(dm, false);
1013 if (step == RXIQK2) {
1014 rf_reg0 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x0, RFREGOFFSETMASK);
1015 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
1016 RF_DBG(dm, DBG_RF_IQK,
1017 "[IQK]S%d ==> RF0x0 = 0x%x, tmp1bcc = 0x%x, idx = %d, 0x1b3c = 0x%x\n",
1018 path, rf_reg0, iqk_info->tmp1bcc, idx,
1019 odm_read_4byte(dm, 0x1b3c));
1020 tmp = (rf_reg0 & 0x1fe0) >> 5;
1027 else if (iqk_info->lna_idx != 0x0)
1028 iqk_info->lna_idx--;
1030 iqk_info->isbnd = true;
1032 } else if (rxbb == 0xa) {
1035 else if (iqk_info->lna_idx != 0x4)
1036 iqk_info->lna_idx++;
1038 iqk_info->isbnd = true;
1044 if (iqk_info->isbnd)
1050 if (iqk_info->lna_idx != 0x0)
1051 iqk_info->lna_idx--;
1055 iqk_info->isbnd = true;
1057 } else if (rxbb == 0xa) {
1060 else if (iqk_info->lna_idx != 0x7)
1061 iqk_info->lna_idx++;
1063 iqk_info->isbnd = true;
1068 if (iqk_info->isbnd == true)
1071 iqk_info->tmp1bcc = IQMUX[idx];
1074 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
1075 odm_write_4byte(dm, 0x1b24, (odm_read_4byte(dm, 0x1b24) & 0xffffc3ff) | (*(plna + iqk_info->lna_idx) << 10));
1080 void _iqk_rxk2setting_by_toneindex_8821c(struct dm_struct *dm, u8 path,
1081 boolean is_gs, u8 toneindex)
1083 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1085 if (iqk_info->is_btg) {
1086 iqk_info->tmp1bcc = 0x1b;
1087 iqk_info->lna_idx = 2;
1088 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
1089 odm_write_1byte(dm, 0x1b2b, 0x80);
1090 odm_write_4byte(dm, 0x1bcc, iqk_info->tmp1bcc);
1091 odm_write_4byte(dm, 0x1b20, 0x01450008);
1092 odm_write_4byte(dm, 0x1b24, (0x01460048 | (btg_lna[iqk_info->lna_idx] << 10)));
1093 /*0x78[11:0] = IDAC value*/
1094 odm_set_rf_reg(dm, path, RF_0x78, RFREGOFFSETMASK, 0x8cbba);
1095 odm_set_rf_reg(dm, path, RF_0x5c, RFREGOFFSETMASK, 0x00320);
1096 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa8018);
1098 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
1099 switch (*dm->band_type) {
1101 iqk_info->tmp1bcc = 0x12;
1102 iqk_info->lna_idx = 2;
1103 odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
1104 odm_write_1byte(dm, 0x1b2b, 0x00);
1105 odm_write_4byte(dm, 0x1b20, 0x01450008);
1106 odm_write_4byte(dm, 0x1b24, (0x01460048 | (wlg_lna[iqk_info->lna_idx] << 10)));
1107 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x510f3);
1108 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
1111 iqk_info->tmp1bcc = 0x09;
1112 iqk_info->lna_idx = 2;
1113 odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
1114 odm_write_1byte(dm, 0x1b2b, 0x00);
1115 odm_write_4byte(dm, 0x1b20, 0x00450008);
1116 odm_write_4byte(dm, 0x1b24, (0x01460048 | (wla_lna[iqk_info->lna_idx] << 10)));
1118 /*odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51000);*/
1120 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, 0x51060);
1121 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
1125 odm_write_4byte(dm, 0x1b20, (odm_read_4byte(dm, 0x1b20) & 0x000fffff) | toneindex << 20);
1126 odm_write_4byte(dm, 0x1b24, (odm_read_4byte(dm, 0x1b24) & 0x000fffff) | toneindex << 20);
1130 _iqk_rx_iqk_gain_search_fail_by_toneindex_8821c(struct dm_struct *dm, u8 path,
1131 u8 step, u8 tone_index)
1133 boolean fail = true;
1136 /*u8 lna_setting[5];*/
1139 _iqk_rxk2setting_by_toneindex_8821c(dm, path, RXIQK1, tone_index);
1140 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
1142 IQK_CMD = 0xf8000208 | (1 << (path + 4));
1144 _iqk_set_gnt_wl_gnt_bt(dm, true);
1145 odm_write_4byte(dm, 0x1b00, IQK_CMD);
1146 odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
1148 /*ODM_sleep_ms(GS_delay_8821C);*/
1150 ODM_delay_ms(GS_delay_8821C);
1151 fail = _iqk_check_cal_8821c(dm, IQK_CMD);
1152 _iqk_set_gnt_wl_gnt_bt(dm, false);
1158 _lok_one_shot_8821c(void *dm_void, u8 path, u8 pad_index)
1160 struct dm_struct *dm = (struct dm_struct *)dm_void;
1161 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1163 boolean LOK_notready = false;
1164 u32 LOK_temp2 = 0, LOK_temp3 = 0;
1167 /*u8 LOKreg[] = {0x58, 0x78};*/
1169 RF_DBG(dm, DBG_RF_IQK, "[IQK]==========S%d LOK ==========\n",
1172 IQK_CMD = 0xf8000008 | (1 << (4 + path));
1174 RF_DBG(dm, DBG_RF_IQK, "[IQK]LOK_Trigger = 0x%x\n", IQK_CMD);
1176 _iqk_set_gnt_wl_gnt_bt(dm, true);
1177 odm_write_4byte(dm, 0x1b00, IQK_CMD);
1178 odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
1179 /*LOK: CMD ID = 0 {0xf8000018, 0xf8000028}*/
1180 /*LOK: CMD ID = 0 {0xf8000019, 0xf8000029}*/
1182 /*ODM_sleep_ms(LOK_delay_8821C);*/
1184 ODM_delay_ms(LOK_delay_8821C);
1187 LOK_notready = true;
1189 while (LOK_notready) {
1190 if (odm_get_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK) == 0x12345)
1191 LOK_notready = false;
1193 LOK_notready = true;
1197 /*ODM_sleep_ms(1);*/
1203 if (delay_count >= 50) {
1204 RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d LOK timeout!!!\n",
1209 odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
1211 _iqk_set_gnt_wl_gnt_bt(dm, false);
1212 RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d ==> delay_count = 0x%x\n", path,
1215 if (!LOK_notready) {
1216 LOK_temp2 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x8, RFREGOFFSETMASK);
1217 LOK_temp3 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x58, RFREGOFFSETMASK);
1219 RF_DBG(dm, DBG_RF_IQK, "[IQK]0x8 = 0x%x, 0x58 = 0x%x\n",
1220 LOK_temp2, LOK_temp3);
1222 RF_DBG(dm, DBG_RF_IQK, "[IQK]==>S%d LOK Fail!!!\n", path);
1225 iqk_info->lok_fail[path] = LOK_notready;
1227 /*fill IDAC LUT table*/
1230 for (i = 0; i < 8; i++) {
1231 odm_set_rf_reg(dm, path, RF_0x33, BIT(2)|BIT(1)|BIT(0), i);
1232 odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, LOK_temp2);
1236 return LOK_notready;
1240 _iqk_one_shot_8821c(void *dm_void, u8 path, u8 idx)
1242 struct dm_struct *dm = (struct dm_struct *)dm_void;
1243 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1245 boolean fail = true;
1247 u16 iqk_apply[2] = {0xc94, 0xe94};
1250 RF_DBG(dm, DBG_RF_IQK,
1251 "[IQK]============ S%d WBTXIQK ============\n",
1253 else if (idx == RXIQK1)
1254 RF_DBG(dm, DBG_RF_IQK,
1255 "[IQK]============ S%d WBRXIQK STEP1============\n",
1258 RF_DBG(dm, DBG_RF_IQK,
1259 "[IQK]============ S%d WBRXIQK STEP2============\n",
1263 IQK_CMD = 0xf8000008 | ((*dm->band_width + 4) << 8) | (1 << (path + 4));
1264 RF_DBG(dm, DBG_RF_IQK, "[IQK]TXK_Trigger = 0x%x\n", IQK_CMD);
1266 /*{0xf8000418, 0xf800042a} ==> 20 WBTXK (CMD = 4)*/
1267 /*{0xf8000518, 0xf800052a} ==> 40 WBTXK (CMD = 5)*/
1268 /*{0xf8000618, 0xf800062a} ==> 80 WBTXK (CMD = 6)*/
1270 } else if (idx == RXIQK1) {
1271 if (*dm->band_width == 2)
1272 IQK_CMD = 0xf8000808 | (1 << (path + 4));
1274 IQK_CMD = 0xf8000708 | (1 << (path + 4));
1275 RF_DBG(dm, DBG_RF_IQK, "[IQK]RXK1_Trigger = 0x%x\n", IQK_CMD);
1277 /*{0xf8000718, 0xf800072a} ==> 20 WBTXK (CMD = 7)*/
1278 /*{0xf8000718, 0xf800072a} ==> 40 WBTXK (CMD = 7)*/
1279 /*{0xf8000818, 0xf800082a} ==> 80 WBTXK (CMD = 8)*/
1281 } else if (idx == RXIQK2) {
1282 IQK_CMD = 0xf8000008 | ((*dm->band_width + 9) << 8) | (1 << (path + 4));
1283 RF_DBG(dm, DBG_RF_IQK, "[IQK]RXK2_Trigger = 0x%x\n", IQK_CMD);
1285 /*{0xf8000918, 0xf800092a} ==> 20 WBRXK (CMD = 9)*/
1286 /*{0xf8000a18, 0xf8000a2a} ==> 40 WBRXK (CMD = 10)*/
1287 /*{0xf8000b18, 0xf8000b2a} ==> 80 WBRXK (CMD = 11)*/
1291 _iqk_set_gnt_wl_gnt_bt(dm, true);
1293 odm_write_4byte(dm, 0x1bc8, 0x80000000);
1294 odm_write_4byte(dm, 0x8f8, 0x41400080);
1296 if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
1297 odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
1299 odm_write_4byte(dm, 0x1b00, IQK_CMD);
1300 odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
1303 /*ODM_sleep_ms(WBIQK_delay_8821C);*/
1305 ODM_delay_ms(WBIQK_delay_8821C);
1307 fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
1309 RF_DBG(dm, DBG_RF_IQK, "[IQK]check 0x49c = %x\n",
1310 odm_read_1byte(dm, 0x49c));
1312 _iqk_set_gnt_wl_gnt_bt(dm, false);
1314 if (dm->debug_components & DBG_RF_IQK) {
1315 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
1316 RF_DBG(dm, DBG_RF_IQK,
1317 "[IQK]S%d ==> 0x1b00 = 0x%x, 0x1b08 = 0x%x\n", path,
1318 odm_read_4byte(dm, 0x1b00), odm_read_4byte(dm, 0x1b08));
1319 RF_DBG(dm, DBG_RF_IQK, "[IQK]S%d ==> delay_count = 0x%x\n",
1322 RF_DBG(dm, DBG_RF_IQK,
1323 "[IQK]S%d ==> RF0x0 = 0x%x, RF0x%x = 0x%x\n",
1325 odm_get_rf_reg(dm, path, RF_0x0,
1327 (iqk_info->is_btg) ? 0x78 : 0x56,
1328 (iqk_info->is_btg) ?
1329 odm_get_rf_reg(dm, path, RF_0x78,
1331 odm_get_rf_reg(dm, path, RF_0x56,
1335 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
1338 odm_set_bb_reg(dm, iqk_apply[path], BIT(0), 0x0);
1340 _iqk_backup_iqk_8821c(dm, 0x2, path);
1342 if (idx == RXIQK2) {
1343 iqk_info->rxiqk_agc[0][path] =
1344 (u16)(((odm_get_rf_reg(dm, (enum rf_path)path, RF_0x0, RFREGOFFSETMASK) >> 5) & 0xff) |
1345 (iqk_info->tmp1bcc << 8));
1347 odm_write_4byte(dm, 0x1b38, 0x20000000);
1350 odm_set_bb_reg(dm, iqk_apply[path], (BIT(11) | BIT(10)), 0x0);
1352 _iqk_backup_iqk_8821c(dm, 0x3, path);
1356 iqk_info->iqk_fail_report[0][path][TXIQK] = fail;
1358 iqk_info->iqk_fail_report[0][path][RXIQK] = fail;
1364 _iqk_rxiqkbystep_8821c(void *dm_void, u8 path)
1366 struct dm_struct *dm = (struct dm_struct *)dm_void;
1367 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1368 boolean KFAIL = true, gonext;
1371 switch (iqk_info->rxiqk_step) {
1372 case 1: /*gain search_RXK1*/
1373 _iqk_rxk1setting_8821c(dm, path);
1376 KFAIL = _iqk_rx_iqk_gain_search_fail_8821c(dm, path, RXIQK1);
1377 if (KFAIL && iqk_info->gs_retry_count[0][path][0] < 2) {
1378 iqk_info->gs_retry_count[0][path][0]++;
1380 iqk_info->rxiqk_fail_code[0][path] = 0;
1381 iqk_info->rxiqk_step = 5;
1384 iqk_info->rxiqk_step++;
1390 halrf_iqk_xym_read(dm, 0x0, 0x2);
1392 case 2: /*gain search_RXK2*/
1393 _iqk_rxk2setting_8821c(dm, path, true);
1394 iqk_info->isbnd = false;
1396 KFAIL = _iqk_rx_iqk_gain_search_fail_8821c(dm, path, RXIQK2);
1397 if (KFAIL && iqk_info->gs_retry_count[0][path][1] < rxiqk_gs_limit) {
1398 iqk_info->gs_retry_count[0][path][1]++;
1400 iqk_info->rxiqk_step++;
1404 halrf_iqk_xym_read(dm, 0x0, 0x3);
1407 _iqk_rxk1setting_8821c(dm, path);
1410 KFAIL = _iqk_one_shot_8821c(dm, path, RXIQK1);
1411 if (KFAIL && iqk_info->retry_count[0][path][RXIQK1] < 2) {
1412 iqk_info->retry_count[0][path][RXIQK1]++;
1414 iqk_info->rxiqk_fail_code[0][path] = 1;
1415 iqk_info->rxiqk_step = 5;
1418 iqk_info->rxiqk_step++;
1424 halrf_iqk_xym_read(dm, 0x0, 0x4);
1427 _iqk_rxk2setting_8821c(dm, path, false);
1430 KFAIL = _iqk_one_shot_8821c(dm, path, RXIQK2);
1431 if (KFAIL && iqk_info->retry_count[0][path][RXIQK2] < 2) {
1432 iqk_info->retry_count[0][path][RXIQK2]++;
1434 iqk_info->rxiqk_fail_code[0][path] = 2;
1435 iqk_info->rxiqk_step = 5;
1438 iqk_info->rxiqk_step++;
1444 halrf_iqk_xym_read(dm, 0x0, 0x0);
1450 void _iqk_iqk_by_path_8821c(void *dm_void, boolean segment_iqk)
1452 struct dm_struct *dm = (struct dm_struct *)dm_void;
1453 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1454 boolean KFAIL = true;
1458 /* RF_DBG(dm, DBG_RF_IQK, "[IQK]iqk_step = 0x%x\n", dm->rf_calibrate_info.iqk_step); */
1460 if (*dm->band_width == 2)
1461 kcount_limit = kcount_limit_80m;
1463 kcount_limit = kcount_limit_others;
1466 switch (dm->rf_calibrate_info.iqk_step) {
1468 for (i = 0; i < 8; i++) { /* the LOK Cal in the each PAD stage*/
1469 _iqk_lok_setting_8821c(dm, RF_PATH_A, i);
1470 _lok_one_shot_8821c(dm, RF_PATH_A, i);
1472 dm->rf_calibrate_info.iqk_step++;
1474 case 2: /*S0 TXIQK*/
1475 _iqk_txk_setting_8821c(dm, RF_PATH_A);
1476 KFAIL = _iqk_one_shot_8821c(dm, RF_PATH_A, TXIQK);
1478 RF_DBG(dm, DBG_RF_IQK, "[IQK]KFail = 0x%x\n", KFAIL);
1479 if (KFAIL && iqk_info->retry_count[0][RF_PATH_A][TXIQK] < 3)
1480 iqk_info->retry_count[0][RF_PATH_A][TXIQK]++;
1482 dm->rf_calibrate_info.iqk_step++;
1483 halrf_iqk_xym_read(dm, 0x0, 0x1);
1485 case 3: /*S0 RXIQK*/
1487 KFAIL = _iqk_rxiqkbystep_8821c(dm, RF_PATH_A);
1488 RF_DBG(dm, DBG_RF_IQK,
1489 "[IQK]S0RXK KFail = 0x%x\n", KFAIL);
1490 if (iqk_info->rxiqk_step == 5) {
1491 dm->rf_calibrate_info.iqk_step++;
1492 iqk_info->rxiqk_step = 1;
1494 RF_DBG(dm, DBG_RF_IQK, "[IQK]S0RXK fail code: %d!!!\n", iqk_info->rxiqk_fail_code[0][RF_PATH_A]);
1502 if (dm->rf_calibrate_info.iqk_step == 4) {
1503 RF_DBG(dm, DBG_RF_IQK,
1504 "[IQK]==========LOK summary ==========\n");
1505 RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_LOK_notready = %d\n",
1506 iqk_info->lok_fail[RF_PATH_A]);
1507 RF_DBG(dm, DBG_RF_IQK,
1508 "[IQK]==========IQK summary ==========\n");
1509 RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_TXIQK_fail = %d\n",
1510 iqk_info->iqk_fail_report[0][RF_PATH_A][TXIQK]);
1511 RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_RXIQK_fail = %d\n",
1512 iqk_info->iqk_fail_report[0][RF_PATH_A][RXIQK]);
1513 RF_DBG(dm, DBG_RF_IQK, "[IQK]PathA_TXIQK_retry = %d\n",
1514 iqk_info->retry_count[0][RF_PATH_A][TXIQK]);
1515 RF_DBG(dm, DBG_RF_IQK,
1516 "[IQK]PathA_RXK1_retry = %d, PathA_RXK2_retry = %d\n",
1517 iqk_info->retry_count[0][RF_PATH_A][RXIQK1],
1518 iqk_info->retry_count[0][RF_PATH_A][RXIQK2]);
1519 RF_DBG(dm, DBG_RF_IQK,
1520 "[IQK]PathA_GS1_retry = %d, PathA_GS2_retry = %d\n",
1521 iqk_info->gs_retry_count[0][RF_PATH_A][0],
1522 iqk_info->gs_retry_count[0][RF_PATH_A][1]);
1524 for (i = 0; i < SS_8821C; i++) {
1525 odm_write_4byte(dm, 0x1b00, 0xf8000008 | i << 1);
1526 odm_write_4byte(dm, 0x1b2c, 0x7);
1527 odm_write_4byte(dm, 0x1bcc, 0x0);
1528 odm_write_4byte(dm, 0x1b38, 0x20000000);
1532 RF_DBG(dm, DBG_RF_IQK, "[IQK]segmentIQK = %d, Kcount = %d\n",
1533 segment_iqk, iqk_info->kcount);
1534 if (segment_iqk && iqk_info->kcount == kcount_limit)
1539 void _iqk_start_iqk_8821c(struct dm_struct *dm, boolean segment_iqk)
1541 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1544 odm_write_4byte(dm, 0x1b00, 0xf8000008);
1545 odm_write_4byte(dm, 0x1bb8, 0x00000000);
1547 if (iqk_info->is_btg) {
1548 tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK);
1549 tmp = (tmp & (~BIT(3))) | BIT(0) | BIT(2) | BIT(5);
1550 odm_set_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK, tmp);
1552 tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK);
1553 tmp = ((tmp & (~BIT(3))) & (~BIT(5))) | BIT(0) | BIT(2);
1554 odm_set_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK, tmp);
1555 RF_DBG(dm, DBG_RF_IQK, "[IQK]==> RF0x1 = 0x%x\n",
1556 odm_get_rf_reg(dm, RF_PATH_A, RF_0x1, RFREGOFFSETMASK));
1558 _iqk_iqk_by_path_8821c(dm, segment_iqk);
1561 void _iq_calibrate_8821c_init(struct dm_struct *dm)
1563 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1565 static boolean firstrun = true;
1569 RF_DBG(dm, DBG_RF_IQK,
1570 "[IQK]=====>PHY_IQCalibrate_8821C_Init\n");
1572 for (i = 0; i < SS_8821C; i++) {
1573 for (j = 0; j < 2; j++) {
1574 iqk_info->lok_fail[i] = true;
1575 iqk_info->iqk_fail[j][i] = true;
1576 iqk_info->iqc_matrix[j][i] = 0x20000000;
1580 for (i = 0; i < 2; i++) {
1581 iqk_info->iqk_channel[i] = 0x0;
1583 for (j = 0; j < SS_8821C; j++) {
1584 iqk_info->lok_idac[i][j] = 0x0;
1585 iqk_info->rxiqk_agc[i][j] = 0x0;
1586 iqk_info->bypass_iqk[i][j] = 0x0;
1588 for (k = 0; k < 2; k++) {
1589 iqk_info->iqk_fail_report[i][j][k] = true;
1590 for (m = 0; m < 8; m++) {
1591 iqk_info->iqk_cfir_real[i][j][k][m] = 0x0;
1592 iqk_info->iqk_cfir_imag[i][j][k][m] = 0x0;
1596 for (k = 0; k < 3; k++)
1597 iqk_info->retry_count[i][j][k] = 0x0;
1603 u8 _txgapk_txpower_compare_8821c(struct dm_struct *dm, u8 path, u32 pw1,
1604 u32 pw2, u32 *pwr_table)
1608 temp = (u32)(pw1 / (pw2 / 1000));
1610 if (temp < pwr_table[0]) /*<-3.5 dB*/
1612 else if (temp < pwr_table[1])
1614 else if (temp < pwr_table[2])
1616 else if (temp < pwr_table[3])
1618 else if (temp < pwr_table[4])
1620 else if (temp < pwr_table[5])
1622 else if (temp < pwr_table[6])
1624 else if (temp < pwr_table[7])
1626 else if (temp < pwr_table[8])
1628 else if (temp < pwr_table[9])
1630 else if (temp < pwr_table[0xa])
1632 else if (temp < pwr_table[0xb])
1634 else if (temp < pwr_table[0xc])
1636 else if (temp < pwr_table[0xd])
1638 else if (temp < pwr_table[0xe])
1640 else if (temp < pwr_table[0xf])
1642 else if (temp < pwr_table[0x10])
1644 else if (temp < pwr_table[0x11])
1646 else if (temp < pwr_table[0x12])
1648 else if (temp < pwr_table[0x13])
1650 else if (temp < pwr_table[0x14])
1652 else if (temp < pwr_table[0x15])
1654 else if (temp < pwr_table[0x16])
1656 else if (temp < pwr_table[0x17])
1658 else if (temp < pwr_table[0x18])
1660 else if (temp < pwr_table[0x19])
1665 RF_DBG(dm, DBG_RF_IQK, "[TXGAPK] temp =%d, pwr_delta =%x\n", temp,
1671 u32 _txgapk_txgap_compenstion_8821c(struct dm_struct *dm, u8 path,
1672 u32 txgain_0x56, u8 pwr_delta)
1674 u32 new_txgain_0x56;
1676 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */
1677 /* -3.5 -3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 (dB)*/
1679 /* pwr_table[0xf]={89,100,112,125,141,158,177,199,223,251,281,316,354,398,446}*/
1682 switch (pwr_delta) {
1692 if ((txgain_0x56 & 0x1f)<=0x1d)
1693 new_txgain_0x56 = txgain_0x56 + 0x2; //< -1.5 ~ -2.5dB
1694 else if ((txgain_0x56 & 0x1f)<= 0x1e)
1695 new_txgain_0x56 = txgain_0x56 + 0x1;
1697 new_txgain_0x56 = txgain_0x56;
1703 if ((txgain_0x56 & 0x1f) <= 0x1e)
1704 new_txgain_0x56 = txgain_0x56 + 0x1;/*< -0.5 ~ -1.5dB*/
1706 new_txgain_0x56 = txgain_0x56;
1714 new_txgain_0x56 = txgain_0x56; /*< -0.5~0.5dB*/
1721 if ((txgain_0x56 & 0x1f) >= 0x01)
1722 new_txgain_0x56 = txgain_0x56 - 0x1; /* >0.5~1.5dB */
1724 new_txgain_0x56 = txgain_0x56;
1732 if ((txgain_0x56 & 0x1f)>= 0x02)
1733 new_txgain_0x56 = txgain_0x56 - 0x2; //>1.5~2.5dB
1734 else if ((txgain_0x56 & 0x1f)>= 0x01)
1735 new_txgain_0x56 = txgain_0x56 - 0x1;
1737 new_txgain_0x56 = txgain_0x56;
1746 if ((txgain_0x56 & 0x1f)>= 0x03)
1747 new_txgain_0x56 = txgain_0x56 - 0x3; //>2.5~3.5dB
1748 else if ((txgain_0x56 & 0x1f)>= 0x02)
1749 new_txgain_0x56 = txgain_0x56 - 0x2;
1750 else if ((txgain_0x56 & 0x1f)>= 0x01)
1751 new_txgain_0x56 = txgain_0x56 - 0x1;
1753 new_txgain_0x56 = txgain_0x56;
1758 new_txgain_0x56 = txgain_0x56;
1761 if ((new_txgain_0x56 & 0x1f) < 0x02)
1762 new_txgain_0x56 = (new_txgain_0x56 & 0xffffc) + 0x2;
1763 if ((new_txgain_0x56 & 0x1f) > 0x1d)
1764 new_txgain_0x56 = (new_txgain_0x56 | 0x3) - 0x2;
1766 return new_txgain_0x56;
1769 void _txgapk_backup_8821c(struct dm_struct *dm, u32 *backup_txgap,
1770 u32 *backup_txgap_reg, u8 txgapk_reg_num)
1774 for (i = 0; i < txgapk_reg_num; i++)
1775 backup_txgap[i] = odm_read_4byte(dm, backup_txgap_reg[i]);
1777 u32 _txgapk_get_rf_tx_index_8821c(struct dm_struct *dm, u8 path,
1780 u32 rf_backup_reg00, rf_backup_regdf, rf_reg56;
1782 rf_backup_reg00 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK);
1783 rf_backup_regdf = odm_get_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK);
1785 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, 0x08009);
1786 odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, 0x20000 + txgain_index);
1787 /*ODM_sleep_us(10);*/
1790 rf_reg56 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x56, RFREGOFFSETMASK);
1792 RF_DBG(dm, DBG_RF_IQK,
1793 "[TXGAPK](2) txgain_index =0x%x, rf_reg56=0x%x\n", txgain_index,
1795 odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_backup_reg00);
1796 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, rf_backup_regdf);
1800 void _txgapk_restore_8821c(struct dm_struct *dm, u32 *backup_txgap,
1801 u32 *backup_txgap_reg, u8 txgapk_reg_num)
1805 for (i = 0; i < txgapk_reg_num; i++)
1806 odm_write_4byte(dm, backup_txgap_reg[i], backup_txgap[i]);
1809 void _txgapk_setting_8821c(struct dm_struct *dm, u8 path)
1811 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1814 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x80000);
1815 odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x00024);
1816 odm_set_rf_reg(dm, RF_PATH_A, RF_0x3e, RFREGOFFSETMASK, 0x0003F);
1817 odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, RFREGOFFSETMASK, 0xCBFCE);
1818 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00000);
1819 if (iqk_info->is_btg) {
1821 switch (*dm->band_type) {
1825 odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0xA9C00);
1826 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, 0x00809);
1827 odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, 0x4001c);
1829 odm_write_4byte(dm, 0x1bcc, 0x00000009); /*try the iqk swing*/
1830 odm_write_4byte(dm, 0x1b20, 0x01040008);
1831 odm_write_4byte(dm, 0x1b24, 0x01040848);
1833 odm_write_4byte(dm, 0x1b14, 0x00001000);
1834 odm_write_4byte(dm, 0x1b1c, 0x82193d31);
1836 odm_write_1byte(dm, 0x1b22, 0x04); /*sync with RF0x33[3:0]*/
1837 odm_write_1byte(dm, 0x1b26, 0x04); /*sync with RF0x33[3:0]*/
1838 odm_write_1byte(dm, 0x1b2c, 0x03);
1839 odm_write_4byte(dm, 0x1b38, 0x20000000);
1840 odm_write_4byte(dm, 0x1b3c, 0x20000000);
1841 odm_write_4byte(dm, 0xc00, 0x4);
1843 RF_DBG(dm, DBG_RF_IQK,
1844 "[IQK](1) txgap calibration setting!!!\n");
1851 u32 _txgapk_one_shot_8821c(struct dm_struct *dm_void, u8 path, u32 reg0x56)
1853 struct dm_struct *dm = (struct dm_struct *)dm_void;
1854 boolean txgap_k_notready = true;
1855 u8 delay_count = 0x0;
1856 u32 txgap_k_tmp1 = 0x1, txgap_k_tmp2 = 0x2;
1861 reg_1bb8 = odm_read_4byte(dm, 0x1bb8);
1863 odm_write_1byte(dm, 0x1bd6, 0x0b);
1864 odm_set_bb_reg(dm, R_0x1bfc, BIT(1), 0x0);
1865 txgap_k_notready = true;
1868 odm_write_1byte(dm, 0x1b2b, 0x00);
1869 odm_write_1byte(dm, 0x1bb8, 0x00);
1870 odm_set_rf_reg(dm, path, RF_0xdf, RFREGOFFSETMASK, 0x00802);
1871 odm_set_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
1872 odm_set_rf_reg(dm, path, RF_0x56, RFREGOFFSETMASK, reg0x56);
1873 odm_write_4byte(dm, 0x1bb8, 0x00100000);
1875 /*ODM_sleep_us(10);*/
1880 odm_write_4byte(dm, 0x1b34, 0x1);
1881 odm_write_4byte(dm, 0x1b34, 0x0);
1884 while (txgap_k_notready) {
1885 odm_write_1byte(dm, 0x1bd6, 0x0b);
1886 if ((boolean)odm_get_bb_reg(dm, R_0x1bfc, BIT(1)))
1887 txgap_k_notready = false;
1889 txgap_k_notready = true;
1891 if (txgap_k_notready) {
1893 /*ODM_sleep_us(100);*/
1899 if (delay_count >= 20) {
1900 RF_DBG(dm, DBG_RF_IQK,
1901 "[TXGAPK] (3)txgapktimeout,delay_count=0x%x !!!\n",
1903 txgap_k_notready = false;
1909 if ((boolean)odm_get_bb_reg(dm, R_0x1bfc, BIT(1)))
1910 txgap_k_notready = false;
1912 txgap_k_notready = true;
1916 if (!txgap_k_notready) {
1917 odm_write_1byte(dm, 0x1bd6, 0x5);
1918 txgap_k_tmp1 = odm_read_4byte(dm, 0x1bfc) >> 27;
1919 odm_write_1byte(dm, 0x1bd6, 0xe);
1920 txgap_k_tmp2 = odm_read_4byte(dm, 0x1bfc);
1922 RF_DBG(dm, DBG_RF_IQK,
1923 "[TXGAPK] reg0x56 =0x%x, txgapK_tmp1 =0x%x, txgapK_tmp2 =0x%x!!!\n",
1924 reg0x56, txgap_k_tmp1, txgap_k_tmp2);
1926 if (txgap_k_tmp1 == 0)
1928 else if (txgap_k_tmp1 < 2)
1930 else if (txgap_k_tmp1 < 4)
1935 if (txgap_k_tmp1 == 0x0) {
1936 rx_dsp_power = txgap_k_tmp2;
1938 txgap_k_tmp1 = txgap_k_tmp1 << (32 - offset);
1939 txgap_k_tmp2 = txgap_k_tmp2 >> offset;
1940 rx_dsp_power = txgap_k_tmp1 + txgap_k_tmp2;
1941 overflowflag = true;
1942 RF_DBG(dm, DBG_RF_IQK,
1943 "[TXGAPK](3) (1)overflowflag = true, txgapK_tmp1 =0x%x, txgapK_tmp2 =0x%x!!!\n",
1944 txgap_k_tmp1, txgap_k_tmp2);
1947 RF_DBG(dm, DBG_RF_IQK, "[TXGAPK](3) txgapK Fail!!!\n");
1950 odm_write_4byte(dm, 0x1bb8, reg_1bb8);
1952 return rx_dsp_power;
1955 void _phy_txgapk_calibrate_8821c(void *dm_void, u8 path)
1957 struct dm_struct *dm = (struct dm_struct *)dm_void;
1958 u32 txgain[txgap_k_number] = {0, 0, 0, 0, 0, 0, 0};
1959 u32 txgain_rf56[txgap_k_number] = {0, 0, 0, 0, 0, 0, 0};
1960 u8 add_base, txgapk_num = 0x0, psd_delta = 0x0;
1961 u8 i, bandselect = 0x0;
1962 u32 backup_txgap_reg[11] = {0x1b14, 0x1b1c, 0x1b20, 0x1b24, 0x1b28, 0x1b2c, 0x1b38, 0x1b3c, 0x1bd6, 0x1bb8, 0x1bcc};
1963 u32 backup_txgap[11];
1964 u8 gain_gap_index[txgap_k_number] = {0x13, 0x10, 0xd, 0xa, 0x7, 0x4, 0x1};
1965 u32 txgainindex[txgap_k_number] = {0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20};
1966 u32 tmp1, tmp2, tmp3, tmp4, tmp5;
1967 u8 skip_low_power_index = 0x3;
1969 s8 psd_single_tone_offset_1db[3][3] = {{-1, 0, 0}, {-2, -1, -1}, {-1, -1, -1} }; /*5G, L,M,H, index 32,26,20*/
1970 static u32 pwr_table_1db[27] = {590, 630, 668, 707, 749, 794, 841, 891, 944, 1000, 1040, 1096, 1148, 1202, 1258, 1318,
1971 1380, 1412, 1513, 1584, 1678, 1778, 1888, 1995, 2113, 2387, 2391};
1972 static u32 pwr_table_3db[27] = {944, 1000, 1059, 1122, 1185, 1258, 1333, 1412, 1496, 1584, 1659, 1737, 1819, 1905, 1995, 2089,
1973 2187, 2290, 2398, 2511, 2660, 2818, 2985, 3162, 3349, 3548, 3758};
1974 boolean txgapkdone = false;
1975 u8 txgap_changed = 0x0;
1979 RF_DBG(dm, DBG_RF_IQK,
1980 "[TXGAPK] (1) *dm->band_width = %x, *dm->channel =%d, *dm->band_type=%x\n",
1981 *dm->band_width, *dm->channel, *dm->band_type);
1983 if (!(*dm->mp_mode))
1986 if (!(*dm->band_type == ODM_BAND_5G))
1989 if (*dm->band_width == 0) {
1993 if (*dm->channel < 64) {
1996 } else if (*dm->channel < 153) {
2000 /*else if (*dm->channel ==153){*/
2006 } else if (*dm->band_width == 1) {
2007 if (*dm->channel < 102) {
2010 } else if (*dm->channel < 151) {
2014 /*else if (*dm->channel ==151){*/
2020 } else if (*dm->band_width == 2) {
2022 if (*dm->channel < 106) {
2025 } else if (*dm->channel < 155) {
2029 /*else if (*dm->channel ==155){*/
2039 if (txgap_done[bandselect])
2043 _txgapk_backup_8821c(dm, backup_txgap, backup_txgap_reg, 0xb);
2045 phydm_clear_kfree_to_rf(dm, RF_PATH_A, 1);
2047 for (i = 0; i < txgap_k_number; i++) {
2048 txgain_rf56[i] = _txgapk_get_rf_tx_index_8821c(dm, RF_PATH_A, gain_gap_index[i]);
2049 txgain[i] = txgain_rf56[i];
2052 for (i = 0; i < txgap_k_number; i++) {
2053 RF_DBG(dm, DBG_RF_IQK, "[TXGAPK] start txgain1[%x]=0x%x\n", i,
2057 _txgapk_setting_8821c(dm, RF_PATH_A);
2062 while (!txgapkdone) {
2067 for (i = 0; i < txgap_k_number - 1 - skip_low_power_index; i++) {
2068 tmp1 = (txgain[i] & 0x000000e0) >> 5;
2069 tmp2 = (txgain[i + 1] & 0x000000e0) >> 5;
2070 tmp5 = txgain[i + 1];
2072 //if (tmp1 != tmp2){
2075 tmp3 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i] - 2);
2076 tmp4 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i + 1]);
2078 overflowflag = false;
2084 _txgapk_txpower_compare_8821c(dm, RF_PATH_A, tmp3, tmp4, pwr_table_1db);
2086 psd_delta = psd_delta + psd_single_tone_offset_1db[bandselect][i];
2087 RF_DBG(dm, DBG_RF_IQK,
2088 "[TXGAPK] new psd_detla = %x\n",
2091 if (psd_delta <= 0xb)
2093 else if (psd_delta <= 0x11)
2099 _txgapk_txgap_compenstion_8821c(dm, RF_PATH_A, txgain[i + 1], psd_delta);
2101 RF_DBG(dm, DBG_RF_IQK,
2102 "[TXGAPK]skip i=%d, txgain[%x]=0x%x\n",
2103 i, i + 1, txgain[i + 1]);
2109 if (txgap_changed > 0x0) {
2110 RF_DBG(dm, DBG_RF_IQK, "[TXGAPK] do 3dB check\n");
2112 for (i = 0; i < txgap_k_number - 1 - skip_low_power_index; i++) {
2113 tmp1 = (txgain[i] & 0x000000e0) >> 5;
2114 tmp2 = (txgain[i + 1] & 0x000000e0) >> 5;
2118 tmp3 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i] - 2);
2120 tmp3 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i]);
2122 tmp4 = _txgapk_one_shot_8821c(dm, RF_PATH_A, txgain[i + 1]);
2125 overflowflag = false;
2126 RF_DBG(dm, DBG_RF_IQK, "[IQK] tmp3= %x, tmp4= %x\n", tmp3, tmp4);
2130 _txgapk_txpower_compare_8821c(dm, RF_PATH_A, tmp3, tmp4, pwr_table_1db);
2134 _txgapk_txpower_compare_8821c(dm, RF_PATH_A, tmp3, tmp4, pwr_table_3db);
2136 if (psd_delta <= 0xa)
2138 else if (psd_delta <= 0x12)
2143 RF_DBG(dm, DBG_RF_IQK, "[TXGAPK]skip i=%d, txgain[%x]=0x%x\n", i, i + 1, txgain[i + 1]);
2147 if (ref_val == 0x0) {
2149 txgap_changed = 0x0;
2151 /* restore default rf 0x56 */
2152 for (i = 0; i < txgap_k_number; i++)
2153 txgain[i] = txgain_rf56[i];
2162 _txgapk_restore_8821c(dm, backup_txgap, backup_txgap_reg, 0xb);
2165 RF_DBG(dm, DBG_RF_IQK,
2166 "[TXGAPK]txgapkdone =%x, txgap_changed=0x%x, ref_val =0x%x\n",
2167 txgapkdone, txgap_changed, ref_val);
2170 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00800);
2172 for (i = 0; i < txgap_k_number; i++) {
2173 odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, txgainindex[i] + add_base);
2174 odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, RFREGOFFSETMASK, txgain[i]);
2176 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00000);
2177 txgap_done[bandselect] = true;
2185 _DPK_BackupReg_8821C(
2186 struct dm_struct* dm,
2187 static u32* DPK_backup,
2194 for (i = 0; i < DPK_BACKUP_REG_NUM_8821C; i++)
2195 DPK_backup[i] = odm_read_4byte(dm, backup_dpk_reg[i]);
2200 struct dm_struct* dm,
2201 static u32* DPK_backup,
2206 for (i = 0; i < DPK_BACKUP_REG_NUM_8821C; i++)
2207 odm_write_4byte(dm, backup_dpk_reg[i], DPK_backup[i]);
2212 void _dpk_toggle_rxagc(struct dm_struct *dm, boolean reset)
2214 /*toggle RXAGC workaround method*/
2216 tmp1 = odm_read_4byte(dm, 0xc50);
2217 odm_set_bb_reg(dm, R_0xc50, BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x0);
2219 /* ODM_sleep_ms(2);*/
2222 odm_set_bb_reg(dm, R_0xc50, BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x2);
2224 /* ODM_sleep_ms(2);*/
2227 odm_set_bb_reg(dm, R_0xc50, BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x0);
2228 odm_write_4byte(dm, 0xc50, tmp1);
2231 void _dpk_set_gain_scaling(struct dm_struct *dm, u8 path)
2233 u32 tmp1, tmp2, tmp3, tmp4, reg_1bfc;
2234 u32 lut_i = 0x0, lut_q = 0x0, lut_pw = 0x0, lut_pw_avg = 0x0;
2235 u16 gain_scaling = 0x0;
2237 tmp1 = odm_read_4byte(dm, 0x1b00);
2238 tmp2 = odm_read_4byte(dm, 0x1b08);
2239 tmp3 = odm_read_4byte(dm, 0x1bd4);
2240 tmp4 = odm_read_4byte(dm, 0x1bdc);
2242 odm_write_4byte(dm, 0x1b00, 0xf8000008);
2243 odm_write_4byte(dm, 0x1b08, 0x00000080);
2244 odm_write_4byte(dm, 0x1bd4, 0x00040001);
2245 odm_write_4byte(dm, 0x1bdc, 0xc0000081);
2247 reg_1bfc = odm_read_4byte(dm, 0x1bfc);
2248 lut_i = (reg_1bfc & 0x003ff800) >> 11;
2249 lut_q = (reg_1bfc & 0x00007ff);
2251 if ((lut_i & 0x400) == 0x400)
2252 lut_i = 0x800 - lut_i;
2253 if ((lut_q & 0x400) == 0x400)
2254 lut_q = 0x800 - lut_q;
2256 lut_pw = lut_i * lut_i + lut_q * lut_q;
2257 lut_pw_avg = (u32)(lut_i + lut_q) >> 1;
2258 gain_scaling = (u16)(0x800000 / lut_pw_avg);
2260 odm_set_bb_reg(dm, R_0x1b98, 0x0000ffff, gain_scaling);
2261 odm_set_bb_reg(dm, R_0x1b98, 0xffff0000, gain_scaling);
2263 odm_write_4byte(dm, 0x1b00, tmp1);
2264 odm_write_4byte(dm, 0x1b08, tmp2);
2265 odm_write_4byte(dm, 0x1bd4, tmp3);
2266 odm_write_4byte(dm, 0x1bdc, tmp4);
2268 RF_DBG(dm, DBG_RF_IQK,
2269 "[IQK] reg_1bfc =0x%x, lut_pw =0x%x, lut_i = 0x%x, lut_q = 0x%x, lut_pw_avg = 0x%x, gain_scaling = 0x%x, 0x1b98 =0x%x!!!\n",
2270 reg_1bfc, lut_pw, lut_i, lut_q, lut_pw_avg, gain_scaling,
2271 odm_read_4byte(dm, 0x1b98));
2274 void _dpk_set_dpk_pa_scan(struct dm_struct *dm, u8 path)
2276 u32 tmp1, tmp2, reg_1bfc;
2277 u32 pa_scan_i = 0x0, pa_scan_q = 0x0, pa_scan_pw = 0x0;
2278 u32 gainloss_back = 0x0;
2280 /* boolean pa_scan_search_fail = false;*/
2282 tmp1 = odm_read_4byte(dm, 0x1bcf);
2283 tmp2 = odm_read_4byte(dm, 0x1bd4);
2285 odm_write_4byte(dm, 0x1bcf, 0x11);
2286 odm_write_4byte(dm, 0x1bd4, 0x00060000);
2288 reg_1bfc = odm_read_4byte(dm, 0x1bfc);
2289 odm_write_4byte(dm, 0x1bcf, 0x15);
2290 pa_scan_i = (reg_1bfc & 0xffff0000) >> 16;
2291 pa_scan_q = (reg_1bfc & 0x0000ffff);
2293 if ((pa_scan_i & 0x8000) == 0x8000)
2294 pa_scan_i = 0x10000 - pa_scan_i;
2295 if ((pa_scan_q & 0x8000) == 0x8000)
2296 pa_scan_q = 0x10000 - pa_scan_q;
2298 pa_scan_pw = pa_scan_i * pa_scan_i + pa_scan_q * pa_scan_q;
2300 /*estimated pa_scan_pw*/
2302 /*0dB => (512^2) * 10^(0/10) = 262144*/
2303 /*1dB => (512^2) * 10^(1/10) = 330019*/
2304 /*2dB => (512^2) * 10^(2/10) = 415470*/
2305 /*3dB => (512^2) * 10^(3/10) = 523046*/
2306 /*4dB => (512^2) * 10^(4/10) = 658475*/
2307 /*5dB => (512^2) * 10^(5/10) = 828972*/
2308 /*6dB => (512^2) * 10^(6/10) = 1043614*/
2309 /*7dB => (512^2) * 10^(7/10) = 1313832*/
2310 /*8dB => (512^2) * 10^(0/10) = 1654016*/
2311 /*9dB => (512^2) * 10^(1/10) = 2082283*/
2312 /*10dB => (512^2) * 10^(2/10) = 2621440*/
2313 /*11dB => (512^2) * 10^(3/10) = 3300197*/
2314 /*12dB => (512^2) * 10^(4/10) = 4154702*/
2315 /*13dB => (512^2) * 10^(5/10) = 5230460*/
2316 /*14dB => (512^2) * 10^(6/10) = 6584759*/
2317 /*15dB => (512^2) * 10^(7/10) = 8289721*/
2319 if (pa_scan_pw >= 0x7e7db9)
2321 else if (pa_scan_pw >= 0x6479b7)
2323 else if (pa_scan_pw >= 0x4fcf7c)
2325 else if (pa_scan_pw >= 0x3f654e)
2327 else if (pa_scan_pw >= 0x325b65)
2329 else if (pa_scan_pw >= 0x280000)
2331 else if (pa_scan_pw >= 0x1fc5eb)
2333 else if (pa_scan_pw >= 0x193d00)
2335 else if (pa_scan_pw >= 0x140c28)
2337 else if (pa_scan_pw >= 0xefc9e)
2339 else if (pa_scan_pw >= 0xca62c)
2341 else if (pa_scan_pw > 0xa0c2b)
2343 else if (pa_scan_pw > 0x7fb26)
2345 else if (pa_scan_pw > 0x656ee)
2347 else if (pa_scan_pw > 0x50923)
2349 else /*262144 >= pa_scan_pw*/
2352 odm_write_4byte(dm, 0x1bd4, 0x00060001);
2353 gainloss_back = (odm_read_4byte(dm, 0x1bfc) & 0x0000000f);
2355 if (gainloss_back <= 0xa)
2356 gainloss_back = 0xa - gainloss_back;
2358 if (gainloss_back > pa_scan_pw + 0x8)
2359 odm_set_rf_reg(dm, path, RF_0x8f, BIT(14) | BIT(13), 0x11);
2360 else if ((pa_scan_pw + 0x8 - gainloss_back) >= 0x6)
2361 odm_set_rf_reg(dm, path, RF_0x8f, BIT(14) | BIT(13), 0x00);
2364 /*if (0x6 >= (pa_scan_pw + 0x8 - gainloss_back)> 0x0 )*/
2366 odm_set_rf_reg(dm, path, RF_0x8f, BIT(14) | BIT(13), 0x01);
2368 RF_DBG(dm, DBG_RF_IQK,
2369 "[IQK] reg_1bfc =0x%x, pa_scan_pw =0x%x, gainloss_back = 0x%x, pa_scan_i = 0x%x, pa_scan_q = 0x%x, RF0x8f = 0x%x, !!!\n",
2370 reg_1bfc, pa_scan_pw, gainloss_back, pa_scan_i, pa_scan_q,
2371 odm_get_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK));
2373 odm_write_4byte(dm, 0x1bcf, tmp1);
2374 odm_write_4byte(dm, 0x1bd4, tmp2);
2377 void _dpk_disable_bb_dynamic_pwr_threshold(struct dm_struct *dm, boolean flag)
2379 if (flag) /*disable BB dynamic pwr threshold hold*/
2380 odm_set_bb_reg(dm, R_0x1c74, BIT(31) | BIT(30) | BIT(29) | BIT(28), 0x0);
2382 odm_set_bb_reg(dm, R_0x1c74, BIT(31) | BIT(30) | BIT(29) | BIT(28), 0x2);
2383 RF_DBG(dm, DBG_RF_IQK, "[DPK]\nset 0x1c74 = 0x%x\n",
2384 odm_read_4byte(dm, 0x1c74));
2387 void _dpk_set_dpk_sram_to_10_8821c(struct dm_struct *dm, u8 path)
2391 tmp1 = odm_read_4byte(dm, 0x1b00);
2392 tmp2 = odm_read_4byte(dm, 0x1b08);
2394 for (i = 0; i < 64; i++)
2395 odm_write_4byte(dm, 0x1bdc, 0xd0000001 + (i * 2) + 1);
2397 for (i = 0; i < 64; i++)
2398 odm_write_4byte(dm, 0x1bdc, 0x90000080 + (i * 2) + 1);
2402 RF_DBG(dm, DBG_RF_IQK,
2403 "[DPK]return txagc = 0x%x , 1bfc = 0x%x,rf00=0x%x\n",
2404 tmp4, odm_read_4byte(dm, 0x1bfc),
2405 odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK));
2408 odm_write_4byte(dm, 0x1bdc, 0x0);
2409 odm_write_4byte(dm, 0x1b00, tmp1);
2410 odm_write_4byte(dm, 0x1b08, tmp2);
2413 void _dpk_set_bbtxagc_8821c(struct dm_struct *dm, u8 path)
2417 for (hw_rate = 0; hw_rate < 0x53; hw_rate++) {
2418 phydm_write_txagc_1byte_8821c(dm, 0x30, (enum rf_path)0x0, hw_rate);
2420 tmp = config_phydm_read_txagc_8821c(dm, (enum rf_path)0x0, hw_rate);
2423 RF_DBG(dm, DBG_RF_IQK,
2424 "hw_rate =0x%x, tmp =0x%x \n", hw_rate, tmp);
2430 u8 _dpk_get_txagcindpk_8821c(struct dm_struct *dm, u8 path)
2432 u32 tmp1, tmp2, tmp3;
2434 tmp1 = odm_read_4byte(dm, 0x1bcc);
2435 odm_set_bb_reg(dm, R_0x1bcc, BIT(26), 0x01);
2436 tmp2 = odm_read_4byte(dm, 0x1bd4);
2437 odm_set_bb_reg(dm, R_0x1bd4, BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16), 0x0a);
2438 tmp3 = odm_read_4byte(dm, 0x1bfc);
2439 tmp4 = ((u8)odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD)) >> 2;
2442 RF_DBG(dm, DBG_RF_IQK,
2443 "[DPK]return txagc = 0x%x , 1bfc = 0x%x,rf00=0x%x\n",
2444 tmp4, odm_read_4byte(dm, 0x1bfc),
2445 odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK));
2448 odm_write_4byte(dm, 0x1bcc, tmp1);
2449 odm_write_4byte(dm, 0x1bd4, tmp2);
2454 void _dpk_ampmcurce_8821c(struct dm_struct *dm, u8 path)
2457 RF_DBG(dm, DBG_RF_IQK, "[DPK] 0x1bcc = 0x%x, 0x1bb8 =0x%x\n",
2458 odm_read_4byte(dm, 0x1bcc), odm_read_4byte(dm, 0x1bb8));
2460 odm_write_4byte(dm, 0x1bcc, 0x118f8800);
2461 for (i = 0; i < 8; i++) {
2462 odm_write_4byte(dm, 0x1b90, 0x0101e018 + i);
2463 odm_write_4byte(dm, 0x1bd4, 0x00060000);
2464 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2465 odm_write_4byte(dm, 0x1bd4, 0x00070000);
2466 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2467 odm_write_4byte(dm, 0x1bd4, 0x00080000);
2468 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2469 odm_write_4byte(dm, 0x1bd4, 0x00090000);
2470 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2473 odm_write_4byte(dm, 0x1b90, 0x0001e018);
2475 void _dpk_readsram_8821c(struct dm_struct *dm, u8 path)
2479 odm_write_4byte(dm, 0x1b00, 0xf8000008);
2480 odm_write_4byte(dm, 0x1b08, 0x00000080);
2481 odm_write_4byte(dm, 0x1bd4, 0x00040001);
2483 RF_DBG(dm, DBG_RF_IQK, "[DPK] SRAM value!!!\n");
2485 for (i = 0; i < 64; i++) {
2487 /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
2489 odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
2491 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2493 odm_write_4byte(dm, 0x1bd4, 0x00050001);
2494 for (i = 0; i < 64; i++) {
2496 /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
2498 odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
2500 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2503 /*ODM_sleep_ms(200);*/
2507 /*odm_write_4byte(dm, 0x1b08, 0x00000080);*/
2509 odm_write_4byte(dm, 0x1bd4, 0xA0001);
2510 odm_write_4byte(dm, 0x1bdc, 0x00000000);
2513 void _dpk_restore_8821c(struct dm_struct *dm, u8 path)
2515 odm_write_4byte(dm, 0xc60, 0x700B8040);
2516 odm_write_4byte(dm, 0xc60, 0x700B8040);
2517 odm_write_4byte(dm, 0xc60, 0x70146040);
2518 odm_write_4byte(dm, 0xc60, 0x70246040);
2519 odm_write_4byte(dm, 0xc60, 0x70346040);
2520 odm_write_4byte(dm, 0xc60, 0x70446040);
2521 odm_write_4byte(dm, 0xc60, 0x705B2040);
2522 odm_write_4byte(dm, 0xc60, 0x70646040);
2523 odm_write_4byte(dm, 0xc60, 0x707B8040);
2524 odm_write_4byte(dm, 0xc60, 0x708B8040);
2525 odm_write_4byte(dm, 0xc60, 0x709B8040);
2526 odm_write_4byte(dm, 0xc60, 0x70aB8040);
2527 odm_write_4byte(dm, 0xc60, 0x70bB6040);
2528 odm_write_4byte(dm, 0xc60, 0x70c06040);
2529 odm_write_4byte(dm, 0xc60, 0x70d06040);
2530 odm_write_4byte(dm, 0xc60, 0x70eF6040);
2531 odm_write_4byte(dm, 0xc60, 0x70f06040);
2533 odm_write_4byte(dm, 0xc58, 0xd8020402);
2534 odm_write_4byte(dm, 0xc5c, 0xde000120);
2535 odm_write_4byte(dm, 0xc6c, 0x0000122a);
2537 odm_write_4byte(dm, 0x808, 0x24028211);
2539 /*odm_write_4byte(dm, 0x810, 0x211042A5);*/
2541 odm_write_4byte(dm, 0x90c, 0x13000000);
2542 odm_write_4byte(dm, 0x9a4, 0x80000088);
2543 odm_write_4byte(dm, 0xc94, 0x01000101);
2544 odm_write_4byte(dm, 0x1904, 0x00238000);
2545 odm_write_4byte(dm, 0x1904, 0x00228000);
2546 odm_write_4byte(dm, 0xC00, 0x00000007);
2549 void _dpk_clear_sram_8821c(struct dm_struct *dm, u8 path)
2555 odm_write_4byte(dm, 0x1bdc, 0x40caffe1);
2556 odm_write_4byte(dm, 0x1bdc, 0x4080a1e3);
2557 odm_write_4byte(dm, 0x1bdc, 0x405165e5);
2558 odm_write_4byte(dm, 0x1bdc, 0x403340e7);
2559 odm_write_4byte(dm, 0x1bdc, 0x402028e9);
2560 odm_write_4byte(dm, 0x1bdc, 0x401419eb);
2561 odm_write_4byte(dm, 0x1bdc, 0x400d10ed);
2562 odm_write_4byte(dm, 0x1bdc, 0x40080aef);
2564 odm_write_4byte(dm, 0x1bdc, 0x400506f1);
2565 odm_write_4byte(dm, 0x1bdc, 0x400304f3);
2566 odm_write_4byte(dm, 0x1bdc, 0x400203f5);
2567 odm_write_4byte(dm, 0x1bdc, 0x400102f7);
2568 odm_write_4byte(dm, 0x1bdc, 0x400101f9);
2569 odm_write_4byte(dm, 0x1bdc, 0x400101fb);
2570 odm_write_4byte(dm, 0x1bdc, 0x400101fd);
2571 odm_write_4byte(dm, 0x1bdc, 0x400101ff);
2573 odm_write_4byte(dm, 0x1bdc, 0x40caff81);
2574 odm_write_4byte(dm, 0x1bdc, 0x4080a183);
2575 odm_write_4byte(dm, 0x1bdc, 0x40516585);
2576 odm_write_4byte(dm, 0x1bdc, 0x40334087);
2577 odm_write_4byte(dm, 0x1bdc, 0x40202889);
2578 odm_write_4byte(dm, 0x1bdc, 0x4014198b);
2579 odm_write_4byte(dm, 0x1bdc, 0x400d108d);
2580 odm_write_4byte(dm, 0x1bdc, 0x40080a8f);
2581 odm_write_4byte(dm, 0x1bdc, 0x40050691);
2582 odm_write_4byte(dm, 0x1bdc, 0x40030493);
2583 odm_write_4byte(dm, 0x1bdc, 0x40020395);
2584 odm_write_4byte(dm, 0x1bdc, 0x40010297);
2585 odm_write_4byte(dm, 0x1bdc, 0x40010199);
2586 odm_write_4byte(dm, 0x1bdc, 0x4001019b);
2587 odm_write_4byte(dm, 0x1bdc, 0x4001019d);
2588 odm_write_4byte(dm, 0x1bdc, 0x4001019f);
2590 odm_write_4byte(dm, 0x1bdc, 0x00000000);
2593 for (i = 0; i < 0x40; i++)
2594 odm_write_4byte(dm, 0x1bdc, 0xd0000000 + ((i * 2) + 1));
2596 for (i = 0; i < 0x40; i++)
2597 odm_write_4byte(dm, 0x1bdc, 0x90000080 + ((i * 2) + 1));
2599 odm_write_4byte(dm, 0x1bdc, 0x0);
2600 RF_DBG(dm, DBG_RF_IQK, "[DPK]==========write pwsf and clear sram/n");
2603 void _dpk_setting_8821c(struct dm_struct *dm, u8 path)
2605 RF_DBG(dm, DBG_RF_IQK,
2606 "[DPK]==========Start the DPD setting Initilaize/n");
2608 odm_write_4byte(dm, 0xc60, 0x50000000);
2609 odm_write_4byte(dm, 0xc60, 0x700F0040);
2610 odm_write_4byte(dm, 0xc5c, 0xd1000120);
2611 odm_write_4byte(dm, 0xc58, 0xd8000402);
2612 odm_write_4byte(dm, 0xc6c, 0x00000a15);
2613 odm_write_4byte(dm, 0xc00, 0x00000004);
2615 /*_iqk_bb_reset_8821c(dm);*/
2617 odm_write_4byte(dm, 0xe5c, 0xD1000120);
2618 odm_write_4byte(dm, 0xc6c, 0x00000A15);
2619 odm_write_4byte(dm, 0xe6c, 0x00000A15);
2620 odm_write_4byte(dm, 0x808, 0x2D028200);
2622 /*odm_write_4byte(dm, 0x810, 0x211042A5);*/
2624 odm_write_4byte(dm, 0x8f4, 0x00d80fb1);
2625 odm_write_4byte(dm, 0x90c, 0x0B00C000);
2626 odm_write_4byte(dm, 0x9a4, 0x00000080);
2627 odm_write_4byte(dm, 0xc94, 0x01000101);
2628 odm_write_4byte(dm, 0xe94, 0x01000101);
2629 odm_write_4byte(dm, 0xe5c, 0xD1000120);
2630 odm_write_4byte(dm, 0xc6c, 0x00000A15);
2631 odm_write_4byte(dm, 0xe6c, 0x00000A15);
2632 odm_write_4byte(dm, 0x1904, 0x00020000);
2635 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x80000);
2636 odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x00024);
2637 odm_set_rf_reg(dm, RF_PATH_A, RF_0x3e, RFREGOFFSETMASK, 0x0003F);
2638 odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, RFREGOFFSETMASK, 0xCBFCE);
2639 odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x00000);
2640 /*AGC boundary selection*/
2641 odm_write_4byte(dm, 0x1bbc, 0x0001abf6);
2642 odm_write_4byte(dm, 0x1b90, 0x0001e018);
2643 odm_write_4byte(dm, 0x1bb8, 0x000fffff);
2644 odm_write_4byte(dm, 0x1bc8, 0x000c55aa);
2646 /*odm_write_4byte(dm, 0x1bcc, 0x11978200);*/
2648 odm_write_4byte(dm, 0x1bcc, 0x11978800);
2650 /*odm_write_4byte(dm, 0xcb0, 0x77775747);*/
2651 /*odm_write_4byte(dm, 0xcb4, 0x100000f7);*/
2652 /*odm_write_4byte(dm, 0xcb4, 0x10000007);*/
2653 /*odm_write_4byte(dm, 0xcbc, 0x0);*/
2657 void _dpk_dynamic_bias_8821c(struct dm_struct *dm, u8 path, u8 dynamicbias)
2660 tmp = odm_get_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK);
2662 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, tmp);
2663 if ((*dm->band_type == ODM_BAND_5G) && (*dm->band_width == 1))
2664 odm_set_rf_reg(dm, path, RF_0x61, BIT(7) | BIT(6) | BIT(5) | BIT(4), dynamicbias);
2665 if ((*dm->band_type == ODM_BAND_5G) && (*dm->band_width == 2))
2666 odm_set_rf_reg(dm, path, RF_0x61, BIT(7) | BIT(6) | BIT(5) | BIT(4), dynamicbias);
2667 tmp = tmp & (~BIT(8));
2668 odm_set_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK, tmp);
2669 RF_DBG(dm, DBG_RF_IQK, "[DPK]Set DynamicBias 0xdf=0x%x, 0x61=0x%x\n",
2670 odm_get_rf_reg(dm, RF_PATH_A, RF_0xdf, RFREGOFFSETMASK),
2671 odm_get_rf_reg(dm, RF_PATH_A, RF_0x61, RFREGOFFSETMASK));
2674 void _dpk_boundary_selection_8821c(struct dm_struct *dm, u8 path)
2676 u8 tmp_pad, compared_pad, compared_txbb;
2677 u32 rf_backup_reg00;
2680 u32 boundaryselect = 0;
2681 struct dm_iqk_info *iqk_info = &dm->IQK_info;
2683 RF_DBG(dm, DBG_RF_IQK, "[DPK]Start the DPD boundary selection\n");
2684 rf_backup_reg00 = odm_get_rf_reg(dm, (enum rf_path)path, RF_0x00, RFREGOFFSETMASK);
2688 #if dpk_forcein_sram4
2689 for (i = 0x1f; i > 0x0; i--) { /*i=tx index*/
2690 odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, 0x20000 + i);
2692 if (iqk_info->is_btg) {
2693 compared_pad = (u8)((0x1c000 & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x78, RFREGOFFSETMASK)) >> 14);
2694 compared_txbb = (u8)((0x07C00 & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x5c, RFREGOFFSETMASK)) >> 10);
2696 compared_pad = (u8)((0xe0 & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x56, RFREGOFFSETMASK)) >> 5);
2697 compared_txbb = (u8)((0x1f & odm_get_rf_reg(dm, (enum rf_path)path, RF_0x56, RFREGOFFSETMASK)));
2700 /*boundaryselect = compared_txbb;*/
2701 boundaryselect = 0x1f;
2702 tmp_pad = compared_pad;
2704 if (compared_pad < tmp_pad) {
2705 boundaryselect = boundaryselect + (i << (j * 5));
2706 tmp_pad = compared_pad;
2715 boundaryselect = 0x0;
2717 odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_backup_reg00);
2718 odm_write_4byte(dm, 0x1bbc, boundaryselect);
2721 u8 _dpk_get_dpk_tx_agc_8821c(struct dm_struct *dm, u8 path)
2723 u8 tx_agc_init_value = 0x1f; /* DPK TXAGC value*/
2726 u8 best_tx_agc, txagcindpk = 0x0;
2728 boolean fail = true;
2729 u32 IQK_CMD = 0xf8000d18;
2731 /* rf_reg00 = 0x40000 + tx_agc_init_value; set TXAGC value */
2732 if (*dm->band_type == ODM_BAND_5G) {
2733 tx_agc_init_value = 0x1c;
2734 rf_reg00 = 0x40000 + tx_agc_init_value; /* set TXAGC value*/
2736 /*rf_reg00 = 0x54000 + tx_agc_init_value;*/ /* set TXAGC value*/
2738 odm_write_4byte(dm, 0x1bc8, 0x000c55aa);
2739 odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0xa9c00);
2741 tx_agc_init_value = 0x17;
2742 rf_reg00 = 0x44000 + tx_agc_init_value; /* set TXAGC value*/
2744 /*rf_reg00 = 0x54000 + tx_agc_init_value; */ /* set TXAGC value*/
2746 odm_write_4byte(dm, 0x1bc8, 0x000c44aa);
2747 odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0xaec00);
2749 odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_reg00);
2750 odm_set_bb_reg(dm, R_0x1b8c, BIT(15) | BIT(14) | BIT(13), gainloss);
2751 odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
2752 odm_set_bb_reg(dm, R_0x8f8, BIT(25) | BIT(24) | BIT(23) | BIT(22), 0x5);
2754 _dpk_set_bbtxagc_8821c(dm, RF_PATH_A);
2755 txagcindpk = _dpk_get_txagcindpk_8821c(dm, RF_PATH_A);
2757 if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
2758 odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
2761 /*ODM_sleep_ms(1);*/
2764 odm_write_4byte(dm, 0x1b00, IQK_CMD);
2765 odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
2767 fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
2769 odm_write_4byte(dm, 0x1b90, 0x0001e018);
2772 RF_DBG(dm, DBG_RF_IQK,
2773 "[DPK]rf_reg00 =0x%x, 0x8F =0x%x, txagcindpk =0x%x\n",
2774 odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK),
2775 odm_get_rf_reg(dm, path, RF_0x8f, RFREGOFFSETMASK),txagcindpk);
2779 odm_write_4byte(dm, 0x1bd4, 0x60001);
2780 tmp = (u8)odm_read_4byte(dm, 0x1bfc);
2781 best_tx_agc = tx_agc_init_value - (0xa - tmp);
2784 RF_DBG(dm, DBG_RF_IQK,
2785 "[DPK](2), 0x1b8c =0x%x, rf_reg00 = 0x%x, 0x1b00 = 0x%x, 0x1bfc = 0x%x, 0x1bd4 = 0x%x,best_tx_agc =0x%x, 0x1bfc[7:0] =0x%x\n",
2786 odm_read_4byte(dm, 0x1b8c),
2787 odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK),
2788 odm_read_4byte(dm, 0x1b00),
2789 odm_read_4byte(dm, 0x1bfc), odm_read_4byte(dm, 0x1bd4),
2796 RF_DBG(dm, DBG_RF_IQK, "[DPK] 0x1bcc = 0x%x, 0x1bb8 =0x%x\n",
2797 odm_read_4byte(dm, 0x1bcc), odm_read_4byte(dm, 0x1bb8));
2799 odm_write_4byte(dm, 0x1bcc, 0x118f8800);
2800 for (i = 0 ; i < 8; i++) {
2801 odm_write_4byte(dm, 0x1b90, 0x0101e018 + i);
2802 odm_write_4byte(dm, 0x1bd4, 0x00060000);
2803 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2804 odm_write_4byte(dm, 0x1bd4, 0x00070000);
2805 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2806 odm_write_4byte(dm, 0x1bd4, 0x00080000);
2807 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2808 odm_write_4byte(dm, 0x1bd4, 0x00090000);
2809 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2812 odm_write_4byte(dm, 0x1b90, 0x0001e018);
2819 _dpk_enable_dpk_8821c(struct dm_struct *dm, u8 path, u8 best_tx_agc)
2822 boolean fail = true;
2823 u32 IQK_CMD = 0xf8000e18;
2825 if (*dm->band_type == ODM_BAND_5G)
2826 rf_reg00 = 0x40000 + best_tx_agc; /* set TXAGC value*/
2828 rf_reg00 = 0x44000 + best_tx_agc; /* set TXAGC value*/
2829 odm_set_rf_reg(dm, RF_PATH_A, RF_0x00, RFREGOFFSETMASK, rf_reg00);
2830 _dpk_set_dpk_pa_scan(dm, RF_PATH_A);
2832 /*ODM_sleep_ms(1);*/
2834 odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
2835 odm_write_4byte(dm, 0x8f8, 0x41400080);
2837 if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
2838 odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
2840 /*ODM_sleep_ms(1);*/
2842 odm_write_4byte(dm, 0x1b00, IQK_CMD);
2843 odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
2845 odm_write_4byte(dm, 0x1b90, 0x0001e018);
2846 odm_write_4byte(dm, 0x1bd4, 0xA0001);
2847 fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
2850 RF_DBG(dm, DBG_RF_IQK,
2851 "[DPK] (3) 0x1b0b = 0x%x, 0x1bc8 = 0x%x, rf_reg00 = 0x%x, ,0x1bfc = 0x%x, 0x1b90=0x%x, 0x1b94=0x%x\n",
2852 odm_read_1byte(dm, 0x1b0b), odm_read_4byte(dm, 0x1bc8), odm_get_rf_reg(dm, path, RF_0x00, RFREGOFFSETMASK),
2853 odm_read_4byte(dm, 0x1bfc), odm_read_4byte(dm, 0x1b90), odm_read_4byte(dm, 0x1b94));
2856 #if 0 /* dbg message*/
2857 u8 delay_count = 0x0;
2860 odm_write_4byte(dm, 0x1b00, 0xf8000008);
2861 odm_write_4byte(dm, 0x1b08, 0x00000080);
2862 odm_write_4byte(dm, 0x1bd4, 0x00040001);
2864 RF_DBG(dm, DBG_RF_IQK, "[DPK] SRAM value!!!\n");
2866 for (i = 0 ; i < 64; i++) {
2867 /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
2868 odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
2870 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2872 odm_write_4byte(dm, 0x1bd4, 0x00050001);
2873 for (i = 0 ; i < 64; i++) {
2874 /*odm_write_4byte(dm, 0x1b90, 0x0101e018+i);*/
2875 odm_write_4byte(dm, 0x1bdc, 0xc0000081 + i * 2);
2877 RF_DBG(dm, DBG_RF_IQK, "0x%x\n", odm_read_4byte(dm, 0x1bfc));
2880 /*odm_write_4byte(dm, 0x1b08, 0x00000080);*/
2881 odm_write_4byte(dm, 0x1bd4, 0xA0001);
2882 odm_write_4byte(dm, 0x1bdc, 0x00000000);
2888 _dpk_enable_dpd_8821c(struct dm_struct *dm, u8 path, u8 best_tx_agc)
2890 boolean fail = true;
2892 u32 IQK_CMD = 0xf8000f18;
2893 u8 external_pswf_gain;
2894 boolean gain_scaling_enable = false;
2896 odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
2897 odm_write_4byte(dm, 0x8f8, 0x41400080);
2898 if (odm_get_rf_reg(dm, path, RF_0x08, RFREGOFFSETMASK) != 0x0)
2899 odm_set_rf_reg(dm, path, RF_0x8, RFREGOFFSETMASK, 0x0);
2900 /*ODM_sleep_ms(1);*/
2902 odm_write_4byte(dm, 0x1b00, IQK_CMD);
2903 odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
2904 fail = _iqk_check_nctl_done_8821c(dm, path, IQK_CMD);
2906 odm_write_4byte(dm, 0x1b90, 0x0001e018);
2907 odm_write_4byte(dm, 0x1bd4, 0xA0001);
2910 odm_write_4byte(dm, 0x1bcf, 0x19);
2911 odm_write_4byte(dm, 0x1bdc, 0x0);
2912 /*add 2db extrnal for compensate performnace, the reason is unknown*/
2913 external_pswf_gain = 0x2;
2914 best_tx_agc = best_tx_agc + external_pswf_gain;
2916 if (best_tx_agc >= 0x19)
2917 offset = best_tx_agc - 0x19;
2919 offset = 0x20 - (0x19 - best_tx_agc);
2920 odm_set_bb_reg(dm, R_0x1bd0, BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), offset);
2921 if (gain_scaling_enable)
2922 _dpk_set_gain_scaling(dm, RF_PATH_A);
2924 odm_write_4byte(dm, 0x1b98, 0x4c004c00);
2927 RF_DBG(dm, DBG_RF_IQK,
2928 "[DPK](4)0x1b08 =%x, 0x1bc8 = 0x%x,0x1bfc = 0x%x, ,0x1bd0 = 0x%x, offset =%x, 1bcc =%x\n",
2929 odm_read_4byte(dm, 0x1b08), odm_read_4byte(dm, 0x1bc8),
2930 odm_read_1byte(dm, 0x1bfc), odm_read_4byte(dm, 0x1bd0),
2931 offset, odm_read_4byte(dm, 0x1bcc));
2937 void _phy_dpd_calibrate_8821c(struct dm_struct *dm, boolean reset)
2939 u32 backup_dpdbb[3];
2940 u8 best_tx_agc = 0x1c;
2941 u32 MAC_backup[MAC_REG_NUM_8821C], RF_backup[RF_REG_NUM_8821C][1];
2942 u32 backup_mac_reg[MAC_REG_NUM_8821C] = {0x520, 0x550, 0x1518};
2943 u32 BB_backup[DPK_BB_REG_NUM_8821C];
2944 u32 backup_bb_reg[DPK_BB_REG_NUM_8821C] = {0x808, 0x90c, 0xc00, 0xcb0, 0xcb4, 0xcbc, 0x1990, 0x9a4, 0xa04, 0xc58, 0xc5c, 0xe58, 0xe5c, 0xc6c, 0xe6c, 0x90c, 0xc94, 0xe94, 0x1904, 0xcb0, 0xcb4, 0xcbc, 0xc00};
2945 u32 backup_rf_reg[RF_REG_NUM_8821C] = {0xdf, 0xde, 0x8f, 0x0, 0x1};
2947 u32 backup_dpk_reg[3] = {0x1bd0, 0x1b98, 0x1bbc};
2949 struct dm_iqk_info *iqk_info = &dm->IQK_info;
2950 iqk_info->is_btg = (boolean)odm_get_bb_reg(dm, R_0xcb8, BIT(16));
2951 if (!(*dm->mp_mode))
2952 if (_iqk_reload_iqk_8821c(dm, reset))
2954 if (!(*dm->band_type == ODM_BAND_5G))
2957 RF_DBG(dm, DBG_RF_IQK, "[DPK]==========DPK strat!!!!!==========\n");
2958 RF_DBG(dm, DBG_RF_IQK,
2959 "[DPK]band_type = %s, band_width = %d, ExtPA2G = %d, ext_pa_5g = %d\n",
2960 (*dm->band_type == ODM_BAND_5G) ? "5G" : "2G", *dm->band_width,
2961 dm->ext_pa, dm->ext_pa_5g);
2962 _iqk_backup_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, DPK_BB_REG_NUM_8821C);
2963 _iqk_afe_setting_8821c(dm, true);
2964 _iqk_backup_rf_8821c(dm, RF_backup, backup_rf_reg);
2966 if (iqk_info->is_btg) {
2968 if (*dm->band_type == ODM_BAND_2_4G)
2969 odm_set_bb_reg(dm, R_0xcb8, BIT(8), 0x1);
2971 odm_set_bb_reg(dm, R_0xcb8, BIT(8), 0x0);
2974 /*backup 0x1b2c, 1b38,0x1b3c*/
2975 backup_dpdbb[0] = odm_read_4byte(dm, 0x1b2c);
2976 backup_dpdbb[1] = odm_read_4byte(dm, 0x1b38);
2977 backup_dpdbb[2] = odm_read_4byte(dm, 0x1b3c);
2978 RF_DBG(dm, DBG_RF_IQK, "[DPK]In DPD Process(1), Backup\n");
2980 /*PDK Init Register setting*/
2981 _dpk_clear_sram_8821c(dm, RF_PATH_A);
2982 _dpk_setting_8821c(dm, RF_PATH_A);
2983 _dpk_boundary_selection_8821c(dm, RF_PATH_A);
2984 odm_set_bb_reg(dm, R_0x1bc8, BIT(31), 0x1);
2985 odm_set_bb_reg(dm, R_0x8f8, BIT(25) | BIT(24) | BIT(23) | BIT(22), 0x5);
2986 /* Get the best TXAGC*/
2988 best_tx_agc = _dpk_get_dpk_tx_agc_8821c(dm, RF_PATH_A);
2990 /*ODM_sleep_ms(2);*/
2994 RF_DBG(dm, DBG_RF_IQK, "[DPK]In DPD Process(2), Best TXAGC = 0x%x\n",
2997 if (_dpk_enable_dpk_8821c(dm, RF_PATH_A, best_tx_agc)) {
2998 RF_DBG(dm, DBG_RF_IQK,
2999 "[DPK]In DPD Process(3), DPK process is Fail\n");
3002 /*ODM_sleep_ms(2);*/
3005 if (_dpk_enable_dpd_8821c(dm, RF_PATH_A, best_tx_agc)) {
3006 RF_DBG(dm, DBG_RF_IQK,
3007 "[DPK]In DPD Process(4), DPD process is Fail\n");
3010 iqk_info->rf_reg18 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x18, RFREGOFFSETMASK);
3011 _iqk_reload_iqk_setting_8821c(dm, 0, 2);
3012 _iqk_fill_iqk_report_8821c(dm, 0);
3015 RF_DBG(dm, DBG_RF_IQK,
3016 "[DPK]reload IQK result before, iqk_info->rf_reg18=0x%x, iqk_info->iqk_channel[0]=0x%x, iqk_info->iqk_channel[1]=0x%x!!!!\n",
3017 iqk_info->rf_reg18, iqk_info->iqk_channel[0], iqk_info->iqk_channel[1]);
3023 /*_dpk_readsram_8821c(dm, RF_PATH_A);*/
3025 _dpk_restore_8821c(dm, RF_PATH_A);
3026 odm_set_bb_reg(dm, R_0x8f8, BIT(25) | BIT(24) | BIT(23) | BIT(22), 0x5);
3027 odm_set_bb_reg(dm, R_0x1bd4, BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16), 0x0);
3028 odm_set_bb_reg(dm, R_0x1b00, BIT(2) | BIT(1), 0x0);
3029 odm_set_bb_reg(dm, R_0x1b08, BIT(6) | BIT(5), 0x2);
3031 odm_write_4byte(dm, 0x1b2c, backup_dpdbb[0]);
3032 odm_write_4byte(dm, 0x1b38, backup_dpdbb[1]);
3033 odm_write_4byte(dm, 0x1b3c, backup_dpdbb[2]);
3035 odm_set_bb_reg(dm, R_0x1b2c, BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), 0x5);
3036 /*enable boundary condition*/
3037 #if dpk_forcein_sram4 /* disable : froce in sram4*/
3038 odm_set_bb_reg(dm, R_0x1bcc, BIT(27), 0x1);
3040 odm_write_4byte(dm, 0x1bcc, 0x11868800);
3041 RF_DBG(dm, DBG_RF_IQK, "[DPK]In DPD Process(5), Restore\n");
3042 _iqk_restore_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, DPK_BB_REG_NUM_8821C);
3043 _iqk_afe_setting_8821c(dm, false);
3044 _iqk_restore_rf_8821c(dm, backup_rf_reg, RF_backup);
3045 /*toggle dynamic_pwr_threshold*/
3047 /* backup the DPK current result*/
3048 for (i = 0; i < DPK_BACKUP_REG_NUM_8821C; i++)
3049 dpk_result[i] = odm_read_4byte(dm, backup_dpk_reg[i]);
3051 RF_DBG(dm, DBG_RF_IQK,
3052 "[DPK]the DPD calibration Process Finish (6), 0x1bd0 = 0x%x, 0x1b98 = 0x%x, 0x1bbc0= 0x%x\n",
3053 dpk_result[0], dpk_result[1], dpk_result[2]);
3056 u32 _iqk_tximr_selfcheck_8821c(void *dm_void, u8 tone_index, u8 path)
3058 u32 tx_ini_power_H[2], tx_ini_power_L[2];
3059 u32 tmp1, tmp2, tmp3, tmp4, tmp5;
3064 struct dm_struct *dm = (struct dm_struct *)dm_void;
3066 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
3067 odm_write_4byte(dm, 0x1bc8, 0x80000000);
3068 odm_write_4byte(dm, 0x8f8, 0x41400080);
3069 tmp1 = odm_read_4byte(dm, 0x1b0c);
3070 tmp2 = odm_read_4byte(dm, 0x1b14);
3071 tmp3 = odm_read_4byte(dm, 0x1b1c);
3072 tmp4 = odm_read_4byte(dm, 0x1b20);
3073 tmp5 = odm_read_4byte(dm, 0x1b24);
3075 odm_write_4byte(dm, 0x1b0c, 0x00003000);
3076 odm_write_4byte(dm, 0x1b1c, 0xA2193C32);
3077 odm_write_1byte(dm, 0x1b15, 0x00);
3078 odm_write_4byte(dm, 0x1b20, (u32)(tone_index << 20 | 0x00040008));
3079 odm_write_4byte(dm, 0x1b24, (u32)(tone_index << 20 | 0x00060008));
3080 odm_write_4byte(dm, 0x1b2c, 0x07);
3081 odm_write_4byte(dm, 0x1b38, 0x20000000);
3082 odm_write_4byte(dm, 0x1b3c, 0x20000000);
3083 /* ======derive pwr1========*/
3084 for (i = 0; i < 2; i++) {
3086 odm_write_4byte(dm, 0x1bcc, 0x0f);
3088 odm_write_4byte(dm, 0x1bcc, 0x09);
3090 IQK_CMD = 0x00000800;
3091 odm_write_4byte(dm, 0x1b34, IQK_CMD + 1);
3092 odm_write_4byte(dm, 0x1b34, IQK_CMD);
3094 odm_write_4byte(dm, 0x1bd4, 0x00040001);
3095 tx_ini_power_H[i] = odm_read_4byte(dm, 0x1bfc);
3096 odm_write_4byte(dm, 0x1bd4, 0x000C0001);
3097 tx_ini_power_L[i] = odm_read_4byte(dm, 0x1bfc);
3100 odm_write_4byte(dm, 0x1b0c, tmp1);
3101 odm_write_4byte(dm, 0x1b14, tmp2);
3102 odm_write_4byte(dm, 0x1b1c, tmp3);
3103 odm_write_4byte(dm, 0x1b20, tmp4);
3104 odm_write_4byte(dm, 0x1b24, tmp5);
3106 if (tx_ini_power_H[1] == tx_ini_power_H[0])
3107 tximr = (3 * (halrf_psd_log2base(tx_ini_power_L[0] << 2) - halrf_psd_log2base(tx_ini_power_L[1]))) / 100;
3113 u32 _iqk_rximr_selfcheck_8821c(void *dm_void, u8 tone_index, u8 path,
3116 u32 rx_ini_power_H[2], rx_ini_power_L[2]; /*[0]: psd tone; [1]: image tone*/
3117 u32 tmp1, tmp2, tmp3, tmp4, tmp5;
3118 u32 IQK_CMD, tmp1bcc;
3122 struct dm_struct *dm = (struct dm_struct *)dm_void;
3125 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
3126 tmp1 = odm_read_4byte(dm, 0x1b0c);
3127 tmp2 = odm_read_4byte(dm, 0x1b14);
3128 tmp3 = odm_read_4byte(dm, 0x1b1c);
3129 tmp4 = odm_read_4byte(dm, 0x1b20);
3130 tmp5 = odm_read_4byte(dm, 0x1b24);
3132 tmp1bcc = (odm_read_4byte(dm, 0x1be8) & 0x0000ff00) >> 8;
3133 odm_write_4byte(dm, 0x1b0c, 0x00001000);
3134 odm_write_1byte(dm, 0x1b15, 0x00);
3135 odm_write_4byte(dm, 0x1b1c, 0x82193d31);
3136 odm_write_4byte(dm, 0x1b20, (u32)(tone_index << 20 | 0x00040008));
3137 odm_write_4byte(dm, 0x1b24, (u32)(tone_index << 20 | 0x00060048));
3138 odm_write_4byte(dm, 0x1b2c, 0x07);
3140 //odm_write_4byte(dm, 0x1b38, iqk_info->rxk1_tmp1b38[path][(tone_index&0xff0)>>4]);
3142 odm_write_4byte(dm, 0x1b38, tmp1b38);
3144 odm_write_4byte(dm, 0x1b3c, 0x20000000);
3145 odm_write_4byte(dm, 0x1bcc, tmp1bcc);
3146 for (i = 0; i < 2; i++) {
3148 odm_write_4byte(dm, 0x1b1c, 0x82193d31);
3150 odm_write_4byte(dm, 0x1b1c, 0xA2193d31);
3151 IQK_CMD = 0x00000800;
3152 odm_write_4byte(dm, 0x1b34, IQK_CMD + 1);
3153 odm_write_4byte(dm, 0x1b34, IQK_CMD);
3155 odm_write_1byte(dm, 0x1bd6, 0xb);
3157 /*if ((boolean)odm_get_bb_reg(dm, R_0x1bfc, BIT(1))){*/
3160 odm_write_1byte(dm, 0x1bd6, 0x5);
3161 rx_ini_power_H[i] = odm_read_4byte(dm, 0x1bfc);
3162 odm_write_1byte(dm, 0x1bd6, 0xe);
3163 rx_ini_power_L[i] = odm_read_4byte(dm, 0x1bfc);
3165 rx_ini_power_H[i] = 0x0;
3166 rx_ini_power_L[i] = 0x0;
3170 odm_write_4byte(dm, 0x1b0c, tmp1);
3171 odm_write_4byte(dm, 0x1b14, tmp2);
3172 odm_write_4byte(dm, 0x1b1c, tmp3);
3173 odm_write_4byte(dm, 0x1b20, tmp4);
3174 odm_write_4byte(dm, 0x1b24, tmp5);
3176 for (i = 0; i < 2; i++)
3177 rx_ini_power_H[i] = (rx_ini_power_H[i] & 0xf8000000) >> 27;
3179 if (rx_ini_power_H[0] != rx_ini_power_H[1])
3180 switch (rx_ini_power_H[0]) {
3182 rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 1) | 0x80000000);
3183 rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 1;
3186 rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 2) | 0x80000000);
3187 rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 2;
3190 rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 2) | 0xc0000000);
3191 rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 2;
3194 rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0x80000000);
3195 rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
3198 rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0xa0000000);
3199 rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
3202 rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0xc0000000);
3203 rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
3206 rx_ini_power_L[0] = (u32)((rx_ini_power_L[0] >> 3) | 0xe0000000);
3207 rx_ini_power_L[1] = (u32)rx_ini_power_L[1] >> 3;
3212 rximr = (u32)(3 * ((halrf_psd_log2base(rx_ini_power_L[0] / 100) - halrf_psd_log2base(rx_ini_power_L[1] / 100))) / 100);
3215 RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%x, 0x%x, 0x%x, 0x%x,0x%x, tone_index=%x, rximr= %d\n",
3216 (path == 0) ? "PATH A RXIMR ": "PATH B RXIMR",
3217 rx_ini_power_H[0], rx_ini_power_L[0], rx_ini_power_H[1], rx_ini_power_L[1], tmp1bcc, tone_index, rximr);
3223 void _iqk_start_imr_test_8821c(void *dm_void, u8 path)
3225 u8 imr_limit, i, tone_index;
3228 u32 rxk1_tmp1b38[2][15];
3231 struct dm_struct *dm = (struct dm_struct *)dm_void;
3234 if (*dm->band_width == 2)
3236 else if (*dm->band_width == 1)
3241 _iqk_txk_setting_8821c(dm, RF_PATH_A);
3242 KFAIL = _iqk_one_shot_8821c(dm, RF_PATH_A, TXIQK);
3243 for (i = 0x0; i <= imr_limit; i++) {
3244 tone_index = (u8)(0x08 | i << 4);
3245 imr_result[RF_PATH_A] = _iqk_tximr_selfcheck_8821c(dm, tone_index, RF_PATH_A);
3246 RF_DBG(dm, DBG_RF_IQK, "[IQK]toneindex = %x, TXIMR = %d\n",
3247 tone_index, imr_result[RF_PATH_A]);
3249 RF_DBG(dm, DBG_RF_IQK, "\n");
3251 /*get the rxk1 tone index 0x1b38 setting*/
3252 _iqk_rxk1setting_8821c(dm, path);
3253 tmp = odm_read_4byte(dm, 0x1b1c);
3254 for (path = 0; path < SS_8821C; path++) {
3255 for (i = 0; i <= imr_limit; i++) {
3256 tone_index = (u8)(0x08 | i << 4);
3257 KFAIL = _iqk_rx_iqk_gain_search_fail_by_toneindex_8821c(dm, path, RXIQK1, tone_index);
3259 odm_write_4byte(dm, 0x1b1c, 0xa2193c32);
3260 odm_write_4byte(dm, 0x1b14, 0xe5);
3261 odm_write_4byte(dm, 0x1b14, 0x0);
3262 rxk1_tmp1b38[path][i] = odm_read_4byte(dm, 0x1b38);
3264 rxk1_tmp1b38[path][i] = 0x0;
3268 _iqk_rxk2setting_8821c(dm, path, true);
3269 for (path = 0; path < SS_8821C; path++) {
3270 for (i = 0x0; i <= imr_limit; i++) {
3271 tone_index = (u8)(0x08 | i << 4);
3272 imr_result[RF_PATH_A] = _iqk_rximr_selfcheck_8821c(dm, tone_index, RF_PATH_A, rxk1_tmp1b38[path][i]);
3273 RF_DBG(dm, DBG_RF_IQK,
3274 "[IQK]toneindex = %x, RXIMR = %d\n", tone_index,
3275 imr_result[RF_PATH_A]);
3278 odm_write_4byte(dm, 0x1b1c, tmp);
3279 odm_write_4byte(dm, 0x1b38, 0x20000000);
3282 void _phy_iq_calibrate_8821c(struct dm_struct *dm, boolean reset,
3283 boolean segment_iqk, boolean do_imr_test)
3285 u32 MAC_backup[MAC_REG_NUM_8821C], BB_backup[BB_REG_NUM_8821C];
3286 u32 RF_backup[RF_REG_NUM_8821C][1];
3287 u32 backup_mac_reg[MAC_REG_NUM_8821C] = {0x520, 0x550, 0x1518};
3288 u32 backup_bb_reg[BB_REG_NUM_8821C] = {0x808, 0x90c, 0xc00, 0xcb0,
3289 0xcb4, 0xcbc, 0x1990,
3290 0x9a4, 0xa04, 0x838};
3291 u32 backup_rf_reg[RF_REG_NUM_8821C] = {0xdf, 0xde, 0x8f, 0x0, 0x1};
3292 boolean is_mp = false;
3294 struct dm_iqk_info *iqk_info = &dm->IQK_info;
3298 else if (dm->is_linked)
3299 segment_iqk = false;
3300 iqk_info->is_btg = (boolean)odm_get_bb_reg(dm, R_0xcb8, BIT(16));
3303 if (_iqk_reload_iqk_8821c(dm, reset))
3306 RF_DBG(dm, DBG_RF_IQK,
3307 "[IQK]==========IQK strat!!!!!==========\n");
3308 RF_DBG(dm, DBG_RF_IQK,
3309 "[IQK]band_type = %s, band_width = %d, ExtPA2G = %d, ext_pa_5g = %d\n",
3310 (*dm->band_type == ODM_BAND_5G) ? "5G" : "2G", *dm->band_width,
3311 dm->ext_pa, dm->ext_pa_5g);
3312 RF_DBG(dm, DBG_RF_IQK, "[IQK]Interface = %d, cut_version = %x\n",
3313 dm->support_interface, dm->cut_version);
3315 iqk_info->tmp_gntwl = _iqk_indirect_read_reg(dm, 0x38);
3316 iqk_info->iqk_times++;
3317 iqk_info->kcount = 0;
3318 dm->rf_calibrate_info.iqk_total_progressing_time = 0;
3319 dm->rf_calibrate_info.iqk_step = 1;
3320 iqk_info->rxiqk_step = 1;
3321 iqk_info->is_reload = false;
3323 _iqk_backup_iqk_8821c(dm, 0x0, 0x0);
3324 _iqk_backup_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
3325 _iqk_backup_rf_8821c(dm, RF_backup, backup_rf_reg);
3329 dm->rf_calibrate_info.iqk_start_time = odm_get_current_time(dm);
3331 _iqk_configure_macbb_8821c(dm);
3332 _iqk_afe_setting_8821c(dm, true);
3333 _iqk_rfe_setting_8821c(dm, false);
3334 _iqk_agc_bnd_int_8821c(dm);
3335 _iqk_rfsetting_8821c(dm);
3337 _iqk_start_imr_test_8821c(dm, 0x0);
3338 dm->rf_calibrate_info.iqk_step = 4;
3340 _iqk_start_iqk_8821c(dm, segment_iqk);
3342 _iqk_afe_setting_8821c(dm, false);
3343 _iqk_restore_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
3344 _iqk_restore_rf_8821c(dm, backup_rf_reg, RF_backup);
3347 dm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
3348 dm->rf_calibrate_info.iqk_total_progressing_time += odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
3349 RF_DBG(dm, DBG_RF_IQK,
3350 "[IQK]IQK progressing_time = %lld ms\n",
3351 dm->rf_calibrate_info.iqk_progressing_time);
3354 if (dm->rf_calibrate_info.iqk_step == 4)
3357 iqk_info->kcount = 0;
3358 RF_DBG(dm, DBG_RF_IQK, "[IQK]delay 50ms!!!\n");
3360 /*ODM_sleep_ms(50);*/
3367 _iqk_reload_iqk_setting_8821c(dm, 0x0, 0x1);
3368 _iqk_fill_iqk_report_8821c(dm, 0);
3370 RF_DBG(dm, DBG_RF_IQK,
3371 "[IQK]Total IQK progressing_time = %lld ms\n",
3372 dm->rf_calibrate_info.iqk_total_progressing_time)
3374 RF_DBG(dm, DBG_RF_IQK,
3375 "[IQK]==========IQK end!!!!!==========\n");
3376 RF_DBG(dm, DBG_RF_IQK, "[IQK]check 0x49c = %x\n",
3377 odm_read_1byte(dm, 0x49c));
3381 void _phy_iq_calibrate_by_fw_8821c(void *dm_void, u8 clear, u8 segment_iqk)
3383 struct dm_struct *dm = (struct dm_struct *)dm_void;
3384 enum hal_status status = HAL_STATUS_FAILURE;
3388 else if (dm->is_linked)
3391 status = odm_iq_calibrate_by_fw(dm, clear, segment_iqk);
3393 if (status == HAL_STATUS_SUCCESS)
3394 RF_DBG(dm, DBG_RF_IQK, "[IQK]FWIQK OK!!!\n");
3396 RF_DBG(dm, DBG_RF_IQK, "[IQK]FWIQK fail!!!\n");
3399 /*********debug message start**************/
3401 void _phy_iqk_XYM_Read_Using_0x1b38_8821c(struct dm_struct *dm, u8 path)
3407 tmp = odm_read_4byte(dm, 0x1b1c);
3408 odm_write_4byte(dm, 0x1b1c, 0xA2193C32);
3409 RF_DBG(dm, DBG_RF_IQK, "\n");
3410 for (i = 0; i < 0xa; i++) {
3411 odm_write_4byte(dm, 0x1b14, 0xe6 + i);
3412 odm_write_4byte(dm, 0x1b14, 0x0);
3413 tmp2 = odm_read_4byte(dm, 0x1b38);
3414 RF_DBG(dm, DBG_RF_IQK, "%x\n", tmp2);
3416 odm_write_4byte(dm, 0x1b1c, tmp);
3417 RF_DBG(dm, DBG_RF_IQK, "\n");
3418 odm_write_4byte(dm, 0x1b38, 0x20000000);
3421 void _phy_iqk_debug_inner_lpbk_psd_8821c(struct dm_struct *dm, u8 path)
3427 u32 tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10;
3429 tmp1 = odm_read_4byte(dm, 0x1b20);
3430 tmp2 = odm_read_4byte(dm, 0x1b24);
3431 tmp3 = odm_read_4byte(dm, 0x1b15);
3432 tmp4 = odm_read_4byte(dm, 0x1b18);
3433 tmp5 = odm_read_4byte(dm, 0x1b1c);
3434 tmp6 = odm_read_4byte(dm, 0x1b28);
3435 tmp7 = odm_read_4byte(dm, 0x1b90);
3436 tmp8 = odm_read_4byte(dm, 0x1bcc);
3437 tmp9 = odm_read_4byte(dm, 0x1b2c);
3438 tmp10 = odm_read_4byte(dm, 0x1b30);
3439 odm_write_4byte(dm, 0x1b20, 0x03840008);
3440 odm_write_4byte(dm, 0x1b24, 0x03860008);
3441 odm_write_1byte(dm, 0x1b15, 0x00);
3442 odm_write_4byte(dm, 0x1b18, 0x00010101);
3443 odm_write_4byte(dm, 0x1b1c, 0x02effcb2);
3444 odm_write_4byte(dm, 0x1b28, 0x00060c00);
3445 odm_write_4byte(dm, 0x1b90, 0x00080003);
3446 odm_write_4byte(dm, 0x1bcc, 0x00000009);
3447 odm_write_4byte(dm, 0x1b2c, 0x20000003);
3448 odm_write_4byte(dm, 0x1b30, 0x20000000);
3449 RF_DBG(dm, DBG_RF_IQK, "\n");
3450 for (tx_x = 507; tx_x <= 532; tx_x++) {
3451 for (tx_y = 0; tx_y <= 10 + 20; tx_y++) {
3453 temp = (tx_x << 20) | (tx_y + 2048) << 8;
3455 temp = (tx_x << 20) | (tx_y << 8);
3456 odm_write_4byte(dm, 0x1b38, temp);
3457 odm_write_4byte(dm, 0x1b3c, 0x20000000);
3458 odm_write_4byte(dm, 0x1b34, 0x00000801);
3459 odm_write_4byte(dm, 0x1b34, 0x00000800);
3462 odm_write_4byte(dm, 0x1bd4, 0x000c0001);
3463 psd_pwr = odm_read_4byte(dm, 0x1bfc);
3464 RF_DBG(dm, DBG_RF_IQK, "%d ", psd_pwr);
3467 RF_DBG(dm, DBG_RF_IQK, "\n");
3468 odm_write_4byte(dm, 0x1b20, tmp1);
3469 odm_write_4byte(dm, 0x1b24, tmp2);
3470 odm_write_4byte(dm, 0x1b15, tmp3);
3471 odm_write_4byte(dm, 0x1b18, tmp4);
3472 odm_write_4byte(dm, 0x1b1c, tmp5);
3473 odm_write_4byte(dm, 0x1b28, tmp6);
3474 odm_write_4byte(dm, 0x1b90, tmp7);
3475 odm_write_4byte(dm, 0x1bcc, tmp8);
3476 odm_write_4byte(dm, 0x1b2c, tmp9);
3477 odm_write_4byte(dm, 0x1b30, tmp10);
3478 odm_write_4byte(dm, 0x1b38, 0x20000000);
3481 void _iqk_readsram_8821c(struct dm_struct *dm, u8 path)
3483 u32 tmp1bd4, tmp1bd8, tmp;
3486 tmp1bd4 = odm_read_4byte(dm, 0x1bd4);
3487 tmp1bd8 = odm_read_4byte(dm, 0x1bd8);
3488 odm_write_4byte(dm, 0x1bd4, 0x00010001);
3489 for (i = 0; i < 0x80; i++) {
3490 odm_write_4byte(dm, 0x1bd8, 0xa0000101 + (u32)(i << 1));
3491 tmp = (u32)odm_read_4byte(dm, 0x1bfc) & 0x3ff;
3493 RF_DBG(dm, DBG_RF_IQK, "adc_i[%d] = %x\n", i, tmp);
3495 RF_DBG(dm, DBG_RF_IQK, "adc_q[%d] = %x\n", i, tmp);
3499 void do_imr_test_8821c(void *dm_void)
3501 struct dm_struct *dm = (struct dm_struct *)dm_void;
3503 RF_DBG(dm, DBG_RF_IQK,
3504 "[IQK] ************IMR Test *****************\n");
3505 _phy_iq_calibrate_8821c(dm, false, false, true);
3506 RF_DBG(dm, DBG_RF_IQK,
3507 "[IQK] **********End IMR Test *******************\n");
3510 /*********debug message end***************/
3512 /*IQK version:0x23, NCTL:0x8*/
3513 /*1. modify the iqk counters for coex.*/
3515 void phy_iq_calibrate_8821c(void *dm_void, boolean clear, boolean segment_iqk)
3517 struct dm_struct *dm = (struct dm_struct *)dm_void;
3518 struct _hal_rf_ *rf = &dm->rf_table;
3520 if (!(*dm->mp_mode))
3521 _iqk_check_coex_status(dm, true);
3523 RF_DBG(dm, DBG_RF_IQK, "[IQK]fw_ver= 0x%x\n", rf->fw_ver);
3525 halrf_iqk_hwtx_check(dm, true);
3527 if (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) {
3528 _phy_iq_calibrate_by_fw_8821c(dm, clear, segment_iqk);
3529 phydm_get_read_counter_8821c(dm);
3530 RF_DBG(dm, DBG_RF_IQK, "[IQK]0x38= 0x%x\n",
3531 _iqk_indirect_read_reg(dm, 0x38));
3533 _iq_calibrate_8821c_init(dm);
3534 _phy_iq_calibrate_8821c(dm, clear, segment_iqk, false);
3536 _iqk_fail_count_8821c(dm);
3539 halrf_iqk_hwtx_check(dm, false);
3540 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
3541 _iqk_iqk_fail_report_8821c(dm);
3545 if (!(*dm->mp_mode))
3546 _iqk_check_coex_status(dm, false);
3547 RF_DBG(dm, DBG_RF_IQK, "[IQK]final 0x49c = %x\n",
3548 odm_read_1byte(dm, 0x49c));
3551 void phy_dp_calibrate_8821c(void *dm_void, boolean clear)
3553 struct dm_struct *dm = (struct dm_struct *)dm_void;
3554 struct _hal_rf_ *rf = &dm->rf_table;
3556 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
3557 if (odm_check_power_status(dm) == false)
3562 if ((dm->mp_mode != NULL) && (rf->is_con_tx != NULL) && (rf->is_single_tone != NULL) && (rf->is_carrier_suppresion != NULL))
3563 if (*(dm->mp_mode) && ((*(rf->is_con_tx) || *(rf->is_single_tone) || *(rf->is_carrier_suppresion))))
3567 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
3568 if (!(rf->rf_supportability & HAL_RF_DPK))
3576 RF_DBG(dm, DBG_RF_IQK, "[DPK] In PHY, dm->dpk_en == %x\n", rf->dpk_en);
3578 /*if dpk is not enable*/
3579 if (rf->dpk_en == 0x0)
3583 if (!dm->rf_calibrate_info.is_iqk_in_progress) {
3584 odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
3585 dm->rf_calibrate_info.is_iqk_in_progress = true;
3586 odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
3588 dm->rf_calibrate_info.iqk_start_time = odm_get_current_time(dm);
3592 _phy_dpd_calibrate_8821c(dm, clear);
3593 _dpk_toggle_rxagc(dm, clear);
3597 dm->rf_calibrate_info.iqk_progressing_time = odm_get_progressing_time(dm, dm->rf_calibrate_info.iqk_start_time);
3598 RF_DBG(dm, DBG_RF_IQK,
3599 "[DPK]DPK progressing_time = %lld ms\n",
3600 dm->rf_calibrate_info.iqk_progressing_time);
3602 odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
3603 dm->rf_calibrate_info.is_iqk_in_progress = false;
3604 odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
3606 RF_DBG(dm, DBG_RF_IQK,
3607 "[DPK]== Return the DPK CMD, because the DPK in Progress ==\n");
3610 void phy_txtap_calibrate_8821c(void *dm_void, boolean clear)
3612 u32 MAC_backup[MAC_REG_NUM_8821C], BB_backup[BB_REG_NUM_8821C], RF_backup[RF_REG_NUM_8821C][1];
3613 u32 backup_mac_reg[MAC_REG_NUM_8821C] = {0x520, 0x550, 0x1518};
3614 u32 backup_bb_reg[BB_REG_NUM_8821C] = {0x808, 0x90c, 0xc00, 0xcb0, 0xcb4, 0xcbc, 0x1990, 0x9a4, 0xa04};
3615 u32 backup_rf_reg[RF_REG_NUM_8821C] = {0xdf, 0xde, 0x8f, 0x0, 0x1};
3617 struct dm_struct *dm = (struct dm_struct *)dm_void;
3618 struct dm_iqk_info *iqk_info = &dm->IQK_info;
3620 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
3621 struct _ADAPTER *adapter = dm->adapter;
3623 #if (MP_DRIVER == 1)
3624 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3625 PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);
3627 #ifdef CONFIG_MP_INCLUDED
3628 PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);
3633 struct _hal_rf_ *rf = &dm->rf_table;
3635 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
3636 if (!(rf->rf_supportability & HAL_RF_IQK))
3640 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
3641 if (odm_check_power_status(adapter) == false)
3646 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3647 if (p_mpt_ctx->bSingleTone || p_mpt_ctx->bCarrierSuppression)
3650 #ifdef CONFIG_MP_INCLUDED
3651 if (p_mpt_ctx->is_single_tone || p_mpt_ctx->is_carrier_suppression)
3658 if (!(*dm->mp_mode))
3659 _iqk_check_coex_status(dm, true);
3661 if ((dm->rf_table.rf_supportability & HAL_RF_TXGAPK))
3662 if (iqk_info->lok_fail[RF_PATH_A] == 0 &&
3663 iqk_info->iqk_fail_report[0][RF_PATH_A][TXIQK] == 0 &&
3664 iqk_info->iqk_fail_report[0][RF_PATH_A][RXIQK] == 0) {
3665 _iqk_backup_iqk_8821c(dm, 0x0, 0x0);
3666 _iqk_backup_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
3667 _iqk_backup_rf_8821c(dm, RF_backup, backup_rf_reg);
3669 _iqk_configure_macbb_8821c(dm);
3670 _iqk_afe_setting_8821c(dm, true);
3671 _iqk_rfe_setting_8821c(dm, false);
3672 _iqk_agc_bnd_int_8821c(dm);
3673 _iqk_rfsetting_8821c(dm);
3675 _phy_txgapk_calibrate_8821c(dm, RF_PATH_A);
3677 _iqk_afe_setting_8821c(dm, false);
3678 _iqk_restore_mac_bb_8821c(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg, BB_REG_NUM_8821C);
3679 _iqk_restore_rf_8821c(dm, backup_rf_reg, RF_backup);
3682 void dpk_temperature_compensate_8821c(void *dm_void)
3684 struct dm_struct *dm = (struct dm_struct *)dm_void;
3685 struct _hal_rf_ *rf = &dm->rf_table;
3686 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
3687 void *adapter = dm->adapter;
3688 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
3689 u8 pgthermal = hal_data->eeprom_thermal_meter;
3691 struct rtl8192cd_priv *priv = dm->priv;
3692 u8 pgthermal = (u8)priv->pmib->dot11RFEntry.ther;
3695 static u8 dpk_tm_trigger;
3696 u8 thermal_value = 0, delta_dpk, i = 0;
3697 u8 thermal_value_avg_count = 0;
3698 u8 thermal_value_avg_times = 2;
3699 u32 thermal_value_avg = 0;
3700 u8 tmp, abs_temperature;
3702 /*if dpk is not enable*/
3703 if (rf->dpk_en == 0x0)
3705 /*if ap mode, disable dpk*/
3706 if (DM_ODM_SUPPORT_TYPE & ODM_AP)
3708 if (!dpk_tm_trigger) {
3709 odm_set_rf_reg(dm, RF_PATH_A, RF_0x42, BIT(17) | BIT(16), 0x03);
3711 /*RF_DBG(dm, DBG_RF_IQK, "[DPK] (1) Trigger Thermal Meter!!\n");*/
3720 /*RF_DBG(dm, DBG_RF_IQK, "[DPK] (2) calculate the thermal !!\n");
3724 /* calculate average thermal meter */
3725 thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A, RF_0x42, 0xfc00); /*0x42: RF Reg[15:10] 88E*/
3726 RF_DBG(dm, DBG_RF_IQK, "[DPK] (3) current Thermal Meter = %d\n",
3729 dm->rf_calibrate_info.thermal_value_dpk = thermal_value;
3730 dm->rf_calibrate_info.thermal_value_avg[dm->rf_calibrate_info.thermal_value_avg_index] = thermal_value;
3731 dm->rf_calibrate_info.thermal_value_avg_index++;
3732 if (dm->rf_calibrate_info.thermal_value_avg_index == thermal_value_avg_times)
3733 dm->rf_calibrate_info.thermal_value_avg_index = 0;
3734 for (i = 0; i < thermal_value_avg_times; i++) {
3735 if (dm->rf_calibrate_info.thermal_value_avg[i]) {
3736 thermal_value_avg += dm->rf_calibrate_info.thermal_value_avg[i];
3737 thermal_value_avg_count++;
3740 if (thermal_value_avg_count) /*Calculate Average thermal_value after average enough times*/
3741 thermal_value = (u8)(thermal_value_avg / thermal_value_avg_count);
3742 /* compensate the DPK */
3743 delta_dpk = (thermal_value > pgthermal) ? (thermal_value - pgthermal) : (pgthermal - thermal_value);
3744 tmp = (u8)((dpk_result[0] & 0x00001f00) >> 8);
3745 RF_DBG(dm, DBG_RF_IQK,
3746 "[DPK] (5)delta_dpk = %d, eeprom_thermal_meter = %d, tmp=%d\n",
3747 delta_dpk, pgthermal, tmp);
3749 if (thermal_value > pgthermal) {
3750 abs_temperature = thermal_value - pgthermal;
3751 if (abs_temperature >= 20)
3753 else if (abs_temperature >= 15)
3755 else if (abs_temperature >= 10)
3757 else if (abs_temperature >= 5)
3759 } else { /*low temperature*/
3760 abs_temperature = pgthermal - thermal_value;
3761 if (abs_temperature >= 20)
3763 else if (abs_temperature >= 15)
3765 else if (abs_temperature >= 10)
3767 else if (abs_temperature >= 5)
3771 odm_set_bb_reg(dm, R_0x1bd0, BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), tmp);
3772 RF_DBG(dm, DBG_RF_IQK,
3773 "[DPK] (6)delta_dpk = %d, eeprom_thermal_meter = %d, new tmp=%d, 0x1bd0=0x%x\n",
3774 delta_dpk, pgthermal, tmp, odm_read_4byte(dm, 0x1bd0));