Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halphyrf_iot.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 {\30for (_offset = 0; _offset < _size; _offset++) { \31if (_delta_thermal < thermal_threshold[_direction][_offset]) { \32if (_offset != 0)\33_offset--;\34break;\35} \36} \37if (_offset >= _size)\38_offset = _size-1;\39} while (0)4041void configure_txpower_track(42void *dm_void,43struct txpwrtrack_cfg *config44)45{46struct dm_struct *dm = (struct dm_struct *)dm_void;47#if RTL8195B_SUPPORT48if (dm->support_ic_type == ODM_RTL8195B)49configure_txpower_track_8195b(config);50#endif51#if RTL8710C_SUPPORT52if (dm->support_ic_type == ODM_RTL8710C)53configure_txpower_track_8710c(config);54#endif55#if RTL8721D_SUPPORT56if (dm->support_ic_type == ODM_RTL8721D)57configure_txpower_track_8721d(config);58#endif5960}6162/* **********************************************************************63* <20121113, Kordan> This function should be called when tx_agc changed.64* Otherwise the previous compensation is gone, because we record the65* delta of temperature between two TxPowerTracking watch dogs.66*67* NOTE: If Tx BB swing or Tx scaling is varified during run-time, still68* need to call this function.69* ********************************************************************** */70void71odm_clear_txpowertracking_state(72void *dm_void73)74{75struct dm_struct *dm = (struct dm_struct *)dm_void;76struct _hal_rf_ *rf = &dm->rf_table;77u8 p = 0;78struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;7980cali_info->bb_swing_idx_cck_base = cali_info->default_cck_index;81cali_info->bb_swing_idx_cck = cali_info->default_cck_index;82dm->rf_calibrate_info.CCK_index = 0;8384for (p = RF_PATH_A; p < MAX_RF_PATH; ++p) {85cali_info->bb_swing_idx_ofdm_base[p] = cali_info->default_ofdm_index;86cali_info->bb_swing_idx_ofdm[p] = cali_info->default_ofdm_index;87cali_info->OFDM_index[p] = cali_info->default_ofdm_index;8889cali_info->power_index_offset[p] = 0;90cali_info->delta_power_index[p] = 0;91cali_info->delta_power_index_last[p] = 0;9293cali_info->absolute_ofdm_swing_idx[p] = 0;94cali_info->remnant_ofdm_swing_idx[p] = 0;95cali_info->kfree_offset[p] = 0;96}9798cali_info->modify_tx_agc_flag_path_a = false;99cali_info->modify_tx_agc_flag_path_b = false;100cali_info->modify_tx_agc_flag_path_c = false;101cali_info->modify_tx_agc_flag_path_d = false;102cali_info->remnant_cck_swing_idx = 0;103cali_info->thermal_value = rf->eeprom_thermal;104cali_info->modify_tx_agc_value_cck = 0;105cali_info->modify_tx_agc_value_ofdm = 0;106}107108void109odm_txpowertracking_callback_thermal_meter(110void *dm_void111)112{113struct dm_struct *dm = (struct dm_struct *)dm_void;114struct _hal_rf_ *rf = &dm->rf_table;115struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;116struct dm_iqk_info *iqk_info = &dm->IQK_info;117118u8 thermal_value = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;119u8 thermal_value_avg_count = 0;120u32 thermal_value_avg = 0, regc80, regcd0, regcd4, regab4;121122u8 OFDM_min_index = 0; /* OFDM BB Swing should be less than +3.0dB, which is required by Arthur */123u8 indexforchannel = 0; /* get_right_chnl_place_for_iqk(hal_data->current_channel) */124u8 power_tracking_type = rf->pwt_type;125u8 xtal_offset_eanble = 0;126s8 thermal_value_temp = 0;127128struct txpwrtrack_cfg c = {0};129130/* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */131u8 *delta_swing_table_idx_tup_a = NULL;132u8 *delta_swing_table_idx_tdown_a = NULL;133u8 *delta_swing_table_idx_tup_b = NULL;134u8 *delta_swing_table_idx_tdown_b = NULL;135#if (RTL8721D_SUPPORT == 1)136u8 *delta_swing_table_idx_tup_a_cck = NULL;137u8 *delta_swing_table_idx_tdown_a_cck = NULL;138u8 *delta_swing_table_idx_tup_b_cck = NULL;139u8 *delta_swing_table_idx_tdown_b_cck = NULL;140#endif141/*for Xtal Offset by James.Tung*/142s8 *delta_swing_table_xtal_up = NULL;143s8 *delta_swing_table_xtal_down = NULL;144145/* 4 2. Initialization ( 7 steps in total ) */146indexforchannel = odm_get_right_chnl_place_for_iqk(*dm->channel);147configure_txpower_track(dm, &c);148#if (RTL8721D_SUPPORT == 1)149(*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_a, (u8 **)&delta_swing_table_idx_tdown_a,150(u8 **)&delta_swing_table_idx_tup_b, (u8 **)&delta_swing_table_idx_tdown_b,151(u8 **)&delta_swing_table_idx_tup_a_cck, (u8 **)&delta_swing_table_idx_tdown_a_cck,152(u8 **)&delta_swing_table_idx_tup_b_cck, (u8 **)&delta_swing_table_idx_tdown_b_cck);153#else154(*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_a, (u8 **)&delta_swing_table_idx_tdown_a,155(u8 **)&delta_swing_table_idx_tup_b, (u8 **)&delta_swing_table_idx_tdown_b);156#endif157158/*for Xtal Offset*/159if (dm->support_ic_type == ODM_RTL8195B ||160dm->support_ic_type == ODM_RTL8721D ||161dm->support_ic_type == ODM_RTL8710C)162(*c.get_delta_swing_xtal_table)(dm,163(s8 **)&delta_swing_table_xtal_up,164(s8 **)&delta_swing_table_xtal_down);165166cali_info->txpowertracking_callback_cnt++; /*cosa add for debug*/167cali_info->is_txpowertracking_init = true;168169RF_DBG(dm, DBG_RF_TX_PWR_TRACK,170"===>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",171cali_info->bb_swing_idx_cck_base,172cali_info->bb_swing_idx_ofdm_base[RF_PATH_A],173cali_info->default_ofdm_index);174175RF_DBG(dm, DBG_RF_TX_PWR_TRACK,176"cali_info->txpowertrack_control = %d, hal_data->eeprom_thermal_meter %d\n",177cali_info->txpowertrack_control, rf->eeprom_thermal);178179if (dm->support_ic_type == ODM_RTL8721D180|| dm->support_ic_type == ODM_RTL8710C)181thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A,182c.thermal_reg_addr, 0x7e0);183/* 0x42: RF Reg[10:5] 8721D */184else185thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A,186c.thermal_reg_addr, 0xfc00);187/* 0x42: RF Reg[15:10] 88E */188189thermal_value_temp = thermal_value + phydm_get_thermal_offset(dm);190191RF_DBG(dm, DBG_RF_TX_PWR_TRACK,192"thermal_value_temp(%d) = thermal_value(%d) + power_trim_thermal(%d)\n", thermal_value_temp, thermal_value, phydm_get_thermal_offset(dm));193194if (thermal_value_temp > 63)195thermal_value = 63;196else if (thermal_value_temp < 0)197thermal_value = 0;198else199thermal_value = thermal_value_temp;200201if (!cali_info->txpowertrack_control)202return;203204if (rf->eeprom_thermal == 0xff) {205RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "no pg, hal_data->eeprom_thermal_meter = 0x%x\n", rf->eeprom_thermal);206return;207}208#if 0209/*4 3. Initialize ThermalValues of rf_calibrate_info*/210//if (cali_info->is_reloadtxpowerindex)211// RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "reload ofdm index for band switch\n");212#endif213/*4 4. Calculate average thermal meter*/214215cali_info->thermal_value_avg[cali_info->thermal_value_avg_index] = thermal_value;216cali_info->thermal_value_avg_index++;217if (cali_info->thermal_value_avg_index == c.average_thermal_num) /*Average times = c.average_thermal_num*/218cali_info->thermal_value_avg_index = 0;219220for (i = 0; i < c.average_thermal_num; i++) {221if (cali_info->thermal_value_avg[i]) {222thermal_value_avg += cali_info->thermal_value_avg[i];223thermal_value_avg_count++;224}225}226227if (thermal_value_avg_count) { /* Calculate Average thermal_value after average enough times */228thermal_value = (u8)(thermal_value_avg / thermal_value_avg_count);229cali_info->thermal_value_delta = thermal_value - rf->eeprom_thermal;230RF_DBG(dm, DBG_RF_TX_PWR_TRACK,231"AVG Thermal Meter = 0x%X, EFUSE Thermal base = 0x%X\n", thermal_value, rf->eeprom_thermal);232}233234/* 4 5. Calculate delta, delta_LCK, delta_IQK. */235/* "delta" here is used to determine whether thermal value changes or not. */236delta = (thermal_value > cali_info->thermal_value) ? (thermal_value - cali_info->thermal_value) : (cali_info->thermal_value - thermal_value);237delta_LCK = (thermal_value > cali_info->thermal_value_lck) ? (thermal_value - cali_info->thermal_value_lck) : (cali_info->thermal_value_lck - thermal_value);238delta_IQK = (thermal_value > cali_info->thermal_value_iqk) ? (thermal_value - cali_info->thermal_value_iqk) : (cali_info->thermal_value_iqk - thermal_value);239240/*4 6. If necessary, do LCK.*/241RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK);242243/* Wait sacn to do LCK by RF Jenyu*/244if ((!*dm->is_scan_in_process) && !iqk_info->rfk_forbidden &&245(!*dm->is_tdma)) {246/* Delta temperature is equal to or larger than 20 centigrade.*/247if (delta_LCK >= c.threshold_iqk) {248RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk);249cali_info->thermal_value_lck = thermal_value;250251/*Use RTLCK, so close power tracking driver LCK*/252(*c.phy_lc_calibrate)(dm);253}254}255256/*3 7. If necessary, move the index of swing table to adjust Tx power.*/257if (delta > 0 && cali_info->txpowertrack_control) {258/* "delta" here is used to record the absolute value of difference. */259delta = thermal_value > rf->eeprom_thermal ? (thermal_value - rf->eeprom_thermal) : (rf->eeprom_thermal - thermal_value);260261if (delta >= TXPWR_TRACK_TABLE_SIZE)262delta = TXPWR_TRACK_TABLE_SIZE - 1;263264/*4 7.1 The Final Power index = BaseIndex + power_index_offset*/265if (thermal_value > rf->eeprom_thermal) {266for (p = RF_PATH_A; p < c.rf_path_count; p++) {267cali_info->delta_power_index_last[p] = cali_info->delta_power_index[p]; /*recording poer index offset*/268switch (p) {269case RF_PATH_B:270RF_DBG(dm, DBG_RF_TX_PWR_TRACK,271"delta_swing_table_idx_tup_b[%d] = %d\n", delta, delta_swing_table_idx_tup_b[delta]);272#if (RTL8721D_SUPPORT == 1)273RF_DBG(dm, DBG_RF_TX_PWR_TRACK,274"delta_swing_table_idx_tup_b_cck[%d] = %d\n", delta, delta_swing_table_idx_tup_b_cck[delta]);275276cali_info->absolute_cck_swing_idx[p] = delta_swing_table_idx_tup_b_cck[delta];277278RF_DBG(dm, DBG_RF_TX_PWR_TRACK,279"******Temp is higher and cali_info->absolute_cck_swing_idx[RF_PATH_B] = %d\n",280cali_info->absolute_cck_swing_idx[p]);281#endif282cali_info->delta_power_index[p] =283delta_swing_table_idx_tup_b284[delta];285cali_info->absolute_ofdm_swing_idx[p] =286delta_swing_table_idx_tup_b287[delta];288/*Record delta swing for mix mode*/289RF_DBG(dm, DBG_RF_TX_PWR_TRACK,290"******Temp is higher and cali_info->absolute_ofdm_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);291break;292293default:294RF_DBG(dm, DBG_RF_TX_PWR_TRACK,295"delta_swing_table_idx_tup_a[%d] = %d\n", delta, delta_swing_table_idx_tup_a[delta]);296#if (RTL8721D_SUPPORT == 1)297RF_DBG(dm, DBG_RF_TX_PWR_TRACK,298"delta_swing_table_idx_tup_a_cck[%d] = %d\n", delta, delta_swing_table_idx_tup_a_cck[delta]);299300cali_info->absolute_cck_swing_idx[p] = delta_swing_table_idx_tup_a_cck[delta];301302RF_DBG(dm, DBG_RF_TX_PWR_TRACK,303"******Temp is higher and cali_info->absolute_cck_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_cck_swing_idx[p]);304#endif305cali_info->delta_power_index[p] = delta_swing_table_idx_tup_a[delta];306cali_info->absolute_ofdm_swing_idx[p] =307delta_swing_table_idx_tup_a[delta];308/*Record delta swing*/309/*for mix mode power tracking*/310RF_DBG(dm, DBG_RF_TX_PWR_TRACK,311"******Temp is higher and cali_info->absolute_ofdm_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);312break;313}314}315/* JJ ADD 20161014 */316if (dm->support_ic_type == ODM_RTL8195B ||317dm->support_ic_type == ODM_RTL8721D ||318dm->support_ic_type == ODM_RTL8710C) {319/*Save xtal_offset from Xtal table*/320cali_info->xtal_offset_last = cali_info->xtal_offset; /*recording last Xtal offset*/321RF_DBG(dm, DBG_RF_TX_PWR_TRACK,322"[Xtal] delta_swing_table_xtal_up[%d] = %d\n", delta, delta_swing_table_xtal_up[delta]);323cali_info->xtal_offset = delta_swing_table_xtal_up[delta];324xtal_offset_eanble = (cali_info->xtal_offset_last != cali_info->xtal_offset);325}326327} else {328for (p = RF_PATH_A; p < c.rf_path_count; p++) {329cali_info->delta_power_index_last[p] = cali_info->delta_power_index[p]; /*recording poer index offset*/330331switch (p) {332case RF_PATH_B:333RF_DBG(dm, DBG_RF_TX_PWR_TRACK,334"delta_swing_table_idx_tdown_b[%d] = %d\n", delta, delta_swing_table_idx_tdown_b[delta]);335#if (RTL8721D_SUPPORT == 1)336RF_DBG(dm, DBG_RF_TX_PWR_TRACK,337"delta_swing_table_idx_tdown_b_cck[%d] = %d\n", delta, delta_swing_table_idx_tdown_b_cck[delta]);338339cali_info->absolute_cck_swing_idx[p] = -1 * delta_swing_table_idx_tdown_b_cck[delta];340341RF_DBG(dm, DBG_RF_TX_PWR_TRACK,342"******Temp is lower and cali_info->absolute_cck_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_cck_swing_idx[p]);343#endif344cali_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_b[delta];345cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_b[delta]; /*Record delta swing for mix mode power tracking*/346RF_DBG(dm, DBG_RF_TX_PWR_TRACK,347"******Temp is lower and cali_info->absolute_ofdm_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);348break;349350default:351RF_DBG(dm, DBG_RF_TX_PWR_TRACK,352"delta_swing_table_idx_tdown_a[%d] = %d\n", delta, delta_swing_table_idx_tdown_a[delta]);353#if (RTL8721D_SUPPORT == 1)354RF_DBG(dm, DBG_RF_TX_PWR_TRACK,355"delta_swing_table_idx_tdown_a_cck[%d] = %d\n", delta, delta_swing_table_idx_tdown_a_cck[delta]);356357cali_info->absolute_cck_swing_idx[p] = -1 * delta_swing_table_idx_tdown_a_cck[delta];358359RF_DBG(dm, DBG_RF_TX_PWR_TRACK,360"******Temp is lower and cali_info->absolute_cck_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_cck_swing_idx[p]);361#endif362cali_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_a[delta];363cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_a[delta]; /*Record delta swing for mix mode power tracking*/364RF_DBG(dm, DBG_RF_TX_PWR_TRACK,365"******Temp is lower and cali_info->absolute_ofdm_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);366break;367}368}369/* JJ ADD 20161014 */370371if (dm->support_ic_type == ODM_RTL8195B ||372dm->support_ic_type == ODM_RTL8721D ||373dm->support_ic_type == ODM_RTL8710C) {374/*Save xtal_offset from Xtal table*/375cali_info->xtal_offset_last = cali_info->xtal_offset; /*recording last Xtal offset*/376RF_DBG(dm, DBG_RF_TX_PWR_TRACK,377"[Xtal] delta_swing_table_xtal_down[%d] = %d\n", delta, delta_swing_table_xtal_down[delta]);378cali_info->xtal_offset = delta_swing_table_xtal_down[delta];379xtal_offset_eanble = (cali_info->xtal_offset_last != cali_info->xtal_offset);380}381}382#if 0383for (p = RF_PATH_A; p < c.rf_path_count; p++) {384RF_DBG(dm, DBG_RF_TX_PWR_TRACK,385"\n\n=========================== [path-%d] Calculating power_index_offset===========================\n", p);386387if (cali_info->delta_power_index[p] == cali_info->delta_power_index_last[p]) /*If Thermal value changes but lookup table value still the same*/388cali_info->power_index_offset[p] = 0;389else390cali_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*/391392RF_DBG(dm, DBG_RF_TX_PWR_TRACK,393"[path-%d] power_index_offset(%d) = delta_power_index(%d) - delta_power_index_last(%d)\n", p, cali_info->power_index_offset[p], cali_info->delta_power_index[p], cali_info->delta_power_index_last[p]);394395cali_info->OFDM_index[p] = cali_info->bb_swing_idx_ofdm_base[p] + cali_info->power_index_offset[p];396cali_info->CCK_index = cali_info->bb_swing_idx_cck_base + cali_info->power_index_offset[p];397398cali_info->bb_swing_idx_cck = cali_info->CCK_index;399cali_info->bb_swing_idx_ofdm[p] = cali_info->OFDM_index[p];400401/*************Print BB Swing base and index Offset*************/402403RF_DBG(dm, DBG_RF_TX_PWR_TRACK,404"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, cali_info->power_index_offset[p]);405RF_DBG(dm, DBG_RF_TX_PWR_TRACK,406"The 'OFDM' final index(%d) = BaseIndex[%d](%d) + power_index_offset(%d)\n", cali_info->bb_swing_idx_ofdm[p], p, cali_info->bb_swing_idx_ofdm_base[p], cali_info->power_index_offset[p]);407408/*4 7.1 Handle boundary conditions of index.*/409410if (cali_info->OFDM_index[p] > c.swing_table_size_ofdm - 1)411cali_info->OFDM_index[p] = c.swing_table_size_ofdm - 1;412else if (cali_info->OFDM_index[p] <= OFDM_min_index)413cali_info->OFDM_index[p] = OFDM_min_index;414}415416RF_DBG(dm, DBG_RF_TX_PWR_TRACK,417"\n\n========================================================================================================\n");418419if (cali_info->CCK_index > c.swing_table_size_cck - 1)420cali_info->CCK_index = c.swing_table_size_cck - 1;421else if (cali_info->CCK_index <= 0)422cali_info->CCK_index = 0;423#endif424} else {425RF_DBG(dm, DBG_RF_TX_PWR_TRACK,426"The thermal meter is unchanged or TxPowerTracking OFF(%d): thermal_value: %d, cali_info->thermal_value: %d\n",427cali_info->txpowertrack_control, thermal_value, cali_info->thermal_value);428429for (p = RF_PATH_A; p < c.rf_path_count; p++)430cali_info->power_index_offset[p] = 0;431}432#if 0433RF_DBG(dm, DBG_RF_TX_PWR_TRACK,434"TxPowerTracking: [CCK] Swing Current index: %d, Swing base index: %d\n",435cali_info->CCK_index, cali_info->bb_swing_idx_cck_base); /*Print Swing base & current*/436437for (p = RF_PATH_A; p < c.rf_path_count; p++) {438RF_DBG(dm, DBG_RF_TX_PWR_TRACK,439"TxPowerTracking: [OFDM] Swing Current index: %d, Swing base index[%d]: %d\n",440cali_info->OFDM_index[p], p, cali_info->bb_swing_idx_ofdm_base[p]);441}442#endif443444#if (RTL8721D_SUPPORT == 1)445if (thermal_value != cali_info->thermal_value) {446if (thermal_value > rf->eeprom_thermal)447RF_DBG(dm, DBG_RF_TX_PWR_TRACK,448"Temperature(%d) higher than PG value(%d)\n",449thermal_value, rf->eeprom_thermal);450else if (thermal_value < rf->eeprom_thermal)451RF_DBG(dm, DBG_RF_TX_PWR_TRACK,452"Temperature(%d) lower than PG value(%d)\n",453thermal_value, rf->eeprom_thermal);454455RF_DBG(dm, DBG_RF_TX_PWR_TRACK,456"**********Enter POWER Tracking MIX_MODE**********\n");457for (p = RF_PATH_A; p < c.rf_path_count; p++)458(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p,459indexforchannel);460461/*Record last time Power Tracking result as base.*/462cali_info->bb_swing_idx_cck_base = cali_info->bb_swing_idx_cck;463for (p = RF_PATH_A; p < c.rf_path_count; p++)464cali_info->bb_swing_idx_ofdm_base[p] =465cali_info->bb_swing_idx_ofdm[p];466467RF_DBG(dm, DBG_RF_TX_PWR_TRACK,468"cali_info->thermal_value = %d thermal_value= %d\n",469cali_info->thermal_value, thermal_value);470/*Record last Power Tracking Thermal value*/471cali_info->thermal_value = thermal_value;472}473474#else475if (thermal_value > rf->eeprom_thermal) {476RF_DBG(dm, DBG_RF_TX_PWR_TRACK,477"Temperature(%d) higher than PG value(%d)\n", thermal_value, rf->eeprom_thermal);478479if (dm->support_ic_type == ODM_RTL8188E ||480dm->support_ic_type == ODM_RTL8192E ||481dm->support_ic_type == ODM_RTL8821 ||482dm->support_ic_type == ODM_RTL8812 ||483dm->support_ic_type == ODM_RTL8723B ||484dm->support_ic_type == ODM_RTL8814A ||485dm->support_ic_type == ODM_RTL8703B ||486dm->support_ic_type == ODM_RTL8188F ||487dm->support_ic_type == ODM_RTL8822B ||488dm->support_ic_type == ODM_RTL8723D ||489dm->support_ic_type == ODM_RTL8821C ||490dm->support_ic_type == ODM_RTL8710B ||491dm->support_ic_type == ODM_RTL8192F ||492dm->support_ic_type == ODM_RTL8195B ||493dm->support_ic_type == ODM_RTL8710C){494RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");495for (p = RF_PATH_A; p < c.rf_path_count; p++)496(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);497} else {498RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking BBSWING_MODE**********\n");499for (p = RF_PATH_A; p < c.rf_path_count; p++)500(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, indexforchannel);501}502} else {503RF_DBG(dm, DBG_RF_TX_PWR_TRACK,504"Temperature(%d) lower than PG value(%d)\n", thermal_value, rf->eeprom_thermal);505506if (dm->support_ic_type == ODM_RTL8188E ||507dm->support_ic_type == ODM_RTL8192E ||508dm->support_ic_type == ODM_RTL8821 ||509dm->support_ic_type == ODM_RTL8812 ||510dm->support_ic_type == ODM_RTL8723B ||511dm->support_ic_type == ODM_RTL8814A ||512dm->support_ic_type == ODM_RTL8703B ||513dm->support_ic_type == ODM_RTL8188F ||514dm->support_ic_type == ODM_RTL8822B ||515dm->support_ic_type == ODM_RTL8723D ||516dm->support_ic_type == ODM_RTL8821C ||517dm->support_ic_type == ODM_RTL8710B ||518dm->support_ic_type == ODM_RTL8192F ||519dm->support_ic_type == ODM_RTL8195B ||520dm->support_ic_type == ODM_RTL8710C) {521RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");522for (p = RF_PATH_A; p < c.rf_path_count; p++)523(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, indexforchannel);524} else {525RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking BBSWING_MODE**********\n");526for (p = RF_PATH_A; p < c.rf_path_count; p++)527(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, indexforchannel);528}529530cali_info->bb_swing_idx_cck_base = cali_info->bb_swing_idx_cck; /*Record last time Power Tracking result as base.*/531for (p = RF_PATH_A; p < c.rf_path_count; p++)532cali_info->bb_swing_idx_ofdm_base[p] = cali_info->bb_swing_idx_ofdm[p];533534RF_DBG(dm, DBG_RF_TX_PWR_TRACK,535"cali_info->thermal_value = %d thermal_value= %d\n", cali_info->thermal_value, thermal_value);536537cali_info->thermal_value = thermal_value; /*Record last Power Tracking Thermal value*/538}539#endif540/* JJ ADD 20161014 */541if (dm->support_ic_type == ODM_RTL8195B ||542dm->support_ic_type == ODM_RTL8721D ||543dm->support_ic_type == ODM_RTL8710C) {544if (xtal_offset_eanble != 0 && cali_info->txpowertrack_control && (rf->eeprom_thermal != 0xff)) {545RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter Xtal Tracking**********\n");546547if (thermal_value > rf->eeprom_thermal) {548RF_DBG(dm, DBG_RF_TX_PWR_TRACK,549"Temperature(%d) higher than PG value(%d)\n", thermal_value, rf->eeprom_thermal);550(*c.odm_txxtaltrack_set_xtal)(dm);551} else {552RF_DBG(dm, DBG_RF_TX_PWR_TRACK,553"Temperature(%d) lower than PG value(%d)\n", thermal_value, rf->eeprom_thermal);554(*c.odm_txxtaltrack_set_xtal)(dm);555}556RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********End Xtal Tracking**********\n");557}558}559#if (!RTL8721D_SUPPORT)560/* Wait sacn to do IQK by RF Jenyu*/561if ((!*dm->is_scan_in_process) && (!iqk_info->rfk_forbidden)) {562/*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/563if (delta_IQK >= c.threshold_iqk) {564cali_info->thermal_value_iqk = thermal_value;565RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk);566if (!cali_info->is_iqk_in_progress)567(*c.do_iqk)(dm, delta_IQK, thermal_value, 8);568}569}570#endif571RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===odm_txpowertracking_callback_thermal_meter\n");572573cali_info->tx_powercount = 0;574}575576/* 3============================================================577* 3 IQ Calibration578* 3============================================================579*/580581void582odm_reset_iqk_result(583void *dm_void584)585{586return;587}588589#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)590u8 odm_get_right_chnl_place_for_iqk(u8 chnl)591{592u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {5931, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,59436, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,595100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122,596124, 126, 128, 130, 132, 134, 136, 138, 140,597149, 151, 153, 155, 157, 159, 161, 163, 165};598u8 place = chnl;599600if (chnl > 14) {601for (place = 14; place < sizeof(channel_all); place++) {602if (channel_all[place] == chnl)603return place - 13;604}605}606return 0;607}608#endif609610void611odm_rf_calibrate(struct dm_struct *dm)612{613#if (RTL8721D_SUPPORT == 1)614struct dm_iqk_info *iqk_info = &dm->IQK_info;615616if (dm->is_linked && !iqk_info->rfk_forbidden) {617if ((*dm->channel != dm->pre_channel) &&618(!*dm->is_scan_in_process)) {619dm->pre_channel = *dm->channel;620dm->linked_interval = 0;621}622623if (dm->linked_interval < 3)624dm->linked_interval++;625626if (dm->linked_interval == 2)627halrf_rf_k_connect_trigger(dm, 0, SEGMENT_FREE);628} else {629dm->linked_interval = 0;630}631#endif632}633634void phydm_rf_init(void *dm_void)635{636struct dm_struct *dm = (struct dm_struct *)dm_void;637638odm_txpowertracking_init(dm);639640odm_clear_txpowertracking_state(dm);641}642643void phydm_rf_watchdog(void *dm_void)644{645struct dm_struct *dm = (struct dm_struct *)dm_void;646647odm_txpowertracking_check(dm);648#if (RTL8721D_SUPPORT == 1)649odm_rf_calibrate(dm);650#endif651}652653654