net: wireless: rockchip_wlan: add rtl8723ds support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723ds / hal / phydm / halphyrf_ap.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 #ifndef index_mapping_NUM_88E\r
25  #define        index_mapping_NUM_88E   15\r
26 #endif\r
27 \r
28 //#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
29 \r
30 #define         CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \\r
31                                         do {\\r
32                                                 for(_offset = 0; _offset < _size; _offset++)\\r
33                                                 {\\r
34                                                         if(_deltaThermal < thermalThreshold[_direction][_offset])\\r
35                                                         {\\r
36                                                                 if(_offset != 0)\\r
37                                                                         _offset--;\\r
38                                                                 break;\\r
39                                                         }\\r
40                                                 }                       \\r
41                                                 if(_offset >= _size)\\r
42                                                         _offset = _size-1;\\r
43                                         } while(0)\r
44 \r
45 \r
46 void ConfigureTxpowerTrack(\r
47         IN      PVOID           pDM_VOID,\r
48         OUT     PTXPWRTRACK_CFG pConfig\r
49         )\r
50 {\r
51         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
52 #if RTL8812A_SUPPORT\r
53 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
54         //if (IS_HARDWARE_TYPE_8812(pDM_Odm->Adapter))\r
55         if(pDM_Odm->SupportICType==ODM_RTL8812)\r
56                 ConfigureTxpowerTrack_8812A(pConfig);\r
57         //else\r
58 #endif\r
59 #endif\r
60 \r
61 #if RTL8814A_SUPPORT\r
62         if(pDM_Odm->SupportICType== ODM_RTL8814A)\r
63                 ConfigureTxpowerTrack_8814A(pConfig);\r
64 #endif\r
65 \r
66 \r
67 #if RTL8188E_SUPPORT\r
68         if(pDM_Odm->SupportICType==ODM_RTL8188E)\r
69                 ConfigureTxpowerTrack_8188E(pConfig);\r
70 #endif \r
71 \r
72 #if RTL8197F_SUPPORT\r
73         if (pDM_Odm->SupportICType == ODM_RTL8197F)\r
74                 ConfigureTxpowerTrack_8197F(pConfig);\r
75 #endif \r
76 \r
77 #if RTL8822B_SUPPORT\r
78         if (pDM_Odm->SupportICType == ODM_RTL8822B)\r
79                 ConfigureTxpowerTrack_8822B(pConfig);\r
80 #endif\r
81 \r
82 \r
83 }\r
84 \r
85 #if (RTL8192E_SUPPORT==1) \r
86 VOID\r
87 ODM_TXPowerTrackingCallback_ThermalMeter_92E(\r
88 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
89         IN      PVOID           pDM_VOID\r
90 #else\r
91         IN PADAPTER     Adapter\r
92 #endif\r
93         )\r
94 {\r
95         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
96         u1Byte  ThermalValue = 0, delta, delta_IQK, delta_LCK, channel, is_decrease, rf_mimo_mode;\r
97         u1Byte  ThermalValue_AVG_count = 0;\r
98         u1Byte     OFDM_min_index = 10; //OFDM BB Swing should be less than +2.5dB, which is required by Arthur\r
99         s1Byte  OFDM_index[2], index ;\r
100         u4Byte  ThermalValue_AVG = 0, Reg0x18;\r
101         u4Byte  i = 0, j = 0, rf;\r
102         s4Byte  value32, CCK_index = 0, ele_A, ele_D, ele_C, X, Y;\r
103         prtl8192cd_priv         priv = pDM_Odm->priv;\r
104 \r
105         rf_mimo_mode = pDM_Odm->RFType;\r
106         //ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("%s:%d rf_mimo_mode:%d\n", __FUNCTION__, __LINE__, rf_mimo_mode));\r
107 \r
108 #ifdef MP_TEST\r
109         if ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {\r
110                 channel = priv->pshare->working_channel;\r
111                 if (priv->pshare->mp_txpwr_tracking == FALSE)\r
112                         return;\r
113         } else\r
114 #endif\r
115         {\r
116                 channel = (priv->pmib->dot11RFEntry.dot11channel);\r
117         }\r
118 \r
119         ThermalValue = (unsigned char)ODM_GetRFReg(pDM_Odm, RF_PATH_A, ODM_RF_T_METER_92E, 0xfc00);     //0x42: RF Reg[15:10] 88E\r
120         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther));\r
121 \r
122 \r
123         switch (rf_mimo_mode) {\r
124                 case MIMO_1T1R:\r
125                         rf = 1;      \r
126                         break;\r
127                 case MIMO_2T2R:\r
128                         rf = 2;\r
129                         break;\r
130                 default:\r
131                         rf = 2;\r
132                         break;\r
133         }\r
134 \r
135         //Query OFDM path A default setting     Bit[31:21]\r
136         ele_D = PHY_QueryBBReg(priv, rOFDM0_XATxIQImbalance, bMaskOFDM_D);\r
137         for (i = 0; i < OFDM_TABLE_SIZE_92E; i++) {\r
138                 if (ele_D == (OFDMSwingTable_92E[i] >> 22)) {\r
139                         OFDM_index[0] = (unsigned char)i;\r
140                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("PathA 0xC80[31:22] = 0x%x, OFDM_index=%d\n", ele_D, OFDM_index[0]));\r
141                         break;\r
142                 }\r
143         }\r
144 \r
145         //Query OFDM path B default setting\r
146         if (rf_mimo_mode == MIMO_2T2R) {\r
147                 ele_D = PHY_QueryBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskOFDM_D);\r
148                 for (i = 0; i < OFDM_TABLE_SIZE_92E; i++) {\r
149                         if (ele_D == (OFDMSwingTable_92E[i] >> 22)) {\r
150                                 OFDM_index[1] = (unsigned char)i;\r
151                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("PathB 0xC88[31:22] = 0x%x, OFDM_index=%d\n", ele_D, OFDM_index[1]));\r
152                                 break;\r
153                         }\r
154                 }\r
155         }\r
156 \r
157         /* calculate average thermal meter */\r
158         {\r
159                 priv->pshare->ThermalValue_AVG_88XX[priv->pshare->ThermalValue_AVG_index_88XX] = ThermalValue;\r
160                 priv->pshare->ThermalValue_AVG_index_88XX++;\r
161                 if (priv->pshare->ThermalValue_AVG_index_88XX == AVG_THERMAL_NUM_88XX)\r
162                         priv->pshare->ThermalValue_AVG_index_88XX = 0;\r
163 \r
164                 for (i = 0; i < AVG_THERMAL_NUM_88XX; i++) {\r
165                         if (priv->pshare->ThermalValue_AVG_88XX[i]) {\r
166                                 ThermalValue_AVG += priv->pshare->ThermalValue_AVG_88XX[i];\r
167                                 ThermalValue_AVG_count++;\r
168                         }\r
169                 }\r
170 \r
171                 if (ThermalValue_AVG_count) {\r
172                         ThermalValue = (unsigned char)(ThermalValue_AVG / ThermalValue_AVG_count);\r
173                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("AVG Thermal Meter = 0x%x \n", ThermalValue));\r
174                 }\r
175         }\r
176 \r
177         /* Initialize */\r
178         if (!priv->pshare->ThermalValue) {\r
179                 priv->pshare->ThermalValue = priv->pmib->dot11RFEntry.ther;\r
180                 priv->pshare->ThermalValue_IQK = ThermalValue;\r
181                 priv->pshare->ThermalValue_LCK = ThermalValue;\r
182         }\r
183 \r
184         if (ThermalValue != priv->pshare->ThermalValue) {\r
185                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\n******** START POWER TRACKING ********\n"));                                       \r
186                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther));                        \r
187 \r
188                 delta = RTL_ABS(ThermalValue, priv->pmib->dot11RFEntry.ther);\r
189                 delta_IQK = RTL_ABS(ThermalValue, priv->pshare->ThermalValue_IQK);\r
190                 delta_LCK = RTL_ABS(ThermalValue, priv->pshare->ThermalValue_LCK);\r
191                 is_decrease = ((ThermalValue < priv->pmib->dot11RFEntry.ther) ? 1 : 0);\r
192                 \r
193 #ifdef _TRACKING_TABLE_FILE\r
194                 if (priv->pshare->rf_ft_var.pwr_track_file) {                           \r
195                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Diff: (%s)%d ==> get index from table : %d)\n", (is_decrease?"-":"+"), delta, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0)));\r
196         \r
197                 if (is_decrease) {                                      \r
198                         for (i = 0; i < rf; i++) {\r
199                                 OFDM_index[i] = priv->pshare->OFDM_index0[i] + get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0);\r
200                                 OFDM_index[i] = ((OFDM_index[i] > (OFDM_TABLE_SIZE_92E- 1)) ? (OFDM_TABLE_SIZE_92E - 1) : OFDM_index[i]);\r
201                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> decrese power ---> new OFDM_INDEX:%d (%d + %d)\n", OFDM_index[i], priv->pshare->OFDM_index0[i], get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0)));\r
202                                 CCK_index = priv->pshare->CCK_index0 + get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1);                        \r
203                                 CCK_index = ((CCK_index > (CCK_TABLE_SIZE_92E - 1)) ? (CCK_TABLE_SIZE_92E - 1) : CCK_index);                            \r
204                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> Decrese power ---> new CCK_INDEX:%d (%d + %d)\n",  CCK_index, priv->pshare->CCK_index0, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1)));\r
205                         }\r
206                 } else {\r
207                         for (i = 0; i < rf; i++) {\r
208                                 OFDM_index[i] = priv->pshare->OFDM_index0[i] - get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0);\r
209                                 OFDM_index[i] = ((OFDM_index[i] < OFDM_min_index) ?  OFDM_min_index : OFDM_index[i]);\r
210                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> Increse power ---> new OFDM_INDEX:%d (%d - %d)\n", OFDM_index[i], priv->pshare->OFDM_index0[i], get_tx_tracking_index(priv, channel, i, delta, is_decrease, 0)));\r
211                                 CCK_index = priv->pshare->CCK_index0 - get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1);                                            \r
212                                 CCK_index = ((CCK_index < 0 )? 0 : CCK_index);  \r
213                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> Increse power ---> new CCK_INDEX:%d (%d - %d)\n", CCK_index, priv->pshare->CCK_index0, get_tx_tracking_index(priv, channel, i, delta, is_decrease, 1)));\r
214                         }\r
215                 }\r
216                 }\r
217 #endif //CFG_TRACKING_TABLE_FILE\r
218 \r
219                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("OFDMSwingTable_92E[(unsigned int)OFDM_index[0]] = %x \n",OFDMSwingTable_92E[(unsigned int)OFDM_index[0]]));\r
220                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("OFDMSwingTable_92E[(unsigned int)OFDM_index[1]] = %x \n",OFDMSwingTable_92E[(unsigned int)OFDM_index[1]]));\r
221 \r
222                 //Adujst OFDM Ant_A according to IQK result\r
223                 ele_D = (OFDMSwingTable_92E[(unsigned int)OFDM_index[0]] & 0xFFC00000) >> 22;\r
224                 X = priv->pshare->RegE94;\r
225                 Y = priv->pshare->RegE9C;\r
226 \r
227                 if (X != 0) {\r
228                         if ((X & 0x00000200) != 0)\r
229                                 X = X | 0xFFFFFC00;\r
230                         ele_A = ((X * ele_D) >> 8) & 0x000003FF;\r
231 \r
232                         //new element C = element D x Y\r
233                         if ((Y & 0x00000200) != 0)\r
234                                 Y = Y | 0xFFFFFC00;\r
235                         ele_C = ((Y * ele_D) >> 8) & 0x000003FF;\r
236 \r
237                         //wirte new elements A, C, D to regC80 and regC94, element B is always 0\r
238                         value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;\r
239                         PHY_SetBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord, value32);\r
240 \r
241                         value32 = (ele_C&0x000003C0)>>6;\r
242                         PHY_SetBBReg(priv, rOFDM0_XCTxAFE, bMaskH4Bits, value32);\r
243                         \r
244                         value32 = ((X * ele_D)>>7)&0x01;\r
245                         PHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(24), value32);\r
246                 } else {\r
247                         PHY_SetBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable_92E[(unsigned int)OFDM_index[0]]);\r
248                         PHY_SetBBReg(priv, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00);\r
249                         PHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(24), 0x00);\r
250                 }\r
251 \r
252                 set_CCK_swing_index(priv, CCK_index);\r
253 \r
254                 if (rf == 2) {\r
255                         ele_D = (OFDMSwingTable_92E[(unsigned int)OFDM_index[1]] & 0xFFC00000) >> 22;\r
256                         X = priv->pshare->RegEB4;\r
257                         Y = priv->pshare->RegEBC;\r
258 \r
259                         if (X != 0) {\r
260                                 if ((X & 0x00000200) != 0)      //consider minus\r
261                                         X = X | 0xFFFFFC00;\r
262                                 ele_A = ((X * ele_D) >> 8) & 0x000003FF;\r
263 \r
264                                 //new element C = element D x Y\r
265                                 if ((Y & 0x00000200) != 0)\r
266                                         Y = Y | 0xFFFFFC00;\r
267                                 ele_C = ((Y * ele_D) >> 8) & 0x00003FF;\r
268 \r
269                                 //wirte new elements A, C, D to regC88 and regC9C, element B is always 0\r
270                                 value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;\r
271                                 PHY_SetBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskDWord, value32);\r
272                                 \r
273                                 value32 = (ele_C & 0x000003C0) >> 6;\r
274                                 PHY_SetBBReg(priv, rOFDM0_XDTxAFE, bMaskH4Bits, value32);\r
275 \r
276                                 value32 = ((X * ele_D) >> 7) & 0x01;\r
277                                 PHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(28), value32);\r
278                         } else {\r
279                                 PHY_SetBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable_92E[(unsigned int)OFDM_index[1]]);\r
280                                 PHY_SetBBReg(priv, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00);\r
281                                 PHY_SetBBReg(priv, rOFDM0_ECCAThreshold, BIT(28), 0x00);\r
282                         }\r
283 \r
284                 }\r
285 \r
286                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("0xc80 = 0x%x \n", PHY_QueryBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord)));\r
287                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("0xc88 = 0x%x \n", PHY_QueryBBReg(priv, rOFDM0_XBTxIQImbalance, bMaskDWord)));\r
288 \r
289                 if (delta_IQK > 3) {\r
290                         priv->pshare->ThermalValue_IQK = ThermalValue;\r
291 #ifdef MP_TEST\r
292                         if (!(priv->pshare->rf_ft_var.mp_specific && (OPMODE & (WIFI_MP_CTX_BACKGROUND | WIFI_MP_CTX_PACKET))))\r
293 #endif  \r
294                                 PHY_IQCalibrate_8192E(pDM_Odm,false);\r
295                 }\r
296 \r
297                 if (delta_LCK > 8) {\r
298                         RTL_W8(0x522, 0xff);\r
299                         Reg0x18 = PHY_QueryRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, 1);\r
300                         PHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 1);                        \r
301                         PHY_SetRFReg(priv, RF_PATH_A, 0x18, BIT(15), 1);\r
302                         delay_ms(1);\r
303                         PHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 0);\r
304                         PHY_SetRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, Reg0x18);              \r
305                         RTL_W8(0x522, 0x0);\r
306                         priv->pshare->ThermalValue_LCK = ThermalValue;\r
307                 }       \r
308         }\r
309 \r
310         //update thermal meter value\r
311         priv->pshare->ThermalValue = ThermalValue;\r
312         for (i = 0 ; i < rf ; i++)\r
313                 priv->pshare->OFDM_index[i] = OFDM_index[i];\r
314         priv->pshare->CCK_index = CCK_index;\r
315 \r
316         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,  ("\n******** END:%s() ********\n", __FUNCTION__));   \r
317 }\r
318 #endif\r
319 \r
320 \r
321 \r
322 #if (RTL8197F_SUPPORT == 1 || RTL8822B_SUPPORT == 1)                                    \r
323 VOID\r
324 ODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries3(\r
325 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
326         IN      PVOID           pDM_VOID\r
327 #else\r
328         IN PADAPTER     Adapter\r
329 #endif\r
330         )\r
331 {\r
332 #if 1\r
333         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
334         u1Byte                  ThermalValue = 0, delta, delta_LCK, delta_IQK, channel, is_increase;\r
335         u1Byte                  ThermalValue_AVG_count = 0, p = 0, i = 0;\r
336         u4Byte                  ThermalValue_AVG = 0;\r
337         prtl8192cd_priv         priv = pDM_Odm->priv;\r
338         TXPWRTRACK_CFG  c;\r
339         PODM_RF_CAL_T   pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
340 \r
341         /*4 1. The following TWO tables decide the final index of OFDM/CCK swing table.*/\r
342         pu1Byte                 deltaSwingTableIdx_TUP_A = NULL, deltaSwingTableIdx_TDOWN_A = NULL;\r
343         pu1Byte                 deltaSwingTableIdx_TUP_B = NULL, deltaSwingTableIdx_TDOWN_B = NULL;\r
344         pu1Byte                 deltaSwingTableIdx_TUP_CCK_A = NULL, deltaSwingTableIdx_TDOWN_CCK_A = NULL;\r
345         pu1Byte                 deltaSwingTableIdx_TUP_CCK_B = NULL, deltaSwingTableIdx_TDOWN_CCK_B = NULL;\r
346         /*for 8814 add by Yu Chen*/\r
347         pu1Byte                 deltaSwingTableIdx_TUP_C = NULL, deltaSwingTableIdx_TDOWN_C = NULL;\r
348         pu1Byte                 deltaSwingTableIdx_TUP_D = NULL, deltaSwingTableIdx_TDOWN_D = NULL;\r
349         pu1Byte                 deltaSwingTableIdx_TUP_CCK_C = NULL, deltaSwingTableIdx_TDOWN_CCK_C = NULL;\r
350         pu1Byte                 deltaSwingTableIdx_TUP_CCK_D = NULL, deltaSwingTableIdx_TDOWN_CCK_D = NULL;\r
351 \r
352 #ifdef MP_TEST\r
353         if ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {\r
354                 channel = priv->pshare->working_channel;\r
355                 if (priv->pshare->mp_txpwr_tracking == FALSE)\r
356                         return;\r
357         } else\r
358 #endif\r
359         {\r
360                 channel = (priv->pmib->dot11RFEntry.dot11channel);\r
361         }\r
362 \r
363         ConfigureTxpowerTrack(pDM_Odm, &c);\r
364         \r
365         (*c.GetDeltaAllSwingTable)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_A, (pu1Byte *)&deltaSwingTableIdx_TDOWN_A,\r
366                                                                           (pu1Byte *)&deltaSwingTableIdx_TUP_B, (pu1Byte *)&deltaSwingTableIdx_TDOWN_B,\r
367                                                                           (pu1Byte *)&deltaSwingTableIdx_TUP_CCK_A, (pu1Byte *)&deltaSwingTableIdx_TDOWN_CCK_A,\r
368                                                                           (pu1Byte *)&deltaSwingTableIdx_TUP_CCK_B, (pu1Byte *)&deltaSwingTableIdx_TDOWN_CCK_B);\r
369         \r
370         ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); /*0x42: RF Reg[15:10] 88E*/\r
371 \r
372         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
373                 ("Readback Thermal Meter = 0x%x(%d) EEPROMthermalmeter 0x%x(%d)\n"\r
374                 , ThermalValue, ThermalValue, priv->pmib->dot11RFEntry.ther, priv->pmib->dot11RFEntry.ther));\r
375 \r
376         /* Initialize */\r
377         if (!pDM_Odm->RFCalibrateInfo.ThermalValue)\r
378                 pDM_Odm->RFCalibrateInfo.ThermalValue = priv->pmib->dot11RFEntry.ther;\r
379         \r
380         if (!pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)\r
381                 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = priv->pmib->dot11RFEntry.ther;\r
382 \r
383         if (!pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)\r
384                 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = priv->pmib->dot11RFEntry.ther;\r
385 \r
386         /* calculate average thermal meter */\r
387         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;\r
388         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;\r
389         \r
390         if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)   /*Average times =  c.AverageThermalNum*/\r
391                 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;\r
392 \r
393         for (i = 0; i < c.AverageThermalNum; i++) {\r
394                 if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i]) {\r
395                         ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];\r
396                         ThermalValue_AVG_count++;\r
397                 }\r
398         }\r
399 \r
400         if (ThermalValue_AVG_count) {/*Calculate Average ThermalValue after average enough times*/\r
401                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
402                         ("ThermalValue_AVG=0x%x(%d)  ThermalValue_AVG_count = %d\n"\r
403                         , ThermalValue_AVG, ThermalValue_AVG, ThermalValue_AVG_count));\r
404                 \r
405                 ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);\r
406 \r
407                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
408                         ("AVG Thermal Meter = 0x%X(%d), EEPROMthermalmeter = 0x%X(%d)\n", ThermalValue, ThermalValue, priv->pmib->dot11RFEntry.ther, priv->pmib->dot11RFEntry.ther));\r
409         }\r
410 \r
411         /*4 Calculate delta, delta_LCK, delta_IQK.*/\r
412         delta = RTL_ABS(ThermalValue, priv->pmib->dot11RFEntry.ther);   \r
413         delta_LCK = RTL_ABS(ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue_LCK);\r
414         delta_IQK = RTL_ABS(ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue_IQK);\r
415         is_increase = ((ThermalValue < priv->pmib->dot11RFEntry.ther) ? 0 : 1);\r
416 \r
417         if (delta > 29) { /* power track table index(thermal diff.) upper bound*/\r
418                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta(%d) > 29, set delta to 29\n", delta));\r
419                 delta = 29;\r
420         }\r
421 \r
422 \r
423         /*4 if necessary, do LCK.*/\r
424         \r
425         if (delta_LCK > c.Threshold_IQK) {\r
426                 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
427                 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\r
428                 if (c.PHY_LCCalibrate)\r
429                         (*c.PHY_LCCalibrate)(pDM_Odm);\r
430         } \r
431 \r
432         if (delta_IQK > c.Threshold_IQK) {\r
433                 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
434                 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue;\r
435                 if (c.DoIQK)\r
436                         (*c.DoIQK)(pDM_Odm, TRUE, 0, 0);\r
437         } \r
438 \r
439         if (!priv->pmib->dot11RFEntry.ther)     /*Don't do power tracking since no calibrated thermal value*/\r
440                 return;\r
441         \r
442         /*4 Do Power Tracking*/\r
443 \r
444         if (ThermalValue != pDM_Odm->RFCalibrateInfo.ThermalValue) {\r
445                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
446                         ("\n\n******** START POWER TRACKING ********\n"));\r
447                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
448                         ("Readback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n",\r
449                         ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue, priv->pmib->dot11RFEntry.ther));\r
450                                 \r
451 #ifdef _TRACKING_TABLE_FILE\r
452                 if (priv->pshare->rf_ft_var.pwr_track_file) {                           \r
453                         if (is_increase) {                      /*thermal is higher than base*/\r
454                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
455                                         switch (p) {\r
456                                         case ODM_RF_PATH_B:\r
457                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
458                                                         ("deltaSwingTableIdx_TUP_B[%d] = %d deltaSwingTableIdx_TUP_CCK_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta], delta, deltaSwingTableIdx_TUP_CCK_B[delta]));\r
459                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_B[delta];\r
460                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = deltaSwingTableIdx_TUP_CCK_B[delta]; \r
461                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
462                                                         ("******Temp is higher and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p]));\r
463                                         break;\r
464 \r
465                                         case ODM_RF_PATH_C:\r
466                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
467                                                         ("deltaSwingTableIdx_TUP_C[%d] = %d deltaSwingTableIdx_TUP_CCK_C[%d] = %d\n", delta, deltaSwingTableIdx_TUP_C[delta], delta, deltaSwingTableIdx_TUP_CCK_C[delta]));\r
468                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_C[delta];\r
469                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = deltaSwingTableIdx_TUP_CCK_C[delta];\r
470                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
471                                                         ("******Temp is higher and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p]));\r
472                                         break;\r
473 \r
474                                         case ODM_RF_PATH_D:\r
475                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
476                                                         ("deltaSwingTableIdx_TUP_D[%d] = %d deltaSwingTableIdx_TUP_CCK_D[%d] = %d\n", delta, deltaSwingTableIdx_TUP_D[delta], delta, deltaSwingTableIdx_TUP_CCK_D[delta]));\r
477                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_D[delta];\r
478                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = deltaSwingTableIdx_TUP_CCK_D[delta]; \r
479                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
480                                                         ("******Temp is higher and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p]));\r
481                                                 break;\r
482                                         default:\r
483                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
484                                                         ("deltaSwingTableIdx_TUP_A[%d] = %d deltaSwingTableIdx_TUP_CCK_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta], delta, deltaSwingTableIdx_TUP_CCK_A[delta]));\r
485                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_A[delta];\r
486                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = deltaSwingTableIdx_TUP_CCK_A[delta]; \r
487                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
488                                                         ("******Temp is higher and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p])); \r
489                                         break;\r
490                                         }\r
491                                 }\r
492                         } else {                        /* thermal is lower than base*/\r
493                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
494                                         switch (p) {\r
495                                         case ODM_RF_PATH_B:\r
496                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
497                                                         ("deltaSwingTableIdx_TDOWN_B[%d] = %d   deltaSwingTableIdx_TDOWN_CCK_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta], delta, deltaSwingTableIdx_TDOWN_CCK_B[delta]));  \r
498                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];\r
499                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_CCK_B[delta];\r
500                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
501                                                         ("******Temp is lower and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d   pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p])); \r
502                                         break;\r
503 \r
504                                         case ODM_RF_PATH_C:\r
505                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
506                                                         ("deltaSwingTableIdx_TDOWN_C[%d] = %d   deltaSwingTableIdx_TDOWN_CCK_C[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_C[delta], delta, deltaSwingTableIdx_TDOWN_CCK_C[delta]));  \r
507                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];\r
508                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_CCK_C[delta];\r
509                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
510                                                         ("******Temp is lower and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d   pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p])); \r
511                                         break;\r
512 \r
513                                         case ODM_RF_PATH_D:\r
514                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
515                                                         ("deltaSwingTableIdx_TDOWN_D[%d] = %d   deltaSwingTableIdx_TDOWN_CCK_D[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_D[delta], delta, deltaSwingTableIdx_TDOWN_CCK_D[delta]));  \r
516                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];\r
517                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_CCK_D[delta];\r
518                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
519                                                         ("******Temp is lower and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d   pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p])); \r
520                                         break;\r
521 \r
522                                         default:\r
523                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
524                                                         ("deltaSwingTableIdx_TDOWN_A[%d] = %d   deltaSwingTableIdx_TDOWN_CCK_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta], delta, deltaSwingTableIdx_TDOWN_CCK_A[delta]));  \r
525                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];\r
526                                                 pRFCalibrateInfo->Absolute_CCKSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_CCK_A[delta];\r
527                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
528                                                         ("******Temp is lower and pRF->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d   pRF->Absolute_CCKSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p], pRFCalibrateInfo->Absolute_CCKSwingIdx[p])); \r
529                                         break;\r
530                                         }               \r
531                                 }\r
532                         }\r
533                                 \r
534                         if (is_increase) {\r
535                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (">>> increse power --->\n"));\r
536                                         if (GET_CHIP_VER(priv) == VERSION_8197F) {\r
537                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
538                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, 0);\r
539                                         } else if (GET_CHIP_VER(priv) == VERSION_8822B) {\r
540                                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
541                                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
542                                         }\r
543                         } else {\r
544                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, (">>> decrese power --->\n"));\r
545                                         if (GET_CHIP_VER(priv) == VERSION_8197F) {\r
546                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
547                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, 0);\r
548                                         } else if (GET_CHIP_VER(priv) == VERSION_8822B) {\r
549                                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
550                                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
551                                         }\r
552                         }\r
553                 }\r
554 #endif          \r
555 \r
556         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("\n******** END:%s() ********\n\n", __func__));\r
557         /*update thermal meter value*/\r
558         pDM_Odm->RFCalibrateInfo.ThermalValue =  ThermalValue;\r
559 \r
560         }\r
561 \r
562 #endif\r
563 }\r
564 #endif\r
565 \r
566 /*#if (RTL8814A_SUPPORT == 1)*/\r
567 #if (RTL8814A_SUPPORT == 1)\r
568                 \r
569 VOID\r
570 ODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries2(\r
571 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
572         IN      PVOID           pDM_VOID\r
573 #else\r
574         IN PADAPTER     Adapter\r
575 #endif\r
576         )\r
577 {\r
578         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
579         u1Byte                  ThermalValue = 0, delta, delta_LCK, delta_IQK, channel, is_increase;\r
580         u1Byte                  ThermalValue_AVG_count = 0, p = 0, i = 0;\r
581         u4Byte                  ThermalValue_AVG = 0, Reg0x18;\r
582         u4Byte                  BBSwingReg[4] = {rA_TxScale_Jaguar,rB_TxScale_Jaguar,rC_TxScale_Jaguar2,rD_TxScale_Jaguar2};\r
583         s4Byte                  ele_D;\r
584         u4Byte                  BBswingIdx;\r
585         prtl8192cd_priv priv = pDM_Odm->priv;\r
586         TXPWRTRACK_CFG  c;\r
587         BOOLEAN                 bTSSIenable = FALSE;\r
588         PODM_RF_CAL_T   pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
589 \r
590         //4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\r
591         pu1Byte                 deltaSwingTableIdx_TUP_A = NULL, deltaSwingTableIdx_TDOWN_A = NULL;\r
592         pu1Byte                 deltaSwingTableIdx_TUP_B = NULL, deltaSwingTableIdx_TDOWN_B = NULL;\r
593         //for 8814 add by Yu Chen\r
594         pu1Byte                 deltaSwingTableIdx_TUP_C = NULL, deltaSwingTableIdx_TDOWN_C = NULL;\r
595         pu1Byte                 deltaSwingTableIdx_TUP_D = NULL, deltaSwingTableIdx_TDOWN_D = NULL;\r
596 \r
597 #ifdef MP_TEST\r
598         if ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {\r
599                 channel = priv->pshare->working_channel;\r
600                 if (priv->pshare->mp_txpwr_tracking == FALSE)\r
601                         return;\r
602         } else\r
603 #endif\r
604         {\r
605                 channel = (priv->pmib->dot11RFEntry.dot11channel);\r
606         }\r
607 \r
608         ConfigureTxpowerTrack(pDM_Odm, &c);\r
609         pRFCalibrateInfo->DefaultOfdmIndex = priv->pshare->OFDM_index0[ODM_RF_PATH_A];\r
610 \r
611         (*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_A, (pu1Byte*)&deltaSwingTableIdx_TDOWN_A,\r
612                                                                           (pu1Byte*)&deltaSwingTableIdx_TUP_B, (pu1Byte*)&deltaSwingTableIdx_TDOWN_B);\r
613 \r
614         if(pDM_Odm->SupportICType & ODM_RTL8814A)       // for 8814 path C & D\r
615         (*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte*)&deltaSwingTableIdx_TUP_C, (pu1Byte*)&deltaSwingTableIdx_TDOWN_C,\r
616                                                                           (pu1Byte*)&deltaSwingTableIdx_TUP_D, (pu1Byte*)&deltaSwingTableIdx_TDOWN_D);\r
617         \r
618         ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); //0x42: RF Reg[15:10] 88E\r
619         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
620                 ("\nReadback Thermal Meter = 0x%x, pre thermal meter 0x%x, EEPROMthermalmeter 0x%x\n", ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue, priv->pmib->dot11RFEntry.ther));\r
621 \r
622         /* Initialize */\r
623         if (!pDM_Odm->RFCalibrateInfo.ThermalValue) {\r
624                 pDM_Odm->RFCalibrateInfo.ThermalValue = priv->pmib->dot11RFEntry.ther;\r
625         }\r
626         \r
627         if (!pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) {\r
628                 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = priv->pmib->dot11RFEntry.ther;\r
629         }\r
630 \r
631         if (!pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) {\r
632                 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = priv->pmib->dot11RFEntry.ther;\r
633         }\r
634         \r
635         bTSSIenable = (BOOLEAN)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, rRF_TxGainOffset, BIT7);    // check TSSI enable\r
636         \r
637         //4 Query OFDM BB swing default setting         Bit[31:21]      \r
638         for(p = ODM_RF_PATH_A ; p < c.RfPathCount ; p++)\r
639         {\r
640                 ele_D = ODM_GetBBReg(pDM_Odm, BBSwingReg[p], 0xffe00000);       \r
641                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
642                         ("0x%x:0x%x ([31:21] = 0x%x)\n", BBSwingReg[p], ODM_GetBBReg(pDM_Odm, BBSwingReg[p], bMaskDWord), ele_D));\r
643                 \r
644                 for (BBswingIdx = 0; BBswingIdx < TXSCALE_TABLE_SIZE; BBswingIdx++) {//4 \r
645                         if (ele_D == TxScalingTable_Jaguar[BBswingIdx]) {\r
646                                 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = (u1Byte)BBswingIdx;\r
647                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
648                                         ("OFDM_index[%d]=%d\n",p, pDM_Odm->RFCalibrateInfo.OFDM_index[p]));                             \r
649                                 break;\r
650                         }\r
651                 }\r
652                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("KfreeOffset[%d]=%d\n",p, pRFCalibrateInfo->KfreeOffset[p]));\r
653                 \r
654         }\r
655 \r
656         /* calculate average thermal meter */\r
657         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;\r
658         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;\r
659         if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)   //Average times =  c.AverageThermalNum\r
660                 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;\r
661 \r
662         for(i = 0; i < c.AverageThermalNum; i++)\r
663         {\r
664                 if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i])\r
665                 {\r
666                         ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];\r
667                         ThermalValue_AVG_count++;\r
668                 }\r
669         }\r
670 \r
671         if(ThermalValue_AVG_count)               //Calculate Average ThermalValue after average enough times\r
672         {\r
673                 ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);\r
674                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
675                         ("AVG Thermal Meter = 0x%X, EEPROMthermalmeter = 0x%X\n", ThermalValue, priv->pmib->dot11RFEntry.ther));                                        \r
676         }\r
677 \r
678         //4 Calculate delta, delta_LCK, delta_IQK.\r
679         delta = RTL_ABS(ThermalValue, priv->pmib->dot11RFEntry.ther);   \r
680         delta_LCK = RTL_ABS(ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue_LCK);\r
681         delta_IQK = RTL_ABS(ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue_IQK);\r
682         is_increase = ((ThermalValue < priv->pmib->dot11RFEntry.ther) ? 0 : 1);\r
683 \r
684         //4 if necessary, do LCK.\r
685         if (!(pDM_Odm->SupportICType & ODM_RTL8821)) {\r
686                 if (delta_LCK > c.Threshold_IQK) {\r
687                         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
688                         pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\r
689 \r
690                         /*Use RTLCK, so close power tracking driver LCK*/\r
691                         #if (RTL8814A_SUPPORT != 1)\r
692                                 if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {\r
693                                         if (c.PHY_LCCalibrate)\r
694                                                 (*c.PHY_LCCalibrate)(pDM_Odm);\r
695                                 }\r
696                         #endif\r
697                 }\r
698         }\r
699 \r
700         if (delta_IQK > c.Threshold_IQK) \r
701         {\r
702                 panic_printk("%s(%d)\n", __FUNCTION__, __LINE__);\r
703                 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
704                 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue;\r
705                 if(c.DoIQK)\r
706                         (*c.DoIQK)(pDM_Odm, TRUE, 0, 0);\r
707         } \r
708 \r
709         if(!priv->pmib->dot11RFEntry.ther)      /*Don't do power tracking since no calibrated thermal value*/\r
710                 return;\r
711         \r
712          //4 Do Power Tracking\r
713 \r
714          if(bTSSIenable == TRUE)\r
715         {\r
716                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("**********Enter PURE TSSI MODE**********\n"));\r
717                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
718                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, TSSI_MODE, p, 0);\r
719         }\r
720         else if (ThermalValue != pDM_Odm->RFCalibrateInfo.ThermalValue)\r
721         {\r
722                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
723                         ("\n******** START POWER TRACKING ********\n"));                                        \r
724                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
725                         ("\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue, priv->pmib->dot11RFEntry.ther));                      \r
726                                 \r
727 #ifdef _TRACKING_TABLE_FILE\r
728                 if (priv->pshare->rf_ft_var.pwr_track_file)\r
729                 {                               \r
730                         if (is_increase)                        // thermal is higher than base\r
731                         {\r
732                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
733                                 {\r
734                                         switch(p)\r
735                                         {\r
736                                         case ODM_RF_PATH_B:\r
737                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
738                                                         ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta]));                                               \r
739                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_B[delta];       // Record delta swing for mix mode power tracking\r
740                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
741                                                         ("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
742                                         break;\r
743 \r
744                                         case ODM_RF_PATH_C:\r
745                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
746                                                         ("deltaSwingTableIdx_TUP_C[%d] = %d\n", delta, deltaSwingTableIdx_TUP_C[delta]));                                                               \r
747                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_C[delta];       // Record delta swing for mix mode power tracking\r
748                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
749                                                         ("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
750                                         break;\r
751 \r
752                                         case ODM_RF_PATH_D:\r
753                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
754                                                         ("deltaSwingTableIdx_TUP_D[%d] = %d\n", delta, deltaSwingTableIdx_TUP_D[delta]));                                                       \r
755                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_D[delta];       // Record delta swing for mix mode power tracking\r
756                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
757                                                         ("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
758                                         break;\r
759 \r
760                                         default:\r
761                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
762                                                         ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta]));                                               \r
763                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = deltaSwingTableIdx_TUP_A[delta];        // Record delta swing for mix mode power tracking\r
764                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
765                                                         ("******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
766                                         break;\r
767                                         }               \r
768                                 }\r
769                         }\r
770                         else                                    // thermal is lower than base\r
771                         {\r
772                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
773                                 {\r
774                                         switch(p)\r
775                                         {\r
776                                         case ODM_RF_PATH_B:\r
777                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
778                                                         ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta]));  \r
779                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];        // Record delta swing for mix mode power tracking\r
780                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
781                                                         ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); \r
782                                         break;\r
783 \r
784                                         case ODM_RF_PATH_C:\r
785                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
786                                                         ("deltaSwingTableIdx_TDOWN_C[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_C[delta]));  \r
787                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];        // Record delta swing for mix mode power tracking\r
788                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
789                                                         ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));   \r
790                                         break;\r
791 \r
792                                         case ODM_RF_PATH_D:\r
793                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
794                                                         ("deltaSwingTableIdx_TDOWN_D[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_D[delta]));  \r
795                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];        // Record delta swing for mix mode power tracking\r
796                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
797                                                         ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
798                                         break;\r
799 \r
800                                         default:\r
801                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
802                                                         ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta]));  \r
803                                                 pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];        // Record delta swing for mix mode power tracking\r
804                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
805                                                         ("******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
806                                         break;\r
807                                         }               \r
808                                 }\r
809                         }\r
810                                 \r
811                         if (is_increase)\r
812                         {\r
813                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> increse power ---> \n"));\r
814                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
815                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
816                         } \r
817                         else\r
818                         {\r
819                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> decrese power --->\n"));\r
820                                 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) \r
821                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
822                         }\r
823                 }\r
824 #endif          \r
825 \r
826         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\n******** END:%s() ********\n", __FUNCTION__));\r
827         //update thermal meter value\r
828         pDM_Odm->RFCalibrateInfo.ThermalValue =  ThermalValue;\r
829 \r
830         }\r
831 }\r
832 #endif\r
833 \r
834 #if (RTL8812A_SUPPORT == 1 || RTL8881A_SUPPORT == 1)\r
835 VOID\r
836 ODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries(\r
837 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
838         IN      PVOID           pDM_VOID\r
839 #else\r
840         IN PADAPTER     Adapter\r
841 #endif\r
842         )\r
843 {\r
844         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
845         unsigned char                   ThermalValue = 0, delta, delta_LCK, channel, is_decrease;\r
846         unsigned char                   ThermalValue_AVG_count = 0;\r
847         unsigned int                    ThermalValue_AVG = 0, Reg0x18;\r
848         unsigned int                    BBSwingReg[4]={0xc1c,0xe1c,0x181c,0x1a1c};\r
849         int                                     ele_D, value32;\r
850         char                                    OFDM_index[2], index;\r
851         unsigned int                    i = 0, j = 0, rf_path, max_rf_path =2 ,rf;\r
852         prtl8192cd_priv         priv = pDM_Odm->priv;\r
853         unsigned char                   OFDM_min_index = 7; //OFDM BB Swing should be less than +2.5dB, which is required by Arthur and Mimic\r
854 \r
855 \r
856 \r
857 #ifdef MP_TEST\r
858         if ((OPMODE & WIFI_MP_STATE) || priv->pshare->rf_ft_var.mp_specific) {\r
859                 channel = priv->pshare->working_channel;\r
860                 if (priv->pshare->mp_txpwr_tracking == FALSE)\r
861                         return;\r
862         } else\r
863 #endif\r
864         {\r
865                 channel = (priv->pmib->dot11RFEntry.dot11channel);\r
866         }\r
867 \r
868 #if RTL8881A_SUPPORT\r
869         if (pDM_Odm->SupportICType == ODM_RTL8881A) {\r
870                 max_rf_path = 1;\r
871                 if ((get_bonding_type_8881A() == BOND_8881AM ||get_bonding_type_8881A() == BOND_8881AN)                         \r
872                         && priv->pshare->rf_ft_var.use_intpa8881A && (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_2G))                   \r
873                         OFDM_min_index = 6;             // intPA - upper bond set to +3 dB (base: -2 dB)ot11RFEntry.phyBandSelect == PHY_BAND_2G))\r
874                 else\r
875                         OFDM_min_index = 10;            //OFDM BB Swing should be less than +1dB, which is required by Arthur and Mimic\r
876         }\r
877 #endif\r
878 \r
879 \r
880         ThermalValue = (unsigned char)PHY_QueryRFReg(priv, RF_PATH_A, 0x42, 0xfc00, 1); //0x42: RF Reg[15:10] 88E\r
881         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther));\r
882 \r
883 \r
884         //4 Query OFDM BB swing default setting         Bit[31:21]\r
885         for(rf_path = 0 ; rf_path < max_rf_path ; rf_path++){\r
886                 ele_D = PHY_QueryBBReg(priv, BBSwingReg[rf_path], 0xffe00000);  \r
887                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("0x%x:0x%x ([31:21] = 0x%x)\n",BBSwingReg[rf_path], PHY_QueryBBReg(priv, BBSwingReg[rf_path], bMaskDWord),ele_D));                    \r
888                 for (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {//4 \r
889                         if (ele_D == OFDMSwingTable_8812[i]) {\r
890                                 OFDM_index[rf_path] = (unsigned char)i;\r
891                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("OFDM_index[%d]=%d\n",rf_path, OFDM_index[rf_path]));                         \r
892                                 break;\r
893                         }\r
894                 }\r
895         }\r
896 #if 0   \r
897         //Query OFDM path A default setting     Bit[31:21]\r
898         ele_D = PHY_QueryBBReg(priv, 0xc1c, 0xffe00000);        \r
899         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("0xc1c:0x%x ([31:21] = 0x%x)\n", PHY_QueryBBReg(priv, 0xc1c, bMaskDWord),ele_D));                     \r
900         for (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {//4 \r
901                 if (ele_D == OFDMSwingTable_8812[i]) {\r
902                         OFDM_index[0] = (unsigned char)i;\r
903                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("OFDM_index[0]=%d\n", OFDM_index[0]));                                \r
904                         break;\r
905                 }\r
906         }\r
907         //Query OFDM path B default setting\r
908         if (rf == 2) {\r
909                 ele_D = PHY_QueryBBReg(priv, 0xe1c, 0xffe00000);                \r
910                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("0xe1c:0x%x ([32:21] = 0x%x)\n", PHY_QueryBBReg(priv, 0xe1c, bMaskDWord),ele_D));                     \r
911                 for (i = 0; i < OFDM_TABLE_SIZE_8812; i++) {\r
912                         if (ele_D == OFDMSwingTable_8812[i]) {\r
913                                 OFDM_index[1] = (unsigned char)i;\r
914                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("OFDM_index[1]=%d\n", OFDM_index[1]));                        \r
915                                 break;\r
916                         }\r
917                 }\r
918         }\r
919 #endif\r
920         /* Initialize */\r
921         if (!priv->pshare->ThermalValue) {\r
922                 priv->pshare->ThermalValue = priv->pmib->dot11RFEntry.ther;\r
923                 priv->pshare->ThermalValue_LCK = ThermalValue;\r
924         }\r
925 \r
926         /* calculate average thermal meter */\r
927         {\r
928                 priv->pshare->ThermalValue_AVG_8812[priv->pshare->ThermalValue_AVG_index_8812] = ThermalValue;\r
929                 priv->pshare->ThermalValue_AVG_index_8812++;\r
930                 if (priv->pshare->ThermalValue_AVG_index_8812 == AVG_THERMAL_NUM_8812)\r
931                         priv->pshare->ThermalValue_AVG_index_8812 = 0;\r
932 \r
933                 for (i = 0; i < AVG_THERMAL_NUM_8812; i++) {\r
934                         if (priv->pshare->ThermalValue_AVG_8812[i]) {\r
935                                 ThermalValue_AVG += priv->pshare->ThermalValue_AVG_8812[i];\r
936                                 ThermalValue_AVG_count++;\r
937                         }\r
938                 }\r
939 \r
940                 if (ThermalValue_AVG_count) {\r
941                         ThermalValue = (unsigned char)(ThermalValue_AVG / ThermalValue_AVG_count);\r
942                         //printk("AVG Thermal Meter = 0x%x \n", ThermalValue);\r
943                 }\r
944         }\r
945         \r
946 \r
947         //4 If necessary,  do power tracking\r
948 \r
949         if(!priv->pmib->dot11RFEntry.ther) /*Don't do power tracking since no calibrated thermal value*/\r
950                 return;  \r
951 \r
952         if (ThermalValue != priv->pshare->ThermalValue) {\r
953                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\n******** START POWER TRACKING ********\n"));                                       \r
954                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n", ThermalValue, priv->pshare->ThermalValue, priv->pmib->dot11RFEntry.ther));                        \r
955                 delta = RTL_ABS(ThermalValue, priv->pmib->dot11RFEntry.ther);\r
956                 delta_LCK = RTL_ABS(ThermalValue, priv->pshare->ThermalValue_LCK);\r
957                 is_decrease = ((ThermalValue < priv->pmib->dot11RFEntry.ther) ? 1 : 0);\r
958                 //if (priv->pmib->dot11RFEntry.phyBandSelect == PHY_BAND_5G) \r
959                 {\r
960 #ifdef _TRACKING_TABLE_FILE\r
961                         if (priv->pshare->rf_ft_var.pwr_track_file) {                           \r
962                                 for (rf_path = 0; rf_path < max_rf_path; rf_path++) {\r
963                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Diff: (%s)%d ==> get index from table : %d)\n", (is_decrease?"-":"+"), delta, get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0)));\r
964                                         if (is_decrease) {\r
965                                                 OFDM_index[rf_path] = priv->pshare->OFDM_index0[rf_path] + get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0);\r
966                                                 OFDM_index[rf_path] = ((OFDM_index[rf_path] > (OFDM_TABLE_SIZE_8812 - 1)) ? (OFDM_TABLE_SIZE_8812 - 1) : OFDM_index[rf_path]);\r
967                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> decrese power ---> new OFDM_INDEX:%d (%d + %d)\n", OFDM_index[rf_path], priv->pshare->OFDM_index0[rf_path], get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0)));\r
968 #if 0// RTL8881A_SUPPORT\r
969                                                 if (pDM_Odm->SupportICType == ODM_RTL8881A){\r
970                                                         if(priv->pshare->rf_ft_var.pwrtrk_TxAGC_enable){\r
971                                                                 if(priv->pshare->AddTxAGC){//TxAGC has been added\r
972                                                                         AddTxPower88XX_AC(priv,0); \r
973                                                                         priv->pshare->AddTxAGC = 0;\r
974                                                                         priv->pshare->AddTxAGC_index = 0;\r
975                                                                 }\r
976                                                         }\r
977                                                 }\r
978 #endif                          \r
979                                         } else {\r
980 \r
981                                                 OFDM_index[rf_path] = priv->pshare->OFDM_index0[rf_path] - get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0);\r
982 #if 0// RTL8881A_SUPPORT\r
983                                                 if(pDM_Odm->SupportICType == ODM_RTL8881A){ \r
984                                                         if(priv->pshare->rf_ft_var.pwrtrk_TxAGC_enable){\r
985                                                                 if(OFDM_index[i] < OFDM_min_index){\r
986                                                                         priv->pshare->AddTxAGC_index = (OFDM_min_index - OFDM_index[i])/2;  // Calculate Remnant TxAGC Value,  2 index for 1 TxAGC \r
987                                                                         AddTxPower88XX_AC(priv,priv->pshare->AddTxAGC_index);\r
988                                                                         priv->pshare->AddTxAGC = 1;     //AddTxAGC Flag = 1\r
989                                                                         OFDM_index[i] = OFDM_min_index;\r
990                                                                 }\r
991                                                                 else{\r
992                                                                         if(priv->pshare->AddTxAGC){// TxAGC been added\r
993                                                                                 priv->pshare->AddTxAGC = 0;\r
994                                                                                 priv->pshare->AddTxAGC_index = 0;\r
995                                                                                 AddTxPower88XX_AC(priv,0); //minus the added TPI\r
996                                                                         }\r
997                                                                 }\r
998                                                         }\r
999                                                 }\r
1000 #else\r
1001                                                 OFDM_index[rf_path] = ((OFDM_index[rf_path] < OFDM_min_index) ?  OFDM_min_index : OFDM_index[rf_path]);\r
1002 #endif\r
1003                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,(">>> increse power ---> new OFDM_INDEX:%d (%d - %d)\n", OFDM_index[rf_path], priv->pshare->OFDM_index0[rf_path], get_tx_tracking_index(priv, channel, rf_path, delta, is_decrease, 0)));\r
1004                                         }\r
1005                                 }\r
1006                         }\r
1007 #endif\r
1008                         //4 Set new BB swing index\r
1009                         for (rf_path = 0; rf_path < max_rf_path; rf_path++) {\r
1010                                 PHY_SetBBReg(priv, BBSwingReg[rf_path], 0xffe00000, OFDMSwingTable_8812[(unsigned int)OFDM_index[rf_path]]);\r
1011                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Readback 0x%x[31:21] = 0x%x, OFDM_index:%d\n",BBSwingReg[rf_path], PHY_QueryBBReg(priv, BBSwingReg[rf_path], 0xffe00000), OFDM_index[rf_path]));                             \r
1012                         }\r
1013 \r
1014                 }\r
1015                 if (delta_LCK > 8) {\r
1016                         RTL_W8(0x522, 0xff);\r
1017                         Reg0x18 = PHY_QueryRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, 1);\r
1018                         PHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 1);                        \r
1019                         PHY_SetRFReg(priv, RF_PATH_A, 0x18, BIT(15), 1);\r
1020             delay_ms(200); // frequency deviation\r
1021                         PHY_SetRFReg(priv, RF_PATH_A, 0xB4, BIT(14), 0);\r
1022                         PHY_SetRFReg(priv, RF_PATH_A, 0x18, bMask20Bits, Reg0x18);\r
1023                         #ifdef CONFIG_RTL_8812_SUPPORT\r
1024                         if (GET_CHIP_VER(priv)== VERSION_8812E)                 \r
1025                                 UpdateBBRFVal8812(priv, priv->pmib->dot11RFEntry.dot11channel); \r
1026                         #endif\r
1027                         RTL_W8(0x522, 0x0);\r
1028                         priv->pshare->ThermalValue_LCK = ThermalValue;\r
1029                 }       \r
1030                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("\n******** END:%s() ********\n", __FUNCTION__));\r
1031 \r
1032                 //update thermal meter value\r
1033                 priv->pshare->ThermalValue = ThermalValue;\r
1034                 for (rf_path = 0; rf_path < max_rf_path; rf_path++)\r
1035                         priv->pshare->OFDM_index[rf_path] = OFDM_index[rf_path];\r
1036         }\r
1037 }\r
1038 \r
1039 #endif\r
1040 \r
1041 \r
1042 VOID\r
1043 ODM_TXPowerTrackingCallback_ThermalMeter(\r
1044 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1045         IN      PVOID           pDM_VOID\r
1046 #else\r
1047         IN PADAPTER     Adapter\r
1048 #endif\r
1049         )\r
1050 {\r
1051         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1052         PODM_RF_CAL_T   pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
1053         \r
1054 \r
1055 #if (RTL8197F_SUPPORT == 1 || RTL8822B_SUPPORT == 1)\r
1056         if (pDM_Odm->SupportICType == ODM_RTL8197F || pDM_Odm->SupportICType == ODM_RTL8822B) {\r
1057                 ODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries3(pDM_Odm);\r
1058                 return;\r
1059         }\r
1060 #endif    \r
1061 #if (RTL8814A_SUPPORT == 1)             /*use this function to do power tracking after 8814 by YuChen*/\r
1062         if (pDM_Odm->SupportICType & ODM_RTL8814A) {\r
1063                 ODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries2(pDM_Odm);\r
1064                 return;\r
1065                 }\r
1066 #endif    \r
1067 #if (RTL8881A_SUPPORT || RTL8812A_SUPPORT == 1)    \r
1068         if (pDM_Odm->SupportICType & ODM_RTL8812 || pDM_Odm->SupportICType & ODM_RTL8881A) {\r
1069                 ODM_TXPowerTrackingCallback_ThermalMeter_JaguarSeries(pDM_Odm);\r
1070                 return;\r
1071         }\r
1072 #endif\r
1073 \r
1074 #if (RTL8192E_SUPPORT == 1)\r
1075         if (pDM_Odm->SupportICType==ODM_RTL8192E) {\r
1076                 ODM_TXPowerTrackingCallback_ThermalMeter_92E(pDM_Odm);\r
1077                 return;\r
1078         }\r
1079 #endif\r
1080 \r
1081 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1082         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1083         //PMGNT_INFO                    pMgntInfo = &Adapter->MgntInfo;\r
1084 #endif\r
1085         \r
1086 \r
1087         u1Byte                  ThermalValue = 0, delta, delta_LCK, delta_IQK, offset;\r
1088         u1Byte                  ThermalValue_AVG_count = 0;\r
1089         u4Byte                  ThermalValue_AVG = 0;   \r
1090 //      s4Byte                  ele_A=0, ele_D, TempCCk, X, value32;\r
1091 //      s4Byte                  Y, ele_C=0;\r
1092 //      s1Byte                  OFDM_index[2], CCK_index=0, OFDM_index_old[2]={0,0}, CCK_index_old=0, index;\r
1093 //      s1Byte                  deltaPowerIndex = 0;\r
1094         u4Byte                  i = 0;//, j = 0;\r
1095         BOOLEAN                 is2T = FALSE;\r
1096 //      BOOLEAN                 bInteralPA = FALSE;\r
1097 \r
1098         u1Byte                  OFDM_max_index = 34, rf = (is2T) ? 2 : 1; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur\r
1099         u1Byte                  Indexforchannel = 0;/*GetRightChnlPlaceforIQK(pHalData->CurrentChannel)*/\r
1100     enum            _POWER_DEC_INC { POWER_DEC, POWER_INC };\r
1101         #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1102         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
1103         #endif\r
1104         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1105         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
1106         #endif\r
1107 \r
1108         TXPWRTRACK_CFG  c;\r
1109 \r
1110 \r
1111         //4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\r
1112         s1Byte                  deltaSwingTableIdx[2][index_mapping_NUM_88E] = { \r
1113                         // {{Power decreasing(lower temperature)}, {Power increasing(higher temperature)}}\r
1114                         {0,0,2,3,4,4,5,6,7,7,8,9,10,10,11}, {0,0,1,2,3,4,4,4,4,5,7,8,9,9,10}\r
1115                     };  \r
1116         u1Byte                  thermalThreshold[2][index_mapping_NUM_88E]={\r
1117                         // {{Power decreasing(lower temperature)}, {Power increasing(higher temperature)}}\r
1118                                             {0,2,4,6,8,10,12,14,16,18,20,22,24,26,27}, {0,2,4,6,8,10,12,14,16,18,20,22,25,25,25}\r
1119                     };          \r
1120 \r
1121 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1122         prtl8192cd_priv priv = pDM_Odm->priv;\r
1123 #endif  \r
1124 \r
1125         //4 2. Initilization ( 7 steps in total )\r
1126 \r
1127         ConfigureTxpowerTrack(pDM_Odm, &c);\r
1128         \r
1129         pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++; //cosa add for debug\r
1130         pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = TRUE;\r
1131     \r
1132 #if (MP_DRIVER == 1)      \r
1133     pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = pHalData->TxPowerTrackControl; // <Kordan> We should keep updating the control variable according to HalData.\r
1134     // <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files.\r
1135     pDM_Odm->RFCalibrateInfo.RegA24 = 0x090e1317; \r
1136 #endif\r
1137 \r
1138 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && defined(MP_TEST)\r
1139         if ((OPMODE & WIFI_MP_STATE) || pDM_Odm->priv->pshare->rf_ft_var.mp_specific) {\r
1140                 if(pDM_Odm->priv->pshare->mp_txpwr_tracking == FALSE)\r
1141                         return;\r
1142         }\r
1143 #endif\r
1144         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("===>odm_TXPowerTrackingCallback_ThermalMeter_8188E, pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase: %d \n", pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase));\r
1145 /*\r
1146         if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) {\r
1147                 ODM_SetRFReg(pDM_Odm, RF_PATH_A, c.ThermalRegAddr, BIT17 | BIT16, 0x3);\r
1148                 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;\r
1149                 return;\r
1150         }\r
1151 */      \r
1152         ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, RF_PATH_A, c.ThermalRegAddr, 0xfc00);      //0x42: RF Reg[15:10] 88E\r
1153 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1154         if( ! ThermalValue || ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\r
1155 #else\r
1156         if( ! pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\r
1157 #endif          \r
1158         return;\r
1159 \r
1160         //4 3. Initialize ThermalValues of RFCalibrateInfo\r
1161         \r
1162         if( ! pDM_Odm->RFCalibrateInfo.ThermalValue)\r
1163         {\r
1164                 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;                               \r
1165                 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = ThermalValue;                                                                               \r
1166         }                       \r
1167 \r
1168         if(pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)\r
1169         {\r
1170                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("reload ofdm index for band switch\n"));                              \r
1171         }\r
1172 \r
1173         //4 4. Calculate average thermal meter\r
1174         \r
1175         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;\r
1176         pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;\r
1177         if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)\r
1178                 pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;\r
1179 \r
1180         for(i = 0; i < c.AverageThermalNum; i++)\r
1181         {\r
1182                 if(pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i])\r
1183                 {\r
1184                         ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];\r
1185                         ThermalValue_AVG_count++;\r
1186                 }\r
1187         }\r
1188 \r
1189         if(ThermalValue_AVG_count)\r
1190         {\r
1191                 // Give the new thermo value a weighting\r
1192                 ThermalValue_AVG += (ThermalValue*4);\r
1193                 \r
1194                 ThermalValue = (u1Byte)(ThermalValue_AVG / (ThermalValue_AVG_count+4));\r
1195                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("AVG Thermal Meter = 0x%x \n", ThermalValue));                                        \r
1196         }\r
1197                         \r
1198         //4 5. Calculate delta, delta_LCK, delta_IQK.\r
1199         \r
1200         delta     = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue):(pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);\r
1201         delta_LCK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK):(pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);\r
1202         delta_IQK = (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK)?(ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK):(pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);\r
1203                 \r
1204         //4 6. If necessary, do LCK.    \r
1205         if (!(pDM_Odm->SupportICType & ODM_RTL8821)) {\r
1206         /*if((delta_LCK > pHalData->Delta_LCK) && (pHalData->Delta_LCK != 0))*/\r
1207                 if (delta_LCK >= c.Threshold_IQK) { \r
1208                         /*Delta temperature is equal to or larger than 20 centigrade.*/\r
1209                         pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;\r
1210                         (*c.PHY_LCCalibrate)(pDM_Odm);\r
1211                 }\r
1212         }\r
1213 \r
1214         //3 7. If necessary, move the index of swing table to adjust Tx power.  \r
1215         \r
1216         if (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\r
1217         {\r
1218 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                    \r
1219             delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);            \r
1220 #else\r
1221             delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);            \r
1222 #endif\r
1223 \r
1224 \r
1225                 //4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset\r
1226                 \r
1227 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                            \r
1228                 if(ThermalValue > pHalData->EEPROMThermalMeter) {\r
1229 #else\r
1230                 if(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\r
1231 #endif\r
1232                         CALCULATE_SWINGTALBE_OFFSET(offset, POWER_INC, index_mapping_NUM_88E, delta);\r
1233                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex;\r
1234                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex =  deltaSwingTableIdx[POWER_INC][offset];\r
1235 \r
1236         } else {\r
1237         \r
1238                         CALCULATE_SWINGTALBE_OFFSET(offset, POWER_DEC, index_mapping_NUM_88E, delta);\r
1239                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex;\r
1240                         pDM_Odm->RFCalibrateInfo.DeltaPowerIndex = (-1)*deltaSwingTableIdx[POWER_DEC][offset];\r
1241         }\r
1242                 \r
1243                 if (pDM_Odm->RFCalibrateInfo.DeltaPowerIndex == pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast)\r
1244                         pDM_Odm->RFCalibrateInfo.PowerIndexOffset = 0;\r
1245                 else\r
1246                         pDM_Odm->RFCalibrateInfo.PowerIndexOffset = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast;\r
1247                 \r
1248             for(i = 0; i < rf; i++)             \r
1249                 pDM_Odm->RFCalibrateInfo.OFDM_index[i] = pRFCalibrateInfo->BbSwingIdxOfdmBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset;\r
1250                 pDM_Odm->RFCalibrateInfo.CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pDM_Odm->RFCalibrateInfo.PowerIndexOffset;\r
1251 \r
1252                 pRFCalibrateInfo->BbSwingIdxCck = pDM_Odm->RFCalibrateInfo.CCK_index;   \r
1253                 pRFCalibrateInfo->BbSwingIdxOfdm[RF_PATH_A] = pDM_Odm->RFCalibrateInfo.OFDM_index[RF_PATH_A];   \r
1254 \r
1255                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset));\r
1256                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("The 'OFDM' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxOfdm[RF_PATH_A], pRFCalibrateInfo->BbSwingIdxOfdmBase, pDM_Odm->RFCalibrateInfo.PowerIndexOffset));\r
1257 \r
1258                 //4 7.1 Handle boundary conditions of index.\r
1259                 \r
1260                 \r
1261                 for(i = 0; i < rf; i++)\r
1262                 {\r
1263                         if(pDM_Odm->RFCalibrateInfo.OFDM_index[i] > OFDM_max_index)\r
1264                         {\r
1265                                 pDM_Odm->RFCalibrateInfo.OFDM_index[i] = OFDM_max_index;\r
1266                         }\r
1267                         else if (pDM_Odm->RFCalibrateInfo.OFDM_index[i] < 0)\r
1268                         {\r
1269                                 pDM_Odm->RFCalibrateInfo.OFDM_index[i] = 0;\r
1270                         }\r
1271                 }\r
1272 \r
1273                 if(pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)\r
1274                         pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;\r
1275                 else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0)\r
1276                         pDM_Odm->RFCalibrateInfo.CCK_index = 0;\r
1277         }\r
1278         else\r
1279         {\r
1280                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
1281                         ("The thermal meter is unchanged or TxPowerTracking OFF: ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d)\n", ThermalValue, pDM_Odm->RFCalibrateInfo.ThermalValue));\r
1282                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset = 0;\r
1283         }\r
1284         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
1285                 ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n", pDM_Odm->RFCalibrateInfo.CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase));\r
1286                                 \r
1287         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
1288                 ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index: %d\n", pDM_Odm->RFCalibrateInfo.OFDM_index[RF_PATH_A], pRFCalibrateInfo->BbSwingIdxOfdmBase));\r
1289         \r
1290         if (pDM_Odm->RFCalibrateInfo.PowerIndexOffset != 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl)\r
1291         {\r
1292                 //4 7.2 Configure the Swing Table to adjust Tx Power.\r
1293                 \r
1294                         pDM_Odm->RFCalibrateInfo.bTxPowerChanged = TRUE; // Always TRUE after Tx Power is adjusted by power tracking.                   \r
1295                         //\r
1296                         // 2012/04/23 MH According to Luke's suggestion, we can not write BB digital\r
1297                         // to increase TX power. Otherwise, EVM will be bad.\r
1298                         //\r
1299                         // 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.\r
1300                         if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue)\r
1301                         {\r
1302                                 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
1303                                 //      ("Temperature Increasing: delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", \r
1304                                 //      pDM_Odm->RFCalibrateInfo.PowerIndexOffset, delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));  \r
1305                         }\r
1306                         else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue)// Low temperature\r
1307                         {\r
1308                                 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
1309                                 //      ("Temperature Decreasing: delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",\r
1310                                 //              pDM_Odm->RFCalibrateInfo.PowerIndexOffset, delta, ThermalValue, pHalData->EEPROMThermalMeter, pDM_Odm->RFCalibrateInfo.ThermalValue));                          \r
1311                         }\r
1312 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1313                         if (ThermalValue > pHalData->EEPROMThermalMeter)\r
1314 #else\r
1315                         if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)\r
1316 #endif\r
1317                         {\r
1318 //                              ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Temperature(%d) hugher than PG value(%d), increases the power by TxAGC\n", ThermalValue, pHalData->EEPROMThermalMeter));\r
1319                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, TXAGC, 0, 0);                                                        \r
1320                         }\r
1321                         else\r
1322                         {\r
1323         //                      ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("Temperature(%d) lower than PG value(%d), increases the power by TxAGC\n", ThermalValue, pHalData->EEPROMThermalMeter));\r
1324                                 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, RF_PATH_A, Indexforchannel);        \r
1325                                 if(is2T)\r
1326                                         (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, RF_PATH_B, Indexforchannel);                                \r
1327                         }\r
1328                         \r
1329                         pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck;\r
1330                         pRFCalibrateInfo->BbSwingIdxOfdmBase = pRFCalibrateInfo->BbSwingIdxOfdm[RF_PATH_A];\r
1331                         pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;\r
1332 \r
1333         }\r
1334                 \r
1335 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1336         // if((delta_IQK > pHalData->Delta_IQK) && (pHalData->Delta_IQK != 0))\r
1337         if ((delta_IQK >= 8)) // Delta temperature is equal to or larger than 20 centigrade.\r
1338                 (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);\r
1339 #endif          \r
1340                         \r
1341         ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("<===dm_TXPowerTrackingCallback_ThermalMeter_8188E\n"));\r
1342 \r
1343         pDM_Odm->RFCalibrateInfo.TXPowercount = 0;\r
1344 }\r
1345 \r
1346 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
1347 \r
1348 \r
1349 VOID\r
1350 phy_PathAStandBy(\r
1351         IN      PADAPTER        pAdapter\r
1352         )\r
1353 {\r
1354         RTPRINT(FINIT, INIT_IQK, ("Path-A standby mode!\n"));\r
1355 \r
1356         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x0);\r
1357         PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000);\r
1358         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x808000);\r
1359 }\r
1360 \r
1361 //1 7.  IQK\r
1362 //#define MAX_TOLERANCE         5\r
1363 //#define IQK_DELAY_TIME                1               //ms\r
1364 \r
1365 u1Byte                  //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK\r
1366 phy_PathA_IQK_8192C(\r
1367         IN      PADAPTER        pAdapter,\r
1368         IN      BOOLEAN         configPathB\r
1369         )\r
1370 {\r
1371 \r
1372         u4Byte regEAC, regE94, regE9C, regEA4;\r
1373         u1Byte result = 0x00;\r
1374         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
1375 \r
1376         RTPRINT(FINIT, INIT_IQK, ("Path A IQK!\n"));\r
1377 \r
1378         //path-A IQK setting\r
1379         RTPRINT(FINIT, INIT_IQK, ("Path-A IQK setting!\n"));\r
1380         if(pAdapter->interfaceIndex == 0)\r
1381         {\r
1382                 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x10008c1f);\r
1383                 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);\r
1384         }\r
1385         else\r
1386         {\r
1387                 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x10008c22);\r
1388                 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x10008c22); \r
1389         }\r
1390 \r
1391         PHY_SetBBReg(pAdapter, rTx_IQK_PI_A, bMaskDWord, 0x82140102);\r
1392 \r
1393         PHY_SetBBReg(pAdapter, rRx_IQK_PI_A, bMaskDWord, configPathB ? 0x28160202 : \r
1394                 IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)?0x28160202:0x28160502);\r
1395 \r
1396         //path-B IQK setting\r
1397         if(configPathB)\r
1398         {\r
1399                 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x10008c22);\r
1400                 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x10008c22);\r
1401                 PHY_SetBBReg(pAdapter, rTx_IQK_PI_B, bMaskDWord, 0x82140102);\r
1402                 PHY_SetBBReg(pAdapter, rRx_IQK_PI_B, bMaskDWord, 0x28160202);\r
1403         }\r
1404 \r
1405         //LO calibration setting\r
1406         RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n"));\r
1407         PHY_SetBBReg(pAdapter, rIQK_AGC_Rsp, bMaskDWord, 0x001028d1);\r
1408 \r
1409         //One shot, path A LOK & IQK\r
1410         RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));\r
1411         PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);\r
1412         PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);\r
1413         \r
1414         // delay x ms\r
1415         RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME));\r
1416         PlatformStallExecution(IQK_DELAY_TIME*1000);\r
1417 \r
1418         // Check failed\r
1419         regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);\r
1420         RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));\r
1421         regE94 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord);\r
1422         RTPRINT(FINIT, INIT_IQK, ("0xe94 = 0x%x\n", regE94));\r
1423         regE9C= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord);\r
1424         RTPRINT(FINIT, INIT_IQK, ("0xe9c = 0x%x\n", regE9C));\r
1425         regEA4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord);\r
1426         RTPRINT(FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regEA4));\r
1427 \r
1428         if(!(regEAC & BIT28) &&         \r
1429                 (((regE94 & 0x03FF0000)>>16) != 0x142) &&\r
1430                 (((regE9C & 0x03FF0000)>>16) != 0x42) )\r
1431                 result |= 0x01;\r
1432         else                                                    //if Tx not OK, ignore Rx\r
1433                 return result;\r
1434 \r
1435         if(!(regEAC & BIT27) &&         //if Tx is OK, check whether Rx is OK\r
1436                 (((regEA4 & 0x03FF0000)>>16) != 0x132) &&\r
1437                 (((regEAC & 0x03FF0000)>>16) != 0x36))\r
1438                 result |= 0x02;\r
1439         else\r
1440                 RTPRINT(FINIT, INIT_IQK, ("Path A Rx IQK fail!!\n"));\r
1441         \r
1442         return result;\r
1443 \r
1444 \r
1445 }\r
1446 \r
1447 u1Byte                          //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK\r
1448 phy_PathB_IQK_8192C(\r
1449         IN      PADAPTER        pAdapter\r
1450         )\r
1451 {\r
1452         u4Byte regEAC, regEB4, regEBC, regEC4, regECC;\r
1453         u1Byte  result = 0x00;\r
1454         RTPRINT(FINIT, INIT_IQK, ("Path B IQK!\n"));\r
1455 \r
1456         //One shot, path B LOK & IQK\r
1457         RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));\r
1458         PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000002);\r
1459         PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000000);\r
1460 \r
1461         // delay x ms\r
1462         RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME));\r
1463         PlatformStallExecution(IQK_DELAY_TIME*1000);\r
1464 \r
1465         // Check failed\r
1466         regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);\r
1467         RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));\r
1468         regEB4 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord);\r
1469         RTPRINT(FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regEB4));\r
1470         regEBC= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord);\r
1471         RTPRINT(FINIT, INIT_IQK, ("0xebc = 0x%x\n", regEBC));\r
1472         regEC4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord);\r
1473         RTPRINT(FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regEC4));\r
1474         regECC= PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord);\r
1475         RTPRINT(FINIT, INIT_IQK, ("0xecc = 0x%x\n", regECC));\r
1476 \r
1477         if(!(regEAC & BIT31) &&\r
1478                 (((regEB4 & 0x03FF0000)>>16) != 0x142) &&\r
1479                 (((regEBC & 0x03FF0000)>>16) != 0x42))\r
1480                 result |= 0x01;\r
1481         else\r
1482                 return result;\r
1483 \r
1484         if(!(regEAC & BIT30) &&\r
1485                 (((regEC4 & 0x03FF0000)>>16) != 0x132) &&\r
1486                 (((regECC & 0x03FF0000)>>16) != 0x36))\r
1487                 result |= 0x02;\r
1488         else\r
1489                 RTPRINT(FINIT, INIT_IQK, ("Path B Rx IQK fail!!\n"));\r
1490         \r
1491 \r
1492         return result;\r
1493 \r
1494 }\r
1495 \r
1496 VOID\r
1497 phy_PathAFillIQKMatrix(\r
1498         IN      PADAPTER        pAdapter,\r
1499         IN  BOOLEAN     bIQKOK,\r
1500         IN      s4Byte          result[][8],\r
1501         IN      u1Byte          final_candidate,\r
1502         IN  BOOLEAN             bTxOnly\r
1503         )\r
1504 {\r
1505         u4Byte  Oldval_0, X, TX0_A, reg;\r
1506         s4Byte  Y, TX0_C;\r
1507         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);     \r
1508         \r
1509         RTPRINT(FINIT, INIT_IQK, ("Path A IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"));\r
1510 \r
1511         if(final_candidate == 0xFF)\r
1512                 return;\r
1513 \r
1514         else if(bIQKOK)\r
1515         {\r
1516                 Oldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF;\r
1517 \r
1518                 X = result[final_candidate][0];\r
1519                 if ((X & 0x00000200) != 0)\r
1520                         X = X | 0xFFFFFC00;                             \r
1521                 TX0_A = (X * Oldval_0) >> 8;\r
1522                 RTPRINT(FINIT, INIT_IQK, ("X = 0x%x, TX0_A = 0x%x, Oldval_0 0x%x\n", X, TX0_A, Oldval_0));\r
1523                 PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A);\r
1524                 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X * Oldval_0>>7) & 0x1));\r
1525      \r
1526                 Y = result[final_candidate][1];\r
1527                 if ((Y & 0x00000200) != 0)\r
1528                         Y = Y | 0xFFFFFC00;             \r
1529 \r
1530                 //path B IQK result + 3\r
1531                 if(pAdapter->interfaceIndex == 1 && pHalData->CurrentBandType == BAND_ON_5G)\r
1532                         Y += 3;\r
1533                 \r
1534                 TX0_C = (Y * Oldval_0) >> 8;\r
1535                 RTPRINT(FINIT, INIT_IQK, ("Y = 0x%x, TX = 0x%x\n", Y, TX0_C));\r
1536                 PHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6));\r
1537                 PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F));\r
1538                 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y * Oldval_0>>7) & 0x1));\r
1539 \r
1540                 if(bTxOnly)\r
1541                 {\r
1542                         RTPRINT(FINIT, INIT_IQK, ("phy_PathAFillIQKMatrix only Tx OK\n"));              \r
1543                         return;\r
1544                 }\r
1545 \r
1546                 reg = result[final_candidate][2];\r
1547                 PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg);\r
1548         \r
1549                 reg = result[final_candidate][3] & 0x3F;\r
1550                 PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg);\r
1551 \r
1552                 reg = (result[final_candidate][3] >> 6) & 0xF;\r
1553                 PHY_SetBBReg(pAdapter, rOFDM0_RxIQExtAnta, 0xF0000000, reg);\r
1554         }\r
1555 }\r
1556 \r
1557 VOID\r
1558 phy_PathBFillIQKMatrix(\r
1559         IN      PADAPTER        pAdapter,\r
1560         IN  BOOLEAN     bIQKOK,\r
1561         IN      s4Byte          result[][8],\r
1562         IN      u1Byte          final_candidate,\r
1563         IN      BOOLEAN         bTxOnly                 //do Tx only\r
1564         )\r
1565 {\r
1566         u4Byte  Oldval_1, X, TX1_A, reg;\r
1567         s4Byte  Y, TX1_C;\r
1568         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);     \r
1569         \r
1570         RTPRINT(FINIT, INIT_IQK, ("Path B IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed"));\r
1571 \r
1572         if(final_candidate == 0xFF)\r
1573                 return;\r
1574 \r
1575         else if(bIQKOK)\r
1576         {\r
1577                 Oldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF;\r
1578 \r
1579                 X = result[final_candidate][4];\r
1580                 if ((X & 0x00000200) != 0)\r
1581                         X = X | 0xFFFFFC00;             \r
1582                 TX1_A = (X * Oldval_1) >> 8;\r
1583                 RTPRINT(FINIT, INIT_IQK, ("X = 0x%x, TX1_A = 0x%x\n", X, TX1_A));\r
1584                 PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A);\r
1585                 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X * Oldval_1>>7) & 0x1));\r
1586 \r
1587                 Y = result[final_candidate][5];\r
1588                 if ((Y & 0x00000200) != 0)\r
1589                         Y = Y | 0xFFFFFC00;             \r
1590                 if(pHalData->CurrentBandType == BAND_ON_5G)             \r
1591                         Y += 3;         //temp modify for preformance\r
1592                 TX1_C = (Y * Oldval_1) >> 8;\r
1593                 RTPRINT(FINIT, INIT_IQK, ("Y = 0x%x, TX1_C = 0x%x\n", Y, TX1_C));\r
1594                 PHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6));\r
1595                 PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F));\r
1596                 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y * Oldval_1>>7) & 0x1));\r
1597 \r
1598                 if(bTxOnly)\r
1599                         return;\r
1600 \r
1601                 reg = result[final_candidate][6];\r
1602                 PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg);\r
1603         \r
1604                 reg = result[final_candidate][7] & 0x3F;\r
1605                 PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg);\r
1606 \r
1607                 reg = (result[final_candidate][7] >> 6) & 0xF;\r
1608                 PHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg);\r
1609         }\r
1610 }\r
1611 \r
1612 \r
1613 BOOLEAN                                                 \r
1614 phy_SimularityCompare_92C(\r
1615         IN      PADAPTER        pAdapter,\r
1616         IN      s4Byte          result[][8],\r
1617         IN      u1Byte           c1,\r
1618         IN      u1Byte           c2\r
1619         )\r
1620 {\r
1621         u4Byte          i, j, diff, SimularityBitMap, bound = 0;\r
1622         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);     \r
1623         u1Byte          final_candidate[2] = {0xFF, 0xFF};      //for path A and path B\r
1624         BOOLEAN         bResult = TRUE, is2T = IS_92C_SERIAL( pHalData->VersionID);\r
1625         \r
1626         if(is2T)\r
1627                 bound = 8;\r
1628         else\r
1629                 bound = 4;\r
1630 \r
1631         SimularityBitMap = 0;\r
1632         \r
1633         for( i = 0; i < bound; i++ )\r
1634         {\r
1635                 diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]);\r
1636                 if (diff > MAX_TOLERANCE)\r
1637                 {\r
1638                         if((i == 2 || i == 6) && !SimularityBitMap)\r
1639                         {\r
1640                                 if(result[c1][i]+result[c1][i+1] == 0)\r
1641                                         final_candidate[(i/4)] = c2;\r
1642                                 else if (result[c2][i]+result[c2][i+1] == 0)\r
1643                                         final_candidate[(i/4)] = c1;\r
1644                                 else\r
1645                                         SimularityBitMap = SimularityBitMap|(1<<i);                                     \r
1646                         }\r
1647                         else\r
1648                                 SimularityBitMap = SimularityBitMap|(1<<i);\r
1649                 }\r
1650         }\r
1651         \r
1652         if ( SimularityBitMap == 0)\r
1653         {\r
1654                 for( i = 0; i < (bound/4); i++ )\r
1655                 {\r
1656                         if(final_candidate[i] != 0xFF)\r
1657                         {\r
1658                                 for( j = i*4; j < (i+1)*4-2; j++)\r
1659                                         result[3][j] = result[final_candidate[i]][j];\r
1660                                 bResult = FALSE;\r
1661                         }\r
1662                 }\r
1663                 return bResult;\r
1664         }\r
1665         else if (!(SimularityBitMap & 0x0F))                    //path A OK\r
1666         {\r
1667                 for(i = 0; i < 4; i++)\r
1668                         result[3][i] = result[c1][i];\r
1669                 return FALSE;\r
1670         }\r
1671         else if (!(SimularityBitMap & 0xF0) && is2T)    //path B OK\r
1672         {\r
1673                 for(i = 4; i < 8; i++)\r
1674                         result[3][i] = result[c1][i];\r
1675                 return FALSE;\r
1676         }       \r
1677         else            \r
1678                 return FALSE;\r
1679         \r
1680 }\r
1681 \r
1682 /*\r
1683 return FALSE => do IQK again\r
1684 */\r
1685 BOOLEAN                                                 \r
1686 phy_SimularityCompare(\r
1687         IN      PADAPTER        pAdapter,\r
1688         IN      s4Byte          result[][8],\r
1689         IN      u1Byte           c1,\r
1690         IN      u1Byte           c2\r
1691         )\r
1692 {       \r
1693         return phy_SimularityCompare_92C(pAdapter, result, c1, c2);     \r
1694 \r
1695 }\r
1696 \r
1697 VOID    \r
1698 phy_IQCalibrate_8192C(\r
1699         IN      PADAPTER        pAdapter,\r
1700         IN      s4Byte          result[][8],\r
1701         IN      u1Byte          t,\r
1702         IN      BOOLEAN         is2T\r
1703         )\r
1704 {\r
1705         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
1706         u4Byte                  i;\r
1707         u1Byte                  PathAOK, PathBOK;\r
1708         u4Byte                  ADDA_REG[IQK_ADDA_REG_NUM] = {  \r
1709                                                 rFPGA0_XCD_SwitchControl,       rBlue_Tooth,    \r
1710                                                 rRx_Wait_CCA,           rTx_CCK_RFON,\r
1711                                                 rTx_CCK_BBON,   rTx_OFDM_RFON,  \r
1712                                                 rTx_OFDM_BBON,  rTx_To_Rx,\r
1713                                                 rTx_To_Tx,              rRx_CCK,        \r
1714                                                 rRx_OFDM,               rRx_Wait_RIFS,\r
1715                                                 rRx_TO_Rx,              rStandby,       \r
1716                                                 rSleep,                         rPMPD_ANAEN };\r
1717         u4Byte                  IQK_MAC_REG[IQK_MAC_REG_NUM] = {\r
1718                                                 REG_TXPAUSE,            REG_BCN_CTRL,   \r
1719                                                 REG_BCN_CTRL_1, REG_GPIO_MUXCFG};\r
1720                                         \r
1721         //since 92C & 92D have the different define in IQK_BB_REG       \r
1722         u4Byte  IQK_BB_REG_92C[IQK_BB_REG_NUM] = {\r
1723                                                         rOFDM0_TRxPathEnable,           rOFDM0_TRMuxPar,        \r
1724                                                         rFPGA0_XCD_RFInterfaceSW,       rConfig_AntA,   rConfig_AntB,\r
1725                                                         rFPGA0_XAB_RFInterfaceSW,       rFPGA0_XA_RFInterfaceOE,        \r
1726                                                         rFPGA0_XB_RFInterfaceOE,        /*rFPGA0_RFMOD*/ rCCK0_AFESetting       \r
1727                                                         };      \r
1728 \r
1729         u4Byte  IQK_BB_REG_92D[IQK_BB_REG_NUM_92D] = {  //for normal\r
1730                                                         rFPGA0_XAB_RFInterfaceSW,       rFPGA0_XA_RFInterfaceOE,        \r
1731                                                         rFPGA0_XB_RFInterfaceOE,        rOFDM0_TRMuxPar,\r
1732                                                         rFPGA0_XCD_RFInterfaceSW,       rOFDM0_TRxPathEnable,   \r
1733                                                         /*rFPGA0_RFMOD*/ rCCK0_AFESetting,                      rFPGA0_AnalogParameter4,\r
1734                                                         rOFDM0_XAAGCCore1,              rOFDM0_XBAGCCore1                                               \r
1735                                                 };              \r
1736 #if MP_DRIVER\r
1737         const u4Byte    retryCount = 9;\r
1738 #else\r
1739         const u4Byte    retryCount = 2;\r
1740 #endif\r
1741         //Neil Chen--2011--05--19--\r
1742        //3 Path Div     \r
1743         u1Byte                 rfPathSwitch=0x0;\r
1744 \r
1745         // Note: IQ calibration must be performed after loading \r
1746         //              PHY_REG.txt , and radio_a, radio_b.txt  \r
1747         \r
1748         u4Byte bbvalue;\r
1749 \r
1750         if(t==0)\r
1751         {\r
1752                  //bbvalue = PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bMaskDWord);\r
1753                 //      RTPRINT(FINIT, INIT_IQK, ("phy_IQCalibrate_8192C()==>0x%08x\n",bbvalue));\r
1754 \r
1755                         RTPRINT(FINIT, INIT_IQK, ("IQ Calibration for %s\n", (is2T ? "2T2R" : "1T1R")));\r
1756         \r
1757                 // Save ADDA parameters, turn Path A ADDA on\r
1758                 phy_SaveADDARegisters(pAdapter, ADDA_REG, pHalData->ADDA_backup, IQK_ADDA_REG_NUM);\r
1759                 phy_SaveMACRegisters(pAdapter, IQK_MAC_REG, pHalData->IQK_MAC_backup);\r
1760                 phy_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup, IQK_BB_REG_NUM);\r
1761         }\r
1762         \r
1763         phy_PathADDAOn(pAdapter, ADDA_REG, TRUE, is2T);\r
1764         \r
1765         if(t==0)\r
1766         {\r
1767                 pHalData->bRfPiEnable = (u1Byte)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8));\r
1768         }\r
1769         \r
1770         if(!pHalData->bRfPiEnable){\r
1771                 // Switch BB to PI mode to do IQ Calibration.\r
1772                 phy_PIModeSwitch(pAdapter, TRUE);\r
1773         }\r
1774         \r
1775         //MAC settings\r
1776         phy_MACSettingCalibration(pAdapter, IQK_MAC_REG, pHalData->IQK_MAC_backup);\r
1777         \r
1778         //PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, BIT24, 0x00);            \r
1779         PHY_SetBBReg(pAdapter, rCCK0_AFESetting, bMaskDWord, (0x0f000000 | (PHY_QueryBBReg(pAdapter, rCCK0_AFESetting, bMaskDWord))) );\r
1780         PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600);\r
1781         PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4);\r
1782         PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22204000);\r
1783         {\r
1784                 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0x01);\r
1785                 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0x01);  \r
1786                 PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0x00);\r
1787                 PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0x00);   \r
1788         }\r
1789 \r
1790         if(is2T)\r
1791         {\r
1792                 PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00010000);\r
1793                 PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00010000);\r
1794         }\r
1795 \r
1796         {\r
1797                 //Page B init\r
1798                 PHY_SetBBReg(pAdapter, rConfig_AntA, bMaskDWord, 0x00080000);\r
1799                 \r
1800                 if(is2T)\r
1801                 {\r
1802                         PHY_SetBBReg(pAdapter, rConfig_AntB, bMaskDWord, 0x00080000);\r
1803                 }\r
1804         }\r
1805         // IQ calibration setting\r
1806         RTPRINT(FINIT, INIT_IQK, ("IQK setting!\n"));           \r
1807         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x808000);\r
1808         PHY_SetBBReg(pAdapter, rTx_IQK, bMaskDWord, 0x01007c00);\r
1809         PHY_SetBBReg(pAdapter, rRx_IQK, bMaskDWord, 0x01004800);\r
1810 \r
1811         for(i = 0 ; i < retryCount ; i++){\r
1812                 PathAOK = phy_PathA_IQK_8192C(pAdapter, is2T);\r
1813                 if(PathAOK == 0x03){\r
1814                         RTPRINT(FINIT, INIT_IQK, ("Path A IQK Success!!\n"));\r
1815                                 result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;\r
1816                                 result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;\r
1817                                 result[t][2] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;\r
1818                                 result[t][3] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;\r
1819                         break;\r
1820                 }\r
1821                 else if (i == (retryCount-1) && PathAOK == 0x01)        //Tx IQK OK\r
1822                 {\r
1823                         RTPRINT(FINIT, INIT_IQK, ("Path A IQK Only  Tx Success!!\n"));\r
1824                         \r
1825                         result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;\r
1826                         result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;                     \r
1827                 }\r
1828         }\r
1829 \r
1830         if(0x00 == PathAOK){            \r
1831                 RTPRINT(FINIT, INIT_IQK, ("Path A IQK failed!!\n"));            \r
1832         }\r
1833 \r
1834         if(is2T){\r
1835                 phy_PathAStandBy(pAdapter);\r
1836 \r
1837                 // Turn Path B ADDA on\r
1838                 phy_PathADDAOn(pAdapter, ADDA_REG, FALSE, is2T);\r
1839 \r
1840                 for(i = 0 ; i < retryCount ; i++){\r
1841                         PathBOK = phy_PathB_IQK_8192C(pAdapter);\r
1842                         if(PathBOK == 0x03){\r
1843                                 RTPRINT(FINIT, INIT_IQK, ("Path B IQK Success!!\n"));\r
1844                                 result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;\r
1845                                 result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;\r
1846                                 result[t][6] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;\r
1847                                 result[t][7] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;\r
1848                                 break;\r
1849                         }\r
1850                         else if (i == (retryCount - 1) && PathBOK == 0x01)      //Tx IQK OK\r
1851                         {\r
1852                                 RTPRINT(FINIT, INIT_IQK, ("Path B Only Tx IQK Success!!\n"));\r
1853                                 result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;\r
1854                                 result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;                             \r
1855                         }\r
1856                 }\r
1857 \r
1858                 if(0x00 == PathBOK){            \r
1859                         RTPRINT(FINIT, INIT_IQK, ("Path B IQK failed!!\n"));            \r
1860                 }\r
1861         }\r
1862 \r
1863         //Back to BB mode, load original value\r
1864         RTPRINT(FINIT, INIT_IQK, ("IQK:Back to BB mode, load original value!\n"));\r
1865         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);\r
1866 \r
1867         if(t!=0)\r
1868         {\r
1869                 if(!pHalData->bRfPiEnable){\r
1870                         // Switch back BB to SI mode after finish IQ Calibration.\r
1871                         phy_PIModeSwitch(pAdapter, FALSE);\r
1872                 }\r
1873 \r
1874                 // Reload ADDA power saving parameters\r
1875                 phy_ReloadADDARegisters(pAdapter, ADDA_REG, pHalData->ADDA_backup, IQK_ADDA_REG_NUM);\r
1876 \r
1877                 // Reload MAC parameters\r
1878                 phy_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pHalData->IQK_MAC_backup);\r
1879                 \r
1880                 // Reload BB parameters\r
1881                 phy_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup, IQK_BB_REG_NUM);\r
1882                 \r
1883                 /*Restore RX initial gain*/\r
1884                 PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00032ed3);\r
1885                 if (is2T)\r
1886                         PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00032ed3);\r
1887                 //load 0xe30 IQC default value\r
1888                 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);         \r
1889                 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);                         \r
1890                 \r
1891         }\r
1892         RTPRINT(FINIT, INIT_IQK, ("phy_IQCalibrate_8192C() <==\n"));\r
1893         \r
1894 }\r
1895 \r
1896 \r
1897 VOID    \r
1898 phy_LCCalibrate92C(\r
1899         IN      PADAPTER        pAdapter,\r
1900         IN      BOOLEAN         is2T\r
1901         )\r
1902 {\r
1903         u1Byte  tmpReg;\r
1904         u4Byte  RF_Amode=0, RF_Bmode=0, LC_Cal;\r
1905 //      HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
1906 \r
1907         //Check continuous TX and Packet TX\r
1908         tmpReg = PlatformEFIORead1Byte(pAdapter, 0xd03);\r
1909 \r
1910         if((tmpReg&0x70) != 0)                  //Deal with contisuous TX case\r
1911                 PlatformEFIOWrite1Byte(pAdapter, 0xd03, tmpReg&0x8F);   //disable all continuous TX\r
1912         else                                                    // Deal with Packet TX case\r
1913                 PlatformEFIOWrite1Byte(pAdapter, REG_TXPAUSE, 0xFF);                    // block all queues\r
1914 \r
1915         if((tmpReg&0x70) != 0)\r
1916         {\r
1917                 //1. Read original RF mode\r
1918                 //Path-A\r
1919                 RF_Amode = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits);\r
1920 \r
1921                 //Path-B\r
1922                 if(is2T)\r
1923                         RF_Bmode = PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits);     \r
1924 \r
1925                 //2. Set RF mode = standby mode\r
1926                 //Path-A\r
1927                 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000);\r
1928 \r
1929                 //Path-B\r
1930                 if(is2T)\r
1931                         PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000);                      \r
1932         }\r
1933         \r
1934         //3. Read RF reg18\r
1935         LC_Cal = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits);\r
1936         \r
1937         //4. Set LC calibration begin   bit15\r
1938         PHY_SetRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal|0x08000);\r
1939 \r
1940         delay_ms(100);          \r
1941 \r
1942 \r
1943         //Restore original situation\r
1944         if((tmpReg&0x70) != 0)  //Deal with contisuous TX case \r
1945         {  \r
1946                 //Path-A\r
1947                 PlatformEFIOWrite1Byte(pAdapter, 0xd03, tmpReg);\r
1948                 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, RF_Amode);\r
1949                 \r
1950                 //Path-B\r
1951                 if(is2T)\r
1952                         PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode);\r
1953         }\r
1954         else // Deal with Packet TX case\r
1955         {\r
1956                 PlatformEFIOWrite1Byte(pAdapter, REG_TXPAUSE, 0x00);    \r
1957         }\r
1958 }\r
1959 \r
1960 \r
1961 VOID    \r
1962 phy_LCCalibrate(\r
1963         IN      PADAPTER        pAdapter,\r
1964         IN      BOOLEAN         is2T\r
1965         )\r
1966 {\r
1967         phy_LCCalibrate92C(pAdapter, is2T);\r
1968 }\r
1969 \r
1970 \r
1971 \r
1972 //Analog Pre-distortion calibration\r
1973 #define         APK_BB_REG_NUM  8\r
1974 #define         APK_CURVE_REG_NUM 4\r
1975 #define         PATH_NUM                2\r
1976 \r
1977 VOID    \r
1978 phy_APCalibrate_8192C(\r
1979         IN      PADAPTER        pAdapter,\r
1980         IN      s1Byte          delta,\r
1981         IN      BOOLEAN         is2T\r
1982         )\r
1983 {\r
1984         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
1985 \r
1986         u4Byte                  regD[PATH_NUM];\r
1987         u4Byte                  tmpReg, index, offset, i, apkbound;\r
1988         u1Byte                  path, pathbound = PATH_NUM;\r
1989         u4Byte                  BB_backup[APK_BB_REG_NUM];\r
1990         u4Byte                  BB_REG[APK_BB_REG_NUM] = {      \r
1991                                                 rFPGA1_TxBlock,         rOFDM0_TRxPathEnable, \r
1992                                                 rFPGA0_RFMOD,   rOFDM0_TRMuxPar, \r
1993                                                 rFPGA0_XCD_RFInterfaceSW,       rFPGA0_XAB_RFInterfaceSW, \r
1994                                                 rFPGA0_XA_RFInterfaceOE,        rFPGA0_XB_RFInterfaceOE };\r
1995         u4Byte                  BB_AP_MODE[APK_BB_REG_NUM] = {  \r
1996                                                 0x00000020, 0x00a05430, 0x02040000, \r
1997                                                 0x000800e4, 0x00204000 };\r
1998         u4Byte                  BB_normal_AP_MODE[APK_BB_REG_NUM] = {   \r
1999                                                 0x00000020, 0x00a05430, 0x02040000, \r
2000                                                 0x000800e4, 0x22204000 };                                               \r
2001 \r
2002         u4Byte                  AFE_backup[IQK_ADDA_REG_NUM];\r
2003         u4Byte                  AFE_REG[IQK_ADDA_REG_NUM] = {   \r
2004                                                 rFPGA0_XCD_SwitchControl,       rBlue_Tooth,    \r
2005                                                 rRx_Wait_CCA,           rTx_CCK_RFON,\r
2006                                                 rTx_CCK_BBON,   rTx_OFDM_RFON,  \r
2007                                                 rTx_OFDM_BBON,  rTx_To_Rx,\r
2008                                                 rTx_To_Tx,              rRx_CCK,        \r
2009                                                 rRx_OFDM,               rRx_Wait_RIFS,\r
2010                                                 rRx_TO_Rx,              rStandby,       \r
2011                                                 rSleep,                         rPMPD_ANAEN };\r
2012 \r
2013         u4Byte                  MAC_backup[IQK_MAC_REG_NUM];\r
2014         u4Byte                  MAC_REG[IQK_MAC_REG_NUM] = {\r
2015                                                 REG_TXPAUSE,            REG_BCN_CTRL,   \r
2016                                                 REG_BCN_CTRL_1, REG_GPIO_MUXCFG};\r
2017 \r
2018         u4Byte                  APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {\r
2019                                         {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},\r
2020                                         {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}\r
2021                                         };      \r
2022 \r
2023         u4Byte                  APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {\r
2024                                         {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},  //path settings equal to path b settings\r
2025                                         {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}\r
2026                                         };\r
2027         \r
2028         u4Byte                  APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {\r
2029                                         {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},\r
2030                                         {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}\r
2031                                         };\r
2032 \r
2033         u4Byte                  APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {\r
2034                                         {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},  //path settings equal to path b settings\r
2035                                         {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}\r
2036                                         };\r
2037 #if 0   \r
2038         u4Byte                  APK_RF_value_A[PATH_NUM][APK_BB_REG_NUM] = {\r
2039                                         {0x1adb0, 0x1adb0, 0x1ada0, 0x1ad90, 0x1ad80},          \r
2040                                         {0x00fb0, 0x00fb0, 0x00fa0, 0x00f90, 0x00f80}                                           \r
2041                                         };\r
2042 #endif\r
2043         u4Byte                  AFE_on_off[PATH_NUM] = {\r
2044                                         0x04db25a4, 0x0b1b25a4};        //path A on path B off / path A off path B on\r
2045 \r
2046         u4Byte                  APK_offset[PATH_NUM] = {\r
2047                                         rConfig_AntA, rConfig_AntB};\r
2048 \r
2049         u4Byte                  APK_normal_offset[PATH_NUM] = {\r
2050                                         rConfig_Pmpd_AntA, rConfig_Pmpd_AntB};\r
2051                                         \r
2052         u4Byte                  APK_value[PATH_NUM] = {\r
2053                                         0x92fc0000, 0x12fc0000};                                        \r
2054 \r
2055         u4Byte                  APK_normal_value[PATH_NUM] = {\r
2056                                         0x92680000, 0x12680000};                                        \r
2057 \r
2058         s1Byte                  APK_delta_mapping[APK_BB_REG_NUM][13] = {\r
2059                                         {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\r
2060                                         {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},                                                                                  \r
2061                                         {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},\r
2062                                         {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},\r
2063                                         {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}\r
2064                                         };\r
2065         \r
2066         u4Byte                  APK_normal_setting_value_1[13] = {\r
2067                                         0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,\r
2068                                         0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,\r
2069                                         0x12680000, 0x00880000, 0x00880000\r
2070                                         };\r
2071 \r
2072         u4Byte                  APK_normal_setting_value_2[16] = {\r
2073                                         0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,\r
2074                                         0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,\r
2075                                         0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,\r
2076                                         0x00050006\r
2077                                         };\r
2078         \r
2079         u4Byte                  APK_result[PATH_NUM][APK_BB_REG_NUM];   //val_1_1a, val_1_2a, val_2a, val_3a, val_4a\r
2080 //      u4Byte                  AP_curve[PATH_NUM][APK_CURVE_REG_NUM];\r
2081 \r
2082         s4Byte                  BB_offset, delta_V, delta_offset;\r
2083 \r
2084 #if MP_DRIVER == 1\r
2085         PMPT_CONTEXT    pMptCtx = &(pAdapter->MptCtx);  \r
2086 \r
2087         pMptCtx->APK_bound[0] = 45;\r
2088         pMptCtx->APK_bound[1] = 52;             \r
2089 #endif\r
2090 \r
2091         RTPRINT(FINIT, INIT_IQK, ("==>phy_APCalibrate_8192C() delta %d\n", delta));\r
2092         RTPRINT(FINIT, INIT_IQK, ("AP Calibration for %s\n", (is2T ? "2T2R" : "1T1R")));\r
2093         if(!is2T)\r
2094                 pathbound = 1;\r
2095 \r
2096         //2 FOR NORMAL CHIP SETTINGS\r
2097 \r
2098 // Temporarily do not allow normal driver to do the following settings because these offset\r
2099 // and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal\r
2100 // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the\r
2101 // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31.\r
2102 #if MP_DRIVER != 1\r
2103         return;\r
2104 #endif\r
2105         //settings adjust for normal chip\r
2106         for(index = 0; index < PATH_NUM; index ++)\r
2107         {\r
2108                 APK_offset[index] = APK_normal_offset[index];\r
2109                 APK_value[index] = APK_normal_value[index];\r
2110                 AFE_on_off[index] = 0x6fdb25a4;\r
2111         }\r
2112 \r
2113         for(index = 0; index < APK_BB_REG_NUM; index ++)\r
2114         {\r
2115                 for(path = 0; path < pathbound; path++)\r
2116                 {\r
2117                         APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index];\r
2118                         APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index];\r
2119                 }\r
2120                 BB_AP_MODE[index] = BB_normal_AP_MODE[index];\r
2121         }                       \r
2122 \r
2123         apkbound = 6;\r
2124         \r
2125         //save BB default value\r
2126         for(index = 0; index < APK_BB_REG_NUM ; index++)\r
2127         {\r
2128                 if(index == 0)          //skip \r
2129                         continue;                               \r
2130                 BB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord);\r
2131         }\r
2132         \r
2133         //save MAC default value                                                                                                        \r
2134         phy_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup);\r
2135         \r
2136         //save AFE default value\r
2137         phy_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\r
2138 \r
2139         for(path = 0; path < pathbound; path++)\r
2140         {\r
2141 \r
2142 \r
2143                 if(path == RF_PATH_A)\r
2144                 {\r
2145                         //path A APK\r
2146                         //load APK setting\r
2147                         //path-A                \r
2148                         offset = rPdp_AntA;\r
2149                         for(index = 0; index < 11; index ++)                    \r
2150                         {\r
2151                                 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\r
2152                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));   \r
2153                                 \r
2154                                 offset += 0x04;\r
2155                         }\r
2156                         \r
2157                         PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);\r
2158                         \r
2159                         offset = rConfig_AntA;\r
2160                         for(; index < 13; index ++)             \r
2161                         {\r
2162                                 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\r
2163                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));   \r
2164                                 \r
2165                                 offset += 0x04;\r
2166                         }       \r
2167                         \r
2168                         //page-B1\r
2169                         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x400000);\r
2170                 \r
2171                         //path A\r
2172                         offset = rPdp_AntA;\r
2173                         for(index = 0; index < 16; index++)\r
2174                         {\r
2175                                 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);          \r
2176                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));   \r
2177                                 \r
2178                                 offset += 0x04;\r
2179                         }                               \r
2180                         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);                                                      \r
2181                 }\r
2182                 else if(path == RF_PATH_B)\r
2183                 {\r
2184                         //path B APK\r
2185                         //load APK setting\r
2186                         //path-B                \r
2187                         offset = rPdp_AntB;\r
2188                         for(index = 0; index < 10; index ++)                    \r
2189                         {\r
2190                                 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\r
2191                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));   \r
2192                                 \r
2193                                 offset += 0x04;\r
2194                         }\r
2195                         PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000);\r
2196                         \r
2197                         PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);\r
2198                         \r
2199                         offset = rConfig_AntA;\r
2200                         index = 11;\r
2201                         for(; index < 13; index ++) //offset 0xb68, 0xb6c               \r
2202                         {\r
2203                                 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);\r
2204                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));   \r
2205                                 \r
2206                                 offset += 0x04;\r
2207                         }       \r
2208                         \r
2209                         //page-B1\r
2210                         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x400000);\r
2211                         \r
2212                         //path B\r
2213                         offset = 0xb60;\r
2214                         for(index = 0; index < 16; index++)\r
2215                         {\r
2216                                 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);          \r
2217                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));   \r
2218                                 \r
2219                                 offset += 0x04;\r
2220                         }                               \r
2221                         PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);                                                      \r
2222                 }\r
2223         \r
2224                 //save RF default value\r
2225                 regD[path] = PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask);\r
2226                 \r
2227                 //Path A AFE all on, path B AFE All off or vise versa\r
2228                 for(index = 0; index < IQK_ADDA_REG_NUM ; index++)\r
2229                         PHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]);\r
2230                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0xe70 %x\n", PHY_QueryBBReg(pAdapter, rRx_Wait_CCA, bMaskDWord)));            \r
2231 \r
2232                 //BB to AP mode\r
2233                 if(path == 0)\r
2234                 {                               \r
2235                         for(index = 0; index < APK_BB_REG_NUM ; index++)\r
2236                         {\r
2237 \r
2238                                 if(index == 0)          //skip \r
2239                                         continue;                       \r
2240                                 else if (index < 5)\r
2241                                 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]);\r
2242                                 else if (BB_REG[index] == 0x870)\r
2243                                         PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);\r
2244                                 else\r
2245                                         PHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0);                                      \r
2246                         }\r
2247 \r
2248                         PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);                 \r
2249                         PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);                                 \r
2250                 }\r
2251                 else            //path B\r
2252                 {\r
2253                         PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);                 \r
2254                         PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);                                 \r
2255                 \r
2256                 }\r
2257 \r
2258                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x800 %x\n", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord)));                           \r
2259 \r
2260                 //MAC settings\r
2261                 phy_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup);\r
2262                 \r
2263                 if(path == RF_PATH_A)   //Path B to standby mode\r
2264                 {\r
2265                         PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bRFRegOffsetMask, 0x10000);                    \r
2266                 }\r
2267                 else                    //Path A to standby mode\r
2268                 {\r
2269                         PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x10000);                    \r
2270                         PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);                 \r
2271                         PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20103);                                         \r
2272                 }\r
2273 \r
2274                 delta_offset = ((delta+14)/2);\r
2275                 if(delta_offset < 0)\r
2276                         delta_offset = 0;\r
2277                 else if (delta_offset > 12)\r
2278                         delta_offset = 12;\r
2279                         \r
2280                 //AP calibration\r
2281                 for(index = 0; index < APK_BB_REG_NUM; index++)\r
2282                 {\r
2283                         if(index != 1)  //only DO PA11+PAD01001, AP RF setting\r
2284                                 continue;\r
2285                                         \r
2286                         tmpReg = APK_RF_init_value[path][index];\r
2287 #if 1                   \r
2288                         if(!pHalData->bAPKThermalMeterIgnore)\r
2289                         {\r
2290                                 BB_offset = (tmpReg & 0xF0000) >> 16;\r
2291 \r
2292                                 if(!(tmpReg & BIT15)) //sign bit 0\r
2293                                 {\r
2294                                         BB_offset = -BB_offset;\r
2295                                 }\r
2296 \r
2297                                 delta_V = APK_delta_mapping[index][delta_offset];\r
2298                                 \r
2299                                 BB_offset += delta_V;\r
2300 \r
2301                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() APK index %d tmpReg 0x%x delta_V %d delta_offset %d\n", index, tmpReg, delta_V, delta_offset));              \r
2302                                 \r
2303                                 if(BB_offset < 0)\r
2304                                 {\r
2305                                         tmpReg = tmpReg & (~BIT15);\r
2306                                         BB_offset = -BB_offset;\r
2307                                 }\r
2308                                 else\r
2309                                 {\r
2310                                         tmpReg = tmpReg | BIT15;\r
2311                                 }\r
2312                                 tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16);\r
2313                         }\r
2314 #endif\r
2315 \r
2316 #if DEV_BUS_TYPE==RT_PCI_INTERFACE\r
2317                         if(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))\r
2318                                 PHY_SetRFReg(pAdapter, path, RF_IPA_A, bRFRegOffsetMask, 0x894ae);\r
2319                         else\r
2320 #endif  \r
2321                                 PHY_SetRFReg(pAdapter, path, RF_IPA_A, bRFRegOffsetMask, 0x8992e);\r
2322                         RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, path, RF_IPA_A, bRFRegOffsetMask)));              \r
2323                         PHY_SetRFReg(pAdapter, path, RF_AC, bRFRegOffsetMask, APK_RF_value_0[path][index]);\r
2324                         RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, path, RF_AC, bRFRegOffsetMask)));         \r
2325                         PHY_SetRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask, tmpReg);\r
2326                         RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask)));                                   \r
2327                         \r
2328                         // PA11+PAD01111, one shot      \r
2329                         i = 0;\r
2330                         do\r
2331                         {\r
2332                                 PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0x800000);\r
2333                                 {\r
2334                                         PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]);             \r
2335                                         RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));\r
2336                                         delay_ms(3);                            \r
2337                                         PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]);\r
2338                                         RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));\r
2339 \r
2340                                         delay_ms(20);\r
2341                                 }\r
2342                                 PHY_SetBBReg(pAdapter, rFPGA0_IQK, 0xffffff00, 0);\r
2343 \r
2344                                 if(path == RF_PATH_A)\r
2345                                         tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0x03E00000);\r
2346                                 else\r
2347                                         tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0xF8000000);\r
2348                                 RTPRINT(FINIT, INIT_IQK, ("phy_APCalibrate_8192C() offset 0xbd8[25:21] %x\n", tmpReg));         \r
2349                                 \r
2350 \r
2351                                 i++;\r
2352                         }\r
2353                         while(tmpReg > apkbound && i < 4);\r
2354 \r
2355                         APK_result[path][index] = tmpReg;\r
2356                 }\r
2357         }\r
2358 \r
2359         //reload MAC default value      \r
2360         phy_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup);\r
2361         \r
2362         //reload BB default value       \r
2363         for(index = 0; index < APK_BB_REG_NUM ; index++)\r
2364         {\r
2365 \r
2366                 if(index == 0)          //skip \r
2367                         continue;                                       \r
2368                 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]);\r
2369         }\r
2370 \r
2371         //reload AFE default value\r
2372         phy_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);\r
2373 \r
2374         //reload RF path default value\r
2375         for(path = 0; path < pathbound; path++)\r
2376         {\r
2377                 PHY_SetRFReg(pAdapter, path, RF_TXBIAS_A, bRFRegOffsetMask, regD[path]);\r
2378                 if(path == RF_PATH_B)\r
2379                 {\r
2380                         PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);                 \r
2381                         PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20101);                                         \r
2382                 }\r
2383 \r
2384                 //note no index == 0\r
2385                 if (APK_result[path][1] > 6)\r
2386                         APK_result[path][1] = 6;\r
2387                 RTPRINT(FINIT, INIT_IQK, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1]));                                      \r
2388         }\r
2389 \r
2390         RTPRINT(FINIT, INIT_IQK, ("\n"));\r
2391         \r
2392 \r
2393         for(path = 0; path < pathbound; path++)\r
2394         {\r
2395                 PHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G1_G4, bRFRegOffsetMask, \r
2396                 ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1]));\r
2397                 if(path == RF_PATH_A)\r
2398                         PHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask, \r
2399                         ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05));              \r
2400                 else\r
2401                 PHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask, \r
2402                         ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05));                                              \r
2403                         \r
2404                 PHY_SetRFReg(pAdapter, path, RF_BS_PA_APSET_G9_G11, bRFRegOffsetMask, ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08));                      \r
2405         }\r
2406 \r
2407         pHalData->bAPKdone = TRUE;\r
2408 \r
2409         RTPRINT(FINIT, INIT_IQK, ("<==phy_APCalibrate_8192C()\n"));\r
2410 }\r
2411 \r
2412 \r
2413 VOID\r
2414 PHY_IQCalibrate_8192C(\r
2415         IN      PADAPTER        pAdapter,\r
2416         IN      BOOLEAN         bReCovery\r
2417         )\r
2418 {\r
2419         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
2420         s4Byte                  result[4][8];   //last is final result\r
2421         u1Byte                  i, final_candidate, Indexforchannel;\r
2422         BOOLEAN                 bPathAOK, bPathBOK;\r
2423         s4Byte                  RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0;\r
2424         BOOLEAN                 is12simular, is13simular, is23simular;  \r
2425         BOOLEAN                 bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;\r
2426         u4Byte                  IQK_BB_REG_92C[IQK_BB_REG_NUM] = {\r
2427                                         rOFDM0_XARxIQImbalance,         rOFDM0_XBRxIQImbalance, \r
2428                                         rOFDM0_ECCAThreshold,   rOFDM0_AGCRSSITable,\r
2429                                         rOFDM0_XATxIQImbalance,         rOFDM0_XBTxIQImbalance, \r
2430                                         rOFDM0_XCTxAFE,                         rOFDM0_XDTxAFE, \r
2431                                         rOFDM0_RxIQExtAnta};\r
2432 \r
2433         if (ODM_CheckPowerStatus(pAdapter) == FALSE)\r
2434                 return;\r
2435         \r
2436 #if MP_DRIVER == 1      \r
2437         bStartContTx = pAdapter->MptCtx.bStartContTx;\r
2438         bSingleTone = pAdapter->MptCtx.bSingleTone;\r
2439         bCarrierSuppression = pAdapter->MptCtx.bCarrierSuppression;     \r
2440 #endif\r
2441         \r
2442         //ignore IQK when continuous Tx\r
2443         if(bStartContTx || bSingleTone || bCarrierSuppression)\r
2444                 return;\r
2445 \r
2446 #ifdef DISABLE_BB_RF\r
2447         return;\r
2448 #endif\r
2449         if(pAdapter->bSlaveOfDMSP)\r
2450                 return;\r
2451 \r
2452         if (bReCovery)\r
2453                 {\r
2454                         phy_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup_recover, 9);\r
2455                         return;         \r
2456 \r
2457                 }\r
2458 \r
2459         RTPRINT(FINIT, INIT_IQK, ("IQK:Start!!!\n"));\r
2460 \r
2461         for(i = 0; i < 8; i++)\r
2462         {\r
2463                 result[0][i] = 0;\r
2464                 result[1][i] = 0;\r
2465                 result[2][i] = 0;\r
2466                 result[3][i] = 0;\r
2467         }\r
2468         final_candidate = 0xff;\r
2469         bPathAOK = FALSE;\r
2470         bPathBOK = FALSE;\r
2471         is12simular = FALSE;\r
2472         is23simular = FALSE;\r
2473         is13simular = FALSE;\r
2474 \r
2475         AcquireCCKAndRWPageAControl(pAdapter);\r
2476         /*RT_TRACE(COMP_INIT,DBG_LOUD,("Acquire Mutex in IQCalibrate\n"));*/\r
2477         for (i=0; i<3; i++)\r
2478         {\r
2479                 /*For 88C 1T1R*/\r
2480                 phy_IQCalibrate_8192C(pAdapter, result, i, FALSE);\r
2481                 \r
2482                 if(i == 1)\r
2483                 {\r
2484                         is12simular = phy_SimularityCompare(pAdapter, result, 0, 1);\r
2485                         if(is12simular)\r
2486                         {\r
2487                                 final_candidate = 0;\r
2488                                 break;\r
2489                         }\r
2490                 }\r
2491                 \r
2492                 if(i == 2)\r
2493                 {\r
2494                         is13simular = phy_SimularityCompare(pAdapter, result, 0, 2);\r
2495                         if(is13simular)\r
2496                         {\r
2497                                 final_candidate = 0;                    \r
2498                                 break;\r
2499                         }\r
2500                         \r
2501                         is23simular = phy_SimularityCompare(pAdapter, result, 1, 2);\r
2502                         if(is23simular)\r
2503                                 final_candidate = 1;\r
2504                         else\r
2505                         {\r
2506                                 for(i = 0; i < 8; i++)\r
2507                                         RegTmp += result[3][i];\r
2508 \r
2509                                 if(RegTmp != 0)\r
2510                                         final_candidate = 3;                    \r
2511                                 else\r
2512                                         final_candidate = 0xFF;\r
2513                         }\r
2514                 }\r
2515         }\r
2516 //      RT_TRACE(COMP_INIT,DBG_LOUD,("Release Mutex in IQCalibrate \n"));\r
2517         ReleaseCCKAndRWPageAControl(pAdapter);\r
2518 \r
2519         for (i=0; i<4; i++)\r
2520         {\r
2521                 RegE94 = result[i][0];\r
2522                 RegE9C = result[i][1];\r
2523                 RegEA4 = result[i][2];\r
2524                 RegEAC = result[i][3];\r
2525                 RegEB4 = result[i][4];\r
2526                 RegEBC = result[i][5];\r
2527                 RegEC4 = result[i][6];\r
2528                 RegECC = result[i][7];\r
2529                 RTPRINT(FINIT, INIT_IQK, ("IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));\r
2530         }\r
2531         \r
2532         if(final_candidate != 0xff)\r
2533         {\r
2534                 pHalData->RegE94 = RegE94 = result[final_candidate][0];\r
2535                 pHalData->RegE9C = RegE9C = result[final_candidate][1];\r
2536                 RegEA4 = result[final_candidate][2];\r
2537                 RegEAC = result[final_candidate][3];\r
2538                 pHalData->RegEB4 = RegEB4 = result[final_candidate][4];\r
2539                 pHalData->RegEBC = RegEBC = result[final_candidate][5];\r
2540                 RegEC4 = result[final_candidate][6];\r
2541                 RegECC = result[final_candidate][7];\r
2542                 RTPRINT(FINIT, INIT_IQK, ("IQK: final_candidate is %x\n",final_candidate));\r
2543                 RTPRINT(FINIT, INIT_IQK, ("IQK: RegE94=%x RegE9C=%x RegEA4=%x RegEAC=%x RegEB4=%x RegEBC=%x RegEC4=%x RegECC=%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));\r
2544                 bPathAOK = bPathBOK = TRUE;\r
2545         }\r
2546         else\r
2547         {\r
2548                 RegE94 = RegEB4 = pHalData->RegE94 = pHalData->RegEB4 = 0x100;  //X default value\r
2549                 RegE9C = RegEBC = pHalData->RegE9C = pHalData->RegEBC = 0x0;            //Y default value\r
2550         }\r
2551         \r
2552         if((RegE94 != 0)/*&&(RegEA4 != 0)*/)\r
2553         {\r
2554                 if(pHalData->CurrentBandType == BAND_ON_5G)\r
2555                         phy_PathAFillIQKMatrix_5G_Normal(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0));                   \r
2556                 else            \r
2557                         phy_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0));\r
2558 \r
2559         }\r
2560         \r
2561         if (IS_92C_SERIAL(pHalData->VersionID) || IS_92D_SINGLEPHY(pHalData->VersionID))\r
2562         {\r
2563                 if((RegEB4 != 0)/*&&(RegEC4 != 0)*/)\r
2564                 {\r
2565                         if(pHalData->CurrentBandType == BAND_ON_5G)             \r
2566                                 phy_PathBFillIQKMatrix_5G_Normal(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0));\r
2567                         else\r
2568                                 phy_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0));\r
2569                 }\r
2570         }\r
2571         \r
2572         phy_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pHalData->IQK_BB_backup_recover, 9);\r
2573 \r
2574 }\r
2575 \r
2576 \r
2577 VOID\r
2578 PHY_LCCalibrate_8192C(\r
2579         IN      PADAPTER        pAdapter\r
2580         )\r
2581 {\r
2582         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
2583         BOOLEAN                 bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;\r
2584         PMGNT_INFO              pMgntInfo=&pAdapter->MgntInfo;\r
2585         PMGNT_INFO              pMgntInfoBuddyAdapter;\r
2586         u4Byte                  timeout = 2000, timecount = 0;\r
2587         PADAPTER        BuddyAdapter = pAdapter->BuddyAdapter;\r
2588 \r
2589 #if MP_DRIVER == 1      \r
2590         bStartContTx = pAdapter->MptCtx.bStartContTx;\r
2591         bSingleTone = pAdapter->MptCtx.bSingleTone;\r
2592         bCarrierSuppression = pAdapter->MptCtx.bCarrierSuppression;             \r
2593 #endif\r
2594 \r
2595 #ifdef DISABLE_BB_RF\r
2596         return;\r
2597 #endif\r
2598 \r
2599         //ignore LCK when continuous Tx\r
2600         if(bStartContTx || bSingleTone || bCarrierSuppression)\r
2601                 return;\r
2602 \r
2603         if(BuddyAdapter != NULL &&\r
2604                 ((pAdapter->interfaceIndex == 0 && pHalData->CurrentBandType == BAND_ON_2_4G) ||\r
2605                 (pAdapter->interfaceIndex == 1 && pHalData->CurrentBandType == BAND_ON_5G)))\r
2606         {\r
2607                 pMgntInfoBuddyAdapter=&BuddyAdapter->MgntInfo;\r
2608                 while(pMgntInfoBuddyAdapter->bScanInProgress && timecount < timeout)\r
2609                 {\r
2610                         delay_ms(50);\r
2611                         timecount += 50;\r
2612                 }\r
2613         }\r
2614 \r
2615         while(pMgntInfo->bScanInProgress && timecount < timeout)\r
2616         {\r
2617                 delay_ms(50);\r
2618                 timecount += 50;\r
2619         }       \r
2620         \r
2621         pHalData->bLCKInProgress = TRUE;\r
2622 \r
2623         RTPRINT(FINIT, INIT_IQK, ("LCK:Start!!!interface %d currentband %x delay %d ms\n", pAdapter->interfaceIndex, pHalData->CurrentBandType, timecount));\r
2624         \r
2625         //if(IS_92C_SERIAL(pHalData->VersionID) || IS_92D_SINGLEPHY(pHalData->VersionID))\r
2626         if(IS_2T2R(pHalData->VersionID))\r
2627         {\r
2628                 phy_LCCalibrate(pAdapter, TRUE);\r
2629         }\r
2630         else{\r
2631                 // For 88C 1T1R\r
2632                 phy_LCCalibrate(pAdapter, FALSE);\r
2633         }\r
2634 \r
2635         pHalData->bLCKInProgress = FALSE;\r
2636 \r
2637         RTPRINT(FINIT, INIT_IQK, ("LCK:Finish!!!interface %d\n", pAdapter->interfaceIndex));\r
2638         \r
2639 \r
2640 }\r
2641 \r
2642 VOID\r
2643 PHY_APCalibrate_8192C(\r
2644         IN      PADAPTER        pAdapter,\r
2645         IN      s1Byte          delta   \r
2646         )\r
2647 {\r
2648         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
2649 \r
2650         //default disable APK, because Tx NG issue, suggest by Jenyu, 2011.11.25\r
2651         return;\r
2652 \r
2653 #ifdef DISABLE_BB_RF\r
2654         return;\r
2655 #endif\r
2656 \r
2657 #if FOR_BRAZIL_PRETEST != 1\r
2658         if(pHalData->bAPKdone)\r
2659 #endif          \r
2660                 return;\r
2661 \r
2662         if(IS_92C_SERIAL( pHalData->VersionID)){\r
2663                 phy_APCalibrate_8192C(pAdapter, delta, TRUE);\r
2664         }\r
2665         else{\r
2666                 // For 88C 1T1R\r
2667                 phy_APCalibrate_8192C(pAdapter, delta, FALSE);\r
2668         }\r
2669 }\r
2670 \r
2671 \r
2672 #endif\r
2673 \r
2674 \r
2675 //3============================================================\r
2676 //3 IQ Calibration\r
2677 //3============================================================\r
2678 \r
2679 VOID\r
2680 ODM_ResetIQKResult(\r
2681         IN      PVOID           pDM_VOID \r
2682 )\r
2683 {\r
2684         return;\r
2685 }\r
2686 #if 1//!(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
2687 u1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)\r
2688 {\r
2689         u1Byte  channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = \r
2690         {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
2691         u1Byte  place = chnl;\r
2692 \r
2693         \r
2694         if(chnl > 14)\r
2695         {\r
2696                 for(place = 14; place<sizeof(channel_all); place++)\r
2697                 {\r
2698                         if(channel_all[place] == chnl)\r
2699                         {\r
2700                                 return place-13;\r
2701                         }\r
2702                 }\r
2703         }       \r
2704         return 0;\r
2705 \r
2706 }\r
2707 #endif\r
2708 \r
2709 VOID\r
2710 odm_IQCalibrate(\r
2711                 IN      PDM_ODM_T       pDM_Odm \r
2712                 )\r
2713 {\r
2714         PADAPTER        Adapter = pDM_Odm->Adapter;\r
2715 \r
2716 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)    \r
2717         if (*pDM_Odm->pIsFcsModeEnable)\r
2718                 return;\r
2719 #endif\r
2720 \r
2721         \r
2722 \r
2723         if (pDM_Odm->bLinked) {\r
2724                 if ((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess)) {\r
2725                         pDM_Odm->preChannel = *pDM_Odm->pChannel;\r
2726                         pDM_Odm->LinkedInterval = 0;\r
2727                 }\r
2728 \r
2729                 if (pDM_Odm->LinkedInterval < 3)\r
2730                         pDM_Odm->LinkedInterval++;\r
2731                 \r
2732                 if (pDM_Odm->LinkedInterval == 2) {\r
2733                         \r
2734                         #if (RTL8814A_SUPPORT == 1)     \r
2735                         if (pDM_Odm->SupportICType == ODM_RTL8814A) \r
2736                                 PHY_IQCalibrate_8814A(pDM_Odm, FALSE);\r
2737                         #endif\r
2738                         \r
2739                         #if (RTL8822B_SUPPORT == 1)     \r
2740                         if (pDM_Odm->SupportICType == ODM_RTL8822B) \r
2741                                 PHY_IQCalibrate_8822B(pDM_Odm, FALSE);\r
2742                         #endif\r
2743 \r
2744                         #if (RTL8821C_SUPPORT == 1) \r
2745                         if (pDM_Odm->SupportICType == ODM_RTL8821C) \r
2746                                 PHY_IQCalibrate_8821C(pDM_Odm, FALSE);\r
2747                         #endif\r
2748 \r
2749                         #if (RTL8821A_SUPPORT == 1)                             \r
2750                         if (pDM_Odm->SupportICType == ODM_RTL8821) \r
2751                                 PHY_IQCalibrate_8821A(pDM_Odm, FALSE);\r
2752                         #endif\r
2753                         \r
2754                         #if (RTL8812A_SUPPORT == 1)     \r
2755                         if (pDM_Odm->SupportICType == ODM_RTL8812) \r
2756                                 phy_IQCalibrate_8812A(pDM_Odm, FALSE);\r
2757                         #endif\r
2758                 }\r
2759         } else\r
2760                 pDM_Odm->LinkedInterval = 0;\r
2761 \r
2762 }\r
2763 \r
2764 void phydm_rf_init(IN   PVOID           pDM_VOID)\r
2765 {\r
2766         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2767         odm_TXPowerTrackingInit(pDM_Odm);\r
2768 \r
2769 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
2770         ODM_ClearTxPowerTrackingState(pDM_Odm); \r
2771 #endif\r
2772 \r
2773 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
2774 #if (RTL8814A_SUPPORT == 1)             \r
2775         if (pDM_Odm->SupportICType & ODM_RTL8814A)\r
2776                 PHY_IQCalibrate_8814A_Init(pDM_Odm);\r
2777 #endif  \r
2778 #endif\r
2779 \r
2780 }\r
2781 \r
2782 void phydm_rf_watchdog(IN       PVOID           pDM_VOID)\r
2783 {\r
2784         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2785 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
2786         ODM_TXPowerTrackingCheck(pDM_Odm);\r
2787         if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
2788                 odm_IQCalibrate(pDM_Odm);\r
2789 #endif\r
2790 }\r