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 ******************************************************************************/
16 /* include "Mp_Precomp.h" */
17 #include "odm_precomp.h"
20 #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
22 for (_offset = 0; _offset < _size; _offset++) {\
23 if (_deltaThermal < thermalThreshold[_direction][_offset]) {\
29 if (_offset >= _size)\
34 void ConfigureTxpowerTrack(PDM_ODM_T pDM_Odm, PTXPWRTRACK_CFG pConfig)
36 ConfigureTxpowerTrack_8723B(pConfig);
40 /* <20121113, Kordan> This function should be called when TxAGC changed. */
41 /* Otherwise the previous compensation is gone, because we record the */
42 /* delta of temperature between two TxPowerTracking watch dogs. */
44 /* NOTE: If Tx BB swing or Tx scaling is varified during run-time, still */
45 /* need to call this function. */
47 void ODM_ClearTxPowerTrackingState(PDM_ODM_T pDM_Odm)
49 struct hal_com_data *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
52 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
53 pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex;
54 pDM_Odm->RFCalibrateInfo.CCK_index = 0;
56 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) {
57 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
58 pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->DefaultOfdmIndex;
59 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
61 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
62 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
63 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
64 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
66 /* Initial Mix mode power tracking */
67 pDM_Odm->Absolute_OFDMSwingIdx[p] = 0;
68 pDM_Odm->Remnant_OFDMSwingIdx[p] = 0;
71 /* Initial at Modify Tx Scaling Mode */
72 pDM_Odm->Modify_TxAGC_Flag_PathA = false;
73 /* Initial at Modify Tx Scaling Mode */
74 pDM_Odm->Modify_TxAGC_Flag_PathB = false;
75 pDM_Odm->Remnant_CCKSwingIdx = 0;
76 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
77 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
78 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
81 void ODM_TXPowerTrackingCallback_ThermalMeter(struct adapter *Adapter)
84 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
85 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
87 u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
88 u8 ThermalValue_AVG_count = 0;
89 u32 ThermalValue_AVG = 0;
91 u8 OFDM_min_index = 0; /* OFDM BB Swing should be less than +3.0dB, which is required by Arthur */
92 u8 Indexforchannel = 0; /* GetRightChnlPlaceforIQK(pHalData->CurrentChannel) */
97 /* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */
98 u8 *deltaSwingTableIdx_TUP_A;
99 u8 *deltaSwingTableIdx_TDOWN_A;
100 u8 *deltaSwingTableIdx_TUP_B;
101 u8 *deltaSwingTableIdx_TDOWN_B;
103 /* 4 2. Initilization (7 steps in total) */
105 ConfigureTxpowerTrack(pDM_Odm, &c);
107 (*c.GetDeltaSwingTable)(
109 (u8 **)&deltaSwingTableIdx_TUP_A,
110 (u8 **)&deltaSwingTableIdx_TDOWN_A,
111 (u8 **)&deltaSwingTableIdx_TUP_B,
112 (u8 **)&deltaSwingTableIdx_TDOWN_B
115 /* cosa add for debug */
116 pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++;
117 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = true;
121 ODM_COMP_TX_PWR_TRACK,
124 "===>ODM_TXPowerTrackingCallback_ThermalMeter,\npDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]: %d, pDM_Odm->DefaultOfdmIndex: %d\n",
125 pDM_Odm->BbSwingIdxCckBase,
126 pDM_Odm->BbSwingIdxOfdmBase[ODM_RF_PATH_A],
127 pDM_Odm->DefaultOfdmIndex
131 ThermalValue = (u8)PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */
133 !pDM_Odm->RFCalibrateInfo.TxPowerTrackControl ||
134 pHalData->EEPROMThermalMeter == 0 ||
135 pHalData->EEPROMThermalMeter == 0xFF
139 /* 4 3. Initialize ThermalValues of RFCalibrateInfo */
141 if (pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)
144 ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
145 ("reload ofdm index for band switch\n")
148 /* 4 4. Calculate average thermal meter */
150 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;
151 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;
152 if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum) /* Average times = c.AverageThermalNum */
153 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;
155 for (i = 0; i < c.AverageThermalNum; i++) {
156 if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i]) {
157 ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];
158 ThermalValue_AVG_count++;
162 /* Calculate Average ThermalValue after average enough times */
163 if (ThermalValue_AVG_count) {
164 ThermalValue = (u8)(ThermalValue_AVG / ThermalValue_AVG_count);
167 ODM_COMP_TX_PWR_TRACK,
170 "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
172 pHalData->EEPROMThermalMeter
177 /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
178 /* delta" here is used to determine whether thermal value changes or not. */
180 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) ?
181 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue) :
182 (pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);
184 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) ?
185 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) :
186 (pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);
188 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) ?
189 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) :
190 (pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);
194 ODM_COMP_TX_PWR_TRACK,
197 "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
204 /* 4 6. If necessary, do LCK. */
205 /* Delta temperature is equal to or larger than 20 centigrade. */
206 if (delta_LCK >= c.Threshold_IQK) {
209 ODM_COMP_TX_PWR_TRACK,
212 "delta_LCK(%d) >= Threshold_IQK(%d)\n",
217 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;
218 if (c.PHY_LCCalibrate)
219 (*c.PHY_LCCalibrate)(pDM_Odm);
222 /* 3 7. If necessary, move the index of swing table to adjust Tx power. */
223 if (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl) {
224 /* delta" here is used to record the absolute value of differrence. */
226 ThermalValue > pHalData->EEPROMThermalMeter ?
227 (ThermalValue - pHalData->EEPROMThermalMeter) :
228 (pHalData->EEPROMThermalMeter - ThermalValue);
230 if (delta >= TXPWR_TRACK_TABLE_SIZE)
231 delta = TXPWR_TRACK_TABLE_SIZE - 1;
233 /* 4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset */
234 if (ThermalValue > pHalData->EEPROMThermalMeter) {
237 ODM_COMP_TX_PWR_TRACK,
240 "deltaSwingTableIdx_TUP_A[%d] = %d\n",
242 deltaSwingTableIdx_TUP_A[delta]
245 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] =
246 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
247 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] =
248 deltaSwingTableIdx_TUP_A[delta];
250 /* Record delta swing for mix mode power tracking */
251 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
252 deltaSwingTableIdx_TUP_A[delta];
256 ODM_COMP_TX_PWR_TRACK,
259 "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
260 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
264 if (c.RfPathCount > 1) {
267 ODM_COMP_TX_PWR_TRACK,
270 "deltaSwingTableIdx_TUP_B[%d] = %d\n",
272 deltaSwingTableIdx_TUP_B[delta]
275 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] =
276 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
277 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] =
278 deltaSwingTableIdx_TUP_B[delta];
280 /* Record delta swing for mix mode power tracking */
281 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
282 deltaSwingTableIdx_TUP_B[delta];
285 ODM_COMP_TX_PWR_TRACK,
288 "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
289 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
297 ODM_COMP_TX_PWR_TRACK,
300 "deltaSwingTableIdx_TDOWN_A[%d] = %d\n",
302 deltaSwingTableIdx_TDOWN_A[delta]
306 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] =
307 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
308 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] =
309 -1 * deltaSwingTableIdx_TDOWN_A[delta];
311 /* Record delta swing for mix mode power tracking */
312 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
313 -1 * deltaSwingTableIdx_TDOWN_A[delta];
317 ODM_COMP_TX_PWR_TRACK,
320 "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
321 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
325 if (c.RfPathCount > 1) {
328 ODM_COMP_TX_PWR_TRACK,
331 "deltaSwingTableIdx_TDOWN_B[%d] = %d\n",
333 deltaSwingTableIdx_TDOWN_B[delta]
337 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] =
338 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
339 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] =
340 -1 * deltaSwingTableIdx_TDOWN_B[delta];
342 /* Record delta swing for mix mode power tracking */
343 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
344 -1 * deltaSwingTableIdx_TDOWN_B[delta];
348 ODM_COMP_TX_PWR_TRACK,
351 "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
352 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
358 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
361 ODM_COMP_TX_PWR_TRACK,
364 "\n\n ================================ [Path-%c] Calculating PowerIndexOffset ================================\n",
365 (p == ODM_RF_PATH_A ? 'A' : 'B')
370 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] ==
371 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]
372 ) /* If Thermal value changes but lookup table value still the same */
373 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
375 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]; /* Power Index Diff between 2 times Power Tracking */
379 ODM_COMP_TX_PWR_TRACK,
382 "[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
384 p == ODM_RF_PATH_A ? 'A' : 'B'),
385 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p],
386 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p],
387 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]
391 pDM_Odm->RFCalibrateInfo.OFDM_index[p] =
392 pDM_Odm->BbSwingIdxOfdmBase[p] +
393 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
395 pDM_Odm->RFCalibrateInfo.CCK_index =
396 pDM_Odm->BbSwingIdxCckBase +
397 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
399 pDM_Odm->BbSwingIdxCck =
400 pDM_Odm->RFCalibrateInfo.CCK_index;
402 pDM_Odm->BbSwingIdxOfdm[p] =
403 pDM_Odm->RFCalibrateInfo.OFDM_index[p];
405 /* *************Print BB Swing Base and Index Offset************* */
408 ODM_COMP_TX_PWR_TRACK,
411 "The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
412 pDM_Odm->BbSwingIdxCck,
413 pDM_Odm->BbSwingIdxCckBase,
414 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]
419 ODM_COMP_TX_PWR_TRACK,
422 "The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
423 pDM_Odm->BbSwingIdxOfdm[p],
424 (p == ODM_RF_PATH_A ? 'A' : 'B'),
425 pDM_Odm->BbSwingIdxOfdmBase[p],
426 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]
430 /* 4 7.1 Handle boundary conditions of index. */
431 if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1)
432 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1;
433 else if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] < OFDM_min_index)
434 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index;
438 ODM_COMP_TX_PWR_TRACK,
440 ("\n\n ========================================================================================================\n")
442 if (pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)
443 pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;
444 /* else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0) */
445 /* pDM_Odm->RFCalibrateInfo.CCK_index = 0; */
449 ODM_COMP_TX_PWR_TRACK,
452 "The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
453 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl,
455 pDM_Odm->RFCalibrateInfo.ThermalValue
459 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
460 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
464 ODM_COMP_TX_PWR_TRACK,
467 "TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
468 pDM_Odm->RFCalibrateInfo.CCK_index,
469 pDM_Odm->BbSwingIdxCckBase
473 /* Print Swing base & current */
474 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
477 ODM_COMP_TX_PWR_TRACK,
480 "TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
481 pDM_Odm->RFCalibrateInfo.OFDM_index[p],
482 (p == ODM_RF_PATH_A ? 'A' : 'B'),
483 pDM_Odm->BbSwingIdxOfdmBase[p]
489 (pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 ||
490 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0) &&
491 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl
493 /* 4 7.2 Configure the Swing Table to adjust Tx Power. */
495 pDM_Odm->RFCalibrateInfo.bTxPowerChanged = true; /* Always true after Tx Power is adjusted by power tracking. */
497 /* 2012/04/23 MH According to Luke's suggestion, we can not write BB digital */
498 /* to increase TX power. Otherwise, EVM will be bad. */
500 /* 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. */
501 if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) {
504 ODM_COMP_TX_PWR_TRACK,
507 "Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
508 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A],
511 pHalData->EEPROMThermalMeter,
512 pDM_Odm->RFCalibrateInfo.ThermalValue
516 if (c.RfPathCount > 1)
519 ODM_COMP_TX_PWR_TRACK,
522 "Temperature Increasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
523 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B],
526 pHalData->EEPROMThermalMeter,
527 pDM_Odm->RFCalibrateInfo.ThermalValue
531 } else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue) { /* Low temperature */
534 ODM_COMP_TX_PWR_TRACK,
537 "Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
538 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A],
541 pHalData->EEPROMThermalMeter,
542 pDM_Odm->RFCalibrateInfo.ThermalValue
546 if (c.RfPathCount > 1)
549 ODM_COMP_TX_PWR_TRACK,
552 "Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
553 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B],
556 pHalData->EEPROMThermalMeter,
557 pDM_Odm->RFCalibrateInfo.ThermalValue
563 if (ThermalValue > pHalData->EEPROMThermalMeter) {
566 ODM_COMP_TX_PWR_TRACK,
569 "Temperature(%d) higher than PG value(%d)\n",
571 pHalData->EEPROMThermalMeter
577 ODM_COMP_TX_PWR_TRACK,
579 ("**********Enter POWER Tracking MIX_MODE**********\n")
581 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
582 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
586 ODM_COMP_TX_PWR_TRACK,
589 "Temperature(%d) lower than PG value(%d)\n",
591 pHalData->EEPROMThermalMeter
597 ODM_COMP_TX_PWR_TRACK,
599 ("**********Enter POWER Tracking MIX_MODE**********\n")
601 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
602 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
605 /* Record last time Power Tracking result as base. */
606 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->BbSwingIdxCck;
607 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
608 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->BbSwingIdxOfdm[p];
612 ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
614 "pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue = %d\n",
615 pDM_Odm->RFCalibrateInfo.ThermalValue,
620 /* Record last Power Tracking Thermal Value */
621 pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;
626 ODM_COMP_TX_PWR_TRACK,
628 ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n")
631 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
637 /* 3 ============================================================ */
638 /* 3 IQ Calibration */
639 /* 3 ============================================================ */
641 u8 ODM_GetRightChnlPlaceforIQK(u8 chnl)
643 u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {
644 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
645 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
646 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
647 114, 116, 118, 120, 122, 124, 126, 128, 130, 132,
648 134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
655 for (place = 14; place < sizeof(channel_all); place++) {
656 if (channel_all[place] == chnl)