OSDN Git Service

staging: rtl8723bs: update to the latest driver
[android-x86/kernel.git] / drivers / staging / rtl8723bs / hal / HalPhyRf.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
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.
8  *
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
12  * more details.
13  *
14  ******************************************************************************/
15
16 /* include "Mp_Precomp.h" */
17 #include "odm_precomp.h"
18
19
20 #define         CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
21                                         do {\
22                                                 for (_offset = 0; _offset < _size; _offset++)\
23                                                 {\
24                                                         if (_deltaThermal < thermalThreshold[_direction][_offset])\
25                                                         {\
26                                                                 if (_offset != 0)\
27                                                                         _offset--;\
28                                                                 break;\
29                                                         }\
30                                                 }                       \
31                                                 if (_offset >= _size)\
32                                                         _offset = _size-1;\
33                                         } while (0)
34
35
36 void ConfigureTxpowerTrack(
37 PDM_ODM_T               pDM_Odm,
38         PTXPWRTRACK_CFG pConfig
39         )
40 {
41         ConfigureTxpowerTrack_8723B(pConfig);
42 }
43
44 /*  */
45 /*  <20121113, Kordan> This function should be called when TxAGC changed. */
46 /*  Otherwise the previous compensation is gone, because we record the */
47 /*  delta of temperature between two TxPowerTracking watch dogs. */
48 /*  */
49 /*  NOTE: If Tx BB swing or Tx scaling is varified during run-time, still */
50 /*        need to call this function. */
51 /*  */
52 void
53 ODM_ClearTxPowerTrackingState(
54         PDM_ODM_T               pDM_Odm
55         )
56 {
57         struct hal_com_data *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
58         u8      p = 0;
59
60         pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
61         pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex;
62         pDM_Odm->RFCalibrateInfo.CCK_index = 0;
63
64         for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
65         {
66                 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
67                 pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->DefaultOfdmIndex;
68                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
69
70                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
71                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
72                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
73                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
74
75                 pDM_Odm->Absolute_OFDMSwingIdx[p] = 0;    /*  Initial Mix mode power tracking */
76                 pDM_Odm->Remnant_OFDMSwingIdx[p] = 0;
77         }
78
79         pDM_Odm->Modify_TxAGC_Flag_PathA = false;       /* Initial at Modify Tx Scaling Mode */
80         pDM_Odm->Modify_TxAGC_Flag_PathB = false;       /* Initial at Modify Tx Scaling Mode */
81         pDM_Odm->Remnant_CCKSwingIdx = 0;
82         pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
83         pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
84         pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
85 }
86
87 void
88 ODM_TXPowerTrackingCallback_ThermalMeter(
89         struct adapter *Adapter
90         )
91 {
92
93         struct hal_com_data     *pHalData = GET_HAL_DATA(Adapter);
94         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;
95
96         u8      ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
97         u8      ThermalValue_AVG_count = 0;
98         u32             ThermalValue_AVG = 0;
99
100         u8      OFDM_min_index = 0;  /*  OFDM BB Swing should be less than +3.0dB, which is required by Arthur */
101         u8      Indexforchannel = 0; /*  GetRightChnlPlaceforIQK(pHalData->CurrentChannel) */
102
103         TXPWRTRACK_CFG  c;
104
105
106         /* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */
107         u8 *            deltaSwingTableIdx_TUP_A;
108         u8 *            deltaSwingTableIdx_TDOWN_A;
109         u8 *            deltaSwingTableIdx_TUP_B;
110         u8 *            deltaSwingTableIdx_TDOWN_B;
111
112         /* 4 2. Initilization (7 steps in total) */
113
114         ConfigureTxpowerTrack(pDM_Odm, &c);
115
116         (*c.GetDeltaSwingTable)(pDM_Odm, (u8 **)&deltaSwingTableIdx_TUP_A, (u8 **)&deltaSwingTableIdx_TDOWN_A,
117                                                                           (u8 **)&deltaSwingTableIdx_TUP_B, (u8 **)&deltaSwingTableIdx_TDOWN_B);
118
119         pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; /* cosa add for debug */
120         pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = true;
121
122         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
123                 ("===>ODM_TXPowerTrackingCallback_ThermalMeter, \
124                 \n pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]: %d, pDM_Odm->DefaultOfdmIndex: %d\n",
125                 pDM_Odm->BbSwingIdxCckBase, pDM_Odm->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pDM_Odm->DefaultOfdmIndex));
126
127         ThermalValue = (u8)PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00);   /* 0x42: RF Reg[15:10] 88E */
128         if (! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl || pHalData->EEPROMThermalMeter == 0 ||
129             pHalData->EEPROMThermalMeter == 0xFF)
130                 return;
131
132         /* 4 3. Initialize ThermalValues of RFCalibrateInfo */
133
134         if (pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)
135                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("reload ofdm index for band switch\n"));
136
137         /* 4 4. Calculate average thermal meter */
138
139         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;
140         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;
141         if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)   /* Average times =  c.AverageThermalNum */
142                 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;
143
144         for (i = 0; i < c.AverageThermalNum; i++) {
145                 if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i]) {
146                         ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];
147                         ThermalValue_AVG_count++;
148                 }
149         }
150
151         if (ThermalValue_AVG_count)               /* Calculate Average ThermalValue after average enough times */
152         {
153                 ThermalValue = (u8)(ThermalValue_AVG / ThermalValue_AVG_count);
154                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
155                         ("AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n", ThermalValue, pHalData->EEPROMThermalMeter));
156         }
157
158         /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
159
160         /* delta" here is used to determine whether thermal value changes or not. */
161         delta     = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue):(pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);
162         delta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);
163         delta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);
164
165         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));
166
167         /* 4 6. If necessary, do LCK. */
168
169         if ((delta_LCK >= c.Threshold_IQK)) /*  Delta temperature is equal to or larger than 20 centigrade. */
170         {
171                 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));
172                 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;
173                 if (c.PHY_LCCalibrate)
174                         (*c.PHY_LCCalibrate)(pDM_Odm);
175         }
176
177         /* 3 7. If necessary, move the index of swing table to adjust Tx power. */
178
179         if (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl) {
180                 /* delta" here is used to record the absolute value of differrence. */
181                 delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
182                 if (delta >= TXPWR_TRACK_TABLE_SIZE)
183                         delta = TXPWR_TRACK_TABLE_SIZE - 1;
184
185                 /* 4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset */
186
187                 if (ThermalValue > pHalData->EEPROMThermalMeter) {
188                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
189                                      ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta]));
190                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
191                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = deltaSwingTableIdx_TUP_A[delta];
192
193                         pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =  deltaSwingTableIdx_TUP_A[delta];        /*  Record delta swing for mix mode power tracking */
194
195                         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]));
196
197                         if (c.RfPathCount > 1)
198                         {
199                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
200                                              ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta]));
201                                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
202                                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = deltaSwingTableIdx_TUP_B[delta];
203
204                                 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =  deltaSwingTableIdx_TUP_B[delta];       /*  Record delta swing for mix mode power tracking */
205
206                                 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]));
207                         }
208
209                 } else {
210                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
211                                 ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta]));
212
213                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
214                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = -1 * deltaSwingTableIdx_TDOWN_A[delta];
215
216                         pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =  -1 * deltaSwingTableIdx_TDOWN_A[delta];        /*  Record delta swing for mix mode power tracking */
217
218                         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]));
219
220                         if (c.RfPathCount > 1) {
221                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
222                                         ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta]));
223
224                                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
225                                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = -1 * deltaSwingTableIdx_TDOWN_B[delta];
226
227                                 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =  -1 * deltaSwingTableIdx_TDOWN_B[delta];       /*  Record delta swing for mix mode power tracking */
228
229                                 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]));
230                         }
231                 }
232
233                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
234                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
235                                      ("\n\n ================================ [Path-%c] Calculating PowerIndexOffset ================================\n", (p == ODM_RF_PATH_A ? 'A' : 'B')));
236
237                         if (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p])         /*  If Thermal value changes but lookup table value still the same */
238                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
239                         else
240                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p];      /*  Power Index Diff between 2 times Power Tracking */
241
242                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
243                                      (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p],
244                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]));
245
246                         pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->BbSwingIdxOfdmBase[p] + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
247                         pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
248
249                         pDM_Odm->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index;
250                         pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->RFCalibrateInfo.OFDM_index[p];
251
252                         /*  *************Print BB Swing Base and Index Offset************* */
253
254                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
255                         pDM_Odm->BbSwingIdxCck, pDM_Odm->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));
256                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
257                                 pDM_Odm->BbSwingIdxOfdm[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p], pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));
258
259                     /* 4 7.1 Handle boundary conditions of index. */
260
261
262                         if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1)
263                         {
264                                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1;
265                         }
266                         else if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] < OFDM_min_index)
267                         {
268                                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index;
269                         }
270                 }
271                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
272             ("\n\n ========================================================================================================\n"));
273                 if (pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)
274                         pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;
275                 /* else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0) */
276                         /* pDM_Odm->RFCalibrateInfo.CCK_index = 0; */
277         }
278         else
279         {
280                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
281                         ("The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
282                         pDM_Odm->RFCalibrateInfo.TxPowerTrackControl, ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue));
283
284             for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
285                     pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
286         }
287         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
288                 ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
289                 pDM_Odm->RFCalibrateInfo.CCK_index, pDM_Odm->BbSwingIdxCckBase));       /* Print Swing base & current */
290         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
291         {
292                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
293                         ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
294                         pDM_Odm->RFCalibrateInfo.OFDM_index[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p]));
295         }
296
297         if ((pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 ||
298                  pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0) &&
299          pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)
300         {
301                 /* 4 7.2 Configure the Swing Table to adjust Tx Power. */
302
303                 pDM_Odm->RFCalibrateInfo.bTxPowerChanged = true; /*  Always true after Tx Power is adjusted by power tracking. */
304                 /*  */
305                 /*  2012/04/23 MH According to Luke's suggestion, we can not write BB digital */
306                 /*  to increase TX power. Otherwise, EVM will be bad. */
307                 /*  */
308                 /*  2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. */
309                 if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)
310                 {
311                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
312                                 ("Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
313                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
314
315                         if (c.RfPathCount > 1)
316                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
317                                 ("Temperature Increasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
318                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
319
320                 }
321                 else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue)/*  Low temperature */
322                 {
323                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
324                                 ("Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
325                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
326
327                         if (c.RfPathCount > 1)
328                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
329                                 ("Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
330                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));
331
332                 }
333                 if (ThermalValue > pHalData->EEPROMThermalMeter)
334                 {
335                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
336                                 ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
337
338                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
339                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
340                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
341                 }
342                 else
343                 {
344                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
345                                 ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
346
347                     ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
348                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
349                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
350                 }
351
352                 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->BbSwingIdxCck;   /*  Record last time Power Tracking result as base. */
353                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
354                                 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->BbSwingIdxOfdm[p];
355
356                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
357                                         ("pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue = %d\n", pDM_Odm->RFCalibrateInfo.ThermalValue, ThermalValue));
358
359                 pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;         /* Record last Power Tracking Thermal Value */
360
361         }
362
363         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n"));
364
365         pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
366 }
367
368
369
370
371 /* 3 ============================================================ */
372 /* 3 IQ Calibration */
373 /* 3 ============================================================ */
374
375 u8 ODM_GetRightChnlPlaceforIQK(u8 chnl)
376 {
377         u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] =
378         {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};
379         u8 place = chnl;
380
381
382         if (chnl > 14)
383         {
384                 for (place = 14; place<sizeof(channel_all); place++)
385                 {
386                         if (channel_all[place] == chnl)
387                         {
388                                 return place-13;
389                         }
390                 }
391         }
392         return 0;
393
394 }