Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_dig.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13* The full GNU General Public License is included in this distribution in the14* file called LICENSE.15*16* Contact Information:17* wlanfae <[email protected]>18* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,19* Hsinchu 300, Taiwan.20*21* Larry Finger <[email protected]>22*23*****************************************************************************/2425/*@************************************************************26* include files27* ************************************************************28*/29#include "mp_precomp.h"30#include "phydm_precomp.h"3132#ifdef CFG_DIG_DAMPING_CHK33void phydm_dig_recorder_reset(void *dm_void)34{35struct dm_struct *dm = (struct dm_struct *)dm_void;36struct phydm_dig_struct *dig_t = &dm->dm_dig_table;37struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;3839PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);4041odm_memory_set(dm, &dig_rc->igi_bitmap, 0,42sizeof(struct phydm_dig_recorder_strcut));43}4445void phydm_dig_recorder(void *dm_void, u8 igi_curr,46u32 fa_cnt)47{48struct dm_struct *dm = (struct dm_struct *)dm_void;49struct phydm_dig_struct *dig_t = &dm->dm_dig_table;50struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;51u8 igi_pre = dig_rc->igi_history[0];52u8 igi_up = 0;5354if (!dm->is_linked)55return;5657PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);5859if (dm->first_connect) {60phydm_dig_recorder_reset(dm);61dig_rc->igi_history[0] = igi_curr;62dig_rc->fa_history[0] = fa_cnt;63return;64}6566if (igi_curr % 2)67igi_curr--;6869igi_pre = dig_rc->igi_history[0];70igi_up = (igi_curr > igi_pre) ? 1 : 0;71dig_rc->igi_bitmap = ((dig_rc->igi_bitmap << 1) & 0xfe) | igi_up;7273dig_rc->igi_history[3] = dig_rc->igi_history[2];74dig_rc->igi_history[2] = dig_rc->igi_history[1];75dig_rc->igi_history[1] = dig_rc->igi_history[0];76dig_rc->igi_history[0] = igi_curr;7778dig_rc->fa_history[3] = dig_rc->fa_history[2];79dig_rc->fa_history[2] = dig_rc->fa_history[1];80dig_rc->fa_history[1] = dig_rc->fa_history[0];81dig_rc->fa_history[0] = fa_cnt;8283PHYDM_DBG(dm, DBG_DIG, "igi_history[3:0] = {0x%x, 0x%x, 0x%x, 0x%x}\n",84dig_rc->igi_history[3], dig_rc->igi_history[2],85dig_rc->igi_history[1], dig_rc->igi_history[0]);86PHYDM_DBG(dm, DBG_DIG, "fa_history[3:0] = {%d, %d, %d, %d}\n",87dig_rc->fa_history[3], dig_rc->fa_history[2],88dig_rc->fa_history[1], dig_rc->fa_history[0]);89PHYDM_DBG(dm, DBG_DIG, "igi_bitmap = {%d, %d, %d, %d} = 0x%x\n",90(u8)((dig_rc->igi_bitmap & BIT(3)) >> 3),91(u8)((dig_rc->igi_bitmap & BIT(2)) >> 2),92(u8)((dig_rc->igi_bitmap & BIT(1)) >> 1),93(u8)(dig_rc->igi_bitmap & BIT(0)),94dig_rc->igi_bitmap);95}9697void phydm_dig_damping_chk(void *dm_void)98{99struct dm_struct *dm = (struct dm_struct *)dm_void;100struct phydm_dig_struct *dig_t = &dm->dm_dig_table;101struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;102u8 igi_bitmap_4bit = dig_rc->igi_bitmap & 0xf;103u8 diff1 = 0, diff2 = 0;104u32 fa_low_th = dig_t->fa_th[0];105u32 fa_high_th = dig_t->fa_th[1];106u32 fa_high_th2 = dig_t->fa_th[2];107u8 fa_pattern_match = 0;108u32 time_tmp = 0;109110if (!dm->is_linked)111return;112113PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);114115/*@== Release Damping ================================================*/116if (dig_rc->damping_limit_en) {117PHYDM_DBG(dm, DBG_DIG,118"[Damping Limit!] limit_time=%d, phydm_sys_up_time=%d\n",119dig_rc->limit_time, dm->phydm_sys_up_time);120121time_tmp = dig_rc->limit_time + DIG_LIMIT_PERIOD;122123if (DIFF_2(dm->rssi_min, dig_rc->limit_rssi) > 3 ||124time_tmp < dm->phydm_sys_up_time) {125dig_rc->damping_limit_en = 0;126PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, limit_rssi=%d\n",127dm->rssi_min, dig_rc->limit_rssi);128}129return;130}131132/*@== Damping Pattern Check===========================================*/133PHYDM_DBG(dm, DBG_DIG, "fa_th{H, L}= {%d,%d}\n", fa_high_th, fa_low_th);134135switch (igi_bitmap_4bit) {136case 0x5:137/*@ 4b'0101138* IGI:[3]down(0x24)->[2]up(0x26)->[1]down(0x24)->[0]up(0x26)->[new](Lock @ 0x26)139* FA: [3] >high1 ->[2] <low ->[1] >high1 ->[0] <low ->[new] <low140*141* IGI:[3]down(0x24)->[2]up(0x28)->[1]down(0x24)->[0]up(0x28)->[new](Lock @ 0x28)142* FA: [3] >high2 ->[2] <low ->[1] >high2 ->[0] <low ->[new] <low143*/144if (dig_rc->igi_history[0] > dig_rc->igi_history[1])145diff1 = dig_rc->igi_history[0] - dig_rc->igi_history[1];146147if (dig_rc->igi_history[2] > dig_rc->igi_history[3])148diff2 = dig_rc->igi_history[2] - dig_rc->igi_history[3];149150if (dig_rc->fa_history[0] < fa_low_th &&151dig_rc->fa_history[1] > fa_high_th &&152dig_rc->fa_history[2] < fa_low_th &&153dig_rc->fa_history[3] > fa_high_th) {154/*@Check each fa element*/155fa_pattern_match = 1;156}157break;158case 0x9:159/*@ 4b'1001160* IGI:[3]up(0x28)->[2]down(0x26)->[1]down(0x24)->[0]up(0x28)->[new](Lock @ 0x28)161* FA: [3] <low ->[2] <low ->[1] >high2 ->[0] <low ->[new] <low162*/163if (dig_rc->igi_history[0] > dig_rc->igi_history[1])164diff1 = dig_rc->igi_history[0] - dig_rc->igi_history[1];165166if (dig_rc->igi_history[2] < dig_rc->igi_history[3])167diff2 = dig_rc->igi_history[3] - dig_rc->igi_history[2];168169if (dig_rc->fa_history[0] < fa_low_th &&170dig_rc->fa_history[1] > fa_high_th2 &&171dig_rc->fa_history[2] < fa_low_th &&172dig_rc->fa_history[3] < fa_low_th) {173/*@Check each fa element*/174fa_pattern_match = 1;175}176break;177default:178break;179}180181if (diff1 >= 2 && diff2 >= 2 && fa_pattern_match) {182dig_rc->damping_limit_en = 1;183dig_rc->damping_limit_val = dig_rc->igi_history[0];184dig_rc->limit_time = dm->phydm_sys_up_time;185dig_rc->limit_rssi = dm->rssi_min;186187PHYDM_DBG(dm, DBG_DIG,188"[Start damping_limit!] IGI_dyn_min=0x%x, limit_time=%d, limit_rssi=%d\n",189dig_rc->damping_limit_val,190dig_rc->limit_time, dig_rc->limit_rssi);191}192193PHYDM_DBG(dm, DBG_DIG, "damping_limit=%d\n", dig_rc->damping_limit_en);194}195#endif196197boolean198phydm_dig_go_up_check(void *dm_void)199{200struct dm_struct *dm = (struct dm_struct *)dm_void;201struct ccx_info *ccx_info = &dm->dm_ccx_info;202struct phydm_dig_struct *dig_t = &dm->dm_dig_table;203u8 cur_ig_value = dig_t->cur_ig_value;204u8 max_cover_bond = 0;205u8 rx_gain_range_max = dig_t->rx_gain_range_max;206u8 i = 0, j = 0;207u8 total_nhm_cnt = ccx_info->nhm_rpt_sum;208u32 dig_cnt = 0;209u32 over_dig_cnt = 0;210boolean ret = true;211212if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE)213return ret;214215max_cover_bond = DIG_MAX_BALANCE_MODE - dig_t->upcheck_init_val;216217if (cur_ig_value < max_cover_bond - 6)218dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_0;219else if (cur_ig_value <= DIG_MAX_BALANCE_MODE)220dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_1;221else /* @cur_ig_value > DM_DIG_MAX_AP, foolproof */222dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_2;223224PHYDM_DBG(dm, DBG_DIG, "check_lv = %d, max_cover_bond = 0x%x\n",225dig_t->go_up_chk_lv, max_cover_bond);226227if (total_nhm_cnt == 0)228return true;229230if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_0) {231for (i = 3; i <= 11; i++)232dig_cnt += ccx_info->nhm_result[i];233234if ((dig_t->lv0_ratio_reciprocal * dig_cnt) >= total_nhm_cnt)235ret = true;236else237ret = false;238239} else if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_1) {240/* search index */241for (i = 0; i <= 10; i++) {242if ((max_cover_bond * 2) == ccx_info->nhm_th[i]) {243for (j = (i + 1); j <= 11; j++)244over_dig_cnt += ccx_info->nhm_result[j];245break;246}247}248249if (dig_t->lv1_ratio_reciprocal * over_dig_cnt < total_nhm_cnt)250ret = true;251else252ret = false;253254if (!ret) {255/* update dig_t->rx_gain_range_max */256if (rx_gain_range_max + 6 >= max_cover_bond)257dig_t->rx_gain_range_max = max_cover_bond - 6;258else259dig_t->rx_gain_range_max = rx_gain_range_max;260261PHYDM_DBG(dm, DBG_DIG,262"Noise pwr over DIG can filter, lock rx_gain_range_max to 0x%x\n",263dig_t->rx_gain_range_max);264}265} else if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_2) {266/* @cur_ig_value > DM_DIG_MAX_AP, foolproof */267ret = true;268}269270return ret;271}272273void phydm_fa_threshold_check(void *dm_void, boolean is_dfs_band)274{275struct dm_struct *dm = (struct dm_struct *)dm_void;276struct phydm_dig_struct *dig_t = &dm->dm_dig_table;277278if (dig_t->is_dbg_fa_th) {279PHYDM_DBG(dm, DBG_DIG, "Manual Fix FA_th\n");280} else if (dm->is_linked) {281if (dm->rssi_min < 20) { /*@[PHYDM-252]*/282dig_t->fa_th[0] = 500;283dig_t->fa_th[1] = 750;284dig_t->fa_th[2] = 1000;285} else if (((dm->rx_tp >> 2) > dm->tx_tp) && /*Test RX TP*/286(dm->rx_tp < 10) && (dm->rx_tp > 1)) { /*TP=1~10Mb*/287dig_t->fa_th[0] = 125;288dig_t->fa_th[1] = 250;289dig_t->fa_th[2] = 500;290} else {291dig_t->fa_th[0] = 250;292dig_t->fa_th[1] = 500;293dig_t->fa_th[2] = 750;294}295} else {296if (is_dfs_band) { /* @For DFS band and no link */297298dig_t->fa_th[0] = 250;299dig_t->fa_th[1] = 1000;300dig_t->fa_th[2] = 2000;301} else {302dig_t->fa_th[0] = 2000;303dig_t->fa_th[1] = 4000;304dig_t->fa_th[2] = 5000;305}306}307308PHYDM_DBG(dm, DBG_DIG, "FA_th={%d,%d,%d}\n", dig_t->fa_th[0],309dig_t->fa_th[1], dig_t->fa_th[2]);310}311312void phydm_set_big_jump_step(void *dm_void, u8 curr_igi)313{314#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)315struct dm_struct *dm = (struct dm_struct *)dm_void;316struct phydm_dig_struct *dig_t = &dm->dm_dig_table;317u8 step1[8] = {24, 30, 40, 50, 60, 70, 80, 90};318u8 big_jump_lmt = dig_t->big_jump_lmt[dig_t->agc_table_idx];319u8 i;320321if (dig_t->enable_adjust_big_jump == 0)322return;323324for (i = 0; i <= dig_t->big_jump_step1; i++) {325if ((curr_igi + step1[i]) > big_jump_lmt) {326if (i != 0)327i = i - 1;328break;329} else if (i == dig_t->big_jump_step1) {330break;331}332}333if (dm->support_ic_type & ODM_RTL8822B)334odm_set_bb_reg(dm, R_0x8c8, 0xe, i);335else if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))336odm_set_bb_reg(dm, ODM_REG_BB_AGC_SET_2_11N, 0xe, i);337338PHYDM_DBG(dm, DBG_DIG, "Bigjump = %d (ori = 0x%x), LMT=0x%x\n", i,339dig_t->big_jump_step1, big_jump_lmt);340#endif341}342343#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT344void phydm_write_dig_reg_jgr3(void *dm_void, u8 igi)345{346struct dm_struct *dm = (struct dm_struct *)dm_void;347struct phydm_dig_struct *dig_t = &dm->dm_dig_table;348349PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);350351/* Set IGI value */352if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))353return;354355odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_11AC, igi);356357#if (defined(PHYDM_COMPILE_ABOVE_2SS))358if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS)359odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_B_11AC3, igi);360#endif361362#if (defined(PHYDM_COMPILE_ABOVE_4SS))363if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {364odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_C_11AC3, igi);365odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_D_11AC3, igi);366}367#endif368}369370u8 phydm_get_igi_reg_val_jgr3(void *dm_void, enum bb_path path)371{372struct dm_struct *dm = (struct dm_struct *)dm_void;373u32 val = 0;374375PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);376377/* Set IGI value */378if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))379return (u8)val;380381if (path == BB_PATH_A)382val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_11AC);383#if (defined(PHYDM_COMPILE_ABOVE_2SS))384else if (path == BB_PATH_B)385val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_B_11AC3);386#endif387388#if (defined(PHYDM_COMPILE_ABOVE_3SS))389else if (path == BB_PATH_C)390val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_C_11AC3);391#endif392393#if (defined(PHYDM_COMPILE_ABOVE_4SS))394else if (path == BB_PATH_D)395val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_D_11AC3);396#endif397return (u8)val;398}399400void phydm_fa_cnt_statistics_jgr3(void *dm_void)401{402struct dm_struct *dm = (struct dm_struct *)dm_void;403struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;404u32 ret_value = 0;405u32 cck_enable = 0;406u16 ofdm_tx_counter = 0;407u16 cck_tx_counter = 0;408409if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))410return;411412ofdm_tx_counter = (u16)odm_get_bb_reg(dm, R_0x2de0, MASKLWORD);413cck_tx_counter = (u16)odm_get_bb_reg(dm, R_0x2de4, MASKLWORD);414415ret_value = odm_get_bb_reg(dm, R_0x2d20, MASKDWORD);416fa_t->cnt_fast_fsync = ret_value & 0xffff;417fa_t->cnt_sb_search_fail = (ret_value & 0xffff0000) >> 16;418419ret_value = odm_get_bb_reg(dm, R_0x2d04, MASKDWORD);420fa_t->cnt_parity_fail = (ret_value & 0xffff0000) >> 16;421422ret_value = odm_get_bb_reg(dm, R_0x2d08, MASKDWORD);423fa_t->cnt_rate_illegal = ret_value & 0xffff;424fa_t->cnt_crc8_fail = (ret_value & 0xffff0000) >> 16;425426ret_value = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);427fa_t->cnt_mcs_fail = ret_value & 0xffff;428429/* read CCK CRC32 counter */430ret_value = odm_get_bb_reg(dm, R_0x2c04, MASKDWORD);431fa_t->cnt_cck_crc32_ok = ret_value & 0xffff;432fa_t->cnt_cck_crc32_error = (ret_value & 0xffff0000) >> 16;433434/* read OFDM CRC32 counter */435ret_value = odm_get_bb_reg(dm, R_0x2c14, MASKDWORD);436fa_t->cnt_ofdm_crc32_ok = ret_value & 0xffff;437fa_t->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;438439/* read HT CRC32 counter */440ret_value = odm_get_bb_reg(dm, R_0x2c10, MASKDWORD);441fa_t->cnt_ht_crc32_ok = ret_value & 0xffff;442fa_t->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;443444/* @for VHT part */445if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8812F |446ODM_RTL8814B)) {447/* @read VHT CRC32 counter */448ret_value = odm_get_bb_reg(dm, R_0x2c0c, MASKDWORD);449fa_t->cnt_vht_crc32_ok = ret_value & 0xffff;450fa_t->cnt_vht_crc32_error = (ret_value & 0xffff0000) >> 16;451452ret_value = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);453fa_t->cnt_mcs_fail_vht = (ret_value & 0xffff0000) >> 16;454455ret_value = odm_get_bb_reg(dm, R_0x2d0c, MASKDWORD);456fa_t->cnt_crc8_fail_vhta = ret_value & 0xffff;457fa_t->cnt_crc8_fail_vhtb = (ret_value & 0xffff0000) >> 16;458} else {459fa_t->cnt_vht_crc32_error = 0;460fa_t->cnt_vht_crc32_ok = 0;461fa_t->cnt_mcs_fail_vht = 0;462fa_t->cnt_crc8_fail_vhta = 0;463fa_t->cnt_crc8_fail_vhtb = 0;464}465466/* @calculate OFDM FA counter instead of reading brk_cnt*/467fa_t->cnt_ofdm_fail = fa_t->cnt_parity_fail + fa_t->cnt_rate_illegal +468fa_t->cnt_crc8_fail + fa_t->cnt_mcs_fail +469fa_t->cnt_fast_fsync + fa_t->cnt_sb_search_fail +470fa_t->cnt_mcs_fail_vht + fa_t->cnt_crc8_fail_vhta;471472/* Read CCK FA counter */473fa_t->cnt_cck_fail = odm_get_bb_reg(dm, R_0x1a5c, MASKLWORD);474475/* read CCK/OFDM CCA counter */476ret_value = odm_get_bb_reg(dm, R_0x2c08, MASKDWORD);477fa_t->cnt_ofdm_cca = ((ret_value & 0xffff0000) >> 16);478fa_t->cnt_cck_cca = ret_value & 0xffff;479480/* @CCK RxIQ weighting = 1 => 0x1a14[9:8]=0x0 */481cck_enable = odm_get_bb_reg(dm, R_0x1a14, 0x300);482if (cck_enable == 0x0) { /* @if(*dm->band_type == ODM_BAND_2_4G) */483fa_t->cnt_all = fa_t->cnt_ofdm_fail + fa_t->cnt_cck_fail;484fa_t->cnt_cca_all = fa_t->cnt_cck_cca + fa_t->cnt_ofdm_cca;485PHYDM_DBG(dm, DBG_FA_CNT, "ac3 OFDM FA = %d, CCK FA = %d\n",486fa_t->cnt_ofdm_fail, fa_t->cnt_cck_fail);487} else {488fa_t->cnt_all = fa_t->cnt_ofdm_fail;489fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca;490PHYDM_DBG(dm, DBG_FA_CNT, "ac3 CCK disable OFDM FA = %d\n",491fa_t->cnt_ofdm_fail);492}493494PHYDM_DBG(dm, DBG_FA_CNT,495"ac3 [OFDM FA Detail] Parity_fail=((%d)), Rate_Illegal=((%d)), CRC8_fail=((%d)), Mcs_fail=((%d)), Fast_Fsync=((%d)), SBD_fail=((%d))\n",496fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,497fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail, fa_t->cnt_fast_fsync,498fa_t->cnt_sb_search_fail);499}500501#endif502503void phydm_write_dig_reg_c50(void *dm_void, u8 igi)504{505struct dm_struct *dm = (struct dm_struct *)dm_void;506507PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);508509odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm), igi);510511#if (defined(PHYDM_COMPILE_ABOVE_2SS))512if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS)513odm_set_bb_reg(dm, ODM_REG(IGI_B, dm), ODM_BIT(IGI, dm), igi);514#endif515516#if (defined(PHYDM_COMPILE_ABOVE_4SS))517if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {518odm_set_bb_reg(dm, ODM_REG(IGI_C, dm), ODM_BIT(IGI, dm), igi);519odm_set_bb_reg(dm, ODM_REG(IGI_D, dm), ODM_BIT(IGI, dm), igi);520}521#endif522}523524void phydm_write_dig_reg(void *dm_void, u8 igi)525{526struct dm_struct *dm = (struct dm_struct *)dm_void;527struct phydm_dig_struct *dig_t = &dm->dm_dig_table;528u8 rf_gain = 0;529530PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);531532#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT533if (dm->support_ic_type & ODM_IC_JGR3_SERIES)534phydm_write_dig_reg_jgr3(dm, igi);535else536#endif537phydm_write_dig_reg_c50(dm, igi);538539#if (RTL8721D_SUPPORT)540if (dm->invalid_mode) {541if (igi <= 0x10)542rf_gain = 0xfa;543else if (igi <= 0x40)544rf_gain = 0xe3 + 0x20 - (igi >> 1);545else if (igi <= 0x50)546rf_gain = 0xcb - (igi >> 1);547else if (igi <= 0x5e)548rf_gain = 0x92 - (igi >> 1);549else if (igi <= 0x64)550rf_gain = 0x74 - (igi >> 1);551else552rf_gain = (0x3d > (igi >> 1)) ? (0x3d - (igi >> 1)) : 0;553odm_set_bb_reg(dm, R_0x850, 0x1fe0, rf_gain);554}555#endif556557dig_t->cur_ig_value = igi;558}559560void odm_write_dig(void *dm_void, u8 new_igi)561{562struct dm_struct *dm = (struct dm_struct *)dm_void;563struct phydm_dig_struct *dig_t = &dm->dm_dig_table;564struct phydm_adaptivity_struct *adaptivity = &dm->adaptivity;565566PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);567568/* @1 Check IGI by upper bound */569if (adaptivity->igi_lmt_en &&570new_igi > adaptivity->adapt_igi_up && dm->is_linked) {571new_igi = adaptivity->adapt_igi_up;572573PHYDM_DBG(dm, DBG_DIG, "Force Adaptivity Up-bound=((0x%x))\n",574new_igi);575}576577#if (RTL8192F_SUPPORT)578if ((dm->support_ic_type & ODM_RTL8192F) &&579dm->cut_version == ODM_CUT_A &&580new_igi > 0x38) {581new_igi = 0x38;582PHYDM_DBG(dm, DBG_DIG,583"Force 92F Adaptivity Up-bound=((0x%x))\n", new_igi);584}585#endif586587if (dig_t->cur_ig_value != new_igi) {588#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)589/* @Modify big jump step for 8822B and 8197F */590if (dm->support_ic_type &591(ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F))592phydm_set_big_jump_step(dm, new_igi);593#endif594595#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)596/* Set IGI value of CCK for new CCK AGC */597if (dm->cck_new_agc &&598(dm->support_ic_type & PHYSTS_2ND_TYPE_IC))599odm_set_bb_reg(dm, R_0xa0c, 0x3f00, (new_igi >> 1));600#endif601602/*@Add by YuChen for USB IO too slow issue*/603if (!(dm->support_ic_type & ODM_IC_PWDB_EDCCA)) {604if (*dm->edcca_mode == PHYDM_EDCCA_ADAPT_MODE &&605new_igi < dig_t->cur_ig_value) {606dig_t->cur_ig_value = new_igi;607phydm_adaptivity(dm);608}609} else {610if (*dm->edcca_mode == PHYDM_EDCCA_ADAPT_MODE &&611new_igi > dig_t->cur_ig_value) {612dig_t->cur_ig_value = new_igi;613phydm_adaptivity(dm);614}615}616phydm_write_dig_reg(dm, new_igi);617}618619PHYDM_DBG(dm, DBG_DIG, "New_igi=((0x%x))\n\n", new_igi);620}621622u8 phydm_get_igi_reg_val(void *dm_void, enum bb_path path)623{624struct dm_struct *dm = (struct dm_struct *)dm_void;625u32 val = 0;626u32 bit_map = ODM_BIT(IGI, dm);627628switch (path) {629case BB_PATH_A:630val = odm_get_bb_reg(dm, ODM_REG(IGI_A, dm), bit_map);631break;632#if (defined(PHYDM_COMPILE_ABOVE_2SS))633case BB_PATH_B:634val = odm_get_bb_reg(dm, ODM_REG(IGI_B, dm), bit_map);635break;636#endif637638#if (defined(PHYDM_COMPILE_ABOVE_3SS))639case BB_PATH_C:640val = odm_get_bb_reg(dm, ODM_REG(IGI_C, dm), bit_map);641break;642#endif643644#if (defined(PHYDM_COMPILE_ABOVE_4SS))645case BB_PATH_D:646val = odm_get_bb_reg(dm, ODM_REG(IGI_D, dm), bit_map);647break;648#endif649650default:651break;652}653654return (u8)val;655}656657u8 phydm_get_igi(void *dm_void, enum bb_path path)658{659struct dm_struct *dm = (struct dm_struct *)dm_void;660u8 val = 0;661662#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT663if (dm->support_ic_type & ODM_IC_JGR3_SERIES)664val = phydm_get_igi_reg_val_jgr3(dm, path);665else666#endif667val = phydm_get_igi_reg_val(dm, path);668669return val;670}671672void phydm_set_dig_val(void *dm_void, u32 *val_buf, u8 val_len)673{674struct dm_struct *dm = (struct dm_struct *)dm_void;675676if (val_len != 1) {677PHYDM_DBG(dm, ODM_COMP_API, "[Error][DIG]Need val_len=1\n");678return;679}680681odm_write_dig(dm, (u8)(*val_buf));682}683684void odm_pause_dig(void *dm_void, enum phydm_pause_type type,685enum phydm_pause_level lv, u8 igi_input)686{687struct dm_struct *dm = (struct dm_struct *)dm_void;688u8 rpt = false;689u32 igi = (u32)igi_input;690691PHYDM_DBG(dm, DBG_DIG, "[%s]type=%d, LV=%d, igi=0x%x\n", __func__, type,692lv, igi);693694switch (type) {695case PHYDM_PAUSE:696case PHYDM_PAUSE_NO_SET: {697rpt = phydm_pause_func(dm, F00_DIG, PHYDM_PAUSE, lv, 1, &igi);698break;699}700701case PHYDM_RESUME: {702rpt = phydm_pause_func(dm, F00_DIG, PHYDM_RESUME, lv, 1, &igi);703break;704}705default:706PHYDM_DBG(dm, DBG_DIG, "Wrong type\n");707break;708}709710PHYDM_DBG(dm, DBG_DIG, "DIG pause_result=%d\n", rpt);711}712713boolean714phydm_dig_abort(void *dm_void)715{716struct dm_struct *dm = (struct dm_struct *)dm_void;717#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)718void *adapter = dm->adapter;719#endif720721/* support_ability */722if ((!(dm->support_ability & ODM_BB_FA_CNT)) ||723(!(dm->support_ability & ODM_BB_DIG))) {724PHYDM_DBG(dm, DBG_DIG, "[DIG] Not Support\n");725return true;726}727728if (dm->pause_ability & ODM_BB_DIG) {729PHYDM_DBG(dm, DBG_DIG, "Return: Pause DIG in LV=%d\n",730dm->pause_lv_table.lv_dig);731return true;732}733734if (*dm->is_scan_in_process) {735PHYDM_DBG(dm, DBG_DIG, "Return: Scan in process\n");736return true;737}738739#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)740#if OS_WIN_FROM_WIN7(OS_VERSION)741if (IsAPModeExist(adapter) && ((PADAPTER)(adapter))->bInHctTest) {742PHYDM_DBG(dm, DBG_DIG, " Return: Is AP mode or In HCT Test\n");743return true;744}745#endif746#endif747748return false;749}750751void phydm_dig_init(void *dm_void)752{753struct dm_struct *dm = (struct dm_struct *)dm_void;754struct phydm_dig_struct *dig_t = &dm->dm_dig_table;755#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))756struct phydm_fa_struct *false_alm_cnt = &dm->false_alm_cnt;757#endif758u32 ret_value = 0;759u8 i;760761dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;762dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;763dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;764765dig_t->cur_ig_value = phydm_get_igi(dm, BB_PATH_A);766767dig_t->fa_th[0] = 250;768dig_t->fa_th[1] = 500;769dig_t->fa_th[2] = 750;770dig_t->is_dbg_fa_th = false;771#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))772/* @For RTL8881A */773false_alm_cnt->cnt_ofdm_fail_pre = 0;774#endif775776dig_t->rx_gain_range_max = DIG_MAX_BALANCE_MODE;777dig_t->rx_gain_range_min = dig_t->cur_ig_value;778779#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)780dig_t->enable_adjust_big_jump = 1;781if (dm->support_ic_type & ODM_RTL8822B)782ret_value = odm_get_bb_reg(dm, R_0x8c8, MASKLWORD);783else if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))784ret_value = odm_get_bb_reg(dm, R_0xc74, MASKLWORD);785786dig_t->big_jump_step1 = (u8)(ret_value & 0xe) >> 1;787dig_t->big_jump_step2 = (u8)(ret_value & 0x30) >> 4;788dig_t->big_jump_step3 = (u8)(ret_value & 0xc0) >> 6;789790if (dm->support_ic_type &791(ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F)) {792for (i = 0; i < sizeof(dig_t->big_jump_lmt); i++) {793if (dig_t->big_jump_lmt[i] == 0)794dig_t->big_jump_lmt[i] = 0x64;795/* Set -10dBm as default value */796}797}798#endif799800#ifdef PHYDM_TDMA_DIG_SUPPORT801#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))802dm->original_dig_restore = true;803dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES;804dm->tdma_dig_timer_ms = DIG_TIMER_MS;805#endif806#endif807#ifdef CFG_DIG_DAMPING_CHK808phydm_dig_recorder_reset(dm);809dig_t->dig_dl_en = 1;810#endif811}812void phydm_dig_abs_boundary_decision(struct dm_struct *dm, boolean is_dfs_band)813{814struct phydm_dig_struct *dig_t = &dm->dm_dig_table;815struct phydm_adaptivity_struct *adapt = &dm->adaptivity;816817if (!dm->is_linked) {818dig_t->dm_dig_max = DIG_MAX_COVERAGR;819dig_t->dm_dig_min = DIG_MIN_COVERAGE;820} else if (is_dfs_band) {821if (*dm->band_width == CHANNEL_WIDTH_20)822dig_t->dm_dig_min = DIG_MIN_DFS + 2;823else824dig_t->dm_dig_min = DIG_MIN_DFS;825826dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;827dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;828} else {829if (*dm->bb_op_mode == PHYDM_BALANCE_MODE) {830/*service > 2 devices*/831dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;832#if (DIG_HW == 1)833dig_t->dig_max_of_min = DIG_MIN_COVERAGE;834#else835dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;836#endif837} else if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE) {838/*service 1 devices*/839if (*dm->edcca_mode == PHYDM_EDCCA_ADAPT_MODE &&840dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))841/*dig_max shouldn't be too high because of adaptivity*/842dig_t->dm_dig_max =843MIN_2((adapt->th_l2h + 40),844DIG_MAX_PERFORMANCE_MODE);845else846dig_t->dm_dig_max = DIG_MAX_PERFORMANCE_MODE;847848dig_t->dig_max_of_min = DIG_MAX_OF_MIN_PERFORMANCE_MODE;849}850851if (dm->support_ic_type &852(ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))853dig_t->dm_dig_min = 0x1c;854else if (dm->support_ic_type & ODM_RTL8197F)855dig_t->dm_dig_min = 0x1e; /*@For HW setting*/856else857dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;858}859860PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",861dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);862}863864void phydm_dig_dym_boundary_decision(struct dm_struct *dm)865{866struct phydm_dig_struct *dig_t = &dm->dm_dig_table;867#ifdef CFG_DIG_DAMPING_CHK868struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;869#endif870u8 offset = 15, tmp_max = 0;871u8 max_of_rssi_min = 0;872873PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);874875if (!dm->is_linked) {876/*@if no link, always stay at lower bound*/877dig_t->rx_gain_range_max = dig_t->dig_max_of_min;878dig_t->rx_gain_range_min = dig_t->dm_dig_min;879880PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",881dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);882return;883}884885PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n", dm->rssi_min, offset);886887/* @DIG lower bound */888if (dm->rssi_min > dig_t->dig_max_of_min)889dig_t->rx_gain_range_min = dig_t->dig_max_of_min;890else if (dm->rssi_min < dig_t->dm_dig_min)891dig_t->rx_gain_range_min = dig_t->dm_dig_min;892else893dig_t->rx_gain_range_min = dm->rssi_min;894895#ifdef CFG_DIG_DAMPING_CHK896/*@Limit Dyn min by damping*/897if (dig_t->dig_dl_en &&898dig_rc->damping_limit_en &&899dig_t->rx_gain_range_min < dig_rc->damping_limit_val) {900PHYDM_DBG(dm, DBG_DIG,901"[Limit by Damping] Dig_dyn_min=0x%x -> 0x%x\n",902dig_t->rx_gain_range_min, dig_rc->damping_limit_val);903904dig_t->rx_gain_range_min = dig_rc->damping_limit_val;905}906#endif907908/* @DIG upper bound */909tmp_max = dig_t->rx_gain_range_min + offset;910if (dig_t->rx_gain_range_min != dm->rssi_min) {911max_of_rssi_min = dm->rssi_min + offset;912if (tmp_max > max_of_rssi_min)913tmp_max = max_of_rssi_min;914}915916if (tmp_max > dig_t->dm_dig_max)917dig_t->rx_gain_range_max = dig_t->dm_dig_max;918else if (tmp_max < dig_t->dm_dig_min)919dig_t->rx_gain_range_max = dig_t->dm_dig_min;920else921dig_t->rx_gain_range_max = tmp_max;922923#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY924/* @1 Force Lower Bound for AntDiv */925if (!dm->is_one_entry_only &&926(dm->support_ability & ODM_BB_ANT_DIV) &&927(dm->ant_div_type == CG_TRX_HW_ANTDIV ||928dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {929if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)930dig_t->rx_gain_range_min = dig_t->dig_max_of_min;931else932dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;933934PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",935dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);936}937#endif938939PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",940dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);941}942943void phydm_dig_abnormal_case(struct dm_struct *dm)944{945struct phydm_dig_struct *dig_t = &dm->dm_dig_table;946947/* @Abnormal lower bound case */948if (dig_t->rx_gain_range_min > dig_t->rx_gain_range_max)949dig_t->rx_gain_range_min = dig_t->rx_gain_range_max;950951PHYDM_DBG(dm, DBG_DIG, "Abnoraml checked {Max, Min}={0x%x, 0x%x}\n",952dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);953}954955u8 phydm_new_igi_by_fa(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *step_size)956{957boolean dig_go_up_check = true;958struct phydm_dig_struct *dig_t = &dm->dm_dig_table;959960#if 0961/*@dig_go_up_check = phydm_dig_go_up_check(dm);*/962#endif963964if (fa_cnt > dig_t->fa_th[2] && dig_go_up_check)965igi = igi + step_size[0];966else if ((fa_cnt > dig_t->fa_th[1]) && dig_go_up_check)967igi = igi + step_size[1];968else if (fa_cnt < dig_t->fa_th[0])969igi = igi - step_size[2];970971return igi;972}973974u8 phydm_get_new_igi(struct dm_struct *dm, u8 igi, u32 fa_cnt,975boolean is_dfs_band)976{977struct phydm_dig_struct *dig_t = &dm->dm_dig_table;978u8 step[3] = {0};979980if (dm->is_linked) {981if (dm->pre_rssi_min <= dm->rssi_min) {982PHYDM_DBG(dm, DBG_DIG, "pre_rssi_min <= rssi_min\n");983step[0] = 2;984step[1] = 1;985step[2] = 2;986} else {987step[0] = 4;988step[1] = 2;989step[2] = 2;990}991} else {992step[0] = 2;993step[1] = 1;994step[2] = 2;995}996997PHYDM_DBG(dm, DBG_DIG, "step = {-%d, +%d, +%d}\n", step[2], step[1],998step[0]);9991000if (dm->first_connect) {1001if (is_dfs_band) {1002if (dm->rssi_min > DIG_MAX_DFS)1003igi = DIG_MAX_DFS;1004else1005igi = dm->rssi_min;1006PHYDM_DBG(dm, DBG_DIG, "DFS band:IgiMax=0x%x\n",1007dig_t->rx_gain_range_max);1008} else {1009igi = dig_t->rx_gain_range_min;1010}10111012#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1013#if (RTL8812A_SUPPORT)1014if (dm->support_ic_type == ODM_RTL8812)1015odm_config_bb_with_header_file(dm,1016CONFIG_BB_AGC_TAB_DIFF);1017#endif1018#endif1019PHYDM_DBG(dm, DBG_DIG, "First connect: foce IGI=0x%x\n", igi);1020} else if (dm->is_linked) {1021PHYDM_DBG(dm, DBG_DIG, "Adjust IGI @ linked\n");1022/* @4 Abnormal # beacon case */1023#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1024if (dm->phy_dbg_info.num_qry_beacon_pkt < 5 &&1025fa_cnt < DM_DIG_FA_TH1 && dm->bsta_state &&1026dm->support_ic_type != ODM_RTL8723D) {1027dig_t->rx_gain_range_min = 0x1c;1028igi = dig_t->rx_gain_range_min;1029PHYDM_DBG(dm, DBG_DIG, "Beacon_num=%d,force igi=0x%x\n",1030dm->phy_dbg_info.num_qry_beacon_pkt, igi);1031} else {1032igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);1033}1034#else1035igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);1036#endif1037} else {1038/* @2 Before link */1039PHYDM_DBG(dm, DBG_DIG, "Adjust IGI before link\n");10401041if (dm->first_disconnect) {1042igi = dig_t->dm_dig_min;1043PHYDM_DBG(dm, DBG_DIG,1044"First disconnect:foce IGI to lower bound\n");1045} else {1046PHYDM_DBG(dm, DBG_DIG, "Pre_IGI=((0x%x)), FA=((%d))\n",1047igi, fa_cnt);10481049igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);1050}1051}10521053/*@Check IGI by dyn-upper/lower bound */1054if (igi < dig_t->rx_gain_range_min)1055igi = dig_t->rx_gain_range_min;10561057if (igi > dig_t->rx_gain_range_max)1058igi = dig_t->rx_gain_range_max;10591060PHYDM_DBG(dm, DBG_DIG, "fa_cnt = %d, IGI: 0x%x -> 0x%x\n",1061fa_cnt, dig_t->cur_ig_value, igi);10621063return igi;1064}10651066boolean phydm_dig_dfs_mode_en(void *dm_void)1067{1068struct dm_struct *dm = (struct dm_struct *)dm_void;1069boolean dfs_mode_en = false;10701071/* @Modify lower bound for DFS band */1072if (dm->is_dfs_band) {1073#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))1074dfs_mode_en = true;1075#else1076if (phydm_dfs_master_enabled(dm))1077dfs_mode_en = true;1078#endif1079PHYDM_DBG(dm, DBG_DIG, "In DFS band\n");1080}1081return dfs_mode_en;1082}10831084void phydm_dig(void *dm_void)1085{1086struct dm_struct *dm = (struct dm_struct *)dm_void;1087struct phydm_dig_struct *dig_t = &dm->dm_dig_table;1088struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;1089#ifdef PHYDM_TDMA_DIG_SUPPORT1090struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;1091#endif1092u8 igi = dig_t->cur_ig_value;1093u8 new_igi = 0x20;1094u32 fa_cnt = falm_cnt->cnt_all;1095boolean dfs_mode_en = false;10961097#ifdef PHYDM_TDMA_DIG_SUPPORT1098if (!(dm->original_dig_restore)) {1099if (dig_t->cur_ig_value_tdma == 0)1100dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;11011102igi = dig_t->cur_ig_value_tdma;1103fa_cnt = falm_cnt_acc->cnt_all_1sec;1104}1105#endif11061107if (phydm_dig_abort(dm)) {1108dig_t->cur_ig_value = phydm_get_igi(dm, BB_PATH_A);1109return;1110}11111112PHYDM_DBG(dm, DBG_DIG, "%s Start===>\n", __func__);1113PHYDM_DBG(dm, DBG_DIG,1114"is_linked=%d, RSSI=%d, 1stConnect=%d, 1stDisconnect=%d\n",1115dm->is_linked, dm->rssi_min,1116dm->first_connect, dm->first_disconnect);11171118PHYDM_DBG(dm, DBG_DIG, "DIG ((%s)) mode\n",1119(*dm->bb_op_mode ? "Balance" : "Performance"));11201121/*@DFS mode enable check*/1122dfs_mode_en = phydm_dig_dfs_mode_en(dm);11231124#ifdef CFG_DIG_DAMPING_CHK1125/*Record IGI History*/1126phydm_dig_recorder(dm, igi, fa_cnt);11271128/*@DIG Damping Check*/1129phydm_dig_damping_chk(dm);1130#endif11311132/*@Absolute Boundary Decision */1133phydm_dig_abs_boundary_decision(dm, dfs_mode_en);11341135/*@Dynamic Boundary Decision*/1136phydm_dig_dym_boundary_decision(dm);11371138/*@Abnormal case check*/1139phydm_dig_abnormal_case(dm);11401141/*@FA threshold decision */1142phydm_fa_threshold_check(dm, dfs_mode_en);11431144/*Select new IGI by FA */1145new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);11461147/* @1 Update status */1148#ifdef PHYDM_TDMA_DIG_SUPPORT1149if (!(dm->original_dig_restore)) {1150dig_t->cur_ig_value_tdma = new_igi;1151/*@It is possible fa_acc_1sec_tsf >= */1152/*@1sec while tdma_dig_state == 0*/1153if (dig_t->tdma_dig_state != 0)1154odm_write_dig(dm, dig_t->cur_ig_value_tdma);1155} else1156#endif1157odm_write_dig(dm, new_igi);1158}11591160void phydm_dig_lps_32k(void *dm_void)1161{1162struct dm_struct *dm = (struct dm_struct *)dm_void;1163u8 current_igi = dm->rssi_min;11641165odm_write_dig(dm, current_igi);1166}11671168void phydm_dig_by_rssi_lps(void *dm_void)1169{1170#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_IOT))1171struct dm_struct *dm = (struct dm_struct *)dm_void;1172struct phydm_fa_struct *falm_cnt;11731174u8 rssi_lower = DIG_MIN_LPS; /* @0x1E or 0x1C */1175u8 current_igi = dm->rssi_min;11761177falm_cnt = &dm->false_alm_cnt;1178if (phydm_dig_abort(dm))1179return;11801181current_igi = current_igi + RSSI_OFFSET_DIG_LPS;1182PHYDM_DBG(dm, DBG_DIG, "%s==>\n", __func__);11831184/* Using FW PS mode to make IGI */1185/* @Adjust by FA in LPS MODE */1186if (falm_cnt->cnt_all > DM_DIG_FA_TH2_LPS)1187current_igi = current_igi + 4;1188else if (falm_cnt->cnt_all > DM_DIG_FA_TH1_LPS)1189current_igi = current_igi + 2;1190else if (falm_cnt->cnt_all < DM_DIG_FA_TH0_LPS)1191current_igi = current_igi - 2;11921193/* @Lower bound checking */11941195/* RSSI Lower bound check */1196if ((dm->rssi_min - 10) > DIG_MIN_LPS)1197rssi_lower = (dm->rssi_min - 10);1198else1199rssi_lower = DIG_MIN_LPS;12001201/* Upper and Lower Bound checking */1202if (current_igi > DIG_MAX_LPS)1203current_igi = DIG_MAX_LPS;1204else if (current_igi < rssi_lower)1205current_igi = rssi_lower;12061207PHYDM_DBG(dm, DBG_DIG, "fa_cnt_all=%d, rssi_min=%d, curr_igi=0x%x\n",1208falm_cnt->cnt_all, dm->rssi_min, current_igi);1209odm_write_dig(dm, current_igi);1210#endif1211}12121213/* @3============================================================1214* 3 FASLE ALARM CHECK1215* 3============================================================1216*/1217void phydm_false_alarm_counter_reg_reset(void *dm_void)1218{1219struct dm_struct *dm = (struct dm_struct *)dm_void;1220struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;1221#ifdef PHYDM_TDMA_DIG_SUPPORT1222struct phydm_dig_struct *dig_t = &dm->dm_dig_table;1223struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;1224#endif1225u32 false_alm_cnt = 0;12261227#ifdef PHYDM_TDMA_DIG_SUPPORT1228if (!(dm->original_dig_restore)) {1229if (dig_t->cur_ig_value_tdma == 0)1230dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;12311232false_alm_cnt = falm_cnt_acc->cnt_all_1sec;1233} else1234#endif1235{1236false_alm_cnt = falm_cnt->cnt_all;1237}12381239#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1240if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1241/* @reset CCK FA counter */1242odm_set_bb_reg(dm, R_0x1a2c, BIT(15) | BIT(14), 0);1243odm_set_bb_reg(dm, R_0x1a2c, BIT(15) | BIT(14), 2);12441245/* @reset CCK CCA counter */1246odm_set_bb_reg(dm, R_0x1a2c, BIT(13) | BIT(12), 0);1247odm_set_bb_reg(dm, R_0x1a2c, BIT(13) | BIT(12), 2);12481249/* @Disable common rx clk gating => WLANBB-1106*/1250odm_set_bb_reg(dm, R_0x1d2c, BIT(31), 0);1251/* @reset OFDM CCA counter, OFDM FA counter*/1252phydm_reset_bb_hw_cnt(dm);1253/* @Enable common rx clk gating => WLANBB-1106*/1254odm_set_bb_reg(dm, R_0x1d2c, BIT(31), 1);1255}1256#endif1257#if (ODM_IC_11N_SERIES_SUPPORT)1258if (dm->support_ic_type & ODM_IC_11N_SERIES) {1259/* @reset false alarm counter registers*/1260odm_set_bb_reg(dm, R_0xc0c, BIT(31), 1);1261odm_set_bb_reg(dm, R_0xc0c, BIT(31), 0);1262odm_set_bb_reg(dm, R_0xd00, BIT(27), 1);1263odm_set_bb_reg(dm, R_0xd00, BIT(27), 0);12641265/* @update ofdm counter*/1266/* @update page C counter*/1267odm_set_bb_reg(dm, R_0xc00, BIT(31), 0);1268/* @update page D counter*/1269odm_set_bb_reg(dm, R_0xd00, BIT(31), 0);12701271/* @reset CCK CCA counter*/1272odm_set_bb_reg(dm, R_0xa2c, BIT(13) | BIT(12), 0);1273odm_set_bb_reg(dm, R_0xa2c, BIT(13) | BIT(12), 2);12741275/* @reset CCK FA counter*/1276odm_set_bb_reg(dm, R_0xa2c, BIT(15) | BIT(14), 0);1277odm_set_bb_reg(dm, R_0xa2c, BIT(15) | BIT(14), 2);12781279/* @reset CRC32 counter*/1280odm_set_bb_reg(dm, R_0xf14, BIT(16), 1);1281odm_set_bb_reg(dm, R_0xf14, BIT(16), 0);1282}1283#endif /* @#if (ODM_IC_11N_SERIES_SUPPORT) */12841285#if (ODM_IC_11AC_SERIES_SUPPORT)1286if (dm->support_ic_type & ODM_IC_11AC_SERIES) {1287#if (RTL8881A_SUPPORT)1288/* @Reset FA counter by enable/disable OFDM */1289if ((dm->support_ic_type == ODM_RTL8881A) &&1290false_alm_cnt->cnt_ofdm_fail_pre >= 0x7fff) {1291/* reset OFDM */1292odm_set_bb_reg(dm, R_0x808, BIT(29), 0);1293odm_set_bb_reg(dm, R_0x808, BIT(29), 1);1294false_alm_cnt->cnt_ofdm_fail_pre = 0;1295PHYDM_DBG(dm, DBG_FA_CNT, "Reset FA_cnt\n");1296}1297#endif /* @#if (RTL8881A_SUPPORT) */12981299/* @reset OFDM FA countner */1300odm_set_bb_reg(dm, R_0x9a4, BIT(17), 1);1301odm_set_bb_reg(dm, R_0x9a4, BIT(17), 0);13021303/* @reset CCK FA counter */1304odm_set_bb_reg(dm, R_0xa2c, BIT(15), 0);1305odm_set_bb_reg(dm, R_0xa2c, BIT(15), 1);13061307/* @reset CCA counter */1308phydm_reset_bb_hw_cnt(dm);1309}1310#endif /* @#if (ODM_IC_11AC_SERIES_SUPPORT) */1311}13121313void phydm_false_alarm_counter_reg_hold(void *dm_void)1314{1315struct dm_struct *dm = (struct dm_struct *)dm_void;13161317if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1318/* @hold cck counter */1319odm_set_bb_reg(dm, R_0x1a2c, BIT(12), 1);1320odm_set_bb_reg(dm, R_0x1a2c, BIT(14), 1);1321} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {1322/*@hold ofdm counter*/1323/*@hold page C counter*/1324odm_set_bb_reg(dm, R_0xc00, BIT(31), 1);1325/*@hold page D counter*/1326odm_set_bb_reg(dm, R_0xd00, BIT(31), 1);13271328/*@hold cck counter*/1329odm_set_bb_reg(dm, R_0xa2c, BIT(12), 1);1330odm_set_bb_reg(dm, R_0xa2c, BIT(14), 1);1331}1332}13331334#if (ODM_IC_11N_SERIES_SUPPORT)1335void phydm_fa_cnt_statistics_n(void *dm_void)1336{1337struct dm_struct *dm = (struct dm_struct *)dm_void;1338struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;1339u32 reg = 0;13401341if (!(dm->support_ic_type & ODM_IC_11N_SERIES))1342return;13431344/* @hold ofdm & cck counter */1345phydm_false_alarm_counter_reg_hold(dm);13461347reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE1_11N, MASKDWORD);1348fa_t->cnt_fast_fsync = (reg & 0xffff);1349fa_t->cnt_sb_search_fail = ((reg & 0xffff0000) >> 16);13501351reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE2_11N, MASKDWORD);1352fa_t->cnt_ofdm_cca = (reg & 0xffff);1353fa_t->cnt_parity_fail = ((reg & 0xffff0000) >> 16);13541355reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE3_11N, MASKDWORD);1356fa_t->cnt_rate_illegal = (reg & 0xffff);1357fa_t->cnt_crc8_fail = ((reg & 0xffff0000) >> 16);13581359reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE4_11N, MASKDWORD);1360fa_t->cnt_mcs_fail = (reg & 0xffff);13611362fa_t->cnt_ofdm_fail =1363fa_t->cnt_parity_fail + fa_t->cnt_rate_illegal +1364fa_t->cnt_crc8_fail + fa_t->cnt_mcs_fail +1365fa_t->cnt_fast_fsync + fa_t->cnt_sb_search_fail;13661367/* read CCK CRC32 counter */1368fa_t->cnt_cck_crc32_error = odm_get_bb_reg(dm, R_0xf84, MASKDWORD);1369fa_t->cnt_cck_crc32_ok = odm_get_bb_reg(dm, R_0xf88, MASKDWORD);13701371/* read OFDM CRC32 counter */1372reg = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11N, MASKDWORD);1373fa_t->cnt_ofdm_crc32_error = (reg & 0xffff0000) >> 16;1374fa_t->cnt_ofdm_crc32_ok = reg & 0xffff;13751376/* read HT CRC32 counter */1377reg = odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11N, MASKDWORD);1378fa_t->cnt_ht_crc32_error = (reg & 0xffff0000) >> 16;1379fa_t->cnt_ht_crc32_ok = reg & 0xffff;13801381/* read VHT CRC32 counter */1382fa_t->cnt_vht_crc32_error = 0;1383fa_t->cnt_vht_crc32_ok = 0;13841385#if (RTL8723D_SUPPORT)1386if (dm->support_ic_type == ODM_RTL8723D) {1387/* read HT CRC32 agg counter */1388reg = odm_get_bb_reg(dm, R_0xfb8, MASKDWORD);1389fa_t->cnt_ht_crc32_error_agg = (reg & 0xffff0000) >> 16;1390fa_t->cnt_ht_crc32_ok_agg = reg & 0xffff;1391}1392#endif13931394#if (RTL8188E_SUPPORT)1395if (dm->support_ic_type == ODM_RTL8188E) {1396reg = odm_get_bb_reg(dm, ODM_REG_SC_CNT_11N, MASKDWORD);1397fa_t->cnt_bw_lsc = (reg & 0xffff);1398fa_t->cnt_bw_usc = ((reg & 0xffff0000) >> 16);1399}1400#endif14011402reg = odm_get_bb_reg(dm, ODM_REG_CCK_FA_LSB_11N, MASKBYTE0);1403fa_t->cnt_cck_fail = reg;14041405reg = odm_get_bb_reg(dm, ODM_REG_CCK_FA_MSB_11N, MASKBYTE3);1406fa_t->cnt_cck_fail += (reg & 0xff) << 8;14071408reg = odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11N, MASKDWORD);1409fa_t->cnt_cck_cca = ((reg & 0xFF) << 8) | ((reg & 0xFF00) >> 8);14101411fa_t->cnt_all_pre = fa_t->cnt_all;14121413fa_t->cnt_all = fa_t->cnt_fast_fsync +1414fa_t->cnt_sb_search_fail +1415fa_t->cnt_parity_fail +1416fa_t->cnt_rate_illegal +1417fa_t->cnt_crc8_fail +1418fa_t->cnt_mcs_fail +1419fa_t->cnt_cck_fail;14201421fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca + fa_t->cnt_cck_cca;14221423PHYDM_DBG(dm, DBG_FA_CNT,1424"[OFDM FA Detail] Parity_Fail=((%d)), Rate_Illegal=((%d)), CRC8_fail=((%d)), Mcs_fail=((%d)), Fast_Fsync=(( %d )), SBD_fail=((%d))\n",1425fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,1426fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail, fa_t->cnt_fast_fsync,1427fa_t->cnt_sb_search_fail);1428}1429#endif14301431#if (ODM_IC_11AC_SERIES_SUPPORT)1432void phydm_fa_cnt_statistics_ac(void *dm_void)1433{1434struct dm_struct *dm = (struct dm_struct *)dm_void;1435struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;1436u32 ret_value = 0;1437u32 cck_enable = 0;14381439if (!(dm->support_ic_type & ODM_IC_11AC_SERIES))1440return;14411442ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE1_11AC, MASKDWORD);1443fa_t->cnt_fast_fsync = (ret_value & 0xffff0000) >> 16;14441445ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE2_11AC, MASKDWORD);1446fa_t->cnt_sb_search_fail = ret_value & 0xffff;14471448ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE3_11AC, MASKDWORD);1449fa_t->cnt_parity_fail = ret_value & 0xffff;1450fa_t->cnt_rate_illegal = (ret_value & 0xffff0000) >> 16;14511452ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE4_11AC, MASKDWORD);1453fa_t->cnt_crc8_fail = ret_value & 0xffff;1454fa_t->cnt_mcs_fail = (ret_value & 0xffff0000) >> 16;14551456ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE5_11AC, MASKDWORD);1457fa_t->cnt_crc8_fail_vhta = ret_value & 0xffff;1458fa_t->cnt_crc8_fail_vhtb = ret_value & 0xffff0000 >> 16;14591460ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE6_11AC, MASKDWORD);1461fa_t->cnt_mcs_fail_vht = ret_value & 0xffff;14621463/* read OFDM FA counter */1464fa_t->cnt_ofdm_fail = odm_get_bb_reg(dm, R_0xf48, MASKLWORD);14651466/* Read CCK FA counter */1467fa_t->cnt_cck_fail = odm_get_bb_reg(dm, ODM_REG_CCK_FA_11AC, MASKLWORD);14681469/* read CCK/OFDM CCA counter */1470ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11AC, MASKDWORD);1471fa_t->cnt_ofdm_cca = (ret_value & 0xffff0000) >> 16;1472fa_t->cnt_cck_cca = ret_value & 0xffff;14731474/* read CCK CRC32 counter */1475ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CRC32_CNT_11AC, MASKDWORD);1476fa_t->cnt_cck_crc32_error = (ret_value & 0xffff0000) >> 16;1477fa_t->cnt_cck_crc32_ok = ret_value & 0xffff;14781479/* read OFDM CRC32 counter */1480ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11AC, MASKDWORD);1481fa_t->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;1482fa_t->cnt_ofdm_crc32_ok = ret_value & 0xffff;14831484/* read HT CRC32 counter */1485ret_value = odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11AC, MASKDWORD);1486fa_t->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;1487fa_t->cnt_ht_crc32_ok = ret_value & 0xffff;14881489/* read VHT CRC32 counter */1490ret_value = odm_get_bb_reg(dm, ODM_REG_VHT_CRC32_CNT_11AC, MASKDWORD);1491fa_t->cnt_vht_crc32_error = (ret_value & 0xffff0000) >> 16;1492fa_t->cnt_vht_crc32_ok = ret_value & 0xffff;14931494#if (RTL8881A_SUPPORT)1495if (dm->support_ic_type == ODM_RTL8881A) {1496u32 tmp = 0;14971498if (fa_t->cnt_ofdm_fail >= fa_t->cnt_ofdm_fail_pre) {1499tmp = fa_t->cnt_ofdm_fail_pre;1500fa_t->cnt_ofdm_fail_pre = fa_t->cnt_ofdm_fail;1501fa_t->cnt_ofdm_fail = fa_t->cnt_ofdm_fail - tmp;1502} else {1503fa_t->cnt_ofdm_fail_pre = fa_t->cnt_ofdm_fail;1504}15051506PHYDM_DBG(dm, DBG_FA_CNT,1507"[8881]cnt_ofdm_fail{curr,pre}={%d,%d}\n",1508fa_t->cnt_ofdm_fail_pre, tmp);1509}1510#endif15111512cck_enable = odm_get_bb_reg(dm, ODM_REG_BB_RX_PATH_11AC, BIT(28));15131514if (cck_enable) { /* @if(*dm->band_type == ODM_BAND_2_4G) */1515fa_t->cnt_all = fa_t->cnt_ofdm_fail + fa_t->cnt_cck_fail;1516fa_t->cnt_cca_all = fa_t->cnt_cck_cca + fa_t->cnt_ofdm_cca;1517} else {1518fa_t->cnt_all = fa_t->cnt_ofdm_fail;1519fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca;1520}1521}1522#endif15231524void phydm_get_dbg_port_info(void *dm_void)1525{1526struct dm_struct *dm = (struct dm_struct *)dm_void;1527struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;1528u32 dbg_port = dm->adaptivity.adaptivity_dbg_port;1529u32 val = 0;15301531/*set debug port to 0x0*/1532if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x0)) {1533fa_t->dbg_port0 = phydm_get_bb_dbg_port_val(dm);1534phydm_release_bb_dbg_port(dm);1535}15361537if (dm->support_ic_type & ODM_RTL8723D) {1538val = odm_get_bb_reg(dm, R_0x9a0, BIT(29));1539} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1540val = odm_get_bb_reg(dm, R_0x2d38, BIT(24));1541} else if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, dbg_port)) {1542if (dm->support_ic_type & (ODM_RTL8723B | ODM_RTL8188E))1543val = (phydm_get_bb_dbg_port_val(dm) & BIT(30)) >> 30;1544else1545val = (phydm_get_bb_dbg_port_val(dm) & BIT(29)) >> 29;1546phydm_release_bb_dbg_port(dm);1547}15481549fa_t->edcca_flag = (boolean)val;15501551PHYDM_DBG(dm, DBG_FA_CNT, "FA_Cnt: Dbg port 0x0 = 0x%x, EDCCA = %d\n\n",1552fa_t->dbg_port0, fa_t->edcca_flag);1553}15541555void phydm_false_alarm_counter_statistics(void *dm_void)1556{1557struct dm_struct *dm = (struct dm_struct *)dm_void;1558struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;15591560if (!(dm->support_ability & ODM_BB_FA_CNT))1561return;15621563PHYDM_DBG(dm, DBG_FA_CNT, "%s======>\n", __func__);15641565if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {1566#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT1567phydm_fa_cnt_statistics_jgr3(dm);1568#endif1569} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {1570#if (ODM_IC_11N_SERIES_SUPPORT)1571phydm_fa_cnt_statistics_n(dm);1572#endif1573} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {1574#if (ODM_IC_11AC_SERIES_SUPPORT)1575phydm_fa_cnt_statistics_ac(dm);1576#endif1577}15781579phydm_get_dbg_port_info(dm);1580phydm_false_alarm_counter_reg_reset(dm_void);15811582fa_t->time_fa_all = fa_t->cnt_fast_fsync * 12 +1583fa_t->cnt_sb_search_fail * 12 +1584fa_t->cnt_parity_fail * 28 +1585fa_t->cnt_rate_illegal * 28 +1586fa_t->cnt_crc8_fail * 20 +1587fa_t->cnt_crc8_fail_vhta * 28 +1588fa_t->cnt_mcs_fail_vht * 36 +1589fa_t->cnt_mcs_fail * 32 +1590fa_t->cnt_cck_fail * 80;15911592fa_t->cnt_crc32_error_all = fa_t->cnt_vht_crc32_error +1593fa_t->cnt_ht_crc32_error +1594fa_t->cnt_ofdm_crc32_error +1595fa_t->cnt_cck_crc32_error;15961597fa_t->cnt_crc32_ok_all = fa_t->cnt_vht_crc32_ok +1598fa_t->cnt_ht_crc32_ok +1599fa_t->cnt_ofdm_crc32_ok +1600fa_t->cnt_cck_crc32_ok;16011602PHYDM_DBG(dm, DBG_FA_CNT,1603"[OFDM FA Detail-1] Parity=((%d)), Rate_Illegal=((%d)), HT_CRC8=((%d)), HT_MCS=((%d))\n",1604fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,1605fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail);1606PHYDM_DBG(dm, DBG_FA_CNT,1607"[OFDM FA Detail-2] Fast_Fsync=((%d)), SBD=((%d)), VHT_SIGA_CRC8=((%d)), VHT_SIGB_CRC8=((%d)), VHT_MCS=((%d))\n",1608fa_t->cnt_fast_fsync, fa_t->cnt_sb_search_fail,1609fa_t->cnt_crc8_fail_vhta, fa_t->cnt_crc8_fail_vhtb,1610fa_t->cnt_mcs_fail_vht);1611PHYDM_DBG(dm, DBG_FA_CNT,1612"[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",1613fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all);1614PHYDM_DBG(dm, DBG_FA_CNT,1615"[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",1616fa_t->cnt_cck_fail, fa_t->cnt_ofdm_fail, fa_t->cnt_all);1617PHYDM_DBG(dm, DBG_FA_CNT, "[CCK] CRC32 {error, ok}= {%d, %d}\n",1618fa_t->cnt_cck_crc32_error, fa_t->cnt_cck_crc32_ok);1619PHYDM_DBG(dm, DBG_FA_CNT, "[OFDM]CRC32 {error, ok}= {%d, %d}\n",1620fa_t->cnt_ofdm_crc32_error, fa_t->cnt_ofdm_crc32_ok);1621PHYDM_DBG(dm, DBG_FA_CNT, "[ HT ] CRC32 {error, ok}= {%d, %d}\n",1622fa_t->cnt_ht_crc32_error, fa_t->cnt_ht_crc32_ok);1623PHYDM_DBG(dm, DBG_FA_CNT, "[VHT] CRC32 {error, ok}= {%d, %d}\n",1624fa_t->cnt_vht_crc32_error, fa_t->cnt_vht_crc32_ok);1625PHYDM_DBG(dm, DBG_FA_CNT, "[TOTAL] CRC32 {error, ok}= {%d, %d}\n",1626fa_t->cnt_crc32_error_all, fa_t->cnt_crc32_ok_all);1627}16281629#ifdef PHYDM_TDMA_DIG_SUPPORT1630void phydm_set_tdma_dig_timer(void *dm_void)1631{1632struct dm_struct *dm = (struct dm_struct *)dm_void;1633u32 delta_time_us = dm->tdma_dig_timer_ms * 1000;1634struct phydm_dig_struct *dig_t = &dm->dm_dig_table;1635u32 timeout = 0;1636u32 current_time_stamp, diff_time_stamp, regb0 = 0;16371638/*some IC has no FREERUN_CUNT register, like 92E*/1639if (dm->support_ic_type & ODM_RTL8197F)1640current_time_stamp = odm_get_bb_reg(dm, R_0x568, 0xffffffff);1641else1642return;16431644timeout = current_time_stamp + delta_time_us;16451646diff_time_stamp = current_time_stamp - dig_t->cur_timestamp;1647dig_t->pre_timestamp = dig_t->cur_timestamp;1648dig_t->cur_timestamp = current_time_stamp;16491650/*@HIMR0, it shows HW interrupt mask*/1651regb0 = odm_get_bb_reg(dm, R_0xb0, 0xffffffff);16521653PHYDM_DBG(dm, DBG_DIG, "Set next timer\n");1654PHYDM_DBG(dm, DBG_DIG,1655"curr_time_stamp=%d, delta_time_us=%d\n",1656current_time_stamp, delta_time_us);1657PHYDM_DBG(dm, DBG_DIG,1658"timeout=%d, diff_time_stamp=%d, Reg0xb0 = 0x%x\n",1659timeout, diff_time_stamp, regb0);16601661if (dm->support_ic_type & ODM_RTL8197F) /*REG_PS_TIMER2*/1662odm_set_bb_reg(dm, R_0x588, 0xffffffff, timeout);1663else {1664PHYDM_DBG(dm, DBG_DIG, "NOT 97F, NOT start\n");1665return;1666}1667}16681669void phydm_tdma_dig_timer_check(void *dm_void)1670{1671struct dm_struct *dm = (struct dm_struct *)dm_void;1672struct phydm_dig_struct *dig_t = &dm->dm_dig_table;16731674PHYDM_DBG(dm, DBG_DIG, "tdma_dig_cnt=%d, pre_tdma_dig_cnt=%d\n",1675dig_t->tdma_dig_cnt, dig_t->pre_tdma_dig_cnt);16761677if (dig_t->tdma_dig_cnt == 0 ||1678dig_t->tdma_dig_cnt == dig_t->pre_tdma_dig_cnt) {1679if (dm->support_ability & ODM_BB_DIG) {1680#ifdef IS_USE_NEW_TDMA1681if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B |1682ODM_RTL8812F | ODM_RTL8822B | ODM_RTL8192F |1683ODM_RTL8821C | ODM_RTL8197G | ODM_RTL8822C |1684ODM_RTL8723D)) {1685PHYDM_DBG(dm, DBG_DIG,1686"Check fail, Restart timer\n\n");1687phydm_false_alarm_counter_reset(dm);1688odm_set_timer(dm, &dm->tdma_dig_timer,1689dm->tdma_dig_timer_ms);1690} else {1691PHYDM_DBG(dm, DBG_DIG,1692"Not support TDMADIG, no SW timer\n");1693}1694#else1695/*@if interrupt mask info is got.*/1696/*Reg0xb0 is no longer needed*/1697#if 01698/*regb0 = odm_get_bb_reg(dm, R_0xb0, bMaskDWord);*/1699#endif1700PHYDM_DBG(dm, DBG_DIG,1701"Check fail, Mask[0]=0x%x, restart timer\n",1702*dm->interrupt_mask);17031704phydm_tdma_dig_add_interrupt_mask_handler(dm);1705phydm_enable_rx_related_interrupt_handler(dm);1706phydm_set_tdma_dig_timer(dm);1707#endif1708}1709} else {1710PHYDM_DBG(dm, DBG_DIG, "Check pass, update pre_tdma_dig_cnt\n");1711}17121713dig_t->pre_tdma_dig_cnt = dig_t->tdma_dig_cnt;1714}17151716/*@different IC/team may use different timer for tdma-dig*/1717void phydm_tdma_dig_add_interrupt_mask_handler(void *dm_void)1718{1719struct dm_struct *dm = (struct dm_struct *)dm_void;17201721#if (DM_ODM_SUPPORT_TYPE == (ODM_AP))1722if (dm->support_ic_type & ODM_RTL8197F) {1723/*@HAL_INT_TYPE_PSTIMEOUT2*/1724phydm_add_interrupt_mask_handler(dm, HAL_INT_TYPE_PSTIMEOUT2);1725}1726#elif (DM_ODM_SUPPORT_TYPE == (ODM_WIN))1727#elif (DM_ODM_SUPPORT_TYPE == (ODM_CE))1728#endif1729}17301731/* will be triggered by HW timer*/1732void phydm_tdma_dig(void *dm_void)1733{1734struct dm_struct *dm = (struct dm_struct *)dm_void;1735struct phydm_dig_struct *dig_t = &dm->dm_dig_table;1736struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;1737u32 reg_c50 = 0;17381739#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT || RTL8812F_SUPPORT ||\1740RTL8822B_SUPPORT || RTL8192F_SUPPORT || RTL8821C_SUPPORT)1741#ifdef IS_USE_NEW_TDMA1742if (dm->support_ic_type &1743(ODM_RTL8198F | ODM_RTL8814B | ODM_RTL8812F | ODM_RTL8822B |1744ODM_RTL8192F | ODM_RTL8821C)) {1745PHYDM_DBG(dm, DBG_DIG, "98F/14B/12F/22B/92F/21C, new tdma\n");1746return;1747}1748#endif1749#endif1750reg_c50 = odm_get_bb_reg(dm, R_0xc50, MASKBYTE0);17511752dig_t->tdma_dig_state =1753dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;17541755PHYDM_DBG(dm, DBG_DIG, "tdma_dig_state=%d, regc50=0x%x\n",1756dig_t->tdma_dig_state, reg_c50);17571758dig_t->tdma_dig_cnt++;17591760if (dig_t->tdma_dig_state == 1) {1761/* update IGI from tdma_dig_state == 0*/1762if (dig_t->cur_ig_value_tdma == 0)1763dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;17641765odm_write_dig(dm, dig_t->cur_ig_value_tdma);1766phydm_tdma_false_alarm_counter_check(dm);1767PHYDM_DBG(dm, DBG_DIG, "tdma_dig_state=%d, reset FA counter\n",1768dig_t->tdma_dig_state);17691770} else if (dig_t->tdma_dig_state == 0) {1771/* update dig_t->CurIGValue,*/1772/* @it may different from dig_t->cur_ig_value_tdma */1773/* TDMA IGI upperbond @ L-state = */1774/* rf_ft_var.tdma_dig_low_upper_bond = 0x26 */17751776if (dig_t->cur_ig_value >= dm->tdma_dig_low_upper_bond)1777dig_t->low_ig_value = dm->tdma_dig_low_upper_bond;1778else1779dig_t->low_ig_value = dig_t->cur_ig_value;17801781odm_write_dig(dm, dig_t->low_ig_value);1782phydm_tdma_false_alarm_counter_check(dm);1783} else {1784phydm_tdma_false_alarm_counter_check(dm);1785}1786}17871788/*@============================================================*/1789/*@FASLE ALARM CHECK*/1790/*@============================================================*/1791void phydm_tdma_false_alarm_counter_check(void *dm_void)1792{1793struct dm_struct *dm = (struct dm_struct *)dm_void;1794struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;1795struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;1796struct phydm_dig_struct *dig_t = &dm->dm_dig_table;1797boolean rssi_dump_en = 0;1798u32 timestamp = 0;1799u8 tdma_dig_state_number = 0;1800u32 start_th = 0;18011802if (dig_t->tdma_dig_state == 1)1803phydm_false_alarm_counter_reset(dm);1804/* Reset FalseAlarmCounterStatistics */1805/* @fa_acc_1sec_tsf = fa_acc_1sec_tsf, keep */1806/* @fa_end_tsf = fa_start_tsf = TSF */1807else {1808phydm_false_alarm_counter_statistics(dm);1809if (dm->support_ic_type & ODM_RTL8197F) /*REG_FREERUN_CNT*/1810timestamp = odm_get_bb_reg(dm, R_0x568, bMaskDWord);1811else {1812PHYDM_DBG(dm, DBG_DIG, "NOT 97F! NOT start\n");1813return;1814}1815dig_t->fa_end_timestamp = timestamp;1816dig_t->fa_acc_1sec_timestamp +=1817(dig_t->fa_end_timestamp - dig_t->fa_start_timestamp);18181819/*prevent dumb*/1820if (dm->tdma_dig_state_number == 1)1821dm->tdma_dig_state_number = 2;18221823tdma_dig_state_number = dm->tdma_dig_state_number;1824dig_t->sec_factor =1825tdma_dig_state_number / (tdma_dig_state_number - 1);18261827/*@1sec = 1000000us*/1828if (dig_t->sec_factor)1829start_th = (u32)(1000000 / dig_t->sec_factor);18301831if (dig_t->fa_acc_1sec_timestamp >= start_th) {1832rssi_dump_en = 1;1833phydm_false_alarm_counter_acc(dm, rssi_dump_en);1834PHYDM_DBG(dm, DBG_DIG,1835"sec_factor=%d, total FA=%d, is_linked=%d\n",1836dig_t->sec_factor, falm_cnt_acc->cnt_all,1837dm->is_linked);18381839phydm_noisy_detection(dm);1840#ifdef PHYDM_SUPPORT_CCKPD1841phydm_cck_pd_th(dm);1842#endif1843phydm_dig(dm);1844phydm_false_alarm_counter_acc_reset(dm);18451846/* Reset FalseAlarmCounterStatistics */1847/* @fa_end_tsf = fa_start_tsf = TSF, keep */1848/* @fa_acc_1sec_tsf = 0 */1849phydm_false_alarm_counter_reset(dm);1850} else {1851phydm_false_alarm_counter_acc(dm, rssi_dump_en);1852}1853}1854}18551856void phydm_false_alarm_counter_acc(void *dm_void, boolean rssi_dump_en)1857{1858struct dm_struct *dm = (struct dm_struct *)dm_void;1859struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;1860struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;1861struct phydm_dig_struct *dig_t = &dm->dm_dig_table;18621863falm_cnt_acc->cnt_parity_fail += falm_cnt->cnt_parity_fail;1864falm_cnt_acc->cnt_rate_illegal += falm_cnt->cnt_rate_illegal;1865falm_cnt_acc->cnt_crc8_fail += falm_cnt->cnt_crc8_fail;1866falm_cnt_acc->cnt_mcs_fail += falm_cnt->cnt_mcs_fail;1867falm_cnt_acc->cnt_ofdm_fail += falm_cnt->cnt_ofdm_fail;1868falm_cnt_acc->cnt_cck_fail += falm_cnt->cnt_cck_fail;1869falm_cnt_acc->cnt_all += falm_cnt->cnt_all;1870falm_cnt_acc->cnt_fast_fsync += falm_cnt->cnt_fast_fsync;1871falm_cnt_acc->cnt_sb_search_fail += falm_cnt->cnt_sb_search_fail;1872falm_cnt_acc->cnt_ofdm_cca += falm_cnt->cnt_ofdm_cca;1873falm_cnt_acc->cnt_cck_cca += falm_cnt->cnt_cck_cca;1874falm_cnt_acc->cnt_cca_all += falm_cnt->cnt_cca_all;1875falm_cnt_acc->cnt_cck_crc32_error += falm_cnt->cnt_cck_crc32_error;1876falm_cnt_acc->cnt_cck_crc32_ok += falm_cnt->cnt_cck_crc32_ok;1877falm_cnt_acc->cnt_ofdm_crc32_error += falm_cnt->cnt_ofdm_crc32_error;1878falm_cnt_acc->cnt_ofdm_crc32_ok += falm_cnt->cnt_ofdm_crc32_ok;1879falm_cnt_acc->cnt_ht_crc32_error += falm_cnt->cnt_ht_crc32_error;1880falm_cnt_acc->cnt_ht_crc32_ok += falm_cnt->cnt_ht_crc32_ok;1881falm_cnt_acc->cnt_vht_crc32_error += falm_cnt->cnt_vht_crc32_error;1882falm_cnt_acc->cnt_vht_crc32_ok += falm_cnt->cnt_vht_crc32_ok;1883falm_cnt_acc->cnt_crc32_error_all += falm_cnt->cnt_crc32_error_all;1884falm_cnt_acc->cnt_crc32_ok_all += falm_cnt->cnt_crc32_ok_all;18851886if (rssi_dump_en == 1) {1887falm_cnt_acc->cnt_all_1sec =1888falm_cnt_acc->cnt_all * dig_t->sec_factor;1889falm_cnt_acc->cnt_cca_all_1sec =1890falm_cnt_acc->cnt_cca_all * dig_t->sec_factor;1891falm_cnt_acc->cnt_cck_fail_1sec =1892falm_cnt_acc->cnt_cck_fail * dig_t->sec_factor;1893}1894}18951896void phydm_false_alarm_counter_acc_reset(void *dm_void)1897{1898struct dm_struct *dm = (struct dm_struct *)dm_void;1899struct phydm_fa_acc_struct *falm_cnt_acc = NULL;19001901#ifdef IS_USE_NEW_TDMA1902struct phydm_fa_acc_struct *falm_cnt_acc_low = NULL;1903u32 tmp_cca_1sec = 0;1904u32 tmp_fa_1sec = 0;19051906/*@clear L-fa_acc struct*/1907falm_cnt_acc_low = &dm->false_alm_cnt_acc_low;1908tmp_cca_1sec = falm_cnt_acc_low->cnt_cca_all_1sec;1909tmp_fa_1sec = falm_cnt_acc_low->cnt_all_1sec;1910odm_memory_set(dm, falm_cnt_acc_low, 0, sizeof(dm->false_alm_cnt_acc));1911falm_cnt_acc_low->cnt_cca_all_1sec = tmp_cca_1sec;1912falm_cnt_acc_low->cnt_all_1sec = tmp_fa_1sec;19131914/*@clear H-fa_acc struct*/1915falm_cnt_acc = &dm->false_alm_cnt_acc;1916tmp_cca_1sec = falm_cnt_acc->cnt_cca_all_1sec;1917tmp_fa_1sec = falm_cnt_acc->cnt_all_1sec;1918odm_memory_set(dm, falm_cnt_acc, 0, sizeof(dm->false_alm_cnt_acc));1919falm_cnt_acc->cnt_cca_all_1sec = tmp_cca_1sec;1920falm_cnt_acc->cnt_all_1sec = tmp_fa_1sec;1921#else1922falm_cnt_acc = &dm->false_alm_cnt_acc;1923/* @Cnt_all_for_rssi_dump & Cnt_CCA_all_for_rssi_dump */1924/* @do NOT need to be reset */1925odm_memory_set(dm, falm_cnt_acc, 0, sizeof(falm_cnt_acc));1926#endif1927}19281929void phydm_false_alarm_counter_reset(void *dm_void)1930{1931struct dm_struct *dm = (struct dm_struct *)dm_void;1932struct phydm_fa_struct *falm_cnt;1933struct phydm_dig_struct *dig_t;1934u32 timestamp;19351936falm_cnt = &dm->false_alm_cnt;1937dig_t = &dm->dm_dig_table;19381939memset(falm_cnt, 0, sizeof(dm->false_alm_cnt));1940phydm_false_alarm_counter_reg_reset(dm);19411942#ifdef IS_USE_NEW_TDMA1943return;1944#endif1945if (dig_t->tdma_dig_state != 1)1946dig_t->fa_acc_1sec_timestamp = 0;1947else1948dig_t->fa_acc_1sec_timestamp = dig_t->fa_acc_1sec_timestamp;19491950/*REG_FREERUN_CNT*/1951timestamp = odm_get_bb_reg(dm, R_0x568, bMaskDWord);1952dig_t->fa_start_timestamp = timestamp;1953dig_t->fa_end_timestamp = timestamp;1954}19551956void phydm_tdma_dig_para_upd(void *dm_void, enum upd_type type, u8 input)1957{1958struct dm_struct *dm = (struct dm_struct *)dm_void;19591960switch (type) {1961case ENABLE_TDMA:1962dm->original_dig_restore = !((boolean)input);1963break;1964case MODE_DECISION:1965if (input == (u8)MODE_PERFORMANCE)1966dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES + 2;1967else if (input == (u8)MODE_COVERAGE)1968dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES;1969else1970dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES;1971break;1972}1973}19741975#ifdef IS_USE_NEW_TDMA1976#if defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI)1977static void pre_phydm_tdma_dig_cbk(unsigned long task_dm)1978{1979struct dm_struct *dm = (struct dm_struct *)task_dm;1980struct rtl8192cd_priv *priv = dm->priv;1981struct priv_shared_info *pshare = priv->pshare;19821983if (!(priv->drv_state & DRV_STATE_OPEN))1984return;19851986if (pshare->bDriverStopped || pshare->bSurpriseRemoved) {1987printk("[%s] bDriverStopped(%d) OR bSurpriseRemoved(%d)\n",1988__FUNCTION__, pshare->bDriverStopped,1989pshare->bSurpriseRemoved);1990return;1991}19921993rtw_enqueue_timer_event(priv, &pshare->tdma_dig_event,1994ENQUEUE_TO_TAIL);1995}19961997void phydm_tdma_dig_timers_usb(void *dm_void, u8 state)1998{1999struct dm_struct *dm = (struct dm_struct *)dm_void;2000struct phydm_dig_struct *dig_t = &dm->dm_dig_table;20012002if (state == INIT_TDMA_DIG_TIMMER) {2003struct rtl8192cd_priv *priv = dm->priv;20042005init_timer(&dm->tdma_dig_timer);2006dm->tdma_dig_timer.data = (unsigned long)dm;2007dm->tdma_dig_timer.function = pre_phydm_tdma_dig_cbk;2008INIT_TIMER_EVENT_ENTRY(&priv->pshare->tdma_dig_event,2009phydm_tdma_dig_cbk,2010(unsigned long)dm);2011} else if (state == CANCEL_TDMA_DIG_TIMMER) {2012odm_cancel_timer(dm, &dm->tdma_dig_timer);2013} else if (state == RELEASE_TDMA_DIG_TIMMER) {2014odm_release_timer(dm, &dm->tdma_dig_timer);2015}2016}2017#endif /* defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI) */20182019void phydm_tdma_dig_timers(void *dm_void, u8 state)2020{2021struct dm_struct *dm = (struct dm_struct *)dm_void;2022struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2023#if defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI)2024struct rtl8192cd_priv *priv = dm->priv;20252026if (priv->hci_type == RTL_HCI_USB) {2027phydm_tdma_dig_timers_usb(dm_void, state);2028return;2029}2030#endif /* defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI) */20312032if (state == INIT_TDMA_DIG_TIMMER)2033odm_initialize_timer(dm, &dm->tdma_dig_timer,2034(void *)phydm_tdma_dig_cbk,2035NULL, "phydm_tdma_dig_timer");2036else if (state == CANCEL_TDMA_DIG_TIMMER)2037odm_cancel_timer(dm, &dm->tdma_dig_timer);2038else if (state == RELEASE_TDMA_DIG_TIMMER)2039odm_release_timer(dm, &dm->tdma_dig_timer);2040}20412042u8 get_new_igi_bound(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *rx_gain_max,2043u8 *rx_gain_min, boolean is_dfs_band)2044{2045struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2046u8 step[3] = {0};2047u8 cur_igi = igi;20482049if (dm->is_linked) {2050if (dm->pre_rssi_min <= dm->rssi_min) {2051PHYDM_DBG(dm, DBG_DIG, "pre_rssi_min <= rssi_min\n");2052step[0] = 2;2053step[1] = 1;2054step[2] = 2;2055} else {2056step[0] = 4;2057step[1] = 2;2058step[2] = 2;2059}2060} else {2061step[0] = 2;2062step[1] = 1;2063step[2] = 2;2064}20652066PHYDM_DBG(dm, DBG_DIG, "step = {-%d, +%d, +%d}\n", step[2], step[1],2067step[0]);20682069if (dm->first_connect) {2070if (is_dfs_band) {2071if (dm->rssi_min > DIG_MAX_DFS)2072igi = DIG_MAX_DFS;2073else2074igi = dm->rssi_min;2075PHYDM_DBG(dm, DBG_DIG, "DFS band:IgiMax=0x%x\n",2076*rx_gain_max);2077} else {2078igi = *rx_gain_min;2079}20802081#if 02082#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))2083#if (RTL8812A_SUPPORT)2084if (dm->support_ic_type == ODM_RTL8812)2085odm_config_bb_with_header_file(dm,2086CONFIG_BB_AGC_TAB_DIFF);2087#endif2088#endif2089#endif2090PHYDM_DBG(dm, DBG_DIG, "First connect: foce IGI=0x%x\n", igi);2091} else {2092/* @2 Before link */2093PHYDM_DBG(dm, DBG_DIG, "Adjust IGI before link\n");20942095if (dm->first_disconnect) {2096igi = dig_t->dm_dig_min;2097PHYDM_DBG(dm, DBG_DIG,2098"First disconnect:foce IGI to lower bound\n");2099} else {2100PHYDM_DBG(dm, DBG_DIG, "Pre_IGI=((0x%x)), FA=((%d))\n",2101igi, fa_cnt);21022103igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);2104}2105}2106/*@Check IGI by dyn-upper/lower bound */2107if (igi < *rx_gain_min)2108igi = *rx_gain_min;21092110if (igi > *rx_gain_max)2111igi = *rx_gain_max;21122113PHYDM_DBG(dm, DBG_DIG, "fa_cnt = %d, IGI: 0x%x -> 0x%x\n",2114fa_cnt, cur_igi, igi);21152116return igi;2117}21182119void phydm_tdma_dig_new(void *dm_void)2120{2121struct dm_struct *dm = (struct dm_struct *)dm_void;2122struct phydm_dig_struct *dig_t = &dm->dm_dig_table;21232124if (phydm_dig_abort(dm) || dm->original_dig_restore)2125return;2126/*@2127*PHYDM_DBG(dm, DBG_DIG, "timer callback =======> tdma_dig_state=%d\n");2128* dig_t->tdma_dig_state);2129*PHYDM_DBG(dm, DBG_DIG, "tdma_h_igi=0x%x, tdma_l_igi=0x%x\n",2130* dig_t->cur_ig_value_tdma,2131* dig_t->low_ig_value);2132*/2133phydm_tdma_fa_cnt_chk(dm);21342135/*@prevent dumb*/2136if (dm->tdma_dig_state_number < 2)2137dm->tdma_dig_state_number = 2;21382139/*@update state*/2140dig_t->tdma_dig_cnt++;2141dig_t->tdma_dig_state = dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;21422143/*@2144*PHYDM_DBG(dm, DBG_DIG, "enter state %d, dig count %d\n",2145* dig_t->tdma_dig_state, dig_t->tdma_dig_cnt);2146*/21472148if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)2149odm_write_dig(dm, dig_t->low_ig_value);2150else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)2151odm_write_dig(dm, dig_t->cur_ig_value_tdma);21522153odm_set_timer(dm, &dm->tdma_dig_timer, dm->tdma_dig_timer_ms);2154}21552156/*@callback function triggered by SW timer*/2157#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)2158void phydm_tdma_dig_cbk(struct phydm_timer_list *timer)2159{2160void *adapter = (void *)timer->Adapter;2161HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2162struct dm_struct *dm = &hal_data->DM_OutSrcs;21632164#if DEV_BUS_TYPE == RT_PCI_INTERFACE2165#if USE_WORKITEM2166odm_schedule_work_item(&dm->phydm_tdma_dig_workitem);2167#else2168phydm_tdma_dig_new(dm);2169#endif2170#else2171odm_schedule_work_item(&dm->phydm_tdma_dig_workitem);2172#endif2173}21742175void phydm_tdma_dig_workitem_callback(void *context)2176{2177void *adapter = (void *)context;2178HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2179struct dm_struct *dm = &hal_data->DM_OutSrc;21802181phydm_tdma_dig_new(dm);2182}21832184#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)2185void phydm_tdma_dig_cbk(void *dm_void)2186{2187struct dm_struct *dm = (struct dm_struct *)dm_void;2188void *padapter = dm->adapter;21892190if (dm->support_interface == ODM_ITRF_PCIE)2191phydm_tdma_dig_workitem_callback(dm);2192/* @Can't do I/O in timer callback*/2193else2194phydm_run_in_thread_cmd(dm, phydm_tdma_dig_workitem_callback,2195dm);2196}21972198void phydm_tdma_dig_workitem_callback(void *dm_void)2199{2200struct dm_struct *dm = (struct dm_struct *)dm_void;2201struct phydm_dig_struct *dig_t = &dm->dm_dig_table;22022203if (phydm_dig_abort(dm) || (dm->original_dig_restore))2204return;2205/*@2206*PHYDM_DBG(dm, DBG_DIG, "timer callback =======> tdma_dig_state=%d\n");2207* dig_t->tdma_dig_state);2208*PHYDM_DBG(dm, DBG_DIG, "tdma_h_igi=0x%x, tdma_l_igi=0x%x\n",2209* dig_t->cur_ig_value_tdma,2210* dig_t->low_ig_value);2211*/2212phydm_tdma_fa_cnt_chk(dm);22132214/*@prevent dumb*/2215if (dm->tdma_dig_state_number < 2)2216dm->tdma_dig_state_number = 2;22172218/*@update state*/2219dig_t->tdma_dig_cnt++;2220dig_t->tdma_dig_state = dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;22212222/*@2223*PHYDM_DBG(dm, DBG_DIG, "enter state %d, dig count %d\n",2224* dig_t->tdma_dig_state, dig_t->tdma_dig_cnt);2225*/22262227if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)2228odm_write_dig(dm, dig_t->low_ig_value);2229else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)2230odm_write_dig(dm, dig_t->cur_ig_value_tdma);22312232odm_set_timer(dm, &dm->tdma_dig_timer, dm->tdma_dig_timer_ms);2233}2234#else2235void phydm_tdma_dig_cbk(void *dm_void)2236{2237struct dm_struct *dm = (struct dm_struct *)dm_void;2238struct phydm_dig_struct *dig_t = &dm->dm_dig_table;22392240if (phydm_dig_abort(dm) || dm->original_dig_restore)2241return;2242/*@2243*PHYDM_DBG(dm, DBG_DIG, "timer callback =======> tdma_dig_state=%d\n");2244* dig_t->tdma_dig_state);2245*PHYDM_DBG(dm, DBG_DIG, "tdma_h_igi=0x%x, tdma_l_igi=0x%x\n",2246* dig_t->cur_ig_value_tdma,2247* dig_t->low_ig_value);2248*/2249phydm_tdma_fa_cnt_chk(dm);22502251/*@prevent dumb*/2252if (dm->tdma_dig_state_number < 2)2253dm->tdma_dig_state_number = 2;22542255/*@update state*/2256dig_t->tdma_dig_cnt++;2257dig_t->tdma_dig_state = dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;22582259/*@2260*PHYDM_DBG(dm, DBG_DIG, "enter state %d, dig count %d\n",2261* dig_t->tdma_dig_state, dig_t->tdma_dig_cnt);2262*/22632264if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)2265odm_write_dig(dm, dig_t->low_ig_value);2266else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)2267odm_write_dig(dm, dig_t->cur_ig_value_tdma);22682269odm_set_timer(dm, &dm->tdma_dig_timer, dm->tdma_dig_timer_ms);2270}2271#endif2272/*@============================================================*/2273/*@FASLE ALARM CHECK*/2274/*@============================================================*/2275void phydm_tdma_fa_cnt_chk(void *dm_void)2276{2277struct dm_struct *dm = (struct dm_struct *)dm_void;2278struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;2279struct phydm_fa_acc_struct *fa_t_acc = &dm->false_alm_cnt_acc;2280struct phydm_fa_acc_struct *fa_t_acc_low = &dm->false_alm_cnt_acc_low;2281struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2282boolean tdma_dig_block_1sec_flag = false;2283u32 timestamp = 0;2284u8 states_per_block = dm->tdma_dig_state_number;2285u8 cur_tdma_dig_state = 0;2286u32 start_th = 0;2287u8 state_diff = 0;2288u32 tdma_dig_block_period_ms = 0;2289u32 tdma_dig_block_cnt_thd = 0;2290u32 timestamp_diff = 0;22912292/*@calculate duration of a tdma block*/2293tdma_dig_block_period_ms = dm->tdma_dig_timer_ms * states_per_block;22942295/*@2296*caution!ONE_SEC_MS must be divisible by tdma_dig_block_period_ms,2297*or FA will be fewer.2298*/2299tdma_dig_block_cnt_thd = ONE_SEC_MS / tdma_dig_block_period_ms;23002301/*@tdma_dig_state == 0, collect H-state FA, else, collect L-state FA*/2302if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)2303cur_tdma_dig_state = TDMA_DIG_LOW_STATE;2304else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)2305cur_tdma_dig_state = TDMA_DIG_HIGH_STATE;2306/*@2307*PHYDM_DBG(dm, DBG_DIG, "in state %d, dig count %d\n",2308* cur_tdma_dig_state, dig_t->tdma_dig_cnt);2309*/2310if (cur_tdma_dig_state == 0) {2311/*@L-state indicates next block*/2312dig_t->tdma_dig_block_cnt++;23132314/*@1sec dump check*/2315if (dig_t->tdma_dig_block_cnt >= tdma_dig_block_cnt_thd)2316tdma_dig_block_1sec_flag = true;23172318/*@2319*PHYDM_DBG(dm, DBG_DIG,"[L-state] tdma_dig_block_cnt=%d\n",2320* dig_t->tdma_dig_block_cnt);2321*/23222323/*@collect FA till this block end*/2324phydm_false_alarm_counter_statistics(dm);2325phydm_fa_cnt_acc(dm, tdma_dig_block_1sec_flag,2326cur_tdma_dig_state);2327/*@1s L-FA collect end*/23282329/*@1sec dump reached*/2330if (tdma_dig_block_1sec_flag) {2331/*@L-DIG*/2332phydm_noisy_detection(dm);2333#ifdef PHYDM_SUPPORT_CCKPD2334phydm_cck_pd_th(dm);2335#endif2336PHYDM_DBG(dm, DBG_DIG, "run tdma L-state dig ====>\n");2337phydm_tdma_low_dig(dm);2338PHYDM_DBG(dm, DBG_DIG, "\n\n");2339}2340} else if (cur_tdma_dig_state == 1) {2341/*@1sec dump check*/2342if (dig_t->tdma_dig_block_cnt >= tdma_dig_block_cnt_thd)2343tdma_dig_block_1sec_flag = true;23442345/*@2346*PHYDM_DBG(dm, DBG_DIG,"[H-state] tdma_dig_block_cnt=%d\n",2347* dig_t->tdma_dig_block_cnt);2348*/23492350/*@collect FA till this block end*/2351phydm_false_alarm_counter_statistics(dm);2352phydm_fa_cnt_acc(dm, tdma_dig_block_1sec_flag,2353cur_tdma_dig_state);2354/*@1s H-FA collect end*/23552356/*@1sec dump reached*/2357state_diff = dm->tdma_dig_state_number - dig_t->tdma_dig_state;2358if (tdma_dig_block_1sec_flag && state_diff == 1) {2359/*@H-DIG*/2360phydm_noisy_detection(dm);2361#ifdef PHYDM_SUPPORT_CCKPD2362phydm_cck_pd_th(dm);2363#endif2364PHYDM_DBG(dm, DBG_DIG, "run tdma H-state dig ====>\n");2365phydm_tdma_high_dig(dm);2366PHYDM_DBG(dm, DBG_DIG, "\n\n");2367PHYDM_DBG(dm, DBG_DIG, "1 sec reached, is_linked=%d\n",2368dm->is_linked);2369PHYDM_DBG(dm, DBG_DIG, "1 sec L-CCA=%d, L-FA=%d\n",2370fa_t_acc_low->cnt_cca_all_1sec,2371fa_t_acc_low->cnt_all_1sec);2372PHYDM_DBG(dm, DBG_DIG, "1 sec H-CCA=%d, H-FA=%d\n",2373fa_t_acc->cnt_cca_all_1sec,2374fa_t_acc->cnt_all_1sec);2375PHYDM_DBG(dm, DBG_DIG,2376"1 sec TOTAL-CCA=%d, TOTAL-FA=%d\n\n",2377fa_t_acc->cnt_cca_all +2378fa_t_acc_low->cnt_cca_all,2379fa_t_acc->cnt_all + fa_t_acc_low->cnt_all);23802381/*@Reset AccFalseAlarmCounterStatistics */2382phydm_false_alarm_counter_acc_reset(dm);2383dig_t->tdma_dig_block_cnt = 0;2384}2385}2386/*@Reset FalseAlarmCounterStatistics */2387phydm_false_alarm_counter_reset(dm);2388}23892390void phydm_tdma_low_dig(void *dm_void)2391{2392struct dm_struct *dm = (struct dm_struct *)dm_void;2393struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2394struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;2395struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc_low;2396#ifdef CFG_DIG_DAMPING_CHK2397struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;2398#endif2399u8 igi = dig_t->cur_ig_value;2400u8 new_igi = 0x20;2401u8 tdma_l_igi = dig_t->low_ig_value;2402u8 tdma_l_dym_min = dig_t->tdma_rx_gain_min[TDMA_DIG_LOW_STATE];2403u8 tdma_l_dym_max = dig_t->tdma_rx_gain_max[TDMA_DIG_LOW_STATE];2404u32 fa_cnt = falm_cnt->cnt_all;2405boolean dfs_mode_en = false, is_performance = true;2406u8 rssi_min = dm->rssi_min;2407u8 igi_upper_rssi_min = 0;2408u8 offset = 15;24092410if (!(dm->original_dig_restore)) {2411if (tdma_l_igi == 0)2412tdma_l_igi = igi;24132414fa_cnt = falm_cnt_acc->cnt_all_1sec;2415}24162417if (phydm_dig_abort(dm)) {2418dig_t->low_ig_value = phydm_get_igi(dm, BB_PATH_A);2419return;2420}24212422/*@Mode Decision*/2423dfs_mode_en = false;2424is_performance = true;24252426/* @Abs Boundary Decision*/2427dig_t->dm_dig_max = DIG_MAX_COVERAGR; //0x262428dig_t->dm_dig_min = DIG_MIN_PERFORMANCE; //0x202429dig_t->dig_max_of_min = DIG_MAX_OF_MIN_COVERAGE; //0x2224302431if (dfs_mode_en) {2432if (*dm->band_width == CHANNEL_WIDTH_20)2433dig_t->dm_dig_min = DIG_MIN_DFS + 2;2434else2435dig_t->dm_dig_min = DIG_MIN_DFS;24362437} else {2438#if 02439if (dm->support_ic_type &2440(ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))2441dig_t->dm_dig_min = 0x1c;2442else if (dm->support_ic_type & ODM_RTL8197F)2443dig_t->dm_dig_min = 0x1e; /*@For HW setting*/2444#endif2445}24462447PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",2448dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);24492450/* @Dyn Boundary by RSSI*/2451if (!dm->is_linked) {2452/*@if no link, always stay at lower bound*/2453tdma_l_dym_max = 0x26;2454tdma_l_dym_min = dig_t->dm_dig_min;24552456PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",2457tdma_l_dym_max, tdma_l_dym_min);2458} else {2459PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n",2460dm->rssi_min, offset);24612462/* @DIG lower bound in L-state*/2463tdma_l_dym_min = dig_t->dm_dig_min;24642465/*@2466*#ifdef CFG_DIG_DAMPING_CHK2467*@Limit Dyn min by damping2468*if (dig_t->dig_dl_en &&2469* dig_rc->damping_limit_en &&2470* tdma_l_dym_min < dig_rc->damping_limit_val) {2471* PHYDM_DBG(dm, DBG_DIG,2472* "[Limit by Damping] dyn_min=0x%x -> 0x%x\n",2473* tdma_l_dym_min, dig_rc->damping_limit_val);2474*2475* tdma_l_dym_min = dig_rc->damping_limit_val;2476*}2477*#endif2478*/24792480/*@DIG upper bound in L-state*/2481igi_upper_rssi_min = rssi_min + offset;2482if (igi_upper_rssi_min > dig_t->dm_dig_max)2483tdma_l_dym_max = dig_t->dm_dig_max;2484else if (igi_upper_rssi_min < dig_t->dm_dig_min)2485tdma_l_dym_max = dig_t->dm_dig_min;2486else2487tdma_l_dym_max = igi_upper_rssi_min;24882489/* @1 Force Lower Bound for AntDiv */2490/*@2491*if (!dm->is_one_entry_only &&2492*(dm->support_ability & ODM_BB_ANT_DIV) &&2493*(dm->ant_div_type == CG_TRX_HW_ANTDIV ||2494*dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {2495*if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)2496* dig_t->rx_gain_range_min = dig_t->dig_max_of_min;2497*else2498* dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;2499*2500*PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",2501* dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);2502*}2503*/25042505PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",2506tdma_l_dym_max, tdma_l_dym_min);2507}25082509/*@Abnormal Case Check*/2510/*@Abnormal lower bound case*/2511if (tdma_l_dym_min > tdma_l_dym_max)2512tdma_l_dym_min = tdma_l_dym_max;25132514PHYDM_DBG(dm, DBG_DIG,2515"Abnoraml chk, force {Max, Min}={0x%x, 0x%x}\n",2516tdma_l_dym_max, tdma_l_dym_min);25172518/*@False Alarm Threshold Decision*/2519phydm_fa_threshold_check(dm, dfs_mode_en);25202521/*@Adjust Initial Gain by False Alarm*/2522/*Select new IGI by FA */2523if (!(dm->original_dig_restore)) {2524tdma_l_igi = get_new_igi_bound(dm, tdma_l_igi, fa_cnt,2525&tdma_l_dym_max,2526&tdma_l_dym_min,2527dfs_mode_en);2528} else {2529new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);2530}25312532/*Update status*/2533if (!(dm->original_dig_restore)) {2534dig_t->low_ig_value = tdma_l_igi;2535dig_t->tdma_rx_gain_min[TDMA_DIG_LOW_STATE] = tdma_l_dym_min;2536dig_t->tdma_rx_gain_max[TDMA_DIG_LOW_STATE] = tdma_l_dym_max;2537#if 02538/*odm_write_dig(dm, tdma_l_igi);*/2539#endif2540} else {2541odm_write_dig(dm, new_igi);2542}2543}25442545void phydm_tdma_high_dig(void *dm_void)2546{2547struct dm_struct *dm = (struct dm_struct *)dm_void;2548struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2549struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;2550struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;2551#ifdef CFG_DIG_DAMPING_CHK2552struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;2553#endif2554u8 igi = dig_t->cur_ig_value;2555u8 new_igi = 0x20;2556u8 tdma_h_igi = dig_t->cur_ig_value_tdma;2557u8 tdma_h_dym_min = dig_t->tdma_rx_gain_min[TDMA_DIG_HIGH_STATE];2558u8 tdma_h_dym_max = dig_t->tdma_rx_gain_max[TDMA_DIG_HIGH_STATE];2559u32 fa_cnt = falm_cnt->cnt_all;2560boolean dfs_mode_en = false, is_performance = true;2561u8 rssi_min = dm->rssi_min;2562u8 igi_upper_rssi_min = 0;2563u8 offset = 15;25642565if (!(dm->original_dig_restore)) {2566if (tdma_h_igi == 0)2567tdma_h_igi = igi;25682569fa_cnt = falm_cnt_acc->cnt_all_1sec;2570}25712572if (phydm_dig_abort(dm)) {2573dig_t->cur_ig_value_tdma = phydm_get_igi(dm, BB_PATH_A);2574return;2575}25762577/*@Mode Decision*/2578dfs_mode_en = false;2579is_performance = true;25802581/*@Abs Boundary Decision*/2582dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE; // 0x2a25832584if (!dm->is_linked) {2585dig_t->dm_dig_max = DIG_MAX_COVERAGR;2586dig_t->dm_dig_min = DIG_MIN_PERFORMANCE; // 0x202587} else if (dfs_mode_en) {2588if (*dm->band_width == CHANNEL_WIDTH_20)2589dig_t->dm_dig_min = DIG_MIN_DFS + 2;2590else2591dig_t->dm_dig_min = DIG_MIN_DFS;25922593dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;2594dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;2595} else {2596if (*dm->bb_op_mode == PHYDM_BALANCE_MODE) {2597/*service > 2 devices*/2598dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;2599#if (DIG_HW == 1)2600dig_t->dig_max_of_min = DIG_MIN_COVERAGE;2601#else2602dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;2603#endif2604} else if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE) {2605/*service 1 devices*/2606dig_t->dm_dig_max = DIG_MAX_PERFORMANCE_MODE;2607dig_t->dig_max_of_min = DIG_MAX_OF_MIN_PERFORMANCE_MODE;2608}26092610#if 02611if (dm->support_ic_type &2612(ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))2613dig_t->dm_dig_min = 0x1c;2614else if (dm->support_ic_type & ODM_RTL8197F)2615dig_t->dm_dig_min = 0x1e; /*@For HW setting*/2616else2617#endif2618dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;2619}2620PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",2621dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);26222623/*@Dyn Boundary by RSSI*/2624if (!dm->is_linked) {2625/*@if no link, always stay at lower bound*/2626tdma_h_dym_max = dig_t->dig_max_of_min;2627tdma_h_dym_min = dig_t->dm_dig_min;26282629PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",2630tdma_h_dym_max, tdma_h_dym_min);2631} else {2632PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n",2633dm->rssi_min, offset);26342635/* @DIG lower bound in H-state*/2636if (rssi_min < dig_t->dm_dig_min)2637tdma_h_dym_min = dig_t->dm_dig_min;2638else2639tdma_h_dym_min = rssi_min; // turbo not considered yet26402641#ifdef CFG_DIG_DAMPING_CHK2642/*@Limit Dyn min by damping*/2643if (dig_t->dig_dl_en &&2644dig_rc->damping_limit_en &&2645tdma_h_dym_min < dig_rc->damping_limit_val) {2646PHYDM_DBG(dm, DBG_DIG,2647"[Limit by Damping] dyn_min=0x%x -> 0x%x\n",2648tdma_h_dym_min, dig_rc->damping_limit_val);26492650tdma_h_dym_min = dig_rc->damping_limit_val;2651}2652#endif26532654/*@DIG upper bound in H-state*/2655igi_upper_rssi_min = rssi_min + offset;2656if (igi_upper_rssi_min > dig_t->dm_dig_max)2657tdma_h_dym_max = dig_t->dm_dig_max;2658else2659tdma_h_dym_max = igi_upper_rssi_min;26602661/* @1 Force Lower Bound for AntDiv */2662/*@2663*if (!dm->is_one_entry_only &&2664*(dm->support_ability & ODM_BB_ANT_DIV) &&2665*(dm->ant_div_type == CG_TRX_HW_ANTDIV ||2666*dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {2667* if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)2668* dig_t->rx_gain_range_min = dig_t->dig_max_of_min;2669* else2670* dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;2671*/2672/*@2673*PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",2674* dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);2675*}2676*/2677PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",2678tdma_h_dym_max, tdma_h_dym_min);2679}26802681/*@Abnormal Case Check*/2682/*@Abnormal low higher bound case*/2683if (tdma_h_dym_max < dig_t->dm_dig_min)2684tdma_h_dym_max = dig_t->dm_dig_min;2685/*@Abnormal lower bound case*/2686if (tdma_h_dym_min > tdma_h_dym_max)2687tdma_h_dym_min = tdma_h_dym_max;26882689PHYDM_DBG(dm, DBG_DIG, "Abnoraml chk, force {Max, Min}={0x%x, 0x%x}\n",2690tdma_h_dym_max, tdma_h_dym_min);26912692/*@False Alarm Threshold Decision*/2693phydm_fa_threshold_check(dm, dfs_mode_en);26942695/*@Adjust Initial Gain by False Alarm*/2696/*Select new IGI by FA */2697if (!(dm->original_dig_restore)) {2698tdma_h_igi = get_new_igi_bound(dm, tdma_h_igi, fa_cnt,2699&tdma_h_dym_max,2700&tdma_h_dym_min,2701dfs_mode_en);2702} else {2703new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);2704}27052706/*Update status*/2707if (!(dm->original_dig_restore)) {2708dig_t->cur_ig_value_tdma = tdma_h_igi;2709dig_t->tdma_rx_gain_min[TDMA_DIG_HIGH_STATE] = tdma_h_dym_min;2710dig_t->tdma_rx_gain_max[TDMA_DIG_HIGH_STATE] = tdma_h_dym_max;2711#if 02712/*odm_write_dig(dm, tdma_h_igi);*/2713#endif2714} else {2715odm_write_dig(dm, new_igi);2716}2717}27182719void phydm_fa_cnt_acc(void *dm_void, boolean tdma_dig_block_1sec_flag,2720u8 cur_tdma_dig_state)2721{2722struct dm_struct *dm = (struct dm_struct *)dm_void;2723struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;2724struct phydm_fa_acc_struct *falm_cnt_acc = NULL;2725struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2726u8 factor_num = 0;2727u8 factor_denum = 1;2728u8 total_state_number = 0;27292730if (cur_tdma_dig_state == TDMA_DIG_LOW_STATE)2731falm_cnt_acc = &dm->false_alm_cnt_acc_low;2732else if (cur_tdma_dig_state == TDMA_DIG_HIGH_STATE)27332734falm_cnt_acc = &dm->false_alm_cnt_acc;2735/*@2736*PHYDM_DBG(dm, DBG_DIG,2737* "[%s] ==> dig_state=%d, one_sec=%d\n", __func__,2738* cur_tdma_dig_state, tdma_dig_block_1sec_flag);2739*/2740falm_cnt_acc->cnt_parity_fail += falm_cnt->cnt_parity_fail;2741falm_cnt_acc->cnt_rate_illegal += falm_cnt->cnt_rate_illegal;2742falm_cnt_acc->cnt_crc8_fail += falm_cnt->cnt_crc8_fail;2743falm_cnt_acc->cnt_mcs_fail += falm_cnt->cnt_mcs_fail;2744falm_cnt_acc->cnt_ofdm_fail += falm_cnt->cnt_ofdm_fail;2745falm_cnt_acc->cnt_cck_fail += falm_cnt->cnt_cck_fail;2746falm_cnt_acc->cnt_all += falm_cnt->cnt_all;2747falm_cnt_acc->cnt_fast_fsync += falm_cnt->cnt_fast_fsync;2748falm_cnt_acc->cnt_sb_search_fail += falm_cnt->cnt_sb_search_fail;2749falm_cnt_acc->cnt_ofdm_cca += falm_cnt->cnt_ofdm_cca;2750falm_cnt_acc->cnt_cck_cca += falm_cnt->cnt_cck_cca;2751falm_cnt_acc->cnt_cca_all += falm_cnt->cnt_cca_all;2752falm_cnt_acc->cnt_cck_crc32_error += falm_cnt->cnt_cck_crc32_error;2753falm_cnt_acc->cnt_cck_crc32_ok += falm_cnt->cnt_cck_crc32_ok;2754falm_cnt_acc->cnt_ofdm_crc32_error += falm_cnt->cnt_ofdm_crc32_error;2755falm_cnt_acc->cnt_ofdm_crc32_ok += falm_cnt->cnt_ofdm_crc32_ok;2756falm_cnt_acc->cnt_ht_crc32_error += falm_cnt->cnt_ht_crc32_error;2757falm_cnt_acc->cnt_ht_crc32_ok += falm_cnt->cnt_ht_crc32_ok;2758falm_cnt_acc->cnt_vht_crc32_error += falm_cnt->cnt_vht_crc32_error;2759falm_cnt_acc->cnt_vht_crc32_ok += falm_cnt->cnt_vht_crc32_ok;2760falm_cnt_acc->cnt_crc32_error_all += falm_cnt->cnt_crc32_error_all;2761falm_cnt_acc->cnt_crc32_ok_all += falm_cnt->cnt_crc32_ok_all;27622763/*@2764*PHYDM_DBG(dm, DBG_DIG,2765* "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",2766* falm_cnt->cnt_cck_cca,2767* falm_cnt->cnt_ofdm_cca,2768* falm_cnt->cnt_cca_all);2769*PHYDM_DBG(dm, DBG_DIG,2770* "[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",2771* falm_cnt->cnt_cck_fail,2772* falm_cnt->cnt_ofdm_fail,2773* falm_cnt->cnt_all);2774*/2775if (tdma_dig_block_1sec_flag) {2776total_state_number = dm->tdma_dig_state_number;27772778if (cur_tdma_dig_state == TDMA_DIG_HIGH_STATE) {2779factor_num = total_state_number;2780factor_denum = total_state_number - 1;2781} else if (cur_tdma_dig_state == TDMA_DIG_LOW_STATE) {2782factor_num = total_state_number;2783factor_denum = 1;2784}27852786falm_cnt_acc->cnt_all_1sec =2787falm_cnt_acc->cnt_all * factor_num / factor_denum;2788falm_cnt_acc->cnt_cca_all_1sec =2789falm_cnt_acc->cnt_cca_all * factor_num / factor_denum;2790falm_cnt_acc->cnt_cck_fail_1sec =2791falm_cnt_acc->cnt_cck_fail * factor_num / factor_denum;27922793PHYDM_DBG(dm, DBG_DIG,2794"[ACC CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",2795falm_cnt_acc->cnt_cck_cca,2796falm_cnt_acc->cnt_ofdm_cca,2797falm_cnt_acc->cnt_cca_all);2798PHYDM_DBG(dm, DBG_DIG,2799"[ACC FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n\n",2800falm_cnt_acc->cnt_cck_fail,2801falm_cnt_acc->cnt_ofdm_fail,2802falm_cnt_acc->cnt_all);28032804}2805}2806#endif /*@#ifdef IS_USE_NEW_TDMA*/2807#endif /*@#ifdef PHYDM_TDMA_DIG_SUPPORT*/28082809void phydm_dig_debug(void *dm_void, char input[][16], u32 *_used, char *output,2810u32 *_out_len)2811{2812struct dm_struct *dm = (struct dm_struct *)dm_void;2813struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2814char help[] = "-h";2815u32 var1[10] = {0};2816u32 used = *_used;2817u32 out_len = *_out_len;2818u8 i = 0;28192820if ((strcmp(input[1], help) == 0)) {2821PDM_SNPF(out_len, used, output + used, out_len - used,2822"{0} {en} fa_th[0] fa_th[1] fa_th[2]\n");2823PDM_SNPF(out_len, used, output + used, out_len - used,2824"{1} {Damping Limit en}\n");2825#ifdef PHYDM_TDMA_DIG_SUPPORT2826PDM_SNPF(out_len, used, output + used, out_len - used,2827"{2} {original_dig_restore = %d}\n",2828dm->original_dig_restore);2829PDM_SNPF(out_len, used, output + used, out_len - used,2830"{3} {tdma_dig_timer_ms = %d}\n",2831dm->tdma_dig_timer_ms);2832PDM_SNPF(out_len, used, output + used, out_len - used,2833"{4} {tdma_dig_state_number = %d}\n",2834dm->tdma_dig_state_number);2835#endif2836} else {2837PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);28382839for (i = 1; i < 10; i++)2840PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);28412842if (var1[0] == 0) {2843if (var1[1] == 1) {2844dig_t->is_dbg_fa_th = true;2845dig_t->fa_th[0] = (u16)var1[2];2846dig_t->fa_th[1] = (u16)var1[3];2847dig_t->fa_th[2] = (u16)var1[4];28482849PDM_SNPF(out_len, used, output + used,2850out_len - used,2851"Set DIG fa_th[0:2]= {%d, %d, %d}\n",2852dig_t->fa_th[0], dig_t->fa_th[1],2853dig_t->fa_th[2]);2854} else {2855dig_t->is_dbg_fa_th = false;2856}2857#ifdef PHYDM_TDMA_DIG_SUPPORT2858} else if (var1[0] == 2) {2859dm->original_dig_restore = (u8)var1[1];2860if (dm->original_dig_restore == 1) {2861PDM_SNPF(out_len, used, output + used,2862out_len - used, "Disable TDMA-DIG\n");2863} else {2864PDM_SNPF(out_len, used, output + used,2865out_len - used, "Enable TDMA-DIG\n");2866}2867} else if (var1[0] == 3) {2868dm->tdma_dig_timer_ms = (u8)var1[1];2869PDM_SNPF(out_len, used, output + used,2870out_len - used, "tdma_dig_timer_ms = %d\n",2871dm->tdma_dig_timer_ms);2872} else if (var1[0] == 4) {2873dm->tdma_dig_state_number = (u8)var1[1];2874PDM_SNPF(out_len, used, output + used,2875out_len - used, "tdma_dig_state_number = %d\n",2876dm->tdma_dig_state_number);2877#endif2878}28792880#ifdef CFG_DIG_DAMPING_CHK2881else if (var1[0] == 1) {2882dig_t->dig_dl_en = (u8)var1[1];2883/*@*/2884}2885#endif2886}2887*_used = used;2888*_out_len = out_len;2889}28902891#ifdef CONFIG_MCC_DM2892#if (RTL8822B_SUPPORT || RTL8822C_SUPPORT)2893void phydm_mcc_igi_clr(void *dm_void, u8 clr_port)2894{2895struct dm_struct *dm = (struct dm_struct *)dm_void;2896struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;28972898mcc_dm->mcc_rssi[clr_port] = 0xff;2899mcc_dm->mcc_dm_val[0][clr_port] = 0xff; /* 0xc50 clr */2900mcc_dm->mcc_dm_val[1][clr_port] = 0xff; /* 0xe50 clr */2901}29022903void phydm_mcc_igi_chk(void *dm_void)2904{2905struct dm_struct *dm = (struct dm_struct *)dm_void;2906struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;29072908if (mcc_dm->mcc_dm_val[0][0] == 0xff &&2909mcc_dm->mcc_dm_val[0][1] == 0xff) {2910mcc_dm->mcc_dm_reg[0] = 0xffff;2911mcc_dm->mcc_reg_id[0] = 0xff;2912}2913if (mcc_dm->mcc_dm_val[1][0] == 0xff &&2914mcc_dm->mcc_dm_val[1][1] == 0xff) {2915mcc_dm->mcc_dm_reg[1] = 0xffff;2916mcc_dm->mcc_reg_id[1] = 0xff;2917}2918}29192920void phydm_mcc_igi_cal(void *dm_void)2921{2922struct dm_struct *dm = (struct dm_struct *)dm_void;2923struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;2924struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2925u8 shift = 0;2926u8 igi_val0, igi_val1;29272928if (mcc_dm->mcc_rssi[0] == 0xff)2929phydm_mcc_igi_clr(dm, 0);2930if (mcc_dm->mcc_rssi[1] == 0xff)2931phydm_mcc_igi_clr(dm, 1);2932phydm_mcc_igi_chk(dm);2933igi_val0 = mcc_dm->mcc_rssi[0] - shift;2934igi_val1 = mcc_dm->mcc_rssi[1] - shift;2935#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT2936phydm_fill_mcccmd(dm, 0, R_0x1d70, igi_val0, igi_val1);2937phydm_fill_mcccmd(dm, 1, R_0x1d70 + 1, igi_val0, igi_val1);2938#else2939phydm_fill_mcccmd(dm, 0, 0xc50, igi_val0, igi_val1);2940phydm_fill_mcccmd(dm, 1, 0xe50, igi_val0, igi_val1);2941#endif2942PHYDM_DBG(dm, DBG_COMP_MCC, "RSSI_min: %d %d, MCC_igi: %d %d\n",2943mcc_dm->mcc_rssi[0], mcc_dm->mcc_rssi[1],2944mcc_dm->mcc_dm_val[0][0], mcc_dm->mcc_dm_val[0][1]);2945}2946#endif /*#if (RTL8822B_SUPPORT)*/2947#endif /*#ifdef CONFIG_MCC_DM*/294829492950