net: wireless: rockchip: add rtl8822be pcie wifi driver
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8822be / hal / phydm / halphyrf_win.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
4  *\r
5  * This program is free software; you can redistribute it and/or modify it\r
6  * under the terms of version 2 of the GNU General Public License as\r
7  * published by the Free Software Foundation.\r
8  *\r
9  * This program is distributed in the hope that it will be useful, but WITHOUT\r
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
12  * more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License along with\r
15  * this program; if not, write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
17  *\r
18  *\r
19  ******************************************************************************/\r
20 \r
21 #include "mp_precomp.h"\r
22 #include "phydm_precomp.h"\r
23 \r
24 #define         CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \\r
25                                         do {\\r
26                                                 for(_offset = 0; _offset < _size; _offset++)\\r
27                                                 {\\r
28                                                         if(_deltaThermal < thermalThreshold[_direction][_offset])\\r
29                                                         {\\r
30                                                                 if(_offset != 0)\\r
31                                                                         _offset--;\\r
32                                                                 break;\\r
33                                                         }\\r
34                                                 }                       \\r
35                                                 if(_offset >= _size)\\r
36                                                         _offset = _size-1;\\r
37                                         } while(0)\r
38 \r
39 void ConfigureTxpowerTrack(\r
40         IN      PDM_ODM_T               pDM_Odm,\r
41         OUT     PTXPWRTRACK_CFG pConfig\r
42         )\r
43 {\r
44 #if RTL8192E_SUPPORT\r
45         if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
46                 ConfigureTxpowerTrack_8192E(pConfig);\r
47 #endif  \r
48 #if RTL8821A_SUPPORT\r
49         if (pDM_Odm->SupportICType == ODM_RTL8821)\r
50                 ConfigureTxpowerTrack_8821A(pConfig);\r
51 #endif\r
52 #if RTL8812A_SUPPORT\r
53         if (pDM_Odm->SupportICType == ODM_RTL8812)\r
54                 ConfigureTxpowerTrack_8812A(pConfig);\r
55 #endif\r
56 #if RTL8188E_SUPPORT\r
57         if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
58                 ConfigureTxpowerTrack_8188E(pConfig);\r
59 #endif \r
60 \r
61 #if RTL8188F_SUPPORT\r
62         if (pDM_Odm->SupportICType == ODM_RTL8188F)\r
63                 ConfigureTxpowerTrack_8188F(pConfig);\r
64 #endif \r
65 \r
66 #if RTL8723B_SUPPORT\r
67         if (pDM_Odm->SupportICType == ODM_RTL8723B)\r
68                 ConfigureTxpowerTrack_8723B(pConfig);\r
69 #endif\r
70 \r
71 #if RTL8814A_SUPPORT\r
72         if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
73                 ConfigureTxpowerTrack_8814A(pConfig);\r
74 #endif\r
75 \r
76 #if RTL8703B_SUPPORT\r
77         if (pDM_Odm->SupportICType == ODM_RTL8703B)\r
78                 ConfigureTxpowerTrack_8703B(pConfig);\r
79 #endif\r
80 \r
81 #if RTL8822B_SUPPORT\r
82         if (pDM_Odm->SupportICType == ODM_RTL8822B)\r
83                 ConfigureTxpowerTrack_8822B(pConfig);\r
84 #endif\r
85 \r
86 #if RTL8723D_SUPPORT\r
87         if (pDM_Odm->SupportICType == ODM_RTL8723D)\r
88                 ConfigureTxpowerTrack_8723D(pConfig);\r
89 #endif\r
90 }\r
91 \r
92 //======================================================================\r
93 // <20121113, Kordan> This function should be called when TxAGC changed.\r
94 // Otherwise the previous compensation is gone, because we record the \r
95 // delta of temperature between two TxPowerTracking watch dogs.\r
96 //\r
97 // NOTE: If Tx BB swing or Tx scaling is varified during run-time, still \r
98 //       need to call this function.\r
99 //======================================================================\r
100 VOID\r
101 ODM_ClearTxPowerTrackingState(\r
102         IN PDM_ODM_T            pDM_Odm\r
103         )\r
104 {\r
105         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
106         u1Byte                  p = 0;\r
107         PODM_RF_CAL_T   pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
108         \r
109         pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;\r
110         pRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->DefaultCckIndex;\r
111         pRFCalibrateInfo->CCK_index = 0;\r
112         \r
113         for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)\r
114         {\r
115                 pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;\r
116                 pRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->DefaultOfdmIndex;\r
117                 pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;\r
118 \r
119                 pRFCalibrateInfo->PowerIndexOffset[p] = 0;\r
120                 pRFCalibrateInfo->DeltaPowerIndex[p] = 0;\r
121                 pRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;\r
122 \r
123                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = 0;    /* Initial Mix mode power tracking*/\r
124                 pRFCalibrateInfo->Remnant_OFDMSwingIdx[p] = 0;                    \r
125                 pRFCalibrateInfo->KfreeOffset[p] = 0;\r
126         }\r
127         \r
128         pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
129         pRFCalibrateInfo->Modify_TxAGC_Flag_PathB = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
130         pRFCalibrateInfo->Modify_TxAGC_Flag_PathC = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
131         pRFCalibrateInfo->Modify_TxAGC_Flag_PathD = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
132         pRFCalibrateInfo->Remnant_CCKSwingIdx = 0;\r
133         pRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter;\r
134 \r
135         pRFCalibrateInfo->Modify_TxAGC_Value_CCK=0;                     //modify by Mingzhi.Guo\r
136         pRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0;            //modify by Mingzhi.Guo\r
137 \r
138 }\r
139 \r
140 VOID\r
141 ODM_TXPowerTrackingCallback_ThermalMeter(\r
142 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
143         IN PDM_ODM_T            pDM_Odm\r
144 #else\r
145         IN PADAPTER     Adapter\r
146 #endif\r
147         )\r
148 {\r
149 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
150         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
151 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
152         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
153 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
154         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
155 #endif\r
156 #endif\r
157 \r
158         PODM_RF_CAL_T   pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
159 \r
160         u1Byte                  ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;\r
161         s1Byte                  diff_DPK[4] = {0};\r
162         u1Byte                  ThermalValue_AVG_count = 0;\r
163         u4Byte                  ThermalValue_AVG = 0, RegC80, RegCd0, RegCd4, Regab4;   \r
164 \r
165         u1Byte                  OFDM_min_index = 0;  // OFDM BB Swing should be less than +3.0dB, which is required by Arthur\r
166         u1Byte                  Indexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel)\r
167         u1Byte                  PowerTrackingType = pHalData->RfPowerTrackingType;\r
168         u1Byte                  XtalOffsetEanble = 0;\r
169 \r
170         TXPWRTRACK_CFG  c;\r
171 \r
172         //4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\r
173         pu1Byte                 deltaSwingTableIdx_TUP_A = NULL;\r
174         pu1Byte                 deltaSwingTableIdx_TDOWN_A = NULL;\r
175         pu1Byte                 deltaSwingTableIdx_TUP_B = NULL;\r
176         pu1Byte                 deltaSwingTableIdx_TDOWN_B = NULL;\r
177         /*for 8814 add by Yu Chen*/\r
178         pu1Byte                 deltaSwingTableIdx_TUP_C = NULL;\r
179         pu1Byte                 deltaSwingTableIdx_TDOWN_C = NULL;\r
180         pu1Byte                 deltaSwingTableIdx_TUP_D = NULL;\r
181         pu1Byte                 deltaSwingTableIdx_TDOWN_D = NULL;\r
182         /*for Xtal Offset by James.Tung*/\r
183         ps1Byte                 deltaSwingTableXtal_UP = NULL;\r
184         ps1Byte                 deltaSwingTableXtal_DOWN = NULL;\r
185 \r
186         //4 2. Initilization ( 7 steps in total )\r
187 \r
188         ConfigureTxpowerTrack(pDM_Odm, &c);\r
189 \r
190         (*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_A, (pu1Byte *)&deltaSwingTableIdx_TDOWN_A,\r
191                         (pu1Byte *)&deltaSwingTableIdx_TUP_B, (pu1Byte *)&deltaSwingTableIdx_TDOWN_B);\r
192 \r
193         if (pDM_Odm->SupportICType & ODM_RTL8814A)      /*for 8814 path C & D*/\r
194                 (*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_C, (pu1Byte *)&deltaSwingTableIdx_TDOWN_C,\r
195                         (pu1Byte *)&deltaSwingTableIdx_TUP_D, (pu1Byte *)&deltaSwingTableIdx_TDOWN_D);\r
196 \r
197         if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D))     /*for Xtal Offset*/\r
198                 (*c.GetDeltaSwingXtalTable)(pDM_Odm, (ps1Byte *)&deltaSwingTableXtal_UP, (ps1Byte *)&deltaSwingTableXtal_DOWN);\r
199         \r
200 \r
201         pRFCalibrateInfo->TXPowerTrackingCallbackCnt++; /*cosa add for debug*/\r
202         pRFCalibrateInfo->bTXPowerTrackingInit = TRUE;\r
203 \r
204         /*pRFCalibrateInfo->TxPowerTrackControl = pHalData->TxPowerTrackControl;\r
205         <Kordan> We should keep updating the control variable according to HalData. \r
206         <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files. */\r
207         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
208         #if (MP_DRIVER == 1)\r
209                 pRFCalibrateInfo->RegA24 = 0x090e1317;\r
210         #endif\r
211         #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
212                 if (pDM_Odm->mp_mode == TRUE)\r
213                         pRFCalibrateInfo->RegA24 = 0x090e1317;\r
214         #endif\r
215 \r
216         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
217                 ("===>ODM_TXPowerTrackingCallback_ThermalMeter\n pRFCalibrateInfo->BbSwingIdxCckBase: %d, pRFCalibrateInfo->BbSwingIdxOfdmBase[A]: %d, pRFCalibrateInfo->DefaultOfdmIndex: %d\n", \r
218                 pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pRFCalibrateInfo->DefaultOfdmIndex));\r
219 \r
220         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
221                 ("pRFCalibrateInfo->TxPowerTrackControl=%d,  pHalData->EEPROMThermalMeter %d\n", pRFCalibrateInfo->TxPowerTrackControl,  pHalData->EEPROMThermalMeter));\r
222         ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00);  //0x42: RF Reg[15:10] 88E\r
223 \r
224         /*add log by zhao he, check c80/c94/c14/ca0 value*/\r
225         if (pDM_Odm->SupportICType == ODM_RTL8723D) {   \r
226                 RegC80 = ODM_GetBBReg(pDM_Odm, 0xc80, bMaskDWord);\r
227                 RegCd0 = ODM_GetBBReg(pDM_Odm, 0xcd0, bMaskDWord);\r
228                 RegCd4 = ODM_GetBBReg(pDM_Odm, 0xcd4, bMaskDWord);\r
229                 Regab4 = ODM_GetBBReg(pDM_Odm, 0xab4, 0x000007FF);\r
230                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc80 = 0x%x 0xcd0 = 0x%x 0xcd4 = 0x%x 0xab4 = 0x%x\n", RegC80, RegCd0, RegCd4, Regab4));\r
231         }\r
232 \r
233         if (!pRFCalibrateInfo->TxPowerTrackControl)\r
234                 return;\r
235 \r
236 \r
237         /*4 3. Initialize ThermalValues of RFCalibrateInfo*/\r
238 \r
239         if (pRFCalibrateInfo->bReloadtxpowerindex)\r
240                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("reload ofdm index for band switch\n"));                              \r
241 \r
242         /*4 4. Calculate average thermal meter*/\r
243         \r
244         pRFCalibrateInfo->ThermalValue_AVG[pRFCalibrateInfo->ThermalValue_AVG_index] = ThermalValue;\r
245         pRFCalibrateInfo->ThermalValue_AVG_index++;\r
246         if (pRFCalibrateInfo->ThermalValue_AVG_index == c.AverageThermalNum)   /*Average times =  c.AverageThermalNum*/\r
247                 pRFCalibrateInfo->ThermalValue_AVG_index = 0;\r
248 \r
249         for(i = 0; i < c.AverageThermalNum; i++)\r
250         {\r
251                 if (pRFCalibrateInfo->ThermalValue_AVG[i]) {\r
252                         ThermalValue_AVG += pRFCalibrateInfo->ThermalValue_AVG[i];\r
253                         ThermalValue_AVG_count++;\r
254                 }\r
255         }\r
256 \r
257         if(ThermalValue_AVG_count)               //Calculate Average ThermalValue after average enough times\r
258         {\r
259                 ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);\r
260                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
261                         ("AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n", ThermalValue, pHalData->EEPROMThermalMeter));                                 \r
262         }\r
263                         \r
264         //4 5. Calculate delta, delta_LCK, delta_IQK.\r
265 \r
266         //"delta" here is used to determine whether thermal value changes or not.\r
267         delta   = (ThermalValue > pRFCalibrateInfo->ThermalValue)?(ThermalValue - pRFCalibrateInfo->ThermalValue):(pRFCalibrateInfo->ThermalValue - ThermalValue);\r
268         delta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);\r
269         delta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);\r
270 \r
271         if (pRFCalibrateInfo->ThermalValue_IQK == 0xff) {       /*no PG, use thermal value for IQK*/\r
272                 pRFCalibrateInfo->ThermalValue_IQK = ThermalValue;\r
273                 delta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);\r
274                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, use ThermalValue for IQK\n"));\r
275         }\r
276         \r
277         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
278                 diff_DPK[p] = (s1Byte)ThermalValue - (s1Byte)pRFCalibrateInfo->DpkThermal[p];\r
279 \r
280         /*4 6. If necessary, do LCK.*/\r
281 \r
282         if (!(pDM_Odm->SupportICType & ODM_RTL8821)) {  /*no PG , do LCK at initial status*/\r
283                 if (pRFCalibrateInfo->ThermalValue_LCK == 0xff) {\r
284                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, do LCK\n"));\r
285                         pRFCalibrateInfo->ThermalValue_LCK = ThermalValue;\r
286 \r
287                         /*Use RTLCK, so close power tracking driver LCK*/\r
288                         if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {\r
289                                 if (c.PHY_LCCalibrate)\r
290                                         (*c.PHY_LCCalibrate)(pDM_Odm);\r
291                         }\r
292                         \r
293                         delta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);\r
294                 }\r
295 \r
296                 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));\r
297 \r
298                  /* Delta temperature is equal to or larger than 20 centigrade.*/\r
299                 if (delta_LCK >= c.Threshold_IQK) {\r
300                         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));\r
301                         pRFCalibrateInfo->ThermalValue_LCK = ThermalValue;\r
302 \r
303                         /*Use RTLCK, so close power tracking driver LCK*/\r
304                         if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {\r
305                                 if (c.PHY_LCCalibrate)\r
306                                         (*c.PHY_LCCalibrate)(pDM_Odm);\r
307                         }\r
308                 }\r
309         }\r
310 \r
311         /*3 7. If necessary, move the index of swing table to adjust Tx power.*/        \r
312         \r
313         if (delta > 0 && pRFCalibrateInfo->TxPowerTrackControl)\r
314         {\r
315                 //"delta" here is used to record the absolute value of differrence.\r
316 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                    \r
317             delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);            \r
318 #else\r
319             delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);            \r
320 #endif\r
321                 if (delta >= TXPWR_TRACK_TABLE_SIZE)\r
322                         delta = TXPWR_TRACK_TABLE_SIZE - 1;\r
323 \r
324                 /*4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset*/\r
325                 \r
326 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                            \r
327                 if(ThermalValue > pHalData->EEPROMThermalMeter) {\r
328 #else\r
329                 if(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\r
330 #endif\r
331 \r
332                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
333                                 pRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p];        /*recording poer index offset*/\r
334                                 switch (p) {\r
335                                 case ODM_RF_PATH_B:\r
336                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
337                                                 ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta])); \r
338 \r
339                                         pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_B[delta];\r
340                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_B[delta];       /*Record delta swing for mix mode power tracking*/\r
341                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
342                                                 ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
343                                         break;\r
344 \r
345                                 case ODM_RF_PATH_C:\r
346                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
347                                                 ("deltaSwingTableIdx_TUP_C[%d] = %d\n", delta, deltaSwingTableIdx_TUP_C[delta]));\r
348 \r
349                                         pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_C[delta];\r
350                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_C[delta];       /*Record delta swing for mix mode power tracking*/\r
351                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
352                                                         ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
353                                         break;\r
354 \r
355                                 case ODM_RF_PATH_D:\r
356                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
357                                                 ("deltaSwingTableIdx_TUP_D[%d] = %d\n", delta, deltaSwingTableIdx_TUP_D[delta]));\r
358 \r
359                                                 pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_D[delta];\r
360                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_D[delta];       /*Record delta swing for mix mode power tracking*/\r
361                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
362                                                 ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
363                                         break;\r
364 \r
365                                 default:\r
366                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
367                                                 ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta]));\r
368 \r
369                                         pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_A[delta];\r
370                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_A[delta];        /*Record delta swing for mix mode power tracking*/\r
371                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
372                                                         ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
373                                         break;\r
374                                 }\r
375                         }\r
376 \r
377                         if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D)) {\r
378                                 /*Save XtalOffset from Xtal table*/\r
379                                 pRFCalibrateInfo->XtalOffsetLast = pRFCalibrateInfo->XtalOffset;        /*recording last Xtal offset*/\r
380                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
381                                                                 ("[Xtal] deltaSwingTableXtal_UP[%d] = %d\n", delta, deltaSwingTableXtal_UP[delta]));\r
382                                 pRFCalibrateInfo->XtalOffset = deltaSwingTableXtal_UP[delta];\r
383 \r
384                                 if (pRFCalibrateInfo->XtalOffsetLast == pRFCalibrateInfo->XtalOffset)\r
385                                         XtalOffsetEanble = 0;\r
386                                 else\r
387                                         XtalOffsetEanble = 1;\r
388                         }\r
389                 \r
390                 } else {\r
391                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
392                                 pRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p];        /*recording poer index offset*/\r
393 \r
394                                 switch (p) {\r
395                                 case ODM_RF_PATH_B:\r
396                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
397                                                 ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta]));  \r
398                                         pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];\r
399                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_B[delta];        /*Record delta swing for mix mode power tracking*/\r
400                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
401                                                 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); \r
402                                         break;\r
403 \r
404                                 case ODM_RF_PATH_C:\r
405                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
406                                                 ("deltaSwingTableIdx_TDOWN_C[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_C[delta]));  \r
407                                         pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];\r
408                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_C[delta];        /*Record delta swing for mix mode power tracking*/\r
409                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
410                                                 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));   \r
411                                         break;\r
412 \r
413                                 case ODM_RF_PATH_D:\r
414                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
415                                                 ("deltaSwingTableIdx_TDOWN_D[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_D[delta]));  \r
416                                         pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];\r
417                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_D[delta];        /*Record delta swing for mix mode power tracking*/\r
418                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
419                                                 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
420                                         break;\r
421 \r
422                                 default:\r
423                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
424                                                 ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta]));  \r
425                                         pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];\r
426                                         pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_A[delta];        /*Record delta swing for mix mode power tracking*/\r
427                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
428                                                 ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
429                                         break;\r
430                                 }       \r
431                         }\r
432 \r
433                         if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D)) {\r
434                                 /*Save XtalOffset from Xtal table*/\r
435                                 pRFCalibrateInfo->XtalOffsetLast = pRFCalibrateInfo->XtalOffset;        /*recording last Xtal offset*/\r
436                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
437                                                                 ("[Xtal] deltaSwingTableXtal_DOWN[%d] = %d\n", delta, deltaSwingTableXtal_DOWN[delta]));\r
438                                 pRFCalibrateInfo->XtalOffset = deltaSwingTableXtal_DOWN[delta];\r
439 \r
440                                 if (pRFCalibrateInfo->XtalOffsetLast == pRFCalibrateInfo->XtalOffset)\r
441                                         XtalOffsetEanble = 0;\r
442                                 else\r
443                                         XtalOffsetEanble = 1;\r
444                         }\r
445 \r
446                 }\r
447                 \r
448                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
449                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
450                                 ("\n\n=========================== [Path-%d] Calculating PowerIndexOffset===========================\n", p));  \r
451 \r
452                         if (pRFCalibrateInfo->DeltaPowerIndex[p] == pRFCalibrateInfo->DeltaPowerIndexLast[p])         /*If Thermal value changes but lookup table value still the same*/\r
453                                 pRFCalibrateInfo->PowerIndexOffset[p] = 0;\r
454                         else\r
455                                 pRFCalibrateInfo->PowerIndexOffset[p] = pRFCalibrateInfo->DeltaPowerIndex[p] - pRFCalibrateInfo->DeltaPowerIndexLast[p];      /*Power Index Diff between 2 times Power Tracking*/\r
456 \r
457                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
458                                 ("[Path-%d] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n", p, pRFCalibrateInfo->PowerIndexOffset[p], pRFCalibrateInfo->DeltaPowerIndex[p], pRFCalibrateInfo->DeltaPowerIndexLast[p]));\r
459                 \r
460                         pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->BbSwingIdxOfdmBase[p] + pRFCalibrateInfo->PowerIndexOffset[p];\r
461                         pRFCalibrateInfo->CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pRFCalibrateInfo->PowerIndexOffset[p];\r
462 \r
463                         pRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->CCK_index;  \r
464                         pRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->OFDM_index[p];  \r
465 \r
466                         /*************Print BB Swing Base and Index Offset*************/\r
467 \r
468                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
469                                 ("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->PowerIndexOffset[p]));\r
470                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
471                                 ("The 'OFDM' final index(%d) = BaseIndex[%d](%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxOfdm[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p], pRFCalibrateInfo->PowerIndexOffset[p]));\r
472 \r
473                         /*4 7.1 Handle boundary conditions of index.*/\r
474                 \r
475                         if (pRFCalibrateInfo->OFDM_index[p] > c.SwingTableSize_OFDM-1)\r
476                                 pRFCalibrateInfo->OFDM_index[p] = c.SwingTableSize_OFDM-1;\r
477                         else if (pRFCalibrateInfo->OFDM_index[p] <= OFDM_min_index)\r
478                                 pRFCalibrateInfo->OFDM_index[p] = OFDM_min_index;\r
479                 }\r
480                 \r
481                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
482                         ("\n\n========================================================================================================\n"));  \r
483 \r
484                 if (pRFCalibrateInfo->CCK_index > c.SwingTableSize_CCK-1)\r
485                         pRFCalibrateInfo->CCK_index = c.SwingTableSize_CCK-1;\r
486                 else if (pRFCalibrateInfo->CCK_index <= 0)\r
487                         pRFCalibrateInfo->CCK_index = 0;\r
488         } else {\r
489                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
490                         ("The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pRFCalibrateInfo->ThermalValue: %d\n", \r
491                         pRFCalibrateInfo->TxPowerTrackControl, ThermalValue, pRFCalibrateInfo->ThermalValue));\r
492 \r
493                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
494                         pRFCalibrateInfo->PowerIndexOffset[p] = 0;\r
495         }\r
496 \r
497         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
498                 ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n", \r
499                         pRFCalibrateInfo->CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase));       /*Print Swing base & current*/\r
500 \r
501         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
502                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
503                         ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%d]: %d\n",\r
504                         pRFCalibrateInfo->OFDM_index[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p]));\r
505         }\r
506 \r
507         if ((pDM_Odm->SupportICType & ODM_RTL8814A)) {\r
508                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("PowerTrackingType=%d\n", PowerTrackingType));\r
509                 \r
510                 if (PowerTrackingType == 0) {\r
511                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));\r
512                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
513                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
514                 } else if (PowerTrackingType == 1) {\r
515                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(2G) TSSI(5G) MODE**********\n"));\r
516                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
517                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_2G_TSSI_5G_MODE, p, 0);\r
518                 } else if (PowerTrackingType == 2) {\r
519                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(5G) TSSI(2G)MODE**********\n"));\r
520                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
521                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_5G_TSSI_2G_MODE, p, 0);\r
522                 } else if (PowerTrackingType == 3) {\r
523                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking TSSI MODE**********\n"));\r
524                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
525                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, TSSI_MODE, p, 0);\r
526                 }\r
527                 pRFCalibrateInfo->ThermalValue = ThermalValue;         /*Record last Power Tracking Thermal Value*/\r
528         \r
529         } else if ((pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_A] != 0 ||\r
530                 pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_B] != 0 ||\r
531                 pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_C] != 0 ||\r
532                 pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_D] != 0) && \r
533                 pRFCalibrateInfo->TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff)) {\r
534                 //4 7.2 Configure the Swing Table to adjust Tx Power.\r
535                 \r
536                 pRFCalibrateInfo->bTxPowerChanged = TRUE;       /*Always TRUE after Tx Power is adjusted by power tracking.*/                   \r
537                 //\r
538                 // 2012/04/23 MH According to Luke's suggestion, we can not write BB digital\r
539                 // to increase TX power. Otherwise, EVM will be bad.\r
540                 //\r
541                 // 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.\r
542                 if (ThermalValue > pRFCalibrateInfo->ThermalValue) {\r
543                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
544                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
545                                         ("Temperature Increasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", \r
546                                         p, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));  \r
547                         }\r
548                 } else if (ThermalValue < pRFCalibrateInfo->ThermalValue) {     /*Low temperature*/\r
549                         for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
550                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
551                                         ("Temperature Decreasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",\r
552                                         p, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));                          \r
553                         }\r
554                 }\r
555 \r
556 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
557                 if (ThermalValue > pHalData->EEPROMThermalMeter)\r
558 #else\r
559                 if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)\r
560 #endif\r
561                 {\r
562                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
563                                 ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));                    \r
564 \r
565                         if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||\r
566                                 pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||\r
567                                 pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8822B ||\r
568                                 pDM_Odm->SupportICType == ODM_RTL8723D) {\r
569 \r
570                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));\r
571                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
572                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
573                         } else {\r
574                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));\r
575                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
576                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\r
577                         }\r
578                 }\r
579                 else\r
580                 {\r
581                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
582                                 ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));\r
583 \r
584                         if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||\r
585                                 pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||\r
586                                 pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8822B ||\r
587                                 pDM_Odm->SupportICType == ODM_RTL8723D) {\r
588 \r
589                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));\r
590                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
591                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);\r
592                         } else {\r
593                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));\r
594                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
595                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\r
596                         }\r
597                         \r
598                 }\r
599 \r
600                 pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck;    /*Record last time Power Tracking result as base.*/\r
601                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
602                         pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->BbSwingIdxOfdm[p];\r
603 \r
604                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
605                         ("pRFCalibrateInfo->ThermalValue = %d ThermalValue= %d\n", pRFCalibrateInfo->ThermalValue, ThermalValue));\r
606                 \r
607                 pRFCalibrateInfo->ThermalValue = ThermalValue;         /*Record last Power Tracking Thermal Value*/\r
608 \r
609         }\r
610 \r
611 \r
612         if (pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8723D) {\r
613 \r
614                 if (XtalOffsetEanble != 0 && pRFCalibrateInfo->TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff)) {\r
615 \r
616                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter Xtal Tracking**********\n"));\r
617 \r
618 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
619                         if (ThermalValue > pHalData->EEPROMThermalMeter) {\r
620 #else\r
621                         if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\r
622 #endif\r
623                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
624                                         ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));                    \r
625                                 (*c.ODM_TxXtalTrackSetXtal)(pDM_Odm);\r
626                         } else {\r
627                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
628                                         ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));                     \r
629                                 (*c.ODM_TxXtalTrackSetXtal)(pDM_Odm);\r
630                         }\r
631                 }\r
632                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********End Xtal Tracking**********\n"));\r
633         }\r
634 \r
635 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
636 \r
637         if (!IS_HARDWARE_TYPE_8723B(Adapter)) {\r
638                 /*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/\r
639                 if (delta_IQK >= c.Threshold_IQK) {\r
640                         pRFCalibrateInfo->ThermalValue_IQK = ThermalValue;\r
641                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_IQK(%d) >= Threshold_IQK(%d)\n", delta_IQK, c.Threshold_IQK));\r
642                         if (!pRFCalibrateInfo->bIQKInProgress) \r
643                                 (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);\r
644                 }\r
645         }\r
646         if (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_A] != 0) {\r
647                 if (diff_DPK[ODM_RF_PATH_A] >= c.Threshold_DPK) { \r
648                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
649                         ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK));\r
650                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
651                 } else if ((diff_DPK[ODM_RF_PATH_A] <= -1 * c.Threshold_DPK)) {\r
652                         s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK);      \r
653 \r
654                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
655                         ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\r
656                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
657                 } else {\r
658                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
659                         ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\r
660                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);     \r
661                 }\r
662         }\r
663         if (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_B] != 0) {\r
664                 if (diff_DPK[ODM_RF_PATH_B] >= c.Threshold_DPK) { \r
665                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
666                         ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK));\r
667                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
668                 } else if ((diff_DPK[ODM_RF_PATH_B] <= -1 * c.Threshold_DPK)) {\r
669                         s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK);      \r
670 \r
671                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
672                         ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\r
673                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
674                 } else {\r
675                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
676                         ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\r
677                         ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);     \r
678                 }\r
679         }\r
680 \r
681 #endif          \r
682                         \r
683         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n"));\r
684         \r
685         pRFCalibrateInfo->TXPowercount = 0;\r
686 }\r
687 \r
688 \r
689 \r
690 //3============================================================\r
691 //3 IQ Calibration\r
692 //3============================================================\r
693 \r
694 VOID\r
695 ODM_ResetIQKResult(\r
696         IN PDM_ODM_T    pDM_Odm \r
697 )\r
698 {\r
699         return;\r
700 }\r
701 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
702 u1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)\r
703 {\r
704         u1Byte  channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = \r
705         {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};\r
706         u1Byte  place = chnl;\r
707 \r
708         \r
709         if(chnl > 14)\r
710         {\r
711                 for(place = 14; place<sizeof(channel_all); place++)\r
712                 {\r
713                         if(channel_all[place] == chnl)\r
714                         {\r
715                                 return place-13;\r
716                         }\r
717                 }\r
718         }       \r
719         return 0;\r
720 \r
721 }\r
722 #endif\r
723 \r
724 VOID\r
725 odm_IQCalibrate(\r
726                 IN      PDM_ODM_T       pDM_Odm \r
727                 )\r
728 {\r
729         PADAPTER        Adapter = pDM_Odm->Adapter;\r
730 \r
731 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)    \r
732         if (*pDM_Odm->pIsFcsModeEnable)\r
733                 return;\r
734 #endif\r
735 \r
736         if (pDM_Odm->bLinked) {\r
737 \r
738                 if ((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess)) {\r
739                         pDM_Odm->preChannel = *pDM_Odm->pChannel;\r
740                         pDM_Odm->LinkedInterval = 0;\r
741                 }\r
742 \r
743                 if (pDM_Odm->LinkedInterval < 3)\r
744                         pDM_Odm->LinkedInterval++;\r
745                         \r
746                 if (pDM_Odm->LinkedInterval == 2) {\r
747                         PHY_IQCalibrate(Adapter, FALSE);\r
748                 }\r
749         } else\r
750                 pDM_Odm->LinkedInterval = 0;\r
751                 \r
752 }\r
753 \r
754 void phydm_rf_init(IN           PDM_ODM_T               pDM_Odm)\r
755 {\r
756 \r
757         odm_TXPowerTrackingInit(pDM_Odm);\r
758 \r
759 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
760         ODM_ClearTxPowerTrackingState(pDM_Odm); \r
761 #endif\r
762 \r
763 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
764 #if (RTL8814A_SUPPORT == 1)             \r
765         if (pDM_Odm->SupportICType & ODM_RTL8814A)\r
766                 PHY_IQCalibrate_8814A_Init(pDM_Odm);\r
767 #endif  \r
768 #endif\r
769 \r
770 }\r
771 \r
772 void phydm_rf_watchdog(IN               PDM_ODM_T               pDM_Odm)\r
773 {\r
774 \r
775 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
776         PADAPTER        Adapter = pDM_Odm->Adapter;\r
777         PMGNT_INFO      pMgntInfo = &Adapter->MgntInfo;\r
778 \r
779         ODM_TXPowerTrackingCheck(pDM_Odm);      \r
780 \r
781         if(!pMgntInfo->IQKBeforeConnection)\r
782         {\r
783                 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
784                         odm_IQCalibrate(pDM_Odm);\r
785         }\r
786 #endif\r
787 }\r