1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
21 #include "Mp_Precomp.h"
22 #include "phydm_precomp.h"
25 #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
27 for(_offset = 0; _offset < _size; _offset++)\
29 if(_deltaThermal < thermalThreshold[_direction][_offset])\
41 void ConfigureTxpowerTrack(
43 OUT PTXPWRTRACK_CFG pConfig
47 if(pDM_Odm->SupportICType==ODM_RTL8192E)
48 ConfigureTxpowerTrack_8192E(pConfig);
51 if(pDM_Odm->SupportICType==ODM_RTL8821)
52 ConfigureTxpowerTrack_8821A(pConfig);
55 if(pDM_Odm->SupportICType==ODM_RTL8812)
56 ConfigureTxpowerTrack_8812A(pConfig);
59 if(pDM_Odm->SupportICType==ODM_RTL8188E)
60 ConfigureTxpowerTrack_8188E(pConfig);
64 if(pDM_Odm->SupportICType==ODM_RTL8723B)
65 ConfigureTxpowerTrack_8723B(pConfig);
70 //======================================================================
71 // <20121113, Kordan> This function should be called when TxAGC changed.
72 // Otherwise the previous compensation is gone, because we record the
73 // delta of temperature between two TxPowerTracking watch dogs.
75 // NOTE: If Tx BB swing or Tx scaling is varified during run-time, still
76 // need to call this function.
77 //======================================================================
79 ODM_ClearTxPowerTrackingState(
83 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
86 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
87 pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex;
88 pDM_Odm->RFCalibrateInfo.CCK_index = 0;
90 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
92 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
93 pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->DefaultOfdmIndex;
94 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
96 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
97 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
98 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
99 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
101 pDM_Odm->Absolute_OFDMSwingIdx[p] = 0; // Initial Mix mode power tracking
102 pDM_Odm->Remnant_OFDMSwingIdx[p] = 0;
105 pDM_Odm->Modify_TxAGC_Flag_PathA= FALSE; //Initial at Modify Tx Scaling Mode
106 pDM_Odm->Modify_TxAGC_Flag_PathB= FALSE; //Initial at Modify Tx Scaling Mode
107 pDM_Odm->Remnant_CCKSwingIdx= 0;
108 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
109 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
110 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
114 ODM_TXPowerTrackingCallback_ThermalMeter(
115 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
123 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
124 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
125 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
126 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
127 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
128 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
132 u1Byte ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
133 u1Byte ThermalValue_AVG_count = 0;
134 u4Byte ThermalValue_AVG = 0;
136 u1Byte OFDM_min_index = 0; // OFDM BB Swing should be less than +3.0dB, which is required by Arthur
137 u1Byte Indexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel)
142 //4 1. The following TWO tables decide the final index of OFDM/CCK swing table.
143 pu1Byte deltaSwingTableIdx_TUP_A;
144 pu1Byte deltaSwingTableIdx_TDOWN_A;
145 pu1Byte deltaSwingTableIdx_TUP_B;
146 pu1Byte deltaSwingTableIdx_TDOWN_B;
148 //4 2. Initilization ( 7 steps in total )
150 ConfigureTxpowerTrack(pDM_Odm, &c);
152 (*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_A, (pu1Byte*)&deltaSwingTableIdx_TDOWN_A,
153 (pu1Byte*)&deltaSwingTableIdx_TUP_B, (pu1Byte*)&deltaSwingTableIdx_TDOWN_B);
155 pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; //cosa add for debug
156 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = TRUE;
159 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
160 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl; // <Kordan> We should keep updating the control variable according to HalData.
163 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
164 if (pDM_Odm->mp_mode == TRUE)
166 // <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files.
167 pDM_Odm->RFCalibrateInfo.RegA24 = 0x090e1317;
170 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
171 ("===>ODM_TXPowerTrackingCallback_ThermalMeter, \
172 \n pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]: %d, pDM_Odm->DefaultOfdmIndex: %d\n",
173 pDM_Odm->BbSwingIdxCckBase, pDM_Odm->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pDM_Odm->DefaultOfdmIndex));
175 ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); //0x42: RF Reg[15:10] 88E
176 if( ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl || pHalData->EEPROMThermalMeter == 0 ||
177 pHalData->EEPROMThermalMeter == 0xFF)
181 //4 3. Initialize ThermalValues of RFCalibrateInfo
183 if(pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)
185 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("reload ofdm index for band switch\n"));
188 //4 4. Calculate average thermal meter
190 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;
191 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;
192 if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum) //Average times = c.AverageThermalNum
193 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;
195 for(i = 0; i < c.AverageThermalNum; i++)
197 if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i])
199 ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];
200 ThermalValue_AVG_count++;
204 if(ThermalValue_AVG_count) //Calculate Average ThermalValue after average enough times
206 ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);
207 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
208 ("AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n", ThermalValue, pHalData->EEPROMThermalMeter));
211 //4 5. Calculate delta, delta_LCK, delta_IQK.
213 //"delta" here is used to determine whether thermal value changes or not.
214 delta = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue):(pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);
215 delta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);
216 delta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);
218 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));
220 //4 6. If necessary, do LCK.
222 if ((delta_LCK >= c.Threshold_IQK)) // Delta temperature is equal to or larger than 20 centigrade.
224 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));
225 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;
226 if(c.PHY_LCCalibrate)
227 (*c.PHY_LCCalibrate)(pDM_Odm);
230 //3 7. If necessary, move the index of swing table to adjust Tx power.
232 if (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)
234 //"delta" here is used to record the absolute value of differrence.
235 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
236 delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
238 delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);
240 if (delta >= TXPWR_TRACK_TABLE_SIZE)
241 delta = TXPWR_TRACK_TABLE_SIZE - 1;
243 //4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset
245 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
246 if(ThermalValue > pHalData->EEPROMThermalMeter) {
248 if(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {
250 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
251 ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta]));
252 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
253 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = deltaSwingTableIdx_TUP_A[delta];
255 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = deltaSwingTableIdx_TUP_A[delta]; // Record delta swing for mix mode power tracking
257 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]));
259 if(c.RfPathCount > 1)
261 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
262 ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta]));
263 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
264 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = deltaSwingTableIdx_TUP_B[delta];
266 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = deltaSwingTableIdx_TUP_B[delta]; // Record delta swing for mix mode power tracking
268 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]));
273 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
274 ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta]));
276 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
277 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = -1 * deltaSwingTableIdx_TDOWN_A[delta];
279 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = -1 * deltaSwingTableIdx_TDOWN_A[delta]; // Record delta swing for mix mode power tracking
281 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]));
283 if(c.RfPathCount > 1)
285 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
286 ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta]));
288 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
289 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = -1 * deltaSwingTableIdx_TDOWN_B[delta];
291 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = -1 * deltaSwingTableIdx_TDOWN_B[delta]; // Record delta swing for mix mode power tracking
293 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]));
297 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
299 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
300 ("\n\n================================ [Path-%c] Calculating PowerIndexOffset ================================\n", (p == ODM_RF_PATH_A ? 'A' : 'B')));
302 if (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]) // If Thermal value changes but lookup table value still the same
303 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
305 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]; // Power Index Diff between 2 times Power Tracking
307 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
308 (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p],
309 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]));
311 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->BbSwingIdxOfdmBase[p] + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
312 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
314 pDM_Odm->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index;
315 pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->RFCalibrateInfo.OFDM_index[p];
317 // *************Print BB Swing Base and Index Offset*************
319 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
320 pDM_Odm->BbSwingIdxCck, pDM_Odm->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));
321 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
322 pDM_Odm->BbSwingIdxOfdm[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p], pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));
324 //4 7.1 Handle boundary conditions of index.
327 if(pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1)
329 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1;
331 else if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] < OFDM_min_index)
333 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index;
336 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
337 ("\n\n========================================================================================================\n"));
338 if(pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)
339 pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;
340 //else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0)
341 //pDM_Odm->RFCalibrateInfo.CCK_index = 0;
345 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
346 ("The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
347 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl, ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue));
349 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
350 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
352 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
353 ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
354 pDM_Odm->RFCalibrateInfo.CCK_index, pDM_Odm->BbSwingIdxCckBase)); //Print Swing base & current
355 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
357 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
358 ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
359 pDM_Odm->RFCalibrateInfo.OFDM_index[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p]));
362 if ((pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 ||
363 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0 ) &&
364 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)
366 //4 7.2 Configure the Swing Table to adjust Tx Power.
368 pDM_Odm->RFCalibrateInfo.bTxPowerChanged = TRUE; // Always TRUE after Tx Power is adjusted by power tracking.
370 // 2012/04/23 MH According to Luke's suggestion, we can not write BB digital
371 // to increase TX power. Otherwise, EVM will be bad.
373 // 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.
374 if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)
376 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
377 ("Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
378 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
380 if(c.RfPathCount > 1)
381 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
382 ("Temperature Increasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
383 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
386 else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue)// Low temperature
388 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
389 ("Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
390 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
392 if(c.RfPathCount > 1)
393 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
394 ("Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
395 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
398 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
399 if (ThermalValue > pHalData->EEPROMThermalMeter)
401 if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)
404 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
405 ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
407 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E ||
408 pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B)
410 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking MIX_MODE**********\n"));
411 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
412 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
416 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking BBSWING_MODE**********\n"));
417 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
418 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);
423 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
424 ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
426 if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E ||
427 pDM_Odm->SupportICType == ODM_RTL8821 || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B)
429 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking MIX_MODE**********\n"));
430 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
431 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
435 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking BBSWING_MODE**********\n"));
436 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
437 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);
442 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->BbSwingIdxCck; // Record last time Power Tracking result as base.
443 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
444 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->BbSwingIdxOfdm[p];
446 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
447 ("pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue= %d\n", pDM_Odm->RFCalibrateInfo.ThermalValue, ThermalValue));
449 pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue; //Record last Power Tracking Thermal Value
452 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
453 #if (RTL8723B_SUPPORT == 0)
454 // Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).
455 if ((delta_IQK >= c.Threshold_IQK)) {
456 if ( ! pDM_Odm->RFCalibrateInfo.bIQKInProgress)
457 (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);
462 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("<===ODM_TXPowerTrackingCallback_ThermalMeter\n"));
464 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
470 //3============================================================
472 //3============================================================
480 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN || DM_ODM_SUPPORT_TYPE == ODM_CE)
481 PADAPTER Adapter = pDM_Odm->Adapter;
483 if (!IS_HARDWARE_TYPE_8192D(Adapter))
486 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,("PHY_ResetIQKResult:: settings regs %d default regs %d\n", (u4Byte)(sizeof(pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting)/sizeof(IQK_MATRIX_REGS_SETTING)), IQK_Matrix_Settings_NUM));
487 //0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc
489 for(i = 0; i < IQK_Matrix_Settings_NUM; i++)
492 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][0] =
493 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][2] =
494 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][4] =
495 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][6] = 0x100;
497 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][1] =
498 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][3] =
499 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][5] =
500 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][7] = 0x0;
502 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].bIQKDone = FALSE;
508 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
509 u1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)
511 u1Byte channel_all[ODM_TARGET_CHNL_NUM_2G_5G] =
512 {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};
518 for(place = 14; place<sizeof(channel_all); place++)
520 if(channel_all[place] == chnl)