GNU Linux-libre 4.19.286-gnu1
[releases.git] / drivers / staging / rtl8723bs / hal / HalPhyRf.c
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
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 /*  */
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
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. Initilization (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 differrence. */
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
626
627
628
629 /* 3 ============================================================ */
630 /* 3 IQ Calibration */
631 /* 3 ============================================================ */
632
633 u8 ODM_GetRightChnlPlaceforIQK(u8 chnl)
634 {
635         u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {
636                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
637                 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
638                 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
639                 114, 116, 118, 120, 122, 124, 126, 128, 130, 132,
640                 134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
641                 161, 163, 165
642         };
643         u8 place = chnl;
644
645
646         if (chnl > 14) {
647                 for (place = 14; place < sizeof(channel_all); place++) {
648                         if (channel_all[place] == chnl)
649                                 return place-13;
650                 }
651         }
652         return 0;
653
654 }