1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
21 #include "mp_precomp.h"
\r
22 #include "phydm_precomp.h"
\r
24 #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
\r
26 for(_offset = 0; _offset < _size; _offset++)\
\r
28 if(_deltaThermal < thermalThreshold[_direction][_offset])\
\r
35 if(_offset >= _size)\
\r
39 void ConfigureTxpowerTrack(
\r
40 IN PDM_ODM_T pDM_Odm,
\r
41 OUT PTXPWRTRACK_CFG pConfig
\r
44 #if RTL8192E_SUPPORT
\r
45 if (pDM_Odm->SupportICType == ODM_RTL8192E)
\r
46 ConfigureTxpowerTrack_8192E(pConfig);
\r
48 #if RTL8821A_SUPPORT
\r
49 if (pDM_Odm->SupportICType == ODM_RTL8821)
\r
50 ConfigureTxpowerTrack_8821A(pConfig);
\r
52 #if RTL8812A_SUPPORT
\r
53 if (pDM_Odm->SupportICType == ODM_RTL8812)
\r
54 ConfigureTxpowerTrack_8812A(pConfig);
\r
56 #if RTL8188E_SUPPORT
\r
57 if (pDM_Odm->SupportICType == ODM_RTL8188E)
\r
58 ConfigureTxpowerTrack_8188E(pConfig);
\r
61 #if RTL8188F_SUPPORT
\r
62 if (pDM_Odm->SupportICType == ODM_RTL8188F)
\r
63 ConfigureTxpowerTrack_8188F(pConfig);
\r
66 #if RTL8723B_SUPPORT
\r
67 if (pDM_Odm->SupportICType == ODM_RTL8723B)
\r
68 ConfigureTxpowerTrack_8723B(pConfig);
\r
71 #if RTL8814A_SUPPORT
\r
72 if (pDM_Odm->SupportICType == ODM_RTL8814A)
\r
73 ConfigureTxpowerTrack_8814A(pConfig);
\r
76 #if RTL8703B_SUPPORT
\r
77 if (pDM_Odm->SupportICType == ODM_RTL8703B)
\r
78 ConfigureTxpowerTrack_8703B(pConfig);
\r
81 #if RTL8822B_SUPPORT
\r
82 if (pDM_Odm->SupportICType == ODM_RTL8822B)
\r
83 ConfigureTxpowerTrack_8822B(pConfig);
\r
86 #if RTL8723D_SUPPORT
\r
87 if (pDM_Odm->SupportICType == ODM_RTL8723D)
\r
88 ConfigureTxpowerTrack_8723D(pConfig);
\r
92 //======================================================================
\r
93 // <20121113, Kordan> This function should be called when TxAGC changed.
\r
94 // Otherwise the previous compensation is gone, because we record the
\r
95 // delta of temperature between two TxPowerTracking watch dogs.
\r
97 // NOTE: If Tx BB swing or Tx scaling is varified during run-time, still
\r
98 // need to call this function.
\r
99 //======================================================================
\r
101 ODM_ClearTxPowerTrackingState(
\r
102 IN PDM_ODM_T pDM_Odm
\r
105 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
\r
107 PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
\r
109 pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;
\r
110 pRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->DefaultCckIndex;
\r
111 pRFCalibrateInfo->CCK_index = 0;
\r
113 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
\r
115 pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;
\r
116 pRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->DefaultOfdmIndex;
\r
117 pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;
\r
119 pRFCalibrateInfo->PowerIndexOffset[p] = 0;
\r
120 pRFCalibrateInfo->DeltaPowerIndex[p] = 0;
\r
121 pRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;
\r
123 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = 0; /* Initial Mix mode power tracking*/
\r
124 pRFCalibrateInfo->Remnant_OFDMSwingIdx[p] = 0;
\r
125 pRFCalibrateInfo->KfreeOffset[p] = 0;
\r
128 pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = FALSE; /*Initial at Modify Tx Scaling Mode*/
\r
129 pRFCalibrateInfo->Modify_TxAGC_Flag_PathB = FALSE; /*Initial at Modify Tx Scaling Mode*/
\r
130 pRFCalibrateInfo->Modify_TxAGC_Flag_PathC = FALSE; /*Initial at Modify Tx Scaling Mode*/
\r
131 pRFCalibrateInfo->Modify_TxAGC_Flag_PathD = FALSE; /*Initial at Modify Tx Scaling Mode*/
\r
132 pRFCalibrateInfo->Remnant_CCKSwingIdx = 0;
\r
133 pRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter;
\r
135 pRFCalibrateInfo->Modify_TxAGC_Value_CCK=0; //modify by Mingzhi.Guo
\r
136 pRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0; //modify by Mingzhi.Guo
\r
141 ODM_TXPowerTrackingCallback_ThermalMeter(
\r
142 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
143 IN PDM_ODM_T pDM_Odm
\r
145 IN PADAPTER Adapter
\r
149 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
150 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
151 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
152 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
153 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
\r
154 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
\r
158 PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
\r
160 u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
\r
161 s1Byte diff_DPK[4] = {0};
\r
162 u1Byte ThermalValue_AVG_count = 0;
\r
163 u4Byte ThermalValue_AVG = 0, RegC80, RegCd0, RegCd4, Regab4;
\r
165 u1Byte OFDM_min_index = 0; // OFDM BB Swing should be less than +3.0dB, which is required by Arthur
\r
166 u1Byte Indexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel)
\r
167 u1Byte PowerTrackingType = pHalData->RfPowerTrackingType;
\r
168 u1Byte XtalOffsetEanble = 0;
\r
172 //4 1. The following TWO tables decide the final index of OFDM/CCK swing table.
\r
173 pu1Byte deltaSwingTableIdx_TUP_A = NULL;
\r
174 pu1Byte deltaSwingTableIdx_TDOWN_A = NULL;
\r
175 pu1Byte deltaSwingTableIdx_TUP_B = NULL;
\r
176 pu1Byte deltaSwingTableIdx_TDOWN_B = NULL;
\r
177 /*for 8814 add by Yu Chen*/
\r
178 pu1Byte deltaSwingTableIdx_TUP_C = NULL;
\r
179 pu1Byte deltaSwingTableIdx_TDOWN_C = NULL;
\r
180 pu1Byte deltaSwingTableIdx_TUP_D = NULL;
\r
181 pu1Byte deltaSwingTableIdx_TDOWN_D = NULL;
\r
182 /*for Xtal Offset by James.Tung*/
\r
183 ps1Byte deltaSwingTableXtal_UP = NULL;
\r
184 ps1Byte deltaSwingTableXtal_DOWN = NULL;
\r
186 //4 2. Initilization ( 7 steps in total )
\r
188 ConfigureTxpowerTrack(pDM_Odm, &c);
\r
190 (*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_A, (pu1Byte *)&deltaSwingTableIdx_TDOWN_A,
\r
191 (pu1Byte *)&deltaSwingTableIdx_TUP_B, (pu1Byte *)&deltaSwingTableIdx_TDOWN_B);
\r
193 if (pDM_Odm->SupportICType & ODM_RTL8814A) /*for 8814 path C & D*/
\r
194 (*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_C, (pu1Byte *)&deltaSwingTableIdx_TDOWN_C,
\r
195 (pu1Byte *)&deltaSwingTableIdx_TUP_D, (pu1Byte *)&deltaSwingTableIdx_TDOWN_D);
\r
197 if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D)) /*for Xtal Offset*/
\r
198 (*c.GetDeltaSwingXtalTable)(pDM_Odm, (ps1Byte *)&deltaSwingTableXtal_UP, (ps1Byte *)&deltaSwingTableXtal_DOWN);
\r
201 pRFCalibrateInfo->TXPowerTrackingCallbackCnt++; /*cosa add for debug*/
\r
202 pRFCalibrateInfo->bTXPowerTrackingInit = TRUE;
\r
204 /*pRFCalibrateInfo->TxPowerTrackControl = pHalData->TxPowerTrackControl;
\r
205 <Kordan> We should keep updating the control variable according to HalData.
\r
206 <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files. */
\r
207 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
208 #if (MP_DRIVER == 1)
\r
209 pRFCalibrateInfo->RegA24 = 0x090e1317;
\r
211 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
\r
212 if (pDM_Odm->mp_mode == TRUE)
\r
213 pRFCalibrateInfo->RegA24 = 0x090e1317;
\r
216 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
217 ("===>ODM_TXPowerTrackingCallback_ThermalMeter\n pRFCalibrateInfo->BbSwingIdxCckBase: %d, pRFCalibrateInfo->BbSwingIdxOfdmBase[A]: %d, pRFCalibrateInfo->DefaultOfdmIndex: %d\n",
\r
218 pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pRFCalibrateInfo->DefaultOfdmIndex));
\r
220 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
221 ("pRFCalibrateInfo->TxPowerTrackControl=%d, pHalData->EEPROMThermalMeter %d\n", pRFCalibrateInfo->TxPowerTrackControl, pHalData->EEPROMThermalMeter));
\r
222 ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); //0x42: RF Reg[15:10] 88E
\r
224 /*add log by zhao he, check c80/c94/c14/ca0 value*/
\r
225 if (pDM_Odm->SupportICType == ODM_RTL8723D) {
\r
226 RegC80 = ODM_GetBBReg(pDM_Odm, 0xc80, bMaskDWord);
\r
227 RegCd0 = ODM_GetBBReg(pDM_Odm, 0xcd0, bMaskDWord);
\r
228 RegCd4 = ODM_GetBBReg(pDM_Odm, 0xcd4, bMaskDWord);
\r
229 Regab4 = ODM_GetBBReg(pDM_Odm, 0xab4, 0x000007FF);
\r
230 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc80 = 0x%x 0xcd0 = 0x%x 0xcd4 = 0x%x 0xab4 = 0x%x\n", RegC80, RegCd0, RegCd4, Regab4));
\r
233 if (!pRFCalibrateInfo->TxPowerTrackControl)
\r
237 /*4 3. Initialize ThermalValues of RFCalibrateInfo*/
\r
239 if (pRFCalibrateInfo->bReloadtxpowerindex)
\r
240 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("reload ofdm index for band switch\n"));
\r
242 /*4 4. Calculate average thermal meter*/
\r
244 pRFCalibrateInfo->ThermalValue_AVG[pRFCalibrateInfo->ThermalValue_AVG_index] = ThermalValue;
\r
245 pRFCalibrateInfo->ThermalValue_AVG_index++;
\r
246 if (pRFCalibrateInfo->ThermalValue_AVG_index == c.AverageThermalNum) /*Average times = c.AverageThermalNum*/
\r
247 pRFCalibrateInfo->ThermalValue_AVG_index = 0;
\r
249 for(i = 0; i < c.AverageThermalNum; i++)
\r
251 if (pRFCalibrateInfo->ThermalValue_AVG[i]) {
\r
252 ThermalValue_AVG += pRFCalibrateInfo->ThermalValue_AVG[i];
\r
253 ThermalValue_AVG_count++;
\r
257 if(ThermalValue_AVG_count) //Calculate Average ThermalValue after average enough times
\r
259 ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);
\r
260 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
261 ("AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n", ThermalValue, pHalData->EEPROMThermalMeter));
\r
264 //4 5. Calculate delta, delta_LCK, delta_IQK.
\r
266 //"delta" here is used to determine whether thermal value changes or not.
\r
267 delta = (ThermalValue > pRFCalibrateInfo->ThermalValue)?(ThermalValue - pRFCalibrateInfo->ThermalValue):(pRFCalibrateInfo->ThermalValue - ThermalValue);
\r
268 delta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);
\r
269 delta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);
\r
271 if (pRFCalibrateInfo->ThermalValue_IQK == 0xff) { /*no PG, use thermal value for IQK*/
\r
272 pRFCalibrateInfo->ThermalValue_IQK = ThermalValue;
\r
273 delta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);
\r
274 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, use ThermalValue for IQK\n"));
\r
277 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
278 diff_DPK[p] = (s1Byte)ThermalValue - (s1Byte)pRFCalibrateInfo->DpkThermal[p];
\r
280 /*4 6. If necessary, do LCK.*/
\r
282 if (!(pDM_Odm->SupportICType & ODM_RTL8821)) { /*no PG , do LCK at initial status*/
\r
283 if (pRFCalibrateInfo->ThermalValue_LCK == 0xff) {
\r
284 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, do LCK\n"));
\r
285 pRFCalibrateInfo->ThermalValue_LCK = ThermalValue;
\r
287 /*Use RTLCK, so close power tracking driver LCK*/
\r
288 if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {
\r
289 if (c.PHY_LCCalibrate)
\r
290 (*c.PHY_LCCalibrate)(pDM_Odm);
\r
293 delta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);
\r
296 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK));
\r
298 /* Delta temperature is equal to or larger than 20 centigrade.*/
\r
299 if (delta_LCK >= c.Threshold_IQK) {
\r
300 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_LCK(%d) >= Threshold_IQK(%d)\n", delta_LCK, c.Threshold_IQK));
\r
301 pRFCalibrateInfo->ThermalValue_LCK = ThermalValue;
\r
303 /*Use RTLCK, so close power tracking driver LCK*/
\r
304 if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {
\r
305 if (c.PHY_LCCalibrate)
\r
306 (*c.PHY_LCCalibrate)(pDM_Odm);
\r
311 /*3 7. If necessary, move the index of swing table to adjust Tx power.*/
\r
313 if (delta > 0 && pRFCalibrateInfo->TxPowerTrackControl)
\r
315 //"delta" here is used to record the absolute value of differrence.
\r
316 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
317 delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
\r
319 delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);
\r
321 if (delta >= TXPWR_TRACK_TABLE_SIZE)
\r
322 delta = TXPWR_TRACK_TABLE_SIZE - 1;
\r
324 /*4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset*/
\r
326 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
327 if(ThermalValue > pHalData->EEPROMThermalMeter) {
\r
329 if(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {
\r
332 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
\r
333 pRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p]; /*recording poer index offset*/
\r
335 case ODM_RF_PATH_B:
\r
336 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
337 ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta]));
\r
339 pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_B[delta];
\r
340 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_B[delta]; /*Record delta swing for mix mode power tracking*/
\r
341 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
342 ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
345 case ODM_RF_PATH_C:
\r
346 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
347 ("deltaSwingTableIdx_TUP_C[%d] = %d\n", delta, deltaSwingTableIdx_TUP_C[delta]));
\r
349 pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_C[delta];
\r
350 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_C[delta]; /*Record delta swing for mix mode power tracking*/
\r
351 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
352 ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
355 case ODM_RF_PATH_D:
\r
356 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
357 ("deltaSwingTableIdx_TUP_D[%d] = %d\n", delta, deltaSwingTableIdx_TUP_D[delta]));
\r
359 pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_D[delta];
\r
360 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_D[delta]; /*Record delta swing for mix mode power tracking*/
\r
361 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
362 ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
366 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
367 ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta]));
\r
369 pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_A[delta];
\r
370 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_A[delta]; /*Record delta swing for mix mode power tracking*/
\r
371 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
372 ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
377 if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D)) {
\r
378 /*Save XtalOffset from Xtal table*/
\r
379 pRFCalibrateInfo->XtalOffsetLast = pRFCalibrateInfo->XtalOffset; /*recording last Xtal offset*/
\r
380 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
381 ("[Xtal] deltaSwingTableXtal_UP[%d] = %d\n", delta, deltaSwingTableXtal_UP[delta]));
\r
382 pRFCalibrateInfo->XtalOffset = deltaSwingTableXtal_UP[delta];
\r
384 if (pRFCalibrateInfo->XtalOffsetLast == pRFCalibrateInfo->XtalOffset)
\r
385 XtalOffsetEanble = 0;
\r
387 XtalOffsetEanble = 1;
\r
391 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
\r
392 pRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p]; /*recording poer index offset*/
\r
395 case ODM_RF_PATH_B:
\r
396 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
397 ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta]));
\r
398 pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];
\r
399 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta]; /*Record delta swing for mix mode power tracking*/
\r
400 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
401 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
404 case ODM_RF_PATH_C:
\r
405 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
406 ("deltaSwingTableIdx_TDOWN_C[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_C[delta]));
\r
407 pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];
\r
408 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta]; /*Record delta swing for mix mode power tracking*/
\r
409 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
410 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
413 case ODM_RF_PATH_D:
\r
414 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
415 ("deltaSwingTableIdx_TDOWN_D[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_D[delta]));
\r
416 pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];
\r
417 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta]; /*Record delta swing for mix mode power tracking*/
\r
418 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
419 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
423 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
424 ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta]));
\r
425 pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];
\r
426 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta]; /*Record delta swing for mix mode power tracking*/
\r
427 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
428 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));
\r
433 if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D)) {
\r
434 /*Save XtalOffset from Xtal table*/
\r
435 pRFCalibrateInfo->XtalOffsetLast = pRFCalibrateInfo->XtalOffset; /*recording last Xtal offset*/
\r
436 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
437 ("[Xtal] deltaSwingTableXtal_DOWN[%d] = %d\n", delta, deltaSwingTableXtal_DOWN[delta]));
\r
438 pRFCalibrateInfo->XtalOffset = deltaSwingTableXtal_DOWN[delta];
\r
440 if (pRFCalibrateInfo->XtalOffsetLast == pRFCalibrateInfo->XtalOffset)
\r
441 XtalOffsetEanble = 0;
\r
443 XtalOffsetEanble = 1;
\r
448 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
\r
449 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
450 ("\n\n=========================== [Path-%d] Calculating PowerIndexOffset===========================\n", p));
\r
452 if (pRFCalibrateInfo->DeltaPowerIndex[p] == pRFCalibrateInfo->DeltaPowerIndexLast[p]) /*If Thermal value changes but lookup table value still the same*/
\r
453 pRFCalibrateInfo->PowerIndexOffset[p] = 0;
\r
455 pRFCalibrateInfo->PowerIndexOffset[p] = pRFCalibrateInfo->DeltaPowerIndex[p] - pRFCalibrateInfo->DeltaPowerIndexLast[p]; /*Power Index Diff between 2 times Power Tracking*/
\r
457 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
458 ("[Path-%d] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n", p, pRFCalibrateInfo->PowerIndexOffset[p], pRFCalibrateInfo->DeltaPowerIndex[p], pRFCalibrateInfo->DeltaPowerIndexLast[p]));
\r
460 pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->BbSwingIdxOfdmBase[p] + pRFCalibrateInfo->PowerIndexOffset[p];
\r
461 pRFCalibrateInfo->CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pRFCalibrateInfo->PowerIndexOffset[p];
\r
463 pRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->CCK_index;
\r
464 pRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->OFDM_index[p];
\r
466 /*************Print BB Swing Base and Index Offset*************/
\r
468 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
469 ("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->PowerIndexOffset[p]));
\r
470 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
471 ("The 'OFDM' final index(%d) = BaseIndex[%d](%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxOfdm[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p], pRFCalibrateInfo->PowerIndexOffset[p]));
\r
473 /*4 7.1 Handle boundary conditions of index.*/
\r
475 if (pRFCalibrateInfo->OFDM_index[p] > c.SwingTableSize_OFDM-1)
\r
476 pRFCalibrateInfo->OFDM_index[p] = c.SwingTableSize_OFDM-1;
\r
477 else if (pRFCalibrateInfo->OFDM_index[p] <= OFDM_min_index)
\r
478 pRFCalibrateInfo->OFDM_index[p] = OFDM_min_index;
\r
481 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
482 ("\n\n========================================================================================================\n"));
\r
484 if (pRFCalibrateInfo->CCK_index > c.SwingTableSize_CCK-1)
\r
485 pRFCalibrateInfo->CCK_index = c.SwingTableSize_CCK-1;
\r
486 else if (pRFCalibrateInfo->CCK_index <= 0)
\r
487 pRFCalibrateInfo->CCK_index = 0;
\r
489 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
490 ("The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pRFCalibrateInfo->ThermalValue: %d\n",
\r
491 pRFCalibrateInfo->TxPowerTrackControl, ThermalValue, pRFCalibrateInfo->ThermalValue));
\r
493 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
494 pRFCalibrateInfo->PowerIndexOffset[p] = 0;
\r
497 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
498 ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
\r
499 pRFCalibrateInfo->CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase)); /*Print Swing base & current*/
\r
501 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
\r
502 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
503 ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%d]: %d\n",
\r
504 pRFCalibrateInfo->OFDM_index[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p]));
\r
507 if ((pDM_Odm->SupportICType & ODM_RTL8814A)) {
\r
508 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("PowerTrackingType=%d\n", PowerTrackingType));
\r
510 if (PowerTrackingType == 0) {
\r
511 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
\r
512 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
513 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
\r
514 } else if (PowerTrackingType == 1) {
\r
515 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(2G) TSSI(5G) MODE**********\n"));
\r
516 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
517 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_2G_TSSI_5G_MODE, p, 0);
\r
518 } else if (PowerTrackingType == 2) {
\r
519 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(5G) TSSI(2G)MODE**********\n"));
\r
520 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
521 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_5G_TSSI_2G_MODE, p, 0);
\r
522 } else if (PowerTrackingType == 3) {
\r
523 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking TSSI MODE**********\n"));
\r
524 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
525 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, TSSI_MODE, p, 0);
\r
527 pRFCalibrateInfo->ThermalValue = ThermalValue; /*Record last Power Tracking Thermal Value*/
\r
529 } else if ((pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_A] != 0 ||
\r
530 pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_B] != 0 ||
\r
531 pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_C] != 0 ||
\r
532 pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_D] != 0) &&
\r
533 pRFCalibrateInfo->TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff)) {
\r
534 //4 7.2 Configure the Swing Table to adjust Tx Power.
\r
536 pRFCalibrateInfo->bTxPowerChanged = TRUE; /*Always TRUE after Tx Power is adjusted by power tracking.*/
\r
538 // 2012/04/23 MH According to Luke's suggestion, we can not write BB digital
\r
539 // to increase TX power. Otherwise, EVM will be bad.
\r
541 // 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.
\r
542 if (ThermalValue > pRFCalibrateInfo->ThermalValue) {
\r
543 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
\r
544 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
545 ("Temperature Increasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
\r
546 p, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));
\r
548 } else if (ThermalValue < pRFCalibrateInfo->ThermalValue) { /*Low temperature*/
\r
549 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
\r
550 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
551 ("Temperature Decreasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
\r
552 p, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));
\r
556 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
557 if (ThermalValue > pHalData->EEPROMThermalMeter)
\r
559 if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)
\r
562 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
563 ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
\r
565 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||
\r
566 pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||
\r
567 pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8822B ||
\r
568 pDM_Odm->SupportICType == ODM_RTL8723D) {
\r
570 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
\r
571 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
572 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
\r
574 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));
\r
575 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
576 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);
\r
581 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
582 ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
\r
584 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||
\r
585 pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||
\r
586 pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8822B ||
\r
587 pDM_Odm->SupportICType == ODM_RTL8723D) {
\r
589 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
\r
590 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
591 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
\r
593 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));
\r
594 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
595 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);
\r
600 pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck; /*Record last time Power Tracking result as base.*/
\r
601 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
\r
602 pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->BbSwingIdxOfdm[p];
\r
604 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
605 ("pRFCalibrateInfo->ThermalValue = %d ThermalValue= %d\n", pRFCalibrateInfo->ThermalValue, ThermalValue));
\r
607 pRFCalibrateInfo->ThermalValue = ThermalValue; /*Record last Power Tracking Thermal Value*/
\r
612 if (pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8723D) {
\r
614 if (XtalOffsetEanble != 0 && pRFCalibrateInfo->TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff)) {
\r
616 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter Xtal Tracking**********\n"));
\r
618 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
619 if (ThermalValue > pHalData->EEPROMThermalMeter) {
\r
621 if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {
\r
623 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
624 ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
\r
625 (*c.ODM_TxXtalTrackSetXtal)(pDM_Odm);
\r
627 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
\r
628 ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
\r
629 (*c.ODM_TxXtalTrackSetXtal)(pDM_Odm);
\r
632 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********End Xtal Tracking**********\n"));
\r
635 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
637 if (!IS_HARDWARE_TYPE_8723B(Adapter)) {
\r
638 /*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/
\r
639 if (delta_IQK >= c.Threshold_IQK) {
\r
640 pRFCalibrateInfo->ThermalValue_IQK = ThermalValue;
\r
641 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_IQK(%d) >= Threshold_IQK(%d)\n", delta_IQK, c.Threshold_IQK));
\r
642 if (!pRFCalibrateInfo->bIQKInProgress)
\r
643 (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);
\r
646 if (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_A] != 0) {
\r
647 if (diff_DPK[ODM_RF_PATH_A] >= c.Threshold_DPK) {
\r
648 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);
\r
649 ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK));
\r
650 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);
\r
651 } else if ((diff_DPK[ODM_RF_PATH_A] <= -1 * c.Threshold_DPK)) {
\r
652 s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK);
\r
654 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);
\r
655 ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, value);
\r
656 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);
\r
658 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);
\r
659 ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);
\r
660 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);
\r
663 if (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_B] != 0) {
\r
664 if (diff_DPK[ODM_RF_PATH_B] >= c.Threshold_DPK) {
\r
665 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);
\r
666 ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK));
\r
667 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);
\r
668 } else if ((diff_DPK[ODM_RF_PATH_B] <= -1 * c.Threshold_DPK)) {
\r
669 s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK);
\r
671 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);
\r
672 ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, value);
\r
673 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);
\r
675 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);
\r
676 ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);
\r
677 ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);
\r
683 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n"));
\r
685 pRFCalibrateInfo->TXPowercount = 0;
\r
690 //3============================================================
\r
692 //3============================================================
\r
695 ODM_ResetIQKResult(
\r
696 IN PDM_ODM_T pDM_Odm
\r
701 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
702 u1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)
\r
704 u1Byte channel_all[ODM_TARGET_CHNL_NUM_2G_5G] =
\r
705 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,161,163,165};
\r
706 u1Byte place = chnl;
\r
711 for(place = 14; place<sizeof(channel_all); place++)
\r
713 if(channel_all[place] == chnl)
\r
726 IN PDM_ODM_T pDM_Odm
\r
729 PADAPTER Adapter = pDM_Odm->Adapter;
\r
731 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
732 if (*pDM_Odm->pIsFcsModeEnable)
\r
736 if (pDM_Odm->bLinked) {
\r
738 if ((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess)) {
\r
739 pDM_Odm->preChannel = *pDM_Odm->pChannel;
\r
740 pDM_Odm->LinkedInterval = 0;
\r
743 if (pDM_Odm->LinkedInterval < 3)
\r
744 pDM_Odm->LinkedInterval++;
\r
746 if (pDM_Odm->LinkedInterval == 2) {
\r
747 PHY_IQCalibrate(Adapter, FALSE);
\r
750 pDM_Odm->LinkedInterval = 0;
\r
754 void phydm_rf_init(IN PDM_ODM_T pDM_Odm)
\r
757 odm_TXPowerTrackingInit(pDM_Odm);
\r
759 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
760 ODM_ClearTxPowerTrackingState(pDM_Odm);
\r
763 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
764 #if (RTL8814A_SUPPORT == 1)
\r
765 if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
766 PHY_IQCalibrate_8814A_Init(pDM_Odm);
\r
772 void phydm_rf_watchdog(IN PDM_ODM_T pDM_Odm)
\r
775 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
776 PADAPTER Adapter = pDM_Odm->Adapter;
\r
777 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
\r
779 ODM_TXPowerTrackingCheck(pDM_Odm);
\r
781 if(!pMgntInfo->IQKBeforeConnection)
\r
783 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
784 odm_IQCalibrate(pDM_Odm);
\r