1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3 *
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5 *
6 ******************************************************************************/
7
8 /* include "Mp_Precomp.h" */
9 #include "odm_precomp.h"
10
11
12 #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
13 do {\
14 for (_offset = 0; _offset < _size; _offset++) {\
15 if (_deltaThermal < thermalThreshold[_direction][_offset]) {\
16 if (_offset != 0)\
17 _offset--;\
18 break;\
19 } \
20 } \
21 if (_offset >= _size)\
22 _offset = _size-1;\
23 } while (0)
24
25
ConfigureTxpowerTrack(PDM_ODM_T pDM_Odm,PTXPWRTRACK_CFG pConfig)26 void ConfigureTxpowerTrack(PDM_ODM_T pDM_Odm, PTXPWRTRACK_CFG pConfig)
27 {
28 ConfigureTxpowerTrack_8723B(pConfig);
29 }
30
31 /* */
32 /* <20121113, Kordan> This function should be called when TxAGC changed. */
33 /* Otherwise the previous compensation is gone, because we record the */
34 /* delta of temperature between two TxPowerTracking watch dogs. */
35 /* */
36 /* NOTE: If Tx BB swing or Tx scaling is varified during run-time, still */
37 /* need to call this function. */
38 /* */
ODM_ClearTxPowerTrackingState(PDM_ODM_T pDM_Odm)39 void ODM_ClearTxPowerTrackingState(PDM_ODM_T pDM_Odm)
40 {
41 struct hal_com_data *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
42 u8 p = 0;
43
44 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
45 pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex;
46 pDM_Odm->RFCalibrateInfo.CCK_index = 0;
47
48 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) {
49 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
50 pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->DefaultOfdmIndex;
51 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
52
53 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
54 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
55 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
56 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
57
58 /* Initial Mix mode power tracking */
59 pDM_Odm->Absolute_OFDMSwingIdx[p] = 0;
60 pDM_Odm->Remnant_OFDMSwingIdx[p] = 0;
61 }
62
63 /* Initial at Modify Tx Scaling Mode */
64 pDM_Odm->Modify_TxAGC_Flag_PathA = false;
65 /* Initial at Modify Tx Scaling Mode */
66 pDM_Odm->Modify_TxAGC_Flag_PathB = false;
67 pDM_Odm->Remnant_CCKSwingIdx = 0;
68 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
69 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
70 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
71 }
72
ODM_TXPowerTrackingCallback_ThermalMeter(struct adapter * Adapter)73 void ODM_TXPowerTrackingCallback_ThermalMeter(struct adapter *Adapter)
74 {
75
76 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
77 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
78
79 u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
80 u8 ThermalValue_AVG_count = 0;
81 u32 ThermalValue_AVG = 0;
82
83 u8 OFDM_min_index = 0; /* OFDM BB Swing should be less than +3.0dB, which is required by Arthur */
84 u8 Indexforchannel = 0; /* GetRightChnlPlaceforIQK(pHalData->CurrentChannel) */
85
86 TXPWRTRACK_CFG c;
87
88
89 /* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */
90 u8 *deltaSwingTableIdx_TUP_A;
91 u8 *deltaSwingTableIdx_TDOWN_A;
92 u8 *deltaSwingTableIdx_TUP_B;
93 u8 *deltaSwingTableIdx_TDOWN_B;
94
95 /* 4 2. Initialization (7 steps in total) */
96
97 ConfigureTxpowerTrack(pDM_Odm, &c);
98
99 (*c.GetDeltaSwingTable)(
100 pDM_Odm,
101 (u8 **)&deltaSwingTableIdx_TUP_A,
102 (u8 **)&deltaSwingTableIdx_TDOWN_A,
103 (u8 **)&deltaSwingTableIdx_TUP_B,
104 (u8 **)&deltaSwingTableIdx_TDOWN_B
105 );
106
107 /* cosa add for debug */
108 pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++;
109 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = true;
110
111 ODM_RT_TRACE(
112 pDM_Odm,
113 ODM_COMP_TX_PWR_TRACK,
114 ODM_DBG_LOUD,
115 (
116 "===>ODM_TXPowerTrackingCallback_ThermalMeter,\npDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]: %d, pDM_Odm->DefaultOfdmIndex: %d\n",
117 pDM_Odm->BbSwingIdxCckBase,
118 pDM_Odm->BbSwingIdxOfdmBase[ODM_RF_PATH_A],
119 pDM_Odm->DefaultOfdmIndex
120 )
121 );
122
123 ThermalValue = (u8)PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */
124 if (
125 !pDM_Odm->RFCalibrateInfo.TxPowerTrackControl ||
126 pHalData->EEPROMThermalMeter == 0 ||
127 pHalData->EEPROMThermalMeter == 0xFF
128 )
129 return;
130
131 /* 4 3. Initialize ThermalValues of RFCalibrateInfo */
132
133 if (pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)
134 ODM_RT_TRACE(
135 pDM_Odm,
136 ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
137 ("reload ofdm index for band switch\n")
138 );
139
140 /* 4 4. Calculate average thermal meter */
141
142 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;
143 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;
144 if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum) /* Average times = c.AverageThermalNum */
145 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;
146
147 for (i = 0; i < c.AverageThermalNum; i++) {
148 if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i]) {
149 ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];
150 ThermalValue_AVG_count++;
151 }
152 }
153
154 /* Calculate Average ThermalValue after average enough times */
155 if (ThermalValue_AVG_count) {
156 ThermalValue = (u8)(ThermalValue_AVG / ThermalValue_AVG_count);
157 ODM_RT_TRACE(
158 pDM_Odm,
159 ODM_COMP_TX_PWR_TRACK,
160 ODM_DBG_LOUD,
161 (
162 "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
163 ThermalValue,
164 pHalData->EEPROMThermalMeter
165 )
166 );
167 }
168
169 /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
170 /* delta" here is used to determine whether thermal value changes or not. */
171 delta =
172 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) ?
173 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue) :
174 (pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);
175 delta_LCK =
176 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) ?
177 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) :
178 (pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);
179 delta_IQK =
180 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) ?
181 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) :
182 (pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);
183
184 ODM_RT_TRACE(
185 pDM_Odm,
186 ODM_COMP_TX_PWR_TRACK,
187 ODM_DBG_LOUD,
188 (
189 "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
190 delta,
191 delta_LCK,
192 delta_IQK
193 )
194 );
195
196 /* 4 6. If necessary, do LCK. */
197 /* Delta temperature is equal to or larger than 20 centigrade. */
198 if (delta_LCK >= c.Threshold_IQK) {
199 ODM_RT_TRACE(
200 pDM_Odm,
201 ODM_COMP_TX_PWR_TRACK,
202 ODM_DBG_LOUD,
203 (
204 "delta_LCK(%d) >= Threshold_IQK(%d)\n",
205 delta_LCK,
206 c.Threshold_IQK
207 )
208 );
209 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;
210 if (c.PHY_LCCalibrate)
211 (*c.PHY_LCCalibrate)(pDM_Odm);
212 }
213
214 /* 3 7. If necessary, move the index of swing table to adjust Tx power. */
215 if (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl) {
216 /* delta" here is used to record the absolute value of difference. */
217 delta =
218 ThermalValue > pHalData->EEPROMThermalMeter ?
219 (ThermalValue - pHalData->EEPROMThermalMeter) :
220 (pHalData->EEPROMThermalMeter - ThermalValue);
221
222 if (delta >= TXPWR_TRACK_TABLE_SIZE)
223 delta = TXPWR_TRACK_TABLE_SIZE - 1;
224
225 /* 4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset */
226 if (ThermalValue > pHalData->EEPROMThermalMeter) {
227 ODM_RT_TRACE(
228 pDM_Odm,
229 ODM_COMP_TX_PWR_TRACK,
230 ODM_DBG_LOUD,
231 (
232 "deltaSwingTableIdx_TUP_A[%d] = %d\n",
233 delta,
234 deltaSwingTableIdx_TUP_A[delta]
235 )
236 );
237 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] =
238 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
239 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] =
240 deltaSwingTableIdx_TUP_A[delta];
241
242 /* Record delta swing for mix mode power tracking */
243 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
244 deltaSwingTableIdx_TUP_A[delta];
245
246 ODM_RT_TRACE(
247 pDM_Odm,
248 ODM_COMP_TX_PWR_TRACK,
249 ODM_DBG_LOUD,
250 (
251 "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
252 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
253 )
254 );
255
256 if (c.RfPathCount > 1) {
257 ODM_RT_TRACE(
258 pDM_Odm,
259 ODM_COMP_TX_PWR_TRACK,
260 ODM_DBG_LOUD,
261 (
262 "deltaSwingTableIdx_TUP_B[%d] = %d\n",
263 delta,
264 deltaSwingTableIdx_TUP_B[delta]
265 )
266 );
267 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] =
268 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
269 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] =
270 deltaSwingTableIdx_TUP_B[delta];
271
272 /* Record delta swing for mix mode power tracking */
273 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
274 deltaSwingTableIdx_TUP_B[delta];
275 ODM_RT_TRACE(
276 pDM_Odm,
277 ODM_COMP_TX_PWR_TRACK,
278 ODM_DBG_LOUD,
279 (
280 "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
281 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
282 )
283 );
284 }
285
286 } else {
287 ODM_RT_TRACE(
288 pDM_Odm,
289 ODM_COMP_TX_PWR_TRACK,
290 ODM_DBG_LOUD,
291 (
292 "deltaSwingTableIdx_TDOWN_A[%d] = %d\n",
293 delta,
294 deltaSwingTableIdx_TDOWN_A[delta]
295 )
296 );
297
298 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] =
299 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
300 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] =
301 -1 * deltaSwingTableIdx_TDOWN_A[delta];
302
303 /* Record delta swing for mix mode power tracking */
304 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
305 -1 * deltaSwingTableIdx_TDOWN_A[delta];
306
307 ODM_RT_TRACE(
308 pDM_Odm,
309 ODM_COMP_TX_PWR_TRACK,
310 ODM_DBG_LOUD,
311 (
312 "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
313 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
314 )
315 );
316
317 if (c.RfPathCount > 1) {
318 ODM_RT_TRACE(
319 pDM_Odm,
320 ODM_COMP_TX_PWR_TRACK,
321 ODM_DBG_LOUD,
322 (
323 "deltaSwingTableIdx_TDOWN_B[%d] = %d\n",
324 delta,
325 deltaSwingTableIdx_TDOWN_B[delta]
326 )
327 );
328
329 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] =
330 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
331 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] =
332 -1 * deltaSwingTableIdx_TDOWN_B[delta];
333
334 /* Record delta swing for mix mode power tracking */
335 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
336 -1 * deltaSwingTableIdx_TDOWN_B[delta];
337
338 ODM_RT_TRACE(
339 pDM_Odm,
340 ODM_COMP_TX_PWR_TRACK,
341 ODM_DBG_LOUD,
342 (
343 "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
344 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
345 )
346 );
347 }
348 }
349
350 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
351 ODM_RT_TRACE(
352 pDM_Odm,
353 ODM_COMP_TX_PWR_TRACK,
354 ODM_DBG_LOUD,
355 (
356 "\n\n ================================ [Path-%c] Calculating PowerIndexOffset ================================\n",
357 (p == ODM_RF_PATH_A ? 'A' : 'B')
358 )
359 );
360
361 if (
362 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] ==
363 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]
364 ) /* If Thermal value changes but lookup table value still the same */
365 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
366 else
367 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]; /* Power Index Diff between 2 times Power Tracking */
368
369 ODM_RT_TRACE(
370 pDM_Odm,
371 ODM_COMP_TX_PWR_TRACK,
372 ODM_DBG_LOUD,
373 (
374 "[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
375 (
376 p == ODM_RF_PATH_A ? 'A' : 'B'),
377 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p],
378 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p],
379 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]
380 )
381 );
382
383 pDM_Odm->RFCalibrateInfo.OFDM_index[p] =
384 pDM_Odm->BbSwingIdxOfdmBase[p] +
385 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
386
387 pDM_Odm->RFCalibrateInfo.CCK_index =
388 pDM_Odm->BbSwingIdxCckBase +
389 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
390
391 pDM_Odm->BbSwingIdxCck =
392 pDM_Odm->RFCalibrateInfo.CCK_index;
393
394 pDM_Odm->BbSwingIdxOfdm[p] =
395 pDM_Odm->RFCalibrateInfo.OFDM_index[p];
396
397 /* *************Print BB Swing Base and Index Offset************* */
398 ODM_RT_TRACE(
399 pDM_Odm,
400 ODM_COMP_TX_PWR_TRACK,
401 ODM_DBG_LOUD,
402 (
403 "The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
404 pDM_Odm->BbSwingIdxCck,
405 pDM_Odm->BbSwingIdxCckBase,
406 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]
407 )
408 );
409 ODM_RT_TRACE(
410 pDM_Odm,
411 ODM_COMP_TX_PWR_TRACK,
412 ODM_DBG_LOUD,
413 (
414 "The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
415 pDM_Odm->BbSwingIdxOfdm[p],
416 (p == ODM_RF_PATH_A ? 'A' : 'B'),
417 pDM_Odm->BbSwingIdxOfdmBase[p],
418 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]
419 )
420 );
421
422 /* 4 7.1 Handle boundary conditions of index. */
423 if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1)
424 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1;
425 else if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] < OFDM_min_index)
426 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index;
427 }
428 ODM_RT_TRACE(
429 pDM_Odm,
430 ODM_COMP_TX_PWR_TRACK,
431 ODM_DBG_LOUD,
432 ("\n\n ========================================================================================================\n")
433 );
434 if (pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)
435 pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;
436 /* else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0) */
437 /* pDM_Odm->RFCalibrateInfo.CCK_index = 0; */
438 } else {
439 ODM_RT_TRACE(
440 pDM_Odm,
441 ODM_COMP_TX_PWR_TRACK,
442 ODM_DBG_LOUD,
443 (
444 "The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
445 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl,
446 ThermalValue,
447 pDM_Odm->RFCalibrateInfo.ThermalValue
448 )
449 );
450
451 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
452 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
453 }
454 ODM_RT_TRACE(
455 pDM_Odm,
456 ODM_COMP_TX_PWR_TRACK,
457 ODM_DBG_LOUD,
458 (
459 "TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
460 pDM_Odm->RFCalibrateInfo.CCK_index,
461 pDM_Odm->BbSwingIdxCckBase
462 )
463 );
464
465 /* Print Swing base & current */
466 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
467 ODM_RT_TRACE(
468 pDM_Odm,
469 ODM_COMP_TX_PWR_TRACK,
470 ODM_DBG_LOUD,
471 (
472 "TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
473 pDM_Odm->RFCalibrateInfo.OFDM_index[p],
474 (p == ODM_RF_PATH_A ? 'A' : 'B'),
475 pDM_Odm->BbSwingIdxOfdmBase[p]
476 )
477 );
478 }
479
480 if (
481 (pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 ||
482 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0) &&
483 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl
484 ) {
485 /* 4 7.2 Configure the Swing Table to adjust Tx Power. */
486
487 pDM_Odm->RFCalibrateInfo.bTxPowerChanged = true; /* Always true after Tx Power is adjusted by power tracking. */
488 /* */
489 /* 2012/04/23 MH According to Luke's suggestion, we can not write BB digital */
490 /* to increase TX power. Otherwise, EVM will be bad. */
491 /* */
492 /* 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. */
493 if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) {
494 ODM_RT_TRACE(
495 pDM_Odm,
496 ODM_COMP_TX_PWR_TRACK,
497 ODM_DBG_LOUD,
498 (
499 "Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
500 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A],
501 delta,
502 ThermalValue,
503 pHalData->EEPROMThermalMeter,
504 pDM_Odm->RFCalibrateInfo.ThermalValue
505 )
506 );
507
508 if (c.RfPathCount > 1)
509 ODM_RT_TRACE(
510 pDM_Odm,
511 ODM_COMP_TX_PWR_TRACK,
512 ODM_DBG_LOUD,
513 (
514 "Temperature Increasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
515 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B],
516 delta,
517 ThermalValue,
518 pHalData->EEPROMThermalMeter,
519 pDM_Odm->RFCalibrateInfo.ThermalValue
520 )
521 );
522
523 } else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue) { /* Low temperature */
524 ODM_RT_TRACE(
525 pDM_Odm,
526 ODM_COMP_TX_PWR_TRACK,
527 ODM_DBG_LOUD,
528 (
529 "Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
530 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A],
531 delta,
532 ThermalValue,
533 pHalData->EEPROMThermalMeter,
534 pDM_Odm->RFCalibrateInfo.ThermalValue
535 )
536 );
537
538 if (c.RfPathCount > 1)
539 ODM_RT_TRACE(
540 pDM_Odm,
541 ODM_COMP_TX_PWR_TRACK,
542 ODM_DBG_LOUD,
543 (
544 "Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
545 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B],
546 delta,
547 ThermalValue,
548 pHalData->EEPROMThermalMeter,
549 pDM_Odm->RFCalibrateInfo.ThermalValue
550 )
551 );
552
553 }
554
555 if (ThermalValue > pHalData->EEPROMThermalMeter) {
556 ODM_RT_TRACE(
557 pDM_Odm,
558 ODM_COMP_TX_PWR_TRACK,
559 ODM_DBG_LOUD,
560 (
561 "Temperature(%d) higher than PG value(%d)\n",
562 ThermalValue,
563 pHalData->EEPROMThermalMeter
564 )
565 );
566
567 ODM_RT_TRACE(
568 pDM_Odm,
569 ODM_COMP_TX_PWR_TRACK,
570 ODM_DBG_LOUD,
571 ("**********Enter POWER Tracking MIX_MODE**********\n")
572 );
573 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
574 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
575 } else {
576 ODM_RT_TRACE(
577 pDM_Odm,
578 ODM_COMP_TX_PWR_TRACK,
579 ODM_DBG_LOUD,
580 (
581 "Temperature(%d) lower than PG value(%d)\n",
582 ThermalValue,
583 pHalData->EEPROMThermalMeter
584 )
585 );
586
587 ODM_RT_TRACE(
588 pDM_Odm,
589 ODM_COMP_TX_PWR_TRACK,
590 ODM_DBG_LOUD,
591 ("**********Enter POWER Tracking MIX_MODE**********\n")
592 );
593 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
594 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
595 }
596
597 /* Record last time Power Tracking result as base. */
598 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->BbSwingIdxCck;
599 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
600 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->BbSwingIdxOfdm[p];
601
602 ODM_RT_TRACE(
603 pDM_Odm,
604 ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
605 (
606 "pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue = %d\n",
607 pDM_Odm->RFCalibrateInfo.ThermalValue,
608 ThermalValue
609 )
610 );
611
612 /* Record last Power Tracking Thermal Value */
613 pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;
614 }
615
616 ODM_RT_TRACE(
617 pDM_Odm,
618 ODM_COMP_TX_PWR_TRACK,
619 ODM_DBG_LOUD,
620 ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n")
621 );
622
623 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
624 }
625