Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_lna_sat.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#include "mp_precomp.h"29#include "phydm_precomp.h"3031#ifdef PHYDM_LNA_SAT_CHK_SUPPORT3233#ifdef PHYDM_LNA_SAT_CHK_TYPE134void phydm_lna_sat_chk_init(35void *dm_void)36{37struct dm_struct *dm = (struct dm_struct *)dm_void;38struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;3940PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);4142lna_info->check_time = 0;43lna_info->sat_cnt_acc_patha = 0;44lna_info->sat_cnt_acc_pathb = 0;45#ifdef PHYDM_IC_ABOVE_3SS46lna_info->sat_cnt_acc_pathc = 0;47#endif48#ifdef PHYDM_IC_ABOVE_4SS49lna_info->sat_cnt_acc_pathd = 0;50#endif51lna_info->cur_sat_status = 0;52lna_info->pre_sat_status = 0;53lna_info->cur_timer_check_cnt = 0;54lna_info->pre_timer_check_cnt = 0;5556#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)57if (dm->support_ic_type &58(ODM_RTL8198F | ODM_RTL8814B))59phydm_lna_sat_chk_bb_init(dm);60#endif61}6263#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)64void phydm_lna_sat_chk_bb_init(void *dm_void)65{66struct dm_struct *dm = (struct dm_struct *)dm_void;67struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;6869boolean disable_bb_switch_tab = false;7071PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);7273/*@set table switch mux r_6table_sel_anten*/74odm_set_bb_reg(dm, 0x18ac, BIT(8), 0);7576/*@tab decision when idle*/77odm_set_bb_reg(dm, 0x18ac, BIT(16), disable_bb_switch_tab);78odm_set_bb_reg(dm, 0x41ac, BIT(16), disable_bb_switch_tab);79odm_set_bb_reg(dm, 0x52ac, BIT(16), disable_bb_switch_tab);80odm_set_bb_reg(dm, 0x53ac, BIT(16), disable_bb_switch_tab);81/*@tab decision when ofdmcca*/82odm_set_bb_reg(dm, 0x18ac, BIT(17), disable_bb_switch_tab);83odm_set_bb_reg(dm, 0x41ac, BIT(17), disable_bb_switch_tab);84odm_set_bb_reg(dm, 0x52ac, BIT(17), disable_bb_switch_tab);85odm_set_bb_reg(dm, 0x53ac, BIT(17), disable_bb_switch_tab);86}8788void phydm_set_ofdm_agc_tab_path(89void *dm_void,90u8 tab_sel,91enum rf_path path)92{93struct dm_struct *dm = (struct dm_struct *)dm_void;9495PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);96if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B)) {97PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "set AGC Tab%d\n", tab_sel);98PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "r_6table_sel_anten = 0x%x\n",99odm_get_bb_reg(dm, 0x18ac, BIT(8)));100}101102if (dm->support_ic_type & ODM_RTL8198F) {103/*@table sel:0/2, mapping 2 to 1 */104if (tab_sel == OFDM_AGC_TAB_0) {105odm_set_bb_reg(dm, 0x18ac, BIT(4), 0);106odm_set_bb_reg(dm, 0x41ac, BIT(4), 0);107odm_set_bb_reg(dm, 0x52ac, BIT(4), 0);108odm_set_bb_reg(dm, 0x53ac, BIT(4), 0);109} else if (tab_sel == OFDM_AGC_TAB_2) {110odm_set_bb_reg(dm, 0x18ac, BIT(4), 1);111odm_set_bb_reg(dm, 0x41ac, BIT(4), 1);112odm_set_bb_reg(dm, 0x52ac, BIT(4), 1);113odm_set_bb_reg(dm, 0x53ac, BIT(4), 1);114} else {115odm_set_bb_reg(dm, 0x18ac, BIT(4), 0);116odm_set_bb_reg(dm, 0x41ac, BIT(4), 0);117odm_set_bb_reg(dm, 0x52ac, BIT(4), 0);118odm_set_bb_reg(dm, 0x53ac, BIT(4), 0);119}120} else if (dm->support_ic_type & ODM_RTL8814B) {121if (tab_sel == OFDM_AGC_TAB_0) {122odm_set_bb_reg(dm, 0x18ac, 0xf0, 0);123odm_set_bb_reg(dm, 0x41ac, 0xf0, 0);124odm_set_bb_reg(dm, 0x52ac, 0xf0, 0);125odm_set_bb_reg(dm, 0x53ac, 0xf0, 0);126} else if (tab_sel == OFDM_AGC_TAB_2) {127odm_set_bb_reg(dm, 0x18ac, 0xf0, 2);128odm_set_bb_reg(dm, 0x41ac, 0xf0, 2);129odm_set_bb_reg(dm, 0x52ac, 0xf0, 2);130odm_set_bb_reg(dm, 0x53ac, 0xf0, 2);131} else {132odm_set_bb_reg(dm, 0x18ac, 0xf0, 0);133odm_set_bb_reg(dm, 0x41ac, 0xf0, 0);134odm_set_bb_reg(dm, 0x52ac, 0xf0, 0);135odm_set_bb_reg(dm, 0x53ac, 0xf0, 0);136}137}138}139140u8 phydm_get_ofdm_agc_tab_path(141void *dm_void,142enum rf_path path)143{144struct dm_struct *dm = (struct dm_struct *)dm_void;145u8 tab_sel = 0;146147if (dm->support_ic_type & ODM_RTL8198F) {148tab_sel = (u8)odm_get_bb_reg(dm, R_0x18ac, BIT(4));149if (tab_sel == 0)150tab_sel = OFDM_AGC_TAB_0;151else if (tab_sel == 1)152tab_sel = OFDM_AGC_TAB_2;153} else if (dm->support_ic_type & ODM_RTL8814B) {154tab_sel = (u8)odm_get_bb_reg(dm, R_0x18ac, 0xf0);155if (tab_sel == 0)156tab_sel = OFDM_AGC_TAB_0;157else if (tab_sel == 2)158tab_sel = OFDM_AGC_TAB_2;159}160PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "get path %d AGC Tab %d\n",161path, tab_sel);162return tab_sel;163}164#endif /*@#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)*/165166void phydm_set_ofdm_agc_tab(167void *dm_void,168u8 tab_sel)169{170struct dm_struct *dm = (struct dm_struct *)dm_void;171172/*@table sel:0/2, 1 is used for CCK */173if (tab_sel == OFDM_AGC_TAB_0)174odm_set_bb_reg(dm, R_0xc70, 0x1e00, OFDM_AGC_TAB_0);175else if (tab_sel == OFDM_AGC_TAB_2)176odm_set_bb_reg(dm, R_0xc70, 0x1e00, OFDM_AGC_TAB_2);177else178odm_set_bb_reg(dm, R_0xc70, 0x1e00, OFDM_AGC_TAB_0);179}180181u8 phydm_get_ofdm_agc_tab(182void *dm_void)183{184struct dm_struct *dm = (struct dm_struct *)dm_void;185186return (u8)odm_get_bb_reg(dm, R_0xc70, 0x1e00);187}188189void phydm_lna_sat_chk(190void *dm_void)191{192struct dm_struct *dm = (struct dm_struct *)dm_void;193struct phydm_dig_struct *dig_t = &dm->dm_dig_table;194struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;195u8 igi_rssi_min;196u8 rssi_min = dm->rssi_min;197u32 sat_status_a, sat_status_b;198#ifdef PHYDM_IC_ABOVE_3SS199u32 sat_status_c;200#endif201#ifdef PHYDM_IC_ABOVE_4SS202u32 sat_status_d;203#endif204u8 igi_restore = dig_t->cur_ig_value;205u8 i, chk_cnt = lna_info->chk_cnt;206u32 lna_sat_cnt_thd = 0;207u8 agc_tab;208u32 max_check_time = 0;209/*@use rssi_max if rssi_min is not stable;*/210/*@rssi_min = dm->rssi_max;*/211212PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n%s ==>\n", __func__);213214if (!(dm->support_ability & ODM_BB_LNA_SAT_CHK)) {215PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "Func disable\n");216return;217}218219if (lna_info->is_disable_lna_sat_chk) {220phydm_lna_sat_chk_init(dm);221PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "disable_lna_sat_chk\n");222return;223}224225/*@move igi to target pin of rssi_min */226if (rssi_min == 0 || rssi_min == 0xff) {227PHYDM_DBG(dm, DBG_LNA_SAT_CHK,228"rssi_min=%d, set AGC Tab0\n", rssi_min);229/*@adapt agc table 0*/230phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);231phydm_lna_sat_chk_init(dm);232return;233} else if (rssi_min % 2 != 0) {234igi_rssi_min = rssi_min + DIFF_RSSI_TO_IGI - 1;235} else {236igi_rssi_min = rssi_min + DIFF_RSSI_TO_IGI;237}238239if ((lna_info->chk_period > 0) && (lna_info->chk_period <= ONE_SEC_MS))240max_check_time = chk_cnt * (ONE_SEC_MS / (lna_info->chk_period)) * 5;241else242max_check_time = chk_cnt * 5;243244lna_sat_cnt_thd = (max_check_time * lna_info->chk_duty_cycle) / 100;245246PHYDM_DBG(dm, DBG_LNA_SAT_CHK,247"check_time=%d, rssi_min=%d, igi_rssi_min=0x%x\nchk_cnt=%d, chk_period=%d, max_check_time=%d, lna_sat_cnt_thd=%d\n",248lna_info->check_time,249rssi_min,250igi_rssi_min,251chk_cnt,252lna_info->chk_period,253max_check_time,254lna_sat_cnt_thd);255256odm_write_dig(dm, igi_rssi_min);257258/*@adapt agc table 0 check saturation status*/259#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)260if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))261phydm_set_ofdm_agc_tab_path(dm, OFDM_AGC_TAB_0, RF_PATH_A);262else263#endif264phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);265/*@open rf power detection ckt & set detection range */266#if (RTL8198F_SUPPORT)267if (dm->support_ic_type & ODM_RTL8198F) {268/*@set rf detection range (threshold)*/269config_phydm_write_rf_reg_8198f(dm, RF_PATH_A, 0x85,2700x3f, 0x3f);271config_phydm_write_rf_reg_8198f(dm, RF_PATH_B, 0x85,2720x3f, 0x3f);273config_phydm_write_rf_reg_8198f(dm, RF_PATH_C, 0x85,2740x3f, 0x3f);275config_phydm_write_rf_reg_8198f(dm, RF_PATH_D, 0x85,2760x3f, 0x3f);277/*@open rf power detection ckt*/278config_phydm_write_rf_reg_8198f(dm, RF_PATH_A, 0x86, 0x10, 1);279config_phydm_write_rf_reg_8198f(dm, RF_PATH_B, 0x86, 0x10, 1);280config_phydm_write_rf_reg_8198f(dm, RF_PATH_C, 0x86, 0x10, 1);281config_phydm_write_rf_reg_8198f(dm, RF_PATH_D, 0x86, 0x10, 1);282}283#elif (RTL8814B_SUPPORT)284if (dm->support_ic_type & ODM_RTL8814B) {285/*@set rf detection range (threshold)*/286config_phydm_write_rf_reg_8814b(dm, RF_PATH_A, 0x8B, 0x3, 0x3);287config_phydm_write_rf_reg_8814b(dm, RF_PATH_B, 0x8B, 0x3, 0x3);288config_phydm_write_rf_reg_8814b(dm, RF_PATH_C, 0x8B, 0x3, 0x3);289config_phydm_write_rf_reg_8814b(dm, RF_PATH_D, 0x8B, 0x3, 0x3);290/*@open rf power detection ckt*/291config_phydm_write_rf_reg_8814b(dm, RF_PATH_A, 0x8B, 0x4, 1);292config_phydm_write_rf_reg_8814b(dm, RF_PATH_B, 0x8B, 0x4, 1);293config_phydm_write_rf_reg_8814b(dm, RF_PATH_C, 0x8B, 0x4, 1);294config_phydm_write_rf_reg_8814b(dm, RF_PATH_D, 0x8B, 0x4, 1);295}296#else297odm_set_rf_reg(dm, RF_PATH_A, RF_0x86, 0x1f, 0x10);298odm_set_rf_reg(dm, RF_PATH_B, RF_0x86, 0x1f, 0x10);299#ifdef PHYDM_IC_ABOVE_3SS300odm_set_rf_reg(dm, RF_PATH_C, RF_0x86, 0x1f, 0x10);301#endif302#ifdef PHYDM_IC_ABOVE_4SS303odm_set_rf_reg(dm, RF_PATH_D, RF_0x86, 0x1f, 0x10);304#endif305#endif306307/*@check saturation status*/308for (i = 0; i < chk_cnt; i++) {309#if (RTL8198F_SUPPORT)310if (dm->support_ic_type & ODM_RTL8198F) {311sat_status_a = config_phydm_read_rf_reg_8198f(dm, RF_PATH_A,312RF_0xae,3130xe0000);314sat_status_b = config_phydm_read_rf_reg_8198f(dm, RF_PATH_B,315RF_0xae,3160xe0000);317sat_status_c = config_phydm_read_rf_reg_8198f(dm, RF_PATH_C,318RF_0xae,3190xe0000);320sat_status_d = config_phydm_read_rf_reg_8198f(dm, RF_PATH_D,321RF_0xae,3220xe0000);323}324#elif (RTL8814B_SUPPORT)325if (dm->support_ic_type & ODM_RTL8814B) {326/*@read peak detector info from 8814B rf reg*/327sat_status_a = config_phydm_read_rf_reg_8814b(dm, RF_PATH_A,328RF_0xae,3290xc0000);330sat_status_b = config_phydm_read_rf_reg_8814b(dm, RF_PATH_B,331RF_0xae,3320xc0000);333sat_status_c = config_phydm_read_rf_reg_8814b(dm, RF_PATH_C,334RF_0xae,3350xc0000);336sat_status_d = config_phydm_read_rf_reg_8814b(dm, RF_PATH_D,337RF_0xae,3380xc0000);339}340#else341sat_status_a = odm_get_rf_reg(dm, RF_PATH_A, RF_0xae, 0xc0000);342sat_status_b = odm_get_rf_reg(dm, RF_PATH_B, RF_0xae, 0xc0000);343#ifdef PHYDM_IC_ABOVE_3SS344sat_status_c = odm_get_rf_reg(dm, RF_PATH_C, RF_0xae, 0xc0000);345#endif346#ifdef PHYDM_IC_ABOVE_4SS347sat_status_d = odm_get_rf_reg(dm, RF_PATH_D, RF_0xae, 0xc0000);348#endif349#endif350351if (sat_status_a != 0)352lna_info->sat_cnt_acc_patha++;353if (sat_status_b != 0)354lna_info->sat_cnt_acc_pathb++;355#ifdef PHYDM_IC_ABOVE_3SS356if (sat_status_c != 0)357lna_info->sat_cnt_acc_pathc++;358#endif359#ifdef PHYDM_IC_ABOVE_4SS360if (sat_status_d != 0)361lna_info->sat_cnt_acc_pathd++;362#endif363364if (lna_info->sat_cnt_acc_patha >= lna_sat_cnt_thd ||365lna_info->sat_cnt_acc_pathb >= lna_sat_cnt_thd ||366#ifdef PHYDM_IC_ABOVE_3SS367lna_info->sat_cnt_acc_pathc >= lna_sat_cnt_thd ||368#endif369#ifdef PHYDM_IC_ABOVE_4SS370lna_info->sat_cnt_acc_pathd >= lna_sat_cnt_thd ||371#endif3720) {373lna_info->cur_sat_status = 1;374PHYDM_DBG(dm, DBG_LNA_SAT_CHK,375"cur_sat_status=%d, check_time=%d\n",376lna_info->cur_sat_status,377lna_info->check_time);378break;379}380lna_info->cur_sat_status = 0;381}382383PHYDM_DBG(dm, DBG_LNA_SAT_CHK,384"cur_sat_status=%d, pre_sat_status=%d, sat_cnt_acc_patha=%d, sat_cnt_acc_pathb=%d\n",385lna_info->cur_sat_status,386lna_info->pre_sat_status,387lna_info->sat_cnt_acc_patha,388lna_info->sat_cnt_acc_pathb);389390#ifdef PHYDM_IC_ABOVE_4SS391PHYDM_DBG(dm, DBG_LNA_SAT_CHK,392"cur_sat_status=%d, pre_sat_status=%d, sat_cnt_acc_pathc=%d, sat_cnt_acc_pathd=%d\n",393lna_info->cur_sat_status,394lna_info->pre_sat_status,395lna_info->sat_cnt_acc_pathc,396lna_info->sat_cnt_acc_pathd);397#endif398/*@agc table decision*/399if (lna_info->cur_sat_status) {400if (!lna_info->dis_agc_table_swh)401#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)402if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))403phydm_set_ofdm_agc_tab_path(dm,404OFDM_AGC_TAB_2,405RF_PATH_A);406else407#endif408phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_2);409else410PHYDM_DBG(dm, DBG_LNA_SAT_CHK,411"disable set to AGC Tab%d\n", OFDM_AGC_TAB_2);412lna_info->check_time = 0;413lna_info->sat_cnt_acc_patha = 0;414lna_info->sat_cnt_acc_pathb = 0;415#ifdef PHYDM_IC_ABOVE_3SS416lna_info->sat_cnt_acc_pathc = 0;417#endif418#ifdef PHYDM_IC_ABOVE_4SS419lna_info->sat_cnt_acc_pathd = 0;420#endif421lna_info->pre_sat_status = lna_info->cur_sat_status;422423} else if (lna_info->check_time <= (max_check_time - 1)) {424if (lna_info->pre_sat_status && !lna_info->dis_agc_table_swh)425#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)426if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))427phydm_set_ofdm_agc_tab_path(dm,428OFDM_AGC_TAB_2,429RF_PATH_A);430else431#endif432phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_2);433434PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ckeck time not reached\n");435if (lna_info->dis_agc_table_swh)436PHYDM_DBG(dm, DBG_LNA_SAT_CHK,437"disable set to AGC Tab%d\n", OFDM_AGC_TAB_2);438lna_info->check_time++;439440} else if (lna_info->check_time >= max_check_time) {441if (!lna_info->dis_agc_table_swh)442#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)443if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))444phydm_set_ofdm_agc_tab_path(dm,445OFDM_AGC_TAB_0,446RF_PATH_A);447else448#endif449phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);450451PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ckeck time reached\n");452if (lna_info->dis_agc_table_swh)453PHYDM_DBG(dm, DBG_LNA_SAT_CHK,454"disable set to AGC Tab%d\n", OFDM_AGC_TAB_0);455lna_info->check_time = 0;456lna_info->sat_cnt_acc_patha = 0;457lna_info->sat_cnt_acc_pathb = 0;458#ifdef PHYDM_IC_ABOVE_3SS459lna_info->sat_cnt_acc_pathc = 0;460#endif461#ifdef PHYDM_IC_ABOVE_4SS462lna_info->sat_cnt_acc_pathd = 0;463#endif464lna_info->pre_sat_status = lna_info->cur_sat_status;465}466467#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)468if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))469agc_tab = phydm_get_ofdm_agc_tab_path(dm, RF_PATH_A);470else471#endif472agc_tab = phydm_get_ofdm_agc_tab(dm);473474PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "use AGC tab %d\n", agc_tab);475476/*@restore previous igi*/477odm_write_dig(dm, igi_restore);478lna_info->cur_timer_check_cnt++;479odm_set_timer(dm, &lna_info->phydm_lna_sat_chk_timer,480lna_info->chk_period);481}482483void phydm_lna_sat_chk_callback(484void *dm_void485486)487{488struct dm_struct *dm = (struct dm_struct *)dm_void;489490PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n%s ==>\n", __func__);491phydm_lna_sat_chk(dm);492}493494void phydm_lna_sat_chk_timers(495void *dm_void,496u8 state)497{498struct dm_struct *dm = (struct dm_struct *)dm_void;499struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;500501if (state == INIT_LNA_SAT_CHK_TIMMER) {502odm_initialize_timer(dm,503&lna_info->phydm_lna_sat_chk_timer,504(void *)phydm_lna_sat_chk_callback, NULL,505"phydm_lna_sat_chk_timer");506} else if (state == CANCEL_LNA_SAT_CHK_TIMMER) {507odm_cancel_timer(dm, &lna_info->phydm_lna_sat_chk_timer);508} else if (state == RELEASE_LNA_SAT_CHK_TIMMER) {509odm_release_timer(dm, &lna_info->phydm_lna_sat_chk_timer);510}511}512513void phydm_lna_sat_chk_watchdog_type1(514void *dm_void)515{516struct dm_struct *dm = (struct dm_struct *)dm_void;517struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;518519u8 rssi_min = dm->rssi_min;520521PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n%s ==>\n", __func__);522523if (!(dm->support_ability & ODM_BB_LNA_SAT_CHK)) {524PHYDM_DBG(dm, DBG_LNA_SAT_CHK,525"func disable\n");526return;527}528529PHYDM_DBG(dm, DBG_LNA_SAT_CHK,530"pre_timer_check_cnt=%d, cur_timer_check_cnt=%d\n",531lna_info->pre_timer_check_cnt,532lna_info->cur_timer_check_cnt);533534if (lna_info->is_disable_lna_sat_chk) {535phydm_lna_sat_chk_init(dm);536PHYDM_DBG(dm, DBG_LNA_SAT_CHK,537"is_disable_lna_sat_chk=%d, return\n",538lna_info->is_disable_lna_sat_chk);539return;540}541542if (!(dm->support_ic_type &543(ODM_RTL8197F | ODM_RTL8198F | ODM_RTL8814B))) {544PHYDM_DBG(dm, DBG_LNA_SAT_CHK,545"support_ic_type not 97F/98F/14B, return\n");546return;547}548549if (rssi_min == 0 || rssi_min == 0xff) {550/*@adapt agc table 0 */551phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);552phydm_lna_sat_chk_init(dm);553PHYDM_DBG(dm, DBG_LNA_SAT_CHK,554"rssi_min=%d, return\n", rssi_min);555return;556}557558if (lna_info->cur_timer_check_cnt == lna_info->pre_timer_check_cnt) {559PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "fail, restart timer\n");560odm_set_timer(dm, &lna_info->phydm_lna_sat_chk_timer,561lna_info->chk_period);562} else {563PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "Timer check pass\n");564}565lna_info->pre_timer_check_cnt = lna_info->cur_timer_check_cnt;566}567568#endif /*@#ifdef PHYDM_LNA_SAT_CHK_TYPE1*/569570#ifdef PHYDM_LNA_SAT_CHK_TYPE2571572void phydm_bubble_sort(573void *dm_void,574u8 *array,575u16 array_length)576{577struct dm_struct *dm = (struct dm_struct *)dm_void;578u16 i, j;579u8 temp;580581PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);582for (i = 0; i < (array_length - 1); i++) {583for (j = (i + 1); j < (array_length); j++) {584if (array[i] > array[j]) {585temp = array[i];586array[i] = array[j];587array[j] = temp;588}589}590}591}592593void phydm_lna_sat_chk_type2_init(594void *dm_void)595{596struct dm_struct *dm = (struct dm_struct *)dm_void;597struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;598u8 real_shift = pinfo->total_bit_shift;599600PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);601602pinfo->total_cnt_snr = 1 << real_shift;603pinfo->is_sm_done = TRUE;604pinfo->is_snr_done = FALSE;605pinfo->cur_snr_mean = 0;606pinfo->cur_snr_var = 0;607pinfo->cur_lower_snr_mean = 0;608pinfo->pre_snr_mean = 0;609pinfo->pre_snr_var = 0;610pinfo->pre_lower_snr_mean = 0;611pinfo->nxt_state = ORI_TABLE_MONITOR;612pinfo->pre_state = ORI_TABLE_MONITOR;613}614615void phydm_snr_collect(616void *dm_void,617u8 rx_snr)618{619struct dm_struct *dm = (struct dm_struct *)dm_void;620struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;621622if (pinfo->is_sm_done) {623#if 0624/*PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);*/625#endif626627/* @adapt only path-A for calculation */628pinfo->snr_statistic[pinfo->cnt_snr_statistic] = rx_snr;629630if (pinfo->cnt_snr_statistic == (pinfo->total_cnt_snr - 1)) {631pinfo->is_snr_done = TRUE;632pinfo->cnt_snr_statistic = 0;633} else {634pinfo->cnt_snr_statistic++;635}636} else {637return;638}639}640641void phydm_parsing_snr(void *dm_void, void *pktinfo_void, s8 *rx_snr)642{643struct dm_struct *dm = (struct dm_struct *)dm_void;644struct phydm_lna_sat_t *lna_t = &dm->dm_lna_sat_info;645struct phydm_perpkt_info_struct *pktinfo = NULL;646u8 target_macid = dm->rssi_min_macid;647648if (!(dm->support_ability & ODM_BB_LNA_SAT_CHK))649return;650651pktinfo = (struct phydm_perpkt_info_struct *)pktinfo_void;652653if (!pktinfo->is_packet_match_bssid)654return;655656if (lna_t->force_traget_macid != 0)657target_macid = lna_t->force_traget_macid;658659if (target_macid != pktinfo->station_id)660return;661662phydm_snr_collect(dm, rx_snr[0]); /*path-A B C D???*/663}664665void phydm_snr_data_processing(666void *dm_void)667{668struct dm_struct *dm = (struct dm_struct *)dm_void;669struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;670u8 real_shift = pinfo->total_bit_shift;671u16 total_snr_cnt = pinfo->total_cnt_snr;672u16 total_loop_cnt = (total_snr_cnt - 1), i;673u32 temp;674u32 sum_snr_statistic = 0;675676PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);677PHYDM_DBG(dm, DBG_LNA_SAT_CHK,678"total_loop_cnt=%d\n", total_loop_cnt);679680for (i = 0; (i <= total_loop_cnt); i++) {681if (pinfo->is_snr_detail_en) {682PHYDM_DBG(dm, DBG_LNA_SAT_CHK,683"snr[%d]=%d\n", i, pinfo->snr_statistic[i]);684}685686sum_snr_statistic += (u32)(pinfo->snr_statistic[i]);687688pinfo->snr_statistic_sqr[i] = (u16)(pinfo->snr_statistic[i] * pinfo->snr_statistic[i]);689}690691phydm_bubble_sort(dm, pinfo->snr_statistic, pinfo->total_cnt_snr);692693/*update SNR's cur mean*/694pinfo->cur_snr_mean = (sum_snr_statistic >> real_shift);695696for (i = 0; (i <= total_loop_cnt); i++) {697if (pinfo->snr_statistic[i] >= pinfo->cur_snr_mean)698temp = pinfo->snr_statistic[i] - pinfo->cur_snr_mean;699else700temp = pinfo->cur_snr_mean - pinfo->snr_statistic[i];701702pinfo->cur_snr_var += (temp * temp);703}704705/*update SNR's VAR*/706pinfo->cur_snr_var = (pinfo->cur_snr_var >> real_shift);707708/*@acquire lower SNR's statistics*/709temp = 0;710pinfo->cnt_lower_snr_statistic = (total_snr_cnt >> pinfo->lwr_snr_ratio_bit_shift);711pinfo->cnt_lower_snr_statistic = MAX_2(pinfo->cnt_lower_snr_statistic, SNR_RPT_MAX);712713for (i = 0; i < pinfo->cnt_lower_snr_statistic; i++)714temp += pinfo->snr_statistic[i];715716pinfo->cur_lower_snr_mean = temp >> (real_shift - pinfo->lwr_snr_ratio_bit_shift);717}718719boolean phydm_is_snr_improve(720void *dm_void)721{722struct dm_struct *dm = (struct dm_struct *)dm_void;723struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;724boolean is_snr_improve;725u8 cur_state = pinfo->nxt_state;726u32 cur_mean = pinfo->cur_snr_mean;727u32 pre_mean = pinfo->pre_snr_mean;728u32 cur_lower_mean = pinfo->cur_lower_snr_mean;729u32 pre_lower_mean = pinfo->pre_lower_snr_mean;730u32 cur_var = pinfo->cur_snr_var;731732/*special case, zero VAR, interference is gone*/733/*@make sure pre_var is larger enough*/734if (cur_state == SAT_TABLE_MONITOR ||735cur_state == ORI_TABLE_TRAINING) {736if (cur_mean >= pre_mean) {737if (cur_var == 0)738return true;739}740}741#if 0742/*special case, mean degrade less than VAR improvement*/743/*@make sure pre_var is larger enough*/744if (cur_state == ORI_TABLE_MONITOR &&745cur_mean < pre_mean &&746cur_var < pre_var) {747diff_mean = pre_mean - cur_mean;748diff_var = pre_var - cur_var;749return (diff_var > (2 * diff_mean * diff_mean)) ? true : false;750}751752#endif753if (cur_lower_mean >= (pre_lower_mean + pinfo->delta_snr_mean))754is_snr_improve = true;755else756is_snr_improve = false;757#if 0758/* @condition refine, mean is bigger enough or VAR is smaller enough*/759/* @1. from mean's view, mean improve delta_snr_mean(2), VAR not degrade lot*/760if (cur_mean > (pre_mean + pinfo->delta_snr_mean)) {761is_mean_improve = TRUE;762is_var_improve = (cur_var <= pre_var + dm->delta_snr_var)763? TRUE : FALSE;764765} else if (cur_var + dm->delta_snr_var <= pre_var) {766is_var_improve = TRUE;767is_mean_improve = ((cur_mean + 1) >= pre_mean) ? TRUE : FALSE;768} else {769return false;770}771#endif772return is_snr_improve;773}774775boolean phydm_is_snr_degrade(776void *dm_void)777{778struct dm_struct *dm = (struct dm_struct *)dm_void;779struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;780u32 cur_lower_mean = pinfo->cur_lower_snr_mean;781u32 pre_lower_mean = pinfo->pre_lower_snr_mean;782boolean is_degrade;783784if (cur_lower_mean <= (pre_lower_mean - pinfo->delta_snr_mean))785is_degrade = TRUE;786else787is_degrade = FALSE;788#if 0789is_mean_dgrade = (pinfo->cur_snr_mean + pinfo->delta_snr_mean <= pinfo->pre_snr_mean) ? TRUE : FALSE;790is_var_degrade = (pinfo->cur_snr_var > (pinfo->pre_snr_var + pinfo->delta_snr_mean)) ? TRUE : FALSE;791792PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s: cur_mean=%d, pre_mean=%d, cur_var=%d, pre_var=%d\n",793__func__,794pinfo->cur_snr_mean,795pinfo->pre_snr_mean,796pinfo->cur_snr_var,797pinfo->pre_snr_var);798799return (is_mean_dgrade & is_var_degrade);800#endif801return is_degrade;802}803804boolean phydm_is_large_var(805void *dm_void)806{807struct dm_struct *dm = (struct dm_struct *)dm_void;808struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;809boolean is_large_var = (pinfo->cur_snr_var >= pinfo->snr_var_thd) ? TRUE : FALSE;810811return is_large_var;812}813814void phydm_update_pre_status(815void *dm_void)816{817struct dm_struct *dm = (struct dm_struct *)dm_void;818struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;819820pinfo->pre_lower_snr_mean = pinfo->cur_lower_snr_mean;821pinfo->pre_snr_mean = pinfo->cur_snr_mean;822pinfo->pre_snr_var = pinfo->cur_snr_var;823}824825void phydm_ori_table_monitor(826void *dm_void)827{828struct dm_struct *dm = (struct dm_struct *)dm_void;829struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;830831if (phydm_is_large_var(dm)) {832pinfo->nxt_state = SAT_TABLE_TRAINING;833config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);834} else {835pinfo->nxt_state = ORI_TABLE_MONITOR;836/*switch to anti-sat table*/837config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);838}839phydm_update_pre_status(dm);840pinfo->pre_state = ORI_TABLE_MONITOR;841}842843void phydm_sat_table_training(844void *dm_void)845{846struct dm_struct *dm = (struct dm_struct *)dm_void;847struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;848849#if 0850if pre_state = ORI_TABLE_MONITOR || SAT_TABLE_TRY_FAIL,851/*@"pre" adapt ori-table, "cur" adapt sat-table*/852/*@adapt ori table*/853if (pinfo->pre_state == ORI_TABLE_MONITOR) {854pinfo->nxt_state = SAT_TABLE_TRAINING;855config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);856} else {857#endif858if (phydm_is_snr_improve(dm)) {859pinfo->nxt_state = SAT_TABLE_MONITOR;860} else {861pinfo->nxt_state = SAT_TABLE_TRY_FAIL;862config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);863}864/*@}*/865866phydm_update_pre_status(dm);867pinfo->pre_state = SAT_TABLE_TRAINING;868}869870void phydm_sat_table_try_fail(871void *dm_void)872{873struct dm_struct *dm = (struct dm_struct *)dm_void;874struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;875876/* @if pre_state = SAT_TABLE_TRAINING, "pre" adapt sat-table, "cur" adapt ori-table */877/* @if pre_state = SAT_TABLE_TRY_FAIL, "pre" adapt ori-table, "cur" adapt ori-table */878879if (phydm_is_large_var(dm)) {880if (phydm_is_snr_degrade(dm)) {881pinfo->nxt_state = SAT_TABLE_TRAINING;882config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);883} else {884pinfo->nxt_state = SAT_TABLE_TRY_FAIL;885}886} else {887pinfo->nxt_state = ORI_TABLE_MONITOR;888}889phydm_update_pre_status(dm);890pinfo->pre_state = SAT_TABLE_TRY_FAIL;891}892893void phydm_sat_table_monitor(894void *dm_void)895{896struct dm_struct *dm = (struct dm_struct *)dm_void;897struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;898899if (phydm_is_snr_improve(dm)) {900pinfo->sat_table_monitor_times = 0;901902/* @if pre_state = SAT_TABLE_MONITOR, "pre" adapt sat-table, "cur" adapt sat-table */903if (pinfo->pre_state == SAT_TABLE_MONITOR) {904pinfo->nxt_state = ORI_TABLE_TRAINING;905config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);906//phydm_update_pre_status(dm);907} else {908pinfo->nxt_state = SAT_TABLE_MONITOR;909}910911/* @if pre_state = SAT_TABLE_TRAINING, "pre" adapt sat-table, "cur" adapt sat-table */912/* @if pre_state = ORI_TABLE_TRAINING, "pre" adapt ori-table, "cur" adapt sat-table */913/*pre_state above is no need to update*/914} else {915if (pinfo->sat_table_monitor_times == pinfo->force_change_period) {916PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s: sat_table_monitor_times=%d\n",917__func__, pinfo->sat_table_monitor_times);918919pinfo->nxt_state = ORI_TABLE_TRAINING;920pinfo->sat_table_monitor_times = 0;921config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);922} else {923pinfo->nxt_state = SAT_TABLE_MONITOR;924pinfo->sat_table_monitor_times++;925}926}927phydm_update_pre_status(dm);928pinfo->pre_state = SAT_TABLE_MONITOR;929}930931void phydm_ori_table_training(932void *dm_void)933{934struct dm_struct *dm = (struct dm_struct *)dm_void;935struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;936937/* pre_state = SAT_TABLE_MONITOR, "pre" adapt sat-table, "cur" adapt ori-table */938939if (phydm_is_snr_degrade(dm) == FALSE) {940pinfo->nxt_state = ORI_TABLE_MONITOR;941} else {942if (pinfo->pre_snr_var == 0)943pinfo->nxt_state = ORI_TABLE_TRY_FAIL;944else945pinfo->nxt_state = SAT_TABLE_MONITOR;946947config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);948}949phydm_update_pre_status(dm);950pinfo->pre_state = ORI_TABLE_TRAINING;951}952953void phydm_ori_table_try_fail(954void *dm_void)955{956struct dm_struct *dm = (struct dm_struct *)dm_void;957struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;958959if (pinfo->pre_state == ORI_TABLE_TRY_FAIL) {960if (phydm_is_snr_improve(dm)) {961pinfo->nxt_state = ORI_TABLE_TRAINING;962pinfo->ori_table_try_fail_times = 0;963config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);964} else {965if (pinfo->ori_table_try_fail_times == pinfo->force_change_period) {966PHYDM_DBG(dm, DBG_LNA_SAT_CHK,967"%s: ori_table_try_fail_times=%d\n", __func__, pinfo->ori_table_try_fail_times);968969pinfo->nxt_state = ORI_TABLE_TRY_FAIL;970pinfo->ori_table_try_fail_times = 0;971phydm_update_pre_status(dm);972} else {973pinfo->nxt_state = ORI_TABLE_TRY_FAIL;974pinfo->ori_table_try_fail_times++;975phydm_update_pre_status(dm);976//config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);977}978}979} else {980pinfo->nxt_state = ORI_TABLE_TRY_FAIL;981pinfo->ori_table_try_fail_times = 0;982phydm_update_pre_status(dm);983//config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);984}985986#if 0987if (phydm_is_large_var(dm)) {988if (phydm_is_snr_degrade(dm)) {989pinfo->nxt_state = SAT_TABLE_TRAINING;990config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);991} else {992pinfo->nxt_state = SAT_TABLE_TRY_FAIL;993}994} else {995pinfo->nxt_state = ORI_TABLE_MONITOR;996}997998phydm_update_pre_status(dm);999#endif1000pinfo->pre_state = ORI_TABLE_TRY_FAIL;1001}10021003char *phydm_lna_sat_state_msg(1004void *dm_void,1005IN u8 state)1006{1007char *dbg_message;10081009switch (state) {1010case ORI_TABLE_MONITOR:1011dbg_message = "ORI_TABLE_MONITOR";1012break;10131014case SAT_TABLE_TRAINING:1015dbg_message = "SAT_TABLE_TRAINING";1016break;10171018case SAT_TABLE_TRY_FAIL:1019dbg_message = "SAT_TABLE_TRY_FAIL";1020break;10211022case SAT_TABLE_MONITOR:1023dbg_message = "SAT_TABLE_MONITOR";1024break;10251026case ORI_TABLE_TRAINING:1027dbg_message = "ORI_TABLE_TRAINING";1028break;10291030case ORI_TABLE_TRY_FAIL:1031dbg_message = "ORI_TABLE_TRY_FAIL";1032break;10331034default:1035dbg_message = "ORI_TABLE_MONITOR";1036break;1037}10381039return dbg_message;1040}10411042void phydm_lna_sat_type2_sm(1043void *dm_void)1044{1045struct dm_struct *dm = (struct dm_struct *)dm_void;1046struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;1047u8 state = pinfo->nxt_state;1048u8 agc_tab = (u8)odm_get_bb_reg(dm, 0x958, 0x1f);1049char *dbg_message, *nxt_dbg_message;1050u8 real_shift = pinfo->total_bit_shift;10511052PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n\n%s ==>\n", __func__);10531054if ((dm->support_ic_type & ODM_RTL8822B) == FALSE) {1055PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ODM_BB_LNA_SAT_CHK_TYPE2 only support 22B.\n");1056return;1057}10581059if ((dm->support_ability & ODM_BB_LNA_SAT_CHK) == FALSE) {1060phydm_lna_sat_chk_type2_init(dm);1061PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ODM_BB_LNA_SAT_CHK_TYPE2 is NOT supported, cur table=%d\n", agc_tab);1062return;1063}10641065if (pinfo->is_snr_done)1066phydm_snr_data_processing(dm);1067else1068return;10691070PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "cur agc table %d\n", agc_tab);10711072if (pinfo->is_force_lna_sat_table != AUTO_AGC_TABLE) {1073/*reset state machine*/1074pinfo->nxt_state = ORI_TABLE_MONITOR;1075if (pinfo->is_snr_done) {1076if (pinfo->is_force_lna_sat_table == DEFAULT_AGC_TABLE)1077config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);1078else if (pinfo->is_force_lna_sat_table == LNA_SAT_AGC_TABLE)1079config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);1080else1081config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);10821083PHYDM_DBG(dm, DBG_LNA_SAT_CHK,1084"%s: cur_mean=%d, pre_mean=%d, cur_var=%d, pre_var=%d,cur_lower_mean=%d, pre_lower_mean=%d, cnt_lower_snr=%d\n",1085__func__,1086pinfo->cur_snr_mean,1087pinfo->pre_snr_mean,1088pinfo->cur_snr_var,1089pinfo->pre_snr_var,1090pinfo->cur_lower_snr_mean,1091pinfo->pre_lower_snr_mean,1092pinfo->cnt_lower_snr_statistic);10931094pinfo->is_snr_done = FALSE;1095pinfo->is_sm_done = TRUE;1096phydm_update_pre_status(dm);1097} else {1098return;1099}1100} else if (pinfo->is_snr_done) {1101PHYDM_DBG(dm, DBG_LNA_SAT_CHK,1102"%s: cur_mean=%d, pre_mean=%d, cur_var=%d, pre_var=%d,cur_lower_mean=%d, pre_lower_mean=%d, cnt_lower_snr=%d\n",1103__func__,1104pinfo->cur_snr_mean,1105pinfo->pre_snr_mean,1106pinfo->cur_snr_var,1107pinfo->pre_snr_var,1108pinfo->cur_lower_snr_mean,1109pinfo->pre_lower_snr_mean,1110pinfo->cnt_lower_snr_statistic);11111112switch (state) {1113case ORI_TABLE_MONITOR:1114dbg_message = "ORI_TABLE_MONITOR";1115phydm_ori_table_monitor(dm);1116break;11171118case SAT_TABLE_TRAINING:1119dbg_message = "SAT_TABLE_TRAINING";1120phydm_sat_table_training(dm);1121break;11221123case SAT_TABLE_TRY_FAIL:1124dbg_message = "SAT_TABLE_TRY_FAIL";1125phydm_sat_table_try_fail(dm);1126break;11271128case SAT_TABLE_MONITOR:1129dbg_message = "SAT_TABLE_MONITOR";1130phydm_sat_table_monitor(dm);1131break;11321133case ORI_TABLE_TRAINING:1134dbg_message = "ORI_TABLE_TRAINING";1135phydm_ori_table_training(dm);1136break;11371138case ORI_TABLE_TRY_FAIL:1139dbg_message = "ORI_TABLE_TRAINING";1140phydm_ori_table_try_fail(dm);1141break;11421143default:1144dbg_message = "ORI_TABLE_MONITOR";1145phydm_ori_table_monitor(dm);1146break;1147}11481149dbg_message = phydm_lna_sat_state_msg(dm, state);1150nxt_dbg_message = phydm_lna_sat_state_msg(dm, pinfo->nxt_state);1151PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "state: [%s]->[%s]\n",1152dbg_message, nxt_dbg_message);11531154pinfo->is_snr_done = FALSE;1155pinfo->is_sm_done = TRUE;1156pinfo->total_cnt_snr = 1 << real_shift;11571158} else {1159return;1160}1161}116211631164#endif /*@#ifdef PHYDM_LNA_SAT_CHK_TYPE2*/11651166void phydm_lna_sat_debug(1167void *dm_void,1168char input[][16],1169u32 *_used,1170char *output,1171u32 *_out_len)1172{1173struct dm_struct *dm = (struct dm_struct *)dm_void;1174struct phydm_lna_sat_t *lna_t = &dm->dm_lna_sat_info;1175char help[] = "-h";1176char monitor[] = "-m";1177u32 var1[10] = {0};1178u32 used = *_used;1179u32 out_len = *_out_len;1180u8 i;1181u8 agc_tab = 0;11821183if ((strcmp(input[1], help) == 0)) {1184PDM_SNPF(out_len, used, output + used, out_len - used,1185"monitor: -m\n");1186#ifdef PHYDM_LNA_SAT_CHK_TYPE11187PDM_SNPF(out_len, used, output + used, out_len - used,1188"{0} {lna_sat_chk_en}\n");1189PDM_SNPF(out_len, used, output + used, out_len - used,1190"{1} {agc_table_switch_en}\n");1191PDM_SNPF(out_len, used, output + used, out_len - used,1192"{2} {chk_cnt per callback}\n");1193PDM_SNPF(out_len, used, output + used, out_len - used,1194"{3} {chk_period(ms)}\n");1195PDM_SNPF(out_len, used, output + used, out_len - used,1196"{4} {chk_duty_cycle(%)}\n");1197#endif1198} else if ((strcmp(input[1], monitor) == 0)) {1199#ifdef PHYDM_LNA_SAT_CHK_TYPE11200#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)1201if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))1202agc_tab = phydm_get_ofdm_agc_tab_path(dm, RF_PATH_A);1203else1204#endif1205agc_tab = phydm_get_ofdm_agc_tab(dm);12061207PDM_SNPF(out_len, used, output + used, out_len - used,1208"%s%d, %s%d, %s%d, %s%d\n",1209"check_time = ", lna_t->check_time,1210"pre_sat_status = ", lna_t->pre_sat_status,1211"cur_sat_status = ", lna_t->cur_sat_status,1212"current AGC tab = ", agc_tab);1213#endif1214} else {1215PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);12161217for (i = 1; i < 10; i++) {1218if (input[i + 1])1219PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL,1220&var1[i]);1221}1222#ifdef PHYDM_LNA_SAT_CHK_TYPE11223if (var1[0] == 0) {1224if (var1[1] == 1)1225lna_t->is_disable_lna_sat_chk = false;1226else if (var1[1] == 0)1227lna_t->is_disable_lna_sat_chk = true;12281229PDM_SNPF(out_len, used, output + used, out_len - used,1230"dis_lna_sat_chk=%d\n",1231lna_t->is_disable_lna_sat_chk);1232} else if (var1[0] == 1) {1233if (var1[1] == 1)1234lna_t->dis_agc_table_swh = false;1235else if (var1[1] == 0)1236lna_t->dis_agc_table_swh = true;12371238PDM_SNPF(out_len, used, output + used, out_len - used,1239"dis_agc_table_swh=%d\n",1240lna_t->dis_agc_table_swh);12411242} else if (var1[0] == 2) {1243lna_t->chk_cnt = (u8)var1[1];1244PDM_SNPF(out_len, used, output + used, out_len - used,1245"chk_cnt=%d\n", lna_t->chk_cnt);1246} else if (var1[0] == 3) {1247lna_t->chk_period = var1[1];1248PDM_SNPF(out_len, used, output + used, out_len - used,1249"chk_period=%d\n", lna_t->chk_period);1250} else if (var1[0] == 4) {1251lna_t->chk_duty_cycle = (u8)var1[1];1252PDM_SNPF(out_len, used, output + used, out_len - used,1253"chk_duty_cycle=%d\n",1254lna_t->chk_duty_cycle);1255}1256#endif1257#ifdef PHYDM_LNA_SAT_CHK_TYPE21258if (var1[0] == 1)1259lna_t->force_traget_macid = var1[1];1260#endif1261}1262*_used = used;1263*_out_len = out_len;1264}12651266void phydm_lna_sat_chk_watchdog(1267void *dm_void)1268{1269struct dm_struct *dm = (struct dm_struct *)dm_void;1270struct phydm_lna_sat_t *lna_sat = &dm->dm_lna_sat_info;12711272PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);12731274if (lna_sat->lna_sat_type == LNA_SAT_WITH_PEAK_DET) {1275#ifdef PHYDM_LNA_SAT_CHK_TYPE11276phydm_lna_sat_chk_watchdog_type1(dm);1277#endif1278} else if (lna_sat->lna_sat_type == LNA_SAT_WITH_TRAIN) {1279#ifdef PHYDM_LNA_SAT_CHK_TYPE212801281#endif1282}12831284}12851286void phydm_lna_sat_config(1287void *dm_void)1288{1289struct dm_struct *dm = (struct dm_struct *)dm_void;1290struct phydm_lna_sat_t *lna_sat = &dm->dm_lna_sat_info;12911292#if (RTL8822B_SUPPORT == 1)1293if (dm->support_ic_type & (ODM_RTL8822B))1294lna_sat->lna_sat_type = LNA_SAT_WITH_TRAIN;1295#endif12961297#if (RTL8197F_SUPPORT || RTL8192F_SUPPORT ||\1298RTL8198F_SUPPORT || RTL8814B_SUPPORT)1299if (dm->support_ic_type &1300(ODM_RTL8197F | ODM_RTL8192F | ODM_RTL8198F | ODM_RTL8814B))1301lna_sat->lna_sat_type = LNA_SAT_WITH_PEAK_DET;1302#endif13031304PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "[%s] lna_sat_type=%d\n",1305__func__, lna_sat->lna_sat_type);1306}13071308void phydm_lna_sat_check_init(1309void *dm_void)1310{1311struct dm_struct *dm = (struct dm_struct *)dm_void;1312struct phydm_lna_sat_t *lna_sat = &dm->dm_lna_sat_info;13131314if ((dm->support_ability & ODM_BB_LNA_SAT_CHK))1315return;13161317/*@2018.04.17 Johnson*/1318phydm_lna_sat_config(dm);1319#ifdef PHYDM_LNA_SAT_CHK_TYPE11320lna_sat->chk_period = LNA_CHK_PERIOD;1321lna_sat->chk_cnt = LNA_CHK_CNT;1322lna_sat->chk_duty_cycle = LNA_CHK_DUTY_CYCLE;1323lna_sat->dis_agc_table_swh = false;1324#endif1325/*@2018.04.17 Johnson end*/13261327if (lna_sat->lna_sat_type == LNA_SAT_WITH_PEAK_DET) {1328#ifdef PHYDM_LNA_SAT_CHK_TYPE11329phydm_lna_sat_chk_init(dm);1330#endif1331} else if (lna_sat->lna_sat_type == LNA_SAT_WITH_TRAIN) {1332#ifdef PHYDM_LNA_SAT_CHK_TYPE21333phydm_lna_sat_chk_type2_init(dm);1334#endif1335}1336}13371338#endif /*@#ifdef PHYDM_LNA_SAT_CHK_SUPPORT*/133913401341