Path: blob/master/ALFA-W1F1/RTL8814AU/hal/hal_dm.c
1307 views
/******************************************************************************1*2* Copyright(c) 2014 - 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*****************************************************************************/1415#include <drv_types.h>16#include <hal_data.h>1718/* A mapping from HalData to ODM. */19enum odm_board_type boardType(u8 InterfaceSel)20{21enum odm_board_type board = ODM_BOARD_DEFAULT;2223#ifdef CONFIG_PCI_HCI24INTERFACE_SELECT_PCIE pcie = (INTERFACE_SELECT_PCIE)InterfaceSel;25switch (pcie) {26case INTF_SEL0_SOLO_MINICARD:27board |= ODM_BOARD_MINICARD;28break;29case INTF_SEL1_BT_COMBO_MINICARD:30board |= ODM_BOARD_BT;31board |= ODM_BOARD_MINICARD;32break;33default:34board = ODM_BOARD_DEFAULT;35break;36}3738#elif defined(CONFIG_USB_HCI)39INTERFACE_SELECT_USB usb = (INTERFACE_SELECT_USB)InterfaceSel;40switch (usb) {41case INTF_SEL1_USB_High_Power:42board |= ODM_BOARD_EXT_LNA;43board |= ODM_BOARD_EXT_PA;44break;45case INTF_SEL2_MINICARD:46board |= ODM_BOARD_MINICARD;47break;48case INTF_SEL4_USB_Combo:49board |= ODM_BOARD_BT;50break;51case INTF_SEL5_USB_Combo_MF:52board |= ODM_BOARD_BT;53break;54case INTF_SEL0_USB:55case INTF_SEL3_USB_Solo:56default:57board = ODM_BOARD_DEFAULT;58break;59}6061#endif62/* RTW_INFO("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board); */6364return board;65}6667void rtw_hal_update_iqk_fw_offload_cap(_adapter *adapter)68{69PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);70struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);7172if (hal->RegIQKFWOffload) {73rtw_sctx_init(&hal->iqk_sctx, 0);74phydm_fwoffload_ability_init(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);75} else76phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);7778RTW_INFO("IQK FW offload:%s\n", hal->RegIQKFWOffload ? "enable" : "disable");7980if (rtw_mi_check_status(adapter, MI_LINKED)) {81#ifdef CONFIG_LPS82LPS_Leave(adapter, "SWITCH_IQK_OFFLOAD");83#endif84halrf_iqk_trigger(p_dm_odm, _FALSE);85}86}8788#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))89void rtw_phydm_iqk_trigger(_adapter *adapter)90{91struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);92u8 clear = _TRUE;93u8 segment = _FALSE;94u8 rfk_forbidden = _FALSE;9596halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);97#if (RTL8822C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1)98/* halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment); to do */99halrf_rf_k_connect_trigger(p_dm_odm, _TRUE, SEGMENT_FREE);100#else101/*segment = _rtw_phydm_iqk_segment_chk(adapter);*/102halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment);103halrf_segment_iqk_trigger(p_dm_odm, clear, segment);104#endif105}106#endif107108void rtw_phydm_iqk_trigger_dbg(_adapter *adapter, bool recovery, bool clear, bool segment)109{110struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);111112#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))113halrf_segment_iqk_trigger(p_dm_odm, clear, segment);114#else115halrf_iqk_trigger(p_dm_odm, recovery);116#endif117}118void rtw_phydm_lck_trigger(_adapter *adapter)119{120struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);121122halrf_lck_trigger(p_dm_odm);123}124#ifdef CONFIG_DBG_RF_CAL125void rtw_hal_iqk_test(_adapter *adapter, bool recovery, bool clear, bool segment)126{127struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);128129rtw_ps_deny(adapter, PS_DENY_IOCTL);130LeaveAllPowerSaveModeDirect(adapter);131132rtw_phydm_ability_backup(adapter);133rtw_phydm_func_disable_all(adapter);134135halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_IQK);136137rtw_phydm_iqk_trigger_dbg(adapter, recovery, clear, segment);138rtw_phydm_ability_restore(adapter);139140rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);141}142143void rtw_hal_lck_test(_adapter *adapter)144{145struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);146147rtw_ps_deny(adapter, PS_DENY_IOCTL);148LeaveAllPowerSaveModeDirect(adapter);149150rtw_phydm_ability_backup(adapter);151rtw_phydm_func_disable_all(adapter);152153halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_LCK);154155rtw_phydm_lck_trigger(adapter);156157rtw_phydm_ability_restore(adapter);158rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);159}160#endif161162#ifdef CONFIG_FW_OFFLOAD_PARAM_INIT163void rtw_hal_update_param_init_fw_offload_cap(_adapter *adapter)164{165struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);166167if (adapter->registrypriv.fw_param_init)168phydm_fwoffload_ability_init(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);169else170phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);171172RTW_INFO("Init-Parameter FW offload:%s\n", adapter->registrypriv.fw_param_init ? "enable" : "disable");173}174#endif175176void record_ra_info(void *p_dm_void, u8 macid, struct cmn_sta_info *p_sta, u64 ra_mask)177{178struct dm_struct *p_dm = (struct dm_struct *)p_dm_void;179_adapter *adapter = p_dm->adapter;180struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);181struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);182183if (p_sta) {184rtw_macid_ctl_set_bw(macid_ctl, macid, p_sta->ra_info.ra_bw_mode);185rtw_macid_ctl_set_vht_en(macid_ctl, macid, p_sta->ra_info.is_vht_enable);186rtw_macid_ctl_set_rate_bmp0(macid_ctl, macid, ra_mask);187rtw_macid_ctl_set_rate_bmp1(macid_ctl, macid, ra_mask >> 32);188189rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));190}191}192193#ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR194void rtw_phydm_fill_desc_dpt(void *dm, u8 *desc, u8 dpt_lv)195{196struct dm_struct *p_dm = (struct dm_struct *)dm;197_adapter *adapter = p_dm->adapter;198199switch (rtw_get_chip_type(adapter)) {200/*201#ifdef CONFIG_RTL8188F202case RTL8188F:203break;204#endif205206#ifdef CONFIG_RTL8723B207case RTL8723B :208break;209#endif210211#ifdef CONFIG_RTL8703B212case RTL8703B :213break;214#endif215216#ifdef CONFIG_RTL8812A217case RTL8812 :218break;219#endif220221#ifdef CONFIG_RTL8821A222case RTL8821:223break;224#endif225226#ifdef CONFIG_RTL8814A227case RTL8814A :228break;229#endif230231#ifdef CONFIG_RTL8192F232case RTL8192F :233break;234#endif235*/236/*237#ifdef CONFIG_RTL8192E238case RTL8192E :239SET_TX_DESC_TX_POWER_0_PSET_92E(desc, dpt_lv);240break;241#endif242*/243#ifdef CONFIG_RTL8822B244case RTL8822B :245SET_TX_DESC_TXPWR_OFSET_8822B(desc, dpt_lv);246break;247#endif248249#ifdef CONFIG_RTL8821C250case RTL8821C :251SET_TX_DESC_TXPWR_OFSET_8821C(desc, dpt_lv);252break;253#endif254255default :256RTW_ERR("%s IC not support dynamic tx power\n", __func__);257break;258}259}260void rtw_phydm_set_dyntxpwr(_adapter *adapter, u8 *desc, u8 mac_id)261{262struct dm_struct *dm = adapter_to_phydm(adapter);263264odm_set_dyntxpwr(dm, desc, mac_id);265}266#endif267268#ifdef CONFIG_TDMADIG269void rtw_phydm_tdmadig(_adapter *adapter, u8 state)270{271struct registry_priv *pregistrypriv = &adapter->registrypriv;272struct mlme_priv *pmlmepriv = &(adapter->mlmepriv);273struct dm_struct *dm = adapter_to_phydm(adapter);274u8 tdma_dig_en;275276switch (state) {277case TDMADIG_INIT:278phydm_tdma_dig_para_upd(dm, ENABLE_TDMA, pregistrypriv->tdmadig_en);279phydm_tdma_dig_para_upd(dm, MODE_DECISION, pregistrypriv->tdmadig_mode);280break;281case TDMADIG_NON_INIT:282if(pregistrypriv->tdmadig_dynamic) {283if(pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE)284tdma_dig_en = 0;285else286tdma_dig_en = pregistrypriv->tdmadig_en;287phydm_tdma_dig_para_upd(dm, ENABLE_TDMA, tdma_dig_en);288}289break;290default:291break;292293}294}295#endif/*CONFIG_TDMADIG*/296void rtw_phydm_ops_func_init(struct dm_struct *p_phydm)297{298struct ra_table *p_ra_t = &p_phydm->dm_ra_table;299300p_ra_t->record_ra_info = record_ra_info;301#ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR302p_phydm->fill_desc_dyntxpwr = rtw_phydm_fill_desc_dpt;303#endif304}305void rtw_phydm_priv_init(_adapter *adapter)306{307PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);308struct dm_struct *phydm = &(hal->odmpriv);309310phydm->adapter = adapter;311odm_cmn_info_init(phydm, ODM_CMNINFO_PLATFORM, ODM_CE);312}313314void Init_ODM_ComInfo(_adapter *adapter)315{316struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);317PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);318struct dm_struct *pDM_Odm = &(pHalData->odmpriv);319struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);320int i;321322/*phydm_op_mode could be change for different scenarios: ex: SoftAP - PHYDM_BALANCE_MODE*/323pHalData->phydm_op_mode = PHYDM_PERFORMANCE_MODE;/*Service one device*/324rtw_odm_init_ic_type(adapter);325326if (rtw_get_intf_type(adapter) == RTW_GSPI)327odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);328else329odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, rtw_get_intf_type(adapter));330331odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->version_id));332333odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);334335odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec);336337#ifdef CONFIG_ADVANCE_OTA338odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ADVANCE_OTA, adapter->registrypriv.adv_ota);339#endif340odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, pHalData->rf_type);341342{343/* 1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= */344u8 odm_board_type = ODM_BOARD_DEFAULT;345346if (pHalData->ExternalLNA_2G != 0) {347odm_board_type |= ODM_BOARD_EXT_LNA;348odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1);349}350if (pHalData->external_lna_5g != 0) {351odm_board_type |= ODM_BOARD_EXT_LNA_5G;352odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1);353}354if (pHalData->ExternalPA_2G != 0) {355odm_board_type |= ODM_BOARD_EXT_PA;356odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_PA, 1);357}358if (pHalData->external_pa_5g != 0) {359odm_board_type |= ODM_BOARD_EXT_PA_5G;360odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1);361}362if (pHalData->EEPROMBluetoothCoexist)363odm_board_type |= ODM_BOARD_BT;364365odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type);366/* 1 ============== End of BoardType ============== */367}368369rtw_hal_set_odm_var(adapter, HAL_ODM_REGULATION, NULL, _TRUE);370371#ifdef CONFIG_DFS_MASTER372odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_DFS_REGION_DOMAIN, adapter->registrypriv.dfs_region_domain);373odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_DFS_MASTER_ENABLE, &(adapter_to_rfctl(adapter)->radar_detect_enabled));374#endif375376odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GPA, pHalData->TypeGPA);377odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_APA, pHalData->TypeAPA);378odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GLNA, pHalData->TypeGLNA);379odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ALNA, pHalData->TypeALNA);380381odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->rfe_type);382odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_X_CAP_SETTING, pHalData->crystal_cap);383384odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);385386/*Add by YuChen for kfree init*/387odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_REGRFKFREEENABLE, adapter->registrypriv.RegPwrTrimEnable);388odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFKFREEENABLE, pHalData->RfKFreeEnable);389390odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);391odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BE_FIX_TX_ANT, pHalData->b_fix_tx_ant);392odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH, pHalData->with_extenal_ant_switch);393394/* (8822B) efuse 0x3D7 & 0x3D8 for TX PA bias */395odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D7, pHalData->efuse0x3d7);396odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D8, pHalData->efuse0x3d8);397398/* waiting for PhyDMV034 support*/399odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_MANUAL_SUPPORTABILITY, &(adapter->registrypriv.phydm_ability));400/*Add by YuChen for adaptivity init*/401odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVITY, &(adapter->registrypriv.adaptivity_en));402phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_CARRIER_SENSE_ENABLE, (adapter->registrypriv.adaptivity_mode != 0) ? TRUE : FALSE);403phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_L2H_INI, adapter->registrypriv.adaptivity_th_l2h_ini);404phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_EDCCA_HL_DIFF, adapter->registrypriv.adaptivity_th_edcca_hl_diff);405406/*halrf info init*/407halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_EEPROM_THERMAL_VALUE, pHalData->eeprom_thermal_meter);408halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_PWT_TYPE, 0);409410if (rtw_odm_adaptivity_needed(adapter) == _TRUE)411rtw_odm_adaptivity_config_msg(RTW_DBGDUMP, adapter);412413#ifdef CONFIG_IQK_PA_OFF414odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKPAOFF, 1);415#endif416rtw_hal_update_iqk_fw_offload_cap(adapter);417#ifdef CONFIG_FW_OFFLOAD_PARAM_INIT418rtw_hal_update_param_init_fw_offload_cap(adapter);419#endif420421/* Pointer reference */422/*Antenna diversity relative parameters*/423odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_DIV, &(pHalData->AntDivCfg));424odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_MP_MODE, &(adapter->registrypriv.mp_mode));425426odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BB_OPERATION_MODE, &(pHalData->phydm_op_mode));427odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));428odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));429430odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->current_band_type));431odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));432433odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));434odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(adapter->securitypriv.dot11PrivacyAlgrthm));435#ifdef CONFIG_NARROWBAND_SUPPORTING436if ((adapter->registrypriv.rtw_nb_config == RTW_NB_CONFIG_WIDTH_10)437|| (adapter->registrypriv.rtw_nb_config == RTW_NB_CONFIG_WIDTH_5)) {438odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(adapter->registrypriv.rtw_nb_config));439}440else441#endif442odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->current_channel_bw));443odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->current_channel));444odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(adapter->net_closed));445446odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SCAN, &(pHalData->bScanInProcess));447odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctl->bpower_saving));448/*Add by Yuchen for phydm beamforming*/449odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_TP, &(dvobj->traffic_stat.cur_tx_tp));450odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_TP, &(dvobj->traffic_stat.cur_rx_tp));451odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_TEST, &(pHalData->antenna_test));452#ifdef CONFIG_RTL8723B453odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_IS1ANTENNA, &pHalData->EEPROMBluetoothAntNum);454odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RFDEFAULTPATH, &pHalData->ant_path);455#endif /*CONFIG_RTL8723B*/456#ifdef CONFIG_USB_HCI457odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_HUBUSBMODE, &(dvobj->usb_speed));458#endif459460#ifdef CONFIG_DYNAMIC_SOML461odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVE_SOML, &(adapter->registrypriv.dyn_soml_en));462#endif463#ifdef CONFIG_RTW_PATH_DIV464odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_PATH_DIV, &(adapter->registrypriv.path_div));465#endif466odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FCS_MODE, &(pHalData->multi_ch_switch_mode));467468/*halrf info hook*/469/* waiting for PhyDMV034 support*/470halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_MANUAL_RF_SUPPORTABILITY, &(adapter->registrypriv.halrf_ability));471#ifdef CONFIG_MP_INCLUDED472halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CON_TX, &(adapter->mppriv.mpt_ctx.is_start_cont_tx));473halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_SINGLE_TONE, &(adapter->mppriv.mpt_ctx.is_single_tone));474halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CARRIER_SUPPRESSION, &(adapter->mppriv.mpt_ctx.is_carrier_suppression));475halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_MP_RATE_INDEX, &(adapter->mppriv.mpt_ctx.mpt_rate_index));476#endif/*CONFIG_MP_INCLUDED*/477for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)478phydm_cmn_sta_info_hook(pDM_Odm, i, NULL);479480rtw_phydm_ops_func_init(pDM_Odm);481phydm_dm_early_init(pDM_Odm);482/* TODO */483/* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_OPERATION, _FALSE); */484/* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_DISABLE_EDCA, _FALSE); */485}486487488static u32 edca_setting_UL[HT_IOT_PEER_MAX] =489/*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/490/*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(DownLink/Tx) */491{ 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};492493static u32 edca_setting_DL[HT_IOT_PEER_MAX] =494/*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/495/*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(UpLink/Rx)*/496{ 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};497498static u32 edca_setting_dl_g_mode[HT_IOT_PEER_MAX] =499/*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/500/*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP */501{ 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};502503504struct turbo_edca_setting{505u32 edca_ul; /* uplink, tx */506u32 edca_dl; /* downlink, rx */507};508509#define TURBO_EDCA_ENT(UL, DL) {UL, DL}510511#if 0512#define TURBO_EDCA_MODE_NUM 18513static struct turbo_edca_setting rtw_turbo_edca[TURBO_EDCA_MODE_NUM] = {514TURBO_EDCA_ENT(0xa42b, 0xa42b), /* mode 0 */515TURBO_EDCA_ENT(0x431c, 0x431c), /* mode 1 */516TURBO_EDCA_ENT(0x4319, 0x4319), /* mode 2 */517518TURBO_EDCA_ENT(0x5ea42b, 0x5ea42b), /* mode 3 */519TURBO_EDCA_ENT(0x5e431c, 0x5e431c), /* mode 4 */520TURBO_EDCA_ENT(0x5e4319, 0x5e4319), /* mode 5 */521522TURBO_EDCA_ENT(0x6ea42b, 0x6ea42b), /* mode 6 */523TURBO_EDCA_ENT(0x6e431c, 0x6e431c), /* mode 7 */524TURBO_EDCA_ENT(0x6e4319, 0x6e4319), /* mode 8 */525526TURBO_EDCA_ENT(0x5ea42b, 0xa42b), /* mode 9 */527TURBO_EDCA_ENT(0x5e431c, 0x431c), /* mode 10 */528TURBO_EDCA_ENT(0x5e4319, 0x4319), /* mode 11 */529530TURBO_EDCA_ENT(0x6ea42b, 0xa42b), /* mode 12 */531TURBO_EDCA_ENT(0x6e431c, 0x431c), /* mode 13 */532TURBO_EDCA_ENT(0x6e4319, 0x4319), /* mode 14 */533534TURBO_EDCA_ENT(0x431c, 0x5e431c), /* mode 15 */535536TURBO_EDCA_ENT(0xa42b, 0x5ea42b), /* mode 16 */537538TURBO_EDCA_ENT(0x138642b, 0x431c), /* mode 17 */539};540#else541#define TURBO_EDCA_MODE_NUM 8542static struct turbo_edca_setting rtw_turbo_edca[TURBO_EDCA_MODE_NUM] = {543/* { UL, DL } */544TURBO_EDCA_ENT(0x5e431c, 0x431c), /* mode 0 */545546TURBO_EDCA_ENT(0x431c, 0x431c), /* mode 1 */547548TURBO_EDCA_ENT(0x5e431c, 0x5e431c), /* mode 2 */549550TURBO_EDCA_ENT(0x5ea42b, 0x5ea42b), /* mode 3 */551552TURBO_EDCA_ENT(0x5ea42b, 0x431c), /* mode 4 */553554TURBO_EDCA_ENT(0x6ea42b, 0x6ea42b), /* mode 5 */555556TURBO_EDCA_ENT(0xa42b, 0xa42b), /* mode 6 */557558TURBO_EDCA_ENT(0x5e431c, 0xa42b), /* mode 7 */559};560#endif561562void rtw_hal_turbo_edca(_adapter *adapter)563{564HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);565struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);566struct recv_priv *precvpriv = &(adapter->recvpriv);567struct registry_priv *pregpriv = &adapter->registrypriv;568struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);569struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);570571/* Parameter suggested by Scott */572#if 0573u32 EDCA_BE_UL = edca_setting_UL[p_mgnt_info->iot_peer];574u32 EDCA_BE_DL = edca_setting_DL[p_mgnt_info->iot_peer];575#endif576u32 EDCA_BE_UL = 0x5ea42b;577u32 EDCA_BE_DL = 0x00a42b;578u8 ic_type = rtw_get_chip_type(adapter);579580u8 iot_peer = 0;581u8 wireless_mode = 0xFF; /* invalid value */582u8 traffic_index;583u32 edca_param;584u64 cur_tx_bytes = 0;585u64 cur_rx_bytes = 0;586u8 bbtchange = _TRUE;587u8 is_bias_on_rx = _FALSE;588u8 is_linked = _FALSE;589u8 interface_type;590591if (hal_data->dis_turboedca == 1)592return;593594if (rtw_mi_check_status(adapter, MI_ASSOC))595is_linked = _TRUE;596597if (is_linked != _TRUE) {598precvpriv->is_any_non_be_pkts = _FALSE;599return;600}601602if ((pregpriv->wifi_spec == 1)) { /* || (pmlmeinfo->HT_enable == 0)) */603precvpriv->is_any_non_be_pkts = _FALSE;604return;605}606607interface_type = rtw_get_intf_type(adapter);608wireless_mode = pmlmeext->cur_wireless_mode;609610iot_peer = pmlmeinfo->assoc_AP_vendor;611612if (iot_peer >= HT_IOT_PEER_MAX) {613precvpriv->is_any_non_be_pkts = _FALSE;614return;615}616617if (ic_type == RTL8188E) {618if ((iot_peer == HT_IOT_PEER_RALINK) || (iot_peer == HT_IOT_PEER_ATHEROS))619is_bias_on_rx = _TRUE;620}621622/* Check if the status needs to be changed. */623if ((bbtchange) || (!precvpriv->is_any_non_be_pkts)) {624cur_tx_bytes = dvobj->traffic_stat.cur_tx_bytes;625cur_rx_bytes = dvobj->traffic_stat.cur_rx_bytes;626627/* traffic, TX or RX */628if (is_bias_on_rx) {629if (cur_tx_bytes > (cur_rx_bytes << 2)) {630/* Uplink TP is present. */631traffic_index = UP_LINK;632} else {633/* Balance TP is present. */634traffic_index = DOWN_LINK;635}636} else {637if (cur_rx_bytes > (cur_tx_bytes << 2)) {638/* Downlink TP is present. */639traffic_index = DOWN_LINK;640} else {641/* Balance TP is present. */642traffic_index = UP_LINK;643}644}645#if 0646if ((p_dm_odm->dm_edca_table.prv_traffic_idx != traffic_index)647|| (!p_dm_odm->dm_edca_table.is_current_turbo_edca))648#endif649{650if (interface_type == RTW_PCIE) {651EDCA_BE_UL = 0x6ea42b;652EDCA_BE_DL = 0x6ea42b;653}654655/* 92D txop can't be set to 0x3e for cisco1250 */656if ((iot_peer == HT_IOT_PEER_CISCO) && (wireless_mode == ODM_WM_N24G)) {657EDCA_BE_DL = edca_setting_DL[iot_peer];658EDCA_BE_UL = edca_setting_UL[iot_peer];659}660/* merge from 92s_92c_merge temp*/661else if ((iot_peer == HT_IOT_PEER_CISCO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == (ODM_WM_B | ODM_WM_G)) || (wireless_mode == ODM_WM_A) || (wireless_mode == ODM_WM_B)))662EDCA_BE_DL = edca_setting_dl_g_mode[iot_peer];663else if ((iot_peer == HT_IOT_PEER_AIRGO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == ODM_WM_A)))664EDCA_BE_DL = 0xa630;665else if (iot_peer == HT_IOT_PEER_MARVELL) {666EDCA_BE_DL = edca_setting_DL[iot_peer];667EDCA_BE_UL = edca_setting_UL[iot_peer];668} else if (iot_peer == HT_IOT_PEER_ATHEROS) {669/* Set DL EDCA for Atheros peer to 0x3ea42b.*/670/* Suggested by SD3 Wilson for ASUS TP issue.*/671EDCA_BE_DL = edca_setting_DL[iot_peer];672}673674if ((ic_type == RTL8812) || (ic_type == RTL8821) || (ic_type == RTL8192E) || (ic_type == RTL8192F)) { /* add 8812AU/8812AE */675EDCA_BE_UL = 0x5ea42b;676EDCA_BE_DL = 0x5ea42b;677678RTW_DBG("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x\n", EDCA_BE_UL, EDCA_BE_DL);679}680681if (interface_type == RTW_PCIE &&682((ic_type == RTL8822B)683|| (ic_type == RTL8822C)684|| (ic_type == RTL8814A) || (ic_type == RTL8814B))) {685EDCA_BE_UL = 0x6ea42b;686EDCA_BE_DL = 0x6ea42b;687}688689if ((ic_type == RTL8822B)690&& (interface_type == RTW_SDIO))691EDCA_BE_DL = 0x00431c;692693#ifdef CONFIG_RTW_TPT_MODE694if ( dvobj->tpt_mode > 0 ) {695EDCA_BE_UL = dvobj->edca_be_ul;696EDCA_BE_DL = dvobj->edca_be_dl;697}698#endif /* CONFIG_RTW_TPT_MODE */699700/* keep this condition at last check */701if (hal_data->dis_turboedca == 2) {702703if (hal_data->edca_param_mode < TURBO_EDCA_MODE_NUM) {704705struct turbo_edca_setting param;706707param = rtw_turbo_edca[hal_data->edca_param_mode];708709EDCA_BE_UL = param.edca_ul;710EDCA_BE_DL = param.edca_dl;711712} else {713714EDCA_BE_UL = hal_data->edca_param_mode;715EDCA_BE_DL = hal_data->edca_param_mode;716}717}718719if (traffic_index == DOWN_LINK)720edca_param = EDCA_BE_DL;721else722edca_param = EDCA_BE_UL;723724#ifdef CONFIG_EXTEND_LOWRATE_TXOP725#define TXOP_CCK1M 0x01A6726#define TXOP_CCK2M 0x00E6727#define TXOP_CCK5M 0x006B728#define TXOP_OFD6M 0x0066729#define TXOP_MCS6M 0x0061730{731struct sta_info *psta;732struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);733u8 mac_id, role, current_rate_id;734735/* search all used & connect2AP macid */736for (mac_id = 0; mac_id < macid_ctl->num; mac_id++) {737if (rtw_macid_is_used(macid_ctl, mac_id)) {738role = GET_H2CCMD_MSRRPT_PARM_ROLE(&(macid_ctl->h2c_msr[mac_id]));739if (role != H2C_MSR_ROLE_AP)740continue;741742psta = macid_ctl->sta[mac_id];743current_rate_id = rtw_get_current_tx_rate(adapter, psta);744/* Check init tx_rate==1M and set 0x508[31:16]==0x019B(unit 32us) if it is */745switch (current_rate_id) {746case DESC_RATE1M:747edca_param &= 0x0000FFFF;748edca_param |= (TXOP_CCK1M<<16);749break;750case DESC_RATE2M:751edca_param &= 0x0000FFFF;752edca_param |= (TXOP_CCK2M<<16);753break;754case DESC_RATE5_5M:755edca_param &= 0x0000FFFF;756edca_param |= (TXOP_CCK5M<<16);757break;758case DESC_RATE6M:759edca_param &= 0x0000FFFF;760edca_param |= (TXOP_OFD6M<<16);761break;762case DESC_RATEMCS0:763edca_param &= 0x0000FFFF;764edca_param |= (TXOP_MCS6M<<16);765break;766default:767break;768}769}770}771}772#endif /* CONFIG_EXTEND_LOWRATE_TXOP */773774#ifdef CONFIG_RTW_CUSTOMIZE_BEEDCA775edca_param = CONFIG_RTW_CUSTOMIZE_BEEDCA;776#endif777778if ( edca_param != hal_data->ac_param_be) {779780rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));781782RTW_DBG("Turbo EDCA =0x%x\n", edca_param);783}784785hal_data->prv_traffic_idx = traffic_index;786}787788hal_data->is_turbo_edca = _TRUE;789} else {790/* */791/* Turn Off EDCA turbo here. */792/* Restore original EDCA according to the declaration of AP. */793/* */794if (hal_data->is_turbo_edca) {795edca_param = hal_data->ac_param_be;796rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));797hal_data->is_turbo_edca = _FALSE;798}799}800801}802803s8 rtw_dm_get_min_rssi(_adapter *adapter)804{805struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);806struct sta_info *sta;807s8 min_rssi = 127, rssi;808int i;809810for (i = 0; i < MACID_NUM_SW_LIMIT; i++) {811sta = macid_ctl->sta[i];812if (!sta || !GET_H2CCMD_MSRRPT_PARM_OPMODE(macid_ctl->h2c_msr + i)813|| is_broadcast_mac_addr(sta->cmn.mac_addr))814continue;815rssi = sta->cmn.rssi_stat.rssi;816if (rssi >= 0 && min_rssi > rssi)817min_rssi = rssi;818}819820return min_rssi == 127 ? 0 : min_rssi;821}822823s8 rtw_phydm_get_min_rssi(_adapter *adapter)824{825struct dm_struct *phydm = adapter_to_phydm(adapter);826s8 rssi_min = 0;827828rssi_min = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_RSSI_MIN);829return rssi_min;830}831832u8 rtw_phydm_get_cur_igi(_adapter *adapter)833{834struct dm_struct *phydm = adapter_to_phydm(adapter);835u8 cur_igi = 0;836837cur_igi = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CURR_IGI);838return cur_igi;839}840841u32 rtw_phydm_get_phy_cnt(_adapter *adapter, enum phy_cnt cnt)842{843struct dm_struct *phydm = adapter_to_phydm(adapter);844845if (cnt == FA_OFDM)846return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_OFDM);847else if (cnt == FA_CCK)848return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_CCK);849else if (cnt == FA_TOTAL)850return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_TOTAL);851else if (cnt == CCA_OFDM)852return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_OFDM);853else if (cnt == CCA_CCK)854return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_CCK);855else if (cnt == CCA_ALL)856return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_ALL);857else if (cnt == CRC32_OK_VHT)858return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_VHT);859else if (cnt == CRC32_OK_HT)860return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_HT);861else if (cnt == CRC32_OK_LEGACY)862return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_LEGACY);863else if (cnt == CRC32_OK_CCK)864return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_CCK);865else if (cnt == CRC32_ERROR_VHT)866return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_VHT);867else if (cnt == CRC32_ERROR_HT)868return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_HT);869else if (cnt == CRC32_ERROR_LEGACY)870return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_LEGACY);871else if (cnt == CRC32_ERROR_CCK)872return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_CCK);873else874return 0;875}876877u8 rtw_phydm_is_iqk_in_progress(_adapter *adapter)878{879u8 rts = _FALSE;880struct dm_struct *podmpriv = adapter_to_phydm(adapter);881882odm_acquire_spin_lock(podmpriv, RT_IQK_SPINLOCK);883if (podmpriv->rf_calibrate_info.is_iqk_in_progress == _TRUE) {884RTW_ERR("IQK InProgress\n");885rts = _TRUE;886}887odm_release_spin_lock(podmpriv, RT_IQK_SPINLOCK);888889return rts;890}891892void SetHalODMVar(893PADAPTER Adapter,894HAL_ODM_VARIABLE eVariable,895void *pValue1,896BOOLEAN bSet)897{898struct dm_struct *podmpriv = adapter_to_phydm(Adapter);899/* _irqL irqL; */900switch (eVariable) {901case HAL_ODM_STA_INFO: {902struct sta_info *psta = (struct sta_info *)pValue1;903904if (bSet) {905RTW_INFO("### Set STA_(%d) info ###\n", psta->cmn.mac_id);906psta->cmn.dm_ctrl = STA_DM_CTRL_ACTIVE;907phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, &(psta->cmn));908} else {909RTW_INFO("### Clean STA_(%d) info ###\n", psta->cmn.mac_id);910/* _enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */911psta->cmn.dm_ctrl = 0;912phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, NULL);913914/* _exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */915}916}917break;918case HAL_ODM_P2P_STATE:919odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);920break;921case HAL_ODM_WIFI_DISPLAY_STATE:922odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);923break;924case HAL_ODM_REGULATION:925/* used to auto enable/disable adaptivity by SD7 */926phydm_adaptivity_info_update(podmpriv, PHYDM_ADAPINFO_DOMAIN_CODE_2G, 0);927phydm_adaptivity_info_update(podmpriv, PHYDM_ADAPINFO_DOMAIN_CODE_5G, 0);928break;929case HAL_ODM_INITIAL_GAIN: {930u8 rx_gain = *((u8 *)(pValue1));931/*printk("rx_gain:%x\n",rx_gain);*/932if (rx_gain == 0xff) {/*restore rx gain*/933/*odm_write_dig(podmpriv,pDigTable->backup_ig_value);*/934odm_pause_dig(podmpriv, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, rx_gain);935} else {936/*pDigTable->backup_ig_value = pDigTable->cur_ig_value;*/937/*odm_write_dig(podmpriv,rx_gain);*/938odm_pause_dig(podmpriv, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, rx_gain);939}940}941break;942case HAL_ODM_RX_INFO_DUMP: {943u8 cur_igi = 0;944s8 rssi_min;945void *sel;946947sel = pValue1;948cur_igi = rtw_phydm_get_cur_igi(Adapter);949rssi_min = rtw_phydm_get_min_rssi(Adapter);950951_RTW_PRINT_SEL(sel, "============ Rx Info dump ===================\n");952_RTW_PRINT_SEL(sel, "is_linked = %d, rssi_min = %d(%%)(%d(%%)), current_igi = 0x%x\n"953, podmpriv->is_linked, rssi_min, rtw_dm_get_min_rssi(Adapter), cur_igi);954_RTW_PRINT_SEL(sel, "cnt_cck_fail = %d, cnt_ofdm_fail = %d, Total False Alarm = %d\n",955rtw_phydm_get_phy_cnt(Adapter, FA_CCK),956rtw_phydm_get_phy_cnt(Adapter, FA_OFDM),957rtw_phydm_get_phy_cnt(Adapter, FA_TOTAL));958959if (podmpriv->is_linked) {960_RTW_PRINT_SEL(sel, "rx_rate = %s", HDATA_RATE(podmpriv->rx_rate));961if (IS_HARDWARE_TYPE_8814A(Adapter))962_RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%), rssi_c = %d(%%), rssi_d = %d(%%)\n",963podmpriv->rssi_a, podmpriv->rssi_b, podmpriv->rssi_c, podmpriv->rssi_d);964else965_RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%)\n", podmpriv->rssi_a, podmpriv->rssi_b);966#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA967rtw_dump_raw_rssi_info(Adapter, sel);968#endif969}970}971break;972case HAL_ODM_RX_Dframe_INFO: {973void *sel;974975sel = pValue1;976977/*_RTW_PRINT_SEL(sel , "HAL_ODM_RX_Dframe_INFO\n");*/978#ifdef DBG_RX_DFRAME_RAW_DATA979rtw_dump_rx_dframe_info(Adapter, sel);980#endif981}982break;983984#ifdef CONFIG_ANTENNA_DIVERSITY985case HAL_ODM_ANTDIV_SELECT: {986u8 antenna = (*(u8 *)pValue1);987HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);988/*switch antenna*/989odm_update_rx_idle_ant(&pHalData->odmpriv, antenna);990/*RTW_INFO("==> HAL_ODM_ANTDIV_SELECT, Ant_(%s)\n", (antenna == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");*/991992}993break;994#endif995996default:997break;998}999}10001001void GetHalODMVar(1002PADAPTER Adapter,1003HAL_ODM_VARIABLE eVariable,1004void *pValue1,1005void *pValue2)1006{1007struct dm_struct *podmpriv = adapter_to_phydm(Adapter);10081009switch (eVariable) {1010#ifdef CONFIG_ANTENNA_DIVERSITY1011case HAL_ODM_ANTDIV_SELECT: {1012struct phydm_fat_struct *pDM_FatTable = &podmpriv->dm_fat_table;1013*((u8 *)pValue1) = pDM_FatTable->rx_idle_ant;1014}1015break;1016#endif1017case HAL_ODM_INITIAL_GAIN:1018*((u8 *)pValue1) = rtw_phydm_get_cur_igi(Adapter);1019break;1020default:1021break;1022}1023}10241025#ifdef RTW_HALMAC1026#include "../hal_halmac.h"1027#endif10281029enum hal_status1030rtw_phydm_fw_iqk(1031struct dm_struct *p_dm_odm,1032u8 clear,1033u8 segment1034)1035{1036#ifdef RTW_HALMAC1037struct _ADAPTER *adapter = p_dm_odm->adapter;10381039if (rtw_halmac_iqk(adapter_to_dvobj(adapter), clear, segment) == 0)1040return HAL_STATUS_SUCCESS;1041#endif1042return HAL_STATUS_FAILURE;1043}10441045enum hal_status1046rtw_phydm_cfg_phy_para(1047struct dm_struct *p_dm_odm,1048enum phydm_halmac_param config_type,1049u32 offset,1050u32 data,1051u32 mask,1052enum rf_path e_rf_path,1053u32 delay_time)1054{1055#ifdef RTW_HALMAC1056struct _ADAPTER *adapter = p_dm_odm->adapter;1057struct rtw_phy_parameter para;10581059switch (config_type) {1060case PHYDM_HALMAC_CMD_MAC_W8:1061para.cmd = 0; /* MAC register */1062para.data.mac.offset = offset;1063para.data.mac.value = data;1064para.data.mac.msk = mask;1065para.data.mac.msk_en = (mask) ? 1 : 0;1066para.data.mac.size = 1;1067break;1068case PHYDM_HALMAC_CMD_MAC_W16:1069para.cmd = 0; /* MAC register */1070para.data.mac.offset = offset;1071para.data.mac.value = data;1072para.data.mac.msk = mask;1073para.data.mac.msk_en = (mask) ? 1 : 0;1074para.data.mac.size = 2;1075break;1076case PHYDM_HALMAC_CMD_MAC_W32:1077para.cmd = 0; /* MAC register */1078para.data.mac.offset = offset;1079para.data.mac.value = data;1080para.data.mac.msk = mask;1081para.data.mac.msk_en = (mask) ? 1 : 0;1082para.data.mac.size = 4;1083break;1084case PHYDM_HALMAC_CMD_BB_W8:1085para.cmd = 1; /* BB register */1086para.data.bb.offset = offset;1087para.data.bb.value = data;1088para.data.bb.msk = mask;1089para.data.bb.msk_en = (mask) ? 1 : 0;1090para.data.bb.size = 1;1091break;1092case PHYDM_HALMAC_CMD_BB_W16:1093para.cmd = 1; /* BB register */1094para.data.bb.offset = offset;1095para.data.bb.value = data;1096para.data.bb.msk = mask;1097para.data.bb.msk_en = (mask) ? 1 : 0;1098para.data.bb.size = 2;1099break;1100case PHYDM_HALMAC_CMD_BB_W32:1101para.cmd = 1; /* BB register */1102para.data.bb.offset = offset;1103para.data.bb.value = data;1104para.data.bb.msk = mask;1105para.data.bb.msk_en = (mask) ? 1 : 0;1106para.data.bb.size = 4;1107break;1108case PHYDM_HALMAC_CMD_RF_W:1109para.cmd = 2; /* RF register */1110para.data.rf.offset = offset;1111para.data.rf.value = data;1112para.data.rf.msk = mask;1113para.data.rf.msk_en = (mask) ? 1 : 0;1114if (e_rf_path == RF_PATH_A)1115para.data.rf.path = 0;1116else if (e_rf_path == RF_PATH_B)1117para.data.rf.path = 1;1118else if (e_rf_path == RF_PATH_C)1119para.data.rf.path = 2;1120else if (e_rf_path == RF_PATH_D)1121para.data.rf.path = 3;1122else1123para.data.rf.path = 0;1124break;1125case PHYDM_HALMAC_CMD_DELAY_US:1126para.cmd = 3; /* Delay */1127para.data.delay.unit = 0; /* microsecond */1128para.data.delay.value = delay_time;1129break;1130case PHYDM_HALMAC_CMD_DELAY_MS:1131para.cmd = 3; /* Delay */1132para.data.delay.unit = 1; /* millisecond */1133para.data.delay.value = delay_time;1134break;1135case PHYDM_HALMAC_CMD_END:1136para.cmd = 0xFF; /* End command */1137break;1138default:1139return HAL_STATUS_FAILURE;1140}11411142if (rtw_halmac_cfg_phy_para(adapter_to_dvobj(adapter), ¶))1143return HAL_STATUS_FAILURE;1144#endif /*RTW_HALMAC*/1145return HAL_STATUS_SUCCESS;1146}114711481149#ifdef CONFIG_LPS_LCLK_WD_TIMER1150void rtw_phydm_wd_lps_lclk_hdl(_adapter *adapter)1151{1152struct mlme_priv *pmlmepriv = &adapter->mlmepriv;1153PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);1154struct sta_priv *pstapriv = &adapter->stapriv;1155struct sta_info *psta = NULL;1156bool is_linked = _FALSE;11571158if (!rtw_is_hw_init_completed(adapter))1159return;11601161if (rtw_mi_check_status(adapter, MI_ASSOC))1162is_linked = _TRUE;11631164if (is_linked == _FALSE)1165return;11661167psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));1168if (psta == NULL)1169return;11701171odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, is_linked);11721173phydm_watchdog_lps_32k(&pHalData->odmpriv);1174}11751176void rtw_phydm_watchdog_in_lps_lclk(_adapter *adapter)1177{1178struct mlme_priv *pmlmepriv = &adapter->mlmepriv;1179struct sta_priv *pstapriv = &adapter->stapriv;1180u8 cur_igi = 0;1181s8 min_rssi = 0;11821183if (!rtw_is_hw_init_completed(adapter))1184return;11851186cur_igi = rtw_phydm_get_cur_igi(adapter);1187min_rssi = rtw_dm_get_min_rssi(adapter);1188/*RTW_INFO("%s "ADPT_FMT" cur_ig_value=%d, min_rssi = %d\n", __func__, ADPT_ARG(adapter), cur_igi, min_rssi);*/11891190if (min_rssi <= 0)1191return;11921193if ((cur_igi > min_rssi + 5) ||1194(cur_igi < min_rssi - 5)) {1195#ifdef CONFIG_LPS1196rtw_dm_in_lps_wk_cmd(adapter);1197#endif1198}1199}1200#endif /*CONFIG_LPS_LCLK_WD_TIMER*/12011202void dump_sta_traffic(void *sel, _adapter *adapter, struct sta_info *psta)1203{1204struct ra_sta_info *ra_info;1205u8 curr_sgi = _FALSE;1206u32 tx_tp_mbips, rx_tp_mbips, bi_tp_mbips;12071208if (!psta)1209return;1210RTW_PRINT_SEL(sel, "\n");1211RTW_PRINT_SEL(sel, "====== mac_id : %d [" MAC_FMT "] ======\n",1212psta->cmn.mac_id, MAC_ARG(psta->cmn.mac_addr));12131214if (is_client_associated_to_ap(psta->padapter))1215RTW_PRINT_SEL(sel, "BCN counts : %d (per-%d second), DTIM Period:%d\n",1216rtw_get_bcn_cnt(psta->padapter) / 2, 1, rtw_get_bcn_dtim_period(psta->padapter));12171218ra_info = &psta->cmn.ra_info;1219curr_sgi = rtw_get_current_tx_sgi(adapter, psta);1220RTW_PRINT_SEL(sel, "tx_rate : %s(%s) rx_rate : %s, rx_rate_bmc : %s, rssi : %d %%\n"1221, HDATA_RATE(rtw_get_current_tx_rate(adapter, psta)), (curr_sgi) ? "S" : "L"1222, HDATA_RATE((psta->curr_rx_rate & 0x7F)), HDATA_RATE((psta->curr_rx_rate_bmc & 0x7F)), psta->cmn.rssi_stat.rssi1223);12241225if (0) {1226RTW_PRINT_SEL(sel, "tx_bytes:%llu(%llu - %llu)\n"1227, psta->sta_stats.tx_bytes - psta->sta_stats.last_tx_bytes1228, psta->sta_stats.tx_bytes, psta->sta_stats.last_tx_bytes1229);1230RTW_PRINT_SEL(sel, "rx_uc_bytes:%llu(%llu - %llu)\n"1231, sta_rx_uc_bytes(psta) - sta_last_rx_uc_bytes(psta)1232, sta_rx_uc_bytes(psta), sta_last_rx_uc_bytes(psta)1233);1234RTW_PRINT_SEL(sel, "rx_mc_bytes:%llu(%llu - %llu)\n"1235, psta->sta_stats.rx_mc_bytes - psta->sta_stats.last_rx_mc_bytes1236, psta->sta_stats.rx_mc_bytes, psta->sta_stats.last_rx_mc_bytes1237);1238RTW_PRINT_SEL(sel, "rx_bc_bytes:%llu(%llu - %llu)\n"1239, psta->sta_stats.rx_bc_bytes - psta->sta_stats.last_rx_bc_bytes1240, psta->sta_stats.rx_bc_bytes, psta->sta_stats.last_rx_bc_bytes1241);1242}12431244_RTW_PRINT_SEL(sel, "RTW: [TP] ");1245tx_tp_mbips = psta->sta_stats.tx_tp_kbits >> 10;1246rx_tp_mbips = psta->sta_stats.rx_tp_kbits >> 10;1247bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;12481249if (tx_tp_mbips)1250_RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);1251else1252_RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.tx_tp_kbits);12531254if (rx_tp_mbips)1255_RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);1256else1257_RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.rx_tp_kbits);12581259if (bi_tp_mbips)1260_RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);1261else1262_RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.tx_tp_kbits + psta->sta_stats.rx_tp_kbits);126312641265_RTW_PRINT_SEL(sel, "RTW: [Smooth TP] ");1266tx_tp_mbips = psta->sta_stats.smooth_tx_tp_kbits >> 10;1267rx_tp_mbips = psta->sta_stats.smooth_rx_tp_kbits >> 10;1268bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;1269if (tx_tp_mbips)1270_RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);1271else1272_RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.smooth_tx_tp_kbits);12731274if (rx_tp_mbips)1275_RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);1276else1277_RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.smooth_rx_tp_kbits);12781279if (bi_tp_mbips)1280_RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);1281else1282_RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.smooth_tx_tp_kbits + psta->sta_stats.rx_tp_kbits);12831284#if 01285RTW_PRINT_SEL(sel, "Moving-AVG TP {Tx,Rx,Total} = { %d , %d , %d } Mbps\n\n",1286(psta->cmn.tx_moving_average_tp << 3), (psta->cmn.rx_moving_average_tp << 3),1287(psta->cmn.tx_moving_average_tp + psta->cmn.rx_moving_average_tp) << 3);1288#endif1289}12901291void dump_sta_info(void *sel, struct sta_info *psta)1292{1293struct ra_sta_info *ra_info;1294u8 curr_tx_sgi = _FALSE;1295u8 curr_tx_rate = 0;12961297if (!psta)1298return;12991300ra_info = &psta->cmn.ra_info;13011302RTW_PRINT_SEL(sel, "============ STA [" MAC_FMT "] ===================\n",1303MAC_ARG(psta->cmn.mac_addr));1304RTW_PRINT_SEL(sel, "mac_id : %d\n", psta->cmn.mac_id);1305RTW_PRINT_SEL(sel, "wireless_mode : 0x%02x\n", psta->wireless_mode);1306RTW_PRINT_SEL(sel, "mimo_type : %d\n", psta->cmn.mimo_type);1307RTW_PRINT_SEL(sel, "static smps : %s\n", (psta->cmn.sm_ps == SM_PS_STATIC) ? "Y" : "N");1308RTW_PRINT_SEL(sel, "bw_mode : %s, ra_bw_mode : %s\n",1309ch_width_str(psta->cmn.bw_mode), ch_width_str(ra_info->ra_bw_mode));1310RTW_PRINT_SEL(sel, "rate_id : %d\n", ra_info->rate_id);1311RTW_PRINT_SEL(sel, "rssi : %d (%%), rssi_level : %d\n", psta->cmn.rssi_stat.rssi, ra_info->rssi_level);1312RTW_PRINT_SEL(sel, "is_support_sgi : %s, is_vht_enable : %s\n",1313(ra_info->is_support_sgi) ? "Y" : "N", (ra_info->is_vht_enable) ? "Y" : "N");1314RTW_PRINT_SEL(sel, "disable_ra : %s, disable_pt : %s\n",1315(ra_info->disable_ra) ? "Y" : "N", (ra_info->disable_pt) ? "Y" : "N");1316RTW_PRINT_SEL(sel, "is_noisy : %s\n", (ra_info->is_noisy) ? "Y" : "N");1317RTW_PRINT_SEL(sel, "txrx_state : %d\n", ra_info->txrx_state);/*0: uplink, 1:downlink, 2:bi-direction*/13181319curr_tx_sgi = rtw_get_current_tx_sgi(psta->padapter, psta);1320curr_tx_rate = rtw_get_current_tx_rate(psta->padapter, psta);1321RTW_PRINT_SEL(sel, "curr_tx_rate : %s (%s)\n",1322HDATA_RATE(curr_tx_rate), (curr_tx_sgi) ? "S" : "L");1323RTW_PRINT_SEL(sel, "curr_tx_bw : %s\n", ch_width_str(ra_info->curr_tx_bw));1324RTW_PRINT_SEL(sel, "curr_retry_ratio : %d\n", ra_info->curr_retry_ratio);1325RTW_PRINT_SEL(sel, "ra_mask : 0x%016llx\n", ra_info->ramask);1326}13271328void rtw_phydm_ra_registed(_adapter *adapter, struct sta_info *psta)1329{1330HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);13311332if (psta == NULL) {1333RTW_ERR(FUNC_ADPT_FMT" sta is NULL\n", FUNC_ADPT_ARG(adapter));1334rtw_warn_on(1);1335return;1336}13371338phydm_ra_registed(&hal_data->odmpriv, psta->cmn.mac_id, psta->cmn.rssi_stat.rssi);1339dump_sta_info(RTW_DBGDUMP, psta);1340}13411342static void init_phydm_info(_adapter *adapter)1343{1344PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);1345struct dm_struct *phydm = &(hal_data->odmpriv);13461347odm_cmn_info_init(phydm, ODM_CMNINFO_FW_VER, hal_data->firmware_version);1348odm_cmn_info_init(phydm, ODM_CMNINFO_FW_SUB_VER, hal_data->firmware_sub_version);1349}13501351#ifdef CONFIG_CTRL_TXSS_BY_TP1352void rtw_phydm_trx_cfg(_adapter *adapter, bool tx_1ss)1353{1354HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);1355enum bb_path txpath = BB_PATH_AB;1356enum bb_path rxpath = BB_PATH_AB;1357/*is_2tx = _FALSE for 8822B, or BB_PATH_AUTO for PATH_DIVERSITY for 8822B*/1358enum bb_path txpath_1ss = BB_PATH_A;13591360rtw_hal_get_trx_path(adapter_to_dvobj(adapter), NULL, &txpath, &rxpath);1361txpath = (tx_1ss) ? BB_PATH_A : txpath;13621363if (phydm_api_trx_mode(adapter_to_phydm(adapter), txpath, rxpath, txpath_1ss) == FALSE)1364RTW_ERR("%s failed\n", __func__);1365}1366#endif136713681369/*1370* trx_mode init - 8822B / 8822C / 8192F1371* 1ssNTx - 8192E / 8812A / 8822B / 8822C / 8192F1372* Path-diversity - 8822B / 8822C / 8192F1373* PHYDM API - phydm_api_trx_mode1374*/1375static u8 rtw_phydm_config_trx_path(_adapter *adapter)1376{1377HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);1378enum bb_path txpath;1379enum bb_path rxpath;1380int i;1381u8 rst = _FAIL;13821383rtw_hal_get_trx_path(adapter_to_dvobj(adapter), NULL, &txpath, &rxpath);1384if (!txpath) {1385RTW_ERR("%s tx_path_bmp is empty\n", __func__);1386rtw_warn_on(1);1387goto exit;1388}1389if (!rxpath) {1390RTW_ERR("%s rx_path_bmp is empty\n", __func__);1391rtw_warn_on(1);1392goto exit;1393}13941395tx_path_nss_set_default(hal_data->txpath_nss, hal_data->txpath_num_nss1396, GET_HAL_TX_PATH_BMP(adapter));13971398#if defined(CONFIG_RTL8192F) || defined(CONFIG_RTL8822B) ||defined(CONFIG_RTL8822C)1399{1400enum bb_path txpath_1ss;14011402if (txpath == BB_PATH_AB) {1403switch (hal_data->max_tx_cnt) {1404case 2:1405#ifdef CONFIG_RTW_TX_NPATH_EN1406if (adapter->registrypriv.tx_npath == 1)1407txpath_1ss = BB_PATH_AB;1408else1409#endif1410#ifdef CONFIG_RTW_PATH_DIV1411if (adapter->registrypriv.path_div == 1) /* path diversity, support 2sts TX */1412txpath_1ss = BB_PATH_AUTO;1413else1414#endif1415txpath_1ss = BB_PATH_A;1416break;1417case 1:1418#ifdef CONFIG_RTW_PATH_DIV1419if (adapter->registrypriv.path_div == 1) /* path diversity, no support 2sts TX */1420txpath = txpath_1ss = BB_PATH_AUTO;1421else1422#endif1423txpath = txpath_1ss = BB_PATH_A;1424break;1425default:1426RTW_ERR("%s invalid max_tx_cnt:%u\n", __func__1427, hal_data->max_tx_cnt);1428rtw_warn_on(1);1429goto exit;1430}1431} else1432txpath_1ss = txpath;14331434if (phydm_api_trx_mode(adapter_to_phydm(adapter), txpath, rxpath, txpath_1ss) == FALSE) {1435RTW_ERR("%s txpath=0x%x, rxpath=0x%x, txpath_1ss=0x%x fail\n", __func__1436, txpath, rxpath, txpath_1ss);1437rtw_warn_on(1);1438goto exit;1439}14401441if (hal_data->txpath_nss[0] != txpath_1ss) {1442hal_data->txpath_nss[0] = txpath_1ss;1443if (txpath_1ss == BB_PATH_AUTO)1444hal_data->txpath_num_nss[0] = 1;1445else {1446hal_data->txpath_num_nss[0] = 0;1447for (i = 0; i < RF_PATH_MAX; i++) {1448if (txpath_1ss & BIT(i))1449hal_data->txpath_num_nss[0]++;1450}1451}1452}1453}1454#elif defined(CONFIG_RTL8814B)1455{1456if (config_phydm_trx_mode_8814b(adapter_to_phydm(adapter), txpath, rxpath) == FALSE) {1457RTW_ERR("%s txpath=0x%x, rxpath=0x%x fail\n", __func__1458, txpath, rxpath);1459rtw_warn_on(1);1460goto exit;1461}14621463/* 8814B is always full-TX */1464tx_path_nss_set_full_tx(hal_data->txpath_nss, hal_data->txpath_num_nss, txpath);1465}1466#elif defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8192E)1467{1468#ifdef CONFIG_RTW_TX_NPATH_EN1469if (adapter->registrypriv.tx_npath == 1) {1470phydm_tx_2path(adapter_to_phydm(adapter));1471tx_path_nss_set_full_tx(hal_data->txpath_nss, hal_data->txpath_num_nss, txpath);1472}1473#endif1474}1475#endif14761477hal_data->txpath = txpath;1478hal_data->rxpath = rxpath;1479dump_hal_runtime_trx_mode(RTW_DBGDUMP, adapter);1480rst = _SUCCESS;14811482exit:1483return rst;1484}14851486void rtw_phydm_init(_adapter *adapter)1487{1488PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);1489struct dm_struct *phydm = &(hal_data->odmpriv);14901491rtw_phydm_config_trx_path(adapter);1492init_phydm_info(adapter);1493odm_dm_init(phydm);1494#ifdef CONFIG_CUSTOMER01_SMART_ANTENNA1495phydm_pathb_q_matrix_rotate_en(phydm);1496#endif1497}14981499bool rtw_phydm_set_crystal_cap(_adapter *adapter, u8 crystal_cap)1500{1501PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);1502struct dm_struct *phydm = &(hal_data->odmpriv);15031504return phydm_set_crystal_cap_reg(phydm, crystal_cap);1505}15061507#ifdef CONFIG_LPS_PG1508/*1509static void _lps_pg_state_update(_adapter *adapter)1510{1511u8 is_in_lpspg = _FALSE;1512struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);1513PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);1514struct mlme_priv *pmlmepriv = &adapter->mlmepriv;1515struct sta_priv *pstapriv = &adapter->stapriv;1516struct sta_info *psta = NULL;15171518if ((pwrpriv->lps_level == LPS_PG) && (pwrpriv->pwr_mode != PS_MODE_ACTIVE) && (pwrpriv->rpwm <= PS_STATE_S2))1519is_in_lpspg = _TRUE;1520psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));15211522if (psta)1523psta->cmn.ra_info.disable_ra = (is_in_lpspg) ? _TRUE : _FALSE;1524}1525*/1526void rtw_phydm_lps_pg_hdl(_adapter *adapter, struct sta_info *sta, bool in_lpspg)1527{1528struct dm_struct *phydm = adapter_to_phydm(adapter);1529/*u8 rate_id;*/15301531if(sta == NULL) {1532RTW_ERR("%s sta is null\n", __func__);1533rtw_warn_on(1);1534return;1535}15361537if (in_lpspg) {1538sta->cmn.ra_info.disable_ra = _TRUE;1539sta->cmn.ra_info.disable_pt = _TRUE;1540/*TODO : DRV fix tx rate*/1541/*rate_id = phydm_get_rate_from_rssi_lv(phydm, sta->cmn.mac_id);*/1542} else {1543sta->cmn.ra_info.disable_ra = _FALSE;1544sta->cmn.ra_info.disable_pt = _FALSE;1545}15461547rtw_phydm_ra_registed(adapter, sta);1548}1549#endif15501551/*#define DBG_PHYDM_STATE_CHK*/155215531554static u8 _rtw_phydm_rfk_condition_check(_adapter *adapter, u8 is_scaning, u8 ifs_linked)1555{1556u8 rfk_allowed = _TRUE;15571558#ifdef CONFIG_SKIP_RFK_IN_DM1559rfk_allowed = _FALSE;1560if (0)1561RTW_ERR("[RFK-CHK] RF-K not allowed due to CONFIG_SKIP_RFK_IN_DM\n");1562return rfk_allowed;1563#endif15641565#ifdef CONFIG_MCC_MODE1566/*not in MCC State*/1567if (MCC_EN(adapter) &&1568rtw_hal_check_mcc_status(adapter, MCC_STATUS_DOING_MCC)) {1569rfk_allowed = _FALSE;1570if (0)1571RTW_INFO("[RFK-CHK] RF-K not allowed due to doing MCC\n");1572return rfk_allowed;1573}1574#endif15751576#if defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)15771578#endif15791580if (ifs_linked) {1581if (is_scaning) {1582rfk_allowed = _FALSE;1583RTW_DBG("[RFK-CHK] RF-K not allowed due to ifaces under site-survey\n");1584}1585else {1586rfk_allowed = rtw_mi_stayin_union_ch_chk(adapter) ? _TRUE : _FALSE;1587if (rfk_allowed == _FALSE)1588RTW_ERR("[RFK-CHK] RF-K not allowed due to ld_iface not stayin union ch\n");1589}1590}15911592return rfk_allowed;1593}15941595#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))1596static u8 _rtw_phydm_iqk_segment_chk(_adapter *adapter, u8 ifs_linked)1597{1598u8 iqk_sgt = _FALSE;15991600#if 01601struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);1602if (ifs_linked && (dvobj->traffic_stat.cur_tx_tp > 2 || dvobj->traffic_stat.cur_rx_tp > 2))1603rst = _TRUE;1604#else1605if (ifs_linked)1606iqk_sgt = _TRUE;1607#endif1608return iqk_sgt;1609}1610#endif16111612/*check the tx low rate while unlinked to any AP;for pwr tracking */1613static u8 _rtw_phydm_pwr_tracking_rate_check(_adapter *adapter)1614{1615int i;1616_adapter *iface;1617u8 if_tx_rate = 0xFF;1618u8 tx_rate = 0xFF;1619struct mlme_ext_priv *pmlmeext = NULL;1620struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);16211622for (i = 0; i < dvobj->iface_nums; i++) {1623iface = dvobj->padapters[i];1624pmlmeext = &(iface->mlmeextpriv);1625if ((iface) && rtw_is_adapter_up(iface)) {1626#ifdef CONFIG_P2P1627if (!rtw_p2p_chk_role(&(iface)->wdinfo, P2P_ROLE_DISABLE))1628if_tx_rate = IEEE80211_OFDM_RATE_6MB;1629else1630#endif1631if_tx_rate = pmlmeext->tx_rate;1632if(if_tx_rate < tx_rate)1633tx_rate = if_tx_rate;16341635RTW_DBG("%s i=%d tx_rate =0x%x\n", __func__, i, if_tx_rate);1636}1637}1638RTW_DBG("%s tx_low_rate (unlinked to any AP)=0x%x\n", __func__, tx_rate);1639return tx_rate;1640}16411642#ifdef CONFIG_DYNAMIC_SOML1643void rtw_dyn_soml_byte_update(_adapter *adapter, u8 data_rate, u32 size)1644{1645struct dm_struct *phydm = adapter_to_phydm(adapter);16461647phydm_soml_bytes_acq(phydm, data_rate, size);1648}16491650void rtw_dyn_soml_para_set(_adapter *adapter, u8 train_num, u8 intvl,1651u8 period, u8 delay)1652{1653struct dm_struct *phydm = adapter_to_phydm(adapter);16541655phydm_adaptive_soml_para_set(phydm, train_num, intvl, period, delay);1656RTW_INFO("%s.\n", __func__);1657}16581659void rtw_dyn_soml_config(_adapter *adapter)1660{1661RTW_INFO("%s.\n", __func__);16621663if (adapter->registrypriv.dyn_soml_en == 1) {1664/* Must after phydm_adaptive_soml_init() */1665rtw_hal_set_hwreg(adapter , HW_VAR_SET_SOML_PARAM , NULL);1666RTW_INFO("dyn_soml_en = 1\n");1667} else {1668if (adapter->registrypriv.dyn_soml_en == 2) {1669rtw_dyn_soml_para_set(adapter,1670adapter->registrypriv.dyn_soml_train_num,1671adapter->registrypriv.dyn_soml_interval,1672adapter->registrypriv.dyn_soml_period,1673adapter->registrypriv.dyn_soml_delay);1674RTW_INFO("dyn_soml_en = 2\n");1675RTW_INFO("dyn_soml_en, param = %d, %d, %d, %d\n",1676adapter->registrypriv.dyn_soml_train_num,1677adapter->registrypriv.dyn_soml_interval,1678adapter->registrypriv.dyn_soml_period,1679adapter->registrypriv.dyn_soml_delay);1680} else if (adapter->registrypriv.dyn_soml_en == 0) {1681RTW_INFO("dyn_soml_en = 0\n");1682} else1683RTW_ERR("%s, wrong setting: dyn_soml_en = %d\n", __func__,1684adapter->registrypriv.dyn_soml_en);1685}1686}1687#endif16881689void rtw_phydm_set_rrsr(_adapter *adapter, u32 rrsr_value, bool write_rrsr)1690{16911692struct dm_struct *phydm = adapter_to_phydm(adapter);16931694odm_cmn_info_update(phydm, ODM_CMNINFO_RRSR_VAL, rrsr_value);1695if(write_rrsr)1696phydm_rrsr_set_register(phydm, rrsr_value);1697}1698void rtw_phydm_read_efuse(_adapter *adapter)1699{1700PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);1701struct dm_struct *phydm = &(hal_data->odmpriv);17021703/*PHYDM API - thermal trim*/1704phydm_get_thermal_trim_offset(phydm);1705/*PHYDM API - power trim*/1706phydm_get_power_trim_offset(phydm);1707}17081709#ifdef CONFIG_LPS_PWR_TRACKING1710void rtw_phydm_pwr_tracking_directly(_adapter *adapter)1711{1712PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);1713u8 rfk_forbidden = _TRUE;1714u8 is_linked = _FALSE;17151716if (rtw_mi_check_status(adapter, MI_ASSOC))1717is_linked = _TRUE;17181719rfk_forbidden = (_rtw_phydm_rfk_condition_check(adapter, hal_data->bScanInProcess, is_linked) == _TRUE) ? _FALSE : _TRUE;1720halrf_cmn_info_set(&hal_data->odmpriv, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);17211722odm_txpowertracking_direct_ce(&hal_data->odmpriv);1723}1724#endif17251726void rtw_phydm_watchdog(_adapter *adapter, bool in_lps)1727{1728u8 bLinked = _FALSE;1729u8 bsta_state = _FALSE;1730u8 bBtDisabled = _TRUE;1731u8 rfk_forbidden = _FALSE;1732#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))1733u8 segment_iqk = _FALSE;1734#endif1735u8 tx_unlinked_low_rate = 0xFF;1736PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);17371738if (!rtw_is_hw_init_completed(adapter)) {1739RTW_DBG("%s skip due to hw_init_completed == FALSE\n", __func__);1740return;1741}1742if (rtw_mi_check_fwstate(adapter, _FW_UNDER_SURVEY))1743pHalData->bScanInProcess = _TRUE;1744else1745pHalData->bScanInProcess = _FALSE;17461747if (rtw_mi_check_status(adapter, MI_ASSOC)) {1748bLinked = _TRUE;1749if (rtw_mi_check_status(adapter, MI_STA_LINKED))1750bsta_state = _TRUE;1751}17521753odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);1754odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);17551756#ifdef CONFIG_BT_COEXIST1757bBtDisabled = rtw_btcoex_IsBtDisabled(adapter);1758odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,1759(bBtDisabled == _TRUE) ? _FALSE : _TRUE);1760#else1761odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, _FALSE);1762#endif /* CONFIG_BT_COEXIST */17631764rfk_forbidden = (_rtw_phydm_rfk_condition_check(adapter, pHalData->bScanInProcess, bLinked) == _TRUE) ? _FALSE : _TRUE;1765halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);17661767#if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1) || (RTL8822C_SUPPORT == 1))1768segment_iqk = _rtw_phydm_iqk_segment_chk(adapter, bLinked);1769halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_IQK_SEGMENT, segment_iqk);1770#endif1771#ifdef DBG_PHYDM_STATE_CHK1772RTW_INFO("%s rfk_forbidden = %s, segment_iqk = %s\n",1773__func__, (rfk_forbidden) ? "Y" : "N", (segment_iqk) ? "Y" : "N");1774#endif17751776if (bLinked == _FALSE) {1777tx_unlinked_low_rate = _rtw_phydm_pwr_tracking_rate_check(adapter);1778halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RATE_INDEX, tx_unlinked_low_rate);1779}17801781/*if (!rtw_mi_stayin_union_band_chk(adapter)) {1782#ifdef DBG_PHYDM_STATE_CHK1783RTW_ERR("Not stay in union band, skip phydm\n");1784#endif1785goto _exit;1786}*/17871788#ifdef CONFIG_TDMADIG1789rtw_phydm_tdmadig(adapter, TDMADIG_NON_INIT);1790#endif/*CONFIG_TDMADIG*/17911792if (in_lps)1793phydm_watchdog_lps(&pHalData->odmpriv);1794else1795phydm_watchdog(&pHalData->odmpriv);17961797#ifdef CONFIG_RTW_ACS1798rtw_acs_update_current_info(adapter);1799#endif18001801return;1802}1803180418051806