Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/rtl8814a/halrf_8814a_win.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"1617#if RT_PLATFORM==PLATFORM_MACOSX18#include "phydm_precomp.h"19#else20#include "../phydm_precomp.h"21#endif22#if (RTL8814A_SUPPORT == 1)232425/*---------------------------Define Local Constant---------------------------*/26/* 2010/04/25 MH Define the max tx power tracking tx agc power. */27#define ODM_TXPWRTRACK_MAX_IDX_8814A 62829/*---------------------------Define Local Constant---------------------------*/3031/*3============================================================*/32/* 3 Tx Power Tracking33*3============================================================*/34#define REG_A_TX_AGC 0xC9435#define REG_B_TX_AGC 0xE9436#define REG_C_TX_AGC 0x189437#define REG_D_TX_AGC 0x1A9438#define TXAGC_BITMASK (BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25))39#define REG_A_BBSWING 0xC1C40#define REG_B_BBSWING 0xE1C41#define REG_C_BBSWING 0x181C42#define REG_D_BBSWING 0x1A1C43#define BBSWING_BITMASK 0xFFE00000444546#if 04748u8 check_rf_gain_offset(49struct dm_struct *dm,50enum pwrtrack_method method,51u8 rf_path52)53{54s8 upper_bound = 10, lower_bound = -5; /*4'b1010 = 10*/55s8 final_rf_index = 0;56boolean is_positive = false;57u32 bit_mask = 0;58u8 final_ofdm_swing_index = 0, tx_scaling_upper_bound = 28, tx_scaling_lower_bound = 4; /*upper bound +2dB, lower bound -10dB*/59struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);6061if (method == MIX_MODE) { /*normal Tx power tracking*/62RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "is 8814 MP chip\n");63bit_mask = BIT(19);64cali_info->absolute_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] + cali_info->kfree_offset[rf_path];6566if (cali_info->absolute_ofdm_swing_idx[rf_path] >= 0) /*check if RF_Index is positive or not*/67is_positive = true;68else69is_positive = false;7071odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, is_positive);7273bit_mask = BIT(18) | BIT(17) | BIT(16) | BIT(15);74final_rf_index = cali_info->absolute_ofdm_swing_idx[rf_path] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/7576}7778if (final_rf_index > upper_bound) { /*Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB*/79odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, upper_bound); /*set RF Reg0x55 per path*/8081final_ofdm_swing_index = cali_info->default_ofdm_index + (cali_info->absolute_ofdm_swing_idx[rf_path] - (upper_bound << 1));8283if (final_ofdm_swing_index > tx_scaling_upper_bound) /*bb swing upper bound = +2dB*/84final_ofdm_swing_index = tx_scaling_upper_bound;8586RF_DBG(dm, DBG_RF_TX_PWR_TRACK,87"******path-%d Compensate with TXBB = %d\n", rf_path, upper_bound);8889return final_ofdm_swing_index;90} else if (final_rf_index < lower_bound) { /*lower bound = -5dB*/91odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, (-1) * (lower_bound)); /*set RF Reg0x55 per path*/9293final_ofdm_swing_index = cali_info->default_ofdm_index - ((lower_bound << 1) - cali_info->absolute_ofdm_swing_idx[rf_path]);9495if (final_ofdm_swing_index < tx_scaling_lower_bound) /*bb swing lower bound = -10dB*/96final_ofdm_swing_index = tx_scaling_lower_bound;9798return final_ofdm_swing_index;99100} else { /*normal case*/101102if (is_positive == true)103odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, final_rf_index); /*set RF Reg0x55 per path*/104else105odm_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*/106107final_ofdm_swing_index = cali_info->default_ofdm_index + (cali_info->absolute_ofdm_swing_idx[rf_path]) % 2;108return final_ofdm_swing_index;109}110111return false;112}113114#endif115116u8 get_tssivalue(117struct dm_struct *dm,118enum pwrtrack_method method,119u8 rf_path120)121{122123struct _ADAPTER *adapter = dm->adapter;124struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);125HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));126127s8 power_by_rate_value = 0;128u8 tx_num, tssi_value = 0;129u8 channel = *dm->channel;130u8 band_width = hal_data->CurrentChannelBW;131u8 tx_rate = 0xFF;132u8 tx_limit = 0;133u8 reg_pwr_tbl_sel = 0;134135#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))136#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)137PMGNT_INFO mgnt_info = &(((PADAPTER)adapter)->MgntInfo);138139reg_pwr_tbl_sel = mgnt_info->RegPwrTblSel;140#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)141reg_pwr_tbl_sel = adapter->registrypriv.reg_pwr_tbl_sel;142#endif143#endif144145if (*(dm->mp_mode) == true) {146#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))147#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)148#if (MP_DRIVER == 1)149PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);150151tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);152#endif153#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)154#ifdef CONFIG_MP_INCLUDED155PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);156157tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);158#endif159#endif160#endif161} else {162u16 rate = *(dm->forced_data_rate);163164if (!rate) { /*auto rate*/165#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)166tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);167#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)168tx_rate = hw_rate_to_m_rate(dm->tx_rate);169#endif170} else /*force rate*/171tx_rate = (u8) rate;172}173174RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__, tx_rate);175tx_num = MgntQuery_NssTxRate(tx_rate);176177178if (channel >= 1 && channel <= 14) {179power_by_rate_value = PHY_GetTxPowerByRateOriginal(adapter, BAND_ON_2_4G, (enum rf_path) rf_path, tx_num, tx_rate);180tx_limit = PHY_GetTxPowerLimitOriginal(adapter, reg_pwr_tbl_sel, BAND_ON_2_4G, (enum channel_width) band_width, RF_PATH_A, tx_rate, channel);181182RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n", __func__, power_by_rate_value, tx_rate, rf_path, tx_num);183RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n", __func__, tx_limit, reg_pwr_tbl_sel, band_width, channel);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,"Call:%s Wrong path name!!!\n", __func__);207break;208}209} else {210switch (rf_path) {211case RF_PATH_A:212tssi_value = cali_info->delta_swing_tssi_table_2ga[power_by_rate_value];213break;214215case RF_PATH_B:216tssi_value = cali_info->delta_swing_tssi_table_2gb[power_by_rate_value];217break;218219case RF_PATH_C:220tssi_value = cali_info->delta_swing_tssi_table_2gc[power_by_rate_value];221break;222223case RF_PATH_D:224tssi_value = cali_info->delta_swing_tssi_table_2gd[power_by_rate_value];225break;226227default:228RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call:%s Wrong path name!!!!\n", __func__);229break;230}231}232} else if (channel >= 36 && channel <= 64) {233power_by_rate_value = PHY_GetTxPowerByRateOriginal(adapter, BAND_ON_5G, (enum rf_path) rf_path, tx_num, tx_rate);234235tx_limit = PHY_GetTxPowerLimitOriginal(adapter, reg_pwr_tbl_sel, BAND_ON_5G, (enum channel_width) band_width, RF_PATH_A, tx_rate, channel);236237RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n", __func__, power_by_rate_value, tx_rate, rf_path, tx_num);238RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n", __func__, tx_limit, reg_pwr_tbl_sel, band_width, channel);239240power_by_rate_value = power_by_rate_value > tx_limit ? tx_limit : power_by_rate_value;241242switch (rf_path) {243case RF_PATH_A:244tssi_value = cali_info->delta_swing_tssi_table_5ga[0][power_by_rate_value];245break;246247case RF_PATH_B:248tssi_value = cali_info->delta_swing_tssi_table_5gb[0][power_by_rate_value];249break;250251case RF_PATH_C:252tssi_value = cali_info->delta_swing_tssi_table_5gc[0][power_by_rate_value];253break;254255case RF_PATH_D:256tssi_value = cali_info->delta_swing_tssi_table_5gd[0][power_by_rate_value];257break;258259default:260RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call:%s Wrong path name!!!!\n", __func__);261break;262}263} else if (channel >= 100 && channel <= 144) {264power_by_rate_value = PHY_GetTxPowerByRateOriginal(adapter, BAND_ON_5G, (enum rf_path) rf_path, tx_num, tx_rate);265266tx_limit = PHY_GetTxPowerLimitOriginal(adapter, reg_pwr_tbl_sel, BAND_ON_5G, (enum channel_width) band_width, RF_PATH_A, tx_rate, channel);267268RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n", __func__, power_by_rate_value, tx_rate, rf_path, tx_num);269RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n", __func__, tx_limit, reg_pwr_tbl_sel, band_width, channel);270271power_by_rate_value = power_by_rate_value > tx_limit ? tx_limit : power_by_rate_value;272273switch (rf_path) {274case RF_PATH_A:275tssi_value = cali_info->delta_swing_tssi_table_5ga[1][power_by_rate_value];276break;277278case RF_PATH_B:279tssi_value = cali_info->delta_swing_tssi_table_5gb[1][power_by_rate_value];280break;281282case RF_PATH_C:283tssi_value = cali_info->delta_swing_tssi_table_5gc[1][power_by_rate_value];284break;285286case RF_PATH_D:287tssi_value = cali_info->delta_swing_tssi_table_5gd[1][power_by_rate_value];288break;289290default:291RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call:%s Wrong path name!!!!\n", __func__);292break;293}294} else if (channel >= 149 && channel <= 173) {295power_by_rate_value = PHY_GetTxPowerByRateOriginal(adapter, BAND_ON_5G, (enum rf_path) rf_path, tx_num, tx_rate);296297tx_limit = PHY_GetTxPowerLimitOriginal(adapter, reg_pwr_tbl_sel, BAND_ON_5G, (enum channel_width) band_width, RF_PATH_A, tx_rate, channel);298299RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s power_by_rate_value=%d tx_rate=0x%X rf_path=%d tx_num=%d\n", __func__, power_by_rate_value, tx_rate, rf_path, tx_num);300RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_limit=%d reg_pwr_tbl_sel=0x%X band_width=%d channel=%d\n", __func__, tx_limit, reg_pwr_tbl_sel, band_width, channel);301302power_by_rate_value = power_by_rate_value > tx_limit ? tx_limit : power_by_rate_value;303304switch (rf_path) {305case RF_PATH_A:306tssi_value = cali_info->delta_swing_tssi_table_5ga[2][power_by_rate_value];307break;308309case RF_PATH_B:310tssi_value = cali_info->delta_swing_tssi_table_5gb[2][power_by_rate_value];311break;312313case RF_PATH_C:314tssi_value = cali_info->delta_swing_tssi_table_5gc[2][power_by_rate_value];315break;316317case RF_PATH_D:318tssi_value = cali_info->delta_swing_tssi_table_5gd[2][power_by_rate_value];319break;320321default:322RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call:%s Wrong path name!!!!\n", __func__);323break;324}325}326327RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s index=%d tssi_value=%d\n", __func__, power_by_rate_value, tssi_value);328329return tssi_value;330}331332boolean get_tssi_mode_tx_agc_bb_swing_offset(333struct dm_struct *dm,334enum pwrtrack_method method,335u8 rf_path,336u32 offset_vaule,337u8 tx_power_index_offest338)339{340struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);341342u8 bb_swing_upper_bound = cali_info->default_ofdm_index + 10;343u8 bb_swing_lower_bound = 0;344u8 tx_agc_index = (u8) cali_info->absolute_ofdm_swing_idx[rf_path];345u8 tx_bb_swing_index = (u8) cali_info->bb_swing_idx_ofdm[rf_path];346347if (tx_power_index_offest > 0XF)348tx_power_index_offest = 0XF;349350if (tx_agc_index == 0 && tx_bb_swing_index == cali_info->default_ofdm_index) {351if ((offset_vaule & 0X20) >> 5 == 0) {352offset_vaule = offset_vaule & 0X1F;353354if (offset_vaule > tx_power_index_offest) {355tx_agc_index = tx_power_index_offest;356tx_bb_swing_index = tx_bb_swing_index + (u8) offset_vaule - tx_power_index_offest;357358if (tx_bb_swing_index > bb_swing_upper_bound)359tx_bb_swing_index = bb_swing_upper_bound;360361RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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", offset_vaule, tx_agc_index, tx_bb_swing_index);362} else {363tx_agc_index = (u8) offset_vaule;364tx_bb_swing_index = cali_info->default_ofdm_index;365366RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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", offset_vaule, tx_agc_index, tx_bb_swing_index);367}368} else {369tx_agc_index = 0;370offset_vaule = ((~offset_vaule) + 1) & 0X1F;371372if (tx_bb_swing_index >= (u8) offset_vaule)373tx_bb_swing_index = tx_bb_swing_index - (u8) offset_vaule;374else375tx_bb_swing_index = bb_swing_lower_bound;376377if (tx_bb_swing_index <= bb_swing_lower_bound)378tx_bb_swing_index = bb_swing_lower_bound;379380RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"tx_agc_index(0) tx_bb_swing_index(18) --- offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", offset_vaule, tx_agc_index, tx_bb_swing_index);381}382383} else if (tx_agc_index > 0 && tx_bb_swing_index == cali_info->default_ofdm_index) {384if ((offset_vaule & 0X20) >> 5 == 0) {385if (offset_vaule > tx_power_index_offest) {386tx_agc_index = tx_power_index_offest;387tx_bb_swing_index = tx_bb_swing_index + (u8) offset_vaule - tx_power_index_offest;388389if (tx_bb_swing_index > bb_swing_upper_bound)390tx_bb_swing_index = bb_swing_upper_bound;391} else392tx_agc_index = (u8) offset_vaule;393394RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"tx_agc_index > 0 tx_bb_swing_index(18) +++ offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", offset_vaule, tx_agc_index, tx_bb_swing_index);395} else {396tx_agc_index = 0;397offset_vaule = ((~offset_vaule) + 1) & 0X1F;398399if (tx_bb_swing_index >= (u8) offset_vaule)400tx_bb_swing_index = tx_bb_swing_index - (u8) offset_vaule;401else402tx_bb_swing_index = bb_swing_lower_bound;403404if (tx_bb_swing_index <= bb_swing_lower_bound)405tx_bb_swing_index = bb_swing_lower_bound;406407RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"tx_agc_index > 0 tx_bb_swing_index(18) --- offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", offset_vaule, tx_agc_index, tx_bb_swing_index);408}409410411} else if (tx_agc_index > 0 && tx_bb_swing_index > cali_info->default_ofdm_index) {412if ((offset_vaule & 0X20) >> 5 == 0) {413tx_agc_index = tx_power_index_offest;414tx_bb_swing_index = tx_bb_swing_index + (u8) offset_vaule - tx_power_index_offest;415416if (tx_bb_swing_index > bb_swing_upper_bound)417tx_bb_swing_index = bb_swing_upper_bound;418419if (tx_bb_swing_index < cali_info->default_ofdm_index) {420tx_agc_index = tx_power_index_offest - (cali_info->default_ofdm_index - tx_bb_swing_index);421tx_bb_swing_index = cali_info->default_ofdm_index;422}423} else {424tx_agc_index = 0;425offset_vaule = ((~offset_vaule) + 1) & 0X1F;426427if (tx_bb_swing_index >= (u8) offset_vaule)428tx_bb_swing_index = cali_info->default_ofdm_index - (u8) offset_vaule;429else430tx_bb_swing_index = bb_swing_lower_bound;431432if (tx_bb_swing_index <= bb_swing_lower_bound)433tx_bb_swing_index = bb_swing_lower_bound;434}435436RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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", offset_vaule, tx_agc_index, tx_bb_swing_index, offset_vaule - tx_power_index_offest);437438} else if (tx_agc_index == 0 && tx_bb_swing_index < cali_info->default_ofdm_index) {439if ((offset_vaule & 0X20) >> 5 == 1) {440offset_vaule = ((~offset_vaule) + 1) & 0X1F;441442if (tx_bb_swing_index >= (u8) offset_vaule)443tx_bb_swing_index = tx_bb_swing_index - (u8) offset_vaule;444else445tx_bb_swing_index = bb_swing_lower_bound;446} else {447offset_vaule = (offset_vaule & 0x1F);448tx_bb_swing_index = tx_bb_swing_index + (u8) offset_vaule;449450if (tx_bb_swing_index > cali_info->default_ofdm_index) {451tx_agc_index = tx_bb_swing_index - cali_info->default_ofdm_index;452tx_bb_swing_index = cali_info->default_ofdm_index;453454if (tx_agc_index > tx_power_index_offest) {455tx_bb_swing_index = cali_info->default_ofdm_index + (u8)(tx_agc_index) - tx_power_index_offest;456tx_agc_index = tx_power_index_offest;457458if (tx_bb_swing_index > bb_swing_upper_bound)459tx_bb_swing_index = bb_swing_upper_bound;460}461}462}463464if (tx_bb_swing_index <= bb_swing_lower_bound) {465tx_bb_swing_index = bb_swing_lower_bound;466RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call %s Path_%d BBSwing Lower Bound\n", __func__, rf_path);467}468469RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"tx_agc_index(0) tx_bb_swing_index < 18 offset_vaule = 0X%X TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", offset_vaule, tx_agc_index, tx_bb_swing_index);470471}472473if ((tx_agc_index == cali_info->absolute_ofdm_swing_idx[rf_path]) && (tx_bb_swing_index == cali_info->bb_swing_idx_ofdm[rf_path]))474return false;475476else {477cali_info->absolute_ofdm_swing_idx[rf_path] = tx_agc_index;478cali_info->bb_swing_idx_ofdm[rf_path] = tx_bb_swing_index;479return true;480}481482}483484485void set_tx_agc_bb_swing_offset(486struct dm_struct *dm,487enum pwrtrack_method method,488u8 rf_path489)490{491492struct _ADAPTER *adapter = dm->adapter;493HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));494495u8 tx_rate = 0xFF;496u8 channel = *dm->channel;497u8 band_width = hal_data->CurrentChannelBW;498u32 tx_path = hal_data->AntennaTxPath;499500u8 tssi_value = 0;501u8 tx_power_index = 0;502u8 tx_power_index_offest = 0;503u32 offset_vaule = 0;504u32 tssi_function = 0;505u32 txbb_swing = 0;506u8 tx_bb_swing_index = 0;507u32 tx_agc_index = 0;508u32 wait_tx_agc_offset_timer = 0;509u8 i = 0;510boolean rtn = false;511512struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);513514if (*(dm->mp_mode) == true) {515#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))516#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)517#if (MP_DRIVER == 1)518PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);519520tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);521#endif522#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)523#ifdef CONFIG_MP_INCLUDED524PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);525526tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);527#endif528#endif529#endif530} else {531u16 rate = *(dm->forced_data_rate);532533if (!rate) { /*auto rate*/534#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)535tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);536#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)537tx_rate = hw_rate_to_m_rate(dm->tx_rate);538#endif539} else /*force rate*/540tx_rate = (u8) rate;541}542543RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__, tx_rate);544545if (method == TSSI_MODE) {546switch (rf_path) {547case RF_PATH_A:548/*Disable path B TSSI Circuit*/549odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 0);550/*Enable path A TSSI Circuit*/551odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 1);552553/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/554tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path) rf_path);555556odm_set_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);557558/*Write BB 0xC8C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/559odm_set_bb_reg(dm, R_0xc8c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);560561odm_set_bb_reg(dm, R_0xc8c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);562563/*Write BB TXAGC Initial Power index for EEPROM*/564tx_power_index = PHY_GetTxPowerIndex_8814A(adapter, (enum rf_path) rf_path, tx_rate, (enum channel_width) band_width, channel);565odm_set_bb_reg(dm, R_0xc8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);566567RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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",568__func__,569odm_get_bb_reg(dm, R_0xc8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)),570rf_path, tx_rate, band_width, channel,571odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),572odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(11) | BIT(10))573);574575/*Disable BB TSSI Power Tracking*/576odm_set_bb_reg(dm, R_0xc8c, BIT(7), 0);577/*Enable path A TSSI Circuit*/578odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 1);579/*Enable BB TSSI Power Tracking*/580odm_set_bb_reg(dm, R_0xc8c, BIT(7), 1);581582/* delay_us(500);*/583wait_tx_agc_offset_timer = 0;584585while ((odm_get_bb_reg(dm, R_0xd2c, BIT(30)) != 1) && ((tx_path & 8) == 8)) {586wait_tx_agc_offset_timer++;587588if (wait_tx_agc_offset_timer >= 1000)589break;590}591592/*Read the offset value at BB Reg.*/593offset_vaule = odm_get_bb_reg(dm, R_0xd2c, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));594595tssi_function = odm_get_bb_reg(dm, R_0xd2c, BIT(30));596597RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call %s 0XD2C tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n", __func__, tssi_function, offset_vaule, rf_path);598599/*Disable BB TSSI Power Tracking*/600odm_set_bb_reg(dm, R_0xc8c, BIT(7), 0);601/*Disable path A TSSI Circuit*/602odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 0);603604if (tssi_function == 1) {605txbb_swing = odm_get_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK);606607for (i = 0; i <= 36; i++) {608if (txbb_swing == tx_scaling_table_jaguar[i]) {609cali_info->bb_swing_idx_ofdm[rf_path] = i;610RF_DBG(dm, DBG_RF_TX_PWR_TRACK," PathA txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);611break;612613} else614cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;615}616617cali_info->absolute_ofdm_swing_idx[rf_path] = (u8) odm_get_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK);618619620RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path]);621622tx_power_index_offest = 63 - tx_power_index;623624rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, offset_vaule, tx_power_index_offest);625626RF_DBG(dm, DBG_RF_TX_PWR_TRACK," tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path], rtn);627628if (rtn == true) {629odm_set_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);630odm_set_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/631} else632RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGC And BB Swing are the same path=%d\n", rf_path);633634RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");635636637RF_DBG(dm, DBG_RF_TX_PWR_TRACK," OffsetValue(0XD2C)=0X%X TXAGC(REG_A_TX_AGC)=0X%X 0XC1C(PathC BBSwing)(%d)=0X%X\n",638odm_get_bb_reg(dm, R_0xd2c, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24)),639odm_get_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK),640cali_info->bb_swing_idx_ofdm[rf_path],641odm_get_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK)642);643644RF_DBG(dm, DBG_RF_TX_PWR_TRACK," 0X55[13:9]=0X%X 0X56=0X%X\n",645odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X55, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9)),646odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X56, 0XFFFFFFFF)647);648649RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");650651} else652RF_DBG(dm, DBG_RF_TX_PWR_TRACK," TSSI does not Calculate Finish\n");653654break;655656case RF_PATH_B:657/*Disable path A TSSI Circuit*/658odm_set_rf_reg(dm, RF_PATH_A, RF_0x65, BIT(10), 0);659/*Enable path B TSSI Circuit*/660odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 1);661662/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/663tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path) rf_path);664665odm_set_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);666667/*Write BB 0xE8C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/668odm_set_bb_reg(dm, R_0xe8c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);669670odm_set_bb_reg(dm, R_0xe8c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);671672/*Write BB TXAGC Initial Power index for EEPROM*/673tx_power_index = PHY_GetTxPowerIndex_8814A(adapter, (enum rf_path) rf_path, tx_rate, (enum channel_width) band_width, channel);674odm_set_bb_reg(dm, R_0xe8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);675676RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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",677__func__,678odm_get_bb_reg(dm, R_0xe8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)),679rf_path, tx_rate, band_width, channel,680odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),681odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(11) | BIT(10))682);683684/*Disable BB TSSI Power Tracking*/685odm_set_bb_reg(dm, R_0xe8c, BIT(7), 0);686/*Enable path B TSSI Circuit*/687odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 1);688/*Enable BB TSSI Power Tracking*/689odm_set_bb_reg(dm, R_0xe8c, BIT(7), 1);690691/* delay_us(500);*/692wait_tx_agc_offset_timer = 0;693694while ((odm_get_bb_reg(dm, R_0xd6c, BIT(30)) != 1) && ((tx_path & 4) == 4)) {695wait_tx_agc_offset_timer++;696697if (wait_tx_agc_offset_timer >= 1000)698break;699}700701/*Read the offset value at BB Reg.*/702offset_vaule = odm_get_bb_reg(dm, R_0xd6c, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));703704tssi_function = odm_get_bb_reg(dm, R_0xd6c, BIT(30));705706RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call %s 0XD6C tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n", __func__, tssi_function, offset_vaule, rf_path);707708/*Disable BB TSSI Power Tracking*/709odm_set_bb_reg(dm, R_0xe8c, BIT(7), 0);710/*Disable path B TSSI Circuit*/711odm_set_rf_reg(dm, RF_PATH_B, RF_0x65, BIT(10), 0);712713if (tssi_function == 1) {714txbb_swing = odm_get_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK);715716for (i = 0; i <= 36; i++) {717if (txbb_swing == tx_scaling_table_jaguar[i]) {718cali_info->bb_swing_idx_ofdm[rf_path] = i;719RF_DBG(dm, DBG_RF_TX_PWR_TRACK," PathB txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);720break;721722} else723cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;724}725726cali_info->absolute_ofdm_swing_idx[rf_path] = (u8) odm_get_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK);727728RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path]);729730tx_power_index_offest = 63 - tx_power_index;731732rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, offset_vaule, tx_power_index_offest);733734RF_DBG(dm, DBG_RF_TX_PWR_TRACK," tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path], rtn);735736if (rtn == true) {737odm_set_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);738odm_set_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/739} else740RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGC And BB Swing are the same path=%d\n", rf_path);741742RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");743744745RF_DBG(dm, DBG_RF_TX_PWR_TRACK," OffsetValue(0XD6C)=0X%X TXAGC(REG_B_TX_AGC)=0X%X 0XE1C(PathB BBSwing)(%d)=0X%X\n",746odm_get_bb_reg(dm, R_0xd6c, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24)),747odm_get_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK),748cali_info->bb_swing_idx_ofdm[rf_path],749odm_get_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK)750);751752RF_DBG(dm, DBG_RF_TX_PWR_TRACK," 0X55[13:9]=0X%X 0X56=0X%X\n",753odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X55, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9)),754odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X56, 0XFFFFFFFF)755);756757RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");758759} else760RF_DBG(dm, DBG_RF_TX_PWR_TRACK," TSSI does not Calculate Finish\n");761762break;763764case RF_PATH_C:765/*Disable path D TSSI Circuit*/766odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 0);767/*Enable path C TSSI Circuit*/768odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 1);769770/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/771tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path) rf_path);772773odm_set_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);774775/*Write BB 0x188C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/776odm_set_bb_reg(dm, R_0x188c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);777778odm_set_bb_reg(dm, R_0x188c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);779780/*Write BB TXAGC Initial Power index for EEPROM*/781tx_power_index = PHY_GetTxPowerIndex_8814A(adapter, (enum rf_path) rf_path, tx_rate, (enum channel_width) band_width, channel);782odm_set_bb_reg(dm, R_0x188c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);783784RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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",785__func__,786odm_get_bb_reg(dm, R_0x188c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)),787rf_path, tx_rate, band_width, channel,788odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),789odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(11) | BIT(10))790);791792/*Disable BB TSSI Power Tracking*/793odm_set_bb_reg(dm, R_0x188c, BIT(7), 0);794/*Enable path C TSSI Circuit*/795odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 1);796/*Enable BB TSSI Power Tracking*/797odm_set_bb_reg(dm, R_0x188c, BIT(7), 1);798799/* delay_us(500);*/800wait_tx_agc_offset_timer = 0;801802while ((odm_get_bb_reg(dm, R_0xdac, BIT(30)) != 1) && ((tx_path & 2) == 2)) {803wait_tx_agc_offset_timer++;804805if (wait_tx_agc_offset_timer >= 1000)806break;807}808809/*Read the offset value at BB Reg.*/810offset_vaule = odm_get_bb_reg(dm, R_0xdac, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));811812tssi_function = odm_get_bb_reg(dm, R_0xdac, BIT(30));813814RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call %s 0XDAC tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n", __func__, tssi_function, offset_vaule, rf_path);815816/*Disable BB TSSI Power Tracking*/817odm_set_bb_reg(dm, R_0x188c, BIT(7), 0);818/*Disable path C TSSI Circuit*/819odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 0);820821if (tssi_function == 1) {822txbb_swing = odm_get_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK);823824for (i = 0; i <= 36; i++) {825if (txbb_swing == tx_scaling_table_jaguar[i]) {826cali_info->bb_swing_idx_ofdm[rf_path] = i;827RF_DBG(dm, DBG_RF_TX_PWR_TRACK," PathC txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);828break;829830} else831cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;832}833834cali_info->absolute_ofdm_swing_idx[rf_path] = (u8) odm_get_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK);835836RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path]);837838tx_power_index_offest = 63 - tx_power_index;839840rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, offset_vaule, tx_power_index_offest);841842RF_DBG(dm, DBG_RF_TX_PWR_TRACK," tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path], rtn);843844if (rtn == true) {845odm_set_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);846odm_set_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/847} else848RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGC And BB Swing are the same path=%d\n", rf_path);849850RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");851852853RF_DBG(dm, DBG_RF_TX_PWR_TRACK," OffsetValue(0XDAC)=0X%X TXAGC(REG_C_TX_AGC)=0X%X 0X181C(PathC BBSwing)(%d)=0X%X\n",854odm_get_bb_reg(dm, R_0xdac, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24)),855odm_get_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK),856cali_info->bb_swing_idx_ofdm[rf_path],857odm_get_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK)858);859860RF_DBG(dm, DBG_RF_TX_PWR_TRACK," 0X55[13:9]=0X%X 0X56=0X%X\n",861odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X55, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9)),862odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X56, 0XFFFFFFFF)863);864865RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");866867} else868RF_DBG(dm, DBG_RF_TX_PWR_TRACK," TSSI does not Calculate Finish\n");869870break;871872873case RF_PATH_D:874/*Disable path C TSSI Circuit*/875odm_set_rf_reg(dm, RF_PATH_C, RF_0x65, BIT(10), 0);876/*Enable path D TSSI Circuit*/877odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 1);878879/*Read power by rate table to set TSSI value by power and set rf reg 0x65[19:15]*/880tssi_value = get_tssivalue(dm, TSSI_MODE, (enum rf_path) rf_path);881882odm_set_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15), tssi_value);883884/*Write BB 0x1A8C for setting Max. packet (30) of tracking power and the initial value of TXAGC*/885odm_set_bb_reg(dm, R_0x1a8c, BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14), 30);886887odm_set_bb_reg(dm, R_0x1a8c, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) | BIT(8), 0);888889/*Write BB TXAGC Initial Power index for EEPROM*/890tx_power_index = PHY_GetTxPowerIndex_8814A(adapter, (enum rf_path) rf_path, tx_rate, (enum channel_width) band_width, channel);891odm_set_bb_reg(dm, R_0x1a8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0), tx_power_index);892893RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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",894__func__,895odm_get_bb_reg(dm, R_0x1a8c, BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)),896rf_path, tx_rate, band_width, channel,897odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15)),898odm_get_rf_reg(dm, (enum rf_path) rf_path, RF_0x65, BIT(11) | BIT(10))899);900901/*Disable BB TSSI Power Tracking*/902odm_set_bb_reg(dm, R_0x1a8c, BIT(7), 0);903/*Enable path D TSSI Circuit*/904odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 1);905/*Enable BB TSSI Power Tracking*/906odm_set_bb_reg(dm, R_0x1a8c, BIT(7), 1);907908/* delay_us(500);*/909wait_tx_agc_offset_timer = 0;910911while ((odm_get_bb_reg(dm, R_0xdec, BIT(30)) != 1) && ((tx_path & 1) == 1)) {912wait_tx_agc_offset_timer++;913914if (wait_tx_agc_offset_timer >= 1000)915break;916}917918/*Read the offset value at BB Reg.*/919offset_vaule = odm_get_bb_reg(dm, R_0xdec, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24));920921tssi_function = odm_get_bb_reg(dm, R_0xdec, BIT(30));922923RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Call %s 0XDEC tssi_function[30]=0X%X offset_vaule[29:24]=0X%X rf_path=%d\n", __func__, tssi_function, offset_vaule, rf_path);924925/*Disable BB TSSI Power Tracking*/926odm_set_bb_reg(dm, R_0x1a8c, BIT(7), 0);927/*Disable path D TSSI Circuit*/928odm_set_rf_reg(dm, RF_PATH_D, RF_0x65, BIT(10), 0);929930if (tssi_function == 1) {931txbb_swing = odm_get_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK);932933for (i = 0; i <= 36; i++) {934if (txbb_swing == tx_scaling_table_jaguar[i]) {935cali_info->bb_swing_idx_ofdm[rf_path] = i;936RF_DBG(dm, DBG_RF_TX_PWR_TRACK," PathD txbb_swing = %d txbb_swing=0X%X\n", tx_bb_swing_index, txbb_swing);937break;938939} else940cali_info->bb_swing_idx_ofdm[rf_path] = cali_info->default_ofdm_index;941}942943cali_info->absolute_ofdm_swing_idx[rf_path] = (u8) odm_get_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK);944945RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGCIndex = 0X%X tx_bb_swing_index = %d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path]);946947tx_power_index_offest = 63 - tx_power_index;948949rtn = get_tssi_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, offset_vaule, tx_power_index_offest);950951RF_DBG(dm, DBG_RF_TX_PWR_TRACK," tx_agc_index = %d tx_bb_swing_index = %d rtn=%d\n", cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path], rtn);952953if (rtn == true) {954odm_set_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);955odm_set_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/956} else957RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"TXAGC And BB Swing are the same path=%d\n", rf_path);958959RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");960961962RF_DBG(dm, DBG_RF_TX_PWR_TRACK," OffsetValue(0XDEC)=0X%X TXAGC(REG_D_TX_AGC)=0X%X 0X1A1C(PathD BBSwing)(%d)=0X%X\n",963odm_get_bb_reg(dm, R_0xdec, BIT(29) | BIT(28) | BIT(27) | BIT(26) | BIT(25) | BIT(24)),964odm_get_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK),965cali_info->bb_swing_idx_ofdm[rf_path],966odm_get_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK)967);968969RF_DBG(dm, DBG_RF_TX_PWR_TRACK," 0X55[13:9]=0X%X 0X56=0X%X\n",970odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X55, BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9)),971odm_get_rf_reg(dm, (enum rf_path) rf_path, 0X56, 0XFFFFFFFF)972);973974RF_DBG(dm, DBG_RF_TX_PWR_TRACK," ========================================================\n");975976} else977RF_DBG(dm, DBG_RF_TX_PWR_TRACK," TSSI does not Calculate Finish\n");978979break;980981982default:983RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Wrong path name!!!!\n");984985break;986}987}988989}990991boolean get_mix_mode_tx_agc_bb_swing_offset(992struct dm_struct *dm,993enum pwrtrack_method method,994u8 rf_path,995u8 tx_power_index_offest996)997{998struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);9991000u8 bb_swing_upper_bound = cali_info->default_ofdm_index + 10;1001u8 bb_swing_lower_bound = 0;10021003s8 tx_agc_index = 0;1004u8 tx_bb_swing_index = cali_info->default_ofdm_index;10051006RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Path_%d cali_info->absolute_ofdm_swing_idx[rf_path]=%d, tx_power_index_offest=%d\n",1007rf_path, cali_info->absolute_ofdm_swing_idx[rf_path], tx_power_index_offest);10081009if (tx_power_index_offest > 0XF)1010tx_power_index_offest = 0XF;10111012if (cali_info->absolute_ofdm_swing_idx[rf_path] >= 0 && cali_info->absolute_ofdm_swing_idx[rf_path] <= tx_power_index_offest) {1013tx_agc_index = cali_info->absolute_ofdm_swing_idx[rf_path];1014tx_bb_swing_index = cali_info->default_ofdm_index;1015} else if (cali_info->absolute_ofdm_swing_idx[rf_path] > tx_power_index_offest) {1016tx_agc_index = tx_power_index_offest;1017cali_info->remnant_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] - tx_power_index_offest;1018tx_bb_swing_index = cali_info->default_ofdm_index + cali_info->remnant_ofdm_swing_idx[rf_path];10191020if (tx_bb_swing_index > bb_swing_upper_bound)1021tx_bb_swing_index = bb_swing_upper_bound;1022} else {1023tx_agc_index = 0;10241025if (cali_info->default_ofdm_index > (cali_info->absolute_ofdm_swing_idx[rf_path] * (-1)))1026tx_bb_swing_index = cali_info->default_ofdm_index + cali_info->absolute_ofdm_swing_idx[rf_path];1027else1028tx_bb_swing_index = bb_swing_lower_bound;10291030if (tx_bb_swing_index < bb_swing_lower_bound)1031tx_bb_swing_index = bb_swing_lower_bound;1032}10331034cali_info->absolute_ofdm_swing_idx[rf_path] = tx_agc_index;1035cali_info->bb_swing_idx_ofdm[rf_path] = tx_bb_swing_index;10361037RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"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",1038rf_path, cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path], tx_power_index_offest);10391040return true;1041}10421043void power_tracking_by_mix_mode(1044struct dm_struct *dm,1045enum pwrtrack_method method,1046u8 rf_path1047)1048{1049struct _ADAPTER *adapter = dm->adapter;1050HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));1051struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);10521053u8 tx_rate = 0xFF;1054u8 channel = *dm->channel;1055u8 band_width = hal_data->CurrentChannelBW;1056u8 tx_power_index_offest = 0;1057u8 tx_power_index = 0;10581059if (*(dm->mp_mode) == true) {1060#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1061#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1062#if (MP_DRIVER == 1)1063PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);10641065tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);1066#endif1067#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1068#ifdef CONFIG_MP_INCLUDED1069PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);10701071tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1072#endif1073#endif1074#endif1075} else {1076u16 rate = *(dm->forced_data_rate);10771078if (!rate) { /*auto rate*/1079#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1080tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);1081#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1082tx_rate = hw_rate_to_m_rate(dm->tx_rate);1083#endif1084} else /*force rate*/1085tx_rate = (u8) rate;1086}10871088RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__, tx_rate);10891090if ((cali_info->power_index_offset[RF_PATH_A] != 0 ||1091cali_info->power_index_offset[RF_PATH_B] != 0 ||1092cali_info->power_index_offset[RF_PATH_C] != 0 ||1093cali_info->power_index_offset[RF_PATH_D] != 0) &&1094cali_info->txpowertrack_control && (hal_data->eeprom_thermal_meter != 0xff)) {10951096RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"****************Path_%d POWER Tracking MIX MODE**********\n", rf_path);10971098tx_power_index = PHY_GetTxPowerIndex_8814A(adapter, (enum rf_path) rf_path, tx_rate, (enum channel_width)band_width, channel);1099tx_power_index_offest = 63 - tx_power_index;11001101RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"cali_info->absolute_ofdm_swing_idx[%d] =%d tx_power_index=%d\n", rf_path, cali_info->absolute_ofdm_swing_idx[rf_path], tx_power_index);11021103switch (rf_path) {1104case RF_PATH_A:1105get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, tx_power_index_offest);1106odm_set_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1107odm_set_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1108break;11091110case RF_PATH_B:1111get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, tx_power_index_offest);1112odm_set_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1113odm_set_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1114break;11151116case RF_PATH_C:1117get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, tx_power_index_offest);1118odm_set_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1119odm_set_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1120break;11211122case RF_PATH_D:1123get_mix_mode_tx_agc_bb_swing_offset(dm, method, (enum rf_path) rf_path, tx_power_index_offest);1124odm_set_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1125odm_set_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1126break;11271128default:1129RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Wrong path name!!!!\n");1130break;1131}1132} else1133RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Power index is the same, eeprom_thermal_meter = 0XFF or txpowertrack_control is Disable !!!!\n");1134}11351136void power_tracking_by_tssi_mode(1137struct dm_struct *dm,1138enum pwrtrack_method method,1139u8 rf_path1140)1141{1142RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"****************Path_%d POWER Tracking TSSI_MODE**********\n", rf_path);11431144set_tx_agc_bb_swing_offset(dm, TSSI_MODE, (enum rf_path) rf_path);11451146RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"****************Path_%d End POWER Tracking TSSI_MODE**********\n", rf_path);11471148RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "\n");1149}1150115111521153void odm_tx_pwr_track_set_pwr8814a(1154void *dm_void,1155enum pwrtrack_method method,1156u8 rf_path,1157u8 channel_mapped_index1158)1159{1160struct dm_struct *dm = (struct dm_struct *)dm_void;1161void *adapter = dm->adapter;11621163u8 channel = *dm->channel;1164struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);116511661167/*K-Free*/1168#if 01169s8 txbb_index = 0;1170s8 txbb_upper_bound = 10, txbb_lower_bound = -5;11711172txbb_index = cali_info->kfree_offset[rf_path] / 2;11731174if (txbb_index > txbb_upper_bound)1175txbb_index = txbb_upper_bound;1176else if (txbb_index < txbb_lower_bound)1177txbb_index = txbb_lower_bound;11781179if (txbb_index >= 0) {1180odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19), 1);1181odm_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*/1182} else {1183odm_set_rf_reg(dm, (enum rf_path) rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19), 0);1184odm_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);1185}11861187#endif11881189if (method == TXAGC) {1190RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"****************Path_%d POWER Tracking No TXAGC MODE**********\n", rf_path);11911192RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "cali_info->absolute_ofdm_swing_idx[%d] =%d\n",1193rf_path, cali_info->absolute_ofdm_swing_idx[rf_path]);1194} else if (method == TSSI_MODE)1195power_tracking_by_tssi_mode(dm, TSSI_MODE, (enum rf_path) rf_path);1196else if (method == BBSWING) { /*use for mp driver clean power tracking status*/1197switch (rf_path) {1198case RF_PATH_A:1199odm_set_bb_reg(dm, REG_A_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1200odm_set_bb_reg(dm, REG_A_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1201break;12021203case RF_PATH_B:1204odm_set_bb_reg(dm, REG_B_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1205odm_set_bb_reg(dm, REG_B_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1206break;12071208case RF_PATH_C:1209odm_set_bb_reg(dm, REG_C_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1210odm_set_bb_reg(dm, REG_C_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1211break;12121213case RF_PATH_D:1214odm_set_bb_reg(dm, REG_D_TX_AGC, TXAGC_BITMASK, cali_info->absolute_ofdm_swing_idx[rf_path]);1215odm_set_bb_reg(dm, REG_D_BBSWING, BBSWING_BITMASK, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]); /*set BBswing*/1216break;12171218default:1219RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Wrong path name!!!!\n");12201221break;1222}12231224RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "rf_path=%d Clear 8814 Power tracking TXAGC=%d BBSwing=%d\n",1225rf_path, cali_info->absolute_ofdm_swing_idx[rf_path], cali_info->bb_swing_idx_ofdm[rf_path]);12261227} else if (method == MIX_MODE)1228power_tracking_by_mix_mode(dm, MIX_MODE, (enum rf_path) rf_path);1229else if (method == MIX_2G_TSSI_5G_MODE) {1230if (channel <= 14)1231power_tracking_by_mix_mode(dm, MIX_MODE, (enum rf_path) rf_path);1232else1233power_tracking_by_tssi_mode(dm, TSSI_MODE, (enum rf_path) rf_path);1234} else if (method == MIX_5G_TSSI_2G_MODE) {1235if (channel <= 14)1236power_tracking_by_tssi_mode(dm, TSSI_MODE, (enum rf_path) rf_path);1237else1238power_tracking_by_mix_mode(dm, MIX_MODE, (enum rf_path) rf_path);1239}1240} /*odm_tx_pwr_track_set_pwr8814a*/124112421243void get_delta_swing_table_8814a(1244void *dm_void,1245u8 **temperature_up_a,1246u8 **temperature_down_a,1247u8 **temperature_up_b,1248u8 **temperature_down_b1249)1250{1251struct dm_struct *dm = (struct dm_struct *)dm_void;1252struct _ADAPTER *adapter = dm->adapter;1253struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);1254u8 tx_rate = 0xFF;1255u8 channel = *dm->channel;12561257if (*(dm->mp_mode) == true) {1258#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1259#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1260#if (MP_DRIVER == 1)1261PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);12621263tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);1264#endif1265#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1266#ifdef CONFIG_MP_INCLUDED1267PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);12681269tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1270#endif1271#endif1272#endif1273} else {1274u16 rate = *(dm->forced_data_rate);12751276if (!rate) { /*auto rate*/1277#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1278tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);1279#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1280tx_rate = hw_rate_to_m_rate(dm->tx_rate);1281#endif1282} else /*force rate*/1283tx_rate = (u8) rate;1284}12851286RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__, tx_rate);12871288if (1 <= channel && channel <= 14) {1289if (IS_CCK_RATE(tx_rate)) {1290*temperature_up_a = cali_info->delta_swing_table_idx_2g_cck_a_p;1291*temperature_down_a = cali_info->delta_swing_table_idx_2g_cck_a_n;1292*temperature_up_b = cali_info->delta_swing_table_idx_2g_cck_b_p;1293*temperature_down_b = cali_info->delta_swing_table_idx_2g_cck_b_n;1294} else {1295*temperature_up_a = cali_info->delta_swing_table_idx_2ga_p;1296*temperature_down_a = cali_info->delta_swing_table_idx_2ga_n;1297*temperature_up_b = cali_info->delta_swing_table_idx_2gb_p;1298*temperature_down_b = cali_info->delta_swing_table_idx_2gb_n;1299}1300} else if (36 <= channel && channel <= 64) {1301*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[0];1302*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[0];1303*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[0];1304*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[0];1305} else if (100 <= channel && channel <= 144) {1306*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[1];1307*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[1];1308*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[1];1309*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[1];1310} else if (149 <= channel && channel <= 177) {1311*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[2];1312*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[2];1313*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[2];1314*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[2];1315} else {1316*temperature_up_a = (u8 *)delta_swing_table_idx_2ga_p_8188e;1317*temperature_down_a = (u8 *)delta_swing_table_idx_2ga_n_8188e;1318*temperature_up_b = (u8 *)delta_swing_table_idx_2ga_p_8188e;1319*temperature_down_b = (u8 *)delta_swing_table_idx_2ga_n_8188e;1320}13211322return;1323}132413251326void get_delta_swing_table_8814a_path_cd(1327void *dm_void,1328u8 **temperature_up_c,1329u8 **temperature_down_c,1330u8 **temperature_up_d,1331u8 **temperature_down_d1332)1333{1334struct dm_struct *dm = (struct dm_struct *)dm_void;1335struct _ADAPTER *adapter = dm->adapter;1336struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);1337u8 tx_rate = 0xFF;1338u8 channel = *dm->channel;13391340if (*(dm->mp_mode) == true) {1341#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))1342#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1343#if (MP_DRIVER == 1)1344PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);13451346tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);1347#endif1348#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1349#ifdef CONFIG_MP_INCLUDED1350PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);13511352tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);1353#endif1354#endif1355#endif1356} else {1357u16 rate = *(dm->forced_data_rate);13581359if (!rate) { /*auto rate*/1360#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)1361tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);1362#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)1363tx_rate = hw_rate_to_m_rate(dm->tx_rate);1364#endif1365} else /*force rate*/1366tx_rate = (u8) rate;1367}13681369RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__, tx_rate);13701371if (1 <= channel && channel <= 14) {1372if (IS_CCK_RATE(tx_rate)) {1373*temperature_up_c = cali_info->delta_swing_table_idx_2g_cck_c_p;1374*temperature_down_c = cali_info->delta_swing_table_idx_2g_cck_c_n;1375*temperature_up_d = cali_info->delta_swing_table_idx_2g_cck_d_p;1376*temperature_down_d = cali_info->delta_swing_table_idx_2g_cck_d_n;1377} else {1378*temperature_up_c = cali_info->delta_swing_table_idx_2gc_p;1379*temperature_down_c = cali_info->delta_swing_table_idx_2gc_n;1380*temperature_up_d = cali_info->delta_swing_table_idx_2gd_p;1381*temperature_down_d = cali_info->delta_swing_table_idx_2gd_n;1382}1383} else if (36 <= channel && channel <= 64) {1384*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[0];1385*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[0];1386*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[0];1387*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[0];1388} else if (100 <= channel && channel <= 144) {1389*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[1];1390*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[1];1391*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[1];1392*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[1];1393} else if (149 <= channel && channel <= 177) {1394*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[2];1395*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[2];1396*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[2];1397*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[2];1398} else {1399*temperature_up_c = (u8 *)delta_swing_table_idx_2ga_p_8188e;1400*temperature_down_c = (u8 *)delta_swing_table_idx_2ga_n_8188e;1401*temperature_up_d = (u8 *)delta_swing_table_idx_2ga_p_8188e;1402*temperature_down_d = (u8 *)delta_swing_table_idx_2ga_n_8188e;1403}14041405return;1406}14071408void configure_txpower_track_8814a(1409struct txpwrtrack_cfg *config1410)1411{1412config->swing_table_size_cck = CCK_TABLE_SIZE;1413config->swing_table_size_ofdm = OFDM_TABLE_SIZE;1414config->threshold_iqk = 8;1415config->average_thermal_num = AVG_THERMAL_NUM_8814A;1416config->rf_path_count = MAX_PATH_NUM_8814A;1417config->thermal_reg_addr = RF_T_METER_88E;14181419config->odm_tx_pwr_track_set_pwr = odm_tx_pwr_track_set_pwr8814a;1420config->do_iqk = do_iqk_8814a;1421config->phy_lc_calibrate = halrf_lck_trigger;1422config->get_delta_swing_table = get_delta_swing_table_8814a;1423config->get_delta_swing_table8814only = get_delta_swing_table_8814a_path_cd;1424}14251426void _phy_lc_calibrate_8814a(1427struct dm_struct *dm1428)1429{1430u32 lc_cal = 0, cnt;14311432/*Check continuous TX and Packet TX*/1433u32 reg0x914 = odm_read_4byte(dm, REG_SINGLE_TONE_CONT_TX_JAGUAR);;14341435/*Backup RF reg18.*/1436lc_cal = odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK);14371438if ((reg0x914 & 0x70000) == 0)1439odm_write_1byte(dm, REG_TXPAUSE_8812A, 0xFF);14401441/*3 3. Read RF reg18*/1442lc_cal = odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK);14431444/*3 4. Set LC calibration begin bit15*/1445odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal | 0x08000);14461447ODM_delay_ms(100);14481449for (cnt = 0; cnt < 100; cnt++) {1450if (odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)1451break;14521453ODM_delay_ms(10);1454}14551456RF_DBG(dm, DBG_RF_IQK, "retry cnt = %d\n", cnt);1457145814591460/*3 Restore original situation*/1461if ((reg0x914 & 70000) == 0)1462odm_write_1byte(dm, REG_TXPAUSE_8812A, 0x00);14631464/*Recover channel number*/1465odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal);14661467pr_debug("Call %s\n", __func__);1468}14691470void phy_lc_calibrate_8814a(1471void *dm_void1472)1473{1474struct dm_struct *dm = (struct dm_struct *)dm_void;14751476_phy_lc_calibrate_8814a(dm);1477}147814791480#if 01481void _phy_ap_calibrate_8814a(1482#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1483struct dm_struct *dm,1484#else1485void *adapter,1486#endif1487s8 delta,1488boolean is2T1489)1490{1491}14921493void phy_ap_calibrate_8814a(1494#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1495struct dm_struct *dm,1496#else1497void *adapter,1498#endif1499s8 delta1500)1501{15021503}15041505#endif1506void phy_dp_calibrate_8814a(1507struct dm_struct *dm1508)1509{1510}151115121513boolean _phy_query_rf_path_switch_8814a(1514void *adapter1515)1516{1517return true;1518}151915201521boolean phy_query_rf_path_switch_8814a(1522void *adapter1523)1524{15251526#if DISABLE_BB_RF1527return true;1528#endif15291530return _phy_query_rf_path_switch_8814a(adapter);1531}153215331534void _phy_set_rf_path_switch_8814a(1535#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1536struct dm_struct *dm,1537#else1538void *adapter,1539#endif1540boolean is_main,1541boolean is2T1542)1543{1544}1545void phy_set_rf_path_switch_8814a(1546#if (DM_ODM_SUPPORT_TYPE & ODM_AP)1547struct dm_struct *dm,1548#else1549void *adapter,1550#endif1551boolean is_main1552)1553{1554}15551556155715581559#else /*(RTL8814A_SUPPORT == 0)*/1560void phy_lc_calibrate_8814a(1561struct dm_struct *dm1562) {}15631564void phy_iq_calibrate_8814a(1565struct dm_struct *dm,1566boolean is_recovery1567) {}1568#endif /* (RTL8814A_SUPPORT == 0)*/156915701571