1 /******************************************************************************
3 * Copyright(c) 2007 - 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 * 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 /*@************************************************************
28 * ************************************************************
30 #include "mp_precomp.h"
31 #include "phydm_precomp.h"
33 #ifdef CFG_DIG_DAMPING_CHK
34 void phydm_dig_recorder_reset(void *dm_void)
36 struct dm_struct *dm = (struct dm_struct *)dm_void;
37 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
38 struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
40 PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
42 odm_memory_set(dm, &dig_rc->igi_bitmap, 0,
43 sizeof(struct phydm_dig_recorder_strcut));
46 void phydm_dig_recorder(void *dm_void, boolean first_connect, u8 igi_curr,
49 struct dm_struct *dm = (struct dm_struct *)dm_void;
50 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
51 struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
52 u8 igi_pre = dig_rc->igi_history[0];
58 PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
61 phydm_dig_recorder_reset(dm);
62 dig_rc->igi_history[0] = igi_curr;
63 dig_rc->fa_history[0] = fa_cnt;
67 igi_pre = dig_rc->igi_history[0];
68 igi_up = (igi_curr > igi_pre) ? 1 : 0;
69 dig_rc->igi_bitmap = ((dig_rc->igi_bitmap << 1) & 0xfe) | igi_up;
71 dig_rc->igi_history[3] = dig_rc->igi_history[2];
72 dig_rc->igi_history[2] = dig_rc->igi_history[1];
73 dig_rc->igi_history[1] = dig_rc->igi_history[0];
74 dig_rc->igi_history[0] = igi_curr;
76 dig_rc->fa_history[3] = dig_rc->fa_history[2];
77 dig_rc->fa_history[2] = dig_rc->fa_history[1];
78 dig_rc->fa_history[1] = dig_rc->fa_history[0];
79 dig_rc->fa_history[0] = fa_cnt;
81 PHYDM_DBG(dm, DBG_DIG, "igi_history[3:0] = {0x%x, 0x%x, 0x%x, 0x%x}\n",
82 dig_rc->igi_history[3], dig_rc->igi_history[2],
83 dig_rc->igi_history[1], dig_rc->igi_history[0]);
84 PHYDM_DBG(dm, DBG_DIG, "fa_history[3:0] = {%d, %d, %d, %d}\n",
85 dig_rc->fa_history[3], dig_rc->fa_history[2],
86 dig_rc->fa_history[1], dig_rc->fa_history[0]);
87 PHYDM_DBG(dm, DBG_DIG, "igi_bitmap = {%d, %d, %d, %d} = 0x%x\n",
88 (u8)((dig_rc->igi_bitmap & BIT(3)) >> 3),
89 (u8)((dig_rc->igi_bitmap & BIT(2)) >> 2),
90 (u8)((dig_rc->igi_bitmap & BIT(1)) >> 1),
91 (u8)(dig_rc->igi_bitmap & BIT(0)),
95 void phydm_dig_damping_chk(void *dm_void)
97 struct dm_struct *dm = (struct dm_struct *)dm_void;
98 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
99 struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
100 u8 igi_bitmap_4bit = dig_rc->igi_bitmap & 0xf;
101 u8 diff1 = 0, diff2 = 0;
102 u32 fa_low_th = dig_t->fa_th[0];
103 u32 fa_high_th = dig_t->fa_th[1];
104 u8 fa_pattern_match = 0;
110 PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
112 /*@== Release Damping ================================================*/
113 if (dig_rc->damping_limit_en) {
114 PHYDM_DBG(dm, DBG_DIG,
115 "[Damping Limit!] limit_time=%d, phydm_sys_up_time=%d\n",
116 dig_rc->limit_time, dm->phydm_sys_up_time);
118 time_tmp = dig_rc->limit_time + DIG_LIMIT_PERIOD;
120 if (DIFF_2(dm->rssi_min, dig_rc->limit_rssi) > 3 ||
121 time_tmp < dm->phydm_sys_up_time) {
122 dig_rc->damping_limit_en = 0;
123 PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, limit_rssi=%d\n",
124 dm->rssi_min, dig_rc->limit_rssi);
129 /*@== Damping Pattern Check===========================================*/
130 PHYDM_DBG(dm, DBG_DIG, "fa_th{H, L}= {%d,%d}\n", fa_high_th, fa_low_th);
132 switch (igi_bitmap_4bit) {
133 case 0x5: /*@4b'0101 ex:down(0x24)->up(0x28)->down(0x24)->up(0x28)*/
134 if (dig_rc->igi_history[0] > dig_rc->igi_history[1])
135 diff1 = dig_rc->igi_history[0] - dig_rc->igi_history[1];
137 if (dig_rc->igi_history[2] > dig_rc->igi_history[3])
138 diff2 = dig_rc->igi_history[2] - dig_rc->igi_history[3];
140 if (dig_rc->fa_history[0] < fa_low_th &&
141 dig_rc->fa_history[1] > fa_high_th &&
142 dig_rc->fa_history[2] < fa_low_th &&
143 dig_rc->fa_history[3] > fa_high_th) {
144 /*@Check each fa element*/
145 fa_pattern_match = 1;
148 case 0x9: /*@4b'1001 ex:up(0x28)->down(0x26)->down(0x24)->up(0x28)*/
149 if (dig_rc->igi_history[0] > dig_rc->igi_history[1])
150 diff1 = dig_rc->igi_history[0] - dig_rc->igi_history[1];
152 if (dig_rc->igi_history[2] < dig_rc->igi_history[3])
153 diff2 = dig_rc->igi_history[3] - dig_rc->igi_history[2];
155 if (dig_rc->fa_history[0] < fa_low_th &&
156 dig_rc->fa_history[1] > fa_high_th &&
157 dig_rc->fa_history[2] > fa_low_th &&
158 dig_rc->fa_history[3] < fa_high_th) {
159 /*@Check each fa element*/
160 fa_pattern_match = 1;
167 if (diff1 >= 2 && diff2 >= 2 && fa_pattern_match) {
168 dig_rc->damping_limit_en = 1;
169 dig_rc->damping_limit_val = dig_rc->igi_history[0];
170 dig_rc->limit_time = dm->phydm_sys_up_time;
171 dig_rc->limit_rssi = dm->rssi_min;
173 PHYDM_DBG(dm, DBG_DIG,
174 "[Start damping_limit!] IGI_dyn_min=0x%x, limit_time=%d, limit_rssi=%d\n",
175 dig_rc->damping_limit_val,
176 dig_rc->limit_time, dig_rc->limit_rssi);
179 PHYDM_DBG(dm, DBG_DIG, "damping_limit=%d\n", dig_rc->damping_limit_en);
184 phydm_dig_go_up_check(void *dm_void)
186 struct dm_struct *dm = (struct dm_struct *)dm_void;
187 struct ccx_info *ccx_info = &dm->dm_ccx_info;
188 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
189 u8 cur_ig_value = dig_t->cur_ig_value;
190 u8 max_cover_bond = 0;
191 u8 rx_gain_range_max = dig_t->rx_gain_range_max;
193 u8 total_nhm_cnt = ccx_info->nhm_rpt_sum;
195 u32 over_dig_cnt = 0;
198 if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE)
201 max_cover_bond = DIG_MAX_BALANCE_MODE - dig_t->upcheck_init_val;
203 if (cur_ig_value < max_cover_bond - 6)
204 dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_0;
205 else if (cur_ig_value <= DIG_MAX_BALANCE_MODE)
206 dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_1;
207 else /* @cur_ig_value > DM_DIG_MAX_AP, foolproof */
208 dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_2;
210 PHYDM_DBG(dm, DBG_DIG, "check_lv = %d, max_cover_bond = 0x%x\n",
211 dig_t->go_up_chk_lv, max_cover_bond);
213 if (total_nhm_cnt == 0)
216 if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_0) {
217 for (i = 3; i <= 11; i++)
218 dig_cnt += ccx_info->nhm_result[i];
220 if ((dig_t->lv0_ratio_reciprocal * dig_cnt) >= total_nhm_cnt)
225 } else if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_1) {
227 for (i = 0; i <= 10; i++) {
228 if ((max_cover_bond * 2) == ccx_info->nhm_th[i]) {
229 for (j = (i + 1); j <= 11; j++)
230 over_dig_cnt += ccx_info->nhm_result[j];
235 if (dig_t->lv1_ratio_reciprocal * over_dig_cnt < total_nhm_cnt)
241 /* update dig_t->rx_gain_range_max */
242 if (rx_gain_range_max + 6 >= max_cover_bond)
243 dig_t->rx_gain_range_max = max_cover_bond - 6;
245 dig_t->rx_gain_range_max = rx_gain_range_max;
247 PHYDM_DBG(dm, DBG_DIG,
248 "Noise pwr over DIG can filter, lock rx_gain_range_max to 0x%x\n",
249 dig_t->rx_gain_range_max);
251 } else if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_2) {
252 /* @cur_ig_value > DM_DIG_MAX_AP, foolproof */
259 void phydm_fa_threshold_check(void *dm_void, boolean is_dfs_band)
261 struct dm_struct *dm = (struct dm_struct *)dm_void;
262 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
264 if (dig_t->is_dbg_fa_th) {
265 PHYDM_DBG(dm, DBG_DIG, "Manual Fix FA_th\n");
266 } else if (dm->is_linked) {
267 if (dm->rssi_min < 20) { /*@[PHYDM-252]*/
268 dig_t->fa_th[0] = 500;
269 dig_t->fa_th[1] = 750;
270 dig_t->fa_th[2] = 1000;
271 } else if (((dm->rx_tp >> 2) > dm->tx_tp) && /*Test RX TP*/
272 (dm->rx_tp < 10) && (dm->rx_tp > 1)) { /*TP=1~10Mb*/
273 dig_t->fa_th[0] = 125;
274 dig_t->fa_th[1] = 250;
275 dig_t->fa_th[2] = 500;
277 dig_t->fa_th[0] = 250;
278 dig_t->fa_th[1] = 500;
279 dig_t->fa_th[2] = 750;
282 if (is_dfs_band) { /* @For DFS band and no link */
284 dig_t->fa_th[0] = 250;
285 dig_t->fa_th[1] = 1000;
286 dig_t->fa_th[2] = 2000;
288 dig_t->fa_th[0] = 2000;
289 dig_t->fa_th[1] = 4000;
290 dig_t->fa_th[2] = 5000;
294 PHYDM_DBG(dm, DBG_DIG, "FA_th={%d,%d,%d}\n", dig_t->fa_th[0],
295 dig_t->fa_th[1], dig_t->fa_th[2]);
298 void phydm_set_big_jump_step(void *dm_void, u8 curr_igi)
300 #if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
301 struct dm_struct *dm = (struct dm_struct *)dm_void;
302 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
303 u8 step1[8] = {24, 30, 40, 50, 60, 70, 80, 90};
304 u8 big_jump_lmt = dig_t->big_jump_lmt[dig_t->agc_table_idx];
307 if (dig_t->enable_adjust_big_jump == 0)
310 for (i = 0; i <= dig_t->big_jump_step1; i++) {
311 if ((curr_igi + step1[i]) > big_jump_lmt) {
315 } else if (i == dig_t->big_jump_step1) {
319 if (dm->support_ic_type & ODM_RTL8822B)
320 odm_set_bb_reg(dm, R_0x8c8, 0xe, i);
321 else if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))
322 odm_set_bb_reg(dm, ODM_REG_BB_AGC_SET_2_11N, 0xe, i);
324 PHYDM_DBG(dm, DBG_DIG, "Bigjump = %d (ori = 0x%x), LMT=0x%x\n", i,
325 dig_t->big_jump_step1, big_jump_lmt);
329 #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
330 void phydm_write_dig_reg_jgr3(void *dm_void, u8 igi)
332 struct dm_struct *dm = (struct dm_struct *)dm_void;
333 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
335 PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
338 if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
341 odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_11AC, igi);
343 #if (defined(PHYDM_COMPILE_ABOVE_2SS))
344 if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS)
345 odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_B_11AC3, igi);
348 #if (defined(PHYDM_COMPILE_ABOVE_4SS))
349 if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
350 odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_C_11AC3, igi);
351 odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_D_11AC3, igi);
356 u8 phydm_get_igi_reg_val_jgr3(void *dm_void, enum bb_path path)
358 struct dm_struct *dm = (struct dm_struct *)dm_void;
361 PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
364 if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
367 if (path == BB_PATH_A)
368 val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_11AC);
369 else if (path == BB_PATH_B)
370 #if (defined(PHYDM_COMPILE_ABOVE_2SS))
371 val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_B_11AC3);
375 else if (path == BB_PATH_C)
376 #if (defined(PHYDM_COMPILE_ABOVE_3SS))
377 val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_C_11AC3);
381 else if (path == BB_PATH_D)
382 #if (defined(PHYDM_COMPILE_ABOVE_4SS))
383 val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_D_11AC3);
391 void phydm_fa_cnt_statistics_jgr3(void *dm_void)
393 struct dm_struct *dm = (struct dm_struct *)dm_void;
394 struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
397 u16 ofdm_tx_counter = 0;
398 u16 cck_tx_counter = 0;
400 if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
403 ofdm_tx_counter = (u16)odm_get_bb_reg(dm, R_0x2de0, MASKLWORD);
404 cck_tx_counter = (u16)odm_get_bb_reg(dm, R_0x2de4, MASKLWORD);
406 ret_value = odm_get_bb_reg(dm, R_0x2d20, MASKDWORD);
407 fa_t->cnt_fast_fsync = (ret_value & 0xffff);
408 fa_t->cnt_sb_search_fail = ((ret_value & 0xffff0000) >> 16);
410 ret_value = odm_get_bb_reg(dm, R_0x2d04, MASKDWORD);
411 fa_t->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16);
413 ret_value = odm_get_bb_reg(dm, R_0x2d08, MASKDWORD);
414 fa_t->cnt_rate_illegal = (ret_value & 0xffff);
415 fa_t->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);
417 ret_value = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);
418 fa_t->cnt_mcs_fail = (ret_value & 0xffff);
420 /* read OFDM FA counter */
421 fa_t->cnt_ofdm_fail = odm_get_bb_reg(dm, R_0x2d00, MASKLWORD);
423 /* Read CCK FA counter */
424 fa_t->cnt_cck_fail = odm_get_bb_reg(dm, R_0x1a5c, MASKLWORD);
426 /* read CCK/OFDM CCA counter */
427 ret_value = odm_get_bb_reg(dm, R_0x2c08, MASKDWORD);
428 fa_t->cnt_ofdm_cca = ((ret_value & 0xffff0000) >> 16);
429 fa_t->cnt_cck_cca = ret_value & 0xffff;
431 /* read CCK CRC32 counter */
432 ret_value = odm_get_bb_reg(dm, R_0x2c04, MASKDWORD);
433 fa_t->cnt_cck_crc32_error = ((ret_value & 0xffff0000) >> 16);
434 fa_t->cnt_cck_crc32_ok = ret_value & 0xffff;
436 /* read OFDM CRC32 counter */
437 ret_value = odm_get_bb_reg(dm, R_0x2c14, MASKDWORD);
438 fa_t->cnt_ofdm_crc32_error = ((ret_value & 0xffff0000) >> 16);
439 fa_t->cnt_ofdm_crc32_ok = ret_value & 0xffff;
441 /* read HT CRC32 counter */
442 ret_value = odm_get_bb_reg(dm, R_0x2c10, MASKDWORD);
443 fa_t->cnt_ht_crc32_error = ((ret_value & 0xffff0000) >> 16);
444 fa_t->cnt_ht_crc32_ok = ret_value & 0xffff;
447 if (dm->support_ic_type & ODM_RTL8822C) {
448 /* read VHT CRC32 counter */
449 ret_value = odm_get_bb_reg(dm, R_0x2c0c, MASKDWORD);
450 fa_t->cnt_vht_crc32_error = ((ret_value & 0xffff0000) >> 16);
451 fa_t->cnt_vht_crc32_ok = ret_value & 0xffff;
453 ret_value = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);
454 fa_t->cnt_mcs_fail_vht = ((ret_value & 0xffff0000) >> 16);
456 ret_value = odm_get_bb_reg(dm, R_0x2d0c, MASKDWORD);
457 fa_t->cnt_crc8_fail_vht = ret_value & 0xffff +
458 ((ret_value & 0xffff0000) >> 16);
460 fa_t->cnt_vht_crc32_error = 0;
461 fa_t->cnt_vht_crc32_ok = 0;
462 fa_t->cnt_mcs_fail_vht = 0;
463 fa_t->cnt_crc8_fail_vht = 0;
466 cck_enable = odm_get_bb_reg(dm, R_0x1c3c, BIT(1)); /* @98f 1C3c[1] */
467 if (cck_enable) { /* @if(*dm->band_type == ODM_BAND_2_4G) */
468 fa_t->cnt_all = fa_t->cnt_ofdm_fail + fa_t->cnt_cck_fail
470 fa_t->cnt_cca_all = fa_t->cnt_cck_cca + fa_t->cnt_ofdm_cca;
471 PHYDM_DBG(dm, DBG_FA_CNT, "ac3 OFDM FA = %d, CCK FA = %d\n",
472 fa_t->cnt_ofdm_fail - ofdm_tx_counter,
475 fa_t->cnt_all = fa_t->cnt_ofdm_fail - ofdm_tx_counter;
476 fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca;
477 PHYDM_DBG(dm, DBG_FA_CNT, "ac3 CCK disable OFDM FA = %d\n",
478 fa_t->cnt_ofdm_fail - ofdm_tx_counter);
481 PHYDM_DBG(dm, DBG_FA_CNT,
482 "ac3 [OFDM FA Detail] Parity_fail=((%d)), Rate_Illegal=((%d)), CRC8_fail=((%d)), Mcs_fail=((%d)), Fast_Fsync=((%d)), SBD_fail=((%d))\n",
483 fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
484 fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail, fa_t->cnt_fast_fsync,
485 fa_t->cnt_sb_search_fail);
490 void phydm_write_dig_reg(void *dm_void, u8 igi)
492 struct dm_struct *dm = (struct dm_struct *)dm_void;
494 PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
496 odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm), igi);
498 #if (defined(PHYDM_COMPILE_ABOVE_2SS))
499 if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS)
500 odm_set_bb_reg(dm, ODM_REG(IGI_B, dm), ODM_BIT(IGI, dm), igi);
503 #if (defined(PHYDM_COMPILE_ABOVE_4SS))
504 if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
505 odm_set_bb_reg(dm, ODM_REG(IGI_C, dm), ODM_BIT(IGI, dm), igi);
506 odm_set_bb_reg(dm, ODM_REG(IGI_D, dm), ODM_BIT(IGI, dm), igi);
511 void odm_write_dig(void *dm_void, u8 new_igi)
513 struct dm_struct *dm = (struct dm_struct *)dm_void;
514 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
515 struct phydm_adaptivity_struct *adaptivity = &dm->adaptivity;
517 PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
519 /* @1 Check IGI by upper bound */
520 if (adaptivity->igi_lmt_en &&
521 new_igi > adaptivity->adapt_igi_up && dm->is_linked) {
522 new_igi = adaptivity->adapt_igi_up;
524 PHYDM_DBG(dm, DBG_DIG, "Force Adaptivity Up-bound=((0x%x))\n",
528 #if (RTL8192F_SUPPORT)
529 if ((dm->support_ic_type & ODM_RTL8192F) &&
530 dm->cut_version == ODM_CUT_A &&
533 PHYDM_DBG(dm, DBG_DIG,
534 "Force 92F Adaptivity Up-bound=((0x%x))\n", new_igi);
538 if (dig_t->cur_ig_value != new_igi) {
539 #if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
540 /* @Modify big jump step for 8822B and 8197F */
541 if (dm->support_ic_type &
542 (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F))
543 phydm_set_big_jump_step(dm, new_igi);
546 #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
547 /* Set IGI value of CCK for new CCK AGC */
548 if (dm->cck_new_agc &&
549 (dm->support_ic_type & PHYSTS_2ND_TYPE_IC))
550 odm_set_bb_reg(dm, R_0xa0c, 0x3f00, (new_igi >> 1));
553 /*@Add by YuChen for USB IO too slow issue*/
554 if (!(dm->support_ic_type & ODM_IC_PWDB_EDCCA)) {
555 if (dm->support_ability & ODM_BB_ADAPTIVITY &&
556 new_igi < dig_t->cur_ig_value) {
557 dig_t->cur_ig_value = new_igi;
558 phydm_adaptivity(dm);
561 if (dm->support_ability & ODM_BB_ADAPTIVITY &&
562 new_igi > dig_t->cur_ig_value) {
563 dig_t->cur_ig_value = new_igi;
564 phydm_adaptivity(dm);
568 #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
569 if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
570 phydm_write_dig_reg_jgr3(dm, new_igi);
573 phydm_write_dig_reg(dm, new_igi);
575 dig_t->cur_ig_value = new_igi;
578 PHYDM_DBG(dm, DBG_DIG, "New_igi=((0x%x))\n\n", new_igi);
581 u8 phydm_get_igi_reg_val(void *dm_void, enum bb_path path)
583 struct dm_struct *dm = (struct dm_struct *)dm_void;
585 u32 bit_map = ODM_BIT(IGI, dm);
589 val = odm_get_bb_reg(dm, ODM_REG(IGI_A, dm), bit_map);
591 #if (defined(PHYDM_COMPILE_ABOVE_2SS))
593 val = odm_get_bb_reg(dm, ODM_REG(IGI_B, dm), bit_map);
597 #if (defined(PHYDM_COMPILE_ABOVE_3SS))
599 val = odm_get_bb_reg(dm, ODM_REG(IGI_C, dm), bit_map);
603 #if (defined(PHYDM_COMPILE_ABOVE_4SS))
605 val = odm_get_bb_reg(dm, ODM_REG(IGI_D, dm), bit_map);
616 u8 phydm_get_igi(void *dm_void, enum bb_path path)
618 struct dm_struct *dm = (struct dm_struct *)dm_void;
621 #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
622 if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
623 val = phydm_get_igi_reg_val_jgr3(dm, path);
626 val = phydm_get_igi_reg_val(dm, path);
631 void phydm_set_dig_val(void *dm_void, u32 *val_buf, u8 val_len)
633 struct dm_struct *dm = (struct dm_struct *)dm_void;
636 PHYDM_DBG(dm, ODM_COMP_API, "[Error][DIG]Need val_len=1\n");
640 odm_write_dig(dm, (u8)(*val_buf));
643 void odm_pause_dig(void *dm_void, enum phydm_pause_type type,
644 enum phydm_pause_level lv, u8 igi_input)
646 struct dm_struct *dm = (struct dm_struct *)dm_void;
648 u32 igi = (u32)igi_input;
650 PHYDM_DBG(dm, DBG_DIG, "[%s]type=%d, LV=%d, igi=0x%x\n", __func__, type,
655 case PHYDM_PAUSE_NO_SET: {
656 rpt = phydm_pause_func(dm, F00_DIG, PHYDM_PAUSE, lv, 1, &igi);
661 rpt = phydm_pause_func(dm, F00_DIG, PHYDM_RESUME, lv, 1, &igi);
665 PHYDM_DBG(dm, DBG_DIG, "Wrong type\n");
669 PHYDM_DBG(dm, DBG_DIG, "pause_result=%d\n", rpt);
673 phydm_dig_abort(void *dm_void)
675 struct dm_struct *dm = (struct dm_struct *)dm_void;
676 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
677 void *adapter = dm->adapter;
680 /* support_ability */
681 if ((!(dm->support_ability & ODM_BB_FA_CNT)) ||
682 (!(dm->support_ability & ODM_BB_DIG)) ||
683 *dm->is_scan_in_process) {
684 PHYDM_DBG(dm, DBG_DIG, "Not Support\n");
688 if (dm->pause_ability & ODM_BB_DIG) {
689 PHYDM_DBG(dm, DBG_DIG, "Return: Pause DIG in LV=%d\n",
690 dm->pause_lv_table.lv_dig);
694 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
695 #if OS_WIN_FROM_WIN7(OS_VERSION)
696 if (IsAPModeExist(adapter) && ((PADAPTER)(adapter))->bInHctTest) {
697 PHYDM_DBG(dm, DBG_DIG, " Return: Is AP mode or In HCT Test\n");
706 void phydm_dig_init(void *dm_void)
708 struct dm_struct *dm = (struct dm_struct *)dm_void;
709 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
710 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
711 struct phydm_fa_struct *false_alm_cnt = &dm->false_alm_cnt;
716 dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
717 dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;
718 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
720 dig_t->cur_ig_value = phydm_get_igi(dm, BB_PATH_A);
722 dig_t->is_media_connect = false;
724 dig_t->fa_th[0] = 250;
725 dig_t->fa_th[1] = 500;
726 dig_t->fa_th[2] = 750;
727 dig_t->is_dbg_fa_th = false;
728 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
730 false_alm_cnt->cnt_ofdm_fail_pre = 0;
733 dig_t->rx_gain_range_max = DIG_MAX_BALANCE_MODE;
734 dig_t->rx_gain_range_min = dig_t->cur_ig_value;
736 #if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
737 dig_t->enable_adjust_big_jump = 1;
738 if (dm->support_ic_type & ODM_RTL8822B)
739 ret_value = odm_get_bb_reg(dm, R_0x8c8, MASKLWORD);
740 else if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))
741 ret_value = odm_get_bb_reg(dm, R_0xc74, MASKLWORD);
743 dig_t->big_jump_step1 = (u8)(ret_value & 0xe) >> 1;
744 dig_t->big_jump_step2 = (u8)(ret_value & 0x30) >> 4;
745 dig_t->big_jump_step3 = (u8)(ret_value & 0xc0) >> 6;
747 if (dm->support_ic_type &
748 (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F)) {
749 for (i = 0; i < sizeof(dig_t->big_jump_lmt); i++) {
750 if (dig_t->big_jump_lmt[i] == 0)
751 dig_t->big_jump_lmt[i] = 0x64;
752 /* Set -10dBm as default value */
757 #ifdef PHYDM_TDMA_DIG_SUPPORT
758 dm->original_dig_restore = true;
760 #ifdef CFG_DIG_DAMPING_CHK
761 phydm_dig_recorder_reset(dm);
762 dig_t->dig_dl_en = 1;
766 void phydm_dig_abs_boundary_decision(struct dm_struct *dm, boolean is_dfs_band)
768 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
770 if (!dm->is_linked) {
771 dig_t->dm_dig_max = DIG_MAX_COVERAGR;
772 dig_t->dm_dig_min = DIG_MIN_COVERAGE;
773 } else if (is_dfs_band) {
774 if (*dm->band_width == CHANNEL_WIDTH_20)
775 dig_t->dm_dig_min = DIG_MIN_DFS + 2;
777 dig_t->dm_dig_min = DIG_MIN_DFS;
779 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
780 dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
782 if (*dm->bb_op_mode == PHYDM_BALANCE_MODE) {
783 /*service > 2 devices*/
784 dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
786 dig_t->dig_max_of_min = DIG_MIN_COVERAGE;
788 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
790 } else if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE) {
791 /*service 1 devices*/
792 dig_t->dm_dig_max = DIG_MAX_PERFORMANCE_MODE;
793 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_PERFORMANCE_MODE;
796 if (dm->support_ic_type &
797 (ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))
798 dig_t->dm_dig_min = 0x1c;
799 else if (dm->support_ic_type & ODM_RTL8197F)
800 dig_t->dm_dig_min = 0x1e; /*@For HW setting*/
802 dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;
805 PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",
806 dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);
809 void phydm_dig_dym_boundary_decision(struct dm_struct *dm)
811 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
812 #ifdef CFG_DIG_DAMPING_CHK
813 struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
815 u8 offset = 15, tmp_max = 0;
816 u8 max_of_rssi_min = 0;
818 PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
820 if (!dm->is_linked) {
821 /*@if no link, always stay at lower bound*/
822 dig_t->rx_gain_range_max = dig_t->dig_max_of_min;
823 dig_t->rx_gain_range_min = dig_t->dm_dig_min;
825 PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",
826 dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);
830 PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n", dm->rssi_min, offset);
832 /* @DIG lower bound */
833 if (dm->rssi_min > dig_t->dig_max_of_min)
834 dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
835 else if (dm->rssi_min < dig_t->dm_dig_min)
836 dig_t->rx_gain_range_min = dig_t->dm_dig_min;
838 dig_t->rx_gain_range_min = dm->rssi_min;
840 #ifdef CFG_DIG_DAMPING_CHK
841 /*@Limit Dyn min by damping*/
842 if (dig_t->dig_dl_en &&
843 dig_rc->damping_limit_en &&
844 dig_t->rx_gain_range_min < dig_rc->damping_limit_val) {
845 PHYDM_DBG(dm, DBG_DIG,
846 "[Limit by Damping] Dig_dyn_min=0x%x -> 0x%x\n",
847 dig_t->rx_gain_range_min, dig_rc->damping_limit_val);
849 dig_t->rx_gain_range_min = dig_rc->damping_limit_val;
853 /* @DIG upper bound */
854 tmp_max = dig_t->rx_gain_range_min + offset;
855 if (dig_t->rx_gain_range_min != dm->rssi_min) {
856 max_of_rssi_min = dm->rssi_min + offset;
857 if (tmp_max > max_of_rssi_min)
858 tmp_max = max_of_rssi_min;
861 if (tmp_max > dig_t->dm_dig_max)
862 dig_t->rx_gain_range_max = dig_t->dm_dig_max;
863 else if (tmp_max < dig_t->dm_dig_min)
864 dig_t->rx_gain_range_max = dig_t->dm_dig_min;
866 dig_t->rx_gain_range_max = tmp_max;
868 #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
869 /* @1 Force Lower Bound for AntDiv */
870 if (!dm->is_one_entry_only &&
871 (dm->support_ability & ODM_BB_ANT_DIV) &&
872 (dm->ant_div_type == CG_TRX_HW_ANTDIV ||
873 dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {
874 if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)
875 dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
877 dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;
879 PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",
880 dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);
884 PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",
885 dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);
888 void phydm_dig_abnormal_case(struct dm_struct *dm)
890 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
892 /* @Abnormal lower bound case */
893 if (dig_t->rx_gain_range_min > dig_t->rx_gain_range_max)
894 dig_t->rx_gain_range_min = dig_t->rx_gain_range_max;
896 PHYDM_DBG(dm, DBG_DIG, "Abnoraml checked {Max, Min}={0x%x, 0x%x}\n",
897 dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);
900 u8 phydm_new_igi_by_fa(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *step_size)
902 boolean dig_go_up_check = true;
903 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
906 /*@dig_go_up_check = phydm_dig_go_up_check(dm);*/
909 if (fa_cnt > dig_t->fa_th[2] && dig_go_up_check)
910 igi = igi + step_size[0];
911 else if ((fa_cnt > dig_t->fa_th[1]) && dig_go_up_check)
912 igi = igi + step_size[1];
913 else if (fa_cnt < dig_t->fa_th[0])
914 igi = igi - step_size[2];
919 u8 phydm_get_new_igi(struct dm_struct *dm, u8 igi, u32 fa_cnt,
922 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
924 boolean first_connect = false, first_dis_connect = false;
926 first_connect = (dm->is_linked) && !dig_t->is_media_connect;
927 first_dis_connect = (!dm->is_linked) && dig_t->is_media_connect;
930 if (dm->pre_rssi_min <= dm->rssi_min) {
931 PHYDM_DBG(dm, DBG_DIG, "pre_rssi_min <= rssi_min\n");
946 PHYDM_DBG(dm, DBG_DIG, "step = {-%d, +%d, +%d}\n", step[2], step[1],
951 if (dm->rssi_min > DIG_MAX_DFS)
955 PHYDM_DBG(dm, DBG_DIG, "DFS band:IgiMax=0x%x\n",
956 dig_t->rx_gain_range_max);
958 igi = dig_t->rx_gain_range_min;
961 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
962 #if (RTL8812A_SUPPORT)
963 if (dm->support_ic_type == ODM_RTL8812)
964 odm_config_bb_with_header_file(dm,
965 CONFIG_BB_AGC_TAB_DIFF);
968 PHYDM_DBG(dm, DBG_DIG, "First connect: foce IGI=0x%x\n", igi);
969 } else if (dm->is_linked) {
970 PHYDM_DBG(dm, DBG_DIG, "Adjust IGI @ linked\n");
971 /* @4 Abnormal # beacon case */
972 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
973 if (dm->phy_dbg_info.num_qry_beacon_pkt < 5 &&
974 fa_cnt < DM_DIG_FA_TH1 && dm->bsta_state &&
975 dm->support_ic_type != ODM_RTL8723D) {
976 dig_t->rx_gain_range_min = 0x1c;
977 igi = dig_t->rx_gain_range_min;
978 PHYDM_DBG(dm, DBG_DIG, "Beacon_num=%d,force igi=0x%x\n",
979 dm->phy_dbg_info.num_qry_beacon_pkt, igi);
981 igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
984 igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
988 PHYDM_DBG(dm, DBG_DIG, "Adjust IGI before link\n");
990 if (first_dis_connect) {
991 igi = dig_t->dm_dig_min;
992 PHYDM_DBG(dm, DBG_DIG,
993 "First disconnect:foce IGI to lower bound\n");
995 PHYDM_DBG(dm, DBG_DIG, "Pre_IGI=((0x%x)), FA=((%d))\n",
998 igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
1002 /*@Check IGI by dyn-upper/lower bound */
1003 if (igi < dig_t->rx_gain_range_min)
1004 igi = dig_t->rx_gain_range_min;
1006 if (igi > dig_t->rx_gain_range_max)
1007 igi = dig_t->rx_gain_range_max;
1009 PHYDM_DBG(dm, DBG_DIG, "fa_cnt = %d, IGI: 0x%x -> 0x%x\n",
1010 fa_cnt, dig_t->cur_ig_value, igi);
1015 boolean phydm_dig_dfs_mode_en(void *dm_void)
1017 struct dm_struct *dm = (struct dm_struct *)dm_void;
1018 boolean dfs_mode_en = false;
1020 /* @Modify lower bound for DFS band */
1021 if (dm->is_dfs_band) {
1022 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1025 if (phydm_dfs_master_enabled(dm))
1028 PHYDM_DBG(dm, DBG_DIG, "In DFS band\n");
1033 void phydm_dig(void *dm_void)
1035 struct dm_struct *dm = (struct dm_struct *)dm_void;
1036 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1037 struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
1038 #ifdef PHYDM_TDMA_DIG_SUPPORT
1039 struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
1041 boolean first_connect, first_disconnect;
1042 u8 igi = dig_t->cur_ig_value;
1044 u32 fa_cnt = falm_cnt->cnt_all;
1045 boolean dfs_mode_en = false;
1047 #ifdef PHYDM_TDMA_DIG_SUPPORT
1048 if (!(dm->original_dig_restore)) {
1049 if (dig_t->cur_ig_value_tdma == 0)
1050 dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;
1052 igi = dig_t->cur_ig_value_tdma;
1053 fa_cnt = falm_cnt_acc->cnt_all_1sec;
1057 if (phydm_dig_abort(dm)) {
1058 dig_t->cur_ig_value = phydm_get_igi(dm, BB_PATH_A);
1062 PHYDM_DBG(dm, DBG_DIG, "%s Start===>\n", __func__);
1064 /* @1 Update status */
1065 first_connect = (dm->is_linked) && !dig_t->is_media_connect;
1066 first_disconnect = (!dm->is_linked) && dig_t->is_media_connect;
1068 PHYDM_DBG(dm, DBG_DIG,
1069 "is_linked=%d, RSSI=%d, 1stConnect=%d, 1stDisconnect=%d\n",
1070 dm->is_linked, dm->rssi_min, first_connect, first_disconnect);
1072 PHYDM_DBG(dm, DBG_DIG, "DIG ((%s)) mode\n",
1073 (*dm->bb_op_mode ? "Balance" : "Performance"));
1075 /*@DFS mode enable check*/
1076 dfs_mode_en = phydm_dig_dfs_mode_en(dm);
1078 #ifdef CFG_DIG_DAMPING_CHK
1079 /*Record IGI History*/
1080 phydm_dig_recorder(dm, first_connect, igi, fa_cnt);
1082 /*@DIG Damping Check*/
1083 phydm_dig_damping_chk(dm);
1086 /*@Absolute Boundary Decision */
1087 phydm_dig_abs_boundary_decision(dm, dfs_mode_en);
1089 /*@Dynamic Boundary Decision*/
1090 phydm_dig_dym_boundary_decision(dm);
1092 /*@Abnormal case check*/
1093 phydm_dig_abnormal_case(dm);
1095 /*@FA threshold decision */
1096 phydm_fa_threshold_check(dm, dfs_mode_en);
1098 /*Select new IGI by FA */
1099 new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);
1101 /* @1 Update status */
1102 #ifdef PHYDM_TDMA_DIG_SUPPORT
1103 if (!(dm->original_dig_restore)) {
1104 dig_t->cur_ig_value_tdma = new_igi;
1105 /*@It is possible fa_acc_1sec_tsf >= */
1106 /*@1sec while tdma_dig_state == 0*/
1107 if (dig_t->tdma_dig_state != 0)
1108 odm_write_dig(dm, dig_t->cur_ig_value_tdma);
1111 odm_write_dig(dm, new_igi);
1113 dig_t->is_media_connect = dm->is_linked;
1116 void phydm_dig_lps_32k(void *dm_void)
1118 struct dm_struct *dm = (struct dm_struct *)dm_void;
1119 u8 current_igi = dm->rssi_min;
1121 odm_write_dig(dm, current_igi);
1124 void phydm_dig_by_rssi_lps(void *dm_void)
1126 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1127 struct dm_struct *dm = (struct dm_struct *)dm_void;
1128 struct phydm_fa_struct *falm_cnt;
1130 u8 rssi_lower = DIG_MIN_LPS; /* @0x1E or 0x1C */
1131 u8 current_igi = dm->rssi_min;
1133 falm_cnt = &dm->false_alm_cnt;
1134 if (phydm_dig_abort(dm))
1137 current_igi = current_igi + RSSI_OFFSET_DIG_LPS;
1138 PHYDM_DBG(dm, DBG_DIG, "%s==>\n", __func__);
1140 /* Using FW PS mode to make IGI */
1141 /* @Adjust by FA in LPS MODE */
1142 if (falm_cnt->cnt_all > DM_DIG_FA_TH2_LPS)
1143 current_igi = current_igi + 4;
1144 else if (falm_cnt->cnt_all > DM_DIG_FA_TH1_LPS)
1145 current_igi = current_igi + 2;
1146 else if (falm_cnt->cnt_all < DM_DIG_FA_TH0_LPS)
1147 current_igi = current_igi - 2;
1149 /* @Lower bound checking */
1151 /* RSSI Lower bound check */
1152 if ((dm->rssi_min - 10) > DIG_MIN_LPS)
1153 rssi_lower = (dm->rssi_min - 10);
1155 rssi_lower = DIG_MIN_LPS;
1157 /* Upper and Lower Bound checking */
1158 if (current_igi > DIG_MAX_LPS)
1159 current_igi = DIG_MAX_LPS;
1160 else if (current_igi < rssi_lower)
1161 current_igi = rssi_lower;
1163 PHYDM_DBG(dm, DBG_DIG, "fa_cnt_all=%d, rssi_min=%d, curr_igi=0x%x\n",
1164 falm_cnt->cnt_all, dm->rssi_min, current_igi);
1165 odm_write_dig(dm, current_igi);
1169 /* @3============================================================
1170 * 3 FASLE ALARM CHECK
1171 * 3============================================================
1173 void phydm_false_alarm_counter_reg_reset(void *dm_void)
1175 struct dm_struct *dm = (struct dm_struct *)dm_void;
1176 struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
1177 #ifdef PHYDM_TDMA_DIG_SUPPORT
1178 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1179 struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
1183 #ifdef PHYDM_TDMA_DIG_SUPPORT
1184 if (!(dm->original_dig_restore)) {
1185 if (dig_t->cur_ig_value_tdma == 0)
1186 dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;
1188 false_alm_cnt = falm_cnt_acc->cnt_all_1sec;
1192 false_alm_cnt = falm_cnt->cnt_all;
1195 #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1196 if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1197 /* reset CCK FA counter */
1198 odm_set_bb_reg(dm, R_0x1a2c, BIT(15) | BIT(14), 0);
1199 odm_set_bb_reg(dm, R_0x1a2c, BIT(15) | BIT(14), 2);
1201 /* reset CCK CCA counter */
1202 odm_set_bb_reg(dm, R_0x1a2c, BIT(13) | BIT(12), 0);
1203 odm_set_bb_reg(dm, R_0x1a2c, BIT(13) | BIT(12), 2);
1205 /* reset OFDM CCA counter, OFDM FA counter*/
1206 odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 1);
1207 odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 0);
1210 #if (ODM_IC_11N_SERIES_SUPPORT)
1211 if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1212 /*reset false alarm counter registers*/
1213 odm_set_bb_reg(dm, R_0xc0c, BIT(31), 1);
1214 odm_set_bb_reg(dm, R_0xc0c, BIT(31), 0);
1215 odm_set_bb_reg(dm, R_0xd00, BIT(27), 1);
1216 odm_set_bb_reg(dm, R_0xd00, BIT(27), 0);
1218 /*update ofdm counter*/
1219 /*update page C counter*/
1220 odm_set_bb_reg(dm, R_0xc00, BIT(31), 0);
1221 /*update page D counter*/
1222 odm_set_bb_reg(dm, R_0xd00, BIT(31), 0);
1224 /*reset CCK CCA counter*/
1225 odm_set_bb_reg(dm, R_0xa2c, BIT(13) | BIT(12), 0);
1226 odm_set_bb_reg(dm, R_0xa2c, BIT(13) | BIT(12), 2);
1228 /*reset CCK FA counter*/
1229 odm_set_bb_reg(dm, R_0xa2c, BIT(15) | BIT(14), 0);
1230 odm_set_bb_reg(dm, R_0xa2c, BIT(15) | BIT(14), 2);
1232 /*reset CRC32 counter*/
1233 odm_set_bb_reg(dm, R_0xf14, BIT(16), 1);
1234 odm_set_bb_reg(dm, R_0xf14, BIT(16), 0);
1236 #endif /* @#if (ODM_IC_11N_SERIES_SUPPORT) */
1238 #if (ODM_IC_11AC_SERIES_SUPPORT)
1239 if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
1240 #if (RTL8881A_SUPPORT)
1241 /* Reset FA counter by enable/disable OFDM */
1242 if ((dm->support_ic_type == ODM_RTL8881A) &&
1243 false_alm_cnt->cnt_ofdm_fail_pre >= 0x7fff) {
1245 odm_set_bb_reg(dm, R_0x808, BIT(29), 0);
1246 odm_set_bb_reg(dm, R_0x808, BIT(29), 1);
1247 false_alm_cnt->cnt_ofdm_fail_pre = 0;
1248 PHYDM_DBG(dm, DBG_FA_CNT, "Reset FA_cnt\n");
1250 #endif /* @#if (RTL8881A_SUPPORT) */
1252 /* reset OFDM FA countner */
1253 odm_set_bb_reg(dm, R_0x9a4, BIT(17), 1);
1254 odm_set_bb_reg(dm, R_0x9a4, BIT(17), 0);
1256 /* reset CCK FA counter */
1257 odm_set_bb_reg(dm, R_0xa2c, BIT(15), 0);
1258 odm_set_bb_reg(dm, R_0xa2c, BIT(15), 1);
1260 /* reset CCA counter */
1261 phydm_reset_bb_hw_cnt_ac(dm);
1263 #endif /* @#if (ODM_IC_11AC_SERIES_SUPPORT) */
1266 void phydm_false_alarm_counter_reg_hold(void *dm_void)
1268 struct dm_struct *dm = (struct dm_struct *)dm_void;
1270 if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1271 /* @hold cck counter */
1272 odm_set_bb_reg(dm, R_0x1a2c, BIT(12), 1);
1273 odm_set_bb_reg(dm, R_0x1a2c, BIT(14), 1);
1274 } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1275 /*@hold ofdm counter*/
1276 /*@hold page C counter*/
1277 odm_set_bb_reg(dm, R_0xc00, BIT(31), 1);
1278 /*@hold page D counter*/
1279 odm_set_bb_reg(dm, R_0xd00, BIT(31), 1);
1281 /*@hold cck counter*/
1282 odm_set_bb_reg(dm, R_0xa2c, BIT(12), 1);
1283 odm_set_bb_reg(dm, R_0xa2c, BIT(14), 1);
1287 #if (ODM_IC_11N_SERIES_SUPPORT)
1288 void phydm_fa_cnt_statistics_n(void *dm_void)
1290 struct dm_struct *dm = (struct dm_struct *)dm_void;
1291 struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1294 if (!(dm->support_ic_type & ODM_IC_11N_SERIES))
1297 /* @hold ofdm & cck counter */
1298 phydm_false_alarm_counter_reg_hold(dm);
1300 reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE1_11N, MASKDWORD);
1301 fa_t->cnt_fast_fsync = (reg & 0xffff);
1302 fa_t->cnt_sb_search_fail = ((reg & 0xffff0000) >> 16);
1304 reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE2_11N, MASKDWORD);
1305 fa_t->cnt_ofdm_cca = (reg & 0xffff);
1306 fa_t->cnt_parity_fail = ((reg & 0xffff0000) >> 16);
1308 reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE3_11N, MASKDWORD);
1309 fa_t->cnt_rate_illegal = (reg & 0xffff);
1310 fa_t->cnt_crc8_fail = ((reg & 0xffff0000) >> 16);
1312 reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE4_11N, MASKDWORD);
1313 fa_t->cnt_mcs_fail = (reg & 0xffff);
1315 fa_t->cnt_ofdm_fail =
1316 fa_t->cnt_parity_fail + fa_t->cnt_rate_illegal +
1317 fa_t->cnt_crc8_fail + fa_t->cnt_mcs_fail +
1318 fa_t->cnt_fast_fsync + fa_t->cnt_sb_search_fail;
1320 /* read CCK CRC32 counter */
1321 fa_t->cnt_cck_crc32_error = odm_get_bb_reg(dm, R_0xf84, MASKDWORD);
1322 fa_t->cnt_cck_crc32_ok = odm_get_bb_reg(dm, R_0xf88, MASKDWORD);
1324 /* read OFDM CRC32 counter */
1325 reg = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11N, MASKDWORD);
1326 fa_t->cnt_ofdm_crc32_error = (reg & 0xffff0000) >> 16;
1327 fa_t->cnt_ofdm_crc32_ok = reg & 0xffff;
1329 /* read HT CRC32 counter */
1330 reg = odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11N, MASKDWORD);
1331 fa_t->cnt_ht_crc32_error = (reg & 0xffff0000) >> 16;
1332 fa_t->cnt_ht_crc32_ok = reg & 0xffff;
1334 /* read VHT CRC32 counter */
1335 fa_t->cnt_vht_crc32_error = 0;
1336 fa_t->cnt_vht_crc32_ok = 0;
1338 #if (RTL8723D_SUPPORT)
1339 if (dm->support_ic_type == ODM_RTL8723D) {
1340 /* read HT CRC32 agg counter */
1341 reg = odm_get_bb_reg(dm, R_0xfb8, MASKDWORD);
1342 fa_t->cnt_ht_crc32_error_agg = (reg & 0xffff0000) >> 16;
1343 fa_t->cnt_ht_crc32_ok_agg = reg & 0xffff;
1347 #if (RTL8188E_SUPPORT)
1348 if (dm->support_ic_type == ODM_RTL8188E) {
1349 reg = odm_get_bb_reg(dm, ODM_REG_SC_CNT_11N, MASKDWORD);
1350 fa_t->cnt_bw_lsc = (reg & 0xffff);
1351 fa_t->cnt_bw_usc = ((reg & 0xffff0000) >> 16);
1355 reg = odm_get_bb_reg(dm, ODM_REG_CCK_FA_LSB_11N, MASKBYTE0);
1356 fa_t->cnt_cck_fail = reg;
1358 reg = odm_get_bb_reg(dm, ODM_REG_CCK_FA_MSB_11N, MASKBYTE3);
1359 fa_t->cnt_cck_fail += (reg & 0xff) << 8;
1361 reg = odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11N, MASKDWORD);
1362 fa_t->cnt_cck_cca = ((reg & 0xFF) << 8) | ((reg & 0xFF00) >> 8);
1364 fa_t->cnt_all_pre = fa_t->cnt_all;
1366 fa_t->cnt_all = fa_t->cnt_fast_fsync +
1367 fa_t->cnt_sb_search_fail +
1368 fa_t->cnt_parity_fail +
1369 fa_t->cnt_rate_illegal +
1370 fa_t->cnt_crc8_fail +
1371 fa_t->cnt_mcs_fail +
1374 fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca + fa_t->cnt_cck_cca;
1376 PHYDM_DBG(dm, DBG_FA_CNT,
1377 "[OFDM FA Detail] Parity_Fail=((%d)), Rate_Illegal=((%d)), CRC8_fail=((%d)), Mcs_fail=((%d)), Fast_Fsync=(( %d )), SBD_fail=((%d))\n",
1378 fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
1379 fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail, fa_t->cnt_fast_fsync,
1380 fa_t->cnt_sb_search_fail);
1384 #if (ODM_IC_11AC_SERIES_SUPPORT == 1)
1385 void phydm_fa_cnt_statistics_ac(void *dm_void)
1387 struct dm_struct *dm = (struct dm_struct *)dm_void;
1388 struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1392 if (!(dm->support_ic_type & ODM_IC_11AC_SERIES))
1395 ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE1_11AC, MASKDWORD);
1396 fa_t->cnt_fast_fsync = ((ret_value & 0xffff0000) >> 16);
1398 ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE2_11AC, MASKDWORD);
1399 fa_t->cnt_sb_search_fail = (ret_value & 0xffff);
1401 ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE3_11AC, MASKDWORD);
1402 fa_t->cnt_parity_fail = (ret_value & 0xffff);
1403 fa_t->cnt_rate_illegal = ((ret_value & 0xffff0000) >> 16);
1405 ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE4_11AC, MASKDWORD);
1406 fa_t->cnt_crc8_fail = (ret_value & 0xffff);
1407 fa_t->cnt_mcs_fail = ((ret_value & 0xffff0000) >> 16);
1409 ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE5_11AC, MASKDWORD);
1410 fa_t->cnt_crc8_fail_vht = (ret_value & 0xffff) +
1411 (ret_value & 0xffff0000 >> 16);
1413 ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE6_11AC, MASKDWORD);
1414 fa_t->cnt_mcs_fail_vht = (ret_value & 0xffff);
1416 /* read OFDM FA counter */
1417 fa_t->cnt_ofdm_fail = odm_get_bb_reg(dm, R_0xf48, MASKLWORD);
1419 /* Read CCK FA counter */
1420 fa_t->cnt_cck_fail = odm_get_bb_reg(dm, ODM_REG_CCK_FA_11AC, MASKLWORD);
1422 /* read CCK/OFDM CCA counter */
1423 ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11AC, MASKDWORD);
1424 fa_t->cnt_ofdm_cca = (ret_value & 0xffff0000) >> 16;
1425 fa_t->cnt_cck_cca = ret_value & 0xffff;
1427 /* read CCK CRC32 counter */
1428 ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CRC32_CNT_11AC, MASKDWORD);
1429 fa_t->cnt_cck_crc32_error = (ret_value & 0xffff0000) >> 16;
1430 fa_t->cnt_cck_crc32_ok = ret_value & 0xffff;
1432 /* read OFDM CRC32 counter */
1433 ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11AC, MASKDWORD);
1434 fa_t->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;
1435 fa_t->cnt_ofdm_crc32_ok = ret_value & 0xffff;
1437 /* read HT CRC32 counter */
1438 ret_value = odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11AC, MASKDWORD);
1439 fa_t->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;
1440 fa_t->cnt_ht_crc32_ok = ret_value & 0xffff;
1442 /* read VHT CRC32 counter */
1443 ret_value = odm_get_bb_reg(dm, ODM_REG_VHT_CRC32_CNT_11AC, MASKDWORD);
1444 fa_t->cnt_vht_crc32_error = (ret_value & 0xffff0000) >> 16;
1445 fa_t->cnt_vht_crc32_ok = ret_value & 0xffff;
1447 #if (RTL8881A_SUPPORT)
1448 if (dm->support_ic_type == ODM_RTL8881A) {
1451 if (fa_t->cnt_ofdm_fail >= fa_t->cnt_ofdm_fail_pre) {
1452 tmp = fa_t->cnt_ofdm_fail_pre;
1453 fa_t->cnt_ofdm_fail_pre = fa_t->cnt_ofdm_fail;
1454 fa_t->cnt_ofdm_fail = fa_t->cnt_ofdm_fail - tmp;
1456 fa_t->cnt_ofdm_fail_pre = fa_t->cnt_ofdm_fail;
1459 PHYDM_DBG(dm, DBG_FA_CNT,
1460 "[8881]cnt_ofdm_fail{curr,pre}={%d,%d}\n",
1461 fa_t->cnt_ofdm_fail_pre, tmp);
1465 cck_enable = odm_get_bb_reg(dm, ODM_REG_BB_RX_PATH_11AC, BIT(28));
1467 if (cck_enable) { /* @if(*dm->band_type == ODM_BAND_2_4G) */
1468 fa_t->cnt_all = fa_t->cnt_ofdm_fail + fa_t->cnt_cck_fail;
1469 fa_t->cnt_cca_all = fa_t->cnt_cck_cca + fa_t->cnt_ofdm_cca;
1471 fa_t->cnt_all = fa_t->cnt_ofdm_fail;
1472 fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca;
1477 void phydm_get_dbg_port_info(void *dm_void)
1479 struct dm_struct *dm = (struct dm_struct *)dm_void;
1480 struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1481 u32 dbg_port = dm->adaptivity.adaptivity_dbg_port;
1484 /*set debug port to 0x0*/
1485 if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x0)) {
1486 fa_t->dbg_port0 = phydm_get_bb_dbg_port_val(dm);
1487 phydm_release_bb_dbg_port(dm);
1490 if (dm->support_ic_type & ODM_RTL8723D) {
1491 val = odm_get_bb_reg(dm, R_0x9a0, BIT(29));
1492 } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1493 val = odm_get_bb_reg(dm, R_0x2d38, BIT(24));
1494 } else if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, dbg_port)) {
1495 if (dm->support_ic_type & (ODM_RTL8723B | ODM_RTL8188E))
1496 val = (phydm_get_bb_dbg_port_val(dm) & BIT(30)) >> 30;
1498 val = (phydm_get_bb_dbg_port_val(dm) & BIT(29)) >> 29;
1499 phydm_release_bb_dbg_port(dm);
1502 fa_t->edcca_flag = (boolean)val;
1504 PHYDM_DBG(dm, DBG_FA_CNT, "FA_Cnt: Dbg port 0x0 = 0x%x, EDCCA = %d\n\n",
1505 fa_t->dbg_port0, fa_t->edcca_flag);
1508 void phydm_false_alarm_counter_statistics(void *dm_void)
1510 struct dm_struct *dm = (struct dm_struct *)dm_void;
1511 struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1513 if (!(dm->support_ability & ODM_BB_FA_CNT))
1516 PHYDM_DBG(dm, DBG_FA_CNT, "%s======>\n", __func__);
1518 if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1519 #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1520 phydm_fa_cnt_statistics_jgr3(dm);
1522 } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1523 #if (ODM_IC_11N_SERIES_SUPPORT)
1524 phydm_fa_cnt_statistics_n(dm);
1526 } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
1527 #if (ODM_IC_11AC_SERIES_SUPPORT)
1528 phydm_fa_cnt_statistics_ac(dm);
1532 phydm_get_dbg_port_info(dm);
1533 phydm_false_alarm_counter_reg_reset(dm_void);
1535 fa_t->time_fa_all = fa_t->cnt_fast_fsync * 12 +
1536 fa_t->cnt_sb_search_fail * 12 +
1537 fa_t->cnt_parity_fail * 28 +
1538 fa_t->cnt_rate_illegal * 28 +
1539 fa_t->cnt_crc8_fail * 36 +
1540 fa_t->cnt_crc8_fail_vht * 36 +
1541 fa_t->cnt_mcs_fail_vht * 36 +
1542 fa_t->cnt_mcs_fail * 32 +
1543 fa_t->cnt_cck_fail * 80;
1545 fa_t->cnt_crc32_error_all = fa_t->cnt_vht_crc32_error +
1546 fa_t->cnt_ht_crc32_error +
1547 fa_t->cnt_ofdm_crc32_error +
1548 fa_t->cnt_cck_crc32_error;
1550 fa_t->cnt_crc32_ok_all = fa_t->cnt_vht_crc32_ok +
1551 fa_t->cnt_ht_crc32_ok +
1552 fa_t->cnt_ofdm_crc32_ok +
1553 fa_t->cnt_cck_crc32_ok;
1555 PHYDM_DBG(dm, DBG_FA_CNT,
1556 "[OFDM FA Detail-1] Parity=((%d)), Rate_Illegal=((%d)), HT_CRC8=((%d)), HT_MCS=((%d))\n",
1557 fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
1558 fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail);
1559 PHYDM_DBG(dm, DBG_FA_CNT,
1560 "[OFDM FA Detail-2] Fast_Fsync=((%d)), SBD=((%d)), VHT_CRC8=((%d)), VHT_MCS=((%d))\n",
1561 fa_t->cnt_fast_fsync, fa_t->cnt_sb_search_fail,
1562 fa_t->cnt_crc8_fail_vht, fa_t->cnt_mcs_fail_vht);
1563 PHYDM_DBG(dm, DBG_FA_CNT,
1564 "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
1565 fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all);
1566 PHYDM_DBG(dm, DBG_FA_CNT,
1567 "[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
1568 fa_t->cnt_cck_fail, fa_t->cnt_ofdm_fail, fa_t->cnt_all);
1569 PHYDM_DBG(dm, DBG_FA_CNT, "[CCK] CRC32 {error, ok}= {%d, %d}\n",
1570 fa_t->cnt_cck_crc32_error, fa_t->cnt_cck_crc32_ok);
1571 PHYDM_DBG(dm, DBG_FA_CNT, "[OFDM]CRC32 {error, ok}= {%d, %d}\n",
1572 fa_t->cnt_ofdm_crc32_error, fa_t->cnt_ofdm_crc32_ok);
1573 PHYDM_DBG(dm, DBG_FA_CNT, "[ HT ] CRC32 {error, ok}= {%d, %d}\n",
1574 fa_t->cnt_ht_crc32_error, fa_t->cnt_ht_crc32_ok);
1575 PHYDM_DBG(dm, DBG_FA_CNT, "[VHT] CRC32 {error, ok}= {%d, %d}\n",
1576 fa_t->cnt_vht_crc32_error, fa_t->cnt_vht_crc32_ok);
1577 PHYDM_DBG(dm, DBG_FA_CNT, "[TOTAL] CRC32 {error, ok}= {%d, %d}\n",
1578 fa_t->cnt_crc32_error_all, fa_t->cnt_crc32_ok_all);
1581 #ifdef PHYDM_TDMA_DIG_SUPPORT
1582 void phydm_set_tdma_dig_timer(void *dm_void)
1584 struct dm_struct *dm = (struct dm_struct *)dm_void;
1585 u32 delta_time_us = dm->tdma_dig_timer_ms * 1000;
1586 struct phydm_dig_struct *dig_t;
1588 u32 current_time_stamp, diff_time_stamp, regb0;
1590 dig_t = &dm->dm_dig_table;
1591 /*some IC has no FREERUN_CUNT register, like 92E*/
1592 if (dm->support_ic_type & ODM_RTL8197F)
1593 current_time_stamp = odm_get_bb_reg(dm, R_0x568, 0xffffffff);
1597 timeout = current_time_stamp + delta_time_us;
1599 diff_time_stamp = current_time_stamp - dig_t->cur_timestamp;
1600 dig_t->pre_timestamp = dig_t->cur_timestamp;
1601 dig_t->cur_timestamp = current_time_stamp;
1603 /*@HIMR0, it shows HW interrupt mask*/
1604 regb0 = odm_get_bb_reg(dm, R_0xb0, 0xffffffff);
1606 PHYDM_DBG(dm, DBG_DIG, "Set next timer\n");
1607 PHYDM_DBG(dm, DBG_DIG,
1608 "curr_time_stamp=%d, delta_time_us=%d\n",
1609 current_time_stamp, delta_time_us);
1610 PHYDM_DBG(dm, DBG_DIG,
1611 "timeout=%d, diff_time_stamp=%d, Reg0xb0 = 0x%x\n",
1612 timeout, diff_time_stamp, regb0);
1614 if (dm->support_ic_type & ODM_RTL8197F) /*REG_PS_TIMER2*/
1615 odm_set_bb_reg(dm, R_0x588, 0xffffffff, timeout);
1617 PHYDM_DBG(dm, DBG_DIG, "NOT 97F, NOT start\n");
1622 void phydm_tdma_dig_timer_check(void *dm_void)
1624 struct dm_struct *dm = (struct dm_struct *)dm_void;
1625 struct phydm_dig_struct *dig_t;
1627 dig_t = &dm->dm_dig_table;
1629 PHYDM_DBG(dm, DBG_DIG, "tdma_dig_cnt=%d, pre_tdma_dig_cnt=%d\n",
1630 dig_t->tdma_dig_cnt, dig_t->pre_tdma_dig_cnt);
1632 if (dig_t->tdma_dig_cnt == 0 ||
1633 dig_t->tdma_dig_cnt == dig_t->pre_tdma_dig_cnt) {
1634 if (dm->support_ability & ODM_BB_DIG) {
1635 #ifdef IS_USE_NEW_TDMA
1636 if (dm->support_ic_type &
1637 (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8814B)) {
1638 PHYDM_DBG(dm, DBG_DIG,
1639 "Check fail, Restart timer\n\n");
1640 phydm_false_alarm_counter_reset(dm);
1641 odm_set_timer(dm, &dm->tdma_dig_timer,
1642 dm->tdma_dig_timer_ms);
1644 PHYDM_DBG(dm, DBG_DIG,
1645 "Not 98F/22C/14B no SW timer\n");
1648 /*@if interrupt mask info is got.*/
1649 /*Reg0xb0 is no longer needed*/
1651 /*regb0 = odm_get_bb_reg(dm, R_0xb0, bMaskDWord);*/
1653 PHYDM_DBG(dm, DBG_DIG,
1654 "Check fail, Mask[0]=0x%x, restart timer\n",
1655 *dm->interrupt_mask);
1657 phydm_tdma_dig_add_interrupt_mask_handler(dm);
1658 phydm_enable_rx_related_interrupt_handler(dm);
1659 phydm_set_tdma_dig_timer(dm);
1663 PHYDM_DBG(dm, DBG_DIG, "Check pass, update pre_tdma_dig_cnt\n");
1666 dig_t->pre_tdma_dig_cnt = dig_t->tdma_dig_cnt;
1669 /*@different IC/team may use different timer for tdma-dig*/
1670 void phydm_tdma_dig_add_interrupt_mask_handler(void *dm_void)
1672 struct dm_struct *dm = (struct dm_struct *)dm_void;
1674 #if (DM_ODM_SUPPORT_TYPE == (ODM_AP))
1675 if (dm->support_ic_type & ODM_RTL8197F) {
1676 /*@HAL_INT_TYPE_PSTIMEOUT2*/
1677 phydm_add_interrupt_mask_handler(dm, HAL_INT_TYPE_PSTIMEOUT2);
1679 #elif (DM_ODM_SUPPORT_TYPE == (ODM_WIN))
1680 #elif (DM_ODM_SUPPORT_TYPE == (ODM_CE))
1684 /* will be triggered by HW timer*/
1685 void phydm_tdma_dig(void *dm_void)
1687 struct dm_struct *dm;
1688 struct phydm_dig_struct *dig_t;
1689 struct phydm_fa_struct *falm_cnt;
1692 #if (RTL8198F_SUPPORT || RTL8822C_SUPPORT || RTL8814B_SUPPORT)
1693 #ifdef IS_USE_NEW_TDMA
1694 if (dm->support_ic_type &
1695 (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8814B)) {
1696 PHYDM_DBG(dm, DBG_DIG, "98F/22C/14B, new tdma\n");
1702 dm = (struct dm_struct *)dm_void;
1703 dig_t = &dm->dm_dig_table;
1704 falm_cnt = &dm->false_alm_cnt;
1705 reg_c50 = odm_get_bb_reg(dm, R_0xc50, MASKBYTE0);
1707 dig_t->tdma_dig_state =
1708 dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;
1710 PHYDM_DBG(dm, DBG_DIG, "tdma_dig_state=%d, regc50=0x%x\n",
1711 dig_t->tdma_dig_state, reg_c50);
1713 dig_t->tdma_dig_cnt++;
1715 if (dig_t->tdma_dig_state == 1) {
1716 /* update IGI from tdma_dig_state == 0*/
1717 if (dig_t->cur_ig_value_tdma == 0)
1718 dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;
1720 odm_write_dig(dm, dig_t->cur_ig_value_tdma);
1721 phydm_tdma_false_alarm_counter_check(dm);
1722 PHYDM_DBG(dm, DBG_DIG, "tdma_dig_state=%d, reset FA counter\n",
1723 dig_t->tdma_dig_state);
1725 } else if (dig_t->tdma_dig_state == 0) {
1726 /* update dig_t->CurIGValue,*/
1727 /* @it may different from dig_t->cur_ig_value_tdma */
1728 /* TDMA IGI upperbond @ L-state = */
1729 /* rf_ft_var.tdma_dig_low_upper_bond = 0x26 */
1731 if (dig_t->cur_ig_value >= dm->tdma_dig_low_upper_bond)
1732 dig_t->low_ig_value = dm->tdma_dig_low_upper_bond;
1734 dig_t->low_ig_value = dig_t->cur_ig_value;
1736 odm_write_dig(dm, dig_t->low_ig_value);
1737 phydm_tdma_false_alarm_counter_check(dm);
1739 phydm_tdma_false_alarm_counter_check(dm);
1743 /*@============================================================*/
1744 /*@FASLE ALARM CHECK*/
1745 /*@============================================================*/
1746 void phydm_tdma_false_alarm_counter_check(void *dm_void)
1748 struct dm_struct *dm;
1749 struct phydm_fa_struct *falm_cnt;
1750 struct phydm_fa_acc_struct *falm_cnt_acc;
1751 struct phydm_dig_struct *dig_t;
1752 boolean rssi_dump_en = 0;
1754 u8 tdma_dig_state_number;
1757 dm = (struct dm_struct *)dm_void;
1758 falm_cnt = &dm->false_alm_cnt;
1759 falm_cnt_acc = &dm->false_alm_cnt_acc;
1760 dig_t = &dm->dm_dig_table;
1762 if (dig_t->tdma_dig_state == 1)
1763 phydm_false_alarm_counter_reset(dm);
1764 /* Reset FalseAlarmCounterStatistics */
1765 /* @fa_acc_1sec_tsf = fa_acc_1sec_tsf, keep */
1766 /* @fa_end_tsf = fa_start_tsf = TSF */
1768 phydm_false_alarm_counter_statistics(dm);
1769 if (dm->support_ic_type & ODM_RTL8197F) /*REG_FREERUN_CNT*/
1770 timestamp = odm_get_bb_reg(dm, R_0x568, bMaskDWord);
1772 PHYDM_DBG(dm, DBG_DIG, "NOT 97F! NOT start\n");
1775 dig_t->fa_end_timestamp = timestamp;
1776 dig_t->fa_acc_1sec_timestamp +=
1777 (dig_t->fa_end_timestamp - dig_t->fa_start_timestamp);
1780 if (dm->tdma_dig_state_number == 1)
1781 dm->tdma_dig_state_number = 2;
1783 tdma_dig_state_number = dm->tdma_dig_state_number;
1785 tdma_dig_state_number / (tdma_dig_state_number - 1);
1787 /*@1sec = 1000000us*/
1788 if (dig_t->sec_factor)
1789 start_th = (u32)(1000000 / dig_t->sec_factor);
1791 if (dig_t->fa_acc_1sec_timestamp >= start_th) {
1793 phydm_false_alarm_counter_acc(dm, rssi_dump_en);
1794 PHYDM_DBG(dm, DBG_DIG,
1795 "sec_factor=%d, total FA=%d, is_linked=%d\n",
1796 dig_t->sec_factor, falm_cnt_acc->cnt_all,
1799 phydm_noisy_detection(dm);
1800 #ifdef PHYDM_SUPPORT_CCKPD
1801 phydm_cck_pd_th(dm);
1804 phydm_false_alarm_counter_acc_reset(dm);
1806 /* Reset FalseAlarmCounterStatistics */
1807 /* @fa_end_tsf = fa_start_tsf = TSF, keep */
1808 /* @fa_acc_1sec_tsf = 0 */
1809 phydm_false_alarm_counter_reset(dm);
1811 phydm_false_alarm_counter_acc(dm, rssi_dump_en);
1816 void phydm_false_alarm_counter_acc(void *dm_void, boolean rssi_dump_en)
1818 struct dm_struct *dm = (struct dm_struct *)dm_void;
1819 struct phydm_fa_struct *falm_cnt;
1820 struct phydm_fa_acc_struct *falm_cnt_acc;
1821 struct phydm_dig_struct *dig_t;
1823 falm_cnt = &dm->false_alm_cnt;
1824 falm_cnt_acc = &dm->false_alm_cnt_acc;
1825 dig_t = &dm->dm_dig_table;
1827 falm_cnt_acc->cnt_parity_fail += falm_cnt->cnt_parity_fail;
1828 falm_cnt_acc->cnt_rate_illegal += falm_cnt->cnt_rate_illegal;
1829 falm_cnt_acc->cnt_crc8_fail += falm_cnt->cnt_crc8_fail;
1830 falm_cnt_acc->cnt_mcs_fail += falm_cnt->cnt_mcs_fail;
1831 falm_cnt_acc->cnt_ofdm_fail += falm_cnt->cnt_ofdm_fail;
1832 falm_cnt_acc->cnt_cck_fail += falm_cnt->cnt_cck_fail;
1833 falm_cnt_acc->cnt_all += falm_cnt->cnt_all;
1834 falm_cnt_acc->cnt_fast_fsync += falm_cnt->cnt_fast_fsync;
1835 falm_cnt_acc->cnt_sb_search_fail += falm_cnt->cnt_sb_search_fail;
1836 falm_cnt_acc->cnt_ofdm_cca += falm_cnt->cnt_ofdm_cca;
1837 falm_cnt_acc->cnt_cck_cca += falm_cnt->cnt_cck_cca;
1838 falm_cnt_acc->cnt_cca_all += falm_cnt->cnt_cca_all;
1839 falm_cnt_acc->cnt_cck_crc32_error += falm_cnt->cnt_cck_crc32_error;
1840 falm_cnt_acc->cnt_cck_crc32_ok += falm_cnt->cnt_cck_crc32_ok;
1841 falm_cnt_acc->cnt_ofdm_crc32_error += falm_cnt->cnt_ofdm_crc32_error;
1842 falm_cnt_acc->cnt_ofdm_crc32_ok += falm_cnt->cnt_ofdm_crc32_ok;
1843 falm_cnt_acc->cnt_ht_crc32_error += falm_cnt->cnt_ht_crc32_error;
1844 falm_cnt_acc->cnt_ht_crc32_ok += falm_cnt->cnt_ht_crc32_ok;
1845 falm_cnt_acc->cnt_vht_crc32_error += falm_cnt->cnt_vht_crc32_error;
1846 falm_cnt_acc->cnt_vht_crc32_ok += falm_cnt->cnt_vht_crc32_ok;
1847 falm_cnt_acc->cnt_crc32_error_all += falm_cnt->cnt_crc32_error_all;
1848 falm_cnt_acc->cnt_crc32_ok_all += falm_cnt->cnt_crc32_ok_all;
1850 if (rssi_dump_en == 1) {
1851 falm_cnt_acc->cnt_all_1sec =
1852 falm_cnt_acc->cnt_all * dig_t->sec_factor;
1853 falm_cnt_acc->cnt_cca_all_1sec =
1854 falm_cnt_acc->cnt_cca_all * dig_t->sec_factor;
1855 falm_cnt_acc->cnt_cck_fail_1sec =
1856 falm_cnt_acc->cnt_cck_fail * dig_t->sec_factor;
1860 void phydm_false_alarm_counter_acc_reset(void *dm_void)
1862 struct dm_struct *dm = (struct dm_struct *)dm_void;
1863 struct phydm_fa_acc_struct *falm_cnt_acc = NULL;
1865 #ifdef IS_USE_NEW_TDMA
1866 struct phydm_fa_acc_struct *falm_cnt_acc_low = NULL;
1867 u32 tmp_cca_1sec = 0;
1868 u32 tmp_fa_1sec = 0;
1870 /*@clear L-fa_acc struct*/
1871 falm_cnt_acc_low = &dm->false_alm_cnt_acc_low;
1872 tmp_cca_1sec = falm_cnt_acc_low->cnt_cca_all_1sec;
1873 tmp_fa_1sec = falm_cnt_acc_low->cnt_all_1sec;
1874 odm_memory_set(dm, falm_cnt_acc_low, 0, sizeof(dm->false_alm_cnt_acc));
1875 falm_cnt_acc_low->cnt_cca_all_1sec = tmp_cca_1sec;
1876 falm_cnt_acc_low->cnt_all_1sec = tmp_fa_1sec;
1878 /*@clear H-fa_acc struct*/
1879 falm_cnt_acc = &dm->false_alm_cnt_acc;
1880 tmp_cca_1sec = falm_cnt_acc->cnt_cca_all_1sec;
1881 tmp_fa_1sec = falm_cnt_acc->cnt_all_1sec;
1882 odm_memory_set(dm, falm_cnt_acc, 0, sizeof(dm->false_alm_cnt_acc));
1883 falm_cnt_acc->cnt_cca_all_1sec = tmp_cca_1sec;
1884 falm_cnt_acc->cnt_all_1sec = tmp_fa_1sec;
1886 falm_cnt_acc = &dm->false_alm_cnt_acc;
1887 /* @Cnt_all_for_rssi_dump & Cnt_CCA_all_for_rssi_dump */
1888 /* @do NOT need to be reset */
1889 odm_memory_set(dm, falm_cnt_acc, 0, sizeof(falm_cnt_acc));
1893 void phydm_false_alarm_counter_reset(void *dm_void)
1895 struct dm_struct *dm = (struct dm_struct *)dm_void;
1896 struct phydm_fa_struct *falm_cnt;
1897 struct phydm_dig_struct *dig_t;
1900 falm_cnt = &dm->false_alm_cnt;
1901 dig_t = &dm->dm_dig_table;
1903 memset(falm_cnt, 0, sizeof(dm->false_alm_cnt));
1904 phydm_false_alarm_counter_reg_reset(dm);
1906 #ifdef IS_USE_NEW_TDMA
1909 if (dig_t->tdma_dig_state != 1)
1910 dig_t->fa_acc_1sec_timestamp = 0;
1912 dig_t->fa_acc_1sec_timestamp = dig_t->fa_acc_1sec_timestamp;
1915 timestamp = odm_get_bb_reg(dm, R_0x568, bMaskDWord);
1916 dig_t->fa_start_timestamp = timestamp;
1917 dig_t->fa_end_timestamp = timestamp;
1920 #ifdef IS_USE_NEW_TDMA
1921 void phydm_tdma_dig_timers(void *dm_void, u8 state)
1923 #if (RTL8198F_SUPPORT || RTL8822C_SUPPORT || RTL8814B_SUPPORT)
1924 struct dm_struct *dm = (struct dm_struct *)dm_void;
1925 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1927 if (dm->support_ic_type &
1928 (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8814B)) {
1929 if (state == INIT_TDMA_DIG_TIMMER)
1930 odm_initialize_timer(dm, &dm->tdma_dig_timer,
1931 (void *)phydm_tdma_dig_cbk,
1932 NULL, "phydm_tdma_dig_timer");
1933 else if (state == CANCEL_TDMA_DIG_TIMMER)
1934 odm_cancel_timer(dm, &dm->tdma_dig_timer);
1935 else if (state == RELEASE_TDMA_DIG_TIMMER)
1936 odm_release_timer(dm, &dm->tdma_dig_timer);
1941 u8 get_new_igi_bound(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *rx_gain_max,
1942 u8 *rx_gain_min, boolean is_dfs_band)
1944 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1947 boolean first_connect = false, first_dis_connect = false;
1949 first_connect = (dm->is_linked) && !dig_t->is_media_connect;
1950 first_dis_connect = (!dm->is_linked) && dig_t->is_media_connect;
1952 if (dm->is_linked) {
1953 if (dm->pre_rssi_min <= dm->rssi_min) {
1954 PHYDM_DBG(dm, DBG_DIG, "pre_rssi_min <= rssi_min\n");
1969 PHYDM_DBG(dm, DBG_DIG, "step = {-%d, +%d, +%d}\n", step[2], step[1],
1972 if (first_connect) {
1974 if (dm->rssi_min > DIG_MAX_DFS)
1978 PHYDM_DBG(dm, DBG_DIG, "DFS band:IgiMax=0x%x\n",
1984 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1985 #if (RTL8812A_SUPPORT)
1986 if (dm->support_ic_type == ODM_RTL8812)
1987 odm_config_bb_with_header_file(dm,
1988 CONFIG_BB_AGC_TAB_DIFF);
1991 PHYDM_DBG(dm, DBG_DIG, "First connect: foce IGI=0x%x\n", igi);
1992 } else if (dm->is_linked) {
1993 PHYDM_DBG(dm, DBG_DIG, "Adjust IGI @ linked\n");
1994 /* @4 Abnormal # beacon case */
1995 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1996 if (dm->phy_dbg_info.num_qry_beacon_pkt < 5 &&
1997 fa_cnt < DM_DIG_FA_TH1 && dm->bsta_state &&
1998 dm->support_ic_type != ODM_RTL8723D) {
1999 *rx_gain_min = 0x1c;
2001 PHYDM_DBG(dm, DBG_DIG, "Beacon_num=%d,force igi=0x%x\n",
2002 dm->phy_dbg_info.num_qry_beacon_pkt, igi);
2004 igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
2007 igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
2010 /* @2 Before link */
2011 PHYDM_DBG(dm, DBG_DIG, "Adjust IGI before link\n");
2013 if (first_dis_connect) {
2014 igi = dig_t->dm_dig_min;
2015 PHYDM_DBG(dm, DBG_DIG,
2016 "First disconnect:foce IGI to lower bound\n");
2018 PHYDM_DBG(dm, DBG_DIG, "Pre_IGI=((0x%x)), FA=((%d))\n",
2021 igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
2024 /*@Check IGI by dyn-upper/lower bound */
2025 if (igi < *rx_gain_min)
2028 if (igi > *rx_gain_max)
2031 PHYDM_DBG(dm, DBG_DIG, "fa_cnt = %d, IGI: 0x%x -> 0x%x\n",
2032 fa_cnt, cur_igi, igi);
2037 /*@callback function triggered by SW timer*/
2038 void phydm_tdma_dig_cbk(void *dm_void)
2040 #if (RTL8198F_SUPPORT || RTL8822C_SUPPORT || RTL8814B_SUPPORT)
2041 struct dm_struct *dm = (struct dm_struct *)dm_void;
2042 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2044 if (phydm_dig_abort(dm) || (dm->original_dig_restore))
2047 *PHYDM_DBG(dm, DBG_DIG, "timer callback =======> tdma_dig_state=%d\n");
2048 * dig_t->tdma_dig_state);
2049 *PHYDM_DBG(dm, DBG_DIG, "tdma_h_igi=0x%x, tdma_l_igi=0x%x\n",
2050 * dig_t->cur_ig_value_tdma,
2051 * dig_t->low_ig_value);
2053 phydm_tdma_fa_cnt_chk(dm);
2056 if (dm->tdma_dig_state_number < 2)
2057 dm->tdma_dig_state_number = 2;
2060 dig_t->tdma_dig_cnt++;
2061 dig_t->tdma_dig_state = dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;
2064 *PHYDM_DBG(dm, DBG_DIG, "enter state %d, dig count %d\n",
2065 * dig_t->tdma_dig_state, dig_t->tdma_dig_cnt);
2068 if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)
2069 odm_write_dig(dm, dig_t->low_ig_value);
2070 else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)
2071 odm_write_dig(dm, dig_t->cur_ig_value_tdma);
2073 odm_set_timer(dm, &dm->tdma_dig_timer, dm->tdma_dig_timer_ms);
2077 /*@============================================================*/
2078 /*@FASLE ALARM CHECK*/
2079 /*@============================================================*/
2080 void phydm_tdma_fa_cnt_chk(void *dm_void)
2082 struct dm_struct *dm = (struct dm_struct *)dm_void;
2083 struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
2084 struct phydm_fa_acc_struct *fa_t_acc, *fa_t_acc_low;
2085 struct phydm_dig_struct *dig_t = NULL;
2086 boolean rssi_dump_en = false;
2088 u8 states_per_block = 0;
2089 u8 cur_tdma_dig_state = 0;
2092 u32 tdma_dig_block_period_ms = 0;
2093 u32 tdma_dig_block_cnt_thd = 0;
2094 u32 timestamp_diff = 0;
2096 if (!(dm->support_ic_type &
2097 (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8814B))) {
2098 PHYDM_DBG(dm, DBG_DIG, "Not 98F/22C/14B\n");
2102 fa_t_acc = &dm->false_alm_cnt_acc;
2103 fa_t_acc_low = &dm->false_alm_cnt_acc_low;
2104 dig_t = &dm->dm_dig_table;
2105 states_per_block = dm->tdma_dig_state_number;
2107 /*@calculate duration of a tdma block*/
2108 tdma_dig_block_period_ms = dm->tdma_dig_timer_ms * states_per_block;
2111 *caution!ONE_SEC_MS must be divisible by tdma_dig_block_period_ms,
2112 *or FA will be fewer.
2114 tdma_dig_block_cnt_thd = ONE_SEC_MS / tdma_dig_block_period_ms;
2116 /*@tdma_dig_state == 0, collect H-state FA, else, collect L-state FA*/
2117 if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)
2118 cur_tdma_dig_state = TDMA_DIG_LOW_STATE;
2119 else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)
2120 cur_tdma_dig_state = TDMA_DIG_HIGH_STATE;
2122 *PHYDM_DBG(dm, DBG_DIG, "in state %d, dig count %d\n",
2123 * cur_tdma_dig_state, dig_t->tdma_dig_cnt);
2125 if (cur_tdma_dig_state == 0) {
2126 /*@L-state indicates next block*/
2127 dig_t->tdma_dig_block_cnt++;
2129 /*@1sec dump check*/
2130 if (dig_t->tdma_dig_block_cnt >= tdma_dig_block_cnt_thd)
2131 rssi_dump_en = true;
2134 *PHYDM_DBG(dm, DBG_DIG,"[L-state] tdma_dig_block_cnt=%d\n",
2135 * dig_t->tdma_dig_block_cnt);
2138 /*@collect FA till this block end*/
2139 phydm_false_alarm_counter_statistics(dm);
2140 phydm_fa_cnt_acc(dm, rssi_dump_en, cur_tdma_dig_state);
2141 /*@1s L-FA collect end*/
2143 /*@1sec dump reached*/
2146 phydm_noisy_detection(dm);
2147 #ifdef PHYDM_SUPPORT_CCKPD
2148 phydm_cck_pd_th(dm);
2150 PHYDM_DBG(dm, DBG_DIG, "run tdma L-state dig ====>\n");
2151 phydm_tdma_low_dig(dm);
2152 PHYDM_DBG(dm, DBG_DIG, "\n\n");
2154 } else if (cur_tdma_dig_state == 1) {
2155 /*@1sec dump check*/
2156 if (dig_t->tdma_dig_block_cnt >= tdma_dig_block_cnt_thd)
2157 rssi_dump_en = true;
2160 *PHYDM_DBG(dm, DBG_DIG,"[H-state] tdma_dig_block_cnt=%d\n",
2161 * dig_t->tdma_dig_block_cnt);
2164 /*@collect FA till this block end*/
2165 phydm_false_alarm_counter_statistics(dm);
2166 phydm_fa_cnt_acc(dm, rssi_dump_en, cur_tdma_dig_state);
2167 /*@1s H-FA collect end*/
2169 /*@1sec dump reached*/
2170 state_diff = dm->tdma_dig_state_number - dig_t->tdma_dig_state;
2171 if (rssi_dump_en && (state_diff == 1)) {
2173 phydm_noisy_detection(dm);
2174 #ifdef PHYDM_SUPPORT_CCKPD
2175 phydm_cck_pd_th(dm);
2177 PHYDM_DBG(dm, DBG_DIG, "run tdma H-state dig ====>\n");
2178 phydm_tdma_high_dig(dm);
2179 PHYDM_DBG(dm, DBG_DIG, "\n\n");
2180 PHYDM_DBG(dm, DBG_DIG, "1 sec reached, is_linked=%d\n",
2182 PHYDM_DBG(dm, DBG_DIG, "1 sec L-CCA=%d, L-FA=%d\n",
2183 fa_t_acc_low->cnt_cca_all_1sec,
2184 fa_t_acc_low->cnt_all_1sec);
2185 PHYDM_DBG(dm, DBG_DIG, "1 sec H-CCA=%d, H-FA=%d\n",
2186 fa_t_acc->cnt_cca_all_1sec,
2187 fa_t_acc->cnt_all_1sec);
2188 PHYDM_DBG(dm, DBG_DIG,
2189 "1 sec TOTAL-CCA=%d, TOTAL-FA=%d\n\n",
2190 fa_t_acc->cnt_cca_all +
2191 fa_t_acc_low->cnt_cca_all,
2192 fa_t_acc->cnt_all + fa_t_acc_low->cnt_all);
2194 /*@Reset AccFalseAlarmCounterStatistics */
2195 phydm_false_alarm_counter_acc_reset(dm);
2196 dig_t->tdma_dig_block_cnt = 0;
2199 /*@Reset FalseAlarmCounterStatistics */
2200 phydm_false_alarm_counter_reset(dm);
2203 void phydm_tdma_low_dig(void *dm_void)
2205 struct dm_struct *dm = (struct dm_struct *)dm_void;
2206 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2207 struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
2208 struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc_low;
2209 #ifdef CFG_DIG_DAMPING_CHK
2210 struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
2212 boolean first_connect, first_disconnect;
2213 u8 igi = dig_t->cur_ig_value;
2215 u8 tdma_l_igi = dig_t->low_ig_value;
2216 u8 tdma_l_dym_min = dig_t->tdma_rx_gain_min[TDMA_DIG_LOW_STATE];
2217 u8 tdma_l_dym_max = dig_t->tdma_rx_gain_max[TDMA_DIG_LOW_STATE];
2218 u32 fa_cnt = falm_cnt->cnt_all;
2219 boolean dfs_mode_en = false, is_performance = true;
2220 u8 rssi_min = dm->rssi_min;
2221 u8 igi_upper_rssi_min = 0;
2224 if (!(dm->original_dig_restore)) {
2225 if (tdma_l_igi == 0)
2228 fa_cnt = falm_cnt_acc->cnt_all_1sec;
2231 if (phydm_dig_abort(dm)) {
2232 dig_t->low_ig_value = phydm_get_igi(dm, BB_PATH_A);
2237 dfs_mode_en = false;
2238 is_performance = true;
2240 /* @Abs Boundary Decision*/
2241 dig_t->dm_dig_max = DIG_MAX_COVERAGR; //0x26
2242 dig_t->dm_dig_min = DIG_MIN_PERFORMANCE; //0x20
2243 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_COVERAGE; //0x22
2246 if (*dm->band_width == CHANNEL_WIDTH_20)
2247 dig_t->dm_dig_min = DIG_MIN_DFS + 2;
2249 dig_t->dm_dig_min = DIG_MIN_DFS;
2252 if (dm->support_ic_type &
2253 (ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))
2254 dig_t->dm_dig_min = 0x1c;
2255 else if (dm->support_ic_type & ODM_RTL8197F)
2256 dig_t->dm_dig_min = 0x1e; /*@For HW setting*/
2259 PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",
2260 dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);
2262 /* @Dyn Boundary by RSSI*/
2263 if (!dm->is_linked) {
2264 /*@if no link, always stay at lower bound*/
2265 tdma_l_dym_max = 0x26;
2266 tdma_l_dym_min = dig_t->dm_dig_min;
2268 PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",
2269 tdma_l_dym_max, tdma_l_dym_min);
2271 PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n",
2272 dm->rssi_min, offset);
2274 /* @DIG lower bound in L-state*/
2275 tdma_l_dym_min = dig_t->dm_dig_min;
2277 #ifdef CFG_DIG_DAMPING_CHK
2278 /*@Limit Dyn min by damping*/
2279 if (dig_t->dig_dl_en &&
2280 dig_rc->damping_limit_en &&
2281 tdma_l_dym_min < dig_rc->damping_limit_val) {
2282 PHYDM_DBG(dm, DBG_DIG,
2283 "[Limit by Damping] dyn_min=0x%x -> 0x%x\n",
2284 tdma_l_dym_min, dig_rc->damping_limit_val);
2286 tdma_l_dym_min = dig_rc->damping_limit_val;
2290 /*@DIG upper bound in L-state*/
2291 igi_upper_rssi_min = rssi_min + offset;
2292 if (igi_upper_rssi_min > dig_t->dm_dig_max)
2293 tdma_l_dym_max = dig_t->dm_dig_max;
2294 else if (igi_upper_rssi_min < dig_t->dm_dig_min)
2295 tdma_l_dym_max = dig_t->dm_dig_min;
2297 tdma_l_dym_max = igi_upper_rssi_min;
2299 /* @1 Force Lower Bound for AntDiv */
2301 *if (!dm->is_one_entry_only &&
2302 *(dm->support_ability & ODM_BB_ANT_DIV) &&
2303 *(dm->ant_div_type == CG_TRX_HW_ANTDIV ||
2304 *dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {
2305 *if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)
2306 * dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
2308 * dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;
2310 *PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",
2311 * dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);
2315 PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",
2316 tdma_l_dym_max, tdma_l_dym_min);
2319 /*@Abnormal Case Check*/
2320 /*@Abnormal lower bound case*/
2321 if (tdma_l_dym_min > tdma_l_dym_max)
2322 tdma_l_dym_min = tdma_l_dym_max;
2324 PHYDM_DBG(dm, DBG_DIG,
2325 "Abnoraml chk, force {Max, Min}={0x%x, 0x%x}\n",
2326 tdma_l_dym_max, tdma_l_dym_min);
2328 /*@False Alarm Threshold Decision*/
2329 phydm_fa_threshold_check(dm, dfs_mode_en);
2331 /*@Adjust Initial Gain by False Alarm*/
2332 /*Select new IGI by FA */
2333 if (!(dm->original_dig_restore)) {
2334 tdma_l_igi = get_new_igi_bound(dm, tdma_l_igi, fa_cnt,
2339 new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);
2343 if (!(dm->original_dig_restore)) {
2344 dig_t->low_ig_value = tdma_l_igi;
2345 dig_t->tdma_rx_gain_min[TDMA_DIG_LOW_STATE] = tdma_l_dym_min;
2346 dig_t->tdma_rx_gain_max[TDMA_DIG_LOW_STATE] = tdma_l_dym_max;
2348 /*odm_write_dig(dm, tdma_l_igi);*/
2351 odm_write_dig(dm, new_igi);
2354 dig_t->is_media_connect = dm->is_linked;
2357 void phydm_tdma_high_dig(void *dm_void)
2359 struct dm_struct *dm = (struct dm_struct *)dm_void;
2360 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2361 struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
2362 struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
2363 #ifdef CFG_DIG_DAMPING_CHK
2364 struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
2366 boolean first_connect, first_disconnect;
2367 u8 igi = dig_t->cur_ig_value;
2369 u8 tdma_h_igi = dig_t->cur_ig_value_tdma;
2370 u8 tdma_h_dym_min = dig_t->tdma_rx_gain_min[TDMA_DIG_HIGH_STATE];
2371 u8 tdma_h_dym_max = dig_t->tdma_rx_gain_max[TDMA_DIG_HIGH_STATE];
2372 u32 fa_cnt = falm_cnt->cnt_all;
2373 boolean dfs_mode_en = false, is_performance = true;
2374 u8 rssi_min = dm->rssi_min;
2375 u8 igi_upper_rssi_min = 0;
2378 if (!(dm->original_dig_restore)) {
2379 if (tdma_h_igi == 0)
2382 fa_cnt = falm_cnt_acc->cnt_all_1sec;
2385 if (phydm_dig_abort(dm)) {
2386 dig_t->cur_ig_value_tdma = phydm_get_igi(dm, BB_PATH_A);
2391 dfs_mode_en = false;
2392 is_performance = true;
2394 /*@Abs Boundary Decision*/
2395 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE; // 0x2a
2397 if (!dm->is_linked) {
2398 dig_t->dm_dig_max = DIG_MAX_COVERAGR;
2399 dig_t->dm_dig_min = DIG_MIN_PERFORMANCE; // 0x20
2400 } else if (dfs_mode_en) {
2401 if (*dm->band_width == CHANNEL_WIDTH_20)
2402 dig_t->dm_dig_min = DIG_MIN_DFS + 2;
2404 dig_t->dm_dig_min = DIG_MIN_DFS;
2406 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
2407 dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
2409 if (*dm->bb_op_mode == PHYDM_BALANCE_MODE) {
2410 /*service > 2 devices*/
2411 dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
2413 dig_t->dig_max_of_min = DIG_MIN_COVERAGE;
2415 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
2417 } else if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE) {
2418 /*service 1 devices*/
2419 dig_t->dm_dig_max = DIG_MAX_PERFORMANCE_MODE;
2420 dig_t->dig_max_of_min = DIG_MAX_OF_MIN_PERFORMANCE_MODE;
2423 if (dm->support_ic_type &
2424 (ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))
2425 dig_t->dm_dig_min = 0x1c;
2426 else if (dm->support_ic_type & ODM_RTL8197F)
2427 dig_t->dm_dig_min = 0x1e; /*@For HW setting*/
2429 dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;
2431 PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",
2432 dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);
2434 /*@Dyn Boundary by RSSI*/
2435 if (!dm->is_linked) {
2436 /*@if no link, always stay at lower bound*/
2437 tdma_h_dym_max = dig_t->dig_max_of_min;
2438 tdma_h_dym_min = dig_t->dm_dig_min;
2440 PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",
2441 tdma_h_dym_max, tdma_h_dym_min);
2443 PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n",
2444 dm->rssi_min, offset);
2446 /* @DIG lower bound in H-state*/
2447 if (rssi_min < dig_t->dm_dig_min)
2448 tdma_h_dym_min = dig_t->dm_dig_min;
2450 tdma_h_dym_min = rssi_min; // turbo not considered yet
2452 #ifdef CFG_DIG_DAMPING_CHK
2453 /*@Limit Dyn min by damping*/
2454 if (dig_t->dig_dl_en &&
2455 dig_rc->damping_limit_en &&
2456 tdma_h_dym_min < dig_rc->damping_limit_val) {
2457 PHYDM_DBG(dm, DBG_DIG,
2458 "[Limit by Damping] dyn_min=0x%x -> 0x%x\n",
2459 tdma_h_dym_min, dig_rc->damping_limit_val);
2461 tdma_h_dym_min = dig_rc->damping_limit_val;
2465 /*@DIG upper bound in H-state*/
2466 igi_upper_rssi_min = rssi_min + offset;
2467 if (igi_upper_rssi_min > dig_t->dm_dig_max)
2468 tdma_h_dym_max = dig_t->dm_dig_max;
2470 tdma_h_dym_max = igi_upper_rssi_min;
2472 /* @1 Force Lower Bound for AntDiv */
2474 *if (!dm->is_one_entry_only &&
2475 *(dm->support_ability & ODM_BB_ANT_DIV) &&
2476 *(dm->ant_div_type == CG_TRX_HW_ANTDIV ||
2477 *dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {
2478 * if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)
2479 * dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
2481 * dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;
2484 *PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",
2485 * dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);
2488 PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",
2489 tdma_h_dym_max, tdma_h_dym_min);
2492 /*@Abnormal Case Check*/
2493 /*@Abnormal low higher bound case*/
2494 if (tdma_h_dym_max < dig_t->dm_dig_min)
2495 tdma_h_dym_max = dig_t->dm_dig_min;
2496 /*@Abnormal lower bound case*/
2497 if (tdma_h_dym_min > tdma_h_dym_max)
2498 tdma_h_dym_min = tdma_h_dym_max;
2500 PHYDM_DBG(dm, DBG_DIG, "Abnoraml chk, force {Max, Min}={0x%x, 0x%x}\n",
2501 tdma_h_dym_max, tdma_h_dym_min);
2503 /*@False Alarm Threshold Decision*/
2504 phydm_fa_threshold_check(dm, dfs_mode_en);
2506 /*@Adjust Initial Gain by False Alarm*/
2507 /*Select new IGI by FA */
2508 if (!(dm->original_dig_restore)) {
2509 tdma_h_igi = get_new_igi_bound(dm, tdma_h_igi, fa_cnt,
2514 new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);
2518 if (!(dm->original_dig_restore)) {
2519 dig_t->cur_ig_value_tdma = tdma_h_igi;
2520 dig_t->tdma_rx_gain_min[TDMA_DIG_HIGH_STATE] = tdma_h_dym_min;
2521 dig_t->tdma_rx_gain_max[TDMA_DIG_HIGH_STATE] = tdma_h_dym_max;
2523 /*odm_write_dig(dm, tdma_h_igi);*/
2526 odm_write_dig(dm, new_igi);
2529 dig_t->is_media_connect = dm->is_linked;
2532 void phydm_fa_cnt_acc(void *dm_void, boolean rssi_dump_en,
2533 u8 cur_tdma_dig_state)
2535 struct dm_struct *dm = (struct dm_struct *)dm_void;
2536 struct phydm_fa_struct *falm_cnt = NULL;
2537 struct phydm_fa_acc_struct *falm_cnt_acc = NULL;
2538 struct phydm_dig_struct *dig_t = NULL;
2540 u8 factor_denum = 1;
2541 u8 total_state_number;
2543 dig_t = &dm->dm_dig_table;
2544 falm_cnt = &dm->false_alm_cnt;
2545 #ifdef IS_USE_NEW_TDMA
2546 if (cur_tdma_dig_state == TDMA_DIG_LOW_STATE)
2547 falm_cnt_acc = &dm->false_alm_cnt_acc_low;
2548 else if (cur_tdma_dig_state == TDMA_DIG_HIGH_STATE)
2550 falm_cnt_acc = &dm->false_alm_cnt_acc;
2552 *PHYDM_DBG(dm, DBG_DIG,
2553 * "[%s] ==> dig_state=%d, one_sec=%d\n", __func__,
2554 * cur_tdma_dig_state, rssi_dump_en);
2556 falm_cnt_acc->cnt_parity_fail += falm_cnt->cnt_parity_fail;
2557 falm_cnt_acc->cnt_rate_illegal += falm_cnt->cnt_rate_illegal;
2558 falm_cnt_acc->cnt_crc8_fail += falm_cnt->cnt_crc8_fail;
2559 falm_cnt_acc->cnt_mcs_fail += falm_cnt->cnt_mcs_fail;
2560 falm_cnt_acc->cnt_ofdm_fail += falm_cnt->cnt_ofdm_fail;
2561 falm_cnt_acc->cnt_cck_fail += falm_cnt->cnt_cck_fail;
2562 falm_cnt_acc->cnt_all += falm_cnt->cnt_all;
2563 falm_cnt_acc->cnt_fast_fsync += falm_cnt->cnt_fast_fsync;
2564 falm_cnt_acc->cnt_sb_search_fail += falm_cnt->cnt_sb_search_fail;
2565 falm_cnt_acc->cnt_ofdm_cca += falm_cnt->cnt_ofdm_cca;
2566 falm_cnt_acc->cnt_cck_cca += falm_cnt->cnt_cck_cca;
2567 falm_cnt_acc->cnt_cca_all += falm_cnt->cnt_cca_all;
2568 falm_cnt_acc->cnt_cck_crc32_error += falm_cnt->cnt_cck_crc32_error;
2569 falm_cnt_acc->cnt_cck_crc32_ok += falm_cnt->cnt_cck_crc32_ok;
2570 falm_cnt_acc->cnt_ofdm_crc32_error += falm_cnt->cnt_ofdm_crc32_error;
2571 falm_cnt_acc->cnt_ofdm_crc32_ok += falm_cnt->cnt_ofdm_crc32_ok;
2572 falm_cnt_acc->cnt_ht_crc32_error += falm_cnt->cnt_ht_crc32_error;
2573 falm_cnt_acc->cnt_ht_crc32_ok += falm_cnt->cnt_ht_crc32_ok;
2574 falm_cnt_acc->cnt_vht_crc32_error += falm_cnt->cnt_vht_crc32_error;
2575 falm_cnt_acc->cnt_vht_crc32_ok += falm_cnt->cnt_vht_crc32_ok;
2576 falm_cnt_acc->cnt_crc32_error_all += falm_cnt->cnt_crc32_error_all;
2577 falm_cnt_acc->cnt_crc32_ok_all += falm_cnt->cnt_crc32_ok_all;
2580 *PHYDM_DBG(dm, DBG_DIG,
2581 * "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
2582 * falm_cnt->cnt_cck_cca,
2583 * falm_cnt->cnt_ofdm_cca,
2584 * falm_cnt->cnt_cca_all);
2585 *PHYDM_DBG(dm, DBG_DIG,
2586 * "[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
2587 * falm_cnt->cnt_cck_fail,
2588 * falm_cnt->cnt_ofdm_fail,
2589 * falm_cnt->cnt_all);
2591 if (rssi_dump_en == 1) {
2592 total_state_number = dm->tdma_dig_state_number;
2594 if (cur_tdma_dig_state == TDMA_DIG_HIGH_STATE) {
2595 factor_num = total_state_number;
2596 factor_denum = total_state_number - 1;
2597 } else if (cur_tdma_dig_state == TDMA_DIG_LOW_STATE) {
2598 factor_num = total_state_number;
2602 falm_cnt_acc->cnt_all_1sec =
2603 falm_cnt_acc->cnt_all * factor_num / factor_denum;
2604 falm_cnt_acc->cnt_cca_all_1sec =
2605 falm_cnt_acc->cnt_cca_all * factor_num / factor_denum;
2606 falm_cnt_acc->cnt_cck_fail_1sec =
2607 falm_cnt_acc->cnt_cck_fail * factor_num / factor_denum;
2609 *PHYDM_DBG(dm, DBG_DIG,
2610 * "[ACC CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
2611 * falm_cnt_acc->cnt_cck_cca,
2612 * falm_cnt_acc->cnt_ofdm_cca,
2613 * falm_cnt_acc->cnt_cca_all);
2614 *PHYDM_DBG(dm, DBG_DIG,
2615 * "[ACC FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n\n",
2616 * falm_cnt_acc->cnt_cck_fail,
2617 * falm_cnt_acc->cnt_ofdm_fail,
2618 * falm_cnt_acc->cnt_all);
2622 #endif /*@#ifdef IS_USE_NEW_TDMA*/
2623 #endif /*@#ifdef PHYDM_TDMA_DIG_SUPPORT*/
2625 void phydm_dig_debug(void *dm_void, char input[][16], u32 *_used, char *output,
2628 struct dm_struct *dm = (struct dm_struct *)dm_void;
2629 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2631 char monitor[] = "-m";
2634 u32 out_len = *_out_len;
2637 if ((strcmp(input[1], help) == 0)) {
2638 PDM_SNPF(out_len, used, output + used, out_len - used,
2639 "{0} {en} fa_th[0] fa_th[1] fa_th[2]\n");
2640 PDM_SNPF(out_len, used, output + used, out_len - used,
2641 "{1} {Damping Limit en}\n");
2642 } else if ((strcmp(input[1], monitor) == 0)) {
2643 PDM_SNPF(out_len, used, output + used, out_len - used,
2644 "Read DIG fa_th[0:2]= {%d, %d, %d}\n", dig_t->fa_th[0],
2645 dig_t->fa_th[1], dig_t->fa_th[2]);
2648 PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
2650 for (i = 1; i < 10; i++)
2651 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);
2655 dig_t->is_dbg_fa_th = true;
2656 dig_t->fa_th[0] = (u16)var1[2];
2657 dig_t->fa_th[1] = (u16)var1[3];
2658 dig_t->fa_th[2] = (u16)var1[4];
2660 PDM_SNPF(out_len, used, output + used,
2662 "Set DIG fa_th[0:2]= {%d, %d, %d}\n",
2663 dig_t->fa_th[0], dig_t->fa_th[1],
2666 dig_t->is_dbg_fa_th = false;
2669 #ifdef CFG_DIG_DAMPING_CHK
2670 else if (var1[0] == 1) {
2671 dig_t->dig_dl_en = (u8)var1[1];
2677 *_out_len = out_len;
2680 #ifdef CONFIG_MCC_DM
2681 #if (RTL8822B_SUPPORT)
2682 void phydm_mcc_igi_clr(void *dm_void, u8 clr_port)
2684 struct dm_struct *dm = (struct dm_struct *)dm_void;
2685 struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2686 mcc_dm->mcc_rssi[clr_port] = 0xff;
2687 mcc_dm->mcc_dm_val[0][clr_port] = 0xff; /* 0xc50 clr */
2688 mcc_dm->mcc_dm_val[1][clr_port] = 0xff; /* 0xe50 clr */
2691 void phydm_mcc_igi_chk(void *dm_void)
2693 struct dm_struct *dm = (struct dm_struct *)dm_void;
2694 struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2696 if (mcc_dm->mcc_dm_val[0][0] == 0xff &&
2697 mcc_dm->mcc_dm_val[0][1] == 0xff) {
2698 mcc_dm->mcc_dm_reg[0] = 0xffff;
2699 mcc_dm->mcc_reg_id[0] = 0xff;
2701 if (mcc_dm->mcc_dm_val[1][0] == 0xff &&
2702 mcc_dm->mcc_dm_val[1][1] == 0xff) {
2703 mcc_dm->mcc_dm_reg[1] = 0xffff;
2704 mcc_dm->mcc_reg_id[1] = 0xff;
2708 void phydm_mcc_igi_cal(void *dm_void)
2710 struct dm_struct *dm = (struct dm_struct *)dm_void;
2711 struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2712 struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2714 u8 igi_val0, igi_val1;
2715 if (mcc_dm->mcc_rssi[0] == 0xff)
2716 phydm_mcc_igi_clr(dm, 0);
2717 if (mcc_dm->mcc_rssi[1] == 0xff)
2718 phydm_mcc_igi_clr(dm, 1);
2719 phydm_mcc_igi_chk(dm);
2720 igi_val0 = mcc_dm->mcc_rssi[0] - shift;
2721 igi_val1 = mcc_dm->mcc_rssi[1] - shift;
2722 phydm_fill_mcccmd(dm, 0, 0xc50, igi_val0, igi_val1);
2723 phydm_fill_mcccmd(dm, 1, 0xe50, igi_val0, igi_val1);
2724 PHYDM_DBG(dm, DBG_COMP_MCC, "RSSI_min: %d %d, MCC_igi: %d %d\n",
2725 mcc_dm->mcc_rssi[0], mcc_dm->mcc_rssi[1],
2726 mcc_dm->mcc_dm_val[0][0], mcc_dm->mcc_dm_val[0][1]);
2728 #endif /*#if (RTL8822B_SUPPORT)*/
2729 #endif /*#ifdef CONFIG_MCC_DM*/