Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halphyrf_ap.c
1308 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*****************************************************************************/1415#include "mp_precomp.h"16#include "phydm_precomp.h"1718#ifndef index_mapping_NUM_88E19#define index_mapping_NUM_88E 1520#endif2122/* #if(DM_ODM_SUPPORT_TYPE & ODM_WIN) */2324#define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _delta_thermal) \25do {\26for (_offset = 0; _offset < _size; _offset++) { \27\28if (_delta_thermal < thermal_threshold[_direction][_offset]) { \29\30if (_offset != 0)\31_offset--;\32break;\33} \34} \35if (_offset >= _size)\36_offset = _size-1;\37} while (0)3839void odm_clear_txpowertracking_state(40void *dm_void41)42{43struct dm_struct *dm = (struct dm_struct *)dm_void;44struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);45struct rtl8192cd_priv *priv = dm->priv;4647u8 i;4849RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "===>%s\n", __func__);5051for (i = 0; i < MAX_RF_PATH; i++) {52cali_info->absolute_ofdm_swing_idx[i] = 0;53RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "cali_info->absolute_ofdm_swing_idx[%d]=%d\n",54i, cali_info->absolute_ofdm_swing_idx[i]);55}5657dm->rf_calibrate_info.thermal_value = 0;58dm->rf_calibrate_info.thermal_value_lck = 0;59dm->rf_calibrate_info.thermal_value_iqk = 0;60}6162void configure_txpower_track(63void *dm_void,64struct txpwrtrack_cfg *config65)66{67struct dm_struct *dm = (struct dm_struct *)dm_void;68#if RTL8812A_SUPPORT69#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)70/* if (IS_HARDWARE_TYPE_8812(dm->adapter)) */71if (dm->support_ic_type == ODM_RTL8812)72configure_txpower_track_8812a(config);73/* else */74#endif75#endif7677#if RTL8814A_SUPPORT78if (dm->support_ic_type == ODM_RTL8814A)79configure_txpower_track_8814a(config);80#endif818283#if RTL8188E_SUPPORT84if (dm->support_ic_type == ODM_RTL8188E)85configure_txpower_track_8188e(config);86#endif8788#if RTL8197F_SUPPORT89if (dm->support_ic_type == ODM_RTL8197F)90configure_txpower_track_8197f(config);91#endif9293#if RTL8822B_SUPPORT94if (dm->support_ic_type == ODM_RTL8822B)95configure_txpower_track_8822b(config);96#endif9798#if RTL8192F_SUPPORT99if (dm->support_ic_type == ODM_RTL8192F)100configure_txpower_track_8192f(config);101#endif102103#if RTL8198F_SUPPORT104if (dm->support_ic_type == ODM_RTL8198F)105configure_txpower_track_8198f(config);106#endif107108#if RTL8814B_SUPPORT109if (dm->support_ic_type == ODM_RTL8814B)110configure_txpower_track_8814b(config);111#endif112113#if RTL8812F_SUPPORT114if (dm->support_ic_type == ODM_RTL8812F)115configure_txpower_track_8812f(config);116#endif117118#if RTL8197G_SUPPORT119if (dm->support_ic_type == ODM_RTL8197G)120configure_txpower_track_8197g(config);121#endif122123}124125#if (RTL8192E_SUPPORT == 1)126void127odm_txpowertracking_callback_thermal_meter_92e(128void *dm_void129)130{131struct dm_struct *dm = (struct dm_struct *)dm_void;132struct dm_iqk_info *iqk_info = &dm->IQK_info;133u8 thermal_value = 0, delta, delta_IQK, delta_LCK, channel, is_decrease, rf_mimo_mode;134u8 thermal_value_avg_count = 0;135u8 OFDM_min_index = 10; /* OFDM BB Swing should be less than +2.5dB, which is required by Arthur */136s8 OFDM_index[2], index ;137u32 thermal_value_avg = 0, reg0x18;138u32 i = 0, j = 0, rf;139s32 value32, CCK_index = 0, ele_A, ele_D, ele_C, X, Y;140struct rtl8192cd_priv *priv = dm->priv;141142rf_mimo_mode = dm->rf_type;143/* RF_DBG(dm,DBG_RF_TX_PWR_TRACK,"%s:%d rf_mimo_mode:%d\n", __FUNCTION__, __LINE__, rf_mimo_mode); */144145#ifdef MP_TEST146if ((OPMODE & WIFI_MP_STATE) || *(dm->mp_mode)) {147channel = priv->pshare->working_channel;148if (priv->pshare->mp_txpwr_tracking == false)149return;150} else151#endif152{153channel = (priv->pmib->dot11RFEntry.dot11channel);154}155156thermal_value = (unsigned char)odm_get_rf_reg(dm, RF_PATH_A, ODM_RF_T_METER_92E, 0xfc00); /* 0x42: RF Reg[15:10] 88E */157RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", thermal_value, priv->pshare->thermal_value, priv->pmib->dot11RFEntry.ther);158159160switch (rf_mimo_mode) {161case RF_1T1R:162rf = 1;163break;164case RF_2T2R:165rf = 2;166break;167default:168rf = 2;169break;170}171172/* Query OFDM path A default setting Bit[31:21] */173ele_D = phy_query_bb_reg(priv, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKOFDM_D);174for (i = 0; i < OFDM_TABLE_SIZE_92E; i++) {175if (ele_D == (ofdm_swing_table_92e[i] >> 22)) {176OFDM_index[0] = (unsigned char)i;177RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "PathA 0xC80[31:22] = 0x%x, OFDM_index=%d\n", ele_D, OFDM_index[0]);178break;179}180}181182/* Query OFDM path B default setting */183if (rf_mimo_mode == RF_2T2R) {184ele_D = phy_query_bb_reg(priv, REG_OFDM_0_XB_TX_IQ_IMBALANCE, MASKOFDM_D);185for (i = 0; i < OFDM_TABLE_SIZE_92E; i++) {186if (ele_D == (ofdm_swing_table_92e[i] >> 22)) {187OFDM_index[1] = (unsigned char)i;188RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "PathB 0xC88[31:22] = 0x%x, OFDM_index=%d\n", ele_D, OFDM_index[1]);189break;190}191}192}193194/* calculate average thermal meter */195{196priv->pshare->thermal_value_avg_88xx[priv->pshare->thermal_value_avg_index_88xx] = thermal_value;197priv->pshare->thermal_value_avg_index_88xx++;198if (priv->pshare->thermal_value_avg_index_88xx == AVG_THERMAL_NUM_88XX)199priv->pshare->thermal_value_avg_index_88xx = 0;200201for (i = 0; i < AVG_THERMAL_NUM_88XX; i++) {202if (priv->pshare->thermal_value_avg_88xx[i]) {203thermal_value_avg += priv->pshare->thermal_value_avg_88xx[i];204thermal_value_avg_count++;205}206}207208if (thermal_value_avg_count) {209thermal_value = (unsigned char)(thermal_value_avg / thermal_value_avg_count);210RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "AVG Thermal Meter = 0x%x\n", thermal_value);211}212}213214/* Initialize */215if (!priv->pshare->thermal_value) {216priv->pshare->thermal_value = priv->pmib->dot11RFEntry.ther;217priv->pshare->thermal_value_iqk = thermal_value;218priv->pshare->thermal_value_lck = thermal_value;219}220221if (thermal_value != priv->pshare->thermal_value) {222RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n******** START POWER TRACKING ********\n");223RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", thermal_value, priv->pshare->thermal_value, priv->pmib->dot11RFEntry.ther);224225delta = RTL_ABS(thermal_value, priv->pmib->dot11RFEntry.ther);226delta_IQK = RTL_ABS(thermal_value, priv->pshare->thermal_value_iqk);227delta_LCK = RTL_ABS(thermal_value, priv->pshare->thermal_value_lck);228is_decrease = ((thermal_value < priv->pmib->dot11RFEntry.ther) ? 1 : 0);229230#ifdef _TRACKING_TABLE_FILE231if (priv->pshare->rf_ft_var.pwr_track_file) {232RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "diff: (%s)%d ==> get index from table : %d)\n", (is_decrease ? "-" : "+"), delta, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0));233234if (is_decrease) {235for (i = 0; i < rf; i++) {236OFDM_index[i] = priv->pshare->OFDM_index0[i] + get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0);237OFDM_index[i] = ((OFDM_index[i] > (OFDM_TABLE_SIZE_92E- 1)) ? (OFDM_TABLE_SIZE_92E - 1) : OFDM_index[i]);238RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> decrese power ---> new OFDM_INDEX:%d (%d + %d)\n", OFDM_index[i], priv->pshare->OFDM_index0[i], get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0));239CCK_index = priv->pshare->CCK_index0 + get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1);240CCK_index = ((CCK_index > (CCK_TABLE_SIZE_92E - 1)) ? (CCK_TABLE_SIZE_92E - 1) : CCK_index);241RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> Decrese power ---> new CCK_INDEX:%d (%d + %d)\n", CCK_index, priv->pshare->CCK_index0, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1));242}243} else {244for (i = 0; i < rf; i++) {245OFDM_index[i] = priv->pshare->OFDM_index0[i] - get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0);246OFDM_index[i] = ((OFDM_index[i] < OFDM_min_index) ? OFDM_min_index : OFDM_index[i]);247RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> Increse power ---> new OFDM_INDEX:%d (%d - %d)\n", OFDM_index[i], priv->pshare->OFDM_index0[i], get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0));248CCK_index = priv->pshare->CCK_index0 - get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1);249CCK_index = ((CCK_index < 0) ? 0 : CCK_index);250RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> Increse power ---> new CCK_INDEX:%d (%d - %d)\n", CCK_index, priv->pshare->CCK_index0, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1));251}252}253}254#endif /* CFG_TRACKING_TABLE_FILE */255256RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "ofdm_swing_table_92e[(unsigned int)OFDM_index[0]] = %x\n", ofdm_swing_table_92e[(unsigned int)OFDM_index[0]]);257RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "ofdm_swing_table_92e[(unsigned int)OFDM_index[1]] = %x\n", ofdm_swing_table_92e[(unsigned int)OFDM_index[1]]);258259/* Adujst OFDM Ant_A according to IQK result */260ele_D = (ofdm_swing_table_92e[(unsigned int)OFDM_index[0]] & 0xFFC00000) >> 22;261X = priv->pshare->rege94;262Y = priv->pshare->rege9c;263264if (X != 0) {265if ((X & 0x00000200) != 0)266X = X | 0xFFFFFC00;267ele_A = ((X * ele_D) >> 8) & 0x000003FF;268269/* new element C = element D x Y */270if ((Y & 0x00000200) != 0)271Y = Y | 0xFFFFFC00;272ele_C = ((Y * ele_D) >> 8) & 0x000003FF;273274/* wirte new elements A, C, D to regC80 and regC94, element B is always 0 */275value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;276phy_set_bb_reg(priv, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD, value32);277278value32 = (ele_C & 0x000003C0) >> 6;279phy_set_bb_reg(priv, REG_OFDM_0_XC_TX_AFE, MASKH4BITS, value32);280281value32 = ((X * ele_D) >> 7) & 0x01;282phy_set_bb_reg(priv, REG_OFDM_0_ECCA_THRESHOLD, BIT(24), value32);283} else {284phy_set_bb_reg(priv, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD, ofdm_swing_table_92e[(unsigned int)OFDM_index[0]]);285phy_set_bb_reg(priv, REG_OFDM_0_XC_TX_AFE, MASKH4BITS, 0x00);286phy_set_bb_reg(priv, REG_OFDM_0_ECCA_THRESHOLD, BIT(24), 0x00);287}288289set_CCK_swing_index(priv, CCK_index);290291if (rf == 2) {292ele_D = (ofdm_swing_table_92e[(unsigned int)OFDM_index[1]] & 0xFFC00000) >> 22;293X = priv->pshare->regeb4;294Y = priv->pshare->regebc;295296if (X != 0) {297if ((X & 0x00000200) != 0) /* consider minus */298X = X | 0xFFFFFC00;299ele_A = ((X * ele_D) >> 8) & 0x000003FF;300301/* new element C = element D x Y */302if ((Y & 0x00000200) != 0)303Y = Y | 0xFFFFFC00;304ele_C = ((Y * ele_D) >> 8) & 0x00003FF;305306/* wirte new elements A, C, D to regC88 and regC9C, element B is always 0 */307value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;308phy_set_bb_reg(priv, REG_OFDM_0_XB_TX_IQ_IMBALANCE, MASKDWORD, value32);309310value32 = (ele_C & 0x000003C0) >> 6;311phy_set_bb_reg(priv, REG_OFDM_0_XD_TX_AFE, MASKH4BITS, value32);312313value32 = ((X * ele_D) >> 7) & 0x01;314phy_set_bb_reg(priv, REG_OFDM_0_ECCA_THRESHOLD, BIT(28), value32);315} else {316phy_set_bb_reg(priv, REG_OFDM_0_XB_TX_IQ_IMBALANCE, MASKDWORD, ofdm_swing_table_92e[(unsigned int)OFDM_index[1]]);317phy_set_bb_reg(priv, REG_OFDM_0_XD_TX_AFE, MASKH4BITS, 0x00);318phy_set_bb_reg(priv, REG_OFDM_0_ECCA_THRESHOLD, BIT(28), 0x00);319}320321}322323RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "0xc80 = 0x%x\n", phy_query_bb_reg(priv, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD));324RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "0xc88 = 0x%x\n", phy_query_bb_reg(priv, REG_OFDM_0_XB_TX_IQ_IMBALANCE, MASKDWORD));325326if ((delta_IQK > 3) && (!iqk_info->rfk_forbidden)) {327priv->pshare->thermal_value_iqk = thermal_value;328#ifdef MP_TEST329#endif if (!(*(dm->mp_mode) && (OPMODE & (WIFI_MP_CTX_BACKGROUND | WIFI_MP_CTX_PACKET))))330331halrf_iqk_trigger(dm, false);332}333334if ((delta_LCK > 8) && (!iqk_info->rfk_forbidden)) {335RTL_W8(0x522, 0xff);336reg0x18 = phy_query_rf_reg(priv, RF_PATH_A, 0x18, MASK20BITS, 1);337phy_set_rf_reg(priv, RF_PATH_A, 0xB4, BIT(14), 1);338phy_set_rf_reg(priv, RF_PATH_A, 0x18, BIT(15), 1);339delay_ms(1);340phy_set_rf_reg(priv, RF_PATH_A, 0xB4, BIT(14), 0);341phy_set_rf_reg(priv, RF_PATH_A, 0x18, MASK20BITS, reg0x18);342RTL_W8(0x522, 0x0);343priv->pshare->thermal_value_lck = thermal_value;344}345}346347/* update thermal meter value */348priv->pshare->thermal_value = thermal_value;349for (i = 0 ; i < rf ; i++)350priv->pshare->OFDM_index[i] = OFDM_index[i];351priv->pshare->CCK_index = CCK_index;352353RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n******** END:%s() ********\n", __FUNCTION__);354}355#endif356357#if (RTL8814B_SUPPORT == 1 || RTL8812F_SUPPORT == 1 || RTL8822C_SUPPORT == 1 || RTL8197G_SUPPORT == 1)358void359odm_txpowertracking_callback_thermal_meter_jaguar_series4(void *dm_void)360{361struct dm_struct *dm = (struct dm_struct *)dm_void;362struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);363struct dm_iqk_info *iqk_info = &dm->IQK_info;364struct _hal_rf_ *rf = &dm->rf_table;365struct _halrf_tssi_data *tssi = &rf->halrf_tssi_data;366struct rtl8192cd_priv *priv = dm->priv;367struct txpwrtrack_cfg c;368369if (!(rf->rf_supportability & HAL_RF_TX_PWR_TRACK))370return;371372u8 thermal_value[MAX_RF_PATH] = {0}, delta[MAX_RF_PATH] = {0};373u8 delta_swing_table_idx_tup[DELTA_SWINGIDX_SIZE] = {0};374u8 delta_swing_table_idx_tdown[DELTA_SWINGIDX_SIZE] = {0};375u8 delta_LCK = 0, delta_IQK = 0, i = 0, j = 0, p;376u8 thermal_value_avg_count[MAX_RF_PATH] = {0};377u32 thermal_value_avg[MAX_RF_PATH] = {0};378s8 thermal_value_temp[MAX_RF_PATH] = {0};379380u8 *pwrtrk_tab_up_a = NULL;381u8 *pwrtrk_tab_down_a = NULL;382u8 *pwrtrk_tab_up_b = NULL;383u8 *pwrtrk_tab_down_b = NULL;384u8 *pwrtrk_tab_up_c = NULL;385u8 *pwrtrk_tab_down_c = NULL;386u8 *pwrtrk_tab_up_d = NULL;387u8 *pwrtrk_tab_down_d = NULL;388u8 tracking_method = MIX_MODE;389390configure_txpower_track(dm, &c);391392(*c.get_delta_swing_table)(dm,393(u8 **)&pwrtrk_tab_up_a, (u8 **)&pwrtrk_tab_down_a,394(u8 **)&pwrtrk_tab_up_b, (u8 **)&pwrtrk_tab_down_b);395396if (GET_CHIP_VER(priv) == VERSION_8814B) {397(*c.get_delta_swing_table8814only)(dm,398(u8 **)&pwrtrk_tab_up_c, (u8 **)&pwrtrk_tab_down_c,399(u8 **)&pwrtrk_tab_up_d, (u8 **)&pwrtrk_tab_down_d);400}401402cali_info->txpowertracking_callback_cnt++;403cali_info->is_txpowertracking_init = true;404405/* Initialize */406if (!dm->rf_calibrate_info.thermal_value)407dm->rf_calibrate_info.thermal_value =408priv->pmib->dot11RFEntry.thermal[RF_PATH_A];409410if (!dm->rf_calibrate_info.thermal_value_lck)411dm->rf_calibrate_info.thermal_value_lck =412priv->pmib->dot11RFEntry.thermal[RF_PATH_A];413414if (!dm->rf_calibrate_info.thermal_value_iqk)415dm->rf_calibrate_info.thermal_value_iqk =416priv->pmib->dot11RFEntry.thermal[RF_PATH_A];417418RF_DBG(dm, DBG_RF_TX_PWR_TRACK,419"===>odm_txpowertracking_callback_thermal_meter\n cali_info->bb_swing_idx_cck_base: %d, cali_info->bb_swing_idx_ofdm_base[A]: %d, cali_info->default_ofdm_index: %d\n",420cali_info->bb_swing_idx_cck_base, cali_info->bb_swing_idx_ofdm_base_path[RF_PATH_A], cali_info->default_ofdm_index);421422RF_DBG(dm, DBG_RF_TX_PWR_TRACK,423"cali_info->txpowertrack_control=%d\n", cali_info->txpowertrack_control);424425for (i = 0; i < c.rf_path_count; i++) {426RF_DBG(dm, DBG_RF_TX_PWR_TRACK,427"PGthermal[%d]=0x%x(%d)\n", i,428priv->pmib->dot11RFEntry.thermal[i],429priv->pmib->dot11RFEntry.thermal[i]);430431if (priv->pmib->dot11RFEntry.thermal[i] == 0xff ||432priv->pmib->dot11RFEntry.thermal[i] == 0x0)433return;434}435if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G)) {436for (i = 0; i < c.rf_path_count; i++)437thermal_value[i] = (u8)odm_get_rf_reg(dm, i, c.thermal_reg_addr, 0x7e); /* 0x42: RF Reg[6:1] Thermal Trim*/438} else {439for (i = 0; i < c.rf_path_count; i++) {440thermal_value[i] = (u8)odm_get_rf_reg(dm, i, c.thermal_reg_addr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */441442thermal_value_temp[i] = (s8)thermal_value[i] + phydm_get_thermal_offset(dm);443444RF_DBG(dm, DBG_RF_TX_PWR_TRACK,445"thermal_value_temp[%d](%d) = thermal_value[%d](%d) + power_time_thermal(%d)\n", i, thermal_value_temp[i], i, thermal_value[i], phydm_get_thermal_offset(dm));446447if (thermal_value_temp[i] > 63)448thermal_value[i] = 63;449else if (thermal_value_temp[i] < 0)450thermal_value[i] = 0;451else452thermal_value[i] = thermal_value_temp[i];453}454}455456for (j = 0; j < c.rf_path_count; j++) {457cali_info->thermal_value_avg_path[j][cali_info->thermal_value_avg_index_path[j]] = thermal_value[j];458cali_info->thermal_value_avg_index_path[j]++;459if (cali_info->thermal_value_avg_index_path[j] == c.average_thermal_num) /*Average times = c.average_thermal_num*/460cali_info->thermal_value_avg_index_path[j] = 0;461462463for (i = 0; i < c.average_thermal_num; i++) {464if (cali_info->thermal_value_avg_path[j][i]) {465thermal_value_avg[j] += cali_info->thermal_value_avg_path[j][i];466thermal_value_avg_count[j]++;467}468}469470if (thermal_value_avg_count[j]) { /* Calculate Average thermal_value after average enough times */471thermal_value[j] = (u8)(thermal_value_avg[j] / thermal_value_avg_count[j]);472RF_DBG(dm, DBG_RF_TX_PWR_TRACK,473"PGthermal[%d] = 0x%x(%d), AVG Thermal Meter = 0x%x(%d)\n", j,474priv->pmib->dot11RFEntry.thermal[j],475priv->pmib->dot11RFEntry.thermal[j],476thermal_value[j],477thermal_value[j]);478}479/* 4 5. Calculate delta, delta_LCK, delta_IQK. */480481/* "delta" here is used to determine whether thermal value changes or not. */482delta[j] = RTL_ABS(thermal_value[j], priv->pmib->dot11RFEntry.thermal[j]);483delta_LCK = RTL_ABS(thermal_value[RF_PATH_A], dm->rf_calibrate_info.thermal_value_lck);484delta_IQK = RTL_ABS(thermal_value[RF_PATH_A], dm->rf_calibrate_info.thermal_value_iqk);485}486487/*4 6. If necessary, do LCK.*/488for (i = 0; i < c.rf_path_count; i++)489RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "(delta[%d], delta_LCK, delta_IQK) = (%d, %d, %d)\n", i, delta[i], delta_LCK, delta_IQK);490491/* Wait sacn to do LCK by RF Jenyu*/492if( (*dm->is_scan_in_process == false) && (!iqk_info->rfk_forbidden)) {493/* Delta temperature is equal to or larger than 20 centigrade.*/494if (delta_LCK >= c.threshold_iqk) {495RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk);496cali_info->thermal_value_lck = thermal_value[RF_PATH_A];497498/*Use RTLCK, so close power tracking driver LCK*/499if ((!(dm->support_ic_type & ODM_RTL8814A)) && (!(dm->support_ic_type & ODM_RTL8822B))) {500if (c.phy_lc_calibrate)501(*c.phy_lc_calibrate)(dm);502} else503RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do not do LCK\n");504}505}506507/*3 7. If necessary, move the index of swing table to adjust Tx power.*/508#ifdef _TRACKING_TABLE_FILE509for (i = 0; i < c.rf_path_count; i++) {510if (i == RF_PATH_B) {511odm_move_memory(dm, delta_swing_table_idx_tup, pwrtrk_tab_up_b, DELTA_SWINGIDX_SIZE);512odm_move_memory(dm, delta_swing_table_idx_tdown, pwrtrk_tab_down_b, DELTA_SWINGIDX_SIZE);513} else if (i == RF_PATH_C) {514odm_move_memory(dm, delta_swing_table_idx_tup, pwrtrk_tab_up_c, DELTA_SWINGIDX_SIZE);515odm_move_memory(dm, delta_swing_table_idx_tdown, pwrtrk_tab_down_c, DELTA_SWINGIDX_SIZE);516} else if (i == RF_PATH_D) {517odm_move_memory(dm, delta_swing_table_idx_tup, pwrtrk_tab_up_d, DELTA_SWINGIDX_SIZE);518odm_move_memory(dm, delta_swing_table_idx_tdown, pwrtrk_tab_down_d, DELTA_SWINGIDX_SIZE);519} else {520odm_move_memory(dm, delta_swing_table_idx_tup, pwrtrk_tab_up_a, DELTA_SWINGIDX_SIZE);521odm_move_memory(dm, delta_swing_table_idx_tdown, pwrtrk_tab_down_a, DELTA_SWINGIDX_SIZE);522}523524cali_info->delta_power_index_last_path[i] = cali_info->delta_power_index_path[i]; /*recording poer index offset*/525delta[i] = thermal_value[i] > priv->pmib->dot11RFEntry.thermal[i] ? (thermal_value[i] - priv->pmib->dot11RFEntry.thermal[i]) : (priv->pmib->dot11RFEntry.thermal[i] - thermal_value[i]);526527if (delta[i] >= TXPWR_TRACK_TABLE_SIZE)528delta[i] = TXPWR_TRACK_TABLE_SIZE - 1;529530if (thermal_value[i] > priv->pmib->dot11RFEntry.thermal[i]) {531RF_DBG(dm, DBG_RF_TX_PWR_TRACK,532"delta_swing_table_idx_tup[%d]=%d Path=%d\n", delta[i], delta_swing_table_idx_tup[delta[i]], i);533534cali_info->delta_power_index_path[i] = delta_swing_table_idx_tup[delta[i]];535cali_info->absolute_ofdm_swing_idx[i] = delta_swing_table_idx_tup[delta[i]]; /*Record delta swing for mix mode power tracking*/536RF_DBG(dm, DBG_RF_TX_PWR_TRACK,537"******Temp is higher and cali_info->absolute_ofdm_swing_idx[%d]=%d Path=%d\n", delta[i], cali_info->absolute_ofdm_swing_idx[i], i);538} else {539RF_DBG(dm, DBG_RF_TX_PWR_TRACK,540"delta_swing_table_idx_tdown[%d]=%d Path=%d\n", delta[i], delta_swing_table_idx_tdown[delta[i]], i);541cali_info->delta_power_index_path[i] = -1 * delta_swing_table_idx_tdown[delta[i]];542cali_info->absolute_ofdm_swing_idx[i] = -1 * delta_swing_table_idx_tdown[delta[i]]; /*Record delta swing for mix mode power tracking*/543RF_DBG(dm, DBG_RF_TX_PWR_TRACK,544"******Temp is lower and cali_info->absolute_ofdm_swing_idx[%d]=%d Path=%d\n", delta[i], cali_info->absolute_ofdm_swing_idx[i], i);545}546}547548#endif549550for (p = RF_PATH_A; p < c.rf_path_count; p++) {551if (cali_info->delta_power_index_path[p] == cali_info->delta_power_index_last_path[p]) /*If Thermal value changes but lookup table value still the same*/552cali_info->power_index_offset_path[p] = 0;553else554cali_info->power_index_offset_path[p] = cali_info->delta_power_index_path[p] - cali_info->delta_power_index_last_path[p]; /*Power index diff between 2 times Power Tracking*/555}556557#if 0558if (dm->support_ic_type == ODM_RTL8814B) {559RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");560for (p = RF_PATH_A; p < c.rf_path_count; p++)561(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);562} else {563RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking BBSWING_MODE**********\n");564for (p = RF_PATH_A; p < c.rf_path_count; p++)565(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, 0);566}567#else568if (*dm->mp_mode == 1) {569if (cali_info->txpowertrack_control == 1) {570RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");571tracking_method = MIX_MODE;572} else if (cali_info->txpowertrack_control == 3) {573RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking TSSI_MODE**********\n");574tracking_method = TSSI_MODE;575}576} else {577if (dm->priv->pmib->dot11RFEntry.tssi_enable == 0) {578RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");579tracking_method = MIX_MODE;580} else if (dm->priv->pmib->dot11RFEntry.tssi_enable == 1) {581RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking TSSI_MODE**********\n");582tracking_method = TSSI_MODE;583}584}585586if (dm->support_ic_type == ODM_RTL8822C || dm->support_ic_type == ODM_RTL8812F ||587dm->support_ic_type == ODM_RTL8814B || dm->support_ic_type == ODM_RTL8197G)588for (p = RF_PATH_A; p < c.rf_path_count; p++)589(*c.odm_tx_pwr_track_set_pwr)(dm, tracking_method, p, 0);590591#endif592/* Wait sacn to do IQK by RF Jenyu*/593if ((*dm->is_scan_in_process == false) && (!iqk_info->rfk_forbidden)) {594/*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/595if (delta_IQK >= c.threshold_iqk) {596cali_info->thermal_value_iqk = thermal_value[RF_PATH_A];597RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk);598599/*if (!cali_info->is_iqk_in_progress)*/600/* (*c.do_iqk)(dm, delta_IQK, thermal_value[RF_PATH_A], 8);*/601/*RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do IQK\n");*/602603/*if (!cali_info->is_iqk_in_progress)*/604/* (*c.do_tssi_dck)(dm, true);*/605RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do TSSI DCK\n");606}607}608609RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===%s\n", __func__);610611cali_info->tx_powercount = 0;612}613#endif614615#if (RTL8197F_SUPPORT == 1 || RTL8192F_SUPPORT == 1 || RTL8822B_SUPPORT == 1 ||\616RTL8821C_SUPPORT == 1 || RTL8198F_SUPPORT == 1)617void618odm_txpowertracking_callback_thermal_meter_jaguar_series3(619void *dm_void620)621{622#if 1623struct dm_struct *dm = (struct dm_struct *)dm_void;624u8 thermal_value = 0, delta, delta_LCK, delta_IQK, channel, is_increase;625u8 thermal_value_avg_count = 0, p = 0, i = 0;626u32 thermal_value_avg = 0;627struct rtl8192cd_priv *priv = dm->priv;628struct txpwrtrack_cfg c;629struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);630struct dm_iqk_info *iqk_info = &dm->IQK_info;631struct _hal_rf_ *rf = &dm->rf_table;632/*The following tables decide the final index of OFDM/CCK swing table.*/633u8 *pwrtrk_tab_up_a = NULL, *pwrtrk_tab_down_a = NULL;634u8 *pwrtrk_tab_up_b = NULL, *pwrtrk_tab_down_b = NULL;635u8 *pwrtrk_tab_up_cck_a = NULL, *pwrtrk_tab_down_cck_a = NULL;636u8 *pwrtrk_tab_up_cck_b = NULL, *pwrtrk_tab_down_cck_b = NULL;637/*for 8814 add by Yu Chen*/638u8 *pwrtrk_tab_up_c = NULL, *pwrtrk_tab_down_c = NULL;639u8 *pwrtrk_tab_up_d = NULL, *pwrtrk_tab_down_d = NULL;640u8 *pwrtrk_tab_up_cck_c = NULL, *pwrtrk_tab_down_cck_c = NULL;641u8 *pwrtrk_tab_up_cck_d = NULL, *pwrtrk_tab_down_cck_d = NULL;642s8 thermal_value_temp = 0;643644#ifdef MP_TEST645if ((OPMODE & WIFI_MP_STATE) || *(dm->mp_mode)) {646channel = priv->pshare->working_channel;647if (priv->pshare->mp_txpwr_tracking == false)648return;649} else650#endif651{652channel = (priv->pmib->dot11RFEntry.dot11channel);653}654655configure_txpower_track(dm, &c);656657(*c.get_delta_all_swing_table)(dm,658(u8 **)&pwrtrk_tab_up_a, (u8 **)&pwrtrk_tab_down_a,659(u8 **)&pwrtrk_tab_up_b, (u8 **)&pwrtrk_tab_down_b,660(u8 **)&pwrtrk_tab_up_cck_a, (u8 **)&pwrtrk_tab_down_cck_a,661(u8 **)&pwrtrk_tab_up_cck_b, (u8 **)&pwrtrk_tab_down_cck_b);662663if (GET_CHIP_VER(priv) == VERSION_8198F) {664(*c.get_delta_all_swing_table_ex)(dm,665(u8 **)&pwrtrk_tab_up_c, (u8 **)&pwrtrk_tab_down_c,666(u8 **)&pwrtrk_tab_up_d, (u8 **)&pwrtrk_tab_down_d,667(u8 **)&pwrtrk_tab_up_cck_c, (u8 **)&pwrtrk_tab_down_cck_c,668(u8 **)&pwrtrk_tab_up_cck_d, (u8 **)&pwrtrk_tab_down_cck_d);669}670/*0x42: RF Reg[15:10] 88E*/671thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A, c.thermal_reg_addr, 0xfc00);672#ifdef THER_TRIM673if (GET_CHIP_VER(priv) == VERSION_8197F) {674RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"orig thermal_value=%d, ther_trim_val=%d\n", thermal_value, priv->pshare->rf_ft_var.ther_trim_val);675676thermal_value += priv->pshare->rf_ft_var.ther_trim_val;677678RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"after thermal trim, thermal_value=%d\n", thermal_value);679}680681if (GET_CHIP_VER(priv) == VERSION_8198F) {682thermal_value_temp = thermal_value + phydm_get_thermal_offset(dm);683684RF_DBG(dm, DBG_RF_TX_PWR_TRACK,685"thermal_value_temp(%d) = ther_value(%d) + ther_trim_ther(%d)\n",686thermal_value_temp, thermal_value, phydm_get_thermal_offset(dm));687688if (thermal_value_temp > 63)689thermal_value = 63;690else if (thermal_value_temp < 0)691thermal_value = 0;692else693thermal_value = thermal_value_temp;694}695#endif696697RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"\n\n\nCurrent Thermal = 0x%x(%d) EEPROMthermalmeter 0x%x(%d)\n"698, thermal_value, thermal_value, priv->pmib->dot11RFEntry.ther, priv->pmib->dot11RFEntry.ther);699700/* Initialize */701if (!dm->rf_calibrate_info.thermal_value)702dm->rf_calibrate_info.thermal_value = priv->pmib->dot11RFEntry.ther;703704if (!dm->rf_calibrate_info.thermal_value_lck)705dm->rf_calibrate_info.thermal_value_lck = priv->pmib->dot11RFEntry.ther;706707if (!dm->rf_calibrate_info.thermal_value_iqk)708dm->rf_calibrate_info.thermal_value_iqk = priv->pmib->dot11RFEntry.ther;709710/* calculate average thermal meter */711dm->rf_calibrate_info.thermal_value_avg[dm->rf_calibrate_info.thermal_value_avg_index] = thermal_value;712dm->rf_calibrate_info.thermal_value_avg_index++;713714if (dm->rf_calibrate_info.thermal_value_avg_index == c.average_thermal_num) /*Average times = c.average_thermal_num*/715dm->rf_calibrate_info.thermal_value_avg_index = 0;716717for (i = 0; i < c.average_thermal_num; i++) {718if (dm->rf_calibrate_info.thermal_value_avg[i]) {719thermal_value_avg += dm->rf_calibrate_info.thermal_value_avg[i];720thermal_value_avg_count++;721}722}723724if (thermal_value_avg_count) {/*Calculate Average thermal_value after average enough times*/725RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"thermal_value_avg=0x%x(%d) thermal_value_avg_count = %d\n"726, thermal_value_avg, thermal_value_avg, thermal_value_avg_count);727728thermal_value = (u8)(thermal_value_avg / thermal_value_avg_count);729730RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"AVG Thermal Meter = 0x%X(%d), EEPROMthermalmeter = 0x%X(%d)\n", thermal_value, thermal_value, priv->pmib->dot11RFEntry.ther, priv->pmib->dot11RFEntry.ther);731}732733/*4 Calculate delta, delta_LCK, delta_IQK.*/734delta = RTL_ABS(thermal_value, priv->pmib->dot11RFEntry.ther);735delta_LCK = RTL_ABS(thermal_value, dm->rf_calibrate_info.thermal_value_lck);736delta_IQK = RTL_ABS(thermal_value, dm->rf_calibrate_info.thermal_value_iqk);737is_increase = ((thermal_value < priv->pmib->dot11RFEntry.ther) ? 0 : 1);738739if (delta > 29) { /* power track table index(thermal diff.) upper bound*/740RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta(%d) > 29, set delta to 29\n", delta);741delta = 29;742}743744RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK);745746/*4 if necessary, do LCK.*/747if ((delta_LCK >= c.threshold_iqk) && (!iqk_info->rfk_forbidden)) {748RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk);749dm->rf_calibrate_info.thermal_value_lck = thermal_value;750#if (RTL8822B_SUPPORT != 1)751if (!(dm->support_ic_type & ODM_RTL8822B)) {752if (c.phy_lc_calibrate)753(*c.phy_lc_calibrate)(dm);754}755#endif756}757758if (!priv->pmib->dot11RFEntry.ther) /*Don't do power tracking since no calibrated thermal value*/759return;760761/*4 Do Power Tracking*/762763if (thermal_value != dm->rf_calibrate_info.thermal_value) {764RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******** START POWER TRACKING ********\n");765RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n",766thermal_value, dm->rf_calibrate_info.thermal_value, priv->pmib->dot11RFEntry.ther);767768#ifdef _TRACKING_TABLE_FILE769if (priv->pshare->rf_ft_var.pwr_track_file) {770if (is_increase) { /*thermal is higher than base*/771for (p = RF_PATH_A; p < c.rf_path_count; p++) {772switch (p) {773case RF_PATH_B:774RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_up_b[%d] = %d pwrtrk_tab_up_cck_b[%d] = %d\n", delta, pwrtrk_tab_up_b[delta], delta, pwrtrk_tab_up_cck_b[delta]);775cali_info->absolute_ofdm_swing_idx[p] = pwrtrk_tab_up_b[delta];776cali_info->absolute_cck_swing_idx[p] = pwrtrk_tab_up_cck_b[delta];777RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and pRF->absolute_ofdm_swing_idx[RF_PATH_B] = %d pRF->absolute_cck_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);778break;779780case RF_PATH_C:781RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_up_c[%d] = %d pwrtrk_tab_up_cck_c[%d] = %d\n", delta, pwrtrk_tab_up_c[delta], delta, pwrtrk_tab_up_cck_c[delta]);782cali_info->absolute_ofdm_swing_idx[p] = pwrtrk_tab_up_c[delta];783cali_info->absolute_cck_swing_idx[p] = pwrtrk_tab_up_cck_c[delta];784RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and pRF->absolute_ofdm_swing_idx[RF_PATH_C] = %d pRF->absolute_cck_swing_idx[RF_PATH_C] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);785break;786787case RF_PATH_D:788RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_up_d[%d] = %d pwrtrk_tab_up_cck_d[%d] = %d\n", delta, pwrtrk_tab_up_d[delta], delta, pwrtrk_tab_up_cck_d[delta]);789cali_info->absolute_ofdm_swing_idx[p] = pwrtrk_tab_up_d[delta];790cali_info->absolute_cck_swing_idx[p] = pwrtrk_tab_up_cck_d[delta];791RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and pRF->absolute_ofdm_swing_idx[RF_PATH_D] = %d pRF->absolute_cck_swing_idx[RF_PATH_D] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);792break;793default:794RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_up_a[%d] = %d pwrtrk_tab_up_cck_a[%d] = %d\n", delta, pwrtrk_tab_up_a[delta], delta, pwrtrk_tab_up_cck_a[delta]);795cali_info->absolute_ofdm_swing_idx[p] = pwrtrk_tab_up_a[delta];796cali_info->absolute_cck_swing_idx[p] = pwrtrk_tab_up_cck_a[delta];797RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and pRF->absolute_ofdm_swing_idx[RF_PATH_A] = %d pRF->absolute_cck_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);798break;799}800}801} else { /* thermal is lower than base*/802for (p = RF_PATH_A; p < c.rf_path_count; p++) {803switch (p) {804case RF_PATH_B:805RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_down_b[%d] = %d pwrtrk_tab_down_cck_b[%d] = %d\n", delta, pwrtrk_tab_down_b[delta], delta, pwrtrk_tab_down_cck_b[delta]);806cali_info->absolute_ofdm_swing_idx[p] = -1 * pwrtrk_tab_down_b[delta];807cali_info->absolute_cck_swing_idx[p] = -1 * pwrtrk_tab_down_cck_b[delta];808RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and pRF->absolute_ofdm_swing_idx[RF_PATH_B] = %d pRF->absolute_cck_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);809break;810811case RF_PATH_C:812RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_down_c[%d] = %d pwrtrk_tab_down_cck_c[%d] = %d\n", delta, pwrtrk_tab_down_c[delta], delta, pwrtrk_tab_down_cck_c[delta]);813cali_info->absolute_ofdm_swing_idx[p] = -1 * pwrtrk_tab_down_c[delta];814cali_info->absolute_cck_swing_idx[p] = -1 * pwrtrk_tab_down_cck_c[delta];815RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and pRF->absolute_ofdm_swing_idx[RF_PATH_C] = %d pRF->absolute_cck_swing_idx[RF_PATH_C] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);816break;817818case RF_PATH_D:819RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_down_d[%d] = %d pwrtrk_tab_down_cck_d[%d] = %d\n", delta, pwrtrk_tab_down_d[delta], delta, pwrtrk_tab_down_cck_d[delta]);820cali_info->absolute_ofdm_swing_idx[p] = -1 * pwrtrk_tab_down_d[delta];821cali_info->absolute_cck_swing_idx[p] = -1 * pwrtrk_tab_down_cck_d[delta];822RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and pRF->absolute_ofdm_swing_idx[RF_PATH_D] = %d pRF->absolute_cck_swing_idx[RF_PATH_D] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);823break;824825default:826RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"pwrtrk_tab_down_a[%d] = %d pwrtrk_tab_down_cck_a[%d] = %d\n", delta, pwrtrk_tab_down_a[delta], delta, pwrtrk_tab_down_cck_a[delta]);827cali_info->absolute_ofdm_swing_idx[p] = -1 * pwrtrk_tab_down_a[delta];828cali_info->absolute_cck_swing_idx[p] = -1 * pwrtrk_tab_down_cck_a[delta];829RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and pRF->absolute_ofdm_swing_idx[RF_PATH_A] = %d pRF->absolute_cck_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p], cali_info->absolute_cck_swing_idx[p]);830break;831}832}833}834835if (is_increase) {836RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> increse power --->\n");837if (GET_CHIP_VER(priv) == VERSION_8197F) {838for (p = RF_PATH_A; p < c.rf_path_count; p++)839(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, 0);840//} else if (GET_CHIP_VER(priv) == VERSION_8192F) {841// for (p = RF_PATH_A; p < c.rf_path_count; p++)842// (*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);843} else if (GET_CHIP_VER(priv) == VERSION_8822B) {844for (p = RF_PATH_A; p < c.rf_path_count; p++)845(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);846} else if (GET_CHIP_VER(priv) == VERSION_8821C) {847for (p = RF_PATH_A; p < c.rf_path_count; p++)848(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);849} else if (GET_CHIP_VER(priv) == VERSION_8198F) {850for (p = RF_PATH_A; p < c.rf_path_count; p++)851(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);852}853} else {854RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> decrese power --->\n");855if (GET_CHIP_VER(priv) == VERSION_8197F) {856for (p = RF_PATH_A; p < c.rf_path_count; p++)857(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, 0);858//} else if (GET_CHIP_VER(priv) == VERSION_8192F) {859// for (p = RF_PATH_A; p < c.rf_path_count; p++)860// (*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);861} else if (GET_CHIP_VER(priv) == VERSION_8822B) {862for (p = RF_PATH_A; p < c.rf_path_count; p++)863(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);864} else if (GET_CHIP_VER(priv) == VERSION_8821C) {865for (p = RF_PATH_A; p < c.rf_path_count; p++)866(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);867} else if (GET_CHIP_VER(priv) == VERSION_8198F) {868for (p = RF_PATH_A; p < c.rf_path_count; p++)869(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);870}871}872}873#endif874875if (GET_CHIP_VER(priv) != VERSION_8198F) {876if ((delta_IQK >= c.threshold_iqk) && (!iqk_info->rfk_forbidden)) {877RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk);878dm->rf_calibrate_info.thermal_value_iqk = thermal_value;879if (!(dm->support_ic_type & ODM_RTL8197F)) {880if (c.do_iqk)881(*c.do_iqk)(dm, false, thermal_value, 0);882}883}884}885886RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n******** END:%s() ********\n\n", __func__);887/*update thermal meter value*/888dm->rf_calibrate_info.thermal_value = thermal_value;889890}891892#endif893}894#endif895896/*#if (RTL8814A_SUPPORT == 1)*/897#if (RTL8814A_SUPPORT == 1)898899void900odm_txpowertracking_callback_thermal_meter_jaguar_series2(901void *dm_void902)903{904struct dm_struct *dm = (struct dm_struct *)dm_void;905u8 thermal_value = 0, delta, delta_LCK, delta_IQK, channel, is_increase;906u8 thermal_value_avg_count = 0, p = 0, i = 0;907u32 thermal_value_avg = 0, reg0x18;908u32 bb_swing_reg[4] = {REG_A_TX_SCALE_JAGUAR, REG_B_TX_SCALE_JAGUAR, REG_C_TX_SCALE_JAGUAR2, REG_D_TX_SCALE_JAGUAR2};909s32 ele_D;910u32 bb_swing_idx;911struct rtl8192cd_priv *priv = dm->priv;912struct txpwrtrack_cfg c;913boolean is_tssi_enable = false;914struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);915struct dm_iqk_info *iqk_info = &dm->IQK_info;916917/* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */918u8 *delta_swing_table_idx_tup_a = NULL, *delta_swing_table_idx_tdown_a = NULL;919u8 *delta_swing_table_idx_tup_b = NULL, *delta_swing_table_idx_tdown_b = NULL;920/* for 8814 add by Yu Chen */921u8 *delta_swing_table_idx_tup_c = NULL, *delta_swing_table_idx_tdown_c = NULL;922u8 *delta_swing_table_idx_tup_d = NULL, *delta_swing_table_idx_tdown_d = NULL;923924#ifdef MP_TEST925if ((OPMODE & WIFI_MP_STATE) || *(dm->mp_mode)) {926channel = priv->pshare->working_channel;927if (priv->pshare->mp_txpwr_tracking == false)928return;929} else930#endif931{932channel = (priv->pmib->dot11RFEntry.dot11channel);933}934935configure_txpower_track(dm, &c);936cali_info->default_ofdm_index = priv->pshare->OFDM_index0[RF_PATH_A];937938(*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_a, (u8 **)&delta_swing_table_idx_tdown_a,939(u8 **)&delta_swing_table_idx_tup_b, (u8 **)&delta_swing_table_idx_tdown_b);940941if (dm->support_ic_type & ODM_RTL8814A) /* for 8814 path C & D */942(*c.get_delta_swing_table8814only)(dm, (u8 **)&delta_swing_table_idx_tup_c, (u8 **)&delta_swing_table_idx_tdown_c,943(u8 **)&delta_swing_table_idx_tup_d, (u8 **)&delta_swing_table_idx_tdown_d);944945thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A, c.thermal_reg_addr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */946RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"\nReadback Thermal Meter = 0x%x, pre thermal meter 0x%x, EEPROMthermalmeter 0x%x\n", thermal_value, dm->rf_calibrate_info.thermal_value, priv->pmib->dot11RFEntry.ther);947948/* Initialize */949if (!dm->rf_calibrate_info.thermal_value)950dm->rf_calibrate_info.thermal_value = priv->pmib->dot11RFEntry.ther;951952if (!dm->rf_calibrate_info.thermal_value_lck)953dm->rf_calibrate_info.thermal_value_lck = priv->pmib->dot11RFEntry.ther;954955if (!dm->rf_calibrate_info.thermal_value_iqk)956dm->rf_calibrate_info.thermal_value_iqk = priv->pmib->dot11RFEntry.ther;957958is_tssi_enable = (boolean)odm_get_rf_reg(dm, RF_PATH_A, REG_RF_TX_GAIN_OFFSET, BIT(7)); /* check TSSI enable */959960/* 4 Query OFDM BB swing default setting Bit[31:21] */961for (p = RF_PATH_A ; p < c.rf_path_count ; p++) {962ele_D = odm_get_bb_reg(dm, bb_swing_reg[p], 0xffe00000);963RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"0x%x:0x%x ([31:21] = 0x%x)\n", bb_swing_reg[p], odm_get_bb_reg(dm, bb_swing_reg[p], MASKDWORD), ele_D);964965for (bb_swing_idx = 0; bb_swing_idx < TXSCALE_TABLE_SIZE; bb_swing_idx++) {/* 4 */966if (ele_D == tx_scaling_table_jaguar[bb_swing_idx]) {967dm->rf_calibrate_info.OFDM_index[p] = (u8)bb_swing_idx;968RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"OFDM_index[%d]=%d\n", p, dm->rf_calibrate_info.OFDM_index[p]);969break;970}971}972RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "kfree_offset[%d]=%d\n", p, cali_info->kfree_offset[p]);973974}975976/* calculate average thermal meter */977dm->rf_calibrate_info.thermal_value_avg[dm->rf_calibrate_info.thermal_value_avg_index] = thermal_value;978dm->rf_calibrate_info.thermal_value_avg_index++;979if (dm->rf_calibrate_info.thermal_value_avg_index == c.average_thermal_num) /* Average times = c.average_thermal_num */980dm->rf_calibrate_info.thermal_value_avg_index = 0;981982for (i = 0; i < c.average_thermal_num; i++) {983if (dm->rf_calibrate_info.thermal_value_avg[i]) {984thermal_value_avg += dm->rf_calibrate_info.thermal_value_avg[i];985thermal_value_avg_count++;986}987}988989if (thermal_value_avg_count) { /* Calculate Average thermal_value after average enough times */990thermal_value = (u8)(thermal_value_avg / thermal_value_avg_count);991RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"AVG Thermal Meter = 0x%X, EEPROMthermalmeter = 0x%X\n", thermal_value, priv->pmib->dot11RFEntry.ther);992}993994/* 4 Calculate delta, delta_LCK, delta_IQK. */995delta = RTL_ABS(thermal_value, priv->pmib->dot11RFEntry.ther);996delta_LCK = RTL_ABS(thermal_value, dm->rf_calibrate_info.thermal_value_lck);997delta_IQK = RTL_ABS(thermal_value, dm->rf_calibrate_info.thermal_value_iqk);998is_increase = ((thermal_value < priv->pmib->dot11RFEntry.ther) ? 0 : 1);9991000/* 4 if necessary, do LCK. */1001if (!(dm->support_ic_type & ODM_RTL8821)) {1002if ((delta_LCK > c.threshold_iqk) && (!iqk_info->rfk_forbidden)) {1003RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk);1004dm->rf_calibrate_info.thermal_value_lck = thermal_value;10051006/*Use RTLCK, so close power tracking driver LCK*/1007#if (RTL8814A_SUPPORT != 1)1008if (!(dm->support_ic_type & ODM_RTL8814A)) {1009if (c.phy_lc_calibrate)1010(*c.phy_lc_calibrate)(dm);1011}1012#endif1013}1014}10151016if ((delta_IQK > c.threshold_iqk) && (!iqk_info->rfk_forbidden)) {1017panic_printk("%s(%d)\n", __FUNCTION__, __LINE__);1018RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk);1019dm->rf_calibrate_info.thermal_value_iqk = thermal_value;1020if (c.do_iqk)1021(*c.do_iqk)(dm, true, 0, 0);1022}10231024if (!priv->pmib->dot11RFEntry.ther) /*Don't do power tracking since no calibrated thermal value*/1025return;10261027/* 4 Do Power Tracking */10281029if (is_tssi_enable == true) {1030RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter PURE TSSI MODE**********\n");1031for (p = RF_PATH_A; p < c.rf_path_count; p++)1032(*c.odm_tx_pwr_track_set_pwr)(dm, TSSI_MODE, p, 0);1033} else if (thermal_value != dm->rf_calibrate_info.thermal_value) {1034RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"\n******** START POWER TRACKING ********\n");1035RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", thermal_value, dm->rf_calibrate_info.thermal_value, priv->pmib->dot11RFEntry.ther);10361037#ifdef _TRACKING_TABLE_FILE1038if (priv->pshare->rf_ft_var.pwr_track_file) {1039if (is_increase) { /* thermal is higher than base */1040for (p = RF_PATH_A; p < c.rf_path_count; p++) {1041switch (p) {1042case RF_PATH_B:1043RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tup_b[%d] = %d\n", delta, delta_swing_table_idx_tup_b[delta]);1044cali_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_b[delta]; /* Record delta swing for mix mode power tracking */1045RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and dm->absolute_ofdm_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1046break;10471048case RF_PATH_C:1049RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tup_c[%d] = %d\n", delta, delta_swing_table_idx_tup_c[delta]);1050cali_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_c[delta]; /* Record delta swing for mix mode power tracking */1051RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and dm->absolute_ofdm_swing_idx[RF_PATH_C] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1052break;10531054case RF_PATH_D:1055RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tup_d[%d] = %d\n", delta, delta_swing_table_idx_tup_d[delta]);1056cali_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_d[delta]; /* Record delta swing for mix mode power tracking */1057RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and dm->absolute_ofdm_swing_idx[RF_PATH_D] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1058break;10591060default:1061RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tup_a[%d] = %d\n", delta, delta_swing_table_idx_tup_a[delta]);1062cali_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_a[delta]; /* Record delta swing for mix mode power tracking */1063RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is higher and dm->absolute_ofdm_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1064break;1065}1066}1067} else { /* thermal is lower than base */1068for (p = RF_PATH_A; p < c.rf_path_count; p++) {1069switch (p) {1070case RF_PATH_B:1071RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tdown_b[%d] = %d\n", delta, delta_swing_table_idx_tdown_b[delta]);1072cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_b[delta]; /* Record delta swing for mix mode power tracking */1073RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and dm->absolute_ofdm_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1074break;10751076case RF_PATH_C:1077RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tdown_c[%d] = %d\n", delta, delta_swing_table_idx_tdown_c[delta]);1078cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_c[delta]; /* Record delta swing for mix mode power tracking */1079RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and dm->absolute_ofdm_swing_idx[RF_PATH_C] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1080break;10811082case RF_PATH_D:1083RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tdown_d[%d] = %d\n", delta, delta_swing_table_idx_tdown_d[delta]);1084cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_d[delta]; /* Record delta swing for mix mode power tracking */1085RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and dm->absolute_ofdm_swing_idx[RF_PATH_D] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1086break;10871088default:1089RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"delta_swing_table_idx_tdown_a[%d] = %d\n", delta, delta_swing_table_idx_tdown_a[delta]);1090cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_a[delta]; /* Record delta swing for mix mode power tracking */1091RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Temp is lower and dm->absolute_ofdm_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);1092break;1093}1094}1095}10961097if (is_increase) {1098RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> increse power --->\n");1099for (p = RF_PATH_A; p < c.rf_path_count; p++)1100(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);1101} else {1102RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> decrese power --->\n");1103for (p = RF_PATH_A; p < c.rf_path_count; p++)1104(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);1105}1106}1107#endif11081109RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n******** END:%s() ********\n", __FUNCTION__);1110/* update thermal meter value */1111dm->rf_calibrate_info.thermal_value = thermal_value;11121113}1114}1115#endif11161117#if (RTL8812A_SUPPORT == 1 || RTL8881A_SUPPORT == 1)1118void1119odm_txpowertracking_callback_thermal_meter_jaguar_series(1120void *dm_void1121)1122{1123struct dm_struct *dm = (struct dm_struct *)dm_void;1124unsigned char thermal_value = 0, delta, delta_LCK, channel, is_decrease;1125unsigned char thermal_value_avg_count = 0;1126unsigned int thermal_value_avg = 0, reg0x18;1127unsigned int bb_swing_reg[4] = {0xc1c, 0xe1c, 0x181c, 0x1a1c};1128int ele_D, value32;1129char OFDM_index[2], index;1130unsigned int i = 0, j = 0, rf_path, max_rf_path = 2, rf;1131struct rtl8192cd_priv *priv = dm->priv;1132unsigned char OFDM_min_index = 7; /* OFDM BB Swing should be less than +2.5dB, which is required by Arthur and Mimic */1133struct dm_iqk_info *iqk_info = &dm->IQK_info;113411351136#ifdef MP_TEST1137if ((OPMODE & WIFI_MP_STATE) || *(dm->mp_mode)) {1138channel = priv->pshare->working_channel;1139if (priv->pshare->mp_txpwr_tracking == false)1140return;1141} else1142#endif1143{1144channel = (priv->pmib->dot11RFEntry.dot11channel);1145}11461147#if RTL8881A_SUPPORT1148if (dm->support_ic_type == ODM_RTL8881A) {1149max_rf_path = 1;1150if ((get_bonding_type_8881A() == BOND_8881AM || get_bonding_type_8881A() == BOND_8881AN)1151&& priv->pshare->rf_ft_var.use_intpa8881A && (*dm->band_type == ODM_BAND_2_4G))1152OFDM_min_index = 6; /* intPA - upper bond set to +3 dB (base: -2 dB)ot11RFEntry.phy_band_select == PHY_BAND_2G)) */1153else1154OFDM_min_index = 10; /* OFDM BB Swing should be less than +1dB, which is required by Arthur and Mimic */1155}1156#endif115711581159thermal_value = (unsigned char)phy_query_rf_reg(priv, RF_PATH_A, 0x42, 0xfc00, 1); /* 0x42: RF Reg[15:10] 88E */1160RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", thermal_value, priv->pshare->thermal_value, priv->pmib->dot11RFEntry.ther);116111621163/* 4 Query OFDM BB swing default setting Bit[31:21] */1164for (rf_path = 0 ; rf_path < max_rf_path ; rf_path++) {1165ele_D = phy_query_bb_reg(priv, bb_swing_reg[rf_path], 0xffe00000);1166RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "0x%x:0x%x ([31:21] = 0x%x)\n", bb_swing_reg[rf_path], phy_query_bb_reg(priv, bb_swing_reg[rf_path], MASKDWORD), ele_D);1167for (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {/* 4 */1168if (ele_D == ofdm_swing_table_8812[i]) {1169OFDM_index[rf_path] = (unsigned char)i;1170RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "OFDM_index[%d]=%d\n", rf_path, OFDM_index[rf_path]);1171break;1172}1173}1174}1175#if 01176/* Query OFDM path A default setting Bit[31:21] */1177ele_D = phy_query_bb_reg(priv, 0xc1c, 0xffe00000);1178RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "0xc1c:0x%x ([31:21] = 0x%x)\n", phy_query_bb_reg(priv, 0xc1c, MASKDWORD), ele_D);1179for (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {/* 4 */1180if (ele_D == ofdm_swing_table_8812[i]) {1181OFDM_index[0] = (unsigned char)i;1182RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "OFDM_index[0]=%d\n", OFDM_index[0]);1183break;1184}1185}1186/* Query OFDM path B default setting */1187if (rf == 2) {1188ele_D = phy_query_bb_reg(priv, 0xe1c, 0xffe00000);1189RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "0xe1c:0x%x ([32:21] = 0x%x)\n", phy_query_bb_reg(priv, 0xe1c, MASKDWORD), ele_D);1190for (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {1191if (ele_D == ofdm_swing_table_8812[i]) {1192OFDM_index[1] = (unsigned char)i;1193RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "OFDM_index[1]=%d\n", OFDM_index[1]);1194break;1195}1196}1197}1198#endif1199/* Initialize */1200if (!priv->pshare->thermal_value) {1201priv->pshare->thermal_value = priv->pmib->dot11RFEntry.ther;1202priv->pshare->thermal_value_lck = thermal_value;1203}12041205/* calculate average thermal meter */1206{1207priv->pshare->thermal_value_avg_8812[priv->pshare->thermal_value_avg_index_8812] = thermal_value;1208priv->pshare->thermal_value_avg_index_8812++;1209if (priv->pshare->thermal_value_avg_index_8812 == AVG_THERMAL_NUM_8812)1210priv->pshare->thermal_value_avg_index_8812 = 0;12111212for (i = 0; i < AVG_THERMAL_NUM_8812; i++) {1213if (priv->pshare->thermal_value_avg_8812[i]) {1214thermal_value_avg += priv->pshare->thermal_value_avg_8812[i];1215thermal_value_avg_count++;1216}1217}12181219if (thermal_value_avg_count) {1220thermal_value = (unsigned char)(thermal_value_avg / thermal_value_avg_count);1221/* printk("AVG Thermal Meter = 0x%x\n", thermal_value); */1222}1223}122412251226/* 4 If necessary, do power tracking */12271228if (!priv->pmib->dot11RFEntry.ther) /*Don't do power tracking since no calibrated thermal value*/1229return;12301231if (thermal_value != priv->pshare->thermal_value) {1232RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n******** START POWER TRACKING ********\n");1233RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", thermal_value, priv->pshare->thermal_value, priv->pmib->dot11RFEntry.ther);1234delta = RTL_ABS(thermal_value, priv->pmib->dot11RFEntry.ther);1235delta_LCK = RTL_ABS(thermal_value, priv->pshare->thermal_value_lck);1236is_decrease = ((thermal_value < priv->pmib->dot11RFEntry.ther) ? 1 : 0);1237/* if (*dm->band_type == ODM_BAND_5G) */1238{1239#ifdef _TRACKING_TABLE_FILE1240if (priv->pshare->rf_ft_var.pwr_track_file) {1241for (rf_path = 0; rf_path < max_rf_path; rf_path++) {1242RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "diff: (%s)%d ==> get index from table : %d)\n", (is_decrease ? "-" : "+"), delta, get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0));1243if (is_decrease) {1244OFDM_index[rf_path] = priv->pshare->OFDM_index0[rf_path] + get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0);1245OFDM_index[rf_path] = ((OFDM_index[rf_path] > (OFDM_TABLE_SIZE_8812 - 1)) ? (OFDM_TABLE_SIZE_8812 - 1) : OFDM_index[rf_path]);1246RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> decrese power ---> new OFDM_INDEX:%d (%d + %d)\n", OFDM_index[rf_path], priv->pshare->OFDM_index0[rf_path], get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0));1247#if 0/* RTL8881A_SUPPORT */1248if (dm->support_ic_type == ODM_RTL8881A) {1249if (priv->pshare->rf_ft_var.pwrtrk_tx_agc_enable) {1250if (priv->pshare->add_tx_agc) { /* tx_agc has been added */1251add_tx_power88xx_ac(priv, 0);1252priv->pshare->add_tx_agc = 0;1253priv->pshare->add_tx_agc_index = 0;1254}1255}1256}1257#endif1258} else {12591260OFDM_index[rf_path] = priv->pshare->OFDM_index0[rf_path] - get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0);1261#if 0/* RTL8881A_SUPPORT */1262if (dm->support_ic_type == ODM_RTL8881A) {1263if (priv->pshare->rf_ft_var.pwrtrk_tx_agc_enable) {1264if (OFDM_index[i] < OFDM_min_index) {1265priv->pshare->add_tx_agc_index = (OFDM_min_index - OFDM_index[i]) / 2; /* Calculate Remnant tx_agc value, 2 index for 1 tx_agc */1266add_tx_power88xx_ac(priv, priv->pshare->add_tx_agc_index);1267priv->pshare->add_tx_agc = 1; /* add_tx_agc Flag = 1 */1268OFDM_index[i] = OFDM_min_index;1269} else {1270if (priv->pshare->add_tx_agc) { /* tx_agc been added */1271priv->pshare->add_tx_agc = 0;1272priv->pshare->add_tx_agc_index = 0;1273add_tx_power88xx_ac(priv, 0); /* minus the added TPI */1274}1275}1276}1277}1278#else1279OFDM_index[rf_path] = ((OFDM_index[rf_path] < OFDM_min_index) ? OFDM_min_index : OFDM_index[rf_path]);1280#endif1281RF_DBG(dm, DBG_RF_TX_PWR_TRACK, ">>> increse power ---> new OFDM_INDEX:%d (%d - %d)\n", OFDM_index[rf_path], priv->pshare->OFDM_index0[rf_path], get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0));1282}1283}1284}1285#endif1286/* 4 Set new BB swing index */1287for (rf_path = 0; rf_path < max_rf_path; rf_path++) {1288phy_set_bb_reg(priv, bb_swing_reg[rf_path], 0xffe00000, ofdm_swing_table_8812[(unsigned int)OFDM_index[rf_path]]);1289RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Readback 0x%x[31:21] = 0x%x, OFDM_index:%d\n", bb_swing_reg[rf_path], phy_query_bb_reg(priv, bb_swing_reg[rf_path], 0xffe00000), OFDM_index[rf_path]);1290}12911292}1293if ((delta_LCK > 8) && (!iqk_info->rfk_forbidden)) {1294RTL_W8(0x522, 0xff);1295reg0x18 = phy_query_rf_reg(priv, RF_PATH_A, 0x18, MASK20BITS, 1);1296phy_set_rf_reg(priv, RF_PATH_A, 0xB4, BIT(14), 1);1297phy_set_rf_reg(priv, RF_PATH_A, 0x18, BIT(15), 1);1298delay_ms(200); /* frequency deviation */1299phy_set_rf_reg(priv, RF_PATH_A, 0xB4, BIT(14), 0);1300phy_set_rf_reg(priv, RF_PATH_A, 0x18, MASK20BITS, reg0x18);1301#ifdef CONFIG_RTL_8812_SUPPORT1302if (GET_CHIP_VER(priv) == VERSION_8812E)1303update_bbrf_val8812(priv, priv->pmib->dot11RFEntry.dot11channel);1304#endif1305RTL_W8(0x522, 0x0);1306priv->pshare->thermal_value_lck = thermal_value;1307}1308RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n******** END:%s() ********\n", __FUNCTION__);13091310/* update thermal meter value */1311priv->pshare->thermal_value = thermal_value;1312for (rf_path = 0; rf_path < max_rf_path; rf_path++)1313priv->pshare->OFDM_index[rf_path] = OFDM_index[rf_path];1314}1315}13161317#endif131813191320void1321odm_txpowertracking_callback_thermal_meter(1322void *dm_void1323)1324{1325struct dm_struct *dm = (struct dm_struct *)dm_void;1326struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);1327struct dm_iqk_info *iqk_info = &dm->IQK_info;132813291330#if (RTL8814B_SUPPORT == 1 || RTL8812F_SUPPORT == 1 || RTL8822C_SUPPORT == 1 || RTL8197G_SUPPORT == 1)1331if (dm->support_ic_type & (ODM_RTL8814B | ODM_RTL8812F | ODM_RTL8822C | ODM_RTL8197G)) {1332odm_txpowertracking_callback_thermal_meter_jaguar_series4(dm);1333return;1334}1335#endif1336#if (RTL8197F_SUPPORT == 1 ||RTL8192F_SUPPORT == 1 || RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1 || RTL8198F_SUPPORT == 1)1337if (dm->support_ic_type == ODM_RTL8197F || dm->support_ic_type == ODM_RTL8192F || dm->support_ic_type == ODM_RTL8822B1338|| dm->support_ic_type == ODM_RTL8821C || dm->support_ic_type == ODM_RTL8198F) {1339odm_txpowertracking_callback_thermal_meter_jaguar_series3(dm);1340return;1341}1342#endif1343#if (RTL8814A_SUPPORT == 1) /*use this function to do power tracking after 8814 by YuChen*/1344if (dm->support_ic_type & ODM_RTL8814A) {1345odm_txpowertracking_callback_thermal_meter_jaguar_series2(dm);1346return;1347}1348#endif1349#if (RTL8881A_SUPPORT || RTL8812A_SUPPORT == 1)1350if (dm->support_ic_type & ODM_RTL8812 || dm->support_ic_type & ODM_RTL8881A) {1351odm_txpowertracking_callback_thermal_meter_jaguar_series(dm);1352return;1353}1354#endif13551356#if (RTL8192E_SUPPORT == 1)1357if (dm->support_ic_type == ODM_RTL8192E) {1358odm_txpowertracking_callback_thermal_meter_92e(dm);1359return;1360}1361#endif13621363#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)1364HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));1365/* PMGNT_INFO mgnt_info = &adapter->mgnt_info; */1366#endif136713681369u8 thermal_value = 0, delta, delta_LCK, delta_IQK, offset;1370u8 thermal_value_avg_count = 0;1371u32 thermal_value_avg = 0;1372/* s32 ele_A=0, ele_D, TempCCk, X, value32;1373* s32 Y, ele_C=0;1374* s8 OFDM_index[2], CCK_index=0, OFDM_index_old[2]={0,0}, CCK_index_old=0, index;1375* s8 deltaPowerIndex = 0; */1376u32 i = 0;/* , j = 0; */1377boolean is2T = false;1378/* bool bInteralPA = false; */13791380u8 OFDM_max_index = 34, rf = (is2T) ? 2 : 1; /* OFDM BB Swing should be less than +3.0dB, which is required by Arthur */1381u8 indexforchannel = 0;/*get_right_chnl_place_for_iqk(hal_data->current_channel)*/1382enum _POWER_DEC_INC { POWER_DEC, POWER_INC };13831384struct txpwrtrack_cfg c;138513861387/* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */1388s8 delta_swing_table_idx[2][index_mapping_NUM_88E] = {1389/* {{Power decreasing(lower temperature)}, {Power increasing(higher temperature)}} */1390{0, 0, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11}, {0, 0, 1, 2, 3, 4, 4, 4, 4, 5, 7, 8, 9, 9, 10}1391};1392u8 thermal_threshold[2][index_mapping_NUM_88E] = {1393/* {{Power decreasing(lower temperature)}, {Power increasing(higher temperature)}} */1394{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 27}, {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 25, 25, 25}1395};13961397#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1398struct rtl8192cd_priv *priv = dm->priv;1399#endif14001401/* 4 2. Initilization ( 7 steps in total ) */14021403configure_txpower_track(dm, &c);14041405dm->rf_calibrate_info.txpowertracking_callback_cnt++; /* cosa add for debug */1406dm->rf_calibrate_info.is_txpowertracking_init = true;14071408#if (MP_DRIVER == 1)1409dm->rf_calibrate_info.txpowertrack_control = hal_data->txpowertrack_control; /* <Kordan> We should keep updating the control variable according to HalData.1410* <Kordan> rf_calibrate_info.rega24 will be initialized when ODM HW configuring, but MP configures with para files. */1411dm->rf_calibrate_info.rega24 = 0x090e1317;1412#endif14131414#if (DM_ODM_SUPPORT_TYPE == ODM_AP) && defined(MP_TEST)1415if ((OPMODE & WIFI_MP_STATE) || *(dm->mp_mode)) {1416if (dm->priv->pshare->mp_txpwr_tracking == false)1417return;1418}1419#endif1420RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "===>odm_txpowertracking_callback_thermal_meter_8188e, dm->bb_swing_idx_cck_base: %d, dm->bb_swing_idx_ofdm_base: %d\n", cali_info->bb_swing_idx_cck_base, cali_info->bb_swing_idx_ofdm_base);1421/*1422if (!dm->rf_calibrate_info.tm_trigger) {1423odm_set_rf_reg(dm, RF_PATH_A, c.thermal_reg_addr, BIT(17) | BIT(16), 0x3);1424dm->rf_calibrate_info.tm_trigger = 1;1425return;1426}1427*/1428thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A, c.thermal_reg_addr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */1429#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)1430if (!thermal_value || !dm->rf_calibrate_info.txpowertrack_control)1431#else1432if (!dm->rf_calibrate_info.txpowertrack_control)1433#endif1434return;14351436/* 4 3. Initialize ThermalValues of rf_calibrate_info */14371438if (!dm->rf_calibrate_info.thermal_value) {1439dm->rf_calibrate_info.thermal_value_lck = thermal_value;1440dm->rf_calibrate_info.thermal_value_iqk = thermal_value;1441}14421443if (dm->rf_calibrate_info.is_reloadtxpowerindex)1444RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "reload ofdm index for band switch\n");14451446/* 4 4. Calculate average thermal meter */14471448dm->rf_calibrate_info.thermal_value_avg[dm->rf_calibrate_info.thermal_value_avg_index] = thermal_value;1449dm->rf_calibrate_info.thermal_value_avg_index++;1450if (dm->rf_calibrate_info.thermal_value_avg_index == c.average_thermal_num)1451dm->rf_calibrate_info.thermal_value_avg_index = 0;14521453for (i = 0; i < c.average_thermal_num; i++) {1454if (dm->rf_calibrate_info.thermal_value_avg[i]) {1455thermal_value_avg += dm->rf_calibrate_info.thermal_value_avg[i];1456thermal_value_avg_count++;1457}1458}14591460if (thermal_value_avg_count) {1461/* Give the new thermo value a weighting */1462thermal_value_avg += (thermal_value * 4);14631464thermal_value = (u8)(thermal_value_avg / (thermal_value_avg_count + 4));1465cali_info->thermal_value_delta = thermal_value - priv->pmib->dot11RFEntry.ther;1466RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "AVG Thermal Meter = 0x%x\n", thermal_value);1467}14681469/* 4 5. Calculate delta, delta_LCK, delta_IQK. */14701471delta = (thermal_value > dm->rf_calibrate_info.thermal_value) ? (thermal_value - dm->rf_calibrate_info.thermal_value) : (dm->rf_calibrate_info.thermal_value - thermal_value);1472delta_LCK = (thermal_value > dm->rf_calibrate_info.thermal_value_lck) ? (thermal_value - dm->rf_calibrate_info.thermal_value_lck) : (dm->rf_calibrate_info.thermal_value_lck - thermal_value);1473delta_IQK = (thermal_value > dm->rf_calibrate_info.thermal_value_iqk) ? (thermal_value - dm->rf_calibrate_info.thermal_value_iqk) : (dm->rf_calibrate_info.thermal_value_iqk - thermal_value);14741475/* 4 6. If necessary, do LCK. */1476if (!(dm->support_ic_type & ODM_RTL8821)) {1477/*if((delta_LCK > hal_data->delta_lck) && (hal_data->delta_lck != 0))*/1478if ((delta_LCK >= c.threshold_iqk) && (!iqk_info->rfk_forbidden)) {1479/*Delta temperature is equal to or larger than 20 centigrade.*/1480dm->rf_calibrate_info.thermal_value_lck = thermal_value;1481(*c.phy_lc_calibrate)(dm);1482}1483}14841485/* 3 7. If necessary, move the index of swing table to adjust Tx power. */14861487if (delta > 0 && dm->rf_calibrate_info.txpowertrack_control) {14881489delta = (thermal_value > dm->priv->pmib->dot11RFEntry.ther) ? (thermal_value - dm->priv->pmib->dot11RFEntry.ther) : (dm->priv->pmib->dot11RFEntry.ther - thermal_value);14901491/* 4 7.1 The Final Power index = BaseIndex + power_index_offset */14921493if (thermal_value > dm->priv->pmib->dot11RFEntry.ther) {1494CALCULATE_SWINGTALBE_OFFSET(offset, POWER_INC, index_mapping_NUM_88E, delta);1495dm->rf_calibrate_info.delta_power_index_last = dm->rf_calibrate_info.delta_power_index;1496dm->rf_calibrate_info.delta_power_index = delta_swing_table_idx[POWER_INC][offset];14971498} else {14991500CALCULATE_SWINGTALBE_OFFSET(offset, POWER_DEC, index_mapping_NUM_88E, delta);1501dm->rf_calibrate_info.delta_power_index_last = dm->rf_calibrate_info.delta_power_index;1502dm->rf_calibrate_info.delta_power_index = (-1) * delta_swing_table_idx[POWER_DEC][offset];1503}15041505if (dm->rf_calibrate_info.delta_power_index == dm->rf_calibrate_info.delta_power_index_last)1506dm->rf_calibrate_info.power_index_offset = 0;1507else1508dm->rf_calibrate_info.power_index_offset = dm->rf_calibrate_info.delta_power_index - dm->rf_calibrate_info.delta_power_index_last;15091510for (i = 0; i < rf; i++)1511dm->rf_calibrate_info.OFDM_index[i] = cali_info->bb_swing_idx_ofdm_base + dm->rf_calibrate_info.power_index_offset;1512dm->rf_calibrate_info.CCK_index = cali_info->bb_swing_idx_cck_base + dm->rf_calibrate_info.power_index_offset;15131514cali_info->bb_swing_idx_cck = dm->rf_calibrate_info.CCK_index;1515cali_info->bb_swing_idx_ofdm[RF_PATH_A] = dm->rf_calibrate_info.OFDM_index[RF_PATH_A];15161517RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "The 'CCK' final index(%d) = BaseIndex(%d) + power_index_offset(%d)\n", cali_info->bb_swing_idx_cck, cali_info->bb_swing_idx_cck_base, dm->rf_calibrate_info.power_index_offset);1518RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "The 'OFDM' final index(%d) = BaseIndex(%d) + power_index_offset(%d)\n", cali_info->bb_swing_idx_ofdm[RF_PATH_A], cali_info->bb_swing_idx_ofdm_base, dm->rf_calibrate_info.power_index_offset);15191520/* 4 7.1 Handle boundary conditions of index. */152115221523for (i = 0; i < rf; i++) {1524if (dm->rf_calibrate_info.OFDM_index[i] > OFDM_max_index)1525dm->rf_calibrate_info.OFDM_index[i] = OFDM_max_index;1526else if (dm->rf_calibrate_info.OFDM_index[i] < 0)1527dm->rf_calibrate_info.OFDM_index[i] = 0;1528}15291530if (dm->rf_calibrate_info.CCK_index > c.swing_table_size_cck - 1)1531dm->rf_calibrate_info.CCK_index = c.swing_table_size_cck - 1;1532else if (dm->rf_calibrate_info.CCK_index < 0)1533dm->rf_calibrate_info.CCK_index = 0;1534} else {1535RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"The thermal meter is unchanged or TxPowerTracking OFF: thermal_value: %d, dm->rf_calibrate_info.thermal_value: %d)\n", thermal_value, dm->rf_calibrate_info.thermal_value);1536dm->rf_calibrate_info.power_index_offset = 0;1537}1538RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TxPowerTracking: [CCK] Swing Current index: %d, Swing base index: %d\n", dm->rf_calibrate_info.CCK_index, cali_info->bb_swing_idx_cck_base);15391540RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TxPowerTracking: [OFDM] Swing Current index: %d, Swing base index: %d\n", dm->rf_calibrate_info.OFDM_index[RF_PATH_A], cali_info->bb_swing_idx_ofdm_base);15411542if (dm->rf_calibrate_info.power_index_offset != 0 && dm->rf_calibrate_info.txpowertrack_control) {1543/* 4 7.2 Configure the Swing Table to adjust Tx Power. */15441545dm->rf_calibrate_info.is_tx_power_changed = true; /* Always true after Tx Power is adjusted by power tracking. */1546/* */1547/* 2012/04/23 MH According to Luke's suggestion, we can not write BB digital */1548/* to increase TX power. Otherwise, EVM will be bad. */1549/* */1550/* 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. */1551if (thermal_value > dm->rf_calibrate_info.thermal_value) {1552/* RF_DBG(dm,DBG_RF_TX_PWR_TRACK, */1553/* "Temperature Increasing: delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", */1554/* dm->rf_calibrate_info.power_index_offset, delta, thermal_value, hal_data->eeprom_thermal_meter, dm->rf_calibrate_info.thermal_value); */1555} else if (thermal_value < dm->rf_calibrate_info.thermal_value) { /* Low temperature */1556/* RF_DBG(dm,DBG_RF_TX_PWR_TRACK, */1557/* "Temperature Decreasing: delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", */1558/* dm->rf_calibrate_info.power_index_offset, delta, thermal_value, hal_data->eeprom_thermal_meter, dm->rf_calibrate_info.thermal_value); */1559}1560if (thermal_value > dm->priv->pmib->dot11RFEntry.ther)1561{1562/* RF_DBG(dm,DBG_RF_TX_PWR_TRACK,"Temperature(%d) hugher than PG value(%d), increases the power by tx_agc\n", thermal_value, hal_data->eeprom_thermal_meter); */1563(*c.odm_tx_pwr_track_set_pwr)(dm, TXAGC, 0, 0);1564} else {1565/* RF_DBG(dm,DBG_RF_TX_PWR_TRACK,"Temperature(%d) lower than PG value(%d), increases the power by tx_agc\n", thermal_value, hal_data->eeprom_thermal_meter); */1566(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, RF_PATH_A, indexforchannel);1567if (is2T)1568(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, RF_PATH_B, indexforchannel);1569}15701571cali_info->bb_swing_idx_cck_base = cali_info->bb_swing_idx_cck;1572cali_info->bb_swing_idx_ofdm_base = cali_info->bb_swing_idx_ofdm[RF_PATH_A];1573dm->rf_calibrate_info.thermal_value = thermal_value;15741575}15761577RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===dm_TXPowerTrackingCallback_ThermalMeter_8188E\n");15781579dm->rf_calibrate_info.tx_powercount = 0;1580}15811582/* 3============================================================1583* 3 IQ Calibration1584* 3============================================================ */15851586void1587odm_reset_iqk_result(1588void *dm_void1589)1590{1591return;1592}1593#if 1/* !(DM_ODM_SUPPORT_TYPE & ODM_AP) */1594u8 odm_get_right_chnl_place_for_iqk(u8 chnl)1595{1596u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {15971, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 149, 151, 153, 155, 157, 159, 161, 163, 1651598};1599u8 place = chnl;160016011602if (chnl > 14) {1603for (place = 14; place < sizeof(channel_all); place++) {1604if (channel_all[place] == chnl)1605return place - 13;1606}1607}1608return 0;16091610}1611#endif16121613void1614odm_iq_calibrate(1615struct dm_struct *dm1616)1617{1618struct dm_iqk_info *iqk_info = &dm->IQK_info;16191620if ((dm->is_linked) && (!iqk_info->rfk_forbidden)) {1621if ((*dm->channel != dm->pre_channel) && (!*dm->is_scan_in_process)) {1622dm->pre_channel = *dm->channel;1623dm->linked_interval = 0;1624}16251626if (dm->linked_interval < 3)1627dm->linked_interval++;16281629if (dm->linked_interval == 2)1630halrf_iqk_trigger(dm, false);1631} else1632dm->linked_interval = 0;16331634}16351636void phydm_rf_init(void *dm_void)1637{1638struct dm_struct *dm = (struct dm_struct *)dm_void;1639odm_txpowertracking_init(dm);16401641#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))1642#if (RTL8814A_SUPPORT == 1)1643if (dm->support_ic_type & ODM_RTL8814A)1644phy_iq_calibrate_8814a_init(dm);1645#endif1646#endif16471648}16491650void phydm_rf_watchdog(void *dm_void)1651{1652struct dm_struct *dm = (struct dm_struct *)dm_void;16531654odm_txpowertracking_check(dm);1655#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1656if (dm->support_ic_type & ODM_IC_11AC_SERIES)1657odm_iq_calibrate(dm);1658#endif1659}166016611662