Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/rtl8814a/halrf_8814a_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*****************************************************************************/1415#include "mp_precomp.h"16#include "../../phydm_precomp.h"1718#if (RTL8814A_SUPPORT == 1)1920/*---------------------------Define Local Constant---------------------------*/21/* 2010/04/25 MH Define the max tx power tracking tx agc power. */22#define ODM_TXPWRTRACK_MAX_IDX_8814A 62324/*---------------------------Define Local Constant---------------------------*/2526/*3============================================================*/27/* 3 Tx Power Tracking28*3============================================================*/29#define REG_A_TX_AGC 0xC9430#define REG_B_TX_AGC 0xE9431#define REG_C_TX_AGC 0x189432#define REG_D_TX_AGC 0x1A9433#define TXAGC_BITMASK (BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25))34#define REG_A_BBSWING 0xC1C35#define REG_B_BBSWING 0xE1C36#define REG_C_BBSWING 0x181C37#define REG_D_BBSWING 0x1A1C38#define BBSWING_BITMASK 0xFFE000003940#if 04142u8 check_rf_gain_offset(43struct dm_struct *dm,44enum pwrtrack_method method,45u8 rf_path46)47{48s8 upper_bound = 10, lower_bound = -5; /*4'b1010 = 10*/49s8 final_rf_index = 0;50boolean is_positive = false;51u32 bit_mask = 0;52u8 final_ofdm_swing_index = 0, tx_scaling_upper_bound = 28, tx_scaling_lower_bound = 4; /*upper bound +2dB, lower bound -10dB*/53struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);5455if (method == MIX_MODE) { /*normal Tx power tracking*/56RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "is 8814 MP chip\n");57bit_mask = BIT(19);58cali_info->absolute_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] + cali_info->kfree_offset[rf_path];5960if (cali_info->absolute_ofdm_swing_idx[rf_path] >= 0) /*check if RF_Index is positive or not*/61is_positive = true;62else63is_positive = false;6465odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, is_positive);6667bit_mask = BIT(18) | BIT(17) | BIT(16) | BIT(15);68final_rf_index = cali_info->absolute_ofdm_swing_idx[rf_path] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/69}7071if (final_rf_index > upper_bound) { /*Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB*/72odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, upper_bound); /*set RF Reg0x55 per path*/7374final_ofdm_swing_index = cali_info->default_ofdm_index + (cali_info->absolute_ofdm_swing_idx[rf_path] - (upper_bound << 1));7576if (final_ofdm_swing_index > tx_scaling_upper_bound) /*bb swing upper bound = +2dB*/77final_ofdm_swing_index = tx_scaling_upper_bound;7879RF_DBG(dm, DBG_RF_TX_PWR_TRACK,80"******path-%d Compensate with TXBB = %d\n", rf_path,81upper_bound);8283return final_ofdm_swing_index;84} else if (final_rf_index < lower_bound) { /*lower bound = -5dB*/85odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, (-1) * (lower_bound)); /*set RF Reg0x55 per path*/8687final_ofdm_swing_index = cali_info->default_ofdm_index - ((lower_bound << 1) - cali_info->absolute_ofdm_swing_idx[rf_path]);8889if (final_ofdm_swing_index < tx_scaling_lower_bound) /*bb swing lower bound = -10dB*/90final_ofdm_swing_index = tx_scaling_lower_bound;9192return final_ofdm_swing_index;9394} else { /*normal case*/9596if (is_positive == true)97odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, final_rf_index); /*set RF Reg0x55 per path*/98else99odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, (-1) * final_rf_index); /*set RF Reg0x55 per path*/100101final_ofdm_swing_index = cali_info->default_ofdm_index + (cali_info->absolute_ofdm_swing_idx[rf_path]) % 2;102return final_ofdm_swing_index;103}104105return false;106}107108#endif109110u8 get_tssivalue(struct dm_struct *dm, enum pwrtrack_method method, u8 rf_path)111{112struct _ADAPTER *adapter = dm->adapter;113struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);114struct _hal_rf_ *rf = &(dm->rf_table);115HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);116117s8 power_by_rate_value = 0;118u8 tx_num, tssi_value = 0;119u8 channel = *dm->channel;120u8 band_width = hal_data->current_channel_bw;121u8 tx_rate = 0xFF;122u8 tx_limit = 0;123u8 reg_pwr_tbl_sel = 0;124125#ifdef CONFIG_PHYDM_POWERTRACK_BY_TSSI126127#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))128#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)129PMGNT_INFO mgnt_info = &(adapter->MgntInfo);130131reg_pwr_tbl_sel = mgnt_info->reg_pwr_tbl_sel;132#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)133reg_pwr_tbl_sel = adapter->registrypriv.reg_pwr_tbl_sel;134#endif135#endif136137if (*dm->mp_mode == true) {138#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))139#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)140#if (MP_DRIVER == 1)141PMPT_CONTEXT p_mpt_ctx = &(adapter->mpt_ctx);142143tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);144#endif145#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)146#ifdef CONFIG_MP_INCLUDED147PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);148149tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);150#endif151#endif152#endif153} else {154u16 rate = *(dm->forced_data_rate);155156if (!rate) { /*auto rate*/157#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)158tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);159#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)160if (dm->number_linked_client != 0)161tx_rate = hw_rate_to_m_rate(dm->tx_rate);162else163tx_rate = rf->p_rate_index;164#endif165} else /*force rate*/166tx_rate = (u8)rate;167}168169RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__,170tx_rate);171tx_num = mgnt_query_nss_tx_rate(tx_rate);172173if (channel >= 1 && channel <= 14) {174power_by_rate_value = phy_get_tx_power_by_rate_original(adapter, BAND_ON_2_4G, (enum rf_path)rf_path, tx_num, tx_rate);175tx_limit = phy_get_tx_power_limit_original(adapter, reg_pwr_tbl_sel, BAND_ON_2_4G, band_width, RF_PATH_A, tx_rate, channel);176177RF_DBG(dm, DBG_RF_TX_PWR_TRACK,178"Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n",179__func__, power_by_rate_value, tx_rate, rf_path, tx_num);180RF_DBG(dm, DBG_RF_TX_PWR_TRACK,181"Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n",182__func__, tx_limit, reg_pwr_tbl_sel, band_width,183channel);184185power_by_rate_value = power_by_rate_value > tx_limit ? tx_limit : power_by_rate_value;186187if (IS_CCK_RATE(tx_rate)) {188switch (rf_path) {189case RF_PATH_A:190tssi_value = cali_info->delta_swing_tssi_table_2g_cck_a[power_by_rate_value];191break;192193case RF_PATH_B:194tssi_value = cali_info->delta_swing_tssi_table_2g_cck_b[power_by_rate_value];195break;196197case RF_PATH_C:198tssi_value = cali_info->delta_swing_tssi_table_2g_cck_c[power_by_rate_value];199break;200201case RF_PATH_D:202tssi_value = cali_info->delta_swing_tssi_table_2g_cck_d[power_by_rate_value];203break;204205default:206RF_DBG(dm, DBG_RF_TX_PWR_TRACK,207"Call:%s Wrong path name!!!\n",208__func__);209break;210}211} else {212switch (rf_path) {213case RF_PATH_A:214tssi_value = cali_info->delta_swing_tssi_table_2ga[power_by_rate_value];215break;216217case RF_PATH_B:218tssi_value = cali_info->delta_swing_tssi_table_2gb[power_by_rate_value];219break;220221case RF_PATH_C:222tssi_value = cali_info->delta_swing_tssi_table_2gc[power_by_rate_value];223break;224225case RF_PATH_D:226tssi_value = cali_info->delta_swing_tssi_table_2gd[power_by_rate_value];227break;228229default:230RF_DBG(dm, DBG_RF_TX_PWR_TRACK,231"Call:%s Wrong path name!!!!\n",232__func__);233break;234}235}236} else if (channel >= 36 && channel <= 64) {237power_by_rate_value = phy_get_tx_power_by_rate_original(adapter, BAND_ON_5G, (enum rf_path)rf_path, tx_num, tx_rate);238239tx_limit = phy_get_tx_power_limit_original(adapter, reg_pwr_tbl_sel, BAND_ON_5G, band_width, RF_PATH_A, tx_rate, channel);240241RF_DBG(dm, DBG_RF_TX_PWR_TRACK,242"Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n",243__func__, power_by_rate_value, tx_rate, rf_path, tx_num);244RF_DBG(dm, DBG_RF_TX_PWR_TRACK,245"Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n",246__func__, tx_limit, reg_pwr_tbl_sel, band_width,247channel);248249power_by_rate_value = power_by_rate_value > tx_limit ? tx_limit : power_by_rate_value;250251switch (rf_path) {252case RF_PATH_A:253tssi_value = cali_info->delta_swing_tssi_table_5ga[0][power_by_rate_value];254break;255256case RF_PATH_B:257tssi_value = cali_info->delta_swing_tssi_table_5gb[0][power_by_rate_value];258break;259260case RF_PATH_C:261tssi_value = cali_info->delta_swing_tssi_table_5gc[0][power_by_rate_value];262break;263264case RF_PATH_D:265tssi_value = cali_info->delta_swing_tssi_table_5gd[0][power_by_rate_value];266break;267268default:269RF_DBG(dm, DBG_RF_TX_PWR_TRACK,270"Call:%s Wrong path name!!!!\n", __func__);271break;272}273} else if (channel >= 100 && channel <= 144) {274power_by_rate_value = phy_get_tx_power_by_rate_original(adapter, BAND_ON_5G, (enum rf_path)rf_path, tx_num, tx_rate);275276tx_limit = phy_get_tx_power_limit_original(adapter, reg_pwr_tbl_sel, BAND_ON_5G, band_width, RF_PATH_A, tx_rate, channel);277278RF_DBG(dm, DBG_RF_TX_PWR_TRACK,279"Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n",280__func__, power_by_rate_value, tx_rate, rf_path, tx_num);281RF_DBG(dm, DBG_RF_TX_PWR_TRACK,282"Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n",283__func__, tx_limit, reg_pwr_tbl_sel, band_width,284channel);285286power_by_rate_value = power_by_rate_value > tx_limit ? tx_limit : power_by_rate_value;287288switch (rf_path) {289case RF_PATH_A:290tssi_value = cali_info->delta_swing_tssi_table_5ga[1][power_by_rate_value];291break;292293case RF_PATH_B:294tssi_value = cali_info->delta_swing_tssi_table_5gb[1][power_by_rate_value];295break;296297case RF_PATH_C:298tssi_value = cali_info->delta_swing_tssi_table_5gc[1][power_by_rate_value];299break;300301case RF_PATH_D:302tssi_value = cali_info->delta_swing_tssi_table_5gd[1][power_by_rate_value];303break;304305default:306RF_DBG(dm, DBG_RF_TX_PWR_TRACK,307"Call:%s Wrong path name!!!!\n", __func__);308break;309}310} else if (channel >= 149 && channel <= 173) {311power_by_rate_value = phy_get_tx_power_by_rate_original(adapter, BAND_ON_5G, (enum rf_path)rf_path, tx_num, tx_rate);312313tx_limit = phy_get_tx_power_limit_original(adapter, reg_pwr_tbl_sel, BAND_ON_5G, band_width, RF_PATH_A, tx_rate, channel);314315RF_DBG(dm, DBG_RF_TX_PWR_TRACK,316"Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n",317__func__, power_by_rate_value, tx_rate, rf_path, tx_num);318RF_DBG(dm, DBG_RF_TX_PWR_TRACK,319"Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n",320__func__, tx_limit, reg_pwr_tbl_sel, band_width,321channel);322323power_by_rate_value = power_by_rate_value > tx_limit ? tx_limit : power_by_rate_value;324325switch (rf_path) {326case RF_PATH_A:327tssi_value = cali_info->delta_swing_tssi_table_5ga[2][power_by_rate_value];328break;329330case RF_PATH_B:331tssi_value = cali_info->delta_swing_tssi_table_5gb[2][power_by_rate_value];332break;333334case RF_PATH_C:335tssi_value = cali_info->delta_swing_tssi_table_5gc[2][power_by_rate_value];336break;337338case RF_PATH_D:339tssi_value = cali_info->delta_swing_tssi_table_5gd[2][power_by_rate_value];340break;341342default:343RF_DBG(dm, DBG_RF_TX_PWR_TRACK,344"Call:%s Wrong path name!!!!\n", __func__);345break;346}347}348349RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s index=%d tssi_value=%d\n",350__func__, power_by_rate_value, tssi_value);351352#endif /*CONFIG_PHYDM_POWERTRACK_BY_TSSI*/353354return tssi_value;355}356357boolean get_tssi_mode_tx_agc_bb_swing_offset(struct dm_struct *dm,358enum pwrtrack_method method,359u8 rf_path, u32 offset_vaule,360u8 tx_power_index_offest)361{362struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);363364u8 bb_swing_upper_bound = cali_info->default_ofdm_index + 10;365u8 bb_swing_lower_bound = 0;366u8 tx_agc_index = (u8)cali_info->absolute_ofdm_swing_idx[rf_path];367u8 tx_bb_swing_index = (u8)cali_info->bb_swing_idx_ofdm[rf_path];368369if (tx_power_index_offest > 0XF)370tx_power_index_offest = 0XF;371372if (tx_agc_index == 0 && tx_bb_swing_index == cali_info->default_ofdm_index) {373if ((offset_vaule & 0X20) >> 5 == 0) {374offset_vaule = offset_vaule & 0X1F;375376if (offset_vaule > tx_power_index_offest) {377tx_agc_index = tx_power_index_offest;378tx_bb_swing_index = tx_bb_swing_index + (u8)offset_vaule - tx_power_index_offest;379380if (tx_bb_swing_index > bb_swing_upper_bound)381tx_bb_swing_index = bb_swing_upper_bound;382383RF_DBG(dm, DBG_RF_TX_PWR_TRACK,384"tx_agc_index(0) tx_bb_swing_index(18) +++ ( offset_vaule > 0XF) offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",385offset_vaule, tx_agc_index,386tx_bb_swing_index);387} else {388tx_agc_index = (u8)offset_vaule;389tx_bb_swing_index = cali_info->default_ofdm_index;390391RF_DBG(dm, DBG_RF_TX_PWR_TRACK,392"tx_agc_index(0) tx_bb_swing_index(18) +++ ( offset_vaule <= 0XF) offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",393offset_vaule, tx_agc_index,394tx_bb_swing_index);395}396} else {397tx_agc_index = 0;398offset_vaule = ((~offset_vaule) + 1) & 0X1F;399400if (tx_bb_swing_index >= (u8)offset_vaule)401tx_bb_swing_index = tx_bb_swing_index - (u8)offset_vaule;402else403tx_bb_swing_index = bb_swing_lower_bound;404405if (tx_bb_swing_index <= bb_swing_lower_bound)406tx_bb_swing_index = bb_swing_lower_bound;407408RF_DBG(dm, DBG_RF_TX_PWR_TRACK,409"tx_agc_index(0) tx_bb_swing_index(18) --- offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",410offset_vaule, tx_agc_index, tx_bb_swing_index);411}412413} else if (tx_agc_index > 0 && tx_bb_swing_index == cali_info->default_ofdm_index) {414if ((offset_vaule & 0X20) >> 5 == 0) {415if (offset_vaule > tx_power_index_offest) {416tx_agc_index = tx_power_index_offest;417tx_bb_swing_index = tx_bb_swing_index + (u8)offset_vaule - tx_power_index_offest;418419if (tx_bb_swing_index > bb_swing_upper_bound)420tx_bb_swing_index = bb_swing_upper_bound;421} else422tx_agc_index = (u8)offset_vaule;423424RF_DBG(dm, DBG_RF_TX_PWR_TRACK,425"tx_agc_index > 0 tx_bb_swing_index(18) +++ offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",426offset_vaule, tx_agc_index, tx_bb_swing_index);427} else {428tx_agc_index = 0;429offset_vaule = ((~offset_vaule) + 1) & 0X1F;430431if (tx_bb_swing_index >= (u8)offset_vaule)432tx_bb_swing_index = tx_bb_swing_index - (u8)offset_vaule;433else434tx_bb_swing_index = bb_swing_lower_bound;435436if (tx_bb_swing_index <= bb_swing_lower_bound)437tx_bb_swing_index = bb_swing_lower_bound;438439RF_DBG(dm, DBG_RF_TX_PWR_TRACK,440"tx_agc_index > 0 tx_bb_swing_index(18) --- offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",441offset_vaule, tx_agc_index, tx_bb_swing_index);442}443444} else if (tx_agc_index > 0 && tx_bb_swing_index > cali_info->default_ofdm_index) {445if ((offset_vaule & 0X20) >> 5 == 0) {446tx_agc_index = tx_power_index_offest;447tx_bb_swing_index = tx_bb_swing_index + (u8)offset_vaule - tx_power_index_offest;448449if (tx_bb_swing_index > bb_swing_upper_bound)450tx_bb_swing_index = bb_swing_upper_bound;451452if (tx_bb_swing_index < cali_info->default_ofdm_index) {453tx_agc_index = tx_power_index_offest - (cali_info->default_ofdm_index - tx_bb_swing_index);454tx_bb_swing_index = cali_info->default_ofdm_index;455}456} else {457tx_agc_index = 0;458offset_vaule = ((~offset_vaule) + 1) & 0X1F;459460if (tx_bb_swing_index >= (u8)offset_vaule)461tx_bb_swing_index = cali_info->default_ofdm_index - (u8)offset_vaule;462else463tx_bb_swing_index = bb_swing_lower_bound;464465if (tx_bb_swing_index <= bb_swing_lower_bound)466tx_bb_swing_index = bb_swing_lower_bound;467}468469RF_DBG(dm, DBG_RF_TX_PWR_TRACK,470"tx_agc_index>0 tx_bb_swing_index>18 --- offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d offset_vaule=%d\n",471offset_vaule, tx_agc_index, tx_bb_swing_index,472offset_vaule - tx_power_index_offest);473474} else if (tx_agc_index == 0 && tx_bb_swing_index < cali_info->default_ofdm_index) {475if ((offset_vaule & 0X20) >> 5 == 1) {476offset_vaule = ((~offset_vaule) + 1) & 0X1F;477478if (tx_bb_swing_index >= (u8)offset_vaule)479tx_bb_swing_index = tx_bb_swing_index - (u8)offset_vaule;480else481tx_bb_swing_index = bb_swing_lower_bound;482} else {483offset_vaule = (offset_vaule & 0x1F);484tx_bb_swing_index = tx_bb_swing_index + (u8)offset_vaule;485486if (tx_bb_swing_index > cali_info->default_ofdm_index) {487tx_agc_index = tx_bb_swing_index - cali_info->default_ofdm_index;488tx_bb_swing_index = cali_info->default_ofdm_index;489490if (tx_agc_index > tx_power_index_offest) {491tx_bb_swing_index = cali_info->default_ofdm_index + (u8)(tx_agc_index)-tx_power_index_offest;492tx_agc_index = tx_power_index_offest;493494if (tx_bb_swing_index > bb_swing_upper_bound)495tx_bb_swing_index = bb_swing_upper_bound;496}497}498}499500if (tx_bb_swing_index <= bb_swing_lower_bound) {501tx_bb_swing_index = bb_swing_lower_bound;502RF_DBG(dm, DBG_RF_TX_PWR_TRACK,503"Call %s Path_%d BBSwing Lower Bound\n",504__func__, rf_path);505}506507RF_DBG(dm, DBG_RF_TX_PWR_TRACK,508"tx_agc_index(0) tx_bb_swing_index < 18 offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",509offset_vaule, tx_agc_index, tx_bb_swing_index);510}511512if ((tx_agc_index == cali_info->absolute_ofdm_swing_idx[rf_path]) && (tx_bb_swing_index == cali_info->bb_swing_idx_ofdm[rf_path]))513return false;514515else {516cali_info->absolute_ofdm_swing_idx[rf_path] = tx_agc_index;517cali_info->bb_swing_idx_ofdm[rf_path] = tx_bb_swing_index;518return true;519}520}521522void set_tx_agc_bb_swing_offset(struct dm_struct *dm,523enum pwrtrack_method method, u8 rf_path)524{525struct _ADAPTER *adapter = dm->adapter;526HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);527528u8 tx_rate = 0xFF;529u8 channel = *dm->channel;530u8 band_width = hal_data->current_channel_bw;531u32 tx_path = hal_data->antenna_tx_path;532533u8 tssi_value = 0;534u8 tx_power_index = 0;535u8 tx_power_index_offest = 0;536u32 offset_vaule = 0;537u32 tssi_function = 0;538u32 txbb_swing = 0;539u8 tx_bb_swing_index = 0;540u32 tx_agc_index = 0;541u32 wait_tx_agc_offset_timer = 0;542u8 i = 0;543boolean rtn = false;544545struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);546struct _hal_rf_ *rf = &(dm->rf_table);547548if (*dm->mp_mode == true) {549#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))550#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)551#if (MP_DRIVER == 1)552PMPT_CONTEXT p_mpt_ctx = &(adapter->mpt_ctx);553554tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);555#endif556#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)557#ifdef CONFIG_MP_INCLUDED558PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);559560tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);561#endif562#endif563#endif564} else {565u16 rate = *(dm->forced_data_rate);566567if (!rate) { /*auto rate*/568#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)569tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);570#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)571if (dm->number_linked_client != 0)572tx_rate = hw_rate_to_m_rate(dm->tx_rate);573else574tx_rate = rf->p_rate_index;575#endif576} else /*force rate*/577tx_rate = (u8)rate;578}579580RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__,581tx_rate);582583if (method == TSSI_MODE) {584switch (rf_path) {585case RF_PATH_A:586/*Disable path B TSSI Circuit*/587odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 0);588/*Enable path A TSSI Circuit*/589odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 1);590591/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/592tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path)rf_path);593594odm_set_rf_reg(dm, (enum rf_path)rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);595596/*Write BB 0xC8C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/597odm_set_bb_reg(dm, R_0xc8c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);598599odm_set_bb_reg(dm, R_0xc8c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);600601/*Write BB TXAGC Initial Power index for EEPROM*/602tx_power_index = phy_get_tx_power_index_8814a(adapter, (enum rf_path)rf_path, tx_rate, band_width, channel);603odm_set_bb_reg(dm, R_0xc8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);604605RF_DBG(dm, DBG_RF_TX_PWR_TRACK,606"Call %s tx_power_index=%d rf_path=%d tx_rate=%d band_width=%d channel=%d 0x65[19:15]=0X%X 0x65[11:10]=0X%X\n",607__func__,608odm_get_bb_reg(dm, R_0xc8c,609BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) |610BIT(1) | BIT(0)), rf_path, tx_rate, band_width,611channel,612odm_get_rf_reg(dm, (enum rf_path)rf_path,613RF_0x65,614BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),615odm_get_rf_reg(dm, (enum rf_path)rf_path,616RF_0x65, BIT(11) | BIT(10)));617618/*Disable BB TSSI Power Tracking*/619odm_set_bb_reg(dm, R_0xc8c, BIT(7), 0);620/*Enable path A TSSI Circuit*/621odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 1);622/*Enable BB TSSI Power Tracking*/623odm_set_bb_reg(dm, R_0xc8c, BIT(7), 1);624625/* delay_us(500);*/626wait_tx_agc_offset_timer = 0;627628while ((odm_get_bb_reg(dm, R_0xd2c, BIT(30)) != 1) && ((tx_path & 8) == 8)) {629wait_tx_agc_offset_timer++;630631if (wait_tx_agc_offset_timer >= 1000)632break;633}634635/*Read the offset value at BB Reg.*/636offset_vaule = odm_get_bb_reg(dm, R_0xd2c, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));637638tssi_function = odm_get_bb_reg(dm, R_0xd2c, BIT(30));639640RF_DBG(dm, DBG_RF_TX_PWR_TRACK,641"Call %s 0XD2C tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n",642__func__, tssi_function, offset_vaule, rf_path);643644/*Disable BB TSSI Power Tracking*/645odm_set_bb_reg(dm, R_0xc8c, BIT(7), 0);646/*Disable path A TSSI Circuit*/647odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 0);648649if (tssi_function == 1) {650txbb_swing = odm_get_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK);651652for (i = 0; i <= 36; i++) {653if (txbb_swing == tx_scaling_table_jaguar[i]) {654cali_info->bb_swing_idx_ofdm[rf_path] = i;655RF_DBG(dm, DBG_RF_TX_PWR_TRACK, " PathA txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);656break;657658} else659cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;660}661662cali_info->absolute_ofdm_swing_idx[rf_path] = (u8)odm_get_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK);663664RF_DBG(dm, DBG_RF_TX_PWR_TRACK,665"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",666cali_info->absolute_ofdm_swing_idx[667rf_path],668cali_info->bb_swing_idx_ofdm[rf_path]);669670tx_power_index_offest = 63 - tx_power_index;671672rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, offset_vaule, tx_power_index_offest);673674RF_DBG(dm, DBG_RF_TX_PWR_TRACK,675" tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n",676cali_info->absolute_ofdm_swing_idx[677rf_path],678cali_info->bb_swing_idx_ofdm[rf_path],679rtn);680681if (rtn == true) {682odm_set_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);683odm_set_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/684} else685RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "TXAGC And BB Swing are the same path=%d\n", rf_path);686687RF_DBG(dm, DBG_RF_TX_PWR_TRACK,688" ========================================================\n");689690RF_DBG(dm, DBG_RF_TX_PWR_TRACK,691" OffsetValue(0XD2C)=0X%X TXAGC(REG_A_TX_AGC)=0X%X 0XC1C(PathC BBSwing)(%d)=0X%X\n",692odm_get_bb_reg(dm, R_0xd2c,693BIT(29) | BIT(28) | BIT(27) | BIT(26) |694BIT(25) | BIT(24)),695odm_get_bb_reg(dm, REG_A_TX_AGC,696TXAGC_BITMASK),697cali_info->bb_swing_idx_ofdm[rf_path],698odm_get_bb_reg(dm, REG_A_BBSWING,699BBSWING_BITMASK));700701RF_DBG(dm, DBG_RF_TX_PWR_TRACK,702" 0X55[13:9]=0X%X 0X56=0X%X\n",703odm_get_rf_reg(dm, (enum rf_path)rf_path,7040X55,705BIT(13) | BIT(12) | BIT(11) | BIT(10) |706BIT(9)),707odm_get_rf_reg(dm, (enum rf_path)rf_path,7080X56, 0XFFFFFFFF));709710RF_DBG(dm, DBG_RF_TX_PWR_TRACK,711" ========================================================\n");712713} else714RF_DBG(dm, DBG_RF_TX_PWR_TRACK,715" TSSI does not Calculate Finish\n");716717break;718719case RF_PATH_B:720/*Disable path A TSSI Circuit*/721odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 0);722/*Enable path B TSSI Circuit*/723odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 1);724725/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/726tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path)rf_path);727728odm_set_rf_reg(dm, (enum rf_path)rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);729730/*Write BB 0xE8C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/731odm_set_bb_reg(dm, R_0xe8c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);732733odm_set_bb_reg(dm, R_0xe8c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);734735/*Write BB TXAGC Initial Power index for EEPROM*/736tx_power_index = phy_get_tx_power_index_8814a(adapter, (enum rf_path)rf_path, tx_rate, band_width, channel);737odm_set_bb_reg(dm, R_0xe8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);738739RF_DBG(dm, DBG_RF_TX_PWR_TRACK,740"Call %s tx_power_index=%d rf_path=%d tx_rate=%d band_width=%d channel=%d 0x65[19:15]=0X%X 0x65[11:10]=0X%X\n",741__func__,742odm_get_bb_reg(dm, R_0xe8c,743BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) |744BIT(1) | BIT(0)), rf_path, tx_rate, band_width,745channel,746odm_get_rf_reg(dm, (enum rf_path)rf_path,747RF_0x65,748BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),749odm_get_rf_reg(dm, (enum rf_path)rf_path,750RF_0x65, BIT(11) | BIT(10)));751752/*Disable BB TSSI Power Tracking*/753odm_set_bb_reg(dm, R_0xe8c, BIT(7), 0);754/*Enable path B TSSI Circuit*/755odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 1);756/*Enable BB TSSI Power Tracking*/757odm_set_bb_reg(dm, R_0xe8c, BIT(7), 1);758759/* delay_us(500);*/760wait_tx_agc_offset_timer = 0;761762while ((odm_get_bb_reg(dm, R_0xd6c, BIT(30)) != 1) && ((tx_path & 4) == 4)) {763wait_tx_agc_offset_timer++;764765if (wait_tx_agc_offset_timer >= 1000)766break;767}768769/*Read the offset value at BB Reg.*/770offset_vaule = odm_get_bb_reg(dm, R_0xd6c, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));771772tssi_function = odm_get_bb_reg(dm, R_0xd6c, BIT(30));773774RF_DBG(dm, DBG_RF_TX_PWR_TRACK,775"Call %s 0XD6C tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n",776__func__, tssi_function, offset_vaule, rf_path);777778/*Disable BB TSSI Power Tracking*/779odm_set_bb_reg(dm, R_0xe8c, BIT(7), 0);780/*Disable path B TSSI Circuit*/781odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 0);782783if (tssi_function == 1) {784txbb_swing = odm_get_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK);785786for (i = 0; i <= 36; i++) {787if (txbb_swing == tx_scaling_table_jaguar[i]) {788cali_info->bb_swing_idx_ofdm[rf_path] = i;789RF_DBG(dm, DBG_RF_TX_PWR_TRACK, " PathB txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);790break;791792} else793cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;794}795796cali_info->absolute_ofdm_swing_idx[rf_path] = (u8)odm_get_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK);797798RF_DBG(dm, DBG_RF_TX_PWR_TRACK,799"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",800cali_info->absolute_ofdm_swing_idx[801rf_path],802cali_info->bb_swing_idx_ofdm[rf_path]);803804tx_power_index_offest = 63 - tx_power_index;805806rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, offset_vaule, tx_power_index_offest);807808RF_DBG(dm, DBG_RF_TX_PWR_TRACK,809" tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n",810cali_info->absolute_ofdm_swing_idx[811rf_path],812cali_info->bb_swing_idx_ofdm[rf_path],813rtn);814815if (rtn == true) {816odm_set_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);817odm_set_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/818} else819RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "TXAGC And BB Swing are the same path=%d\n", rf_path);820821RF_DBG(dm, DBG_RF_TX_PWR_TRACK,822" ========================================================\n");823824RF_DBG(dm, DBG_RF_TX_PWR_TRACK,825" OffsetValue(0XD6C)=0X%X TXAGC(REG_B_TX_AGC)=0X%X 0XE1C(PathB BBSwing)(%d)=0X%X\n",826odm_get_bb_reg(dm, R_0xd6c,827BIT(29) | BIT(28) | BIT(27) | BIT(26) |828BIT(25) | BIT(24)),829odm_get_bb_reg(dm, REG_B_TX_AGC,830TXAGC_BITMASK),831cali_info->bb_swing_idx_ofdm[rf_path],832odm_get_bb_reg(dm, REG_B_BBSWING,833BBSWING_BITMASK));834835RF_DBG(dm, DBG_RF_TX_PWR_TRACK,836" 0X55[13:9]=0X%X 0X56=0X%X\n",837odm_get_rf_reg(dm, (enum rf_path)rf_path,8380X55,839BIT(13) | BIT(12) | BIT(11) | BIT(10) |840BIT(9)),841odm_get_rf_reg(dm, (enum rf_path)rf_path,8420X56, 0XFFFFFFFF));843844RF_DBG(dm, DBG_RF_TX_PWR_TRACK,845" ========================================================\n");846847} else848RF_DBG(dm, DBG_RF_TX_PWR_TRACK,849" TSSI does not Calculate Finish\n");850851break;852853case RF_PATH_C:854/*Disable path D TSSI Circuit*/855odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 0);856/*Enable path C TSSI Circuit*/857odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 1);858859/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/860tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path)rf_path);861862odm_set_rf_reg(dm, (enum rf_path)rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);863864/*Write BB 0x188C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/865odm_set_bb_reg(dm, R_0x188c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);866867odm_set_bb_reg(dm, R_0x188c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);868869/*Write BB TXAGC Initial Power index for EEPROM*/870tx_power_index = phy_get_tx_power_index_8814a(adapter, (enum rf_path)rf_path, tx_rate, band_width, channel);871odm_set_bb_reg(dm, R_0x188c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);872873RF_DBG(dm, DBG_RF_TX_PWR_TRACK,874"Call %s tx_power_index=%d rf_path=%d tx_rate=%d band_width=%d channel=%d 0x65[19:15]=0X%X 0x65[11:10]=0X%X\n",875__func__,876odm_get_bb_reg(dm, R_0x188c,877BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) |878BIT(1) | BIT(0)), rf_path, tx_rate, band_width,879channel,880odm_get_rf_reg(dm, (enum rf_path)rf_path,881RF_0x65,882BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),883odm_get_rf_reg(dm, (enum rf_path)rf_path,884RF_0x65, BIT(11) | BIT(10)));885886/*Disable BB TSSI Power Tracking*/887odm_set_bb_reg(dm, R_0x188c, BIT(7), 0);888/*Enable path C TSSI Circuit*/889odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 1);890/*Enable BB TSSI Power Tracking*/891odm_set_bb_reg(dm, R_0x188c, BIT(7), 1);892893/* delay_us(500);*/894wait_tx_agc_offset_timer = 0;895896while ((odm_get_bb_reg(dm, R_0xdac, BIT(30)) != 1) && ((tx_path & 2) == 2)) {897wait_tx_agc_offset_timer++;898899if (wait_tx_agc_offset_timer >= 1000)900break;901}902903/*Read the offset value at BB Reg.*/904offset_vaule = odm_get_bb_reg(dm, R_0xdac, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));905906tssi_function = odm_get_bb_reg(dm, R_0xdac, BIT(30));907908RF_DBG(dm, DBG_RF_TX_PWR_TRACK,909"Call %s 0XDAC tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n",910__func__, tssi_function, offset_vaule, rf_path);911912/*Disable BB TSSI Power Tracking*/913odm_set_bb_reg(dm, R_0x188c, BIT(7), 0);914/*Disable path C TSSI Circuit*/915odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 0);916917if (tssi_function == 1) {918txbb_swing = odm_get_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK);919920for (i = 0; i <= 36; i++) {921if (txbb_swing == tx_scaling_table_jaguar[i]) {922cali_info->bb_swing_idx_ofdm[rf_path] = i;923RF_DBG(dm, DBG_RF_TX_PWR_TRACK, " PathC txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);924break;925926} else927cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;928}929930cali_info->absolute_ofdm_swing_idx[rf_path] = (u8)odm_get_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK);931932RF_DBG(dm, DBG_RF_TX_PWR_TRACK,933"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",934cali_info->absolute_ofdm_swing_idx[935rf_path],936cali_info->bb_swing_idx_ofdm[rf_path]);937938tx_power_index_offest = 63 - tx_power_index;939940rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, offset_vaule, tx_power_index_offest);941942RF_DBG(dm, DBG_RF_TX_PWR_TRACK,943" tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n",944cali_info->absolute_ofdm_swing_idx[945rf_path],946cali_info->bb_swing_idx_ofdm[rf_path],947rtn);948949if (rtn == true) {950odm_set_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);951odm_set_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/952} else953RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "TXAGC And BB Swing are the same path=%d\n", rf_path);954955RF_DBG(dm, DBG_RF_TX_PWR_TRACK,956" ========================================================\n");957958RF_DBG(dm, DBG_RF_TX_PWR_TRACK,959" OffsetValue(0XDAC)=0X%X TXAGC(REG_C_TX_AGC)=0X%X 0X181C(PathC BBSwing)(%d)=0X%X\n",960odm_get_bb_reg(dm, R_0xdac,961BIT(29) | BIT(28) | BIT(27) | BIT(26) |962BIT(25) | BIT(24)),963odm_get_bb_reg(dm, REG_C_TX_AGC,964TXAGC_BITMASK),965cali_info->bb_swing_idx_ofdm[rf_path],966odm_get_bb_reg(dm, REG_C_BBSWING,967BBSWING_BITMASK));968969RF_DBG(dm, DBG_RF_TX_PWR_TRACK,970" 0X55[13:9]=0X%X 0X56=0X%X\n",971odm_get_rf_reg(dm, (enum rf_path)rf_path,9720X55,973BIT(13) | BIT(12) | BIT(11) | BIT(10) |974BIT(9)),975odm_get_rf_reg(dm, (enum rf_path)rf_path,9760X56, 0XFFFFFFFF));977978RF_DBG(dm, DBG_RF_TX_PWR_TRACK,979" ========================================================\n");980981} else982RF_DBG(dm, DBG_RF_TX_PWR_TRACK,983" TSSI does not Calculate Finish\n");984985break;986987case RF_PATH_D:988/*Disable path C TSSI Circuit*/989odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 0);990/*Enable path D TSSI Circuit*/991odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 1);992993/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/994tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path)rf_path);995996odm_set_rf_reg(dm, (enum rf_path)rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);997998/*Write BB 0x1A8C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/999odm_set_bb_reg(dm, R_0x1a8c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);10001001odm_set_bb_reg(dm, R_0x1a8c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);10021003/*Write BB TXAGC Initial Power index for EEPROM*/1004tx_power_index = phy_get_tx_power_index_8814a(adapter, (enum rf_path)rf_path, tx_rate, band_width, channel);1005odm_set_bb_reg(dm, R_0x1a8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);10061007RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1008"Call %s tx_power_index=%d rf_path=%d tx_rate=%d band_width=%d channel=%d 0x65[19:15]=0X%X 0x65[11:10]=0X%X\n",1009__func__,1010odm_get_bb_reg(dm, R_0x1a8c,1011BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) |1012BIT(1) | BIT(0)), rf_path, tx_rate, band_width,1013channel,1014odm_get_rf_reg(dm, (enum rf_path)rf_path,1015RF_0x65,1016BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),1017odm_get_rf_reg(dm, (enum rf_path)rf_path,1018RF_0x65, BIT(11) | BIT(10)));10191020/*Disable BB TSSI Power Tracking*/1021odm_set_bb_reg(dm, R_0x1a8c, BIT(7), 0);1022/*Enable path D TSSI Circuit*/1023odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 1);1024/*Enable BB TSSI Power Tracking*/1025odm_set_bb_reg(dm, R_0x1a8c, BIT(7), 1);10261027/* delay_us(500);*/1028wait_tx_agc_offset_timer = 0;10291030while ((odm_get_bb_reg(dm, R_0xdec, BIT(30)) != 1) && ((tx_path & 1) == 1)) {1031wait_tx_agc_offset_timer++;10321033if (wait_tx_agc_offset_timer >= 1000)1034break;1035}10361037/*Read the offset value at BB Reg.*/1038offset_vaule = odm_get_bb_reg(dm, R_0xdec, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));10391040tssi_function = odm_get_bb_reg(dm, R_0xdec, BIT(30));10411042RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1043"Call %s 0XDEC tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n",1044__func__, tssi_function, offset_vaule, rf_path);10451046/*Disable BB TSSI Power Tracking*/1047odm_set_bb_reg(dm, R_0x1a8c, BIT(7), 0);1048/*Disable path D TSSI Circuit*/1049odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 0);10501051if (tssi_function == 1) {1052txbb_swing = odm_get_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK);10531054for (i = 0; i <= 36; i++) {1055if (txbb_swing == tx_scaling_table_jaguar[i]) {1056cali_info->bb_swing_idx_ofdm[rf_path] = i;1057RF_DBG(dm, DBG_RF_TX_PWR_TRACK, " PathD txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);1058break;10591060} else1061cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;1062}10631064cali_info->absolute_ofdm_swing_idx[rf_path] = (u8)odm_get_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK);10651066RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1067"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n",1068cali_info->absolute_ofdm_swing_idx[1069rf_path],1070cali_info->bb_swing_idx_ofdm[rf_path]);10711072tx_power_index_offest = 63 - tx_power_index;10731074rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, offset_vaule, tx_power_index_offest);10751076RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1077" tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n",1078cali_info->absolute_ofdm_swing_idx[1079rf_path],1080cali_info->bb_swing_idx_ofdm[rf_path],1081rtn);10821083if (rtn == true) {1084odm_set_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1085odm_set_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1086} else1087RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "TXAGC And BB Swing are the same path=%d\n", rf_path);10881089RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1090" ========================================================\n");10911092RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1093" OffsetValue(0XDEC)=0X%X TXAGC(REG_D_TX_AGC)=0X%X 0X1A1C(PathD BBSwing)(%d)=0X%X\n",1094odm_get_bb_reg(dm, R_0xdec,1095BIT(29) | BIT(28) | BIT(27) | BIT(26) |1096BIT(25) | BIT(24)),1097odm_get_bb_reg(dm, REG_D_TX_AGC,1098TXAGC_BITMASK),1099cali_info->bb_swing_idx_ofdm[rf_path],1100odm_get_bb_reg(dm, REG_D_BBSWING,1101BBSWING_BITMASK));11021103RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1104" 0X55[13:9]=0X%X 0X56=0X%X\n",1105odm_get_rf_reg(dm, (enum rf_path)rf_path,11060X55,1107BIT(13) | BIT(12) | BIT(11) | BIT(10) |1108BIT(9)),1109odm_get_rf_reg(dm, (enum rf_path)rf_path,11100X56, 0XFFFFFFFF));11111112RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1113" ========================================================\n");11141115} else1116RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1117" TSSI does not Calculate Finish\n");11181119break;11201121default:1122RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1123"Wrong path name!!!!\n");11241125break;1126}1127}1128}11291130boolean get_mix_mode_tx_agc_bb_swing_offset(struct dm_struct *dm,1131enum pwrtrack_method method,1132u8 rf_path,1133u8 tx_power_index_offest)1134{1135struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);11361137u8 bb_swing_upper_bound = cali_info->default_ofdm_index + 10;1138u8 bb_swing_lower_bound = 0;11391140s8 tx_agc_index = 0;1141u8 tx_bb_swing_index = cali_info->default_ofdm_index;11421143RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1144"Path_%d cali_info->absolute_ofdm_swing_idx[rf_path]=%d, tx_power_index_offest=%d\n",1145rf_path, cali_info->absolute_ofdm_swing_idx[rf_path],1146tx_power_index_offest);11471148if (tx_power_index_offest > 0XF)1149tx_power_index_offest = 0XF;11501151if (cali_info->absolute_ofdm_swing_idx[rf_path] >= 0 && cali_info->absolute_ofdm_swing_idx[rf_path] <= tx_power_index_offest) {1152tx_agc_index = cali_info->absolute_ofdm_swing_idx[rf_path];1153tx_bb_swing_index = cali_info->default_ofdm_index;1154} else if (cali_info->absolute_ofdm_swing_idx[rf_path] > tx_power_index_offest) {1155tx_agc_index = tx_power_index_offest;1156cali_info->remnant_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] - tx_power_index_offest;1157tx_bb_swing_index = cali_info->default_ofdm_index + cali_info->remnant_ofdm_swing_idx[rf_path];11581159if (tx_bb_swing_index > bb_swing_upper_bound)1160tx_bb_swing_index = bb_swing_upper_bound;1161} else {1162tx_agc_index = 0;11631164if (cali_info->default_ofdm_index > (cali_info->absolute_ofdm_swing_idx[rf_path] * (-1)))1165tx_bb_swing_index = cali_info->default_ofdm_index + cali_info->absolute_ofdm_swing_idx[rf_path];1166else1167tx_bb_swing_index = bb_swing_lower_bound;11681169if (tx_bb_swing_index < bb_swing_lower_bound)1170tx_bb_swing_index = bb_swing_lower_bound;1171}11721173cali_info->absolute_ofdm_swing_idx[rf_path] = tx_agc_index;1174cali_info->bb_swing_idx_ofdm[rf_path] = tx_bb_swing_index;11751176RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1177"MixMode Offset Path_%d cali_info->absolute_ofdm_swing_idx[rf_path]=%d cali_info->bb_swing_idx_ofdm[rf_path]=%d tx_power_index_offest=%d\n",1178rf_path, cali_info->absolute_ofdm_swing_idx[rf_path],1179cali_info->bb_swing_idx_ofdm[rf_path], tx_power_index_offest);11801181return true;1182}11831184void power_tracking_by_mix_mode(struct dm_struct *dm,1185enum pwrtrack_method method, u8 rf_path)1186{1187struct _ADAPTER *adapter = dm->adapter;1188HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);1189struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);1190struct _hal_rf_ *rf = &(dm->rf_table);11911192u8 tx_rate = 0xFF;1193u8 channel = *dm->channel;1194u8 band_width = hal_data->current_channel_bw;1195u8 tx_power_index_offest = 0;1196u8 tx_power_index = 0;11971198if (*dm->mp_mode == true) {1199#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1200#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1201#if (MP_DRIVER == 1)1202PMPT_CONTEXT p_mpt_ctx = &(adapter->mpt_ctx);12031204tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1205#endif1206#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1207#ifdef CONFIG_MP_INCLUDED1208PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);12091210tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1211#endif1212#endif1213#endif1214} else {1215u16 rate = *(dm->forced_data_rate);12161217if (!rate) { /*auto rate*/1218#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1219tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);1220#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1221if (dm->number_linked_client != 0)1222tx_rate = hw_rate_to_m_rate(dm->tx_rate);1223else1224tx_rate = rf->p_rate_index;1225#endif1226} else /*force rate*/1227tx_rate = (u8)rate;1228}12291230RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__,1231tx_rate);12321233if ((cali_info->power_index_offset[RF_PATH_A] != 0 ||1234cali_info->power_index_offset[RF_PATH_B] != 0 ||1235cali_info->power_index_offset[RF_PATH_C] != 0 ||1236cali_info->power_index_offset[RF_PATH_D] != 0) &&1237cali_info->txpowertrack_control && hal_data->eeprom_thermal_meter != 0xff) {1238RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1239"****************Path_%d POWER Tracking MIX MODE**********\n",1240rf_path);12411242tx_power_index = phy_get_tx_power_index_8814a(adapter, (enum rf_path)rf_path, tx_rate, band_width, channel);1243tx_power_index_offest = 63 - tx_power_index;12441245RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1246"cali_info->absolute_ofdm_swing_idx[%d] =%d tx_power_index=%d\n",1247rf_path, cali_info->absolute_ofdm_swing_idx[rf_path],1248tx_power_index);12491250switch (rf_path) {1251case RF_PATH_A:1252get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, tx_power_index_offest);1253odm_set_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1254odm_set_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1255break;12561257case RF_PATH_B:1258get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, tx_power_index_offest);1259odm_set_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1260odm_set_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1261break;12621263case RF_PATH_C:1264get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, tx_power_index_offest);1265odm_set_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1266odm_set_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1267break;12681269case RF_PATH_D:1270get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path)rf_path, tx_power_index_offest);1271odm_set_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1272odm_set_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1273break;12741275default:1276RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1277"Wrong path name!!!!\n");1278break;1279}1280} else1281RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1282"Power index is the same, eeprom_thermal_meter = 0XFF or txpowertrack_control is Disable !!!!\n");1283}12841285void power_tracking_by_tssi_mode(struct dm_struct *dm,1286enum pwrtrack_method method, u8 rf_path)1287{1288RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1289"****************Path_%d POWER Tracking TSSI_MODE**********\n",1290rf_path);12911292set_tx_agc_bb_swing_offset(dm, TSSI_MODE, (enum rf_path)rf_path);12931294RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1295"****************Path_%d End POWER Tracking TSSI_MODE**********\n",1296rf_path);12971298RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n");1299}13001301void odm_tx_pwr_track_set_pwr8814a(void *dm_void, enum pwrtrack_method method,1302u8 rf_path, u8 channel_mapped_index)1303{1304struct dm_struct *dm = (struct dm_struct *)dm_void;1305void *adapter = dm->adapter;1306PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);13071308u8 final_ofdm_swing_index = 0;1309u8 channel = *dm->channel;1310struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);13111312/*K-Free*/1313#if 01314s8 txbb_index = 0;1315s8 txbb_upper_bound = 10, txbb_lower_bound = -5;13161317txbb_index = cali_info->kfree_offset[rf_path] / 2;13181319if (txbb_index > txbb_upper_bound)1320txbb_index = txbb_upper_bound;1321else if (txbb_index < txbb_lower_bound)1322txbb_index = txbb_lower_bound;13231324if (txbb_index >= 0) {1325odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19), 1);1326odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, (BIT(18) | BIT17 | BIT16 | BIT15), txbb_index); /*set RF Reg0x55 per path*/1327} else {1328odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19), 0);1329odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, (BIT(18) | BIT(17) | BIT(16) | BIT(15)), (-1) * txbb_index);1330}13311332#endif13331334if (method == TXAGC) {1335RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1336"****************Path_%d POWER Tracking No TXAGC MODE**********\n",1337rf_path);13381339RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1340"cali_info->absolute_ofdm_swing_idx[%d] =%d\n", rf_path,1341cali_info->absolute_ofdm_swing_idx[rf_path]);1342} else if (method == TSSI_MODE)1343power_tracking_by_tssi_mode(dm, TSSI_MODE, (enum rf_path)rf_path);1344else if (method == BBSWING) { /*use for mp driver clean power tracking status*/1345switch (rf_path) {1346case RF_PATH_A:1347odm_set_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1348odm_set_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1349break;13501351case RF_PATH_B:1352odm_set_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1353odm_set_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1354break;13551356case RF_PATH_C:1357odm_set_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1358odm_set_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1359break;13601361case RF_PATH_D:1362odm_set_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1363odm_set_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1364break;13651366default:1367RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1368"Wrong path name!!!!\n");13691370break;1371}13721373RF_DBG(dm, DBG_RF_TX_PWR_TRACK,1374"rf_path=%d Clear 8814 Power tracking TXAGC=%d BBSwing=%d\n",1375rf_path, cali_info->absolute_ofdm_swing_idx[rf_path],1376cali_info->bb_swing_idx_ofdm[rf_path]);13771378} else if (method == MIX_MODE)1379power_tracking_by_mix_mode(dm, MIX_MODE, (enum rf_path)rf_path);1380else if (method == MIX_2G_TSSI_5G_MODE) {1381if (channel <= 14)1382power_tracking_by_mix_mode(dm, MIX_MODE, (enum rf_path)rf_path);1383else1384power_tracking_by_tssi_mode(dm, TSSI_MODE, (enum rf_path)rf_path);1385} else if (method == MIX_5G_TSSI_2G_MODE) {1386if (channel <= 14)1387power_tracking_by_tssi_mode(dm, TSSI_MODE, (enum rf_path)rf_path);1388else1389power_tracking_by_mix_mode(dm, MIX_MODE, (enum rf_path)rf_path);1390}1391} /*odm_tx_pwr_track_set_pwr8814a*/13921393void get_delta_swing_table_8814a(void *dm_void, u8 **temperature_up_a,1394u8 **temperature_down_a, u8 **temperature_up_b,1395u8 **temperature_down_b)1396{1397struct dm_struct *dm = (struct dm_struct *)dm_void;1398struct _ADAPTER *adapter = dm->adapter;1399struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);1400struct _hal_rf_ *rf = &(dm->rf_table);1401HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);1402u8 tx_rate = 0xFF;1403u8 channel = *dm->channel;14041405if (*dm->mp_mode == true) {1406#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1407#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1408#if (MP_DRIVER == 1)1409PMPT_CONTEXT p_mpt_ctx = &(adapter->mpt_ctx);14101411tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1412#endif1413#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1414#ifdef CONFIG_MP_INCLUDED1415PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);14161417tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1418#endif1419#endif1420#endif1421} else {1422u16 rate = *(dm->forced_data_rate);14231424if (!rate) { /*auto rate*/1425#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1426tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);1427#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1428if (dm->number_linked_client != 0)1429tx_rate = hw_rate_to_m_rate(dm->tx_rate);1430else1431tx_rate = rf->p_rate_index;1432#endif1433} else /*force rate*/1434tx_rate = (u8)rate;1435}14361437RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__,1438tx_rate);14391440if (1 <= channel && channel <= 14) {1441if (IS_CCK_RATE(tx_rate)) {1442*temperature_up_a = cali_info->delta_swing_table_idx_2g_cck_a_p;1443*temperature_down_a = cali_info->delta_swing_table_idx_2g_cck_a_n;1444*temperature_up_b = cali_info->delta_swing_table_idx_2g_cck_b_p;1445*temperature_down_b = cali_info->delta_swing_table_idx_2g_cck_b_n;1446} else {1447*temperature_up_a = cali_info->delta_swing_table_idx_2ga_p;1448*temperature_down_a = cali_info->delta_swing_table_idx_2ga_n;1449*temperature_up_b = cali_info->delta_swing_table_idx_2gb_p;1450*temperature_down_b = cali_info->delta_swing_table_idx_2gb_n;1451}1452} else if (36 <= channel && channel <= 64) {1453*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[0];1454*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[0];1455*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[0];1456*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[0];1457} else if (100 <= channel && channel <= 144) {1458*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[1];1459*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[1];1460*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[1];1461*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[1];1462} else if (149 <= channel && channel <= 177) {1463*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[2];1464*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[2];1465*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[2];1466*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[2];1467} else {1468*temperature_up_a = (u8 *)delta_swing_table_idx_2ga_p_8188e;1469*temperature_down_a = (u8 *)delta_swing_table_idx_2ga_n_8188e;1470*temperature_up_b = (u8 *)delta_swing_table_idx_2ga_p_8188e;1471*temperature_down_b = (u8 *)delta_swing_table_idx_2ga_n_8188e;1472}14731474return;1475}14761477void get_delta_swing_table_8814a_path_cd(void *dm_void, u8 **temperature_up_c,1478u8 **temperature_down_c,1479u8 **temperature_up_d,1480u8 **temperature_down_d)1481{1482struct dm_struct *dm = (struct dm_struct *)dm_void;1483struct _ADAPTER *adapter = dm->adapter;1484struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);1485struct _hal_rf_ *rf = &(dm->rf_table);1486HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);1487u8 tx_rate = 0xFF;1488u8 channel = *dm->channel;14891490if (*dm->mp_mode == true) {1491#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1492#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1493#if (MP_DRIVER == 1)1494PMPT_CONTEXT p_mpt_ctx = &(adapter->mpt_ctx);14951496tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1497#endif1498#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1499#ifdef CONFIG_MP_INCLUDED1500PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);15011502tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1503#endif1504#endif1505#endif1506} else {1507u16 rate = *(dm->forced_data_rate);15081509if (!rate) { /*auto rate*/1510#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1511tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);1512#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1513if (dm->number_linked_client != 0)1514tx_rate = hw_rate_to_m_rate(dm->tx_rate);1515else1516tx_rate = rf->p_rate_index;1517#endif1518} else /*force rate*/1519tx_rate = (u8)rate;1520}15211522RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__,1523tx_rate);15241525if (1 <= channel && channel <= 14) {1526if (IS_CCK_RATE(tx_rate)) {1527*temperature_up_c = cali_info->delta_swing_table_idx_2g_cck_c_p;1528*temperature_down_c = cali_info->delta_swing_table_idx_2g_cck_c_n;1529*temperature_up_d = cali_info->delta_swing_table_idx_2g_cck_d_p;1530*temperature_down_d = cali_info->delta_swing_table_idx_2g_cck_d_n;1531} else {1532*temperature_up_c = cali_info->delta_swing_table_idx_2gc_p;1533*temperature_down_c = cali_info->delta_swing_table_idx_2gc_n;1534*temperature_up_d = cali_info->delta_swing_table_idx_2gd_p;1535*temperature_down_d = cali_info->delta_swing_table_idx_2gd_n;1536}1537} else if (36 <= channel && channel <= 64) {1538*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[0];1539*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[0];1540*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[0];1541*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[0];1542} else if (100 <= channel && channel <= 144) {1543*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[1];1544*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[1];1545*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[1];1546*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[1];1547} else if (149 <= channel && channel <= 177) {1548*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[2];1549*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[2];1550*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[2];1551*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[2];1552} else {1553*temperature_up_c = (u8 *)delta_swing_table_idx_2ga_p_8188e;1554*temperature_down_c = (u8 *)delta_swing_table_idx_2ga_n_8188e;1555*temperature_up_d = (u8 *)delta_swing_table_idx_2ga_p_8188e;1556*temperature_down_d = (u8 *)delta_swing_table_idx_2ga_n_8188e;1557}15581559return;1560}15611562void configure_txpower_track_8814a(struct txpwrtrack_cfg *config)1563{1564config->swing_table_size_cck = CCK_TABLE_SIZE;1565config->swing_table_size_ofdm = OFDM_TABLE_SIZE;1566config->threshold_iqk = 8;1567config->average_thermal_num = AVG_THERMAL_NUM_8814A;1568config->rf_path_count = MAX_PATH_NUM_8814A;1569config->thermal_reg_addr = RF_T_METER_88E;15701571config->odm_tx_pwr_track_set_pwr = odm_tx_pwr_track_set_pwr8814a;1572config->do_iqk = do_iqk_8814a;1573config->phy_lc_calibrate = halrf_lck_trigger;1574config->get_delta_swing_table = get_delta_swing_table_8814a;1575config->get_delta_swing_table8814only = get_delta_swing_table_8814a_path_cd;1576}15771578void _phy_lc_calibrate_8814a(struct dm_struct *dm, boolean is2T)1579{1580u32 /*rf_amode=0, rf_bmode=0,*/ lc_cal = 0, tmp = 0, cnt;15811582/* Check continuous TX and Packet TX */1583u32 reg0x914 = odm_read_4byte(dm, REG_SINGLE_TONE_CONT_TX_JAGUAR);1584;15851586/* Backup RF reg18. */15871588if ((reg0x914 & 0x70000) == 0)1589odm_write_1byte(dm, REG_TXPAUSE, 0xFF);15901591/* 3 3. Read RF reg18 */1592lc_cal = odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK);15931594/* 3 4. Set LC calibration begin bit15 */1595odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, 0x1b126);15961597ODM_delay_ms(100);15981599for (cnt = 0; cnt < 100; cnt++) {1600if (odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)1601break;1602ODM_delay_ms(10);1603}1604RF_DBG(dm, DBG_RF_IQK, "retry cnt = %d\n", cnt);16051606odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, 0x13126);1607odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, 0x13124);1608/* 3 Restore original situation */1609if ((reg0x914 & 70000) == 0)1610odm_write_1byte(dm, REG_TXPAUSE, 0x00);16111612/* Recover channel number */1613odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal);16141615pr_debug("Call %s\n", __FUNCTION__);1616}16171618void _phy_ap_calibrate_8814a(1619#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1620struct dm_struct *dm,1621#else1622void *adapter,1623#endif1624s8 delta, boolean is2T)1625{1626}16271628void phy_lc_calibrate_8814a(void *dm_void)1629{1630struct dm_struct *dm = (struct dm_struct *)dm_void;16311632_phy_lc_calibrate_8814a(dm, true);1633}16341635void phy_ap_calibrate_8814a(1636#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1637struct dm_struct *dm,1638#else1639void *adapter,1640#endif1641s8 delta)1642{1643}16441645void phy_dp_calibrate_8814a(struct dm_struct *dm)1646{1647}16481649boolean1650_phy_query_rf_path_switch_8814a(void *adapter)1651{1652return true;1653}16541655boolean phy_query_rf_path_switch_8814a(void *adapter)1656{1657HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);16581659#if DISABLE_BB_RF1660return true;1661#endif16621663return _phy_query_rf_path_switch_8814a(adapter);1664}16651666void _phy_set_rf_path_switch_8814a(1667#if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE))1668struct dm_struct *dm,1669#else1670void *adapter,1671#endif1672boolean is_main, boolean is2T)1673{1674}1675void phy_set_rf_path_switch_8814a(1676#if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE))1677struct dm_struct *dm,1678#else1679void *adapter,1680#endif1681boolean is_main)1682{1683}16841685#endif /* (RTL8814A_SUPPORT == 0)*/168616871688