1 /******************************************************************************
3 * Copyright(c) 2007 - 2016 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 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
22 * Larry Finger <Larry.Finger@lwfinger.net>
24 *****************************************************************************/
26 #include "../mp_precomp.h"
27 #include "../phydm_precomp.h"
29 /*---------------------------Define Local Constant---------------------------*/
31 static bool _iqk_rx_iqk_by_path_8822b(void *, u8);
33 static inline void phydm_set_iqk_info(struct phy_dm_struct *dm,
34 struct dm_iqk_info *iqk_info, u8 status)
39 KFAIL = _iqk_rx_iqk_by_path_8822b(dm, ODM_RF_PATH_A);
41 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
42 "[IQK]S0RXK KFail = 0x%x\n", KFAIL);
44 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
45 "[IQK]S1RXK KFail = 0x%x\n", KFAIL);
46 if (iqk_info->rxiqk_step == 5) {
47 dm->rf_calibrate_info.iqk_step++;
48 iqk_info->rxiqk_step = 1;
49 if (KFAIL && status == 0)
50 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
51 "[IQK]S0RXK fail code: %d!!!\n",
52 iqk_info->rxiqk_fail_code
54 else if (KFAIL && status == 1)
55 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
56 "[IQK]S1RXK fail code: %d!!!\n",
57 iqk_info->rxiqk_fail_code
66 static inline void phydm_init_iqk_information(struct dm_iqk_info *iqk_info)
70 for (i = 0; i < 2; i++) {
71 iqk_info->iqk_channel[i] = 0x0;
73 for (j = 0; j < SS_8822B; j++) {
74 iqk_info->lok_idac[i][j] = 0x0;
75 iqk_info->rxiqk_agc[i][j] = 0x0;
76 iqk_info->bypass_iqk[i][j] = 0x0;
78 for (k = 0; k < 2; k++) {
79 iqk_info->iqk_fail_report[i][j][k] = true;
80 for (m = 0; m < 8; m++) {
81 iqk_info->iqk_cfir_real[i][j][k][m] =
83 iqk_info->iqk_cfir_imag[i][j][k][m] =
88 for (k = 0; k < 3; k++)
89 iqk_info->retry_count[i][j][k] = 0x0;
94 static inline void phydm_backup_iqk_information(struct dm_iqk_info *iqk_info)
98 iqk_info->iqk_channel[1] = iqk_info->iqk_channel[0];
99 for (i = 0; i < 2; i++) {
100 iqk_info->lok_idac[1][i] = iqk_info->lok_idac[0][i];
101 iqk_info->rxiqk_agc[1][i] = iqk_info->rxiqk_agc[0][i];
102 iqk_info->bypass_iqk[1][i] = iqk_info->bypass_iqk[0][i];
103 iqk_info->rxiqk_fail_code[1][i] =
104 iqk_info->rxiqk_fail_code[0][i];
105 for (j = 0; j < 2; j++) {
106 iqk_info->iqk_fail_report[1][i][j] =
107 iqk_info->iqk_fail_report[0][i][j];
108 for (k = 0; k < 8; k++) {
109 iqk_info->iqk_cfir_real[1][i][j][k] =
110 iqk_info->iqk_cfir_real[0][i][j][k];
111 iqk_info->iqk_cfir_imag[1][i][j][k] =
112 iqk_info->iqk_cfir_imag[0][i][j][k];
117 for (i = 0; i < 4; i++) {
118 iqk_info->rxiqk_fail_code[0][i] = 0x0;
119 iqk_info->rxiqk_agc[0][i] = 0x0;
120 for (j = 0; j < 2; j++) {
121 iqk_info->iqk_fail_report[0][i][j] = true;
122 iqk_info->gs_retry_count[0][i][j] = 0x0;
124 for (j = 0; j < 3; j++)
125 iqk_info->retry_count[0][i][j] = 0x0;
129 static inline void phydm_set_iqk_cfir(struct phy_dm_struct *dm,
130 struct dm_iqk_info *iqk_info, u8 path)
135 for (idx = 0; idx < 2; idx++) {
136 odm_set_bb_reg(dm, 0x1b00, MASKDWORD, 0xf8000008 | path << 1);
139 odm_set_bb_reg(dm, 0x1b0c, BIT(13) | BIT(12), 0x3);
141 odm_set_bb_reg(dm, 0x1b0c, BIT(13) | BIT(12), 0x1);
143 odm_set_bb_reg(dm, 0x1bd4,
144 BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16),
147 for (i = 0; i < 8; i++) {
148 odm_set_bb_reg(dm, 0x1bd8, MASKDWORD,
149 0xe0000001 + (i * 4));
150 tmp = odm_get_bb_reg(dm, 0x1bfc, MASKDWORD);
151 iqk_info->iqk_cfir_real[0][path][idx][i] =
152 (tmp & 0x0fff0000) >> 16;
153 iqk_info->iqk_cfir_imag[0][path][idx][i] = tmp & 0xfff;
158 static inline void phydm_get_read_counter(struct phy_dm_struct *dm)
163 if (((odm_read_4byte(dm, 0x1bf0) >> 24) == 0x7f) ||
171 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION, "[IQK]counter = %d\n", counter);
174 /*---------------------------Define Local Constant---------------------------*/
176 void do_iqk_8822b(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
179 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
181 odm_reset_iqk_result(dm);
183 dm->rf_calibrate_info.thermal_value_iqk = thermal_value;
185 phy_iq_calibrate_8822b(dm, true);
188 static void _iqk_fill_iqk_report_8822b(void *dm_void, u8 channel)
190 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
191 struct dm_iqk_info *iqk_info = &dm->IQK_info;
192 u32 tmp1 = 0x0, tmp2 = 0x0, tmp3 = 0x0;
195 for (i = 0; i < SS_8822B; i++) {
197 ((iqk_info->iqk_fail_report[channel][i][TX_IQK] & 0x1)
200 ((iqk_info->iqk_fail_report[channel][i][RX_IQK] & 0x1)
202 tmp3 = tmp3 + ((iqk_info->rxiqk_fail_code[channel][i] & 0x3)
205 odm_write_4byte(dm, 0x1b00, 0xf8000008);
206 odm_set_bb_reg(dm, 0x1bf0, 0x0000ffff, tmp1 | tmp2 | tmp3);
208 for (i = 0; i < 2; i++)
210 dm, 0x1be8 + (i * 4),
211 (iqk_info->rxiqk_agc[channel][(i * 2) + 1] << 16) |
212 iqk_info->rxiqk_agc[channel][i * 2]);
215 static void _iqk_backup_mac_bb_8822b(struct phy_dm_struct *dm, u32 *MAC_backup,
216 u32 *BB_backup, u32 *backup_mac_reg,
221 for (i = 0; i < MAC_REG_NUM_8822B; i++)
222 MAC_backup[i] = odm_read_4byte(dm, backup_mac_reg[i]);
224 for (i = 0; i < BB_REG_NUM_8822B; i++)
225 BB_backup[i] = odm_read_4byte(dm, backup_bb_reg[i]);
228 static void _iqk_backup_rf_8822b(struct phy_dm_struct *dm, u32 RF_backup[][2],
233 for (i = 0; i < RF_REG_NUM_8822B; i++) {
234 RF_backup[i][ODM_RF_PATH_A] = odm_get_rf_reg(
235 dm, ODM_RF_PATH_A, backup_rf_reg[i], RFREGOFFSETMASK);
236 RF_backup[i][ODM_RF_PATH_B] = odm_get_rf_reg(
237 dm, ODM_RF_PATH_B, backup_rf_reg[i], RFREGOFFSETMASK);
241 static void _iqk_agc_bnd_int_8822b(struct phy_dm_struct *dm)
243 /*initialize RX AGC bnd, it must do after bbreset*/
244 odm_write_4byte(dm, 0x1b00, 0xf8000008);
245 odm_write_4byte(dm, 0x1b00, 0xf80a7008);
246 odm_write_4byte(dm, 0x1b00, 0xf8015008);
247 odm_write_4byte(dm, 0x1b00, 0xf8000008);
250 static void _iqk_bb_reset_8822b(struct phy_dm_struct *dm)
252 bool cca_ing = false;
255 odm_set_rf_reg(dm, ODM_RF_PATH_A, 0x0, RFREGOFFSETMASK, 0x10000);
256 odm_set_rf_reg(dm, ODM_RF_PATH_B, 0x0, RFREGOFFSETMASK, 0x10000);
259 odm_write_4byte(dm, 0x8fc, 0x0);
260 odm_set_bb_reg(dm, 0x198c, 0x7, 0x7);
261 cca_ing = (bool)odm_get_bb_reg(dm, 0xfa0, BIT(3));
270 odm_write_1byte(dm, 0x808, 0x0); /*RX ant off*/
271 odm_set_bb_reg(dm, 0xa04,
272 BIT(27) | BIT(26) | BIT(25) | BIT(24),
273 0x0); /*CCK RX path off*/
276 odm_set_bb_reg(dm, 0x0, BIT(16), 0x0);
277 odm_set_bb_reg(dm, 0x0, BIT(16), 0x1);
279 if (odm_get_bb_reg(dm, 0x660, BIT(16)))
280 odm_write_4byte(dm, 0x6b4, 0x89000006);
286 static void _iqk_afe_setting_8822b(struct phy_dm_struct *dm, bool do_iqk)
289 odm_write_4byte(dm, 0xc60, 0x50000000);
290 odm_write_4byte(dm, 0xc60, 0x70070040);
291 odm_write_4byte(dm, 0xe60, 0x50000000);
292 odm_write_4byte(dm, 0xe60, 0x70070040);
294 odm_write_4byte(dm, 0xc58, 0xd8000402);
295 odm_write_4byte(dm, 0xc5c, 0xd1000120);
296 odm_write_4byte(dm, 0xc6c, 0x00000a15);
297 odm_write_4byte(dm, 0xe58, 0xd8000402);
298 odm_write_4byte(dm, 0xe5c, 0xd1000120);
299 odm_write_4byte(dm, 0xe6c, 0x00000a15);
300 _iqk_bb_reset_8822b(dm);
302 odm_write_4byte(dm, 0xc60, 0x50000000);
303 odm_write_4byte(dm, 0xc60, 0x70038040);
304 odm_write_4byte(dm, 0xe60, 0x50000000);
305 odm_write_4byte(dm, 0xe60, 0x70038040);
307 odm_write_4byte(dm, 0xc58, 0xd8020402);
308 odm_write_4byte(dm, 0xc5c, 0xde000120);
309 odm_write_4byte(dm, 0xc6c, 0x0000122a);
310 odm_write_4byte(dm, 0xe58, 0xd8020402);
311 odm_write_4byte(dm, 0xe5c, 0xde000120);
312 odm_write_4byte(dm, 0xe6c, 0x0000122a);
316 static void _iqk_restore_mac_bb_8822b(struct phy_dm_struct *dm, u32 *MAC_backup,
317 u32 *BB_backup, u32 *backup_mac_reg,
322 for (i = 0; i < MAC_REG_NUM_8822B; i++)
323 odm_write_4byte(dm, backup_mac_reg[i], MAC_backup[i]);
324 for (i = 0; i < BB_REG_NUM_8822B; i++)
325 odm_write_4byte(dm, backup_bb_reg[i], BB_backup[i]);
328 static void _iqk_restore_rf_8822b(struct phy_dm_struct *dm, u32 *backup_rf_reg,
333 odm_set_rf_reg(dm, ODM_RF_PATH_A, 0xef, RFREGOFFSETMASK, 0x0);
334 odm_set_rf_reg(dm, ODM_RF_PATH_B, 0xef, RFREGOFFSETMASK, 0x0);
336 odm_set_rf_reg(dm, ODM_RF_PATH_A, 0xdf, RFREGOFFSETMASK,
337 RF_backup[0][ODM_RF_PATH_A] & (~BIT(4)));
338 odm_set_rf_reg(dm, ODM_RF_PATH_B, 0xdf, RFREGOFFSETMASK,
339 RF_backup[0][ODM_RF_PATH_B] & (~BIT(4)));
341 for (i = 1; i < RF_REG_NUM_8822B; i++) {
342 odm_set_rf_reg(dm, ODM_RF_PATH_A, backup_rf_reg[i],
343 RFREGOFFSETMASK, RF_backup[i][ODM_RF_PATH_A]);
344 odm_set_rf_reg(dm, ODM_RF_PATH_B, backup_rf_reg[i],
345 RFREGOFFSETMASK, RF_backup[i][ODM_RF_PATH_B]);
349 static void _iqk_backup_iqk_8822b(struct phy_dm_struct *dm, u8 step)
351 struct dm_iqk_info *iqk_info = &dm->IQK_info;
353 u16 iqk_apply[2] = {0xc94, 0xe94};
356 phydm_backup_iqk_information(iqk_info);
358 iqk_info->iqk_channel[0] = iqk_info->rf_reg18;
359 for (path = 0; path < 2; path++) {
360 iqk_info->lok_idac[0][path] =
361 odm_get_rf_reg(dm, (enum odm_rf_radio_path)path,
362 0x58, RFREGOFFSETMASK);
363 iqk_info->bypass_iqk[0][path] =
364 odm_get_bb_reg(dm, iqk_apply[path], MASKDWORD);
366 phydm_set_iqk_cfir(dm, iqk_info, path);
367 odm_set_bb_reg(dm, 0x1bd8, MASKDWORD, 0x0);
368 odm_set_bb_reg(dm, 0x1b0c, BIT(13) | BIT(12), 0x0);
373 static void _iqk_reload_iqk_setting_8822b(
374 struct phy_dm_struct *dm, u8 channel,
375 u8 reload_idx /*1: reload TX, 2: reload LO, TX, RX*/
378 struct dm_iqk_info *iqk_info = &dm->IQK_info;
380 u16 iqk_apply[2] = {0xc94, 0xe94};
382 for (path = 0; path < 2; path++) {
383 if (reload_idx == 2) {
384 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xdf,
386 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x58,
388 iqk_info->lok_idac[channel][path]);
391 for (idx = 0; idx < reload_idx; idx++) {
392 odm_set_bb_reg(dm, 0x1b00, MASKDWORD,
393 0xf8000008 | path << 1);
394 odm_set_bb_reg(dm, 0x1b2c, MASKDWORD, 0x7);
395 odm_set_bb_reg(dm, 0x1b38, MASKDWORD, 0x20000000);
396 odm_set_bb_reg(dm, 0x1b3c, MASKDWORD, 0x20000000);
397 odm_set_bb_reg(dm, 0x1bcc, MASKDWORD, 0x00000000);
400 odm_set_bb_reg(dm, 0x1b0c, BIT(13) | BIT(12),
403 odm_set_bb_reg(dm, 0x1b0c, BIT(13) | BIT(12),
406 odm_set_bb_reg(dm, 0x1bd4, BIT(20) | BIT(19) | BIT(18) |
410 for (i = 0; i < 8; i++) {
413 ((0xc0000000 >> idx) + 0x3) + (i * 4) +
414 (iqk_info->iqk_cfir_real
415 [channel][path][idx][i]
419 ((0xc0000000 >> idx) + 0x1) + (i * 4) +
420 (iqk_info->iqk_cfir_imag
421 [channel][path][idx][i]
425 odm_set_bb_reg(dm, iqk_apply[path], MASKDWORD,
426 iqk_info->bypass_iqk[channel][path]);
428 odm_set_bb_reg(dm, 0x1bd8, MASKDWORD, 0x0);
429 odm_set_bb_reg(dm, 0x1b0c, BIT(13) | BIT(12), 0x0);
433 static bool _iqk_reload_iqk_8822b(struct phy_dm_struct *dm, bool reset)
435 struct dm_iqk_info *iqk_info = &dm->IQK_info;
440 for (i = 0; i < 2; i++)
441 iqk_info->iqk_channel[i] = 0x0;
443 iqk_info->rf_reg18 = odm_get_rf_reg(dm, ODM_RF_PATH_A, 0x18,
446 for (i = 0; i < 2; i++) {
447 if (iqk_info->rf_reg18 == iqk_info->iqk_channel[i]) {
448 _iqk_reload_iqk_setting_8822b(dm, i, 2);
449 _iqk_fill_iqk_report_8822b(dm, i);
451 dm, ODM_COMP_CALIBRATION,
452 "[IQK]reload IQK result before!!!!\n");
460 static void _iqk_rfe_setting_8822b(struct phy_dm_struct *dm, bool ext_pa_on)
464 odm_write_4byte(dm, 0xcb0, 0x77777777);
465 odm_write_4byte(dm, 0xcb4, 0x00007777);
466 odm_write_4byte(dm, 0xcbc, 0x0000083B);
467 odm_write_4byte(dm, 0xeb0, 0x77777777);
468 odm_write_4byte(dm, 0xeb4, 0x00007777);
469 odm_write_4byte(dm, 0xebc, 0x0000083B);
470 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
471 "[IQK]external PA on!!!!\n");
474 odm_write_4byte(dm, 0xcb0, 0x77777777);
475 odm_write_4byte(dm, 0xcb4, 0x00007777);
476 odm_write_4byte(dm, 0xcbc, 0x00000100);
477 odm_write_4byte(dm, 0xeb0, 0x77777777);
478 odm_write_4byte(dm, 0xeb4, 0x00007777);
479 odm_write_4byte(dm, 0xebc, 0x00000100);
483 static void _iqk_rf_setting_8822b(struct phy_dm_struct *dm)
488 odm_write_4byte(dm, 0x1b00, 0xf8000008);
489 odm_write_4byte(dm, 0x1bb8, 0x00000000);
491 for (path = 0; path < 2; path++) {
492 /*0xdf:B11 = 1,B4 = 0, B1 = 1*/
493 tmp = odm_get_rf_reg(dm, (enum odm_rf_radio_path)path, 0xdf,
495 tmp = (tmp & (~BIT(4))) | BIT(1) | BIT(11);
496 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xdf,
497 RFREGOFFSETMASK, tmp);
499 /*release 0x56 TXBB*/
500 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x65,
501 RFREGOFFSETMASK, 0x09000);
503 if (*dm->band_type == ODM_BAND_5G) {
504 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xef,
506 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x33,
507 RFREGOFFSETMASK, 0x00026);
508 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x3e,
509 RFREGOFFSETMASK, 0x00037);
510 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x3f,
511 RFREGOFFSETMASK, 0xdefce);
512 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xef,
515 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xef,
517 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x33,
518 RFREGOFFSETMASK, 0x00026);
519 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x3e,
520 RFREGOFFSETMASK, 0x00037);
521 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x3f,
522 RFREGOFFSETMASK, 0x5efce);
523 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xef,
529 static void _iqk_configure_macbb_8822b(struct phy_dm_struct *dm)
531 /*MACBB register setting*/
532 odm_write_1byte(dm, 0x522, 0x7f);
533 odm_set_bb_reg(dm, 0x550, BIT(11) | BIT(3), 0x0);
534 odm_set_bb_reg(dm, 0x90c, BIT(15),
535 0x1); /*0x90c[15]=1: dac_buf reset selection*/
536 odm_set_bb_reg(dm, 0x9a4, BIT(31),
537 0x0); /*0x9a4[31]=0: Select da clock*/
538 /*0xc94[0]=1, 0xe94[0]=1: let tx through iqk*/
539 odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1);
540 odm_set_bb_reg(dm, 0xe94, BIT(0), 0x1);
542 odm_write_4byte(dm, 0xc00, 0x00000004);
543 odm_write_4byte(dm, 0xe00, 0x00000004);
546 static void _iqk_lok_setting_8822b(struct phy_dm_struct *dm, u8 path)
548 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
549 odm_write_4byte(dm, 0x1bcc, 0x9);
550 odm_write_1byte(dm, 0x1b23, 0x00);
552 switch (*dm->band_type) {
554 odm_write_1byte(dm, 0x1b2b, 0x00);
555 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
556 RFREGOFFSETMASK, 0x50df2);
557 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
558 RFREGOFFSETMASK, 0xadc00);
560 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xef, BIT(4),
562 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x33,
563 BIT(1) | BIT(0), 0x0);
566 odm_write_1byte(dm, 0x1b2b, 0x80);
567 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
568 RFREGOFFSETMASK, 0x5086c);
569 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
570 RFREGOFFSETMASK, 0xa9c00);
572 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0xef, BIT(4),
574 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x33,
575 BIT(1) | BIT(0), 0x1);
580 static void _iqk_txk_setting_8822b(struct phy_dm_struct *dm, u8 path)
582 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
583 odm_write_4byte(dm, 0x1bcc, 0x9);
584 odm_write_4byte(dm, 0x1b20, 0x01440008);
587 odm_write_4byte(dm, 0x1b00, 0xf800000a);
589 odm_write_4byte(dm, 0x1b00, 0xf8000008);
590 odm_write_4byte(dm, 0x1bcc, 0x3f);
592 switch (*dm->band_type) {
594 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
595 RFREGOFFSETMASK, 0x50df2);
596 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
597 RFREGOFFSETMASK, 0xadc00);
598 odm_write_1byte(dm, 0x1b2b, 0x00);
601 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
602 RFREGOFFSETMASK, 0x500ef);
603 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
604 RFREGOFFSETMASK, 0xa9c00);
605 odm_write_1byte(dm, 0x1b2b, 0x80);
610 static void _iqk_rxk1_setting_8822b(struct phy_dm_struct *dm, u8 path)
612 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
614 switch (*dm->band_type) {
616 odm_write_1byte(dm, 0x1bcc, 0x9);
617 odm_write_1byte(dm, 0x1b2b, 0x00);
618 odm_write_4byte(dm, 0x1b20, 0x01450008);
619 odm_write_4byte(dm, 0x1b24, 0x01460c88);
620 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
621 RFREGOFFSETMASK, 0x510e0);
622 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
623 RFREGOFFSETMASK, 0xacc00);
626 odm_write_1byte(dm, 0x1bcc, 0x09);
627 odm_write_1byte(dm, 0x1b2b, 0x80);
628 odm_write_4byte(dm, 0x1b20, 0x00850008);
629 odm_write_4byte(dm, 0x1b24, 0x00460048);
630 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
631 RFREGOFFSETMASK, 0x510e0);
632 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
633 RFREGOFFSETMASK, 0xadc00);
638 static void _iqk_rxk2_setting_8822b(struct phy_dm_struct *dm, u8 path,
641 struct dm_iqk_info *iqk_info = &dm->IQK_info;
643 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
645 switch (*dm->band_type) {
648 iqk_info->tmp1bcc = 0x12;
649 odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
650 odm_write_1byte(dm, 0x1b2b, 0x00);
651 odm_write_4byte(dm, 0x1b20, 0x01450008);
652 odm_write_4byte(dm, 0x1b24, 0x01460848);
653 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
654 RFREGOFFSETMASK, 0x510e0);
655 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
656 RFREGOFFSETMASK, 0xa9c00);
660 if (path == ODM_RF_PATH_A)
661 iqk_info->tmp1bcc = 0x12;
663 iqk_info->tmp1bcc = 0x09;
665 odm_write_1byte(dm, 0x1bcc, iqk_info->tmp1bcc);
666 odm_write_1byte(dm, 0x1b2b, 0x80);
667 odm_write_4byte(dm, 0x1b20, 0x00850008);
668 odm_write_4byte(dm, 0x1b24, 0x00460848);
669 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x56,
670 RFREGOFFSETMASK, 0x51060);
671 odm_set_rf_reg(dm, (enum odm_rf_radio_path)path, 0x8f,
672 RFREGOFFSETMASK, 0xa9c00);
677 static bool _iqk_check_cal_8822b(struct phy_dm_struct *dm, u32 IQK_CMD)
679 bool notready = true, fail = true;
680 u32 delay_count = 0x0;
683 if (odm_read_4byte(dm, 0x1b00) == (IQK_CMD & 0xffffff0f)) {
684 fail = (bool)odm_get_bb_reg(dm, 0x1b08, BIT(26));
691 if (delay_count >= 50) {
693 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
694 "[IQK]IQK timeout!!!\n");
698 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION, "[IQK]delay count = 0x%x!!!\n",
703 static bool _iqk_rx_iqk_gain_search_fail_8822b(struct phy_dm_struct *dm,
706 struct dm_iqk_info *iqk_info = &dm->IQK_info;
708 u32 IQK_CMD = 0x0, rf_reg0, tmp, bb_idx;
709 u8 IQMUX[4] = {0x9, 0x12, 0x1b, 0x24};
712 for (idx = 0; idx < 4; idx++)
713 if (iqk_info->tmp1bcc == IQMUX[idx])
716 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
717 odm_write_4byte(dm, 0x1bcc, iqk_info->tmp1bcc);
721 dm, ODM_COMP_CALIBRATION,
722 "[IQK]============ S%d RXIQK GainSearch ============\n",
726 IQK_CMD = 0xf8000208 | (1 << (path + 4));
728 IQK_CMD = 0xf8000308 | (1 << (path + 4));
730 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION, "[IQK]S%d GS%d_Trigger = 0x%x\n",
731 path, step, IQK_CMD);
733 odm_write_4byte(dm, 0x1b00, IQK_CMD);
734 odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
735 ODM_delay_ms(GS_delay_8822B);
736 fail = _iqk_check_cal_8822b(dm, IQK_CMD);
738 if (step == RXIQK2) {
739 rf_reg0 = odm_get_rf_reg(dm, (enum odm_rf_radio_path)path, 0x0,
741 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
743 dm, ODM_COMP_CALIBRATION,
744 "[IQK]S%d ==> RF0x0 = 0x%x, tmp1bcc = 0x%x, idx = %d, 0x1b3c = 0x%x\n",
745 path, rf_reg0, iqk_info->tmp1bcc, idx,
746 odm_read_4byte(dm, 0x1b3c));
747 tmp = (rf_reg0 & 0x1fe0) >> 5;
748 iqk_info->lna_idx = tmp >> 5;
751 if (iqk_info->lna_idx != 0x0)
756 iqk_info->isbnd = true;
758 } else if (bb_idx == 0xa) {
761 else if (iqk_info->lna_idx != 0x7)
764 iqk_info->isbnd = true;
773 iqk_info->tmp1bcc = IQMUX[idx];
776 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
779 (odm_read_4byte(dm, 0x1b24) & 0xffffe3ff) |
780 (iqk_info->lna_idx << 10));
787 static bool _lok_one_shot_8822b(void *dm_void, u8 path)
789 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
790 struct dm_iqk_info *iqk_info = &dm->IQK_info;
792 bool LOK_notready = false;
796 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
797 "[IQK]==========S%d LOK ==========\n", path);
799 IQK_CMD = 0xf8000008 | (1 << (4 + path));
801 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION, "[IQK]LOK_Trigger = 0x%x\n",
804 odm_write_4byte(dm, 0x1b00, IQK_CMD);
805 odm_write_4byte(dm, 0x1b00, IQK_CMD + 1);
806 /*LOK: CMD ID = 0 {0xf8000018, 0xf8000028}*/
807 /*LOK: CMD ID = 0 {0xf8000019, 0xf8000029}*/
808 ODM_delay_ms(LOK_delay_8822B);
813 while (LOK_notready) {
814 if (odm_read_4byte(dm, 0x1b00) == (IQK_CMD & 0xffffff0f))
815 LOK_notready = false;
824 if (delay_count >= 50) {
825 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
826 "[IQK]S%d LOK timeout!!!\n", path);
831 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
832 "[IQK]S%d ==> delay_count = 0x%x\n", path, delay_count);
833 if (ODM_COMP_CALIBRATION) {
836 odm_get_rf_reg(dm, (enum odm_rf_radio_path)path,
837 0x58, RFREGOFFSETMASK);
838 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
839 "[IQK]0x58 = 0x%x\n", LOK_temp);
841 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
842 "[IQK]==>S%d LOK Fail!!!\n", path);
845 iqk_info->lok_fail[path] = LOK_notready;
849 static bool _iqk_one_shot_8822b(void *dm_void, u8 path, u8 idx)
851 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
852 struct dm_iqk_info *iqk_info = &dm->IQK_info;
854 bool notready = true, fail = true;
856 u16 iqk_apply[2] = {0xc94, 0xe94};
859 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
860 "[IQK]============ S%d WBTXIQK ============\n",
862 else if (idx == RXIQK1)
864 dm, ODM_COMP_CALIBRATION,
865 "[IQK]============ S%d WBRXIQK STEP1============\n",
869 dm, ODM_COMP_CALIBRATION,
870 "[IQK]============ S%d WBRXIQK STEP2============\n",
874 IQK_CMD = 0xf8000008 | ((*dm->band_width + 4) << 8) |
876 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
877 "[IQK]TXK_Trigger = 0x%x\n", IQK_CMD);
878 /*{0xf8000418, 0xf800042a} ==> 20 WBTXK (CMD = 4)*/
879 /*{0xf8000518, 0xf800052a} ==> 40 WBTXK (CMD = 5)*/
880 /*{0xf8000618, 0xf800062a} ==> 80 WBTXK (CMD = 6)*/
881 } else if (idx == RXIQK1) {
882 if (*dm->band_width == 2)
883 IQK_CMD = 0xf8000808 | (1 << (path + 4));
885 IQK_CMD = 0xf8000708 | (1 << (path + 4));
886 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
887 "[IQK]RXK1_Trigger = 0x%x\n", IQK_CMD);
888 /*{0xf8000718, 0xf800072a} ==> 20 WBTXK (CMD = 7)*/
889 /*{0xf8000718, 0xf800072a} ==> 40 WBTXK (CMD = 7)*/
890 /*{0xf8000818, 0xf800082a} ==> 80 WBTXK (CMD = 8)*/
891 } else if (idx == RXIQK2) {
892 IQK_CMD = 0xf8000008 | ((*dm->band_width + 9) << 8) |
894 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
895 "[IQK]RXK2_Trigger = 0x%x\n", IQK_CMD);
896 /*{0xf8000918, 0xf800092a} ==> 20 WBRXK (CMD = 9)*/
897 /*{0xf8000a18, 0xf8000a2a} ==> 40 WBRXK (CMD = 10)*/
898 /*{0xf8000b18, 0xf8000b2a} ==> 80 WBRXK (CMD = 11)*/
899 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
900 odm_write_4byte(dm, 0x1b24,
901 (odm_read_4byte(dm, 0x1b24) & 0xffffe3ff) |
902 ((iqk_info->lna_idx & 0x7) << 10));
904 odm_write_4byte(dm, 0x1b00, IQK_CMD);
905 odm_write_4byte(dm, 0x1b00, IQK_CMD + 0x1);
906 ODM_delay_ms(WBIQK_delay_8822B);
909 if (odm_read_4byte(dm, 0x1b00) == (IQK_CMD & 0xffffff0f))
918 fail = (bool)odm_get_bb_reg(dm, 0x1b08, BIT(26));
922 if (delay_count >= 50) {
923 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
924 "[IQK]S%d IQK timeout!!!\n", path);
929 if (dm->debug_components & ODM_COMP_CALIBRATION) {
930 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
931 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
932 "[IQK]S%d ==> 0x1b00 = 0x%x, 0x1b08 = 0x%x\n",
933 path, odm_read_4byte(dm, 0x1b00),
934 odm_read_4byte(dm, 0x1b08));
935 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
936 "[IQK]S%d ==> delay_count = 0x%x\n", path,
940 dm, ODM_COMP_CALIBRATION,
941 "[IQK]S%d ==> RF0x0 = 0x%x, RF0x56 = 0x%x\n",
943 odm_get_rf_reg(dm, (enum odm_rf_radio_path)path,
944 0x0, RFREGOFFSETMASK),
945 odm_get_rf_reg(dm, (enum odm_rf_radio_path)path,
946 0x56, RFREGOFFSETMASK));
949 odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);
953 odm_set_bb_reg(dm, iqk_apply[path], BIT(0), 0x0);
956 iqk_info->rxiqk_agc[0][path] =
957 (u16)(((odm_get_rf_reg(dm, (enum odm_rf_radio_path)path,
958 0x0, RFREGOFFSETMASK) >>
961 (iqk_info->tmp1bcc << 8));
963 odm_write_4byte(dm, 0x1b38, 0x20000000);
966 odm_set_bb_reg(dm, iqk_apply[path], (BIT(11) | BIT(10)),
969 odm_set_bb_reg(dm, iqk_apply[path], (BIT(11) | BIT(10)),
974 iqk_info->iqk_fail_report[0][path][TXIQK] = fail;
976 iqk_info->iqk_fail_report[0][path][RXIQK] = fail;
981 static bool _iqk_rx_iqk_by_path_8822b(void *dm_void, u8 path)
983 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
984 struct dm_iqk_info *iqk_info = &dm->IQK_info;
985 bool KFAIL = true, gonext;
987 switch (iqk_info->rxiqk_step) {
988 case 1: /*gain search_RXK1*/
989 _iqk_rxk1_setting_8822b(dm, path);
992 KFAIL = _iqk_rx_iqk_gain_search_fail_8822b(dm, path,
995 (iqk_info->gs_retry_count[0][path][GSRXK1] < 2))
996 iqk_info->gs_retry_count[0][path][GSRXK1]++;
998 iqk_info->rxiqk_fail_code[0][path] = 0;
999 iqk_info->rxiqk_step = 5;
1002 iqk_info->rxiqk_step++;
1009 case 2: /*gain search_RXK2*/
1010 _iqk_rxk2_setting_8822b(dm, path, true);
1011 iqk_info->isbnd = false;
1013 KFAIL = _iqk_rx_iqk_gain_search_fail_8822b(dm, path,
1016 (iqk_info->gs_retry_count[0][path][GSRXK2] <
1018 iqk_info->gs_retry_count[0][path][GSRXK2]++;
1020 iqk_info->rxiqk_step++;
1026 _iqk_rxk1_setting_8822b(dm, path);
1029 KFAIL = _iqk_one_shot_8822b(dm, path, RXIQK1);
1031 (iqk_info->retry_count[0][path][RXIQK1] < 2))
1032 iqk_info->retry_count[0][path][RXIQK1]++;
1034 iqk_info->rxiqk_fail_code[0][path] = 1;
1035 iqk_info->rxiqk_step = 5;
1038 iqk_info->rxiqk_step++;
1046 _iqk_rxk2_setting_8822b(dm, path, false);
1049 KFAIL = _iqk_one_shot_8822b(dm, path, RXIQK2);
1051 (iqk_info->retry_count[0][path][RXIQK2] < 2))
1052 iqk_info->retry_count[0][path][RXIQK2]++;
1054 iqk_info->rxiqk_fail_code[0][path] = 2;
1055 iqk_info->rxiqk_step = 5;
1058 iqk_info->rxiqk_step++;
1069 static void _iqk_iqk_by_path_8822b(void *dm_void, bool segment_iqk)
1071 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
1072 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1076 if (*dm->band_width == 2)
1077 kcount_limit = kcount_limit_80m;
1079 kcount_limit = kcount_limit_others;
1082 switch (dm->rf_calibrate_info.iqk_step) {
1084 _iqk_lok_setting_8822b(dm, ODM_RF_PATH_A);
1085 _lok_one_shot_8822b(dm, ODM_RF_PATH_A);
1086 dm->rf_calibrate_info.iqk_step++;
1089 _iqk_lok_setting_8822b(dm, ODM_RF_PATH_B);
1090 _lok_one_shot_8822b(dm, ODM_RF_PATH_B);
1091 dm->rf_calibrate_info.iqk_step++;
1093 case 3: /*S0 TXIQK*/
1094 _iqk_txk_setting_8822b(dm, ODM_RF_PATH_A);
1095 KFAIL = _iqk_one_shot_8822b(dm, ODM_RF_PATH_A, TXIQK);
1097 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1098 "[IQK]S0TXK KFail = 0x%x\n", KFAIL);
1101 (iqk_info->retry_count[0][ODM_RF_PATH_A][TXIQK] <
1103 iqk_info->retry_count[0][ODM_RF_PATH_A]
1106 dm->rf_calibrate_info.iqk_step++;
1108 case 4: /*S1 TXIQK*/
1109 _iqk_txk_setting_8822b(dm, ODM_RF_PATH_B);
1110 KFAIL = _iqk_one_shot_8822b(dm, ODM_RF_PATH_B, TXIQK);
1112 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1113 "[IQK]S1TXK KFail = 0x%x\n", KFAIL);
1115 iqk_info->retry_count[0][ODM_RF_PATH_B][TXIQK] < 3)
1116 iqk_info->retry_count[0][ODM_RF_PATH_B]
1119 dm->rf_calibrate_info.iqk_step++;
1121 case 5: /*S0 RXIQK*/
1122 phydm_set_iqk_info(dm, iqk_info, 0);
1124 case 6: /*S1 RXIQK*/
1125 phydm_set_iqk_info(dm, iqk_info, 1);
1129 if (dm->rf_calibrate_info.iqk_step == 7) {
1130 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1131 "[IQK]==========LOK summary ==========\n");
1133 dm, ODM_COMP_CALIBRATION,
1134 "[IQK]PathA_LOK_notready = %d, PathB_LOK1_notready = %d\n",
1135 iqk_info->lok_fail[ODM_RF_PATH_A],
1136 iqk_info->lok_fail[ODM_RF_PATH_B]);
1137 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1138 "[IQK]==========IQK summary ==========\n");
1140 dm, ODM_COMP_CALIBRATION,
1141 "[IQK]PathA_TXIQK_fail = %d, PathB_TXIQK_fail = %d\n",
1142 iqk_info->iqk_fail_report[0][ODM_RF_PATH_A]
1144 iqk_info->iqk_fail_report[0][ODM_RF_PATH_B]
1147 dm, ODM_COMP_CALIBRATION,
1148 "[IQK]PathA_RXIQK_fail = %d, PathB_RXIQK_fail = %d\n",
1149 iqk_info->iqk_fail_report[0][ODM_RF_PATH_A]
1151 iqk_info->iqk_fail_report[0][ODM_RF_PATH_B]
1154 dm, ODM_COMP_CALIBRATION,
1155 "[IQK]PathA_TXIQK_retry = %d, PathB_TXIQK_retry = %d\n",
1156 iqk_info->retry_count[0][ODM_RF_PATH_A][TXIQK],
1157 iqk_info->retry_count[0][ODM_RF_PATH_B][TXIQK]);
1159 dm, ODM_COMP_CALIBRATION,
1160 "[IQK]PathA_RXK1_retry = %d, PathA_RXK2_retry = %d, PathB_RXK1_retry = %d, PathB_RXK2_retry = %d\n",
1161 iqk_info->retry_count[0][ODM_RF_PATH_A][RXIQK1],
1162 iqk_info->retry_count[0][ODM_RF_PATH_A][RXIQK2],
1163 iqk_info->retry_count[0][ODM_RF_PATH_B][RXIQK1],
1164 iqk_info->retry_count[0][ODM_RF_PATH_B]
1167 dm, ODM_COMP_CALIBRATION,
1168 "[IQK]PathA_GS1_retry = %d, PathA_GS2_retry = %d, PathB_GS1_retry = %d, PathB_GS2_retry = %d\n",
1169 iqk_info->gs_retry_count[0][ODM_RF_PATH_A]
1171 iqk_info->gs_retry_count[0][ODM_RF_PATH_A]
1173 iqk_info->gs_retry_count[0][ODM_RF_PATH_B]
1175 iqk_info->gs_retry_count[0][ODM_RF_PATH_B]
1177 for (i = 0; i < 2; i++) {
1178 odm_write_4byte(dm, 0x1b00,
1179 0xf8000008 | i << 1);
1180 odm_write_4byte(dm, 0x1b2c, 0x7);
1181 odm_write_4byte(dm, 0x1bcc, 0x0);
1186 if (segment_iqk && (iqk_info->kcount == kcount_limit))
1191 static void _iqk_start_iqk_8822b(struct phy_dm_struct *dm, bool segment_iqk)
1196 tmp = odm_get_rf_reg(dm, ODM_RF_PATH_A, 0x1, RFREGOFFSETMASK);
1197 tmp = tmp | BIT(5) | BIT(0);
1198 odm_set_rf_reg(dm, ODM_RF_PATH_A, 0x1, RFREGOFFSETMASK, tmp);
1200 tmp = odm_get_rf_reg(dm, ODM_RF_PATH_B, 0x1, RFREGOFFSETMASK);
1201 tmp = tmp | BIT(5) | BIT(0);
1202 odm_set_rf_reg(dm, ODM_RF_PATH_B, 0x1, RFREGOFFSETMASK, tmp);
1204 _iqk_iqk_by_path_8822b(dm, segment_iqk);
1207 static void _iq_calibrate_8822b_init(void *dm_void)
1209 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
1210 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1213 if (iqk_info->iqk_times == 0) {
1214 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1215 "[IQK]=====>PHY_IQCalibrate_8822B_Init\n");
1217 for (i = 0; i < SS_8822B; i++) {
1218 for (j = 0; j < 2; j++) {
1219 iqk_info->lok_fail[i] = true;
1220 iqk_info->iqk_fail[j][i] = true;
1221 iqk_info->iqc_matrix[j][i] = 0x20000000;
1225 phydm_init_iqk_information(iqk_info);
1229 static void _phy_iq_calibrate_8822b(struct phy_dm_struct *dm, bool reset)
1231 u32 MAC_backup[MAC_REG_NUM_8822B], BB_backup[BB_REG_NUM_8822B],
1232 RF_backup[RF_REG_NUM_8822B][SS_8822B];
1233 u32 backup_mac_reg[MAC_REG_NUM_8822B] = {0x520, 0x550};
1234 u32 backup_bb_reg[BB_REG_NUM_8822B] = {
1235 0x808, 0x90c, 0xc00, 0xcb0, 0xcb4, 0xcbc, 0xe00,
1236 0xeb0, 0xeb4, 0xebc, 0x1990, 0x9a4, 0xa04};
1237 u32 backup_rf_reg[RF_REG_NUM_8822B] = {0xdf, 0x8f, 0x65, 0x0, 0x1};
1238 bool segment_iqk = false, is_mp = false;
1240 struct dm_iqk_info *iqk_info = &dm->IQK_info;
1244 else if (dm->is_linked)
1248 if (_iqk_reload_iqk_8822b(dm, reset))
1251 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1252 "[IQK]==========IQK strat!!!!!==========\n");
1255 dm, ODM_COMP_CALIBRATION,
1256 "[IQK]band_type = %s, band_width = %d, ExtPA2G = %d, ext_pa_5g = %d\n",
1257 (*dm->band_type == ODM_BAND_5G) ? "5G" : "2G", *dm->band_width,
1258 dm->ext_pa, dm->ext_pa_5g);
1259 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1260 "[IQK]Interface = %d, cut_version = %x\n",
1261 dm->support_interface, dm->cut_version);
1263 iqk_info->iqk_times++;
1265 iqk_info->kcount = 0;
1266 dm->rf_calibrate_info.iqk_total_progressing_time = 0;
1267 dm->rf_calibrate_info.iqk_step = 1;
1268 iqk_info->rxiqk_step = 1;
1270 _iqk_backup_iqk_8822b(dm, 0);
1271 _iqk_backup_mac_bb_8822b(dm, MAC_backup, BB_backup, backup_mac_reg,
1273 _iqk_backup_rf_8822b(dm, RF_backup, backup_rf_reg);
1277 dm->rf_calibrate_info.iqk_start_time =
1278 odm_get_current_time(dm);
1280 _iqk_configure_macbb_8822b(dm);
1281 _iqk_afe_setting_8822b(dm, true);
1282 _iqk_rfe_setting_8822b(dm, false);
1283 _iqk_agc_bnd_int_8822b(dm);
1284 _iqk_rf_setting_8822b(dm);
1286 _iqk_start_iqk_8822b(dm, segment_iqk);
1288 _iqk_afe_setting_8822b(dm, false);
1289 _iqk_restore_mac_bb_8822b(dm, MAC_backup, BB_backup,
1290 backup_mac_reg, backup_bb_reg);
1291 _iqk_restore_rf_8822b(dm, backup_rf_reg, RF_backup);
1294 dm->rf_calibrate_info.iqk_progressing_time =
1295 odm_get_progressing_time(
1297 dm->rf_calibrate_info.iqk_start_time);
1298 dm->rf_calibrate_info.iqk_total_progressing_time +=
1299 odm_get_progressing_time(
1301 dm->rf_calibrate_info.iqk_start_time);
1303 dm, ODM_COMP_CALIBRATION,
1304 "[IQK]IQK progressing_time = %lld ms\n",
1305 dm->rf_calibrate_info.iqk_progressing_time);
1308 if (dm->rf_calibrate_info.iqk_step == 7)
1311 iqk_info->kcount = 0;
1312 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION, "[IQK]delay 50ms!!!\n");
1316 _iqk_backup_iqk_8822b(dm, 1);
1317 _iqk_fill_iqk_report_8822b(dm, 0);
1320 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1321 "[IQK]Total IQK progressing_time = %lld ms\n",
1322 dm->rf_calibrate_info.iqk_total_progressing_time);
1324 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1325 "[IQK]==========IQK end!!!!!==========\n");
1328 static void _phy_iq_calibrate_by_fw_8822b(void *dm_void, u8 clear) {}
1330 /*IQK version:v3.3, NCTL v0.6*/
1331 /*1.The new gainsearch method for RXIQK*/
1332 /*2.The new format of IQK report register: 0x1be8/0x1bec*/
1333 /*3. add the option of segment IQK*/
1334 void phy_iq_calibrate_8822b(void *dm_void, bool clear)
1336 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
1338 dm->iqk_fw_offload = 0;
1341 if (dm->iqk_fw_offload) {
1342 if (!dm->rf_calibrate_info.is_iqk_in_progress) {
1343 odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
1344 dm->rf_calibrate_info.is_iqk_in_progress = true;
1345 odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
1347 dm->rf_calibrate_info.iqk_start_time =
1348 odm_get_current_time(dm);
1350 odm_write_4byte(dm, 0x1b00, 0xf8000008);
1351 odm_set_bb_reg(dm, 0x1bf0, 0xff000000, 0xff);
1352 ODM_RT_TRACE(dm, ODM_COMP_CALIBRATION,
1353 "[IQK]0x1bf0 = 0x%x\n",
1354 odm_read_4byte(dm, 0x1bf0));
1356 _phy_iq_calibrate_by_fw_8822b(dm, clear);
1357 phydm_get_read_counter(dm);
1359 dm->rf_calibrate_info.iqk_progressing_time =
1360 odm_get_progressing_time(
1362 dm->rf_calibrate_info.iqk_start_time);
1365 dm, ODM_COMP_CALIBRATION,
1366 "[IQK]IQK progressing_time = %lld ms\n",
1367 dm->rf_calibrate_info.iqk_progressing_time);
1369 odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
1370 dm->rf_calibrate_info.is_iqk_in_progress = false;
1371 odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
1374 dm, ODM_COMP_CALIBRATION,
1375 "== Return the IQK CMD, because the IQK in Progress ==\n");
1379 _iq_calibrate_8822b_init(dm_void);
1381 if (!dm->rf_calibrate_info.is_iqk_in_progress) {
1382 odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
1383 dm->rf_calibrate_info.is_iqk_in_progress = true;
1384 odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
1386 dm->rf_calibrate_info.iqk_start_time =
1387 odm_get_current_time(dm);
1389 _phy_iq_calibrate_8822b(dm, clear);
1391 dm->rf_calibrate_info.iqk_progressing_time =
1392 odm_get_progressing_time(
1393 dm, dm->rf_calibrate_info
1396 dm, ODM_COMP_CALIBRATION,
1397 "[IQK]IQK progressing_time = %lld ms\n",
1398 dm->rf_calibrate_info
1399 .iqk_progressing_time);
1401 odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);
1402 dm->rf_calibrate_info.is_iqk_in_progress = false;
1403 odm_release_spin_lock(dm, RT_IQK_SPINLOCK);
1406 dm, ODM_COMP_CALIBRATION,
1407 "[IQK]== Return the IQK CMD, because the IQK in Progress ==\n");