3070e792b9f1008f5992025ea71914fa0ccaf881
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / hal / OUTSRC / 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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20
21 #include "Mp_Precomp.h"
22 #include "phydm_precomp.h"
23
24
25 #define         CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
26                                         do {\
27                                                 for(_offset = 0; _offset < _size; _offset++)\
28                                                 {\
29                                                         if(_deltaThermal < thermalThreshold[_direction][_offset])\
30                                                         {\
31                                                                 if(_offset != 0)\
32                                                                         _offset--;\
33                                                                 break;\
34                                                         }\
35                                                 }                       \
36                                                 if(_offset >= _size)\
37                                                         _offset = _size-1;\
38                                         } while(0)
39
40
41 void ConfigureTxpowerTrack(
42         IN      PDM_ODM_T               pDM_Odm,
43         OUT     PTXPWRTRACK_CFG pConfig
44         )
45 {
46 #if RTL8192E_SUPPORT
47         if(pDM_Odm->SupportICType==ODM_RTL8192E)
48                 ConfigureTxpowerTrack_8192E(pConfig);
49 #endif  
50 #if RTL8821A_SUPPORT
51         if(pDM_Odm->SupportICType==ODM_RTL8821)
52                 ConfigureTxpowerTrack_8821A(pConfig);
53 #endif
54 #if RTL8812A_SUPPORT
55         if(pDM_Odm->SupportICType==ODM_RTL8812)
56                 ConfigureTxpowerTrack_8812A(pConfig);
57 #endif
58 #if RTL8188E_SUPPORT
59         if(pDM_Odm->SupportICType==ODM_RTL8188E)
60                 ConfigureTxpowerTrack_8188E(pConfig);
61 #endif 
62
63 #if RTL8723B_SUPPORT
64         if(pDM_Odm->SupportICType==ODM_RTL8723B)
65                 ConfigureTxpowerTrack_8723B(pConfig);
66 #endif
67
68 }
69
70 //======================================================================
71 // <20121113, Kordan> This function should be called when TxAGC changed.
72 // Otherwise the previous compensation is gone, because we record the 
73 // delta of temperature between two TxPowerTracking watch dogs.
74 //
75 // NOTE: If Tx BB swing or Tx scaling is varified during run-time, still 
76 //       need to call this function.
77 //======================================================================
78 VOID
79 ODM_ClearTxPowerTrackingState(
80         IN PDM_ODM_T            pDM_Odm
81         )
82 {
83         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
84         u1Byte                  p = 0;
85         
86         pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
87         pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex;
88         pDM_Odm->RFCalibrateInfo.CCK_index = 0;
89         
90         for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)
91         {
92                 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
93                 pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->DefaultOfdmIndex;
94                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
95
96                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
97                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
98                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
99                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
100
101                 pDM_Odm->Absolute_OFDMSwingIdx[p] = 0;    // Initial Mix mode power tracking
102                 pDM_Odm->Remnant_OFDMSwingIdx[p] = 0;                     
103         }
104         
105         pDM_Odm->Modify_TxAGC_Flag_PathA= FALSE;       //Initial at Modify Tx Scaling Mode
106         pDM_Odm->Modify_TxAGC_Flag_PathB= FALSE;       //Initial at Modify Tx Scaling Mode
107         pDM_Odm->Remnant_CCKSwingIdx= 0;
108         pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
109         pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
110         pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;       
111 }
112
113 VOID
114 ODM_TXPowerTrackingCallback_ThermalMeter(
115 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
116         IN PDM_ODM_T            pDM_Odm
117 #else
118         IN PADAPTER     Adapter
119 #endif
120         )
121 {
122
123 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
124         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
125         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
126         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
127         #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
128         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;
129         #endif
130 #endif
131         
132         u1Byte                  ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
133         u1Byte                  ThermalValue_AVG_count = 0;
134         u4Byte                  ThermalValue_AVG = 0;   
135
136         u1Byte                  OFDM_min_index = 0;  // OFDM BB Swing should be less than +3.0dB, which is required by Arthur
137         u1Byte                  Indexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel)
138
139         TXPWRTRACK_CFG  c;
140
141
142         //4 1. The following TWO tables decide the final index of OFDM/CCK swing table.
143         pu1Byte                 deltaSwingTableIdx_TUP_A;
144         pu1Byte                 deltaSwingTableIdx_TDOWN_A;
145         pu1Byte                 deltaSwingTableIdx_TUP_B;
146         pu1Byte                 deltaSwingTableIdx_TDOWN_B;
147         
148         //4 2. Initilization ( 7 steps in total )
149
150         ConfigureTxpowerTrack(pDM_Odm, &c);
151
152         (*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_A, (pu1Byte*)&deltaSwingTableIdx_TDOWN_A,
153                                                                           (pu1Byte*)&deltaSwingTableIdx_TUP_B, (pu1Byte*)&deltaSwingTableIdx_TDOWN_B);  
154         
155         pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; //cosa add for debug
156         pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = TRUE;
157     
158 #if (MP_DRIVER == 1)
159 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
160         pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl; // <Kordan> We should keep updating the control variable according to HalData.
161 #endif
162
163 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
164         if (pDM_Odm->mp_mode == TRUE)
165 #endif
166                 // <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files.
167                 pDM_Odm->RFCalibrateInfo.RegA24 = 0x090e1317;
168 #endif
169
170         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
171                 ("===>ODM_TXPowerTrackingCallback_ThermalMeter, \
172                  \n pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]: %d, pDM_Odm->DefaultOfdmIndex: %d\n", 
173                 pDM_Odm->BbSwingIdxCckBase, pDM_Odm->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pDM_Odm->DefaultOfdmIndex));
174
175         ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00);  //0x42: RF Reg[15:10] 88E
176         if( ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl || pHalData->EEPROMThermalMeter == 0 || 
177                 pHalData->EEPROMThermalMeter == 0xFF)
178         return;
179
180
181         //4 3. Initialize ThermalValues of RFCalibrateInfo
182
183         if(pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)
184         {
185                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("reload ofdm index for band switch\n"));                              
186         }
187
188         //4 4. Calculate average thermal meter
189         
190         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;
191         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;
192         if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)   //Average times =  c.AverageThermalNum
193                 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;
194
195         for(i = 0; i < c.AverageThermalNum; i++)
196         {
197                 if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i])
198                 {
199                         ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];
200                         ThermalValue_AVG_count++;
201                 }
202         }
203
204         if(ThermalValue_AVG_count)               //Calculate Average ThermalValue after average enough times
205         {
206                 ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);
207                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
208                         ("AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n", ThermalValue, pHalData->EEPROMThermalMeter));                                 
209         }
210                         
211         //4 5. Calculate delta, delta_LCK, delta_IQK.
212
213         //"delta" here is used to determine whether thermal value changes or not.
214         delta     = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue):(pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);
215         delta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);
216         delta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);
217
218         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK));
219         
220         //4 6. If necessary, do LCK.    
221         
222         if ((delta_LCK >= c.Threshold_IQK)) // Delta temperature is equal to or larger than 20 centigrade.
223         {
224                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_LCK(%d) >= Threshold_IQK(%d)\n", delta_LCK, c.Threshold_IQK));
225                 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;
226                 if(c.PHY_LCCalibrate)
227                         (*c.PHY_LCCalibrate)(pDM_Odm);
228         }
229
230         //3 7. If necessary, move the index of swing table to adjust Tx power.  
231         
232         if (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)
233         {
234                 //"delta" here is used to record the absolute value of differrence.
235 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                    
236             delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);            
237 #else
238             delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);            
239 #endif
240                 if (delta >= TXPWR_TRACK_TABLE_SIZE)
241                         delta = TXPWR_TRACK_TABLE_SIZE - 1;
242
243                 //4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset
244                 
245 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                            
246                 if(ThermalValue > pHalData->EEPROMThermalMeter) {
247 #else
248                 if(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {
249 #endif
250                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
251                 ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta]));
252                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
253                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = deltaSwingTableIdx_TUP_A[delta];
254
255                         pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =  deltaSwingTableIdx_TUP_A[delta];        // Record delta swing for mix mode power tracking
256
257                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]));  
258
259                         if(c.RfPathCount > 1)
260                         {
261                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
262                                              ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta]));  
263                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
264                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = deltaSwingTableIdx_TUP_B[delta];
265
266                         pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =  deltaSwingTableIdx_TUP_B[delta];       // Record delta swing for mix mode power tracking
267
268                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]));  
269                         }
270                         
271         } 
272                 else {
273                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
274                                 ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta]));  
275
276                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
277                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] = -1 * deltaSwingTableIdx_TDOWN_A[delta];
278
279                         pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =  -1 * deltaSwingTableIdx_TDOWN_A[delta];        // Record delta swing for mix mode power tracking
280
281                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]));  
282
283                                 if(c.RfPathCount > 1)
284                                 {
285                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
286                                 ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta]));  
287                                         
288                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
289                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] = -1 * deltaSwingTableIdx_TDOWN_B[delta];
290
291                         pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =  -1 * deltaSwingTableIdx_TDOWN_B[delta];       // Record delta swing for mix mode power tracking
292
293                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]));  
294         }
295         }
296                 
297             for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)             
298         {
299                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
300                 ("\n\n================================ [Path-%c] Calculating PowerIndexOffset ================================\n", (p == ODM_RF_PATH_A ? 'A' : 'B')));  
301                         
302                     if (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p])         // If Thermal value changes but lookup table value still the same
303                         pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
304                     else
305                         pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p];      // Power Index Diff between 2 times Power Tracking
306
307                     ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n", 
308                 (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p], pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p], 
309                 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]));              
310                 
311                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->BbSwingIdxOfdmBase[p] + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
312                     pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
313
314                     pDM_Odm->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index;        
315                         pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->RFCalibrateInfo.OFDM_index[p];
316
317                         // *************Print BB Swing Base and Index Offset*************
318
319                     ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", 
320                         pDM_Odm->BbSwingIdxCck, pDM_Odm->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));
321                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n", 
322                                 pDM_Odm->BbSwingIdxOfdm[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p], pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]));
323
324                     //4 7.1 Handle boundary conditions of index.
325                 
326                 
327                         if(pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1)
328                         {
329                                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1;
330                         }
331                         else if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] < OFDM_min_index)
332                         {
333                                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index;
334                         }
335                 }
336                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
337             ("\n\n========================================================================================================\n"));  
338                 if(pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)
339                         pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;
340                 //else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0)
341                         //pDM_Odm->RFCalibrateInfo.CCK_index = 0;
342         }
343         else
344         {
345                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
346                         ("The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n", 
347                         pDM_Odm->RFCalibrateInfo.TxPowerTrackControl, ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue));
348                 
349             for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)             
350                     pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
351         }
352         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
353                 ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n", 
354                 pDM_Odm->RFCalibrateInfo.CCK_index, pDM_Odm->BbSwingIdxCckBase));       //Print Swing base & current
355         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
356         {
357                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
358                         ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
359                         pDM_Odm->RFCalibrateInfo.OFDM_index[p], (p == ODM_RF_PATH_A ? 'A' : 'B'), pDM_Odm->BbSwingIdxOfdmBase[p]));
360         }
361         
362         if ((pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 ||
363                  pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0 ) && 
364          pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)
365         {
366                 //4 7.2 Configure the Swing Table to adjust Tx Power.
367                 
368                 pDM_Odm->RFCalibrateInfo.bTxPowerChanged = TRUE; // Always TRUE after Tx Power is adjusted by power tracking.                   
369                 //
370                 // 2012/04/23 MH According to Luke's suggestion, we can not write BB digital
371                 // to increase TX power. Otherwise, EVM will be bad.
372                 //
373                 // 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.
374                 if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)
375                 {
376                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
377                                 ("Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", 
378                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));   
379
380                         if(c.RfPathCount > 1)
381                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
382                                 ("Temperature Increasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", 
383                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));   
384
385                 }
386                 else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue)// Low temperature
387                 {
388                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
389                                 ("Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
390                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));                           
391
392                         if(c.RfPathCount > 1)
393                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
394                                 ("Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
395                                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B], delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));                           
396
397                 }
398 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
399                 if (ThermalValue > pHalData->EEPROMThermalMeter)
400 #else
401                 if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)
402 #endif
403                 {
404                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
405                                 ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));                    
406
407                         if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || 
408                                 pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  || pDM_Odm->SupportICType == ODM_RTL8723B)
409                         {
410                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking MIX_MODE**********\n"));
411                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
412                                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
413                         }
414                         else 
415                         {
416                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking BBSWING_MODE**********\n"));
417                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
418                                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);
419                         }
420                 }
421                 else
422                 {
423                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
424                                 ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));
425
426                         if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || 
427                                 pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  || pDM_Odm->SupportICType == ODM_RTL8723B)
428                         {
429                     ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking MIX_MODE**********\n"));
430                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
431                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
432                         }
433                         else
434                         {
435                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter POWER Tracking BBSWING_MODE**********\n"));
436                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
437                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);
438                         }
439                         
440                 }
441
442                 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->BbSwingIdxCck;   // Record last time Power Tracking result as base.
443                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
444                                 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->BbSwingIdxOfdm[p];
445
446                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
447                                         ("pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue= %d\n", pDM_Odm->RFCalibrateInfo.ThermalValue, ThermalValue));
448                 
449                 pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;         //Record last Power Tracking Thermal Value
450
451         }
452 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
453 #if (RTL8723B_SUPPORT == 0)
454         // Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).
455         if ((delta_IQK >= c.Threshold_IQK)) {           
456                 if ( ! pDM_Odm->RFCalibrateInfo.bIQKInProgress) 
457                         (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);
458         }
459 #endif          
460 #endif          
461                         
462         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("<===ODM_TXPowerTrackingCallback_ThermalMeter\n"));
463         
464         pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
465 }
466
467
468
469
470 //3============================================================
471 //3 IQ Calibration
472 //3============================================================
473
474 VOID
475 ODM_ResetIQKResult(
476         IN PDM_ODM_T    pDM_Odm 
477 )
478 {
479         u1Byte          i;
480 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN || DM_ODM_SUPPORT_TYPE == ODM_CE)
481         PADAPTER        Adapter = pDM_Odm->Adapter;
482
483         if (!IS_HARDWARE_TYPE_8192D(Adapter))
484                 return;
485 #endif
486         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD,("PHY_ResetIQKResult:: settings regs %d default regs %d\n", (u4Byte)(sizeof(pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting)/sizeof(IQK_MATRIX_REGS_SETTING)), IQK_Matrix_Settings_NUM));
487         //0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc
488
489         for(i = 0; i < IQK_Matrix_Settings_NUM; i++)
490         {
491                 {
492                         pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][0] = 
493                                 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][2] = 
494                                 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][4] = 
495                                 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][6] = 0x100;
496
497                         pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][1] = 
498                                 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][3] = 
499                                 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][5] = 
500                                 pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].Value[0][7] = 0x0;
501
502                         pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[i].bIQKDone = FALSE;
503
504                 }
505         }
506
507 }
508 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
509 u1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)
510 {
511         u1Byte  channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = 
512         {1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,161,163,165};
513         u1Byte  place = chnl;
514
515         
516         if(chnl > 14)
517         {
518                 for(place = 14; place<sizeof(channel_all); place++)
519                 {
520                         if(channel_all[place] == chnl)
521                         {
522                                 return place-13;
523                         }
524                 }
525         }       
526         return 0;
527
528 }
529 #endif
530