Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm.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************************************************************/2829#include "mp_precomp.h"30#include "phydm_precomp.h"3132const u16 phy_rate_table[] = {33/*@20M*/341, 2, 5, 11,356, 9, 12, 18, 24, 36, 48, 54,366, 13, 19, 26, 39, 52, 58, 65, /*@MCS0~7*/3713, 26, 39, 52, 78, 104, 117, 130, /*@MCS8~15*/3819, 39, 58, 78, 117, 156, 175, 195, /*@MCS16~23*/3926, 52, 78, 104, 156, 208, 234, 260, /*@MCS24~31*/406, 13, 19, 26, 39, 52, 58, 65, 78, 90, /*@1ss MCS0~9*/4113, 26, 39, 52, 78, 104, 117, 130, 156, 180, /*@2ss MCS0~9*/4219, 39, 58, 78, 117, 156, 175, 195, 234, 260, /*@3ss MCS0~9*/4326, 52, 78, 104, 156, 208, 234, 260, 312, 360 /*@4ss MCS0~9*/44};4546void phydm_traffic_load_decision(void *dm_void)47{48struct dm_struct *dm = (struct dm_struct *)dm_void;49u8 shift = 0;5051/*@---TP & Trafic-load calculation---*/5253if (dm->last_tx_ok_cnt > *dm->num_tx_bytes_unicast)54dm->last_tx_ok_cnt = *dm->num_tx_bytes_unicast;5556if (dm->last_rx_ok_cnt > *dm->num_rx_bytes_unicast)57dm->last_rx_ok_cnt = *dm->num_rx_bytes_unicast;5859dm->cur_tx_ok_cnt = *dm->num_tx_bytes_unicast - dm->last_tx_ok_cnt;60dm->cur_rx_ok_cnt = *dm->num_rx_bytes_unicast - dm->last_rx_ok_cnt;61dm->last_tx_ok_cnt = *dm->num_tx_bytes_unicast;62dm->last_rx_ok_cnt = *dm->num_rx_bytes_unicast;6364/*@AP: <<3(8bit), >>20(10^6,M), >>0(1sec)*/65shift = 17 + (PHYDM_WATCH_DOG_PERIOD - 1);66/*@WIN&CE: <<3(8bit), >>20(10^6,M), >>1(2sec)*/6768dm->tx_tp = (dm->tx_tp >> 1) + (u32)((dm->cur_tx_ok_cnt >> shift) >> 1);69dm->rx_tp = (dm->rx_tp >> 1) + (u32)((dm->cur_rx_ok_cnt >> shift) >> 1);7071dm->total_tp = dm->tx_tp + dm->rx_tp;7273/*@[Calculate TX/RX state]*/74if (dm->tx_tp > (dm->rx_tp << 1))75dm->txrx_state_all = TX_STATE;76else if (dm->rx_tp > (dm->tx_tp << 1))77dm->txrx_state_all = RX_STATE;78else79dm->txrx_state_all = BI_DIRECTION_STATE;8081/*@[Traffic load decision]*/82dm->pre_traffic_load = dm->traffic_load;8384if (dm->cur_tx_ok_cnt > 1875000 || dm->cur_rx_ok_cnt > 1875000) {85/* @( 1.875M * 8bit ) / 2sec= 7.5M bits /sec )*/86dm->traffic_load = TRAFFIC_HIGH;87} else if (dm->cur_tx_ok_cnt > 500000 || dm->cur_rx_ok_cnt > 500000) {88/*@( 0.5M * 8bit ) / 2sec = 2M bits /sec )*/89dm->traffic_load = TRAFFIC_MID;90} else if (dm->cur_tx_ok_cnt > 100000 || dm->cur_rx_ok_cnt > 100000) {91/*@( 0.1M * 8bit ) / 2sec = 0.4M bits /sec )*/92dm->traffic_load = TRAFFIC_LOW;93} else if (dm->cur_tx_ok_cnt > 25000 || dm->cur_rx_ok_cnt > 25000) {94/*@( 0.025M * 8bit ) / 2sec = 0.1M bits /sec )*/95dm->traffic_load = TRAFFIC_ULTRA_LOW;96} else {97dm->traffic_load = TRAFFIC_NO_TP;98}99100/*@[Calculate consecutive idlel time]*/101if (dm->traffic_load == 0)102dm->consecutive_idlel_time += PHYDM_WATCH_DOG_PERIOD;103else104dm->consecutive_idlel_time = 0;105106#if 0107PHYDM_DBG(dm, DBG_COMMON_FLOW,108"cur_tx_ok_cnt = %d, cur_rx_ok_cnt = %d, last_tx_ok_cnt = %d, last_rx_ok_cnt = %d\n",109dm->cur_tx_ok_cnt, dm->cur_rx_ok_cnt, dm->last_tx_ok_cnt,110dm->last_rx_ok_cnt);111112PHYDM_DBG(dm, DBG_COMMON_FLOW, "tx_tp = %d, rx_tp = %d\n", dm->tx_tp,113dm->rx_tp);114#endif115}116117void phydm_cck_new_agc_chk(struct dm_struct *dm)118{119u32 new_agc_addr = 0x0;120121dm->cck_new_agc = false;122#if (RTL8723D_SUPPORT || RTL8822B_SUPPORT || RTL8821C_SUPPORT ||\123RTL8197F_SUPPORT || RTL8710B_SUPPORT || RTL8192F_SUPPORT ||\124RTL8195B_SUPPORT || RTL8198F_SUPPORT || RTL8822C_SUPPORT ||\125RTL8721D_SUPPORT || RTL8710C_SUPPORT)126if (dm->support_ic_type & (ODM_RTL8723D | ODM_RTL8822B | ODM_RTL8821C |127ODM_RTL8197F | ODM_RTL8710B | ODM_RTL8192F | ODM_RTL8195B |128ODM_RTL8721D | ODM_RTL8710C)) {129new_agc_addr = R_0xa9c;130} else if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8822C |131ODM_RTL8814B | ODM_RTL8197G)) {132new_agc_addr = R_0x1a9c;133}134135/*@1: new agc 0: old agc*/136dm->cck_new_agc = (boolean)odm_get_bb_reg(dm, new_agc_addr, BIT(17));137#endif138}139140/*select 3 or 4 bit LNA */141void phydm_cck_lna_bit_num_chk(struct dm_struct *dm)142{143boolean report_type = 0;144#if (RTL8192E_SUPPORT)145u32 value_824, value_82c;146#endif147148#if (RTL8192E_SUPPORT)149if (dm->support_ic_type & (ODM_RTL8192E)) {150/* @0x824[9] = 0x82C[9] = 0xA80[7] those registers setting151* should be equal or CCK RSSI report may be incorrect152*/153value_824 = odm_get_bb_reg(dm, R_0x824, BIT(9));154value_82c = odm_get_bb_reg(dm, R_0x82c, BIT(9));155156if (value_824 != value_82c)157odm_set_bb_reg(dm, R_0x82c, BIT(9), value_824);158odm_set_bb_reg(dm, R_0xa80, BIT(7), value_824);159report_type = (boolean)value_824;160}161#endif162163#if (RTL8703B_SUPPORT || RTL8723D_SUPPORT || RTL8710B_SUPPORT)164if (dm->support_ic_type &165(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B)) {166report_type = (boolean)odm_get_bb_reg(dm, R_0x950, BIT(11));167168if (report_type != 1)169pr_debug("[Warning] CCK should be 4bit LNA\n");170}171#endif172173#if (RTL8821C_SUPPORT)174if (dm->support_ic_type & ODM_RTL8821C) {175if (dm->default_rf_set_8821c == SWITCH_TO_BTG)176report_type = 1;177}178#endif179180dm->cck_agc_report_type = report_type;181182PHYDM_DBG(dm, ODM_COMP_INIT, "cck_agc_report_type=((%d))\n",183dm->cck_agc_report_type);184}185186void phydm_init_cck_setting(struct dm_struct *dm)187{188u32 reg_tmp = 0;189u32 mask_tmp = 0;190191phydm_cck_new_agc_chk(dm);192193if (dm->support_ic_type & ODM_IC_JGR3_SERIES)194return;195196reg_tmp = ODM_REG(CCK_RPT_FORMAT, dm);197mask_tmp = ODM_BIT(CCK_RPT_FORMAT, dm);198dm->is_cck_high_power = (boolean)odm_get_bb_reg(dm, reg_tmp, mask_tmp);199200PHYDM_DBG(dm, ODM_COMP_INIT, "ext_lna_gain=((%d))\n", dm->ext_lna_gain);201202phydm_config_cck_rx_antenna_init(dm);203204if (dm->support_ic_type & ODM_RTL8192F)205phydm_config_cck_rx_path(dm, BB_PATH_AB);206else if (dm->valid_path_set == BB_PATH_A)207phydm_config_cck_rx_path(dm, BB_PATH_A);208else if (dm->valid_path_set == BB_PATH_B)209phydm_config_cck_rx_path(dm, BB_PATH_B);210211phydm_cck_lna_bit_num_chk(dm);212phydm_get_cck_rssi_table_from_reg(dm);213}214215#ifdef CONFIG_RFE_BY_HW_INFO216void phydm_init_hw_info_by_rfe(struct dm_struct *dm)217{218#if (RTL8821C_SUPPORT)219if (dm->support_ic_type & ODM_RTL8821C)220phydm_init_hw_info_by_rfe_type_8821c(dm);221#endif222#if (RTL8197F_SUPPORT)223if (dm->support_ic_type & ODM_RTL8197F)224phydm_init_hw_info_by_rfe_type_8197f(dm);225#endif226#if (RTL8814B_SUPPORT)227if (dm->support_ic_type & ODM_RTL8814B)228phydm_init_hw_info_by_rfe_type_8814b(dm);229#endif230}231#endif232233void phydm_common_info_self_init(struct dm_struct *dm)234{235u32 reg_tmp = 0;236u32 mask_tmp = 0;237238dm->run_in_drv_fw = RUN_IN_DRIVER;239240/*@BB IP Generation*/241if (dm->support_ic_type & ODM_IC_JGR3_SERIES)242dm->ic_ip_series = PHYDM_IC_JGR3;243else if (dm->support_ic_type & ODM_IC_11AC_SERIES)244dm->ic_ip_series = PHYDM_IC_AC;245else if (dm->support_ic_type & ODM_IC_11N_SERIES)246dm->ic_ip_series = PHYDM_IC_N;247248/*@BB phy-status Generation*/249if (dm->support_ic_type & PHYSTS_3RD_TYPE_IC)250dm->ic_phy_sts_type = PHYDM_PHYSTS_TYPE_3;251else if (dm->support_ic_type & PHYSTS_2ND_TYPE_IC)252dm->ic_phy_sts_type = PHYDM_PHYSTS_TYPE_2;253else254dm->ic_phy_sts_type = PHYDM_PHYSTS_TYPE_1;255256phydm_init_cck_setting(dm);257258reg_tmp = ODM_REG(BB_RX_PATH, dm);259mask_tmp = ODM_BIT(BB_RX_PATH, dm);260dm->rf_path_rx_enable = (u8)odm_get_bb_reg(dm, reg_tmp, mask_tmp);261#if (DM_ODM_SUPPORT_TYPE != ODM_CE)262dm->is_net_closed = &dm->BOOLEAN_temp;263264phydm_init_debug_setting(dm);265#endif266phydm_init_soft_ml_setting(dm);267268dm->phydm_sys_up_time = 0;269270if (dm->support_ic_type & ODM_IC_1SS)271dm->num_rf_path = 1;272else if (dm->support_ic_type & ODM_IC_2SS)273dm->num_rf_path = 2;274#if 0275/* @RTK do not has IC which is equipped with 3 RF paths,276* so ODM_IC_3SS is an enpty macro and result in coverity check errors277*/278else if (dm->support_ic_type & ODM_IC_3SS)279dm->num_rf_path = 3;280#endif281else if (dm->support_ic_type & ODM_IC_4SS)282dm->num_rf_path = 4;283else284dm->num_rf_path = 1;285286phydm_trx_antenna_setting_init(dm, dm->num_rf_path);287288dm->tx_rate = 0xFF;289dm->rssi_min_by_path = 0xFF;290291dm->number_linked_client = 0;292dm->pre_number_linked_client = 0;293dm->number_active_client = 0;294dm->pre_number_active_client = 0;295296dm->last_tx_ok_cnt = 0;297dm->last_rx_ok_cnt = 0;298dm->tx_tp = 0;299dm->rx_tp = 0;300dm->total_tp = 0;301dm->traffic_load = TRAFFIC_LOW;302303dm->nbi_set_result = 0;304dm->is_init_hw_info_by_rfe = false;305dm->pre_dbg_priority = DBGPORT_RELEASE;306dm->tp_active_th = 5;307dm->disable_phydm_watchdog = 0;308309dm->u8_dummy = 0xf;310dm->u16_dummy = 0xffff;311dm->u32_dummy = 0xffffffff;312313dm->pause_lv_table.lv_cckpd = PHYDM_PAUSE_RELEASE;314dm->pause_lv_table.lv_dig = PHYDM_PAUSE_RELEASE;315dm->pre_is_linked = false;316dm->is_linked = false;317#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)318if (!(dm->is_fcs_mode_enable)) {319dm->is_fcs_mode_enable = &dm->boolean_dummy;320pr_debug("[Warning] is_fcs_mode_enable=NULL\n");321}322#endif323}324325void phydm_cmn_sta_info_update(void *dm_void, u8 macid)326{327struct dm_struct *dm = (struct dm_struct *)dm_void;328struct cmn_sta_info *sta = dm->phydm_sta_info[macid];329struct ra_sta_info *ra = NULL;330331if (is_sta_active(sta)) {332ra = &sta->ra_info;333} else {334PHYDM_DBG(dm, DBG_RA_MASK, "[Warning] %s invalid sta_info\n",335__func__);336return;337}338339PHYDM_DBG(dm, DBG_RA_MASK, "%s ======>\n", __func__);340PHYDM_DBG(dm, DBG_RA_MASK, "MACID=%d\n", sta->mac_id);341342/*@[Calculate TX/RX state]*/343if (sta->tx_moving_average_tp > (sta->rx_moving_average_tp << 1))344ra->txrx_state = TX_STATE;345else if (sta->rx_moving_average_tp > (sta->tx_moving_average_tp << 1))346ra->txrx_state = RX_STATE;347else348ra->txrx_state = BI_DIRECTION_STATE;349350ra->is_noisy = dm->noisy_decision;351}352353void phydm_common_info_self_update(struct dm_struct *dm)354{355u8 sta_cnt = 0, num_active_client = 0;356u32 i, one_entry_macid = 0;357u32 ma_rx_tp = 0;358u32 tp_diff = 0;359struct cmn_sta_info *sta;360#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)361PADAPTER adapter = (PADAPTER)dm->adapter;362PMGNT_INFO mgnt_info = &((PADAPTER)adapter)->MgntInfo;363364sta = dm->phydm_sta_info[0];365366#if 0367if (mgnt_info->mAssoc) {368sta->dm_ctrl |= STA_DM_CTRL_ACTIVE;369for (i = 0; i < 6; i++)370sta->mac_addr[i] = mgnt_info->Bssid[i];371} else if (GetFirstClientPort(adapter)) {372struct _ADAPTER *client_adapter = GetFirstClientPort(adapter);373374sta->dm_ctrl |= STA_DM_CTRL_ACTIVE;375for (i = 0; i < 6; i++)376sta->mac_addr[i] = client_adapter->MgntInfo.Bssid[i];377} else {378sta->dm_ctrl = sta->dm_ctrl & (~STA_DM_CTRL_ACTIVE);379for (i = 0; i < 6; i++)380sta->mac_addr[i] = 0;381}382#endif383384/* STA mode is linked to AP */385if (is_sta_active(sta) && !ACTING_AS_AP(adapter))386dm->bsta_state = true;387else388dm->bsta_state = false;389#endif390391for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {392sta = dm->phydm_sta_info[i];393if (is_sta_active(sta)) {394sta_cnt++;395396if (sta_cnt == 1)397one_entry_macid = i;398399phydm_cmn_sta_info_update(dm, (u8)i);400#ifdef PHYDM_BEAMFORMING_SUPPORT401/*@phydm_get_txbf_device_num(dm, (u8)i);*/402#endif403404ma_rx_tp = sta->rx_moving_average_tp +405sta->tx_moving_average_tp;406407PHYDM_DBG(dm, DBG_COMMON_FLOW,408"TP[%d]: ((%d )) bit/sec\n", i, ma_rx_tp);409410if (ma_rx_tp > ACTIVE_TP_THRESHOLD)411num_active_client++;412}413}414415#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)416dm->is_linked = (sta_cnt != 0) ? true : false;417#endif418419if (sta_cnt == 1) {420dm->is_one_entry_only = true;421dm->one_entry_macid = one_entry_macid;422dm->one_entry_tp = ma_rx_tp;423424dm->tp_active_occur = 0;425426PHYDM_DBG(dm, DBG_COMMON_FLOW,427"one_entry_tp=((%d)), pre_one_entry_tp=((%d))\n",428dm->one_entry_tp, dm->pre_one_entry_tp);429430if (dm->one_entry_tp > dm->pre_one_entry_tp &&431dm->pre_one_entry_tp <= 2) {432tp_diff = dm->one_entry_tp - dm->pre_one_entry_tp;433434if (tp_diff > dm->tp_active_th)435dm->tp_active_occur = 1;436}437dm->pre_one_entry_tp = dm->one_entry_tp;438} else {439dm->is_one_entry_only = false;440}441442dm->pre_number_linked_client = dm->number_linked_client;443dm->pre_number_active_client = dm->number_active_client;444445dm->number_linked_client = sta_cnt;446dm->number_active_client = num_active_client;447448/*Traffic load information update*/449phydm_traffic_load_decision(dm);450451dm->phydm_sys_up_time += PHYDM_WATCH_DOG_PERIOD;452453dm->is_dfs_band = phydm_is_dfs_band(dm);454dm->phy_dbg_info.show_phy_sts_cnt = 0;455456/*[Link Status Check]*/457dm->first_connect = dm->is_linked && !dm->pre_is_linked;458dm->first_disconnect = !dm->is_linked && dm->pre_is_linked;459dm->pre_is_linked = dm->is_linked;460}461462void phydm_common_info_self_reset(struct dm_struct *dm)463{464struct odm_phy_dbg_info *dbg_t = &dm->phy_dbg_info;465466dbg_t->beacon_cnt_in_period = dbg_t->num_qry_beacon_pkt;467dbg_t->num_qry_beacon_pkt = 0;468469dm->rxsc_l = 0xff;470dm->rxsc_20 = 0xff;471dm->rxsc_40 = 0xff;472dm->rxsc_80 = 0xff;473}474475void *476phydm_get_structure(struct dm_struct *dm, u8 structure_type)477478{479void *structure = NULL;480481switch (structure_type) {482case PHYDM_FALSEALMCNT:483structure = &dm->false_alm_cnt;484break;485486case PHYDM_CFOTRACK:487structure = &dm->dm_cfo_track;488break;489490case PHYDM_ADAPTIVITY:491structure = &dm->adaptivity;492break;493494case PHYDM_DFS:495structure = &dm->dfs;496break;497498default:499break;500}501502return structure;503}504505void phydm_phy_info_update(struct dm_struct *dm)506{507#if (RTL8822B_SUPPORT)508if (dm->support_ic_type == ODM_RTL8822B)509dm->phy_dbg_info.condi_num = phydm_get_condi_num_8822b(dm);510#endif511}512513void phydm_hw_setting(struct dm_struct *dm)514{515#if (RTL8821A_SUPPORT)516if (dm->support_ic_type & ODM_RTL8821)517odm_hw_setting_8821a(dm);518#endif519520#if (RTL8814A_SUPPORT)521if (dm->support_ic_type & ODM_RTL8814A)522phydm_hwsetting_8814a(dm);523#endif524525#if (RTL8822B_SUPPORT)526if (dm->support_ic_type & ODM_RTL8822B)527phydm_hwsetting_8822b(dm);528#endif529530#if (RTL8812A_SUPPORT)531if (dm->support_ic_type & ODM_RTL8812)532phydm_hwsetting_8812a(dm);533#endif534535#if (RTL8197F_SUPPORT)536if (dm->support_ic_type & ODM_RTL8197F)537phydm_hwsetting_8197f(dm);538#endif539540#if (RTL8192F_SUPPORT)541if (dm->support_ic_type & ODM_RTL8192F)542phydm_hwsetting_8192f(dm);543#endif544545#if (RTL8822C_SUPPORT)546if (dm->support_ic_type & ODM_RTL8822C)547phydm_hwsetting_8822c(dm);548#endif549550#ifdef PHYDM_CCK_RX_PATHDIV_SUPPORT551phydm_cck_rx_pathdiv_watchdog(dm);552#endif553}554555#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))556u64 phydm_supportability_init_win(557void *dm_void)558{559struct dm_struct *dm = (struct dm_struct *)dm_void;560u64 support_ability = 0;561562switch (dm->support_ic_type) {563/*@---------------N Series--------------------*/564#if (RTL8188E_SUPPORT)565case ODM_RTL8188E:566support_ability |=567ODM_BB_DIG |568ODM_BB_RA_MASK |569/*ODM_BB_DYNAMIC_TXPWR |*/570ODM_BB_FA_CNT |571ODM_BB_RSSI_MONITOR |572ODM_BB_CCK_PD |573/*ODM_BB_PWR_TRAIN |*/574ODM_BB_RATE_ADAPTIVE |575ODM_BB_ADAPTIVITY |576ODM_BB_CFO_TRACKING |577ODM_BB_ENV_MONITOR |578ODM_BB_PRIMARY_CCA;579break;580#endif581582#if (RTL8192E_SUPPORT)583case ODM_RTL8192E:584support_ability |=585ODM_BB_DIG |586ODM_BB_RA_MASK |587/*ODM_BB_DYNAMIC_TXPWR |*/588ODM_BB_FA_CNT |589ODM_BB_RSSI_MONITOR |590ODM_BB_CCK_PD |591/*ODM_BB_PWR_TRAIN |*/592ODM_BB_RATE_ADAPTIVE |593ODM_BB_ADAPTIVITY |594ODM_BB_CFO_TRACKING |595ODM_BB_ENV_MONITOR |596ODM_BB_PRIMARY_CCA;597break;598#endif599600#if (RTL8723B_SUPPORT)601case ODM_RTL8723B:602support_ability |=603ODM_BB_DIG |604ODM_BB_RA_MASK |605/*ODM_BB_DYNAMIC_TXPWR |*/606ODM_BB_FA_CNT |607ODM_BB_RSSI_MONITOR |608ODM_BB_CCK_PD |609/*ODM_BB_PWR_TRAIN |*/610ODM_BB_RATE_ADAPTIVE |611ODM_BB_ADAPTIVITY |612ODM_BB_CFO_TRACKING |613ODM_BB_ENV_MONITOR |614ODM_BB_PRIMARY_CCA;615break;616#endif617618#if (RTL8703B_SUPPORT)619case ODM_RTL8703B:620support_ability |=621ODM_BB_DIG |622ODM_BB_RA_MASK |623/*ODM_BB_DYNAMIC_TXPWR |*/624ODM_BB_FA_CNT |625ODM_BB_RSSI_MONITOR |626ODM_BB_CCK_PD |627/*ODM_BB_PWR_TRAIN |*/628ODM_BB_RATE_ADAPTIVE |629ODM_BB_ADAPTIVITY |630ODM_BB_CFO_TRACKING |631ODM_BB_ENV_MONITOR;632break;633#endif634635#if (RTL8723D_SUPPORT)636case ODM_RTL8723D:637support_ability |=638ODM_BB_DIG |639ODM_BB_RA_MASK |640/*ODM_BB_DYNAMIC_TXPWR |*/641ODM_BB_FA_CNT |642ODM_BB_RSSI_MONITOR |643ODM_BB_CCK_PD |644ODM_BB_PWR_TRAIN |645ODM_BB_RATE_ADAPTIVE |646ODM_BB_ADAPTIVITY |647ODM_BB_CFO_TRACKING |648ODM_BB_ENV_MONITOR;649break;650#endif651652#if (RTL8710B_SUPPORT)653case ODM_RTL8710B:654support_ability |=655ODM_BB_DIG |656ODM_BB_RA_MASK |657/*ODM_BB_DYNAMIC_TXPWR |*/658ODM_BB_FA_CNT |659ODM_BB_RSSI_MONITOR |660ODM_BB_CCK_PD |661ODM_BB_PWR_TRAIN |662ODM_BB_RATE_ADAPTIVE |663ODM_BB_ADAPTIVITY |664ODM_BB_CFO_TRACKING |665ODM_BB_ENV_MONITOR;666break;667#endif668669#if (RTL8188F_SUPPORT)670case ODM_RTL8188F:671support_ability |=672ODM_BB_DIG |673ODM_BB_RA_MASK |674/*ODM_BB_DYNAMIC_TXPWR |*/675ODM_BB_FA_CNT |676ODM_BB_RSSI_MONITOR |677ODM_BB_CCK_PD |678/*ODM_BB_PWR_TRAIN |*/679ODM_BB_RATE_ADAPTIVE |680ODM_BB_ADAPTIVITY |681ODM_BB_CFO_TRACKING |682ODM_BB_ENV_MONITOR;683break;684#endif685686#if (RTL8192F_SUPPORT)687case ODM_RTL8192F:688support_ability |=689ODM_BB_DIG |690ODM_BB_RA_MASK |691ODM_BB_FA_CNT |692ODM_BB_RSSI_MONITOR |693ODM_BB_CCK_PD |694ODM_BB_PWR_TRAIN |695ODM_BB_RATE_ADAPTIVE |696/*ODM_BB_PATH_DIV |*/697ODM_BB_ADAPTIVITY |698ODM_BB_CFO_TRACKING |699ODM_BB_ADAPTIVE_SOML |700ODM_BB_ENV_MONITOR;701/*ODM_BB_LNA_SAT_CHK |*/702/*ODM_BB_PRIMARY_CCA*/703704break;705#endif706707/*@---------------AC Series-------------------*/708709#if (RTL8812A_SUPPORT || RTL8821A_SUPPORT)710case ODM_RTL8812:711case ODM_RTL8821:712support_ability |=713ODM_BB_DIG |714ODM_BB_RA_MASK |715ODM_BB_DYNAMIC_TXPWR |716ODM_BB_FA_CNT |717ODM_BB_RSSI_MONITOR |718ODM_BB_CCK_PD |719/*ODM_BB_PWR_TRAIN |*/720ODM_BB_RATE_ADAPTIVE |721ODM_BB_ADAPTIVITY |722ODM_BB_CFO_TRACKING |723ODM_BB_ENV_MONITOR;724break;725#endif726727#if (RTL8814A_SUPPORT)728case ODM_RTL8814A:729support_ability |=730ODM_BB_DIG |731ODM_BB_RA_MASK |732ODM_BB_DYNAMIC_TXPWR |733ODM_BB_FA_CNT |734ODM_BB_RSSI_MONITOR |735ODM_BB_CCK_PD |736/*ODM_BB_PWR_TRAIN |*/737ODM_BB_RATE_ADAPTIVE |738ODM_BB_ADAPTIVITY |739ODM_BB_CFO_TRACKING |740ODM_BB_ENV_MONITOR;741break;742#endif743744#if (RTL8822B_SUPPORT)745case ODM_RTL8822B:746support_ability |=747ODM_BB_DIG |748ODM_BB_RA_MASK |749/*ODM_BB_DYNAMIC_TXPWR |*/750ODM_BB_FA_CNT |751ODM_BB_RSSI_MONITOR |752ODM_BB_CCK_PD |753/*ODM_BB_PWR_TRAIN |*/754/*ODM_BB_ADAPTIVE_SOML |*/755ODM_BB_RATE_ADAPTIVE |756/*ODM_BB_PATH_DIV |*/757ODM_BB_ADAPTIVITY |758ODM_BB_CFO_TRACKING |759ODM_BB_ENV_MONITOR;760break;761#endif762763#if (RTL8821C_SUPPORT)764case ODM_RTL8821C:765support_ability |=766ODM_BB_DIG |767ODM_BB_RA_MASK |768/*ODM_BB_DYNAMIC_TXPWR |*/769ODM_BB_FA_CNT |770ODM_BB_RSSI_MONITOR |771ODM_BB_CCK_PD |772/*ODM_BB_PWR_TRAIN |*/773ODM_BB_RATE_ADAPTIVE |774ODM_BB_ADAPTIVITY |775ODM_BB_CFO_TRACKING |776ODM_BB_ENV_MONITOR;777break;778#endif779780/*@---------------JGR3 Series-------------------*/781782#if (RTL8822C_SUPPORT)783case ODM_RTL8822C:784support_ability |=785ODM_BB_DIG |786ODM_BB_RA_MASK |787/* ODM_BB_DYNAMIC_TXPWR |*/788ODM_BB_FA_CNT |789ODM_BB_RSSI_MONITOR |790ODM_BB_CCK_PD |791ODM_BB_RATE_ADAPTIVE |792ODM_BB_PATH_DIV |793ODM_BB_ADAPTIVITY |794ODM_BB_CFO_TRACKING |795ODM_BB_ENV_MONITOR;796break;797#endif798799#if (RTL8814B_SUPPORT)800case ODM_RTL8814B:801support_ability |=802ODM_BB_DIG |803ODM_BB_RA_MASK |804/*ODM_BB_DYNAMIC_TXPWR |*/805ODM_BB_FA_CNT |806ODM_BB_RSSI_MONITOR |807ODM_BB_CCK_PD |808/*ODM_BB_PWR_TRAIN |*/809ODM_BB_RATE_ADAPTIVE |810ODM_BB_ADAPTIVITY |811ODM_BB_CFO_TRACKING;812/*ODM_BB_ENV_MONITOR;*/813break;814#endif815816default:817support_ability |=818ODM_BB_DIG |819ODM_BB_RA_MASK |820/*ODM_BB_DYNAMIC_TXPWR |*/821ODM_BB_FA_CNT |822ODM_BB_RSSI_MONITOR |823ODM_BB_CCK_PD |824/*ODM_BB_PWR_TRAIN |*/825ODM_BB_RATE_ADAPTIVE |826ODM_BB_ADAPTIVITY |827ODM_BB_CFO_TRACKING |828ODM_BB_ENV_MONITOR;829830pr_debug("[Warning] Supportability Init Warning !!!\n");831break;832}833834return support_ability;835}836#endif837838#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))839u64 phydm_supportability_init_ce(void *dm_void)840{841struct dm_struct *dm = (struct dm_struct *)dm_void;842u64 support_ability = 0;843844switch (dm->support_ic_type) {845/*@---------------N Series--------------------*/846#if (RTL8188E_SUPPORT)847case ODM_RTL8188E:848support_ability |=849ODM_BB_DIG |850ODM_BB_RA_MASK |851/*@ODM_BB_DYNAMIC_TXPWR |*/852ODM_BB_FA_CNT |853ODM_BB_RSSI_MONITOR |854ODM_BB_CCK_PD |855/*@ODM_BB_PWR_TRAIN |*/856ODM_BB_RATE_ADAPTIVE |857ODM_BB_ADAPTIVITY |858ODM_BB_CFO_TRACKING |859ODM_BB_ENV_MONITOR |860ODM_BB_PRIMARY_CCA;861break;862#endif863864#if (RTL8192E_SUPPORT)865case ODM_RTL8192E:866support_ability |=867ODM_BB_DIG |868ODM_BB_RA_MASK |869/*@ODM_BB_DYNAMIC_TXPWR |*/870ODM_BB_FA_CNT |871ODM_BB_RSSI_MONITOR |872ODM_BB_CCK_PD |873/*@ODM_BB_PWR_TRAIN |*/874ODM_BB_RATE_ADAPTIVE |875ODM_BB_ADAPTIVITY |876ODM_BB_CFO_TRACKING |877ODM_BB_ENV_MONITOR |878ODM_BB_PRIMARY_CCA;879break;880#endif881882#if (RTL8723B_SUPPORT)883case ODM_RTL8723B:884support_ability |=885ODM_BB_DIG |886ODM_BB_RA_MASK |887/*@ODM_BB_DYNAMIC_TXPWR |*/888ODM_BB_FA_CNT |889ODM_BB_RSSI_MONITOR |890ODM_BB_CCK_PD |891/*@ODM_BB_PWR_TRAIN |*/892ODM_BB_RATE_ADAPTIVE |893ODM_BB_ADAPTIVITY |894ODM_BB_CFO_TRACKING |895ODM_BB_ENV_MONITOR |896ODM_BB_PRIMARY_CCA;897break;898#endif899900#if (RTL8703B_SUPPORT)901case ODM_RTL8703B:902support_ability |=903ODM_BB_DIG |904ODM_BB_RA_MASK |905/*@ODM_BB_DYNAMIC_TXPWR |*/906ODM_BB_FA_CNT |907ODM_BB_RSSI_MONITOR |908ODM_BB_CCK_PD |909/*@ODM_BB_PWR_TRAIN |*/910ODM_BB_RATE_ADAPTIVE |911ODM_BB_ADAPTIVITY |912ODM_BB_CFO_TRACKING |913ODM_BB_ENV_MONITOR;914break;915#endif916917#if (RTL8723D_SUPPORT)918case ODM_RTL8723D:919support_ability |=920ODM_BB_DIG |921ODM_BB_RA_MASK |922/*@ODM_BB_DYNAMIC_TXPWR |*/923ODM_BB_FA_CNT |924ODM_BB_RSSI_MONITOR |925ODM_BB_CCK_PD |926ODM_BB_PWR_TRAIN |927ODM_BB_RATE_ADAPTIVE |928ODM_BB_ADAPTIVITY |929ODM_BB_CFO_TRACKING |930ODM_BB_ENV_MONITOR;931break;932#endif933934#if (RTL8710B_SUPPORT)935case ODM_RTL8710B:936support_ability |=937ODM_BB_DIG |938ODM_BB_RA_MASK |939/*@ODM_BB_DYNAMIC_TXPWR |*/940ODM_BB_FA_CNT |941ODM_BB_RSSI_MONITOR |942ODM_BB_CCK_PD |943/*@ODM_BB_PWR_TRAIN |*/944ODM_BB_RATE_ADAPTIVE |945ODM_BB_ADAPTIVITY |946ODM_BB_CFO_TRACKING |947ODM_BB_ENV_MONITOR;948break;949#endif950951#if (RTL8188F_SUPPORT)952case ODM_RTL8188F:953support_ability |=954ODM_BB_DIG |955ODM_BB_RA_MASK |956/*@ODM_BB_DYNAMIC_TXPWR |*/957ODM_BB_FA_CNT |958ODM_BB_RSSI_MONITOR |959ODM_BB_CCK_PD |960/*@ODM_BB_PWR_TRAIN |*/961ODM_BB_RATE_ADAPTIVE |962ODM_BB_ADAPTIVITY |963ODM_BB_CFO_TRACKING |964ODM_BB_ENV_MONITOR;965break;966#endif967968#if (RTL8192F_SUPPORT)969case ODM_RTL8192F:970support_ability |=971ODM_BB_DIG |972ODM_BB_RA_MASK |973ODM_BB_FA_CNT |974ODM_BB_RSSI_MONITOR |975ODM_BB_CCK_PD |976ODM_BB_PWR_TRAIN |977ODM_BB_RATE_ADAPTIVE |978/*ODM_BB_PATH_DIV |*/979ODM_BB_ADAPTIVITY |980ODM_BB_CFO_TRACKING |981/*@ODM_BB_ADAPTIVE_SOML |*/982ODM_BB_ENV_MONITOR;983/*@ODM_BB_LNA_SAT_CHK |*/984/*@ODM_BB_PRIMARY_CCA*/985break;986#endif987/*@---------------AC Series-------------------*/988989#if (RTL8812A_SUPPORT || RTL8821A_SUPPORT)990case ODM_RTL8812:991case ODM_RTL8821:992support_ability |=993ODM_BB_DIG |994ODM_BB_RA_MASK |995/*@ODM_BB_DYNAMIC_TXPWR |*/996ODM_BB_FA_CNT |997ODM_BB_RSSI_MONITOR |998ODM_BB_CCK_PD |999/*@ODM_BB_PWR_TRAIN |*/1000ODM_BB_RATE_ADAPTIVE |1001ODM_BB_ADAPTIVITY |1002ODM_BB_CFO_TRACKING |1003ODM_BB_ENV_MONITOR;1004break;1005#endif10061007#if (RTL8814A_SUPPORT)1008case ODM_RTL8814A:1009support_ability |=1010ODM_BB_DIG |1011ODM_BB_RA_MASK |1012/*@ODM_BB_DYNAMIC_TXPWR |*/1013ODM_BB_FA_CNT |1014ODM_BB_RSSI_MONITOR |1015ODM_BB_CCK_PD |1016/*@ODM_BB_PWR_TRAIN |*/1017ODM_BB_RATE_ADAPTIVE |1018ODM_BB_ADAPTIVITY |1019ODM_BB_CFO_TRACKING |1020ODM_BB_ENV_MONITOR;1021break;1022#endif10231024#if (RTL8822B_SUPPORT)1025case ODM_RTL8822B:1026support_ability |=1027ODM_BB_DIG |1028ODM_BB_RA_MASK |1029ODM_BB_DYNAMIC_TXPWR |1030ODM_BB_FA_CNT |1031ODM_BB_RSSI_MONITOR |1032ODM_BB_CCK_PD |1033/*@ODM_BB_PWR_TRAIN |*/1034ODM_BB_RATE_ADAPTIVE |1035/*ODM_BB_PATH_DIV |*/1036ODM_BB_ADAPTIVITY |1037ODM_BB_CFO_TRACKING |1038ODM_BB_ENV_MONITOR;1039break;1040#endif10411042#if (RTL8821C_SUPPORT)1043case ODM_RTL8821C:1044support_ability |=1045ODM_BB_DIG |1046ODM_BB_RA_MASK |1047/*@ODM_BB_DYNAMIC_TXPWR |*/1048ODM_BB_FA_CNT |1049ODM_BB_RSSI_MONITOR |1050ODM_BB_CCK_PD |1051/*@ODM_BB_PWR_TRAIN |*/1052ODM_BB_RATE_ADAPTIVE |1053ODM_BB_ADAPTIVITY |1054ODM_BB_CFO_TRACKING |1055ODM_BB_ENV_MONITOR;1056break;1057#endif10581059/*@---------------JGR3 Series-------------------*/10601061#if (RTL8822C_SUPPORT)1062case ODM_RTL8822C:1063support_ability |=1064ODM_BB_DIG |1065ODM_BB_RA_MASK |1066/* ODM_BB_DYNAMIC_TXPWR |*/1067ODM_BB_FA_CNT |1068ODM_BB_RSSI_MONITOR |1069ODM_BB_CCK_PD |1070ODM_BB_RATE_ADAPTIVE |1071ODM_BB_PATH_DIV |1072ODM_BB_ADAPTIVITY |1073ODM_BB_CFO_TRACKING |1074ODM_BB_ENV_MONITOR;1075break;1076#endif10771078#if (RTL8814B_SUPPORT)1079case ODM_RTL8814B:1080support_ability |=1081ODM_BB_DIG |1082ODM_BB_RA_MASK |1083/*@ODM_BB_DYNAMIC_TXPWR |*/1084ODM_BB_FA_CNT |1085ODM_BB_RSSI_MONITOR |1086ODM_BB_CCK_PD |1087/*@ODM_BB_PWR_TRAIN |*/1088/*ODM_BB_RATE_ADAPTIVE |*/1089ODM_BB_ADAPTIVITY;1090/*ODM_BB_CFO_TRACKING |*/1091/*ODM_BB_ENV_MONITOR;*/1092break;1093#endif10941095default:1096support_ability |=1097ODM_BB_DIG |1098ODM_BB_RA_MASK |1099/*@ODM_BB_DYNAMIC_TXPWR |*/1100ODM_BB_FA_CNT |1101ODM_BB_RSSI_MONITOR |1102ODM_BB_CCK_PD |1103/*@ODM_BB_PWR_TRAIN |*/1104ODM_BB_RATE_ADAPTIVE |1105ODM_BB_ADAPTIVITY |1106ODM_BB_CFO_TRACKING |1107ODM_BB_ENV_MONITOR;11081109pr_debug("[Warning] Supportability Init Warning !!!\n");1110break;1111}11121113return support_ability;1114}1115#endif11161117#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))1118u64 phydm_supportability_init_ap(1119void *dm_void)1120{1121struct dm_struct *dm = (struct dm_struct *)dm_void;1122u64 support_ability = 0;11231124switch (dm->support_ic_type) {1125/*@---------------N Series--------------------*/1126#if (RTL8188E_SUPPORT)1127case ODM_RTL8188E:1128support_ability |=1129ODM_BB_DIG |1130ODM_BB_RA_MASK |1131ODM_BB_FA_CNT |1132ODM_BB_RSSI_MONITOR |1133ODM_BB_CCK_PD |1134/*ODM_BB_PWR_TRAIN |*/1135ODM_BB_RATE_ADAPTIVE |1136ODM_BB_ADAPTIVITY |1137ODM_BB_CFO_TRACKING |1138ODM_BB_ENV_MONITOR |1139ODM_BB_PRIMARY_CCA;1140break;1141#endif11421143#if (RTL8192E_SUPPORT)1144case ODM_RTL8192E:1145support_ability |=1146ODM_BB_DIG |1147ODM_BB_RA_MASK |1148ODM_BB_FA_CNT |1149ODM_BB_RSSI_MONITOR |1150ODM_BB_CCK_PD |1151/*ODM_BB_PWR_TRAIN |*/1152ODM_BB_RATE_ADAPTIVE |1153ODM_BB_ADAPTIVITY |1154ODM_BB_CFO_TRACKING |1155ODM_BB_ENV_MONITOR |1156ODM_BB_PRIMARY_CCA;1157break;1158#endif11591160#if (RTL8723B_SUPPORT)1161case ODM_RTL8723B:1162support_ability |=1163ODM_BB_DIG |1164ODM_BB_RA_MASK |1165ODM_BB_FA_CNT |1166ODM_BB_RSSI_MONITOR |1167ODM_BB_CCK_PD |1168/*ODM_BB_PWR_TRAIN |*/1169ODM_BB_RATE_ADAPTIVE |1170ODM_BB_ADAPTIVITY |1171ODM_BB_CFO_TRACKING |1172ODM_BB_ENV_MONITOR;1173break;1174#endif11751176#if (RTL8198F_SUPPORT || RTL8197F_SUPPORT)1177case ODM_RTL8198F:1178support_ability |=1179/*ODM_BB_DIG |*/1180ODM_BB_RA_MASK |1181ODM_BB_FA_CNT |1182ODM_BB_RSSI_MONITOR |1183ODM_BB_CCK_PD |1184/*ODM_BB_PWR_TRAIN |*/1185/*ODM_BB_RATE_ADAPTIVE |*/1186ODM_BB_ADAPTIVITY;1187/*ODM_BB_CFO_TRACKING |*/1188/*ODM_BB_ADAPTIVE_SOML |*/1189/*ODM_BB_ENV_MONITOR |*/1190/*ODM_BB_LNA_SAT_CHK |*/1191/*ODM_BB_PRIMARY_CCA;*/1192break;1193case ODM_RTL8197F:1194support_ability |=1195ODM_BB_DIG |1196ODM_BB_RA_MASK |1197ODM_BB_FA_CNT |1198ODM_BB_RSSI_MONITOR |1199ODM_BB_CCK_PD |1200/*ODM_BB_PWR_TRAIN |*/1201ODM_BB_RATE_ADAPTIVE |1202ODM_BB_ADAPTIVITY |1203ODM_BB_CFO_TRACKING |1204ODM_BB_ADAPTIVE_SOML |1205ODM_BB_ENV_MONITOR |1206ODM_BB_LNA_SAT_CHK |1207ODM_BB_PRIMARY_CCA;1208break;1209#endif12101211#if (RTL8192F_SUPPORT)1212case ODM_RTL8192F:1213support_ability |=1214ODM_BB_DIG |1215ODM_BB_RA_MASK |1216ODM_BB_FA_CNT |1217ODM_BB_RSSI_MONITOR |1218ODM_BB_CCK_PD |1219/*ODM_BB_PWR_TRAIN |*/1220ODM_BB_RATE_ADAPTIVE |1221ODM_BB_ADAPTIVITY |1222/*ODM_BB_CFO_TRACKING |*/1223ODM_BB_ADAPTIVE_SOML |1224/*ODM_BB_PATH_DIV |*/1225ODM_BB_ENV_MONITOR |1226/*ODM_BB_LNA_SAT_CHK |*/1227/*ODM_BB_PRIMARY_CCA |*/12280;1229break;1230#endif12311232/*@---------------AC Series-------------------*/12331234#if (RTL8881A_SUPPORT)1235case ODM_RTL8881A:1236support_ability |=1237ODM_BB_DIG |1238ODM_BB_RA_MASK |1239ODM_BB_FA_CNT |1240ODM_BB_RSSI_MONITOR |1241ODM_BB_CCK_PD |1242/*ODM_BB_PWR_TRAIN |*/1243ODM_BB_RATE_ADAPTIVE |1244ODM_BB_ADAPTIVITY |1245ODM_BB_CFO_TRACKING |1246ODM_BB_ENV_MONITOR;1247break;1248#endif12491250#if (RTL8814A_SUPPORT)1251case ODM_RTL8814A:1252support_ability |=1253ODM_BB_DIG |1254ODM_BB_RA_MASK |1255ODM_BB_FA_CNT |1256ODM_BB_RSSI_MONITOR |1257ODM_BB_CCK_PD |1258/*ODM_BB_PWR_TRAIN |*/1259ODM_BB_RATE_ADAPTIVE |1260ODM_BB_ADAPTIVITY |1261ODM_BB_CFO_TRACKING |1262ODM_BB_ENV_MONITOR;1263break;1264#endif12651266#if (RTL8822B_SUPPORT)1267case ODM_RTL8822B:1268support_ability |=1269ODM_BB_DIG |1270ODM_BB_RA_MASK |1271ODM_BB_FA_CNT |1272ODM_BB_RSSI_MONITOR |1273ODM_BB_CCK_PD |1274/*ODM_BB_PWR_TRAIN |*/1275/*ODM_BB_ADAPTIVE_SOML |*/1276ODM_BB_RATE_ADAPTIVE |1277ODM_BB_ADAPTIVITY |1278ODM_BB_CFO_TRACKING |1279ODM_BB_ENV_MONITOR;1280break;1281#endif12821283#if (RTL8821C_SUPPORT)1284case ODM_RTL8821C:1285support_ability |=1286ODM_BB_DIG |1287ODM_BB_RA_MASK |1288ODM_BB_FA_CNT |1289ODM_BB_RSSI_MONITOR |1290ODM_BB_CCK_PD |1291/*ODM_BB_PWR_TRAIN |*/1292ODM_BB_RATE_ADAPTIVE |1293ODM_BB_ADAPTIVITY |1294ODM_BB_CFO_TRACKING |1295ODM_BB_ENV_MONITOR;12961297break;1298#endif12991300/*@---------------JGR3 Series-------------------*/13011302#if (RTL8814B_SUPPORT)1303case ODM_RTL8814B:1304support_ability |=1305ODM_BB_DIG |1306ODM_BB_RA_MASK |1307ODM_BB_FA_CNT |1308ODM_BB_RSSI_MONITOR |1309ODM_BB_CCK_PD |1310/*ODM_BB_PWR_TRAIN |*/1311/*ODM_BB_RATE_ADAPTIVE |*/1312ODM_BB_ADAPTIVITY;1313/*ODM_BB_CFO_TRACKING |*/1314/*ODM_BB_ENV_MONITOR;*/1315break;1316#endif13171318#if (RTL8197G_SUPPORT)1319case ODM_RTL8197G:1320support_ability |=1321ODM_BB_DIG |1322ODM_BB_RA_MASK |1323ODM_BB_FA_CNT |1324ODM_BB_RSSI_MONITOR |1325ODM_BB_CCK_PD |1326/*ODM_BB_PWR_TRAIN |*/1327ODM_BB_RATE_ADAPTIVE |1328ODM_BB_ADAPTIVITY |1329ODM_BB_CFO_TRACKING |1330ODM_BB_ENV_MONITOR;1331break;1332#endif13331334#if (RTL8812F_SUPPORT)1335case ODM_RTL8812F:1336support_ability |=1337ODM_BB_DIG |1338ODM_BB_RA_MASK |1339ODM_BB_FA_CNT |1340ODM_BB_RSSI_MONITOR |1341/*ODM_BB_CCK_PD |*/1342/*ODM_BB_PWR_TRAIN |*/1343ODM_BB_RATE_ADAPTIVE |1344ODM_BB_ADAPTIVITY |1345ODM_BB_CFO_TRACKING |1346ODM_BB_ENV_MONITOR;1347break;1348#endif13491350default:1351support_ability |=1352ODM_BB_DIG |1353ODM_BB_RA_MASK |1354ODM_BB_FA_CNT |1355ODM_BB_RSSI_MONITOR |1356ODM_BB_CCK_PD |1357/*ODM_BB_PWR_TRAIN |*/1358ODM_BB_RATE_ADAPTIVE |1359ODM_BB_ADAPTIVITY |1360ODM_BB_CFO_TRACKING |1361ODM_BB_ENV_MONITOR;13621363pr_debug("[Warning] Supportability Init Warning !!!\n");1364break;1365}13661367#if 01368/*@[Config Antenna Diveristy]*/1369if (*dm->enable_antdiv)1370support_ability |= ODM_BB_ANT_DIV;13711372/*@[Config Adaptivity]*/1373if (*dm->edcca_mode)1374support_ability |= ODM_BB_ADAPTIVITY;1375#endif13761377return support_ability;1378}1379#endif13801381#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))1382u64 phydm_supportability_init_iot(1383void *dm_void)1384{1385struct dm_struct *dm = (struct dm_struct *)dm_void;1386u64 support_ability = 0;13871388switch (dm->support_ic_type) {1389#if (RTL8710B_SUPPORT)1390case ODM_RTL8710B:1391support_ability |=1392ODM_BB_DIG |1393ODM_BB_RA_MASK |1394/*ODM_BB_DYNAMIC_TXPWR |*/1395ODM_BB_FA_CNT |1396ODM_BB_RSSI_MONITOR |1397ODM_BB_CCK_PD |1398/*ODM_BB_PWR_TRAIN |*/1399ODM_BB_RATE_ADAPTIVE |1400ODM_BB_CFO_TRACKING |1401ODM_BB_ENV_MONITOR;1402break;1403#endif14041405#if (RTL8195A_SUPPORT)1406case ODM_RTL8195A:1407support_ability |=1408ODM_BB_DIG |1409ODM_BB_RA_MASK |1410/*ODM_BB_DYNAMIC_TXPWR |*/1411ODM_BB_FA_CNT |1412ODM_BB_RSSI_MONITOR |1413ODM_BB_CCK_PD |1414/*ODM_BB_PWR_TRAIN |*/1415ODM_BB_RATE_ADAPTIVE |1416ODM_BB_CFO_TRACKING |1417ODM_BB_ENV_MONITOR;1418break;1419#endif14201421#if (RTL8195B_SUPPORT)1422case ODM_RTL8195B:1423support_ability |=1424ODM_BB_DIG |1425ODM_BB_RA_MASK |1426/*ODM_BB_DYNAMIC_TXPWR |*/1427ODM_BB_FA_CNT |1428ODM_BB_RSSI_MONITOR |1429ODM_BB_CCK_PD |1430/*ODM_BB_PWR_TRAIN |*/1431ODM_BB_RATE_ADAPTIVE |1432ODM_BB_ADAPTIVITY |1433ODM_BB_CFO_TRACKING;1434/*ODM_BB_ENV_MONITOR*/1435break;1436#endif14371438#if (RTL8721D_SUPPORT)1439case ODM_RTL8721D:1440support_ability |=1441ODM_BB_DIG |1442ODM_BB_RA_MASK |1443/*ODM_BB_DYNAMIC_TXPWR |*/1444ODM_BB_FA_CNT |1445ODM_BB_RSSI_MONITOR |1446ODM_BB_CCK_PD |1447/*ODM_BB_PWR_TRAIN |*/1448ODM_BB_RATE_ADAPTIVE |1449ODM_BB_ADAPTIVITY |1450ODM_BB_CFO_TRACKING |1451ODM_BB_ENV_MONITOR;1452break;1453#endif14541455#if (RTL8710C_SUPPORT)1456case ODM_RTL8710C:1457support_ability |=1458ODM_BB_DIG |1459ODM_BB_RA_MASK |1460/*ODM_BB_DYNAMIC_TXPWR |*/1461ODM_BB_FA_CNT |1462ODM_BB_RSSI_MONITOR |1463ODM_BB_CCK_PD |1464/*ODM_BB_PWR_TRAIN |*/1465ODM_BB_RATE_ADAPTIVE |1466ODM_BB_ADAPTIVITY |1467ODM_BB_CFO_TRACKING |1468ODM_BB_ENV_MONITOR;1469break;1470#endif1471default:1472support_ability |=1473ODM_BB_DIG |1474ODM_BB_RA_MASK |1475/*ODM_BB_DYNAMIC_TXPWR |*/1476ODM_BB_FA_CNT |1477ODM_BB_RSSI_MONITOR |1478ODM_BB_CCK_PD |1479/*ODM_BB_PWR_TRAIN |*/1480ODM_BB_RATE_ADAPTIVE |1481ODM_BB_CFO_TRACKING |1482ODM_BB_ENV_MONITOR;14831484pr_debug("[Warning] Supportability Init Warning !!!\n");1485break;1486}14871488return support_ability;1489}1490#endif14911492void phydm_fwoffload_ability_init(struct dm_struct *dm,1493enum phydm_offload_ability offload_ability)1494{1495switch (offload_ability) {1496case PHYDM_PHY_PARAM_OFFLOAD:1497if (dm->support_ic_type &1498(ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))1499dm->fw_offload_ability |= PHYDM_PHY_PARAM_OFFLOAD;1500break;15011502case PHYDM_RF_IQK_OFFLOAD:1503dm->fw_offload_ability |= PHYDM_RF_IQK_OFFLOAD;1504break;15051506default:1507PHYDM_DBG(dm, ODM_COMP_INIT, "fwofflad, wrong init type!!\n");1508break;1509}15101511PHYDM_DBG(dm, ODM_COMP_INIT, "fw_offload_ability = %x\n",1512dm->fw_offload_ability);1513}15141515void phydm_fwoffload_ability_clear(struct dm_struct *dm,1516enum phydm_offload_ability offload_ability)1517{1518switch (offload_ability) {1519case PHYDM_PHY_PARAM_OFFLOAD:1520if (dm->support_ic_type &1521(ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))1522dm->fw_offload_ability &= (~PHYDM_PHY_PARAM_OFFLOAD);1523break;15241525case PHYDM_RF_IQK_OFFLOAD:1526dm->fw_offload_ability &= (~PHYDM_RF_IQK_OFFLOAD);1527break;15281529default:1530PHYDM_DBG(dm, ODM_COMP_INIT, "fwofflad, wrong init type!!\n");1531break;1532}15331534PHYDM_DBG(dm, ODM_COMP_INIT, "fw_offload_ability = %x\n",1535dm->fw_offload_ability);1536}15371538void phydm_supportability_init(void *dm_void)1539{1540struct dm_struct *dm = (struct dm_struct *)dm_void;1541u64 support_ability;15421543if (dm->manual_supportability &&1544*dm->manual_supportability != 0xffffffff) {1545support_ability = *dm->manual_supportability;1546} else if (*dm->mp_mode) {1547support_ability = 0;1548} else {1549#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))1550support_ability = phydm_supportability_init_win(dm);1551#elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))1552support_ability = phydm_supportability_init_ap(dm);1553#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE))1554support_ability = phydm_supportability_init_ce(dm);1555#elif(DM_ODM_SUPPORT_TYPE & (ODM_IOT))1556support_ability = phydm_supportability_init_iot(dm);1557#endif15581559/*@[Config Antenna Diversity]*/1560if (IS_FUNC_EN(dm->enable_antdiv))1561support_ability |= ODM_BB_ANT_DIV;15621563/*@[Config TXpath Diversity]*/1564if (IS_FUNC_EN(dm->enable_pathdiv))1565support_ability |= ODM_BB_PATH_DIV;15661567/*@[Config Adaptive SOML]*/1568if (IS_FUNC_EN(dm->en_adap_soml))1569support_ability |= ODM_BB_ADAPTIVE_SOML;15701571}1572dm->support_ability = support_ability;1573PHYDM_DBG(dm, ODM_COMP_INIT, "IC=0x%x, mp=%d, Supportability=0x%llx\n",1574dm->support_ic_type, *dm->mp_mode, dm->support_ability);1575}15761577void phydm_rfe_init(void *dm_void)1578{1579struct dm_struct *dm = (struct dm_struct *)dm_void;15801581PHYDM_DBG(dm, ODM_COMP_INIT, "RFE_Init\n");1582#if (RTL8822B_SUPPORT == 1)1583if (dm->support_ic_type == ODM_RTL8822B)1584phydm_rfe_8822b_init(dm);1585#endif1586}15871588void phydm_dm_early_init(struct dm_struct *dm)1589{1590#if (DM_ODM_SUPPORT_TYPE == ODM_CE)1591phydm_init_debug_setting(dm);1592#endif1593}15941595void odm_dm_init(struct dm_struct *dm)1596{1597halrf_init(dm);1598phydm_supportability_init(dm);1599phydm_rfe_init(dm);1600phydm_common_info_self_init(dm);1601phydm_rx_phy_status_init(dm);1602#ifdef PHYDM_AUTO_DEGBUG1603phydm_auto_dbg_engine_init(dm);1604#endif1605phydm_dig_init(dm);1606#ifdef PHYDM_SUPPORT_CCKPD1607phydm_cck_pd_init(dm);1608#endif1609phydm_env_monitor_init(dm);1610phydm_adaptivity_init(dm);1611phydm_ra_info_init(dm);1612phydm_rssi_monitor_init(dm);1613phydm_cfo_tracking_init(dm);1614phydm_rf_init(dm);1615phydm_dc_cancellation(dm);1616#ifdef PHYDM_TXA_CALIBRATION1617phydm_txcurrentcalibration(dm);1618phydm_get_pa_bias_offset(dm);1619#endif1620#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY1621odm_antenna_diversity_init(dm);1622#endif1623#ifdef CONFIG_ADAPTIVE_SOML1624phydm_adaptive_soml_init(dm);1625#endif1626#ifdef CONFIG_PATH_DIVERSITY1627phydm_tx_path_diversity_init(dm);1628#endif1629#ifdef CONFIG_DYNAMIC_TX_TWR1630phydm_dynamic_tx_power_init(dm);1631#endif1632#if (PHYDM_LA_MODE_SUPPORT)1633phydm_la_init(dm);1634#endif16351636#ifdef PHYDM_BEAMFORMING_VERSION11637phydm_beamforming_init(dm);1638#endif16391640#if (RTL8188E_SUPPORT)1641odm_ra_info_init_all(dm);1642#endif1643#ifdef PHYDM_PRIMARY_CCA1644phydm_primary_cca_init(dm);1645#endif1646#ifdef CONFIG_PSD_TOOL1647phydm_psd_init(dm);1648#endif16491650#ifdef CONFIG_SMART_ANTENNA1651phydm_smt_ant_init(dm);1652#endif1653#ifdef PHYDM_LNA_SAT_CHK_SUPPORT1654phydm_lna_sat_check_init(dm);1655#endif1656#ifdef CONFIG_MCC_DM1657phydm_mcc_init(dm);1658#endif16591660#ifdef PHYDM_CCK_RX_PATHDIV_SUPPORT1661phydm_cck_rx_pathdiv_init(dm);1662#endif16631664#ifdef CONFIG_MU_RSOML1665phydm_mu_rsoml_init(dm);1666#endif1667}16681669void odm_dm_reset(struct dm_struct *dm)1670{1671#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY1672odm_ant_div_reset(dm);1673#endif1674phydm_set_edcca_threshold_api(dm);1675}16761677void phydm_supportability_en(void *dm_void, char input[][16], u32 *_used,1678char *output, u32 *_out_len)1679{1680struct dm_struct *dm = (struct dm_struct *)dm_void;1681u32 dm_value[10] = {0};1682u64 pre_support_ability, one = 1;1683u64 comp = 0;1684u32 used = *_used;1685u32 out_len = *_out_len;1686u8 i;16871688for (i = 0; i < 5; i++) {1689if (input[i + 1])1690PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &dm_value[i]);1691}16921693pre_support_ability = dm->support_ability;1694comp = dm->support_ability;16951696PDM_SNPF(out_len, used, output + used, out_len - used,1697"\n================================\n");16981699if (dm_value[0] == 100) {1700PDM_SNPF(out_len, used, output + used, out_len - used,1701"[Supportability] PhyDM Selection\n");1702PDM_SNPF(out_len, used, output + used, out_len - used,1703"================================\n");1704PDM_SNPF(out_len, used, output + used, out_len - used,1705"00. (( %s ))DIG\n",1706((comp & ODM_BB_DIG) ? ("V") : (".")));1707PDM_SNPF(out_len, used, output + used, out_len - used,1708"01. (( %s ))RA_MASK\n",1709((comp & ODM_BB_RA_MASK) ? ("V") : (".")));1710PDM_SNPF(out_len, used, output + used, out_len - used,1711"02. (( %s ))DYN_TXPWR\n",1712((comp & ODM_BB_DYNAMIC_TXPWR) ? ("V") : (".")));1713PDM_SNPF(out_len, used, output + used, out_len - used,1714"03. (( %s ))FA_CNT\n",1715((comp & ODM_BB_FA_CNT) ? ("V") : (".")));1716PDM_SNPF(out_len, used, output + used, out_len - used,1717"04. (( %s ))RSSI_MNTR\n",1718((comp & ODM_BB_RSSI_MONITOR) ? ("V") : (".")));1719PDM_SNPF(out_len, used, output + used, out_len - used,1720"05. (( %s ))CCK_PD\n",1721((comp & ODM_BB_CCK_PD) ? ("V") : (".")));1722PDM_SNPF(out_len, used, output + used, out_len - used,1723"06. (( %s ))ANT_DIV\n",1724((comp & ODM_BB_ANT_DIV) ? ("V") : (".")));1725PDM_SNPF(out_len, used, output + used, out_len - used,1726"07. (( %s ))SMT_ANT\n",1727((comp & ODM_BB_SMT_ANT) ? ("V") : (".")));1728PDM_SNPF(out_len, used, output + used, out_len - used,1729"08. (( %s ))PWR_TRAIN\n",1730((comp & ODM_BB_PWR_TRAIN) ? ("V") : (".")));1731PDM_SNPF(out_len, used, output + used, out_len - used,1732"09. (( %s ))RA\n",1733((comp & ODM_BB_RATE_ADAPTIVE) ? ("V") : (".")));1734PDM_SNPF(out_len, used, output + used, out_len - used,1735"10. (( %s ))PATH_DIV\n",1736((comp & ODM_BB_PATH_DIV) ? ("V") : (".")));1737PDM_SNPF(out_len, used, output + used, out_len - used,1738"11. (( %s ))DFS\n",1739((comp & ODM_BB_DFS) ? ("V") : (".")));1740PDM_SNPF(out_len, used, output + used, out_len - used,1741"12. (( %s ))DYN_ARFR\n",1742((comp & ODM_BB_DYNAMIC_ARFR) ? ("V") : (".")));1743PDM_SNPF(out_len, used, output + used, out_len - used,1744"13. (( %s ))ADAPTIVITY\n",1745((comp & ODM_BB_ADAPTIVITY) ? ("V") : (".")));1746PDM_SNPF(out_len, used, output + used, out_len - used,1747"14. (( %s ))CFO_TRACK\n",1748((comp & ODM_BB_CFO_TRACKING) ? ("V") : (".")));1749PDM_SNPF(out_len, used, output + used, out_len - used,1750"15. (( %s ))ENV_MONITOR\n",1751((comp & ODM_BB_ENV_MONITOR) ? ("V") : (".")));1752PDM_SNPF(out_len, used, output + used, out_len - used,1753"16. (( %s ))PRI_CCA\n",1754((comp & ODM_BB_PRIMARY_CCA) ? ("V") : (".")));1755PDM_SNPF(out_len, used, output + used, out_len - used,1756"17. (( %s ))ADPTV_SOML\n",1757((comp & ODM_BB_ADAPTIVE_SOML) ? ("V") : (".")));1758PDM_SNPF(out_len, used, output + used, out_len - used,1759"18. (( %s ))LNA_SAT_CHK\n",1760((comp & ODM_BB_LNA_SAT_CHK) ? ("V") : (".")));17611762PDM_SNPF(out_len, used, output + used, out_len - used,1763"================================\n");1764PDM_SNPF(out_len, used, output + used, out_len - used,1765"[Supportability] PhyDM offload ability\n");1766PDM_SNPF(out_len, used, output + used, out_len - used,1767"================================\n");17681769PDM_SNPF(out_len, used, output + used, out_len - used,1770"00. (( %s ))PHY PARAM OFFLOAD\n",1771((dm->fw_offload_ability & PHYDM_PHY_PARAM_OFFLOAD) ?1772("V") : (".")));1773PDM_SNPF(out_len, used, output + used, out_len - used,1774"01. (( %s ))RF IQK OFFLOAD\n",1775((dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ?1776("V") : (".")));1777PDM_SNPF(out_len, used, output + used, out_len - used,1778"================================\n");17791780} else if (dm_value[0] == 101) {1781dm->support_ability = 0;1782PDM_SNPF(out_len, used, output + used, out_len - used,1783"Disable all support_ability components\n");1784} else {1785if (dm_value[1] == 1) { /* @enable */1786dm->support_ability |= (one << dm_value[0]);1787} else if (dm_value[1] == 2) {/* @disable */1788dm->support_ability &= ~(one << dm_value[0]);1789} else {1790PDM_SNPF(out_len, used, output + used, out_len - used,1791"[Warning!!!] 1:enable, 2:disable\n");1792}1793}1794PDM_SNPF(out_len, used, output + used, out_len - used,1795"pre-supportability = 0x%llx\n", pre_support_ability);1796PDM_SNPF(out_len, used, output + used, out_len - used,1797"Cur-supportability = 0x%llx\n", dm->support_ability);1798PDM_SNPF(out_len, used, output + used, out_len - used,1799"================================\n");18001801*_used = used;1802*_out_len = out_len;1803}18041805void phydm_watchdog_lps_32k(struct dm_struct *dm)1806{1807PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);18081809phydm_common_info_self_update(dm);1810phydm_rssi_monitor_check(dm);1811phydm_dig_lps_32k(dm);1812phydm_common_info_self_reset(dm);1813}18141815void phydm_watchdog_lps(struct dm_struct *dm)1816{1817#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_IOT))1818PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);18191820phydm_common_info_self_update(dm);1821phydm_rssi_monitor_check(dm);1822phydm_basic_dbg_message(dm);1823phydm_receiver_blocking(dm);1824phydm_false_alarm_counter_statistics(dm);1825phydm_dig_by_rssi_lps(dm);1826#ifdef PHYDM_SUPPORT_CCKPD1827phydm_cck_pd_th(dm);1828#endif1829phydm_adaptivity(dm);1830#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))1831#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY1832/*@enable AntDiv in PS mode, request from SD4 Jeff*/1833odm_antenna_diversity(dm);1834#endif1835#endif1836phydm_common_info_self_reset(dm);1837#endif1838}18391840void phydm_watchdog_mp(struct dm_struct *dm)1841{1842}18431844void phydm_pause_dm_watchdog(void *dm_void, enum phydm_pause_type pause_type)1845{1846struct dm_struct *dm = (struct dm_struct *)dm_void;18471848if (pause_type == PHYDM_PAUSE) {1849dm->disable_phydm_watchdog = 1;1850PHYDM_DBG(dm, ODM_COMP_API, "PHYDM Stop\n");1851} else {1852dm->disable_phydm_watchdog = 0;1853PHYDM_DBG(dm, ODM_COMP_API, "PHYDM Start\n");1854}1855}18561857u8 phydm_pause_func(void *dm_void, enum phydm_func_idx pause_func,1858enum phydm_pause_type pause_type,1859enum phydm_pause_level pause_lv, u8 val_lehgth,1860u32 *val_buf)1861{1862struct dm_struct *dm = (struct dm_struct *)dm_void;1863struct phydm_func_poiner *func_t = &dm->phydm_func_handler;1864s8 *pause_lv_pre = &dm->s8_dummy;1865u32 *bkp_val = &dm->u32_dummy;1866u32 ori_val[5] = {0};1867u64 pause_func_bitmap = (u64)BIT(pause_func);1868u8 i = 0;1869u8 en_2rcca = 0;1870u8 en_bw40m = 0;1871u8 pause_result = PAUSE_FAIL;18721873PHYDM_DBG(dm, ODM_COMP_API, "\n");1874PHYDM_DBG(dm, ODM_COMP_API, "[%s][%s] LV=%d, Len=%d\n", __func__,1875((pause_type == PHYDM_PAUSE) ? "Pause" :1876((pause_type == PHYDM_RESUME) ? "Resume" : "Pause no_set")),1877pause_lv, val_lehgth);18781879if (pause_lv >= PHYDM_PAUSE_MAX_NUM) {1880PHYDM_DBG(dm, ODM_COMP_API, "[WARNING]Wrong LV=%d\n", pause_lv);1881return PAUSE_FAIL;1882}18831884if (pause_func == F00_DIG) {1885PHYDM_DBG(dm, ODM_COMP_API, "[DIG]\n");18861887if (val_lehgth != 1) {1888PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");1889return PAUSE_FAIL;1890}18911892ori_val[0] = (u32)(dm->dm_dig_table.cur_ig_value);1893pause_lv_pre = &dm->pause_lv_table.lv_dig;1894bkp_val = (u32 *)(&dm->dm_dig_table.rvrt_val);1895/*@function pointer hook*/1896func_t->pause_phydm_handler = phydm_set_dig_val;18971898#ifdef PHYDM_SUPPORT_CCKPD1899} else if (pause_func == F05_CCK_PD) {1900PHYDM_DBG(dm, ODM_COMP_API, "[CCK_PD]\n");19011902if (val_lehgth != 1) {1903PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");1904return PAUSE_FAIL;1905}19061907ori_val[0] = (u32)dm->dm_cckpd_table.cck_pd_lv;1908pause_lv_pre = &dm->pause_lv_table.lv_cckpd;1909bkp_val = (u32 *)(&dm->dm_cckpd_table.rvrt_val);1910/*@function pointer hook*/1911func_t->pause_phydm_handler = phydm_set_cckpd_val;1912#endif19131914#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY1915} else if (pause_func == F06_ANT_DIV) {1916PHYDM_DBG(dm, ODM_COMP_API, "[AntDiv]\n");19171918if (val_lehgth != 1) {1919PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");1920return PAUSE_FAIL;1921}1922/*@default antenna*/1923ori_val[0] = (u32)(dm->dm_fat_table.rx_idle_ant);1924pause_lv_pre = &dm->pause_lv_table.lv_antdiv;1925bkp_val = (u32 *)(&dm->dm_fat_table.rvrt_val);1926/*@function pointer hook*/1927func_t->pause_phydm_handler = phydm_set_antdiv_val;19281929#endif1930#ifdef PHYDM_SUPPORT_ADAPTIVITY1931} else if (pause_func == F13_ADPTVTY) {1932PHYDM_DBG(dm, ODM_COMP_API, "[Adaptivity]\n");19331934if (val_lehgth != 2) {1935PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 2\n");1936return PAUSE_FAIL;1937}19381939ori_val[0] = (u32)(dm->adaptivity.th_l2h); /*th_l2h*/1940ori_val[1] = (u32)(dm->adaptivity.th_h2l); /*th_h2l*/1941pause_lv_pre = &dm->pause_lv_table.lv_adapt;1942bkp_val = (u32 *)(&dm->adaptivity.rvrt_val);1943/*@function pointer hook*/1944func_t->pause_phydm_handler = phydm_set_edcca_val;19451946#endif1947#ifdef CONFIG_ADAPTIVE_SOML1948} else if (pause_func == F17_ADPTV_SOML) {1949PHYDM_DBG(dm, ODM_COMP_API, "[AD-SOML]\n");19501951if (val_lehgth != 1) {1952PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] length != 1\n");1953return PAUSE_FAIL;1954}1955/*SOML_ON/OFF*/1956ori_val[0] = (u32)(dm->dm_soml_table.soml_on_off);19571958pause_lv_pre = &dm->pause_lv_table.lv_adsl;1959bkp_val = (u32 *)(&dm->dm_soml_table.rvrt_val);1960/*@function pointer hook*/1961func_t->pause_phydm_handler = phydm_set_adsl_val;19621963#endif1964} else {1965PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] error func idx\n");1966return PAUSE_FAIL;1967}19681969PHYDM_DBG(dm, ODM_COMP_API, "Pause_LV{new , pre} = {%d ,%d}\n",1970pause_lv, *pause_lv_pre);19711972if (pause_type == PHYDM_PAUSE || pause_type == PHYDM_PAUSE_NO_SET) {1973if (pause_lv <= *pause_lv_pre) {1974PHYDM_DBG(dm, ODM_COMP_API,1975"[PAUSE FAIL] Pre_LV >= Curr_LV\n");1976return PAUSE_FAIL;1977}19781979if (!(dm->pause_ability & pause_func_bitmap)) {1980for (i = 0; i < val_lehgth; i++)1981bkp_val[i] = ori_val[i];1982}19831984dm->pause_ability |= pause_func_bitmap;1985PHYDM_DBG(dm, ODM_COMP_API, "pause_ability=0x%llx\n",1986dm->pause_ability);19871988if (pause_type == PHYDM_PAUSE) {1989for (i = 0; i < val_lehgth; i++)1990PHYDM_DBG(dm, ODM_COMP_API,1991"[PAUSE SUCCESS] val_idx[%d]{New, Ori}={0x%x, 0x%x}\n",1992i, val_buf[i], bkp_val[i]);1993func_t->pause_phydm_handler(dm, val_buf, val_lehgth);1994} else {1995for (i = 0; i < val_lehgth; i++)1996PHYDM_DBG(dm, ODM_COMP_API,1997"[PAUSE NO Set: SUCCESS] val_idx[%d]{Ori}={0x%x}\n",1998i, bkp_val[i]);1999}20002001*pause_lv_pre = pause_lv;2002pause_result = PAUSE_SUCCESS;20032004} else if (pause_type == PHYDM_RESUME) {2005if (pause_lv < *pause_lv_pre) {2006PHYDM_DBG(dm, ODM_COMP_API,2007"[Resume FAIL] Pre_LV >= Curr_LV\n");2008return PAUSE_FAIL;2009}20102011if ((dm->pause_ability & pause_func_bitmap) == 0) {2012PHYDM_DBG(dm, ODM_COMP_API,2013"[RESUME] No Need to Revert\n");2014return PAUSE_SUCCESS;2015}20162017dm->pause_ability &= ~pause_func_bitmap;2018PHYDM_DBG(dm, ODM_COMP_API, "pause_ability=0x%llx\n",2019dm->pause_ability);20202021*pause_lv_pre = PHYDM_PAUSE_RELEASE;20222023for (i = 0; i < val_lehgth; i++) {2024PHYDM_DBG(dm, ODM_COMP_API,2025"[RESUME] val_idx[%d]={0x%x}\n", i,2026bkp_val[i]);2027}20282029func_t->pause_phydm_handler(dm, bkp_val, val_lehgth);20302031pause_result = PAUSE_SUCCESS;2032} else {2033PHYDM_DBG(dm, ODM_COMP_API, "[WARNING] error pause_type\n");2034pause_result = PAUSE_FAIL;2035}2036return pause_result;2037}20382039void phydm_pause_func_console(void *dm_void, char input[][16], u32 *_used,2040char *output, u32 *_out_len)2041{2042struct dm_struct *dm = (struct dm_struct *)dm_void;2043char help[] = "-h";2044u32 var1[10] = {0};2045u32 used = *_used;2046u32 out_len = *_out_len;2047u32 i;2048u8 length = 0;2049u32 buf[5] = {0};2050u8 set_result = 0;2051enum phydm_func_idx func = 0;2052enum phydm_pause_type type = 0;2053enum phydm_pause_level lv = 0;20542055if ((strcmp(input[1], help) == 0)) {2056PDM_SNPF(out_len, used, output + used, out_len - used,2057"{Func} {1:pause,2:pause no set 3:Resume} {lv:0~3} Val[5:0]\n");20582059goto out;2060}20612062for (i = 0; i < 10; i++) {2063if (input[i + 1])2064PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);2065}20662067func = (enum phydm_func_idx)var1[0];2068type = (enum phydm_pause_type)var1[1];2069lv = (enum phydm_pause_level)var1[2];20702071for (i = 0; i < 5; i++)2072buf[i] = var1[3 + i];20732074if (func == F00_DIG) {2075PDM_SNPF(out_len, used, output + used, out_len - used,2076"[DIG]\n");2077length = 1;20782079} else if (func == F05_CCK_PD) {2080PDM_SNPF(out_len, used, output + used, out_len - used,2081"[CCK_PD]\n");2082length = 1;2083} else if (func == F06_ANT_DIV) {2084PDM_SNPF(out_len, used, output + used, out_len - used,2085"[Ant_Div]\n");2086length = 1;2087} else if (func == F13_ADPTVTY) {2088PDM_SNPF(out_len, used, output + used, out_len - used,2089"[Adaptivity]\n");2090length = 2;2091} else if (func == F17_ADPTV_SOML) {2092PDM_SNPF(out_len, used, output + used, out_len - used,2093"[ADSL]\n");2094length = 1;2095} else {2096PDM_SNPF(out_len, used, output + used, out_len - used,2097"[Set Function Error]\n");2098length = 0;2099}21002101if (length != 0) {2102PDM_SNPF(out_len, used, output + used, out_len - used,2103"{%s, lv=%d} val = %d, %d}\n",2104((type == PHYDM_PAUSE) ? "Pause" :2105((type == PHYDM_RESUME) ? "Resume" : "Pause no_set")),2106lv, var1[3], var1[4]);21072108set_result = phydm_pause_func(dm, func, type, lv, length, buf);2109}21102111PDM_SNPF(out_len, used, output + used, out_len - used,2112"set_result = %d\n", set_result);21132114out:2115*_used = used;2116*_out_len = out_len;2117}21182119void phydm_pause_dm_by_asso_pkt(struct dm_struct *dm,2120enum phydm_pause_type pause_type, u8 rssi)2121{2122u32 igi_val = rssi + 10;2123u32 th_buf[2];21242125PHYDM_DBG(dm, ODM_COMP_API, "[%s][%s] rssi=%d\n", __func__,2126((pause_type == PHYDM_PAUSE) ? "Pause" :2127((pause_type == PHYDM_RESUME) ? "Resume" : "Pause no_set")),2128rssi);21292130if (pause_type == PHYDM_RESUME) {2131phydm_pause_func(dm, F00_DIG, PHYDM_RESUME,2132PHYDM_PAUSE_LEVEL_1, 1, &igi_val);21332134phydm_pause_func(dm, F13_ADPTVTY, PHYDM_RESUME,2135PHYDM_PAUSE_LEVEL_1, 2, th_buf);2136} else {2137odm_write_dig(dm, (u8)igi_val);2138phydm_pause_func(dm, F00_DIG, PHYDM_PAUSE,2139PHYDM_PAUSE_LEVEL_1, 1, &igi_val);21402141th_buf[0] = 0xff;2142th_buf[1] = 0xff;21432144phydm_pause_func(dm, F13_ADPTVTY, PHYDM_PAUSE,2145PHYDM_PAUSE_LEVEL_1, 2, th_buf);2146}2147}21482149u8 phydm_stop_dm_watchdog_check(void *dm_void)2150{2151struct dm_struct *dm = (struct dm_struct *)dm_void;21522153if (dm->disable_phydm_watchdog == 1) {2154PHYDM_DBG(dm, DBG_COMMON_FLOW, "Disable phydm\n");2155return true;2156} else {2157return false;2158}2159}21602161void phydm_watchdog(struct dm_struct *dm)2162{2163PHYDM_DBG(dm, DBG_COMMON_FLOW, "%s ======>\n", __func__);21642165phydm_common_info_self_update(dm);2166phydm_phy_info_update(dm);2167phydm_rssi_monitor_check(dm);2168phydm_basic_dbg_message(dm);2169phydm_dm_summary(dm, FIRST_MACID);2170#ifdef PHYDM_AUTO_DEGBUG2171phydm_auto_dbg_engine(dm);2172#endif2173phydm_receiver_blocking(dm);21742175if (phydm_stop_dm_watchdog_check(dm) == true)2176return;21772178phydm_hw_setting(dm);21792180#ifdef PHYDM_TDMA_DIG_SUPPORT2181if (dm->original_dig_restore == 0)2182phydm_tdma_dig_timer_check(dm);2183else2184#endif2185{2186phydm_false_alarm_counter_statistics(dm);2187phydm_noisy_detection(dm);2188phydm_dig(dm);2189#ifdef PHYDM_SUPPORT_CCKPD2190phydm_cck_pd_th(dm);2191#endif2192}21932194#ifdef PHYDM_POWER_TRAINING_SUPPORT2195phydm_update_power_training_state(dm);2196#endif2197phydm_adaptivity(dm);2198phydm_ra_info_watchdog(dm);2199#ifdef CONFIG_PATH_DIVERSITY2200phydm_tx_path_diversity(dm);2201#endif2202phydm_cfo_tracking(dm);2203#ifdef CONFIG_DYNAMIC_TX_TWR2204phydm_dynamic_tx_power(dm);2205#endif2206#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY2207odm_antenna_diversity(dm);2208#endif2209#ifdef CONFIG_ADAPTIVE_SOML2210phydm_adaptive_soml(dm);2211#endif22122213#ifdef PHYDM_BEAMFORMING_VERSION12214phydm_beamforming_watchdog(dm);2215#endif22162217halrf_watchdog(dm);2218#ifdef PHYDM_PRIMARY_CCA2219phydm_primary_cca(dm);2220#endif2221#if (DM_ODM_SUPPORT_TYPE == ODM_CE)2222odm_dtc(dm);2223#endif22242225phydm_env_mntr_watchdog(dm);22262227#ifdef PHYDM_LNA_SAT_CHK_SUPPORT2228phydm_lna_sat_chk_watchdog(dm);2229#endif22302231#ifdef CONFIG_MCC_DM2232phydm_mcc_switch(dm);2233#endif22342235#ifdef CONFIG_MU_RSOML2236phydm_mu_rsoml_decision(dm);2237#endif22382239phydm_common_info_self_reset(dm);2240}22412242/*@2243* Init /.. Fixed HW value. Only init time.2244*/2245void odm_cmn_info_init(struct dm_struct *dm, enum odm_cmninfo cmn_info,2246u64 value)2247{2248/* This section is used for init value */2249switch (cmn_info) {2250/* @Fixed ODM value. */2251case ODM_CMNINFO_ABILITY:2252dm->support_ability = (u64)value;2253break;22542255case ODM_CMNINFO_RF_TYPE:2256dm->rf_type = (u8)value;2257break;22582259case ODM_CMNINFO_PLATFORM:2260dm->support_platform = (u8)value;2261break;22622263case ODM_CMNINFO_INTERFACE:2264dm->support_interface = (u8)value;2265break;22662267case ODM_CMNINFO_MP_TEST_CHIP:2268dm->is_mp_chip = (u8)value;2269break;22702271case ODM_CMNINFO_IC_TYPE:2272dm->support_ic_type = (u32)value;2273break;22742275case ODM_CMNINFO_CUT_VER:2276dm->cut_version = (u8)value;2277break;22782279case ODM_CMNINFO_FAB_VER:2280dm->fab_version = (u8)value;2281break;2282case ODM_CMNINFO_FW_VER:2283dm->fw_version = (u8)value;2284break;2285case ODM_CMNINFO_FW_SUB_VER:2286dm->fw_sub_version = (u8)value;2287break;2288case ODM_CMNINFO_RFE_TYPE:2289#if (RTL8821C_SUPPORT)2290if (dm->support_ic_type & ODM_RTL8821C)2291dm->rfe_type_expand = (u8)value;2292else2293#endif2294dm->rfe_type = (u8)value;22952296#ifdef CONFIG_RFE_BY_HW_INFO2297phydm_init_hw_info_by_rfe(dm);2298#endif2299break;23002301case ODM_CMNINFO_RF_ANTENNA_TYPE:2302dm->ant_div_type = (u8)value;2303break;23042305case ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH:2306dm->with_extenal_ant_switch = (u8)value;2307break;23082309#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY2310case ODM_CMNINFO_BE_FIX_TX_ANT:2311dm->dm_fat_table.b_fix_tx_ant = (u8)value;2312break;2313#endif23142315case ODM_CMNINFO_BOARD_TYPE:2316if (!dm->is_init_hw_info_by_rfe)2317dm->board_type = (u8)value;2318break;23192320case ODM_CMNINFO_PACKAGE_TYPE:2321if (!dm->is_init_hw_info_by_rfe)2322dm->package_type = (u8)value;2323break;23242325case ODM_CMNINFO_EXT_LNA:2326if (!dm->is_init_hw_info_by_rfe)2327dm->ext_lna = (u8)value;2328break;23292330case ODM_CMNINFO_5G_EXT_LNA:2331if (!dm->is_init_hw_info_by_rfe)2332dm->ext_lna_5g = (u8)value;2333break;23342335case ODM_CMNINFO_EXT_PA:2336if (!dm->is_init_hw_info_by_rfe)2337dm->ext_pa = (u8)value;2338break;23392340case ODM_CMNINFO_5G_EXT_PA:2341if (!dm->is_init_hw_info_by_rfe)2342dm->ext_pa_5g = (u8)value;2343break;23442345case ODM_CMNINFO_GPA:2346if (!dm->is_init_hw_info_by_rfe)2347dm->type_gpa = (u16)value;2348break;23492350case ODM_CMNINFO_APA:2351if (!dm->is_init_hw_info_by_rfe)2352dm->type_apa = (u16)value;2353break;23542355case ODM_CMNINFO_GLNA:2356if (!dm->is_init_hw_info_by_rfe)2357dm->type_glna = (u16)value;2358break;23592360case ODM_CMNINFO_ALNA:2361if (!dm->is_init_hw_info_by_rfe)2362dm->type_alna = (u16)value;2363break;23642365case ODM_CMNINFO_EXT_TRSW:2366if (!dm->is_init_hw_info_by_rfe)2367dm->ext_trsw = (u8)value;2368break;2369case ODM_CMNINFO_EXT_LNA_GAIN:2370dm->ext_lna_gain = (u8)value;2371break;2372case ODM_CMNINFO_PATCH_ID:2373dm->iot_table.win_patch_id = (u8)value;2374break;2375case ODM_CMNINFO_BINHCT_TEST:2376dm->is_in_hct_test = (boolean)value;2377break;2378case ODM_CMNINFO_BWIFI_TEST:2379dm->wifi_test = (u8)value;2380break;2381case ODM_CMNINFO_SMART_CONCURRENT:2382dm->is_dual_mac_smart_concurrent = (boolean)value;2383break;2384#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))2385case ODM_CMNINFO_CONFIG_BB_RF:2386dm->config_bbrf = (boolean)value;2387break;2388#endif2389case ODM_CMNINFO_IQKPAOFF:2390dm->rf_calibrate_info.is_iqk_pa_off = (boolean)value;2391break;2392case ODM_CMNINFO_REGRFKFREEENABLE:2393dm->rf_calibrate_info.reg_rf_kfree_enable = (u8)value;2394break;2395case ODM_CMNINFO_RFKFREEENABLE:2396dm->rf_calibrate_info.rf_kfree_enable = (u8)value;2397break;2398case ODM_CMNINFO_NORMAL_RX_PATH_CHANGE:2399dm->normal_rx_path = (u8)value;2400break;2401case ODM_CMNINFO_VALID_PATH_SET:2402dm->valid_path_set = (u8)value;2403break;2404case ODM_CMNINFO_EFUSE0X3D8:2405dm->efuse0x3d8 = (u8)value;2406break;2407case ODM_CMNINFO_EFUSE0X3D7:2408dm->efuse0x3d7 = (u8)value;2409break;2410case ODM_CMNINFO_ADVANCE_OTA:2411dm->p_advance_ota = (u8)value;2412break;24132414#ifdef CONFIG_PHYDM_DFS_MASTER2415case ODM_CMNINFO_DFS_REGION_DOMAIN:2416dm->dfs_region_domain = (u8)value;2417break;2418#endif2419case ODM_CMNINFO_SOFT_AP_SPECIAL_SETTING:2420dm->soft_ap_special_setting = (u32)value;2421break;24222423case ODM_CMNINFO_X_CAP_SETTING:2424dm->dm_cfo_track.crystal_cap_default = (u8)value;2425break;24262427case ODM_CMNINFO_DPK_EN:2428/*@dm->dpk_en = (u1Byte)value;*/2429halrf_cmn_info_set(dm, HALRF_CMNINFO_DPK_EN, (u64)value);2430break;24312432case ODM_CMNINFO_HP_HWID:2433dm->hp_hw_id = (boolean)value;2434break;2435case ODM_CMNINFO_TSSI_ENABLE:2436dm->en_tssi_mode = (u8)value;2437break;2438case ODM_CMNINFO_DIS_DPD:2439dm->en_dis_dpd = (boolean)value;2440break;2441#if (RTL8721D_SUPPORT)2442case ODM_CMNINFO_POWER_VOLTAGE:2443dm->power_voltage = (u8)value;2444break;2445#endif2446default:2447break;2448}2449}24502451void odm_cmn_info_hook(struct dm_struct *dm, enum odm_cmninfo cmn_info,2452void *value)2453{2454/* @Hook call by reference pointer. */2455switch (cmn_info) {2456/* @Dynamic call by reference pointer. */2457case ODM_CMNINFO_TX_UNI:2458dm->num_tx_bytes_unicast = (u64 *)value;2459break;24602461case ODM_CMNINFO_RX_UNI:2462dm->num_rx_bytes_unicast = (u64 *)value;2463break;24642465case ODM_CMNINFO_BAND:2466dm->band_type = (u8 *)value;2467break;24682469case ODM_CMNINFO_SEC_CHNL_OFFSET:2470dm->sec_ch_offset = (u8 *)value;2471break;24722473case ODM_CMNINFO_SEC_MODE:2474dm->security = (u8 *)value;2475break;24762477case ODM_CMNINFO_BW:2478dm->band_width = (u8 *)value;2479break;24802481case ODM_CMNINFO_CHNL:2482dm->channel = (u8 *)value;2483break;24842485case ODM_CMNINFO_SCAN:2486dm->is_scan_in_process = (boolean *)value;2487break;24882489case ODM_CMNINFO_POWER_SAVING:2490dm->is_power_saving = (boolean *)value;2491break;24922493case ODM_CMNINFO_TDMA:2494dm->is_tdma = (boolean *)value;2495break;24962497case ODM_CMNINFO_ONE_PATH_CCA:2498dm->one_path_cca = (u8 *)value;2499break;25002501case ODM_CMNINFO_DRV_STOP:2502dm->is_driver_stopped = (boolean *)value;2503break;2504case ODM_CMNINFO_INIT_ON:2505dm->pinit_adpt_in_progress = (boolean *)value;2506break;25072508case ODM_CMNINFO_ANT_TEST:2509dm->antenna_test = (u8 *)value;2510break;25112512case ODM_CMNINFO_NET_CLOSED:2513dm->is_net_closed = (boolean *)value;2514break;25152516case ODM_CMNINFO_FORCED_RATE:2517dm->forced_data_rate = (u16 *)value;2518break;2519case ODM_CMNINFO_ANT_DIV:2520dm->enable_antdiv = (u8 *)value;2521break;2522case ODM_CMNINFO_PATH_DIV:2523dm->enable_pathdiv = (u8 *)value;2524break;2525case ODM_CMNINFO_ADAPTIVE_SOML:2526dm->en_adap_soml = (u8 *)value;2527break;2528case ODM_CMNINFO_ADAPTIVITY:2529dm->edcca_mode = (u8 *)value;2530break;25312532case ODM_CMNINFO_P2P_LINK:2533dm->dm_dig_table.is_p2p_in_process = (u8 *)value;2534break;25352536case ODM_CMNINFO_IS1ANTENNA:2537dm->is_1_antenna = (boolean *)value;2538break;25392540case ODM_CMNINFO_RFDEFAULTPATH:2541dm->rf_default_path = (u8 *)value;2542break;25432544case ODM_CMNINFO_FCS_MODE: /* @fast channel switch (= MCC mode)*/2545dm->is_fcs_mode_enable = (boolean *)value;2546break;25472548case ODM_CMNINFO_HUBUSBMODE:2549dm->hub_usb_mode = (u8 *)value;2550break;2551case ODM_CMNINFO_FWDWRSVDPAGEINPROGRESS:2552dm->is_fw_dw_rsvd_page_in_progress = (boolean *)value;2553break;2554case ODM_CMNINFO_TX_TP:2555dm->current_tx_tp = (u32 *)value;2556break;2557case ODM_CMNINFO_RX_TP:2558dm->current_rx_tp = (u32 *)value;2559break;2560case ODM_CMNINFO_SOUNDING_SEQ:2561dm->sounding_seq = (u8 *)value;2562break;2563#ifdef CONFIG_PHYDM_DFS_MASTER2564case ODM_CMNINFO_DFS_MASTER_ENABLE:2565dm->dfs_master_enabled = (u8 *)value;2566break;2567#endif25682569#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY2570case ODM_CMNINFO_FORCE_TX_ANT_BY_TXDESC:2571dm->dm_fat_table.p_force_tx_by_desc = (u8 *)value;2572break;2573case ODM_CMNINFO_SET_S0S1_DEFAULT_ANTENNA:2574dm->dm_fat_table.p_default_s0_s1 = (u8 *)value;2575break;2576case ODM_CMNINFO_BF_ANTDIV_DECISION:2577dm->dm_fat_table.is_no_csi_feedback = (boolean *)value;2578break;2579#endif25802581case ODM_CMNINFO_SOFT_AP_MODE:2582dm->soft_ap_mode = (u32 *)value;2583break;2584case ODM_CMNINFO_MP_MODE:2585dm->mp_mode = (u8 *)value;2586break;2587case ODM_CMNINFO_INTERRUPT_MASK:2588dm->interrupt_mask = (u32 *)value;2589break;2590case ODM_CMNINFO_BB_OPERATION_MODE:2591dm->bb_op_mode = (u8 *)value;2592break;2593case ODM_CMNINFO_MANUAL_SUPPORTABILITY:2594dm->manual_supportability = (u32 *)value;2595break;2596default:2597/*do nothing*/2598break;2599}2600}26012602/*@2603* Update band/CHannel/.. The values are dynamic but non-per-packet.2604*/2605void odm_cmn_info_update(struct dm_struct *dm, u32 cmn_info, u64 value)2606{2607/* This init variable may be changed in run time. */2608switch (cmn_info) {2609case ODM_CMNINFO_LINK_IN_PROGRESS:2610dm->is_link_in_process = (boolean)value;2611break;26122613case ODM_CMNINFO_ABILITY:2614dm->support_ability = (u64)value;2615break;26162617case ODM_CMNINFO_RF_TYPE:2618dm->rf_type = (u8)value;2619break;26202621case ODM_CMNINFO_WIFI_DIRECT:2622dm->is_wifi_direct = (boolean)value;2623break;26242625case ODM_CMNINFO_WIFI_DISPLAY:2626dm->is_wifi_display = (boolean)value;2627break;26282629case ODM_CMNINFO_LINK:2630dm->is_linked = (boolean)value;2631break;26322633case ODM_CMNINFO_CMW500LINK:2634dm->iot_table.is_linked_cmw500 = (boolean)value;2635break;26362637case ODM_CMNINFO_STATION_STATE:2638dm->bsta_state = (boolean)value;2639break;26402641case ODM_CMNINFO_RSSI_MIN:2642dm->rssi_min = (u8)value;2643break;26442645case ODM_CMNINFO_RSSI_MIN_BY_PATH:2646dm->rssi_min_by_path = (u8)value;2647break;26482649case ODM_CMNINFO_DBG_COMP:2650dm->debug_components = (u64)value;2651break;26522653#ifdef ODM_CONFIG_BT_COEXIST2654/* The following is for BT HS mode and BT coexist mechanism. */2655case ODM_CMNINFO_BT_ENABLED:2656dm->bt_info_table.is_bt_enabled = (boolean)value;2657break;26582659case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:2660dm->bt_info_table.is_bt_connect_process = (boolean)value;2661break;26622663case ODM_CMNINFO_BT_HS_RSSI:2664dm->bt_info_table.bt_hs_rssi = (u8)value;2665break;26662667case ODM_CMNINFO_BT_OPERATION:2668dm->bt_info_table.is_bt_hs_operation = (boolean)value;2669break;26702671case ODM_CMNINFO_BT_LIMITED_DIG:2672dm->bt_info_table.is_bt_limited_dig = (boolean)value;2673break;2674#endif26752676case ODM_CMNINFO_AP_TOTAL_NUM:2677dm->ap_total_num = (u8)value;2678break;26792680#ifdef CONFIG_PHYDM_DFS_MASTER2681case ODM_CMNINFO_DFS_REGION_DOMAIN:2682dm->dfs_region_domain = (u8)value;2683break;2684#endif26852686case ODM_CMNINFO_BT_CONTINUOUS_TURN:2687dm->is_bt_continuous_turn = (boolean)value;2688break;2689case ODM_CMNINFO_IS_DOWNLOAD_FW:2690dm->is_download_fw = (boolean)value;2691break;2692case ODM_CMNINFO_PHYDM_PATCH_ID:2693dm->iot_table.phydm_patch_id = (u32)value;2694break;2695case ODM_CMNINFO_RRSR_VAL:2696dm->dm_ra_table.rrsr_val_init = (u32)value;2697break;2698case ODM_CMNINFO_LINKED_BF_SUPPORT:2699dm->linked_bf_support = (u8)value;2700break;2701default:2702break;2703}2704}27052706u32 phydm_cmn_info_query(struct dm_struct *dm, enum phydm_info_query info_type)2707{2708struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;2709struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2710struct ccx_info *ccx_info = &dm->dm_ccx_info;27112712switch (info_type) {2713/*@=== [FA Relative] ===========================================*/2714case PHYDM_INFO_FA_OFDM:2715return fa_t->cnt_ofdm_fail;27162717case PHYDM_INFO_FA_CCK:2718return fa_t->cnt_cck_fail;27192720case PHYDM_INFO_FA_TOTAL:2721return fa_t->cnt_all;27222723case PHYDM_INFO_CCA_OFDM:2724return fa_t->cnt_ofdm_cca;27252726case PHYDM_INFO_CCA_CCK:2727return fa_t->cnt_cck_cca;27282729case PHYDM_INFO_CCA_ALL:2730return fa_t->cnt_cca_all;27312732case PHYDM_INFO_CRC32_OK_VHT:2733return fa_t->cnt_vht_crc32_ok;27342735case PHYDM_INFO_CRC32_OK_HT:2736return fa_t->cnt_ht_crc32_ok;27372738case PHYDM_INFO_CRC32_OK_LEGACY:2739return fa_t->cnt_ofdm_crc32_ok;27402741case PHYDM_INFO_CRC32_OK_CCK:2742return fa_t->cnt_cck_crc32_ok;27432744case PHYDM_INFO_CRC32_ERROR_VHT:2745return fa_t->cnt_vht_crc32_error;27462747case PHYDM_INFO_CRC32_ERROR_HT:2748return fa_t->cnt_ht_crc32_error;27492750case PHYDM_INFO_CRC32_ERROR_LEGACY:2751return fa_t->cnt_ofdm_crc32_error;27522753case PHYDM_INFO_CRC32_ERROR_CCK:2754return fa_t->cnt_cck_crc32_error;27552756case PHYDM_INFO_EDCCA_FLAG:2757return fa_t->edcca_flag;27582759case PHYDM_INFO_OFDM_ENABLE:2760return fa_t->ofdm_block_enable;27612762case PHYDM_INFO_CCK_ENABLE:2763return fa_t->cck_block_enable;27642765case PHYDM_INFO_DBG_PORT_0:2766return fa_t->dbg_port0;27672768case PHYDM_INFO_CRC32_OK_HT_AGG:2769return fa_t->cnt_ht_crc32_ok_agg;27702771case PHYDM_INFO_CRC32_ERROR_HT_AGG:2772return fa_t->cnt_ht_crc32_error_agg;27732774/*@=== [DIG] ================================================*/27752776case PHYDM_INFO_CURR_IGI:2777return dig_t->cur_ig_value;27782779/*@=== [RSSI] ===============================================*/2780case PHYDM_INFO_RSSI_MIN:2781return (u32)dm->rssi_min;27822783case PHYDM_INFO_RSSI_MAX:2784return (u32)dm->rssi_max;27852786case PHYDM_INFO_CLM_RATIO:2787return (u32)ccx_info->clm_ratio;2788case PHYDM_INFO_NHM_RATIO:2789return (u32)ccx_info->nhm_ratio;2790case PHYDM_INFO_NHM_NOISE_PWR:2791return (u32)ccx_info->nhm_noise_pwr;2792default:2793return 0xffffffff;2794}2795}27962797#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)2798void odm_init_all_work_items(struct dm_struct *dm)2799{2800void *adapter = dm->adapter;2801#if USE_WORKITEM28022803#ifdef CONFIG_ADAPTIVE_SOML2804odm_initialize_work_item(dm,2805&dm->dm_soml_table.phydm_adaptive_soml_workitem,2806(RT_WORKITEM_CALL_BACK)phydm_adaptive_soml_workitem_callback,2807(void *)adapter,2808"AdaptiveSOMLWorkitem");2809#endif28102811#ifdef ODM_EVM_ENHANCE_ANTDIV2812odm_initialize_work_item(dm,2813&dm->phydm_evm_antdiv_workitem,2814(RT_WORKITEM_CALL_BACK)phydm_evm_antdiv_workitem_callback,2815(void *)adapter,2816"EvmAntdivWorkitem");2817#endif28182819#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY2820odm_initialize_work_item(dm,2821&dm->dm_swat_table.phydm_sw_antenna_switch_workitem,2822(RT_WORKITEM_CALL_BACK)odm_sw_antdiv_workitem_callback,2823(void *)adapter,2824"AntennaSwitchWorkitem");2825#endif2826#if (defined(CONFIG_HL_SMART_ANTENNA))2827odm_initialize_work_item(dm,2828&dm->dm_sat_table.hl_smart_antenna_workitem,2829(RT_WORKITEM_CALL_BACK)phydm_beam_switch_workitem_callback,2830(void *)adapter,2831"hl_smart_ant_workitem");28322833odm_initialize_work_item(dm,2834&dm->dm_sat_table.hl_smart_antenna_decision_workitem,2835(RT_WORKITEM_CALL_BACK)phydm_beam_decision_workitem_callback,2836(void *)adapter,2837"hl_smart_ant_decision_workitem");2838#endif28392840odm_initialize_work_item(2841dm,2842&dm->ra_rpt_workitem,2843(RT_WORKITEM_CALL_BACK)halrf_update_init_rate_work_item_callback,2844(void *)adapter,2845"ra_rpt_workitem");28462847#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))2848odm_initialize_work_item(2849dm,2850&dm->fast_ant_training_workitem,2851(RT_WORKITEM_CALL_BACK)odm_fast_ant_training_work_item_callback,2852(void *)adapter,2853"fast_ant_training_workitem");2854#endif28552856#endif /*#if USE_WORKITEM*/28572858#ifdef PHYDM_BEAMFORMING_SUPPORT2859odm_initialize_work_item(2860dm,2861&dm->beamforming_info.txbf_info.txbf_enter_work_item,2862(RT_WORKITEM_CALL_BACK)hal_com_txbf_enter_work_item_callback,2863(void *)adapter,2864"txbf_enter_work_item");28652866odm_initialize_work_item(2867dm,2868&dm->beamforming_info.txbf_info.txbf_leave_work_item,2869(RT_WORKITEM_CALL_BACK)hal_com_txbf_leave_work_item_callback,2870(void *)adapter,2871"txbf_leave_work_item");28722873odm_initialize_work_item(2874dm,2875&dm->beamforming_info.txbf_info.txbf_fw_ndpa_work_item,2876(RT_WORKITEM_CALL_BACK)hal_com_txbf_fw_ndpa_work_item_callback,2877(void *)adapter,2878"txbf_fw_ndpa_work_item");28792880odm_initialize_work_item(2881dm,2882&dm->beamforming_info.txbf_info.txbf_clk_work_item,2883(RT_WORKITEM_CALL_BACK)hal_com_txbf_clk_work_item_callback,2884(void *)adapter,2885"txbf_clk_work_item");28862887odm_initialize_work_item(2888dm,2889&dm->beamforming_info.txbf_info.txbf_rate_work_item,2890(RT_WORKITEM_CALL_BACK)hal_com_txbf_rate_work_item_callback,2891(void *)adapter,2892"txbf_rate_work_item");28932894odm_initialize_work_item(2895dm,2896&dm->beamforming_info.txbf_info.txbf_status_work_item,2897(RT_WORKITEM_CALL_BACK)hal_com_txbf_status_work_item_callback,2898(void *)adapter,2899"txbf_status_work_item");29002901odm_initialize_work_item(2902dm,2903&dm->beamforming_info.txbf_info.txbf_reset_tx_path_work_item,2904(RT_WORKITEM_CALL_BACK)hal_com_txbf_reset_tx_path_work_item_callback,2905(void *)adapter,2906"txbf_reset_tx_path_work_item");29072908odm_initialize_work_item(2909dm,2910&dm->beamforming_info.txbf_info.txbf_get_tx_rate_work_item,2911(RT_WORKITEM_CALL_BACK)hal_com_txbf_get_tx_rate_work_item_callback,2912(void *)adapter,2913"txbf_get_tx_rate_work_item");2914#endif29152916#if (PHYDM_LA_MODE_SUPPORT == 1)2917odm_initialize_work_item(2918dm,2919&dm->adcsmp.adc_smp_work_item,2920(RT_WORKITEM_CALL_BACK)adc_smp_work_item_callback,2921(void *)adapter,2922"adc_smp_work_item");29232924odm_initialize_work_item(2925dm,2926&dm->adcsmp.adc_smp_work_item_1,2927(RT_WORKITEM_CALL_BACK)adc_smp_work_item_callback,2928(void *)adapter,2929"adc_smp_work_item_1");2930#endif2931}29322933void odm_free_all_work_items(struct dm_struct *dm)2934{2935#if USE_WORKITEM29362937#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY2938odm_free_work_item(&dm->dm_swat_table.phydm_sw_antenna_switch_workitem);2939#endif29402941#ifdef CONFIG_ADAPTIVE_SOML2942odm_free_work_item(&dm->dm_soml_table.phydm_adaptive_soml_workitem);2943#endif29442945#ifdef ODM_EVM_ENHANCE_ANTDIV2946odm_free_work_item(&dm->phydm_evm_antdiv_workitem);2947#endif29482949#if (defined(CONFIG_HL_SMART_ANTENNA))2950odm_free_work_item(&dm->dm_sat_table.hl_smart_antenna_workitem);2951odm_free_work_item(&dm->dm_sat_table.hl_smart_antenna_decision_workitem);2952#endif29532954#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))2955odm_free_work_item(&dm->fast_ant_training_workitem);2956#endif2957odm_free_work_item(&dm->ra_rpt_workitem);2958/*odm_free_work_item((&dm->sbdcnt_workitem));*/2959#endif29602961#ifdef PHYDM_BEAMFORMING_SUPPORT2962odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_enter_work_item));2963odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_leave_work_item));2964odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_fw_ndpa_work_item));2965odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_clk_work_item));2966odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_rate_work_item));2967odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_status_work_item));2968odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_reset_tx_path_work_item));2969odm_free_work_item((&dm->beamforming_info.txbf_info.txbf_get_tx_rate_work_item));2970#endif29712972#if (PHYDM_LA_MODE_SUPPORT == 1)2973odm_free_work_item((&dm->adcsmp.adc_smp_work_item));2974odm_free_work_item((&dm->adcsmp.adc_smp_work_item_1));2975#endif2976}2977#endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/29782979void odm_init_all_timers(struct dm_struct *dm)2980{2981#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))2982odm_ant_div_timers(dm, INIT_ANTDIV_TIMMER);2983#endif2984#if (defined(PHYDM_TDMA_DIG_SUPPORT))2985#ifdef IS_USE_NEW_TDMA2986phydm_tdma_dig_timers(dm, INIT_TDMA_DIG_TIMMER);2987#endif2988#endif2989#ifdef CONFIG_ADAPTIVE_SOML2990phydm_adaptive_soml_timers(dm, INIT_SOML_TIMMER);2991#endif2992#ifdef PHYDM_LNA_SAT_CHK_SUPPORT2993#ifdef PHYDM_LNA_SAT_CHK_TYPE12994phydm_lna_sat_chk_timers(dm, INIT_LNA_SAT_CHK_TIMMER);2995#endif2996#endif29972998#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)2999odm_initialize_timer(dm, &dm->sbdcnt_timer,3000(void *)phydm_sbd_callback, NULL, "SbdTimer");3001#ifdef PHYDM_BEAMFORMING_SUPPORT3002odm_initialize_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer,3003(void *)hal_com_txbf_fw_ndpa_timer_callback, NULL,3004"txbf_fw_ndpa_timer");3005#endif3006#endif30073008#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))3009#ifdef PHYDM_BEAMFORMING_SUPPORT3010odm_initialize_timer(dm, &dm->beamforming_info.beamforming_timer,3011(void *)beamforming_sw_timer_callback, NULL,3012"beamforming_timer");3013#endif3014#endif3015}30163017void odm_cancel_all_timers(struct dm_struct *dm)3018{3019#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)3020/* @2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in win7*/3021if (dm->adapter == NULL)3022return;3023#endif30243025#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))3026odm_ant_div_timers(dm, CANCEL_ANTDIV_TIMMER);3027#endif3028#ifdef PHYDM_TDMA_DIG_SUPPORT3029#ifdef IS_USE_NEW_TDMA3030phydm_tdma_dig_timers(dm, CANCEL_TDMA_DIG_TIMMER);3031#endif3032#endif3033#ifdef CONFIG_ADAPTIVE_SOML3034phydm_adaptive_soml_timers(dm, CANCEL_SOML_TIMMER);3035#endif3036#ifdef PHYDM_LNA_SAT_CHK_SUPPORT3037#ifdef PHYDM_LNA_SAT_CHK_TYPE13038phydm_lna_sat_chk_timers(dm, CANCEL_LNA_SAT_CHK_TIMMER);3039#endif3040#endif30413042#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)3043odm_cancel_timer(dm, &dm->sbdcnt_timer);3044#ifdef PHYDM_BEAMFORMING_SUPPORT3045odm_cancel_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer);3046#endif3047#endif30483049#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))3050#ifdef PHYDM_BEAMFORMING_SUPPORT3051odm_cancel_timer(dm, &dm->beamforming_info.beamforming_timer);3052#endif3053#endif3054}30553056void odm_release_all_timers(struct dm_struct *dm)3057{3058#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))3059odm_ant_div_timers(dm, RELEASE_ANTDIV_TIMMER);3060#endif3061#ifdef PHYDM_TDMA_DIG_SUPPORT3062#ifdef IS_USE_NEW_TDMA3063phydm_tdma_dig_timers(dm, RELEASE_TDMA_DIG_TIMMER);3064#endif3065#endif3066#ifdef CONFIG_ADAPTIVE_SOML3067phydm_adaptive_soml_timers(dm, RELEASE_SOML_TIMMER);3068#endif3069#ifdef PHYDM_LNA_SAT_CHK_SUPPORT3070#ifdef PHYDM_LNA_SAT_CHK_TYPE13071phydm_lna_sat_chk_timers(dm, RELEASE_LNA_SAT_CHK_TIMMER);3072#endif3073#endif30743075#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)3076odm_release_timer(dm, &dm->sbdcnt_timer);3077#ifdef PHYDM_BEAMFORMING_SUPPORT3078odm_release_timer(dm, &dm->beamforming_info.txbf_info.txbf_fw_ndpa_timer);3079#endif3080#endif30813082#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))3083#ifdef PHYDM_BEAMFORMING_SUPPORT3084odm_release_timer(dm, &dm->beamforming_info.beamforming_timer);3085#endif3086#endif3087}30883089#if (DM_ODM_SUPPORT_TYPE == ODM_AP)3090void odm_init_all_threads(3091struct dm_struct *dm)3092{3093#ifdef TPT_THREAD3094k_tpt_task_init(dm->priv);3095#endif3096}30973098void odm_stop_all_threads(3099struct dm_struct *dm)3100{3101#ifdef TPT_THREAD3102k_tpt_task_stop(dm->priv);3103#endif3104}3105#endif31063107#if (DM_ODM_SUPPORT_TYPE == ODM_CE)3108/* @Justin: According to the current RRSI to adjust Response Frame TX power,3109* 2012/11/053110*/3111void odm_dtc(struct dm_struct *dm)3112{3113#ifdef CONFIG_DM_RESP_TXAGC3114/* RSSI higher than this value, start to decade TX power */3115#define DTC_BASE 3531163117/* RSSI lower than this value, start to increase TX power */3118#define DTC_DWN_BASE (DTC_BASE - 5)31193120/* RSSI vs TX power step mapping: decade TX power */3121static const u8 dtc_table_down[] = {3122DTC_BASE,3123(DTC_BASE + 5),3124(DTC_BASE + 10),3125(DTC_BASE + 15),3126(DTC_BASE + 20),3127(DTC_BASE + 25)};31283129/* RSSI vs TX power step mapping: increase TX power */3130static const u8 dtc_table_up[] = {3131DTC_DWN_BASE,3132(DTC_DWN_BASE - 5),3133(DTC_DWN_BASE - 10),3134(DTC_DWN_BASE - 15),3135(DTC_DWN_BASE - 15),3136(DTC_DWN_BASE - 20),3137(DTC_DWN_BASE - 20),3138(DTC_DWN_BASE - 25),3139(DTC_DWN_BASE - 25),3140(DTC_DWN_BASE - 30),3141(DTC_DWN_BASE - 35)};31423143u8 i;3144u8 dtc_steps = 0;3145u8 sign;3146u8 resp_txagc = 0;31473148#if 03149/* @As DIG is disabled, DTC is also disable */3150if (!(dm->support_ability & ODM_XXXXXX))3151return;3152#endif31533154if (dm->rssi_min > DTC_BASE) {3155/* need to decade the CTS TX power */3156sign = 1;3157for (i = 0; i < ARRAY_SIZE(dtc_table_down); i++) {3158if (dtc_table_down[i] >= dm->rssi_min || dtc_steps >= 6)3159break;3160else3161dtc_steps++;3162}3163}3164#if 03165else if (dm->rssi_min > DTC_DWN_BASE) {3166/* needs to increase the CTS TX power */3167sign = 0;3168dtc_steps = 1;3169for (i = 0; i < ARRAY_SIZE(dtc_table_up); i++) {3170if (dtc_table_up[i] <= dm->rssi_min || dtc_steps >= 10)3171break;3172else3173dtc_steps++;3174}3175}3176#endif3177else {3178sign = 0;3179dtc_steps = 0;3180}31813182resp_txagc = dtc_steps | (sign << 4);3183resp_txagc = resp_txagc | (resp_txagc << 5);3184odm_write_1byte(dm, 0x06d9, resp_txagc);31853186PHYDM_DBG(dm, ODM_COMP_PWR_TRAIN,3187"%s rssi_min:%u, set RESP_TXAGC to %s %u\n", __func__,3188dm->rssi_min, sign ? "minus" : "plus", dtc_steps);3189#endif /* @CONFIG_RESP_TXAGC_ADJUST */3190}31913192#endif /* @#if (DM_ODM_SUPPORT_TYPE == ODM_CE) */31933194/*@<20170126, BB-Kevin>8188F D-CUT DC cancellation and 8821C*/3195void phydm_dc_cancellation(struct dm_struct *dm)3196{3197#ifdef PHYDM_DC_CANCELLATION3198u32 offset_i_hex[PHYDM_MAX_RF_PATH] = {0};3199u32 offset_q_hex[PHYDM_MAX_RF_PATH] = {0};3200u32 reg_value32[PHYDM_MAX_RF_PATH] = {0};3201u8 path = RF_PATH_A;3202u8 set_result;32033204if (!(dm->support_ic_type & ODM_DC_CANCELLATION_SUPPORT))3205return;3206if ((dm->support_ic_type & ODM_RTL8188F) &&3207dm->cut_version < ODM_CUT_D)3208return;3209if ((dm->support_ic_type & ODM_RTL8192F) &&3210dm->cut_version == ODM_CUT_A)3211return;3212if (*dm->band_width == CHANNEL_WIDTH_5)3213return;3214if (*dm->band_width == CHANNEL_WIDTH_10)3215return;32163217PHYDM_DBG(dm, ODM_COMP_API, "%s ======>\n", __func__);32183219/*@DC_Estimation (only for 2x2 ic now) */32203221for (path = RF_PATH_A; path < PHYDM_MAX_RF_PATH; path++) {3222if (path > RF_PATH_A &&3223dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8188F |3224ODM_RTL8710B | ODM_RTL8721D |3225ODM_RTL8710C))3226break;3227else if (path > RF_PATH_B &&3228dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8192F))3229break;3230if (phydm_stop_ic_trx(dm, PHYDM_SET) == PHYDM_SET_FAIL) {3231PHYDM_DBG(dm, ODM_COMP_API, "STOP_TRX_FAIL\n");3232return;3233}3234odm_write_dig(dm, 0x7e);3235/*@Disable LNA*/3236if (dm->support_ic_type & ODM_RTL8821C)3237halrf_rf_lna_setting(dm, HALRF_LNA_DISABLE);3238/*Turn off 3-wire*/3239phydm_stop_3_wire(dm, PHYDM_SET);3240if (dm->support_ic_type & (ODM_RTL8188F | ODM_RTL8710B)) {3241/*set debug port to 0x235*/3242if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x235)) {3243PHYDM_DBG(dm, ODM_COMP_API,3244"Set Debug port Fail\n");3245return;3246}3247} else if (dm->support_ic_type & (ODM_RTL8721D |3248ODM_RTL8710C)) {3249/*set debug port to 0x200*/3250if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_2, 0x200)) {3251PHYDM_DBG(dm, ODM_COMP_API,3252"Set Debug port Fail\n");3253return;3254}3255} else if (dm->support_ic_type & ODM_RTL8821C) {3256if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x200)) {3257/*set debug port to 0x200*/3258PHYDM_DBG(dm, ODM_COMP_API,3259"Set Debug port Fail\n");3260return;3261}3262phydm_bb_dbg_port_header_sel(dm, 0x0);3263} else if (dm->support_ic_type & ODM_RTL8822B) {3264if (path == RF_PATH_A &&3265!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x200)) {3266/*set debug port to 0x200*/3267PHYDM_DBG(dm, ODM_COMP_API,3268"Set Debug port Fail\n");3269return;3270}3271if (path == RF_PATH_B &&3272!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x202)) {3273/*set debug port to 0x200*/3274PHYDM_DBG(dm, ODM_COMP_API,3275"Set Debug port Fail\n");3276return;3277}3278phydm_bb_dbg_port_header_sel(dm, 0x0);3279} else if (dm->support_ic_type & ODM_RTL8192F) {3280if (path == RF_PATH_A &&3281!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x235)) {3282/*set debug port to 0x235*/3283PHYDM_DBG(dm, ODM_COMP_API,3284"Set Debug port Fail\n");3285return;3286}3287if (path == RF_PATH_B &&3288!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x23d)) {3289/*set debug port to 0x23d*/3290PHYDM_DBG(dm, ODM_COMP_API,3291"Set Debug port Fail\n");3292return;3293}3294}32953296/*@disable CCK DCNF*/3297odm_set_bb_reg(dm, R_0xa78, MASKBYTE1, 0x0);32983299PHYDM_DBG(dm, ODM_COMP_API, "DC cancellation Begin!!!\n");33003301phydm_stop_ck320(dm, true); /*stop ck320*/33023303/* the same debug port both for path-a and path-b*/3304reg_value32[path] = phydm_get_bb_dbg_port_val(dm);33053306phydm_stop_ck320(dm, false); /*start ck320*/33073308phydm_release_bb_dbg_port(dm);3309/* @Turn on 3-wire*/3310phydm_stop_3_wire(dm, PHYDM_REVERT);3311/* @Enable LNA*/3312if (dm->support_ic_type & ODM_RTL8821C)3313halrf_rf_lna_setting(dm, HALRF_LNA_ENABLE);33143315odm_write_dig(dm, 0x20);33163317set_result = phydm_stop_ic_trx(dm, PHYDM_REVERT);33183319PHYDM_DBG(dm, ODM_COMP_API, "DC cancellation OK!!!\n");3320}33213322/*@DC_Cancellation*/3323/*@DC compensation to CCK data path*/3324odm_set_bb_reg(dm, R_0xa9c, BIT(20), 0x1);3325if (dm->support_ic_type & (ODM_RTL8188F | ODM_RTL8710B)) {3326offset_i_hex[0] = (reg_value32[0] & 0xffc0000) >> 18;3327offset_q_hex[0] = (reg_value32[0] & 0x3ff00) >> 8;33283329/*@Before filling into registers,3330*offset should be multiplexed (-1)3331*/3332offset_i_hex[0] = (offset_i_hex[0] >= 0x200) ?3333(0x400 - offset_i_hex[0]) :3334(0x1ff - offset_i_hex[0]);3335offset_q_hex[0] = (offset_q_hex[0] >= 0x200) ?3336(0x400 - offset_q_hex[0]) :3337(0x1ff - offset_q_hex[0]);33383339odm_set_bb_reg(dm, R_0x950, 0x1ff, offset_i_hex[0]);3340odm_set_bb_reg(dm, R_0x950, 0x1ff0000, offset_q_hex[0]);3341} else if (dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8822B)) {3342/* Path-a */3343offset_i_hex[0] = (reg_value32[0] & 0xffc00) >> 10;3344offset_q_hex[0] = reg_value32[0] & 0x3ff;33453346/*@Before filling into registers,3347*offset should be multiplexed (-1)3348*/3349offset_i_hex[0] = 0x400 - offset_i_hex[0];3350offset_q_hex[0] = 0x400 - offset_q_hex[0];33513352odm_set_bb_reg(dm, R_0xc10, 0x3c000000,3353(0x3c0 & offset_i_hex[0]) >> 6);3354odm_set_bb_reg(dm, R_0xc10, 0xfc00, 0x3f & offset_i_hex[0]);3355odm_set_bb_reg(dm, R_0xc14, 0x3c000000,3356(0x3c0 & offset_q_hex[0]) >> 6);3357odm_set_bb_reg(dm, R_0xc14, 0xfc00, 0x3f & offset_q_hex[0]);33583359/* Path-b */3360if (dm->rf_type > RF_1T1R) {3361offset_i_hex[1] = (reg_value32[1] & 0xffc00) >> 10;3362offset_q_hex[1] = reg_value32[1] & 0x3ff;33633364/*@Before filling into registers,3365*offset should be multiplexed (-1)3366*/3367offset_i_hex[1] = 0x400 - offset_i_hex[1];3368offset_q_hex[1] = 0x400 - offset_q_hex[1];33693370odm_set_bb_reg(dm, R_0xe10, 0x3c000000,3371(0x3c0 & offset_i_hex[1]) >> 6);3372odm_set_bb_reg(dm, R_0xe10, 0xfc00,33730x3f & offset_i_hex[1]);3374odm_set_bb_reg(dm, R_0xe14, 0x3c000000,3375(0x3c0 & offset_q_hex[1]) >> 6);3376odm_set_bb_reg(dm, R_0xe14, 0xfc00,33770x3f & offset_q_hex[1]);3378}3379} else if (dm->support_ic_type & (ODM_RTL8192F)) {3380/* Path-a I:df4[27:18],Q:df4[17:8]*/3381offset_i_hex[0] = (reg_value32[0] & 0xffc0000) >> 18;3382offset_q_hex[0] = (reg_value32[0] & 0x3ff00) >> 8;33833384/*@Before filling into registers,3385*offset should be multiplexed (-1)3386*/3387offset_i_hex[0] = (offset_i_hex[0] >= 0x200) ?3388(0x400 - offset_i_hex[0]) :3389(0xff - offset_i_hex[0]);3390offset_q_hex[0] = (offset_q_hex[0] >= 0x200) ?3391(0x400 - offset_q_hex[0]) :3392(0xff - offset_q_hex[0]);3393/*Path-a I:c10[7:0],Q:c10[15:8]*/3394odm_set_bb_reg(dm, R_0xc10, 0xff, offset_i_hex[0]);3395odm_set_bb_reg(dm, R_0xc10, 0xff00, offset_q_hex[0]);33963397/* Path-b */3398if (dm->rf_type > RF_1T1R) {3399/* @I:df4[27:18],Q:df4[17:8]*/3400offset_i_hex[1] = (reg_value32[1] & 0xffc0000) >> 18;3401offset_q_hex[1] = (reg_value32[1] & 0x3ff00) >> 8;34023403/*@Before filling into registers,3404*offset should be multiplexed (-1)3405*/3406offset_i_hex[1] = (offset_i_hex[1] >= 0x200) ?3407(0x400 - offset_i_hex[1]) :3408(0xff - offset_i_hex[1]);3409offset_q_hex[1] = (offset_q_hex[1] >= 0x200) ?3410(0x400 - offset_q_hex[1]) :3411(0xff - offset_q_hex[1]);3412/*Path-b I:c18[7:0],Q:c18[15:8]*/3413odm_set_bb_reg(dm, R_0xc18, 0xff, offset_i_hex[1]);3414odm_set_bb_reg(dm, R_0xc18, 0xff00, offset_q_hex[1]);3415}3416} else if (dm->support_ic_type & (ODM_RTL8721D | ODM_RTL8710C)) {3417/*judy modified 20180517*/3418offset_i_hex[0] = (reg_value32[0] & 0xff80000) >> 19;3419offset_q_hex[0] = (reg_value32[0] & 0x3fe00) >> 9;34203421/*@Before filling into registers,3422*offset should be multiplexed (-1)3423*/3424offset_i_hex[0] = 0x200 - offset_i_hex[0];3425offset_q_hex[0] = 0x200 - offset_q_hex[0];34263427odm_set_bb_reg(dm, R_0x950, 0x1ff, offset_i_hex[0]);3428odm_set_bb_reg(dm, R_0x950, 0x1ff0000, offset_q_hex[0]);3429}3430#endif3431}34323433void phydm_receiver_blocking(void *dm_void)3434{3435#ifdef CONFIG_RECEIVER_BLOCKING3436struct dm_struct *dm = (struct dm_struct *)dm_void;3437u32 chnl = *dm->channel;3438u8 bw = *dm->band_width;3439u32 bb_regf0 = odm_get_bb_reg(dm, R_0xf0, 0xf000);34403441if (!(dm->support_ic_type & ODM_RECEIVER_BLOCKING_SUPPORT) ||3442*dm->edcca_mode != PHYDM_EDCCA_ADAPT_MODE)3443return;34443445if ((dm->support_ic_type & ODM_RTL8188E && bb_regf0 < 8) ||3446dm->support_ic_type & ODM_RTL8192E) {3447/*@8188E_T version*/3448if (dm->consecutive_idlel_time <= 10 || *dm->mp_mode)3449goto end;34503451if (bw == CHANNEL_WIDTH_20 && chnl == 1) {3452phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2410,3453PHYDM_DONT_CARE);3454dm->is_rx_blocking_en = true;3455} else if ((bw == CHANNEL_WIDTH_20) && (chnl == 13)) {3456phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2473,3457PHYDM_DONT_CARE);3458dm->is_rx_blocking_en = true;3459} else if (dm->is_rx_blocking_en && chnl != 1 && chnl != 13) {3460phydm_nbi_enable(dm, FUNC_DISABLE);3461odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);3462dm->is_rx_blocking_en = false;3463}3464return;3465} else if ((dm->support_ic_type & ODM_RTL8188E && bb_regf0 >= 8)) {3466/*@8188E_S version*/3467if (dm->consecutive_idlel_time <= 10 || *dm->mp_mode)3468goto end;34693470if (bw == CHANNEL_WIDTH_20 && chnl == 13) {3471phydm_nbi_setting(dm, FUNC_ENABLE, chnl, 20, 2473,3472PHYDM_DONT_CARE);3473dm->is_rx_blocking_en = true;3474} else if (dm->is_rx_blocking_en && chnl != 13) {3475phydm_nbi_enable(dm, FUNC_DISABLE);3476odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);3477dm->is_rx_blocking_en = false;3478}3479return;3480}34813482end:3483if (dm->is_rx_blocking_en) {3484phydm_nbi_enable(dm, FUNC_DISABLE);3485odm_set_bb_reg(dm, R_0xc40, 0x1f000000, 0x1f);3486dm->is_rx_blocking_en = false;3487}3488#endif3489}349034913492