Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halphyrf_ce.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* The full GNU General Public License is included in this distribution in the14* file called LICENSE.15*16* Contact Information:17* wlanfae <[email protected]>18* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,19* Hsinchu 300, Taiwan.20*21* Larry Finger <[email protected]>22*23*****************************************************************************/2425#include "mp_precomp.h"26#include "phydm_precomp.h"2728#define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _delta_thermal)\29do { \30u32 __offset = (u32)_offset; \31u32 __size = (u32)_size; \32for (__offset = 0; __offset < __size; __offset++) { \33if (_delta_thermal < \34thermal_threshold[_direction][__offset]) { \35if (__offset != 0) \36__offset--; \37break; \38} \39} \40if (__offset >= __size) \41__offset = __size - 1; \42} while (0)4344void configure_txpower_track(void *dm_void, struct txpwrtrack_cfg *config)45{46struct dm_struct *dm = (struct dm_struct *)dm_void;4748#if RTL8192E_SUPPORT49if (dm->support_ic_type == ODM_RTL8192E)50configure_txpower_track_8192e(config);51#endif52#if RTL8821A_SUPPORT53if (dm->support_ic_type == ODM_RTL8821)54configure_txpower_track_8821a(config);55#endif56#if RTL8812A_SUPPORT57if (dm->support_ic_type == ODM_RTL8812)58configure_txpower_track_8812a(config);59#endif60#if RTL8188E_SUPPORT61if (dm->support_ic_type == ODM_RTL8188E)62configure_txpower_track_8188e(config);63#endif6465#if RTL8723B_SUPPORT66if (dm->support_ic_type == ODM_RTL8723B)67configure_txpower_track_8723b(config);68#endif6970#if RTL8814A_SUPPORT71if (dm->support_ic_type == ODM_RTL8814A)72configure_txpower_track_8814a(config);73#endif7475#if RTL8703B_SUPPORT76if (dm->support_ic_type == ODM_RTL8703B)77configure_txpower_track_8703b(config);78#endif7980#if RTL8188F_SUPPORT81if (dm->support_ic_type == ODM_RTL8188F)82configure_txpower_track_8188f(config);83#endif84#if RTL8723D_SUPPORT85if (dm->support_ic_type == ODM_RTL8723D)86configure_txpower_track_8723d(config);87#endif88/*@ JJ ADD 20161014 */89#if RTL8710B_SUPPORT90if (dm->support_ic_type == ODM_RTL8710B)91configure_txpower_track_8710b(config);92#endif93#if RTL8822B_SUPPORT94if (dm->support_ic_type == ODM_RTL8822B)95configure_txpower_track_8822b(config);96#endif97#if RTL8821C_SUPPORT98if (dm->support_ic_type == ODM_RTL8821C)99configure_txpower_track_8821c(config);100#endif101102#if RTL8192F_SUPPORT103if (dm->support_ic_type == ODM_RTL8192F)104configure_txpower_track_8192f(config);105#endif106107#if RTL8822C_SUPPORT108if (dm->support_ic_type == ODM_RTL8822C)109configure_txpower_track_8822c(config);110#endif111112#if RTL8814B_SUPPORT113if (dm->support_ic_type == ODM_RTL8814B)114configure_txpower_track_8814b(config);115#endif116117118}119120/*@ **********************************************************************121* <20121113, Kordan> This function should be called when tx_agc changed.122* Otherwise the previous compensation is gone, because we record the123* delta of temperature between two TxPowerTracking watch dogs.124*125* NOTE: If Tx BB swing or Tx scaling is varified during run-time, still126* need to call this function.127* **********************************************************************128*/129void odm_clear_txpowertracking_state(void *dm_void)130{131struct dm_struct *dm = (struct dm_struct *)dm_void;132struct _hal_rf_ *rf = &dm->rf_table;133u8 p = 0;134struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;135136cali_info->bb_swing_idx_cck_base = cali_info->default_cck_index;137cali_info->bb_swing_idx_cck = cali_info->default_cck_index;138dm->rf_calibrate_info.CCK_index = 0;139140for (p = RF_PATH_A; p < MAX_RF_PATH; ++p) {141cali_info->bb_swing_idx_ofdm_base[p]142= cali_info->default_ofdm_index;143cali_info->bb_swing_idx_ofdm[p] = cali_info->default_ofdm_index;144cali_info->OFDM_index[p] = cali_info->default_ofdm_index;145146cali_info->power_index_offset[p] = 0;147cali_info->delta_power_index[p] = 0;148cali_info->delta_power_index_last[p] = 0;149150/* Initial Mix mode power tracking*/151cali_info->absolute_ofdm_swing_idx[p] = 0;152cali_info->remnant_ofdm_swing_idx[p] = 0;153cali_info->kfree_offset[p] = 0;154}155/* Initial Mix mode power tracking*/156cali_info->modify_tx_agc_flag_path_a = false;157cali_info->modify_tx_agc_flag_path_b = false;158cali_info->modify_tx_agc_flag_path_c = false;159cali_info->modify_tx_agc_flag_path_d = false;160cali_info->remnant_cck_swing_idx = 0;161cali_info->thermal_value = rf->eeprom_thermal;162cali_info->modify_tx_agc_value_cck = 0;163cali_info->modify_tx_agc_value_ofdm = 0;164}165166void odm_get_tracking_table(void *dm_void, u8 thermal_value, u8 delta)167{168struct dm_struct *dm = (struct dm_struct *)dm_void;169struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;170struct _hal_rf_ *rf = &dm->rf_table;171struct txpwrtrack_cfg c = {0};172173u8 p;174/* 4 1. TWO tables decide the final index of OFDM/CCK swing table. */175u8 *pwrtrk_tab_up_a = NULL;176u8 *pwrtrk_tab_down_a = NULL;177u8 *pwrtrk_tab_up_b = NULL;178u8 *pwrtrk_tab_down_b = NULL;179/*for 8814 add by Yu Chen*/180u8 *pwrtrk_tab_up_c = NULL;181u8 *pwrtrk_tab_down_c = NULL;182u8 *pwrtrk_tab_up_d = NULL;183u8 *pwrtrk_tab_down_d = NULL;184/*for Xtal Offset by James.Tung*/185s8 *xtal_tab_up = NULL;186s8 *xtal_tab_down = NULL;187188configure_txpower_track(dm, &c);189190(*c.get_delta_swing_table)(dm,191(u8 **)&pwrtrk_tab_up_a,192(u8 **)&pwrtrk_tab_down_a,193(u8 **)&pwrtrk_tab_up_b,194(u8 **)&pwrtrk_tab_down_b);195196if (dm->support_ic_type & ODM_RTL8814A) /*for 8814 path C & D*/197(*c.get_delta_swing_table8814only)(dm,198(u8 **)&pwrtrk_tab_up_c,199(u8 **)&pwrtrk_tab_down_c,200(u8 **)&pwrtrk_tab_up_d,201(u8 **)&pwrtrk_tab_down_d);202/*for Xtal Offset*/203if (dm->support_ic_type &204(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B | ODM_RTL8192F))205(*c.get_delta_swing_xtal_table)(dm,206(s8 **)&xtal_tab_up,207(s8 **)&xtal_tab_down);208209if (thermal_value > rf->eeprom_thermal) {210for (p = RF_PATH_A; p < c.rf_path_count; p++) {211/*recording power index offset*/212cali_info->delta_power_index_last[p] =213cali_info->delta_power_index[p];214RF_DBG(dm, DBG_RF_TX_PWR_TRACK,215"******Temp is higher******\n");216switch (p) {217case RF_PATH_B:218RF_DBG(dm, DBG_RF_TX_PWR_TRACK,219"pwrtrk_tab_up_b[%d] = %d\n", delta,220pwrtrk_tab_up_b[delta]);221222cali_info->delta_power_index[p] =223pwrtrk_tab_up_b[delta];224cali_info->absolute_ofdm_swing_idx[p] =225pwrtrk_tab_up_b[delta];226RF_DBG(dm, DBG_RF_TX_PWR_TRACK,227"absolute_ofdm_swing_idx[PATH_B] = %d\n",228cali_info->absolute_ofdm_swing_idx[p]);229break;230231case RF_PATH_C:232RF_DBG(dm, DBG_RF_TX_PWR_TRACK,233"pwrtrk_tab_up_c[%d] = %d\n", delta,234pwrtrk_tab_up_c[delta]);235236cali_info->delta_power_index[p] =237pwrtrk_tab_up_c[delta];238cali_info->absolute_ofdm_swing_idx[p] =239pwrtrk_tab_up_c[delta];240RF_DBG(dm, DBG_RF_TX_PWR_TRACK,241"absolute_ofdm_swing_idx[PATH_C] = %d\n",242cali_info->absolute_ofdm_swing_idx[p]);243break;244245case RF_PATH_D:246RF_DBG(dm, DBG_RF_TX_PWR_TRACK,247"pwrtrk_tab_up_d[%d] = %d\n", delta,248pwrtrk_tab_up_d[delta]);249250cali_info->delta_power_index[p] =251pwrtrk_tab_up_d[delta];252cali_info->absolute_ofdm_swing_idx[p] =253pwrtrk_tab_up_d[delta];254RF_DBG(dm, DBG_RF_TX_PWR_TRACK,255"absolute_ofdm_swing_idx[PATH_D] = %d\n",256cali_info->absolute_ofdm_swing_idx[p]);257break;258259default:260RF_DBG(dm, DBG_RF_TX_PWR_TRACK,261"pwrtrk_tab_up_a[%d] = %d\n", delta,262pwrtrk_tab_up_a[delta]);263264cali_info->delta_power_index[p] =265pwrtrk_tab_up_a[delta];266cali_info->absolute_ofdm_swing_idx[p] =267pwrtrk_tab_up_a[delta];268RF_DBG(dm, DBG_RF_TX_PWR_TRACK,269"absolute_ofdm_swing_idx[PATH_A] = %d\n",270cali_info->absolute_ofdm_swing_idx[p]);271break;272}273}274/* @JJ ADD 20161014 */275/*Save xtal_offset from Xtal table*/276if (dm->support_ic_type &277(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B |278ODM_RTL8192F)) {279/*recording last Xtal offset*/280cali_info->xtal_offset_last = cali_info->xtal_offset;281RF_DBG(dm, DBG_RF_TX_PWR_TRACK,282"[Xtal] xtal_tab_up[%d] = %d\n",283delta, xtal_tab_up[delta]);284cali_info->xtal_offset = xtal_tab_up[delta];285if (cali_info->xtal_offset_last != xtal_tab_up[delta])286cali_info->xtal_offset_eanble = 1;287}288} else {289for (p = RF_PATH_A; p < c.rf_path_count; p++) {290/*recording power index offset*/291cali_info->delta_power_index_last[p] =292cali_info->delta_power_index[p];293RF_DBG(dm, DBG_RF_TX_PWR_TRACK,294"******Temp is lower******\n");295switch (p) {296case RF_PATH_B:297RF_DBG(dm, DBG_RF_TX_PWR_TRACK,298"pwrtrk_tab_down_b[%d] = %d\n", delta,299pwrtrk_tab_down_b[delta]);300cali_info->delta_power_index[p] =301-1 * pwrtrk_tab_down_b[delta];302cali_info->absolute_ofdm_swing_idx[p] =303-1 * pwrtrk_tab_down_b[delta];304RF_DBG(dm, DBG_RF_TX_PWR_TRACK,305"absolute_ofdm_swing_idx[PATH_B] = %d\n",306cali_info->absolute_ofdm_swing_idx[p]);307break;308309case RF_PATH_C:310RF_DBG(dm, DBG_RF_TX_PWR_TRACK,311"pwrtrk_tab_down_c[%d] = %d\n", delta,312pwrtrk_tab_down_c[delta]);313cali_info->delta_power_index[p] =314-1 * pwrtrk_tab_down_c[delta];315cali_info->absolute_ofdm_swing_idx[p] =316-1 * pwrtrk_tab_down_c[delta];317RF_DBG(dm, DBG_RF_TX_PWR_TRACK,318"absolute_ofdm_swing_idx[PATH_C] = %d\n",319cali_info->absolute_ofdm_swing_idx[p]);320break;321322case RF_PATH_D:323RF_DBG(dm, DBG_RF_TX_PWR_TRACK,324"pwrtrk_tab_down_d[%d] = %d\n", delta,325pwrtrk_tab_down_d[delta]);326cali_info->delta_power_index[p] =327-1 * pwrtrk_tab_down_d[delta];328cali_info->absolute_ofdm_swing_idx[p] =329-1 * pwrtrk_tab_down_d[delta];330RF_DBG(dm, DBG_RF_TX_PWR_TRACK,331"absolute_ofdm_swing_idx[PATH_D] = %d\n",332cali_info->absolute_ofdm_swing_idx[p]);333break;334335default:336RF_DBG(dm, DBG_RF_TX_PWR_TRACK,337"pwrtrk_tab_down_a[%d] = %d\n", delta,338pwrtrk_tab_down_a[delta]);339cali_info->delta_power_index[p] =340-1 * pwrtrk_tab_down_a[delta];341cali_info->absolute_ofdm_swing_idx[p] =342-1 * pwrtrk_tab_down_a[delta];343RF_DBG(dm, DBG_RF_TX_PWR_TRACK,344"absolute_ofdm_swing_idx[PATH_A] = %d\n",345cali_info->absolute_ofdm_swing_idx[p]);346break;347}348}349/* @JJ ADD 20161014 */350if (dm->support_ic_type &351(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B |352ODM_RTL8192F)) {353/*recording last Xtal offset*/354cali_info->xtal_offset_last = cali_info->xtal_offset;355RF_DBG(dm, DBG_RF_TX_PWR_TRACK,356"[Xtal] xtal_tab_down[%d] = %d\n", delta,357xtal_tab_down[delta]);358/*Save xtal_offset from Xtal table*/359cali_info->xtal_offset = xtal_tab_down[delta];360if (cali_info->xtal_offset_last != xtal_tab_down[delta])361cali_info->xtal_offset_eanble = 1;362}363}364}365366void odm_pwrtrk_method(void *dm_void)367{368struct dm_struct *dm = (struct dm_struct *)dm_void;369u8 p, idxforchnl = 0;370371struct txpwrtrack_cfg c = {0};372373configure_txpower_track(dm, &c);374375if (dm->support_ic_type &376(ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8821 | ODM_RTL8812 |377ODM_RTL8723B | ODM_RTL8814A | ODM_RTL8703B | ODM_RTL8188F |378ODM_RTL8822B | ODM_RTL8723D | ODM_RTL8821C | ODM_RTL8710B |379ODM_RTL8192F)) {380RF_DBG(dm, DBG_RF_TX_PWR_TRACK,381"***Enter PwrTrk MIX_MODE***\n");382for (p = RF_PATH_A; p < c.rf_path_count; p++)383(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);384} else {385RF_DBG(dm, DBG_RF_TX_PWR_TRACK,386"***Enter PwrTrk BBSWING_MODE***\n");387for (p = RF_PATH_A; p < c.rf_path_count; p++)388(*c.odm_tx_pwr_track_set_pwr)389(dm, BBSWING, p, idxforchnl);390}391}392393#if (DM_ODM_SUPPORT_TYPE & ODM_AP)394void odm_txpowertracking_callback_thermal_meter(struct dm_struct *dm)395#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)396void odm_txpowertracking_callback_thermal_meter(void *dm_void)397#else398void odm_txpowertracking_callback_thermal_meter(void *adapter)399#endif400{401#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)402HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));403struct dm_struct *dm = &hal_data->DM_OutSrc;404#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)405struct dm_struct *dm = (struct dm_struct *)dm_void;406#endif407408struct _hal_rf_ *rf = &dm->rf_table;409struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;410struct dm_iqk_info *iqk_info = &dm->IQK_info;411412u8 thermal_value = 0, delta, delta_lck, delta_iqk, p = 0, i = 0;413u8 thermal_value_avg_count = 0;414u32 thermal_value_avg = 0, regc80, regcd0, regcd4, regab4;415416/* OFDM BB Swing should be less than +3.0dB, required by Arthur */417#if 0418u8 OFDM_min_index = 0;419#endif420#if 0421/* get_right_chnl_place_for_iqk(hal_data->current_channel) */422#endif423u8 power_tracking_type = rf->pwt_type;424s8 thermal_value_temp = 0;425426struct txpwrtrack_cfg c = {0};427428/* @4 2. Initialization ( 7 steps in total ) */429430configure_txpower_track(dm, &c);431432cali_info->txpowertracking_callback_cnt++;433cali_info->is_txpowertracking_init = true;434435RF_DBG(dm, DBG_RF_TX_PWR_TRACK,436"\n\n\n===>%s bbsw_idx_cck_base=%d\n",437__func__, cali_info->bb_swing_idx_cck_base);438439RF_DBG(dm, DBG_RF_TX_PWR_TRACK,440"bbsw_idx_ofdm_base[A]=%d default_ofdm_idx=%d\n",441cali_info->bb_swing_idx_ofdm_base[RF_PATH_A],442cali_info->default_ofdm_index);443444RF_DBG(dm, DBG_RF_TX_PWR_TRACK,445"cali_info->txpowertrack_control=%d, rf->eeprom_thermal %d\n",446cali_info->txpowertrack_control, rf->eeprom_thermal);447448/* 0x42: RF Reg[15:10] 88E */449thermal_value =450(u8)odm_get_rf_reg(dm, RF_PATH_A, c.thermal_reg_addr, 0xfc00);451452thermal_value_temp = thermal_value + phydm_get_thermal_offset(dm);453454RF_DBG(dm, DBG_RF_TX_PWR_TRACK,455"thermal_value_temp(%d) = ther_value(%d) + pwr_trim_ther(%d)\n",456thermal_value_temp, thermal_value,457phydm_get_thermal_offset(dm));458459if (thermal_value_temp > 63)460thermal_value = 63;461else if (thermal_value_temp < 0)462thermal_value = 0;463else464thermal_value = thermal_value_temp;465466/*@add log by zhao he, check c80/c94/c14/ca0 value*/467if (dm->support_ic_type &468(ODM_RTL8723D | ODM_RTL8710B)) {469regc80 = odm_get_bb_reg(dm, R_0xc80, MASKDWORD);470regcd0 = odm_get_bb_reg(dm, R_0xcd0, MASKDWORD);471regcd4 = odm_get_bb_reg(dm, R_0xcd4, MASKDWORD);472regab4 = odm_get_bb_reg(dm, R_0xab4, 0x000007FF);473RF_DBG(dm, DBG_RF_IQK,474"0xc80 = 0x%x 0xcd0 = 0x%x 0xcd4 = 0x%x 0xab4 = 0x%x\n",475regc80, regcd0, regcd4, regab4);476}477478if (!cali_info->txpowertrack_control)479return;480481if (rf->eeprom_thermal == 0xff) {482RF_DBG(dm, DBG_RF_TX_PWR_TRACK,483"no pg, hal_data->eeprom_thermal_meter = 0x%x\n",484rf->eeprom_thermal);485return;486}487488/*@4 3. Initialize ThermalValues of rf_calibrate_info*/489490if (cali_info->is_reloadtxpowerindex)491RF_DBG(dm, DBG_RF_TX_PWR_TRACK,492"reload ofdm index for band switch\n");493494/*@4 4. Calculate average thermal meter*/495496cali_info->thermal_value_avg[cali_info->thermal_value_avg_index]497= thermal_value;498499cali_info->thermal_value_avg_index++;500/*Average times = c.average_thermal_num*/501if (cali_info->thermal_value_avg_index == c.average_thermal_num)502cali_info->thermal_value_avg_index = 0;503504for (i = 0; i < c.average_thermal_num; i++) {505if (cali_info->thermal_value_avg[i]) {506thermal_value_avg += cali_info->thermal_value_avg[i];507thermal_value_avg_count++;508}509}510511/* Calculate Average thermal_value after average enough times */512if (thermal_value_avg_count) {513thermal_value =514(u8)(thermal_value_avg / thermal_value_avg_count);515cali_info->thermal_value_delta516= thermal_value - rf->eeprom_thermal;517RF_DBG(dm, DBG_RF_TX_PWR_TRACK,518"AVG Thermal Meter = 0x%X, EFUSE Thermal base = 0x%X\n",519thermal_value, rf->eeprom_thermal);520}521522/* @4 5. Calculate delta, delta_lck, delta_iqk. */523/* "delta" here is used to determine thermal value changes or not. */524if (thermal_value > cali_info->thermal_value)525delta = thermal_value - cali_info->thermal_value;526else527delta = cali_info->thermal_value - thermal_value;528529if (thermal_value > cali_info->thermal_value_lck)530delta_lck = thermal_value - cali_info->thermal_value_lck;531else532delta_lck = cali_info->thermal_value_lck - thermal_value;533534if (thermal_value > cali_info->thermal_value_iqk)535delta_iqk = thermal_value - cali_info->thermal_value_iqk;536else537delta_iqk = cali_info->thermal_value_iqk - thermal_value;538539RF_DBG(dm, DBG_RF_TX_PWR_TRACK,540"(delta, delta_lck, delta_iqk) = (%d, %d, %d)\n", delta,541delta_lck, delta_iqk);542543/*@4 6. If necessary, do LCK.*/544/* Wait sacn to do LCK by RF Jenyu*/545if (!(*dm->is_scan_in_process) && !iqk_info->rfk_forbidden) {546/* Delta temperature is equal to or larger than 20 centigrade.*/547if (delta_lck >= c.threshold_iqk) {548RF_DBG(dm, DBG_RF_TX_PWR_TRACK,549"delta_lck(%d) >= threshold_iqk(%d)\n",550delta_lck, c.threshold_iqk);551cali_info->thermal_value_lck = thermal_value;552553/*Use RTLCK, close power tracking driver LCK*/554/*8821 don't do LCK*/555if (!(dm->support_ic_type &556(ODM_RTL8821 | ODM_RTL8814A | ODM_RTL8822B)) &&557c.phy_lc_calibrate) {558(*c.phy_lc_calibrate)(dm);559RF_DBG(dm, DBG_RF_TX_PWR_TRACK,560"do pwrtrk lck\n");561}562}563}564565/*@3 7. If necessary, move the index of swing table to adjust Tx power.*/566/* "delta" here is used to record the absolute value of difference. */567if (delta > 0 && cali_info->txpowertrack_control) {568if (thermal_value > rf->eeprom_thermal)569delta = thermal_value - rf->eeprom_thermal;570else571delta = rf->eeprom_thermal - thermal_value;572573if (delta >= TXPWR_TRACK_TABLE_SIZE)574delta = TXPWR_TRACK_TABLE_SIZE - 1;575576odm_get_tracking_table(dm, thermal_value, delta);577578for (p = RF_PATH_A; p < c.rf_path_count; p++) {579RF_DBG(dm, DBG_RF_TX_PWR_TRACK,580"\n[path-%d] Calculate pwr_idx_offset\n", p);581582/*If Thermal value changes but table value is the same*/583if (cali_info->delta_power_index[p] ==584cali_info->delta_power_index_last[p])585cali_info->power_index_offset[p] = 0;586else587cali_info->power_index_offset[p] =588cali_info->delta_power_index[p] -589cali_info->delta_power_index_last[p];590591RF_DBG(dm, DBG_RF_TX_PWR_TRACK,592"path-%d pwridx_diff%d=pwr_idx%d - last_idx%d\n",593p, cali_info->power_index_offset[p],594cali_info->delta_power_index[p],595cali_info->delta_power_index_last[p]);596#if 0597598cali_info->OFDM_index[p] = cali_info->bb_swing_idx_ofdm_base[p] + cali_info->power_index_offset[p];599cali_info->CCK_index = cali_info->bb_swing_idx_cck_base + cali_info->power_index_offset[p];600601cali_info->bb_swing_idx_cck = cali_info->CCK_index;602cali_info->bb_swing_idx_ofdm[p] = cali_info->OFDM_index[p];603604/*************Print BB Swing base and index Offset*************/605606RF_DBG(dm, DBG_RF_TX_PWR_TRACK,607"The 'CCK' final index(%d) = BaseIndex(%d) + power_index_offset(%d)\n",608cali_info->bb_swing_idx_cck,609cali_info->bb_swing_idx_cck_base,610cali_info->power_index_offset[p]);611RF_DBG(dm, DBG_RF_TX_PWR_TRACK,612"The 'OFDM' final index(%d) = BaseIndex[%d](%d) + power_index_offset(%d)\n",613cali_info->bb_swing_idx_ofdm[p], p,614cali_info->bb_swing_idx_ofdm_base[p],615cali_info->power_index_offset[p]);616617/*4 7.1 Handle boundary conditions of index.*/618619if (cali_info->OFDM_index[p] > c.swing_table_size_ofdm - 1)620cali_info->OFDM_index[p] = c.swing_table_size_ofdm - 1;621else if (cali_info->OFDM_index[p] <= OFDM_min_index)622cali_info->OFDM_index[p] = OFDM_min_index;623#endif624}625#if 0626RF_DBG(dm, DBG_RF_TX_PWR_TRACK,627"\n\n========================================================================================================\n");628629if (cali_info->CCK_index > c.swing_table_size_cck - 1)630cali_info->CCK_index = c.swing_table_size_cck - 1;631else if (cali_info->CCK_index <= 0)632cali_info->CCK_index = 0;633#endif634} else {635RF_DBG(dm, DBG_RF_TX_PWR_TRACK,636"Thermal is unchanged thermal=%d last_thermal=%d\n",637thermal_value,638cali_info->thermal_value);639for (p = RF_PATH_A; p < c.rf_path_count; p++)640cali_info->power_index_offset[p] = 0;641}642643#if 0644RF_DBG(dm, DBG_RF_TX_PWR_TRACK,645"TxPowerTracking: [CCK] Swing Current index: %d, Swing base index: %d\n",646cali_info->CCK_index,647cali_info->bb_swing_idx_cck_base); /*Print Swing base & current*/648649for (p = RF_PATH_A; p < c.rf_path_count; p++) {650RF_DBG(dm, DBG_RF_TX_PWR_TRACK,651"TxPowerTracking: [OFDM] Swing Current index: %d, Swing base index[%d]: %d\n",652cali_info->OFDM_index[p], p,653cali_info->bb_swing_idx_ofdm_base[p]);654}655#endif656657if ((dm->support_ic_type & ODM_RTL8814A)) {658RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "power_tracking_type=%d\n",659power_tracking_type);660661if (power_tracking_type == 0) {662RF_DBG(dm, DBG_RF_TX_PWR_TRACK,663"***Enter PwrTrk MIX_MODE***\n");664for (p = RF_PATH_A; p < c.rf_path_count; p++)665(*c.odm_tx_pwr_track_set_pwr)666(dm, MIX_MODE, p, 0);667} else if (power_tracking_type == 1) {668RF_DBG(dm, DBG_RF_TX_PWR_TRACK,669"***Enter PwrTrk MIX(2G) TSSI(5G) MODE***\n");670for (p = RF_PATH_A; p < c.rf_path_count; p++)671(*c.odm_tx_pwr_track_set_pwr)672(dm, MIX_2G_TSSI_5G_MODE, p, 0);673} else if (power_tracking_type == 2) {674RF_DBG(dm, DBG_RF_TX_PWR_TRACK,675"***Enter PwrTrk MIX(5G) TSSI(2G)MODE***\n");676for (p = RF_PATH_A; p < c.rf_path_count; p++)677(*c.odm_tx_pwr_track_set_pwr)678(dm, MIX_5G_TSSI_2G_MODE, p, 0);679} else if (power_tracking_type == 3) {680RF_DBG(dm, DBG_RF_TX_PWR_TRACK,681"***Enter PwrTrk TSSI MODE***\n");682for (p = RF_PATH_A; p < c.rf_path_count; p++)683(*c.odm_tx_pwr_track_set_pwr)684(dm, TSSI_MODE, p, 0);685}686} else if ((cali_info->power_index_offset[RF_PATH_A] != 0 ||687cali_info->power_index_offset[RF_PATH_B] != 0 ||688cali_info->power_index_offset[RF_PATH_C] != 0 ||689cali_info->power_index_offset[RF_PATH_D] != 0)) {690#if 0691/* 4 7.2 Configure the Swing Table to adjust Tx Power. */692/*Always true after Tx Power is adjusted by power tracking.*/693694cali_info->is_tx_power_changed = true;695/* 2012/04/23 MH According to Luke's suggestion, we can not write BB digital696* to increase TX power. Otherwise, EVM will be bad.697*698* 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.699*/700if (thermal_value > cali_info->thermal_value) {701for (p = RF_PATH_A; p < c.rf_path_count; p++) {702RF_DBG(dm, DBG_RF_TX_PWR_TRACK,703"Temperature Increasing(%d): delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",704p, cali_info->power_index_offset[p],705delta, thermal_value, rf->eeprom_thermal,706cali_info->thermal_value);707}708} else if (thermal_value < cali_info->thermal_value) { /*Low temperature*/709for (p = RF_PATH_A; p < c.rf_path_count; p++) {710RF_DBG(dm, DBG_RF_TX_PWR_TRACK,711"Temperature Decreasing(%d): delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",712p, cali_info->power_index_offset[p],713delta, thermal_value, rf->eeprom_thermal,714cali_info->thermal_value);715}716}717#endif718719#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)720if (thermal_value > rf->eeprom_thermal) {721#else722if (thermal_value > dm->priv->pmib->dot11RFEntry.ther) {723#endif724RF_DBG(dm, DBG_RF_TX_PWR_TRACK,725"Temperature(%d) higher than PG value(%d)\n",726thermal_value, rf->eeprom_thermal);727728odm_pwrtrk_method(dm);729} else {730RF_DBG(dm, DBG_RF_TX_PWR_TRACK,731"Temperature(%d) lower than PG value(%d)\n",732thermal_value, rf->eeprom_thermal);733734odm_pwrtrk_method(dm);735}736737#if 0738/*Record last time Power Tracking result as base.*/739cali_info->bb_swing_idx_cck_base = cali_info->bb_swing_idx_cck;740for (p = RF_PATH_A; p < c.rf_path_count; p++)741cali_info->bb_swing_idx_ofdm_base[p] = cali_info->bb_swing_idx_ofdm[p];742#endif743RF_DBG(dm, DBG_RF_TX_PWR_TRACK,744"cali_info->thermal_value = %d thermal_value= %d\n",745cali_info->thermal_value, thermal_value);746}747/*Record last Power Tracking Thermal value*/748cali_info->thermal_value = thermal_value;749750if (dm->support_ic_type &751(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8192F | ODM_RTL8710B)) {752if (cali_info->xtal_offset_eanble != 0 &&753cali_info->txpowertrack_control &&754rf->eeprom_thermal != 0xff) {755RF_DBG(dm, DBG_RF_TX_PWR_TRACK,756"**********Enter Xtal Tracking**********\n");757758#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)759if (thermal_value > rf->eeprom_thermal) {760#else761if (thermal_value > dm->priv->pmib->dot11RFEntry.ther) {762#endif763RF_DBG(dm, DBG_RF_TX_PWR_TRACK,764"Temperature(%d) higher than PG (%d)\n",765thermal_value, rf->eeprom_thermal);766(*c.odm_txxtaltrack_set_xtal)(dm);767} else {768RF_DBG(dm, DBG_RF_TX_PWR_TRACK,769"Temperature(%d) lower than PG (%d)\n",770thermal_value, rf->eeprom_thermal);771(*c.odm_txxtaltrack_set_xtal)(dm);772}773}774RF_DBG(dm, DBG_RF_TX_PWR_TRACK,775"**********End Xtal Tracking**********\n");776}777778#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)779780/* Wait sacn to do IQK by RF Jenyu*/781if (!(*dm->is_scan_in_process) && !iqk_info->rfk_forbidden &&782!cali_info->is_iqk_in_progress) {783if (!(dm->support_ic_type & ODM_RTL8723B)) {784/*Delta temperature is equal or larger than 20 Celsius*/785/*When threshold is 8*/786if (delta_iqk >= c.threshold_iqk) {787cali_info->thermal_value_iqk = thermal_value;788RF_DBG(dm, DBG_RF_TX_PWR_TRACK,789"delta_iqk(%d) >= threshold_iqk(%d)\n",790delta_iqk, c.threshold_iqk);791(*c.do_iqk)(dm, delta_iqk, thermal_value, 8);792RF_DBG(dm, DBG_RF_TX_PWR_TRACK,793"do pwrtrk iqk\n");794}795}796}797798#if 0799if (cali_info->dpk_thermal[RF_PATH_A] != 0) {800if (diff_DPK[RF_PATH_A] >= c.threshold_dpk) {801odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);802odm_set_bb_reg(dm, R_0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), (diff_DPK[RF_PATH_A] / c.threshold_dpk));803odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);804} else if ((diff_DPK[RF_PATH_A] <= -1 * c.threshold_dpk)) {805s32 value = 0x20 + (diff_DPK[RF_PATH_A] / c.threshold_dpk);806807odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);808odm_set_bb_reg(dm, R_0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), value);809odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);810} else {811odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);812odm_set_bb_reg(dm, R_0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), 0);813odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);814}815}816if (cali_info->dpk_thermal[RF_PATH_B] != 0) {817if (diff_DPK[RF_PATH_B] >= c.threshold_dpk) {818odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);819odm_set_bb_reg(dm, R_0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), (diff_DPK[RF_PATH_B] / c.threshold_dpk));820odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);821} else if ((diff_DPK[RF_PATH_B] <= -1 * c.threshold_dpk)) {822s32 value = 0x20 + (diff_DPK[RF_PATH_B] / c.threshold_dpk);823824odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);825odm_set_bb_reg(dm, R_0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), value);826odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);827} else {828odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);829odm_set_bb_reg(dm, R_0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), 0);830odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);831}832}833#endif834835#endif836837RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===%s\n", __func__);838839cali_info->tx_powercount = 0;840}841842#if (RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)843void844odm_txpowertracking_new_callback_thermal_meter(void *dm_void)845{846struct dm_struct *dm = (struct dm_struct *)dm_void;847struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);848struct dm_iqk_info *iqk_info = &dm->IQK_info;849struct _hal_rf_ *rf = &dm->rf_table;850struct _halrf_tssi_data *tssi = &rf->halrf_tssi_data;851u8 thermal_value[MAX_RF_PATH] = {0}, delta[MAX_RF_PATH] = {0};852u8 delta_swing_table_idx_tup[DELTA_SWINGIDX_SIZE] = {0};853u8 delta_swing_table_idx_tdown[DELTA_SWINGIDX_SIZE] = {0};854u8 delta_LCK = 0, delta_IQK = 0, i = 0, j = 0, p;855u8 thermal_value_avg_count[MAX_RF_PATH] = {0};856u32 thermal_value_avg[MAX_RF_PATH] = {0};857s8 thermal_value_temp[MAX_RF_PATH] = {0};858u8 tracking_method = MIX_MODE;859860struct txpwrtrack_cfg c;861862u8 *delta_swing_table_idx_tup_a = NULL;863u8 *delta_swing_table_idx_tdown_a = NULL;864u8 *delta_swing_table_idx_tup_b = NULL;865u8 *delta_swing_table_idx_tdown_b = NULL;866u8 *delta_swing_table_idx_tup_c = NULL;867u8 *delta_swing_table_idx_tdown_c = NULL;868u8 *delta_swing_table_idx_tup_d = NULL;869u8 *delta_swing_table_idx_tdown_d = NULL;870871configure_txpower_track(dm, &c);872873(*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_a, (u8 **)&delta_swing_table_idx_tdown_a,874(u8 **)&delta_swing_table_idx_tup_b, (u8 **)&delta_swing_table_idx_tdown_b);875876if (dm->support_ic_type == ODM_RTL8814B) {877(*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_c, (u8 **)&delta_swing_table_idx_tdown_c,878(u8 **)&delta_swing_table_idx_tup_d, (u8 **)&delta_swing_table_idx_tdown_d);879}880881cali_info->txpowertracking_callback_cnt++;882cali_info->is_txpowertracking_init = true;883884RF_DBG(dm, DBG_RF_TX_PWR_TRACK,885"===>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",886cali_info->bb_swing_idx_cck_base, cali_info->bb_swing_idx_ofdm_base[RF_PATH_A], cali_info->default_ofdm_index);887888RF_DBG(dm, DBG_RF_TX_PWR_TRACK,889"cali_info->txpowertrack_control=%d, tssi->thermal[RF_PATH_A]=%d tssi->thermal[RF_PATH_B]=%d\n",890cali_info->txpowertrack_control, tssi->thermal[RF_PATH_A], tssi->thermal[RF_PATH_B]);891892if (dm->support_ic_type == ODM_RTL8822C) {893for (i = 0; i < c.rf_path_count; i++)894thermal_value[i] = (u8)odm_get_rf_reg(dm, i, c.thermal_reg_addr, 0x7e); /* 0x42: RF Reg[6:1] Thermal Trim*/895} else {896for (i = 0; i < c.rf_path_count; i++) {897thermal_value[i] = (u8)odm_get_rf_reg(dm, i, c.thermal_reg_addr, 0xfc00); /* 0x42: RF Reg[15:10]*/898thermal_value_temp[i] = (s8)thermal_value[i] + phydm_get_thermal_offset(dm);899900RF_DBG(dm, DBG_RF_TX_PWR_TRACK,901"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));902903if (thermal_value_temp[i] > 63)904thermal_value[i] = 63;905else if (thermal_value_temp[i] < 0)906thermal_value[i] = 0;907else908thermal_value[i] = thermal_value_temp[i];909}910}911912if ((tssi->thermal[RF_PATH_A] == 0xff || tssi->thermal[RF_PATH_B] == 0xff) &&913cali_info->txpowertrack_control != 3) {914for (i = 0; i < c.rf_path_count; i++)915RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "no pg, tssi->thermal[%d] = 0x%x\n",916i, tssi->thermal[i]);917return;918}919920for (j = 0; j < c.rf_path_count; j++) {921cali_info->thermal_value_avg_path[j][cali_info->thermal_value_avg_index_path[j]] = thermal_value[j];922cali_info->thermal_value_avg_index_path[j]++;923if (cali_info->thermal_value_avg_index_path[j] == c.average_thermal_num) /*Average times = c.average_thermal_num*/924cali_info->thermal_value_avg_index_path[j] = 0;925926927for (i = 0; i < c.average_thermal_num; i++) {928if (cali_info->thermal_value_avg_path[j][i]) {929thermal_value_avg[j] += cali_info->thermal_value_avg_path[j][i];930thermal_value_avg_count[j]++;931}932}933934if (thermal_value_avg_count[j]) { /* Calculate Average thermal_value after average enough times */935thermal_value[j] = (u8)(thermal_value_avg[j] / thermal_value_avg_count[j]);936RF_DBG(dm, DBG_RF_TX_PWR_TRACK,937"AVG Thermal Meter = 0x%X, tssi->thermal[%d] = 0x%x\n",938thermal_value[j], j, tssi->thermal[j]);939}940/* 4 5. Calculate delta, delta_LCK, delta_IQK. */941942/* "delta" here is used to determine whether thermal value changes or not. */943delta[j] = (thermal_value[j] > cali_info->thermal_value_path[j]) ? (thermal_value[j] - cali_info->thermal_value_path[j]) : (cali_info->thermal_value_path[j] - thermal_value[j]);944delta_LCK = (thermal_value[0] > cali_info->thermal_value_lck) ? (thermal_value[0] - cali_info->thermal_value_lck) : (cali_info->thermal_value_lck - thermal_value[0]);945delta_IQK = (thermal_value[0] > cali_info->thermal_value_iqk) ? (thermal_value[0] - cali_info->thermal_value_iqk) : (cali_info->thermal_value_iqk - thermal_value[0]);946}947948/*4 6. If necessary, do LCK.*/949950for (i = 0; i < c.rf_path_count; i++)951RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "(delta[%d], delta_LCK, delta_IQK) = (%d, %d, %d)\n", i, delta[i], delta_LCK, delta_IQK);952953/* Wait sacn to do LCK by RF Jenyu*/954if( (*dm->is_scan_in_process == false) && (!iqk_info->rfk_forbidden)) {955/* Delta temperature is equal to or larger than 20 centigrade.*/956if (delta_LCK >= c.threshold_iqk) {957RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk);958cali_info->thermal_value_lck = thermal_value[RF_PATH_A];959960/*Use RTLCK, so close power tracking driver LCK*/961if ((!(dm->support_ic_type & ODM_RTL8814A)) && (!(dm->support_ic_type & ODM_RTL8822B))) {962if (c.phy_lc_calibrate)963(*c.phy_lc_calibrate)(dm);964} else965RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do not do LCK\n");966}967}968969/*3 7. If necessary, move the index of swing table to adjust Tx power.*/970for (i = 0; i < c.rf_path_count; i++) {971if (i == RF_PATH_B) {972odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_b, DELTA_SWINGIDX_SIZE);973odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_b, DELTA_SWINGIDX_SIZE);974} else if (i == RF_PATH_C) {975odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_c, DELTA_SWINGIDX_SIZE);976odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_c, DELTA_SWINGIDX_SIZE);977} else if (i == RF_PATH_D) {978odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_d, DELTA_SWINGIDX_SIZE);979odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_d, DELTA_SWINGIDX_SIZE);980} else {981odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_a, DELTA_SWINGIDX_SIZE);982odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_a, DELTA_SWINGIDX_SIZE);983}984985cali_info->delta_power_index_last[i] = cali_info->delta_power_index[i]; /*recording poer index offset*/986delta[i] = thermal_value[i] > tssi->thermal[i] ? (thermal_value[i] - tssi->thermal[i]) : (tssi->thermal[i] - thermal_value[i]);987988if (delta[i] >= TXPWR_TRACK_TABLE_SIZE)989delta[i] = TXPWR_TRACK_TABLE_SIZE - 1;990991if (thermal_value[i] > tssi->thermal[i]) {992RF_DBG(dm, DBG_RF_TX_PWR_TRACK,993"delta_swing_table_idx_tup[%d]=%d Path=%d\n", delta[i], delta_swing_table_idx_tup[delta[i]], i);994995cali_info->delta_power_index[i] = delta_swing_table_idx_tup[delta[i]];996cali_info->absolute_ofdm_swing_idx[i] = delta_swing_table_idx_tup[delta[i]]; /*Record delta swing for mix mode power tracking*/997RF_DBG(dm, DBG_RF_TX_PWR_TRACK,998"******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);999} else {1000RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1001"delta_swing_table_idx_tdown[%d]=%d Path=%d\n", delta[i], delta_swing_table_idx_tdown[delta[i]], i);1002cali_info->delta_power_index[i] = -1 * delta_swing_table_idx_tdown[delta[i]];1003cali_info->absolute_ofdm_swing_idx[i] = -1 * delta_swing_table_idx_tdown[delta[i]]; /*Record delta swing for mix mode power tracking*/1004RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1005"******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);1006}1007}10081009for (p = RF_PATH_A; p < c.rf_path_count; p++) {1010if (cali_info->delta_power_index[p] == cali_info->delta_power_index_last[p]) /*If Thermal value changes but lookup table value still the same*/1011cali_info->power_index_offset[p] = 0;1012else1013cali_info->power_index_offset[p] = cali_info->delta_power_index[p] - cali_info->delta_power_index_last[p]; /*Power index diff between 2 times Power Tracking*/1014}10151016#if 01017if (dm->support_ic_type == ODM_RTL8822C) {1018RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");1019for (p = RF_PATH_A; p < c.rf_path_count; p++)1020(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);1021} else {1022RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking BBSWING_MODE**********\n");1023for (p = RF_PATH_A; p < c.rf_path_count; p++)1024(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, 0);1025}1026#endif1027if (*dm->mp_mode == 1) {1028if (cali_info->txpowertrack_control == 1) {1029RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");1030tracking_method = MIX_MODE;1031} else if (cali_info->txpowertrack_control == 3) {1032RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking TSSI_MODE**********\n");1033tracking_method = TSSI_MODE;1034}1035} else {1036if (rf->power_track_type >= 0 && rf->power_track_type <= 3) {1037RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");1038tracking_method = MIX_MODE;1039} else if (rf->power_track_type >= 4 && rf->power_track_type <= 7) {1040RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking TSSI_MODE**********\n");1041tracking_method = TSSI_MODE;1042}1043}10441045if (dm->support_ic_type == ODM_RTL8822C || dm->support_ic_type == ODM_RTL8814B)1046for (p = RF_PATH_A; p < c.rf_path_count; p++)1047(*c.odm_tx_pwr_track_set_pwr)(dm, tracking_method, p, 0);10481049/* Wait sacn to do IQK by RF Jenyu*/1050if ((*dm->is_scan_in_process == false) && (!iqk_info->rfk_forbidden)) {1051/*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/1052if (delta_IQK >= c.threshold_iqk) {1053cali_info->thermal_value_iqk = thermal_value[RF_PATH_A];1054RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk);1055/*if (!cali_info->is_iqk_in_progress)*/1056/* (*c.do_iqk)(dm, delta_IQK, thermal_value[RF_PATH_A], 8);*/1057RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do IQK\n");10581059/*if (!cali_info->is_iqk_in_progress)*/1060/* (*c.do_tssi_dck)(dm, true);*/1061RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do TSSI DCK\n");1062}1063}10641065RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===%s\n", __func__);10661067cali_info->tx_powercount = 0;1068}1069#endif10701071/*@3============================================================1072* 3 IQ Calibration1073* 3============================================================1074*/10751076void odm_reset_iqk_result(void *dm_void)1077{1078}10791080#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)1081u8 odm_get_right_chnl_place_for_iqk(u8 chnl)1082{1083u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {10841, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,108536, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,1086100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122,1087124, 126, 128, 130, 132, 134, 136, 138, 140,1088149, 151, 153, 155, 157, 159, 161, 163, 165};1089u8 place = chnl;10901091if (chnl > 14) {1092for (place = 14; place < sizeof(channel_all); place++) {1093if (channel_all[place] == chnl)1094return place - 13;1095}1096}1097return 0;1098}1099#endif11001101void odm_iq_calibrate(struct dm_struct *dm)1102{1103void *adapter = dm->adapter;1104struct dm_iqk_info *iqk_info = &dm->IQK_info;11051106#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)1107if (*dm->is_fcs_mode_enable)1108return;1109#endif11101111#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))1112if (IS_HARDWARE_TYPE_8812AU(adapter))1113return;1114#endif11151116if (dm->is_linked && !iqk_info->rfk_forbidden) {1117if ((*dm->channel != dm->pre_channel) &&1118(!*dm->is_scan_in_process)) {1119dm->pre_channel = *dm->channel;1120dm->linked_interval = 0;1121}11221123if (dm->linked_interval < 3)1124dm->linked_interval++;11251126if (dm->linked_interval == 2)1127halrf_iqk_trigger(dm, false);1128} else {1129dm->linked_interval = 0;1130}1131}11321133void phydm_rf_init(void *dm_void)1134{1135struct dm_struct *dm = (struct dm_struct *)dm_void;11361137odm_txpowertracking_init(dm);11381139#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1140odm_clear_txpowertracking_state(dm);1141#endif1142#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))1143#if (RTL8814A_SUPPORT == 1)1144if (dm->support_ic_type & ODM_RTL8814A)1145phy_iq_calibrate_8814a_init(dm);1146#endif1147#endif1148}11491150void phydm_rf_watchdog(void *dm_void)1151{1152struct dm_struct *dm = (struct dm_struct *)dm_void;11531154#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1155odm_txpowertracking_check(dm);1156#if 01157/*if (dm->support_ic_type & ODM_IC_11AC_SERIES)*/1158/*odm_iq_calibrate(dm);*/1159#endif1160#endif1161}116211631164