net: wireless: rockchip_wlan: add rtl8723bs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / hal / phydm / phydm_dig.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 //============================================================\r
22 // include files\r
23 //============================================================\r
24 #include "mp_precomp.h"\r
25 #include "phydm_precomp.h"\r
26 \r
27 \r
28 VOID\r
29 ODM_ChangeDynamicInitGainThresh(\r
30         IN      PVOID           pDM_VOID,\r
31         IN      u4Byte          DM_Type,\r
32         IN      u4Byte          DM_Value\r
33         )\r
34 {\r
35         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
36         pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
37 \r
38         if (DM_Type == DIG_TYPE_THRESH_HIGH)\r
39         {\r
40                 pDM_DigTable->RssiHighThresh = DM_Value;                \r
41         }\r
42         else if (DM_Type == DIG_TYPE_THRESH_LOW)\r
43         {\r
44                 pDM_DigTable->RssiLowThresh = DM_Value;\r
45         }\r
46         else if (DM_Type == DIG_TYPE_ENABLE)\r
47         {\r
48                 pDM_DigTable->Dig_Enable_Flag   = TRUE;\r
49         }       \r
50         else if (DM_Type == DIG_TYPE_DISABLE)\r
51         {\r
52                 pDM_DigTable->Dig_Enable_Flag = FALSE;\r
53         }       \r
54         else if (DM_Type == DIG_TYPE_BACKOFF)\r
55         {\r
56                 if(DM_Value > 30)\r
57                         DM_Value = 30;\r
58                 pDM_DigTable->BackoffVal = (u1Byte)DM_Value;\r
59         }\r
60         else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)\r
61         {\r
62                 if(DM_Value == 0)\r
63                         DM_Value = 0x1;\r
64                 pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;\r
65         }\r
66         else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)\r
67         {\r
68                 if(DM_Value > 0x50)\r
69                         DM_Value = 0x50;\r
70                 pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;\r
71         }\r
72 }       // DM_ChangeDynamicInitGainThresh //\r
73 \r
74 int \r
75 getIGIForDiff(int value_IGI)\r
76 {\r
77         #define ONERCCA_LOW_TH          0x30\r
78         #define ONERCCA_LOW_DIFF                8\r
79 \r
80         if (value_IGI < ONERCCA_LOW_TH) {\r
81                 if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)\r
82                         return ONERCCA_LOW_TH;\r
83                 else\r
84                         return value_IGI + ONERCCA_LOW_DIFF;\r
85         } else {\r
86                 return value_IGI;\r
87         }\r
88 }\r
89 \r
90 VOID\r
91 odm_FAThresholdCheck(\r
92         IN              PVOID                   pDM_VOID,\r
93         IN              BOOLEAN                 bDFSBand,\r
94         IN              BOOLEAN                 bPerformance,\r
95         IN              u4Byte                  RxTp,\r
96         IN              u4Byte                  TxTp,\r
97         OUT             u4Byte*                 dm_FA_thres\r
98         )\r
99 {\r
100         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
101         \r
102         if(pDM_Odm->bLinked && (bPerformance||bDFSBand))\r
103         {\r
104                 if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
105                 {\r
106                         // 8192D special case\r
107                         dm_FA_thres[0] = DM_DIG_FA_TH0_92D;\r
108                         dm_FA_thres[1] = DM_DIG_FA_TH1_92D;\r
109                         dm_FA_thres[2] = DM_DIG_FA_TH2_92D;\r
110                 }\r
111 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
112                 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))\r
113                 {\r
114                         // For AP\r
115                         if((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500)                      // 10Mbps & 0.5Mbps\r
116                         {\r
117                                 dm_FA_thres[0] = 0x080;\r
118                                 dm_FA_thres[1] = 0x100;\r
119                                 dm_FA_thres[2] = 0x200;                 \r
120                         }\r
121                         else\r
122                         {\r
123                                 dm_FA_thres[0] = 0x100;\r
124                                 dm_FA_thres[1] = 0x200;\r
125                                 dm_FA_thres[2] = 0x300; \r
126                         }\r
127                 }\r
128 #else\r
129                 else if(pDM_Odm->SupportICType == ODM_RTL8723A && pDM_Odm->bBtLimitedDig)\r
130                 {\r
131                         // 8723A BT special case\r
132                         dm_FA_thres[0] = DM_DIG_FA_TH0;\r
133                         dm_FA_thres[1] = 0x250;\r
134                         dm_FA_thres[2] = 0x300;\r
135                 }\r
136 #endif\r
137                 else\r
138                 {\r
139                         // For NIC\r
140                         dm_FA_thres[0] = DM_DIG_FA_TH0;\r
141                         dm_FA_thres[1] = DM_DIG_FA_TH1;\r
142                         dm_FA_thres[2] = DM_DIG_FA_TH2;\r
143                 }\r
144         }\r
145         else\r
146         {\r
147 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
148                 if(bDFSBand)\r
149                 {\r
150                         // For DFS band and no link\r
151                         dm_FA_thres[0] = 250;\r
152                         dm_FA_thres[1] = 1000;\r
153                         dm_FA_thres[2] = 2000;\r
154                 }\r
155                 else\r
156 #endif\r
157                 {\r
158                         dm_FA_thres[0] = 2000;\r
159                         dm_FA_thres[1] = 4000;\r
160                         dm_FA_thres[2] = 5000;\r
161                 }\r
162         }\r
163         return;\r
164 }\r
165 \r
166 u1Byte\r
167 odm_ForbiddenIGICheck(\r
168         IN              PVOID                   pDM_VOID,\r
169         IN              u1Byte                  DIG_Dynamic_MIN,\r
170         IN              u1Byte                  CurrentIGI\r
171         )\r
172 {\r
173         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
174         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
175         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
176         u1Byte                                          rx_gain_range_min = pDM_DigTable->rx_gain_range_min;\r
177 \r
178         if(pFalseAlmCnt->Cnt_all > 10000)\r
179         {\r
180                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case. \n"));\r
181 \r
182                 if(pDM_DigTable->LargeFAHit != 3)\r
183                         pDM_DigTable->LargeFAHit++;\r
184                 \r
185                 if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)\r
186                 {\r
187                         pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;\r
188                         pDM_DigTable->LargeFAHit = 1;\r
189                 }\r
190 \r
191                 if(pDM_DigTable->LargeFAHit >= 3)\r
192                 {\r
193                         if((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)\r
194                                 rx_gain_range_min = pDM_DigTable->rx_gain_range_max;\r
195                         else\r
196                                 rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);\r
197                         pDM_DigTable->Recover_cnt = 1800;\r
198                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));\r
199                 }\r
200         }\r
201         else\r
202         {\r
203                 if(pDM_DigTable->Recover_cnt != 0)\r
204                 {\r
205                         pDM_DigTable->Recover_cnt --;\r
206                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));\r
207                 }\r
208                 else\r
209                 {\r
210                         if(pDM_DigTable->LargeFAHit < 3)\r
211                         {\r
212                                 if((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)\r
213                                 {\r
214                                         pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;\r
215                                         rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;\r
216                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));\r
217                                 }\r
218                                 else\r
219                                 {\r
220                                         pDM_DigTable->ForbiddenIGI -= 2;\r
221                                         rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);\r
222                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));\r
223                                 }\r
224                         }\r
225                         else\r
226                         {\r
227                                 pDM_DigTable->LargeFAHit = 0;\r
228                         }\r
229                 }\r
230         }\r
231         \r
232         return rx_gain_range_min;\r
233 \r
234 }\r
235 \r
236 VOID\r
237 odm_InbandNoiseCalculate (      \r
238         IN              PVOID           pDM_VOID\r
239         )\r
240 {\r
241 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
242         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
243         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
244         u1Byte                          IGIBackup, TimeCnt = 0, ValidCnt = 0;\r
245         BOOLEAN                         bTimeout = TRUE;\r
246         s1Byte                          sNoise_A, sNoise_B;\r
247         s4Byte                          NoiseRpt_A = 0,NoiseRpt_B = 0;\r
248         u4Byte                          tmp = 0;\r
249         static  u1Byte          failCnt = 0;\r
250 \r
251         if(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))\r
252                 return;\r
253 \r
254         if(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)\r
255                 return;\r
256 \r
257         if(!pDM_DigTable->bNoiseEst)\r
258                 return;\r
259 \r
260         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_InbandNoiseEstimate()========>\n"));\r
261         \r
262         //1 Set initial gain.\r
263         IGIBackup = pDM_DigTable->CurIGValue;\r
264         pDM_DigTable->IGIOffset_A = 0;\r
265         pDM_DigTable->IGIOffset_B = 0;\r
266         ODM_Write_DIG(pDM_Odm, 0x24);\r
267 \r
268         //1 Update idle time power report       \r
269         if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
270                 ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x0);\r
271 \r
272         delay_ms(2);\r
273 \r
274         //1 Get noise power level\r
275         while(1)\r
276         {\r
277                 //2 Read Noise Floor Report\r
278                 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
279                         tmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);\r
280 \r
281                 sNoise_A = (s1Byte)(tmp & 0xff);\r
282                 sNoise_B = (s1Byte)((tmp & 0xff00)>>8);\r
283 \r
284                 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));\r
285 \r
286                 if((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))\r
287                 {\r
288                         ValidCnt++;\r
289                         NoiseRpt_A += sNoise_A;\r
290                         NoiseRpt_B += sNoise_B;\r
291                         //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));\r
292                 }\r
293 \r
294                 TimeCnt++;\r
295                 bTimeout = (TimeCnt >= 150)?TRUE:FALSE;\r
296                 \r
297                 if(ValidCnt == 20 || bTimeout)\r
298                         break;\r
299 \r
300                 delay_ms(2);\r
301                 \r
302         }\r
303 \r
304         //1 Keep idle time power report \r
305         if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
306                 ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x1);\r
307 \r
308         //1 Recover IGI\r
309         ODM_Write_DIG(pDM_Odm, IGIBackup);\r
310         \r
311         //1 Calculate Noise Floor\r
312         if(ValidCnt != 0)\r
313         {\r
314                 NoiseRpt_A  /= (ValidCnt<<1);\r
315                 NoiseRpt_B  /= (ValidCnt<<1);\r
316         }\r
317         \r
318         if(bTimeout)\r
319         {\r
320                 NoiseRpt_A = 0;\r
321                 NoiseRpt_B = 0;\r
322 \r
323                 failCnt ++;\r
324                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Noise estimate fail time = %d\n", failCnt));\r
325                 \r
326                 if(failCnt == 3)\r
327                 {\r
328                         failCnt = 0;\r
329                         pDM_DigTable->bNoiseEst = FALSE;\r
330                 }\r
331         }\r
332         else\r
333         {\r
334                 NoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;\r
335                 NoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;\r
336                 pDM_DigTable->bNoiseEst = FALSE;\r
337                 failCnt = 0;\r
338                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NoiseRpt_A = %d, NoiseRpt_B = %d\n", NoiseRpt_A, NoiseRpt_B));\r
339         }\r
340 \r
341         //1 Calculate IGI Offset\r
342         if(NoiseRpt_A > NoiseRpt_B)\r
343         {\r
344                 pDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;\r
345                 pDM_DigTable->IGIOffset_B = 0;\r
346         }\r
347         else\r
348         {\r
349                 pDM_DigTable->IGIOffset_A = 0;\r
350                 pDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;\r
351         }\r
352 \r
353 #endif\r
354         return;\r
355 }\r
356 \r
357 VOID\r
358 odm_DigForBtHsMode(\r
359         IN              PVOID           pDM_VOID\r
360         )\r
361 {\r
362 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
363         PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
364         pDIG_T                                  pDM_DigTable=&pDM_Odm->DM_DigTable;\r
365         u1Byte                                  digForBtHs=0;\r
366         u1Byte                                  digUpBound=0x5a;\r
367         \r
368         if(pDM_Odm->bBtConnectProcess)\r
369         {\r
370                 if(pDM_Odm->SupportICType&(ODM_RTL8723A))\r
371                         digForBtHs = 0x28;\r
372                 else\r
373                         digForBtHs = 0x22;\r
374         }\r
375         else\r
376         {\r
377                 //\r
378                 // Decide DIG value by BT HS RSSI.\r
379                 //\r
380                 digForBtHs = pDM_Odm->btHsRssi+4;\r
381                 \r
382                 //DIG Bound\r
383                 if(pDM_Odm->SupportICType&(ODM_RTL8723A))\r
384                         digUpBound = 0x3e;\r
385                 \r
386                 if(digForBtHs > digUpBound)\r
387                         digForBtHs = digUpBound;\r
388                 if(digForBtHs < 0x1c)\r
389                         digForBtHs = 0x1c;\r
390 \r
391                 // update Current IGI\r
392                 pDM_DigTable->BT30_CurIGI = digForBtHs;\r
393         }\r
394         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));\r
395 #endif\r
396 }\r
397 \r
398 VOID\r
399 ODM_Write_DIG(\r
400         IN      PVOID                   pDM_VOID,\r
401         IN      u1Byte                  CurrentIGI\r
402         )\r
403 {\r
404         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
405         pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
406 \r
407         if (pDM_DigTable->bStopDIG) {\r
408                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG(): Stop Writing IGI\n"));\r
409                 return;\r
410         }\r
411 \r
412         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_Write_DIG(): ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x\n",\r
413                 ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));\r
414 \r
415         //1 Check initial gain by upper bound           \r
416         if ((!pDM_DigTable->bPSDInProgress) && pDM_Odm->bLinked)\r
417         {\r
418                 if (CurrentIGI > pDM_DigTable->rx_gain_range_max) {\r
419                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_Write_DIG(): CurrentIGI(0x%02x) is larger than upper bound !!\n", CurrentIGI));\r
420                         CurrentIGI = pDM_DigTable->rx_gain_range_max;\r
421                 }\r
422                 if (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)\r
423                 {\r
424                         if(CurrentIGI > pDM_Odm->Adaptivity_IGI_upper)\r
425                                 CurrentIGI = pDM_Odm->Adaptivity_IGI_upper;\r
426         \r
427                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", CurrentIGI));\r
428                 }\r
429         }\r
430 \r
431         if(pDM_DigTable->CurIGValue != CurrentIGI)\r
432         {\r
433 \r
434                 /*Add by YuChen for USB IO too slow issue*/\r
435                 if ((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && (CurrentIGI > pDM_DigTable->CurIGValue))\r
436                         Phydm_Adaptivity(pDM_Odm, CurrentIGI);\r
437 \r
438                 //1 Set IGI value\r
439                 if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))\r
440                 { \r
441                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
442 \r
443                         if(pDM_Odm->RFType > ODM_1T1R)\r
444                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
445 \r
446                         if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))\r
447                         {\r
448                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
449                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
450                         }\r
451                 }\r
452                 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))\r
453                 {\r
454                         switch(*(pDM_Odm->pOnePathCCA))\r
455                         {\r
456                                 case ODM_CCA_2R:\r
457                                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
458 \r
459                                         if(pDM_Odm->RFType > ODM_1T1R)\r
460                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
461                                         \r
462                                         if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))\r
463                                         {\r
464                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
465                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
466                                         }\r
467                                         break;\r
468                                 case ODM_CCA_1R_A:\r
469                                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
470                                         if(pDM_Odm->RFType != ODM_1T1R)\r
471                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));\r
472                                         break;\r
473                                 case ODM_CCA_1R_B:\r
474                                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));\r
475                                         if(pDM_Odm->RFType != ODM_1T1R)\r
476                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);\r
477                                         break;\r
478                         }\r
479                 }\r
480                 pDM_DigTable->CurIGValue = CurrentIGI;\r
481         }\r
482 \r
483         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_Write_DIG(): CurrentIGI(0x%02x).\n", CurrentIGI));\r
484         \r
485 }\r
486 \r
487 VOID\r
488 odm_PauseDIG(\r
489         IN              PVOID                                   pDM_VOID,\r
490         IN              PHYDM_PAUSE_TYPE                PauseType,\r
491         IN              PHYDM_PAUSE_LEVEL               pause_level,\r
492         IN              u1Byte                                  IGIValue\r
493 )\r
494 {\r
495         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
496         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
497 \r
498         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========> level = %d\n", pause_level));\r
499 \r
500         if ((pDM_DigTable->pause_dig_level == 0) && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) {\r
501                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, \r
502                         ("odm_PauseDIG(): Return: SupportAbility DIG or FA is disabled !!\n"));\r
503                 return;\r
504         }\r
505 \r
506         if (pause_level > DM_DIG_MAX_PAUSE_TYPE) {\r
507                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, \r
508                         ("odm_PauseDIG(): Return: Wrong pause level !!\n"));\r
509                 return;\r
510         }\r
511 \r
512         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_dig_level, IGIValue));\r
513         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", \r
514                 pDM_DigTable->pause_dig_value[7], pDM_DigTable->pause_dig_value[6], pDM_DigTable->pause_dig_value[5], pDM_DigTable->pause_dig_value[4],\r
515                 pDM_DigTable->pause_dig_value[3], pDM_DigTable->pause_dig_value[2], pDM_DigTable->pause_dig_value[1], pDM_DigTable->pause_dig_value[0]));\r
516         \r
517         switch (PauseType) {\r
518         /* Pause DIG */\r
519         case PHYDM_PAUSE:\r
520         {\r
521                 /* Disable DIG */\r
522                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));\r
523                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));\r
524                 \r
525                 /* Backup IGI value */\r
526                 if (pDM_DigTable->pause_dig_level == 0) {\r
527                         pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;\r
528                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI  = 0x%x, new IGI = 0x%x\n", pDM_DigTable->IGIBackup, IGIValue));\r
529                 }\r
530 \r
531                 /* Record IGI value */\r
532                 pDM_DigTable->pause_dig_value[pause_level] = IGIValue;\r
533 \r
534                 /* Update pause level */\r
535                 pDM_DigTable->pause_dig_level = (pDM_DigTable->pause_dig_level | BIT(pause_level));\r
536 \r
537                 /* Write new IGI value */\r
538                 if (BIT(pause_level + 1) > pDM_DigTable->pause_dig_level) {\r
539                         ODM_Write_DIG(pDM_Odm, IGIValue);\r
540                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): IGI of higher level = 0x%x\n",  IGIValue));\r
541                 }\r
542                 break;\r
543         }\r
544         /* Resume DIG */\r
545         case PHYDM_RESUME:\r
546         {\r
547                 /* check if the level is illegal or not */\r
548                 if ((pDM_DigTable->pause_dig_level & (BIT(pause_level))) != 0) {\r
549                         pDM_DigTable->pause_dig_level = pDM_DigTable->pause_dig_level & (~(BIT(pause_level)));\r
550                         pDM_DigTable->pause_dig_value[pause_level] = 0;\r
551                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));\r
552                 } else {\r
553                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong resume level !!\n"));\r
554                         break;\r
555                 }\r
556 \r
557                 /* Resume DIG */\r
558                 if (pDM_DigTable->pause_dig_level == 0) {\r
559                         /* Write backup IGI value */\r
560                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);\r
561                         pDM_DigTable->bIgnoreDIG = TRUE;\r
562                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));\r
563 \r
564                         /* Enable DIG */\r
565                         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);  \r
566                         break;\r
567                 }\r
568 \r
569                 if (BIT(pause_level) > pDM_DigTable->pause_dig_level) {\r
570                         u1Byte          max_level;\r
571                 \r
572                         /* Calculate the maximum level now */\r
573                         for (max_level = (pause_level - 1); max_level >= 0; max_level--) {\r
574                                 if ((pDM_DigTable->pause_dig_level & BIT(max_level)) > 0)\r
575                                         break;\r
576                         }\r
577                 \r
578                         /* write IGI of lower level */\r
579                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->pause_dig_value[max_level]);\r
580                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write IGI (0x%x) of level (%d)\n",  \r
581                                  pDM_DigTable->pause_dig_value[max_level], max_level));\r
582                         break;\r
583                 }\r
584                 break;\r
585         }\r
586         default:\r
587                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong  type !!\n"));\r
588                 break;\r
589         }\r
590 \r
591         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_dig_level, IGIValue));\r
592         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", \r
593                 pDM_DigTable->pause_dig_value[7], pDM_DigTable->pause_dig_value[6], pDM_DigTable->pause_dig_value[5], pDM_DigTable->pause_dig_value[4],\r
594                 pDM_DigTable->pause_dig_value[3], pDM_DigTable->pause_dig_value[2], pDM_DigTable->pause_dig_value[1], pDM_DigTable->pause_dig_value[0]));\r
595 \r
596 }\r
597 \r
598 BOOLEAN \r
599 odm_DigAbort(\r
600         IN              PVOID                   pDM_VOID\r
601         )\r
602 {\r
603         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
604         pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
605 \r
606 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
607         prtl8192cd_priv priv = pDM_Odm->priv;\r
608 #elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
609         PADAPTER                pAdapter        = pDM_Odm->Adapter;\r
610         pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;\r
611 #endif\r
612 \r
613         //SupportAbility\r
614         if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))\r
615         {\r
616                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));\r
617                 return  TRUE;\r
618         }\r
619 \r
620         //SupportAbility\r
621         if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))\r
622         {       \r
623                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));\r
624                 return  TRUE;\r
625         }\r
626 \r
627         //ScanInProcess\r
628         if(*(pDM_Odm->pbScanInProcess))\r
629         {\r
630                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));\r
631                 return  TRUE;\r
632         }\r
633 \r
634         if(pDM_DigTable->bIgnoreDIG)\r
635         {\r
636                 pDM_DigTable->bIgnoreDIG = FALSE;\r
637                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Ignore DIG \n"));\r
638                 return  TRUE;\r
639         }\r
640 \r
641         //add by Neil Chen to avoid PSD is processing\r
642         if(pDM_Odm->bDMInitialGainEnable == FALSE)\r
643         {\r
644                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));\r
645                 return  TRUE;\r
646         }\r
647 \r
648 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
649         #if OS_WIN_FROM_WIN7(OS_VERSION)\r
650         if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)\r
651         {\r
652                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));\r
653                 return  TRUE;\r
654         }\r
655         #endif\r
656 \r
657         if(pDM_Odm->bBtHsOperation)\r
658         {\r
659                 odm_DigForBtHsMode(pDM_Odm);\r
660         }       \r
661 \r
662         if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))\r
663         {\r
664                 if(pRX_HP_Table->RXHP_flag == 1)\r
665                 {\r
666                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));\r
667                         return  TRUE;   \r
668                 }\r
669         }\r
670 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
671         #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV      \r
672         if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))\r
673         {       \r
674                 printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);\r
675                 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);\r
676                 return  TRUE;\r
677         }\r
678         #endif\r
679 #else\r
680         if (!(priv->up_time > 5))\r
681         {\r
682                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));\r
683                 return  TRUE;\r
684         }\r
685 #endif\r
686 \r
687         return  FALSE;\r
688 }\r
689 \r
690 VOID\r
691 odm_DIGInit(\r
692         IN              PVOID           pDM_VOID\r
693         )\r
694 {\r
695         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
696         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
697 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
698         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
699 #endif\r
700 \r
701         pDM_DigTable->bStopDIG = FALSE;\r
702         pDM_DigTable->bIgnoreDIG = FALSE;\r
703         pDM_DigTable->bPSDInProgress = FALSE;\r
704         pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));\r
705         pDM_DigTable->RssiLowThresh     = DM_DIG_THRESH_LOW;\r
706         pDM_DigTable->RssiHighThresh    = DM_DIG_THRESH_HIGH;\r
707         pDM_DigTable->FALowThresh       = DM_FALSEALARM_THRESH_LOW;\r
708         pDM_DigTable->FAHighThresh      = DM_FALSEALARM_THRESH_HIGH;\r
709         pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;\r
710         pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;\r
711         pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;\r
712         pDM_DigTable->PreCCK_CCAThres = 0xFF;\r
713         pDM_DigTable->CurCCK_CCAThres = 0x83;\r
714         pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;\r
715         pDM_DigTable->LargeFAHit = 0;\r
716         pDM_DigTable->Recover_cnt = 0;\r
717         pDM_DigTable->bMediaConnect_0 = FALSE;\r
718         pDM_DigTable->bMediaConnect_1 = FALSE;\r
719 \r
720         //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error\r
721         pDM_Odm->bDMInitialGainEnable = TRUE;\r
722 \r
723 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
724         pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;\r
725         pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;\r
726 \r
727         // For AP\ ADSL modified DIG\r
728         pDM_DigTable->bTpTarget = FALSE;\r
729         pDM_DigTable->bNoiseEst = TRUE;\r
730         pDM_DigTable->IGIOffset_A = 0;\r
731         pDM_DigTable->IGIOffset_B = 0;\r
732         pDM_DigTable->TpTrainTH_min = 0;\r
733 \r
734         // For RTL8881A\r
735         FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;\r
736 \r
737         //Dyanmic EDCCA\r
738         if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
739         {\r
740                 ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);\r
741         }\r
742 #else\r
743         pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;\r
744         pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;\r
745 \r
746         //To Initi BT30 IGI\r
747         pDM_DigTable->BT30_CurIGI=0x32;\r
748 \r
749         ODM_Memory_Set(pDM_Odm, pDM_DigTable->pause_dig_value, 0, (DM_DIG_MAX_PAUSE_TYPE + 1));\r
750         pDM_DigTable->pause_dig_level = 0;\r
751         ODM_Memory_Set(pDM_Odm, pDM_DigTable->pause_cckpd_value, 0, (DM_DIG_MAX_PAUSE_TYPE + 1));\r
752         pDM_DigTable->pause_cckpd_level = 0;\r
753 #endif\r
754 \r
755         if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))\r
756         {\r
757                 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;\r
758                 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;\r
759         }\r
760         else\r
761         {\r
762                 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;\r
763                 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;\r
764         }\r
765         \r
766 }\r
767 \r
768 \r
769 VOID \r
770 odm_DIG(\r
771         IN              PVOID           pDM_VOID\r
772         )\r
773 {\r
774         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
775 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
776         PADAPTER                                        pAdapter        = pDM_Odm->Adapter;\r
777         HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
778 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
779         prtl8192cd_priv                         priv = pDM_Odm->priv;\r
780         PSTA_INFO_T                             pEntry;\r
781 #endif\r
782 \r
783         // Common parameters\r
784         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
785         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
786         BOOLEAN                                         FirstConnect,FirstDisConnect;\r
787         u1Byte                                          DIG_MaxOfMin, DIG_Dynamic_MIN;\r
788         u1Byte                                          dm_dig_max, dm_dig_min;\r
789         u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;\r
790         u1Byte                                          offset;\r
791         u4Byte                                          dm_FA_thres[3];\r
792         u4Byte                                          TxTp = 0, RxTp = 0;\r
793         BOOLEAN                                         bDFSBand = FALSE;\r
794         BOOLEAN                                         bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;\r
795 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
796         u4Byte                                          TpTrainTH_MIN = DM_DIG_TP_Target_TH0;\r
797         static          u1Byte                  TimeCnt = 0;\r
798         u1Byte                                          i;\r
799 #endif\r
800 \r
801         if(odm_DigAbort(pDM_Odm) == TRUE)\r
802                 return;\r
803 \r
804         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));\r
805         \r
806 \r
807         //1 Update status\r
808 #if (RTL8192D_SUPPORT==1) \r
809         if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
810         {\r
811                 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)\r
812                 {\r
813                         if(*(pDM_Odm->pbMasterOfDMSP))\r
814                         {\r
815                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\r
816                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\r
817                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);\r
818                         }\r
819                         else\r
820                         {\r
821                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;\r
822                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);\r
823                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);\r
824                         }\r
825                 }\r
826                 else\r
827                 {\r
828                         if(*(pDM_Odm->pBandType) == ODM_BAND_5G)\r
829                         {\r
830                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\r
831                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\r
832                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);\r
833                         }\r
834                         else\r
835                         {\r
836                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;\r
837                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);\r
838                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);\r
839                         }\r
840                 }\r
841         }\r
842         else\r
843 #endif\r
844         {       \r
845                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;\r
846                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\r
847                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);\r
848         }\r
849 \r
850 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
851         //1 Noise Floor Estimate\r
852         //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;\r
853         //odm_InbandNoiseCalculate (pDM_Odm);\r
854         \r
855         //1 Mode decision\r
856         if(pDM_Odm->bLinked)\r
857         {\r
858                 //2 Calculate total TP\r
859                 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
860                 {\r
861                         pEntry = pDM_Odm->pODM_StaInfo[i];\r
862                         if(IS_STA_VALID(pEntry))\r
863                         {\r
864                                 RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);\r
865                                 TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7);                        //Kbps\r
866                         }\r
867                 }\r
868                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));\r
869         }\r
870 \r
871         switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)\r
872         {\r
873                 case 0:\r
874                 {\r
875                         bPerformance = TRUE;\r
876                         break;\r
877                 }\r
878                 case 1:\r
879                 {\r
880                         bPerformance = FALSE;\r
881                         break;\r
882                 }\r
883                 case 2:\r
884                 {\r
885                         if(pDM_Odm->bLinked)\r
886                         {\r
887                                 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)\r
888                                         TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;\r
889 \r
890                                 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)\r
891                                         TpTrainTH_MIN = DM_DIG_TP_Target_TH1;\r
892 \r
893                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));\r
894 \r
895                                 //2 Decide DIG mode by total TP\r
896                                 if((TxTp + RxTp) > DM_DIG_TP_Target_TH1)                        // change to performance mode\r
897                                 {\r
898                                         bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;\r
899                                         pDM_DigTable->bTpTarget = TRUE;\r
900                                         bPerformance = TRUE;\r
901                                 }\r
902                                 else if((TxTp + RxTp) < TpTrainTH_MIN)  // change to coverage mode\r
903                                 {\r
904                                         bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;\r
905                                         \r
906                                         if(TimeCnt < DM_DIG_TP_Training_Period)\r
907                                         {\r
908                                                 pDM_DigTable->bTpTarget = FALSE;\r
909                                                 bPerformance = FALSE;\r
910                                                 TimeCnt++;\r
911                                         }\r
912                                         else\r
913                                         {\r
914                                                 pDM_DigTable->bTpTarget = TRUE;\r
915                                                 bPerformance = TRUE;\r
916                                                 bFirstTpTarget = TRUE;\r
917                                                 TimeCnt = 0;\r
918                                         }\r
919                                 }\r
920                                 else                                                                            // remain previous mode\r
921                                 {\r
922                                         bPerformance = pDM_DigTable->bTpTarget;\r
923 \r
924                                         if(!bPerformance)\r
925                                         {\r
926                                                 if(TimeCnt < DM_DIG_TP_Training_Period)\r
927                                                         TimeCnt++;\r
928                                                 else\r
929                                                 {\r
930                                                         pDM_DigTable->bTpTarget = TRUE;\r
931                                                         bPerformance = TRUE;\r
932                                                         bFirstTpTarget = TRUE;\r
933                                                         TimeCnt = 0;\r
934                                                 }\r
935                                         }\r
936                                 }\r
937 \r
938                                 if(!bPerformance)\r
939                                         pDM_DigTable->TpTrainTH_min = RxTp + TxTp;\r
940 \r
941                         }\r
942                         else\r
943                         {\r
944                                 bPerformance = FALSE;\r
945                                 pDM_DigTable->TpTrainTH_min = 0;\r
946                         }\r
947                         break;\r
948                 }\r
949                 default:\r
950                         bPerformance = TRUE;\r
951         }\r
952 \r
953         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== DIG mode = %d  ======\n", pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable));\r
954         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));\r
955 #endif\r
956 \r
957         //1 Boundary Decision\r
958 #if (RTL8192C_SUPPORT==1) \r
959         if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))\r
960         {\r
961                 //2 High power case\r
962                 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))\r
963                 {\r
964                         dm_dig_max = DM_DIG_MAX_AP_HP;\r
965                         dm_dig_min = DM_DIG_MIN_AP_HP;\r
966                 }\r
967                 else\r
968                 {\r
969                         dm_dig_max = DM_DIG_MAX_NIC_HP;\r
970                         dm_dig_min = DM_DIG_MIN_NIC_HP;\r
971                 }\r
972                 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;\r
973         }\r
974         else\r
975 #endif\r
976         {\r
977 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
978                 //2 For AP\ADSL\r
979                 if(!bPerformance)\r
980                 {\r
981                         dm_dig_max = DM_DIG_MAX_AP_COVERAGR;\r
982                         dm_dig_min = DM_DIG_MIN_AP_COVERAGE;\r
983                         DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;\r
984                 }\r
985                 else\r
986                 {\r
987                         dm_dig_max = DM_DIG_MAX_AP;\r
988                         dm_dig_min = DM_DIG_MIN_AP;\r
989                         DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;\r
990                 }\r
991 \r
992                 //4 DFS band\r
993                 if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||\r
994                         ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))\r
995                 {\r
996                         bDFSBand = TRUE;\r
997                         if (*pDM_Odm->pBandWidth == ODM_BW20M){\r
998                                 dm_dig_min = DM_DIG_MIN_AP_DFS+2;\r
999                         }\r
1000                         else{\r
1001                                 dm_dig_min = DM_DIG_MIN_AP_DFS;\r
1002                         }\r
1003                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));\r
1004                 }\r
1005                 \r
1006                 //4 TX2path\r
1007                 if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))\r
1008                                 dm_dig_max = 0x2A;\r
1009 \r
1010 #if RTL8192E_SUPPORT\r
1011 #ifdef HIGH_POWER_EXT_LNA\r
1012                 if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))\r
1013                         dm_dig_max = 0x42;                                              \r
1014 #endif\r
1015 #endif\r
1016 \r
1017 #else\r
1018                 //2 For WIN\CE\r
1019                 if(pDM_Odm->SupportICType >= ODM_RTL8188E)\r
1020                         dm_dig_max = 0x5A;\r
1021                 else\r
1022                         dm_dig_max = DM_DIG_MAX_NIC;\r
1023                 \r
1024                 if(pDM_Odm->SupportICType != ODM_RTL8821)\r
1025                         dm_dig_min = DM_DIG_MIN_NIC;\r
1026                 else\r
1027                         dm_dig_min = 0x1C;\r
1028 \r
1029                 DIG_MaxOfMin = DM_DIG_MAX_AP;\r
1030 #endif  \r
1031         }\r
1032         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Absolutly upper bound = 0x%x, lower bound = 0x%x\n",dm_dig_max, dm_dig_min));\r
1033 \r
1034 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
1035         // for P2P case\r
1036         if(0 < *pDM_Odm->pu1ForcedIgiLb)\r
1037         {\r
1038                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));\r
1039                 dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;\r
1040                 dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);\r
1041         }\r
1042 #endif\r
1043 \r
1044         //1 Adjust boundary by RSSI\r
1045         if(pDM_Odm->bLinked && bPerformance)\r
1046         {\r
1047                 //2 Modify DIG upper bound\r
1048 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1049                 offset = 15;\r
1050 #else\r
1051                 //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT\r
1052                 if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))\r
1053                 {\r
1054                         offset = 10;\r
1055                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));          \r
1056                 }\r
1057                 else\r
1058                         offset = 15;\r
1059 #endif\r
1060 \r
1061                 if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )\r
1062                         pDM_DigTable->rx_gain_range_max = dm_dig_max;\r
1063                 else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )\r
1064                         pDM_DigTable->rx_gain_range_max = dm_dig_min;\r
1065                 else\r
1066                         pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;\r
1067 \r
1068 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1069                 //2 Modify DIG lower bound\r
1070                 //if(pDM_Odm->bOneEntryOnly)\r
1071                 {\r
1072                         if(pDM_Odm->RSSI_Min < dm_dig_min)\r
1073                                 DIG_Dynamic_MIN = dm_dig_min;\r
1074                         else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\r
1075                                 DIG_Dynamic_MIN = DIG_MaxOfMin;\r
1076                         else\r
1077                                 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\r
1078                 }\r
1079 #else\r
1080                 {\r
1081                         //4 For AP\r
1082 #ifdef __ECOS\r
1083                         HAL_REORDER_BARRIER();\r
1084 #else\r
1085                         rmb();\r
1086 #endif\r
1087                         if (bDFSBand)\r
1088                         {\r
1089                                 DIG_Dynamic_MIN = dm_dig_min;\r
1090                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\n", dm_dig_min));\r
1091                         }\r
1092                         else \r
1093                         {\r
1094                                 if(pDM_Odm->RSSI_Min < dm_dig_min)\r
1095                                         DIG_Dynamic_MIN = dm_dig_min;\r
1096                                 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\r
1097                                         DIG_Dynamic_MIN = DIG_MaxOfMin;\r
1098                                 else\r
1099                                         DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\r
1100                         }\r
1101                 }\r
1102 #endif\r
1103         }\r
1104         else\r
1105         {\r
1106 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1107                 if(bPerformance && bDFSBand)\r
1108                 {\r
1109                         pDM_DigTable->rx_gain_range_max = 0x28;\r
1110                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force upper bound to 0x%x before link !!!!!!\n", pDM_DigTable->rx_gain_range_max));\r
1111                 }\r
1112                 else\r
1113 #endif\r
1114                 {\r
1115                         pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;\r
1116                 }\r
1117                 DIG_Dynamic_MIN = dm_dig_min;\r
1118         }\r
1119         \r
1120         //1 Force Lower Bound for AntDiv\r
1121         if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)\r
1122         {\r
1123                 if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\r
1124                 {\r
1125                         if (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) {\r
1126                                 if (pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)\r
1127                                         DIG_Dynamic_MIN = DIG_MaxOfMin;\r
1128                                 else\r
1129                                         DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;\r
1130                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n", DIG_Dynamic_MIN));\r
1131                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n", pDM_DigTable->AntDiv_RSSI_max));\r
1132                         }\r
1133                 }\r
1134         }\r
1135         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",\r
1136                 pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));\r
1137         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n",\r
1138                 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));\r
1139 \r
1140         //1 Modify DIG lower bound, deal with abnormal case\r
1141         //2 Abnormal false alarm case\r
1142 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1143         if(bDFSBand)\r
1144         {\r
1145                 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\r
1146         }\r
1147         else\r
1148 #endif\r
1149         {\r
1150                 if(!pDM_Odm->bLinked)\r
1151                 {\r
1152                         pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\r
1153 \r
1154                         if (FirstDisConnect)\r
1155                                 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;\r
1156                 }\r
1157                 else\r
1158                         pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);\r
1159         }\r
1160 \r
1161         //2 Abnormal # beacon case\r
1162 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1163         if(pDM_Odm->bLinked && !FirstConnect)\r
1164         {\r
1165                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Beacon Num (%d)\n", pDM_Odm->PhyDbgInfo.NumQryBeaconPkt));\r
1166                 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))\r
1167                 {\r
1168                         pDM_DigTable->rx_gain_range_min = dm_dig_min;\r
1169                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n",\r
1170                                 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));\r
1171                 }\r
1172         }\r
1173 #endif\r
1174 \r
1175         //2 Abnormal lower bound case\r
1176         if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)\r
1177         {\r
1178                 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;\r
1179                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n",pDM_DigTable->rx_gain_range_min));\r
1180         }\r
1181 \r
1182         \r
1183         //1 False alarm threshold decision\r
1184         odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);\r
1185         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): False alarm threshold = %d, %d, %d \n\n", dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]));\r
1186 \r
1187         //1 Adjust initial gain by false alarm\r
1188         if(pDM_Odm->bLinked && bPerformance)\r
1189         {\r
1190                 //2 After link\r
1191                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));\r
1192 \r
1193                 if(bFirstTpTarget || (FirstConnect && bPerformance))\r
1194                 {       \r
1195                         pDM_DigTable->LargeFAHit = 0;\r
1196                         \r
1197 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1198                         if(bDFSBand)\r
1199                         {\r
1200                                 if(pDM_Odm->RSSI_Min > 0x28)\r
1201                                         CurrentIGI = 0x28;\r
1202                                 else\r
1203                                         CurrentIGI = pDM_Odm->RSSI_Min;\r
1204                                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));\r
1205                         }\r
1206                         else\r
1207 #endif\r
1208                         {\r
1209                                 if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)\r
1210                                 {\r
1211                                         if(CurrentIGI < pDM_Odm->RSSI_Min)\r
1212                                                 CurrentIGI = pDM_Odm->RSSI_Min;\r
1213                                 }\r
1214                                 else\r
1215                                 {\r
1216                                         if(CurrentIGI < DIG_MaxOfMin)\r
1217                                                 CurrentIGI = DIG_MaxOfMin;\r
1218                                 }\r
1219 \r
1220 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1221 #if (RTL8812A_SUPPORT==1) \r
1222                                 if(pDM_Odm->SupportICType == ODM_RTL8812)\r
1223                                         ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);\r
1224 #endif\r
1225 #endif\r
1226                         }\r
1227 \r
1228                         ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First connect case: IGI does on-shot to 0x%x\n", CurrentIGI));\r
1229 \r
1230                 }\r
1231                 else\r
1232                 {\r
1233                         if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])\r
1234                                 CurrentIGI = CurrentIGI + 4;\r
1235                         else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])\r
1236                                 CurrentIGI = CurrentIGI + 2;\r
1237                         else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\r
1238                                 CurrentIGI = CurrentIGI - 2;\r
1239 \r
1240                         //4 Abnormal # beacon case\r
1241 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1242                         if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))\r
1243                         {                                               \r
1244                                 CurrentIGI = pDM_DigTable->rx_gain_range_min;\r
1245                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n", \r
1246                                         pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));\r
1247                         }\r
1248 #endif\r
1249                 }\r
1250         }       \r
1251         else\r
1252         {\r
1253                 //2 Before link\r
1254                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));\r
1255                 \r
1256                 if(FirstDisConnect || bFirstCoverage)\r
1257                 {\r
1258                         CurrentIGI = dm_dig_min;\r
1259                         ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));\r
1260                 }\r
1261                 else\r
1262                 {\r
1263                         if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])\r
1264                                 CurrentIGI = CurrentIGI + 4;\r
1265                         else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])\r
1266                                 CurrentIGI = CurrentIGI + 2;\r
1267                         else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\r
1268                                 CurrentIGI = CurrentIGI - 2;\r
1269                 }\r
1270         }\r
1271 \r
1272         //1 Check initial gain by upper/lower bound\r
1273         if(CurrentIGI < pDM_DigTable->rx_gain_range_min)\r
1274                 CurrentIGI = pDM_DigTable->rx_gain_range_min;\r
1275         \r
1276         if(CurrentIGI > pDM_DigTable->rx_gain_range_max)\r
1277                 CurrentIGI = pDM_DigTable->rx_gain_range_max;\r
1278 \r
1279         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all)); \r
1280 \r
1281         //1 High power RSSI threshold\r
1282 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
1283         if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))\r
1284         {\r
1285                 // High power IGI lower bound\r
1286                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));\r
1287                 if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)\r
1288                 {\r
1289                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));\r
1290                         //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;\r
1291                         CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;\r
1292                 }\r
1293         }\r
1294         if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))\r
1295         {\r
1296                 if(pHalData->UndecoratedSmoothedPWDB > 0x28)\r
1297                 {\r
1298                         if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)\r
1299                         {\r
1300                                 //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;\r
1301                                 CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;\r
1302                         }       \r
1303                 } \r
1304         }\r
1305 #endif\r
1306 \r
1307         //1 Update status\r
1308 #if (RTL8192D_SUPPORT==1) \r
1309         if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
1310         {\r
1311                 //sherry  delete DualMacSmartConncurrent 20110517\r
1312                 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)\r
1313                 {\r
1314                         ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);\r
1315                         if(*(pDM_Odm->pbMasterOfDMSP))\r
1316                         {\r
1317                                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\r
1318                                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
1319                         }\r
1320                         else\r
1321                         {\r
1322                                 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;\r
1323                                 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;\r
1324                         }\r
1325                 }\r
1326                 else\r
1327                 {\r
1328                         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\r
1329                         if(*(pDM_Odm->pBandType) == ODM_BAND_5G)\r
1330                         {\r
1331                                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\r
1332                                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
1333                         }\r
1334                         else\r
1335                         {\r
1336                                 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;\r
1337                                 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;\r
1338                         }\r
1339                 }\r
1340         }\r
1341         else\r
1342 #endif\r
1343         {\r
1344 #if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))\r
1345                 if(pDM_Odm->bBtHsOperation)\r
1346                 {\r
1347                         if(pDM_Odm->bLinked)\r
1348                         {\r
1349                                 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))\r
1350                                         ODM_Write_DIG(pDM_Odm, CurrentIGI);\r
1351                                 else\r
1352                                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);\r
1353                                         \r
1354                                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\r
1355                                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
1356                         }\r
1357                         else\r
1358                         {\r
1359                                 if(pDM_Odm->bLinkInProcess)\r
1360                                         ODM_Write_DIG(pDM_Odm, 0x1c);\r
1361                                 else if(pDM_Odm->bBtConnectProcess)\r
1362                                         ODM_Write_DIG(pDM_Odm, 0x28);\r
1363                                 else\r
1364                                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);   \r
1365                         }\r
1366                 }\r
1367                 else            // BT is not using\r
1368 #endif\r
1369                 {\r
1370                         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\r
1371                         pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\r
1372                         pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
1373                 }\r
1374         }\r
1375 }\r
1376 \r
1377 VOID\r
1378 odm_DIGbyRSSI_LPS(\r
1379         IN              PVOID           pDM_VOID\r
1380         )\r
1381 {\r
1382 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1383         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1384         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
1385 \r
1386         u1Byte  RSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C\r
1387         u1Byte  CurrentIGI=pDM_Odm->RSSI_Min;\r
1388 \r
1389         if(odm_DigAbort(pDM_Odm) == TRUE)\r
1390                 return;\r
1391 \r
1392         CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;\r
1393 \r
1394         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));\r
1395 \r
1396         // Using FW PS mode to make IGI\r
1397         //Adjust by  FA in LPS MODE\r
1398         if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)\r
1399                 CurrentIGI = CurrentIGI+4;\r
1400         else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)\r
1401                 CurrentIGI = CurrentIGI+2;\r
1402         else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)\r
1403                 CurrentIGI = CurrentIGI-2;      \r
1404 \r
1405 \r
1406         //Lower bound checking\r
1407 \r
1408         //RSSI Lower bound check\r
1409         if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)\r
1410                 RSSI_Lower =(pDM_Odm->RSSI_Min-10);\r
1411         else\r
1412                 RSSI_Lower =DM_DIG_MIN_NIC;\r
1413 \r
1414         //Upper and Lower Bound checking\r
1415          if(CurrentIGI > DM_DIG_MAX_NIC)\r
1416                 CurrentIGI=DM_DIG_MAX_NIC;\r
1417          else if(CurrentIGI < RSSI_Lower)\r
1418                 CurrentIGI =RSSI_Lower;\r
1419 \r
1420         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));\r
1421         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));\r
1422         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));\r
1423 \r
1424         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\r
1425 #endif\r
1426 }\r
1427 \r
1428 //3============================================================\r
1429 //3 FASLE ALARM CHECK\r
1430 //3============================================================\r
1431 \r
1432 VOID \r
1433 odm_FalseAlarmCounterStatistics(\r
1434         IN              PVOID           pDM_VOID\r
1435         )\r
1436 {\r
1437         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1438         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
1439         u4Byte                                          ret_value;\r
1440 \r
1441 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1442 //Mark there, and check this in odm_DMWatchDog\r
1443 #if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1444         prtl8192cd_priv priv            = pDM_Odm->priv;\r
1445         if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )\r
1446                 return;\r
1447 #endif\r
1448 #endif\r
1449 \r
1450         if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))\r
1451                 return;\r
1452 \r
1453         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics()======>\n"));\r
1454 \r
1455 #if (ODM_IC_11N_SERIES_SUPPORT == 1) \r
1456         if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
1457         {\r
1458 \r
1459                 //hold ofdm counter\r
1460                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter\r
1461                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter\r
1462         \r
1463                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);\r
1464                 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);\r
1465                 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);         \r
1466 \r
1467                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);\r
1468                 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); \r
1469                 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);    \r
1470 \r
1471                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);\r
1472                 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);\r
1473                 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);\r
1474 \r
1475                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);\r
1476                 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);\r
1477 \r
1478                 FalseAlmCnt->Cnt_Ofdm_fail =    FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +\r
1479                                                                 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +\r
1480                                                                 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;\r
1481 \r
1482 #if (RTL8188E_SUPPORT==1)\r
1483                 if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
1484                 {\r
1485                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);\r
1486                         FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);\r
1487                         FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);\r
1488                 }\r
1489 #endif\r
1490 \r
1491 #if (RTL8192D_SUPPORT==1) \r
1492                 if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
1493                 {\r
1494                         odm_GetCCKFalseAlarm_92D(pDM_Odm);\r
1495                 }\r
1496                 else\r
1497 #endif\r
1498                 {\r
1499                         //hold cck counter\r
1500                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1); \r
1501                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1); \r
1502                 \r
1503                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);\r
1504                         FalseAlmCnt->Cnt_Cck_fail = ret_value;\r
1505 \r
1506                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);\r
1507                         FalseAlmCnt->Cnt_Cck_fail +=  (ret_value& 0xff)<<8;\r
1508 \r
1509                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);\r
1510                         FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);\r
1511                 }\r
1512         \r
1513                 FalseAlmCnt->Cnt_all = (        FalseAlmCnt->Cnt_Fast_Fsync + \r
1514                                                         FalseAlmCnt->Cnt_SB_Search_fail +\r
1515                                                         FalseAlmCnt->Cnt_Parity_Fail +\r
1516                                                         FalseAlmCnt->Cnt_Rate_Illegal +\r
1517                                                         FalseAlmCnt->Cnt_Crc8_fail +\r
1518                                                         FalseAlmCnt->Cnt_Mcs_fail +\r
1519                                                         FalseAlmCnt->Cnt_Cck_fail);     \r
1520 \r
1521                 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;\r
1522 \r
1523 #if (RTL8192C_SUPPORT==1)\r
1524                 if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
1525                         odm_ResetFACounter_92C(pDM_Odm);\r
1526 #endif\r
1527 \r
1528 #if (RTL8192D_SUPPORT==1)\r
1529                 if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
1530                         odm_ResetFACounter_92D(pDM_Odm);\r
1531 #endif\r
1532 \r
1533                 if(pDM_Odm->SupportICType >=ODM_RTL8723A)\r
1534                 {\r
1535                         //reset false alarm counter registers\r
1536                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);\r
1537                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);\r
1538                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);\r
1539                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);\r
1540 \r
1541                         //update ofdm counter\r
1542                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter\r
1543                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter\r
1544 \r
1545                         //reset CCK CCA counter\r
1546                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0); \r
1547                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2); \r
1548                         //reset CCK FA counter\r
1549                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0); \r
1550                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2); \r
1551                 }\r
1552                 \r
1553 \r
1554                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",\r
1555                         FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));\r
1556                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",\r
1557                         FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));\r
1558                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",\r
1559                 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));\r
1560         }\r
1561 #endif\r
1562 \r
1563 #if (ODM_IC_11AC_SERIES_SUPPORT == 1) \r
1564         if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
1565         {\r
1566                 u4Byte CCKenable;\r
1567                 \r
1568                 /* read OFDM FA counter */\r
1569                 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);\r
1570                 \r
1571 \r
1572                 /* Read CCK FA counter */\r
1573                 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);\r
1574 \r
1575                 /* read CCK/OFDM CCA counter */\r
1576                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);\r
1577                 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;\r
1578                 FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;\r
1579 \r
1580 #if (RTL8881A_SUPPORT==1) \r
1581                 /* For 8881A */\r
1582                 if(pDM_Odm->SupportICType == ODM_RTL8881A)\r
1583                 {\r
1584                         u4Byte Cnt_Ofdm_fail_temp = 0;\r
1585                 \r
1586                         if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)\r
1587                         {\r
1588                                 Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;\r
1589                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;\r
1590                                 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;\r
1591                         }\r
1592                         else\r
1593                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;\r
1594                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\n",   FalseAlmCnt->Cnt_Ofdm_fail_pre));\r
1595                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail_pre=%d\n",       Cnt_Ofdm_fail_temp));\r
1596                         \r
1597                         /* Reset FA counter by enable/disable OFDM */\r
1598                         if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)\r
1599                         {\r
1600                                 // reset OFDM\r
1601                                 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);\r
1602                                 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);\r
1603                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;\r
1604                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Reset false alarm counter\n"));\r
1605                         }\r
1606                 }\r
1607 #endif\r
1608 \r
1609                 /* reset OFDM FA coutner */\r
1610                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);\r
1611                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);\r
1612 \r
1613                 /* reset CCK FA counter */\r
1614                 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);\r
1615                 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);\r
1616 \r
1617                 /* reset CCA counter */\r
1618                 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);\r
1619                 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);\r
1620 \r
1621                 CCKenable =  ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);\r
1622                 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)\r
1623                 {\r
1624                         FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;\r
1625                         FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;\r
1626                 }\r
1627                 else\r
1628                 {\r
1629                         FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;\r
1630                         FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;\r
1631                 }\r
1632 \r
1633         }\r
1634 #endif\r
1635 \r
1636         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_OFDM_CCA=%d\n", FalseAlmCnt->Cnt_OFDM_CCA));\r
1637         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_CCK_CCA=%d\n", FalseAlmCnt->Cnt_CCK_CCA));\r
1638         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_CCA_all=%d\n", FalseAlmCnt->Cnt_CCA_all));\r
1639         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));\r
1640         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));\r
1641         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));\r
1642         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Total False Alarm=%d\n\n", FalseAlmCnt->Cnt_all));\r
1643 }\r
1644 \r
1645 //3============================================================\r
1646 //3 CCK Packet Detect Threshold\r
1647 //3============================================================\r
1648 \r
1649 VOID\r
1650 odm_PauseCCKPacketDetection(\r
1651         IN              PVOID                                   pDM_VOID,\r
1652         IN              PHYDM_PAUSE_TYPE                PauseType,\r
1653         IN              PHYDM_PAUSE_LEVEL               pause_level,\r
1654         IN              u1Byte                                  CCKPDThreshold\r
1655 )\r
1656 {\r
1657         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1658         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1659 \r
1660         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========> level = %d\n", pause_level));\r
1661 \r
1662         if ((pDM_DigTable->pause_cckpd_level == 0) && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) {\r
1663                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Return: SupportAbility ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\n"));\r
1664                 return;\r
1665         }\r
1666 \r
1667         if (pause_level > DM_DIG_MAX_PAUSE_TYPE) {\r
1668                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, \r
1669                         ("odm_PauseCCKPacketDetection(): Return: Wrong pause level !!\n"));\r
1670                 return;\r
1671         }\r
1672 \r
1673         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_cckpd_level, CCKPDThreshold));\r
1674         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", \r
1675                 pDM_DigTable->pause_cckpd_value[7], pDM_DigTable->pause_cckpd_value[6], pDM_DigTable->pause_cckpd_value[5], pDM_DigTable->pause_cckpd_value[4],\r
1676                 pDM_DigTable->pause_cckpd_value[3], pDM_DigTable->pause_cckpd_value[2], pDM_DigTable->pause_cckpd_value[1], pDM_DigTable->pause_cckpd_value[0]));\r
1677 \r
1678         switch (PauseType) {\r
1679         /* Pause CCK Packet Detection Threshold */\r
1680         case PHYDM_PAUSE:\r
1681         {\r
1682                 /* Disable CCK PD */\r
1683                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));\r
1684                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Pause CCK packet detection threshold !!\n"));\r
1685 \r
1686                 /* Backup original CCK PD threshold decided by CCK PD mechanism */\r
1687                 if (pDM_DigTable->pause_cckpd_level == 0) {\r
1688                         pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;\r
1689                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, \r
1690                                 ("odm_PauseCCKPacketDetection(): Backup CCKPD  = 0x%x, new CCKPD = 0x%x\n", pDM_DigTable->CCKPDBackup, CCKPDThreshold));\r
1691                 }\r
1692 \r
1693                 /* Update pause level */\r
1694                 pDM_DigTable->pause_cckpd_level = (pDM_DigTable->pause_cckpd_level | BIT(pause_level));\r
1695 \r
1696                 /* Record CCK PD threshold */\r
1697                 pDM_DigTable->pause_cckpd_value[pause_level] = CCKPDThreshold;\r
1698                 \r
1699                 /* Write new CCK PD threshold */\r
1700                 if (BIT(pause_level + 1) > pDM_DigTable->pause_cckpd_level) {\r
1701                         ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);\r
1702                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): CCKPD of higher level = 0x%x\n", CCKPDThreshold));\r
1703                 }\r
1704                 break;\r
1705         }\r
1706         /* Resume CCK Packet Detection Threshold */\r
1707         case PHYDM_RESUME:\r
1708         {       \r
1709                 /* check if the level is illegal or not */\r
1710                 if ((pDM_DigTable->pause_cckpd_level & (BIT(pause_level))) != 0) {\r
1711                         pDM_DigTable->pause_cckpd_level = pDM_DigTable->pause_cckpd_level & (~(BIT(pause_level)));\r
1712                         pDM_DigTable->pause_cckpd_value[pause_level] = 0;\r
1713                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Resume CCK PD !!\n"));\r
1714                 } else {\r
1715                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Wrong resume level !!\n"));\r
1716                         break;\r
1717                 }\r
1718 \r
1719                 /* Resume DIG */\r
1720                 if (pDM_DigTable->pause_cckpd_level == 0) {\r
1721                         /* Write backup IGI value */\r
1722                         ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);\r
1723                         /* pDM_DigTable->bIgnoreDIG = TRUE; */\r
1724                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Write original CCKPD = 0x%x\n", pDM_DigTable->CCKPDBackup));\r
1725 \r
1726                         /* Enable DIG */\r
1727                         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);       \r
1728                         break;\r
1729                 }\r
1730 \r
1731                 if (BIT(pause_level) > pDM_DigTable->pause_cckpd_level) {\r
1732                         u1Byte  max_level;\r
1733                 \r
1734                         /* Calculate the maximum level now */\r
1735                         for (max_level = (pause_level - 1); max_level >= 0; max_level--) {\r
1736                                 if ((pDM_DigTable->pause_cckpd_level & BIT(max_level)) > 0)\r
1737                                         break;\r
1738                         }\r
1739                 \r
1740                         /* write CCKPD of lower level */\r
1741                         ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->pause_cckpd_value[max_level]);\r
1742                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Write CCKPD (0x%x) of level (%d)\n", \r
1743                                 pDM_DigTable->pause_cckpd_value[max_level], max_level));\r
1744                         break;\r
1745                 }\r
1746                 break;\r
1747         }\r
1748         default:\r
1749                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Wrong  type !!\n"));\r
1750                 break;\r
1751         }       \r
1752         \r
1753         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_cckpd_level, CCKPDThreshold));\r
1754         ODM_RT_TRACE(pDM_Odm, ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", \r
1755                 pDM_DigTable->pause_cckpd_value[7], pDM_DigTable->pause_cckpd_value[6], pDM_DigTable->pause_cckpd_value[5], pDM_DigTable->pause_cckpd_value[4],\r
1756                 pDM_DigTable->pause_cckpd_value[3], pDM_DigTable->pause_cckpd_value[2], pDM_DigTable->pause_cckpd_value[1], pDM_DigTable->pause_cckpd_value[0]));\r
1757 }\r
1758 \r
1759 \r
1760 VOID \r
1761 odm_CCKPacketDetectionThresh(\r
1762         IN              PVOID           pDM_VOID\r
1763         )\r
1764 {\r
1765         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1766         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
1767         u1Byte                                          CurCCK_CCAThres, RSSI_thd = 55;\r
1768 \r
1769 \r
1770 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1771 //modify by Guo.Mingzhi 2011-12-29\r
1772         if (pDM_Odm->bDualMacSmartConcurrent == TRUE)\r
1773 //      if (pDM_Odm->bDualMacSmartConcurrent == FALSE)\r
1774                 return;\r
1775         if(pDM_Odm->bBtHsOperation)\r
1776         {\r
1777                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));\r
1778                 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);\r
1779                 return;\r
1780         }\r
1781 #endif\r
1782 \r
1783         if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))\r
1784         {\r
1785                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  return==========\n"));\r
1786 #ifdef MCR_WIRELESS_EXTEND\r
1787                 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0x43);\r
1788 #endif\r
1789                 return;\r
1790         }\r
1791 \r
1792 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1793         if(pDM_Odm->ExtLNA)\r
1794                 return;\r
1795 #endif\r
1796 \r
1797         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  ==========>\n"));\r
1798 \r
1799         if (pDM_Odm->bLinked)\r
1800         {\r
1801                 if (pDM_Odm->RSSI_Min > RSSI_thd)\r
1802                         CurCCK_CCAThres = 0xcd;\r
1803                 else if ((pDM_Odm->RSSI_Min <= RSSI_thd) && (pDM_Odm->RSSI_Min > 10))\r
1804                         CurCCK_CCAThres = 0x83;\r
1805                 else\r
1806                 {\r
1807                         if(FalseAlmCnt->Cnt_Cck_fail > 1000)\r
1808                                 CurCCK_CCAThres = 0x83;\r
1809                         else\r
1810                                 CurCCK_CCAThres = 0x40;\r
1811                 }\r
1812         } else {\r
1813                 if(FalseAlmCnt->Cnt_Cck_fail > 1000)\r
1814                         CurCCK_CCAThres = 0x83;\r
1815                 else\r
1816                         CurCCK_CCAThres = 0x40;\r
1817         }\r
1818         \r
1819 #if (RTL8192D_SUPPORT==1) \r
1820         if((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))\r
1821                 ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);\r
1822         else\r
1823 #endif\r
1824                 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);\r
1825 \r
1826         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));\r
1827 }\r
1828 \r
1829 VOID\r
1830 ODM_Write_CCK_CCA_Thres(\r
1831         IN      PVOID                   pDM_VOID,\r
1832         IN      u1Byte                  CurCCK_CCAThres\r
1833         )\r
1834 {\r
1835         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1836         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1837 \r
1838         if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres)              //modify by Guo.Mingzhi 2012-01-03\r
1839         {\r
1840                 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);\r
1841         }\r
1842         pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;\r
1843         pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;\r
1844 }\r
1845 \r
1846 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1847 \r
1848 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)\r
1849 VOID\r
1850 odm_RFEControl(\r
1851         IN      PDM_ODM_T       pDM_Odm,\r
1852         IN  u8Byte              RSSIVal\r
1853         )\r
1854 {\r
1855         PADAPTER                Adapter = (PADAPTER)pDM_Odm->Adapter;\r
1856     HAL_DATA_TYPE       *pHalData = GET_HAL_DATA(Adapter);\r
1857         static u1Byte   TRSW_HighPwr = 0;\r
1858          \r
1859         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",\r
1860                          RSSIVal, TRSW_HighPwr, pHalData->RFEType ));\r
1861 \r
1862     if (pHalData->RFEType == 3) {          \r
1863                 \r
1864         pDM_Odm->RSSI_TRSW = RSSIVal;\r
1865 \r
1866         if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H) \r
1867                 {                                \r
1868             TRSW_HighPwr = 1; // Switch to\r
1869             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control\r
1870             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3);  // Set ANTSW=1/ANTSWB=0  for SW control\r
1871             \r
1872         } \r
1873                 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L) \r
1874         {         \r
1875             TRSW_HighPwr = 0; // Switched back\r
1876             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control\r
1877             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0);  // Set ANTSW=1/ANTSWB=0  for SW control\r
1878 \r
1879         }\r
1880     }  \r
1881 \r
1882         \r
1883         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));           \r
1884         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n", \r
1885                                  RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));\r
1886         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));    \r
1887 }\r
1888 \r
1889 VOID\r
1890 odm_MPT_DIGWorkItemCallback(\r
1891     IN PVOID            pContext\r
1892     )\r
1893 {\r
1894         PADAPTER        Adapter = (PADAPTER)pContext;\r
1895         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
1896         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
1897 \r
1898         ODM_MPT_DIG(pDM_Odm);\r
1899 }\r
1900 \r
1901 VOID\r
1902 odm_MPT_DIGCallback(\r
1903         PRT_TIMER               pTimer\r
1904 )\r
1905 {\r
1906         PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;\r
1907        HAL_DATA_TYPE    *pHalData = GET_HAL_DATA(Adapter);\r
1908           PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;\r
1909 \r
1910 \r
1911         #if DEV_BUS_TYPE==RT_PCI_INTERFACE\r
1912                 #if USE_WORKITEM\r
1913                         PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\r
1914                 #else\r
1915                         ODM_MPT_DIG(pDM_Odm);\r
1916                 #endif\r
1917         #else\r
1918                 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\r
1919         #endif\r
1920 \r
1921 }\r
1922 \r
1923 #endif\r
1924 \r
1925 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1926 VOID\r
1927 odm_MPT_DIGCallback(\r
1928         IN              PVOID                                   pDM_VOID\r
1929 )\r
1930 {\r
1931         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1932 #if USE_WORKITEM\r
1933         PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\r
1934 #else\r
1935         ODM_MPT_DIG(pDM_Odm);\r
1936 #endif\r
1937 }\r
1938 #endif\r
1939 \r
1940 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)\r
1941 VOID\r
1942 odm_MPT_Write_DIG(\r
1943         IN              PVOID                                   pDM_VOID,\r
1944         IN              u1Byte                                  CurIGValue\r
1945 )\r
1946 {\r
1947         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1948         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1949 \r
1950         ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);\r
1951 \r
1952         if(pDM_Odm->RFType > ODM_1T1R)\r
1953                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);\r
1954 \r
1955         if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))\r
1956         {\r
1957                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);\r
1958                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);   \r
1959         }\r
1960 \r
1961         pDM_DigTable->CurIGValue = CurIGValue;\r
1962         \r
1963         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));\r
1964         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));\r
1965 }\r
1966 \r
1967 VOID\r
1968 ODM_MPT_DIG(\r
1969         IN              PVOID                                   pDM_VOID\r
1970         )\r
1971 {\r
1972         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1973         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1974         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
1975         u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;\r
1976         u1Byte                                          DIG_Upper = 0x40, DIG_Lower = 0x20;\r
1977         u4Byte                                          RXOK_cal;\r
1978         u4Byte                                          RxPWDBAve_final;\r
1979         u1Byte                                          IGI_A = 0x20, IGI_B = 0x20;\r
1980         \r
1981 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1982 \r
1983         #if ODM_FIX_2G_DIG\r
1984         IGI_A = 0x22;\r
1985         IGI_B = 0x24;           \r
1986         #endif\r
1987         \r
1988 #else\r
1989         if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))\r
1990                 return;\r
1991 \r
1992         if (*pDM_Odm->pBandType == ODM_BAND_5G)\r
1993                 DIG_Lower = 0x22;\r
1994 #endif\r
1995 \r
1996         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));\r
1997         \r
1998 #if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & ODM_AP))\r
1999         if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))) // for 5G or 8814\r
2000 #else\r
2001         if (1) // for both 2G/5G\r
2002 #endif\r
2003                 {\r
2004                 odm_FalseAlarmCounterStatistics(pDM_Odm);\r
2005 \r
2006                 RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;\r
2007                 RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;\r
2008 \r
2009                 pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\r
2010                 pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\r
2011                 pDM_Odm->RxPWDBAve = 0;\r
2012                 pDM_Odm->MPDIG_2G = FALSE;\r
2013 \r
2014 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2015                 pDM_Odm->Times_2G = 0;\r
2016 #endif\r
2017 \r
2018                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));\r
2019                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));\r
2020         \r
2021                 if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)\r
2022                 {\r
2023                         if (CurrentIGI > 0x24)\r
2024                                 odm_MPT_Write_DIG(pDM_Odm, 0x24);\r
2025                 }\r
2026                 else\r
2027                 {\r
2028                         if(pFalseAlmCnt->Cnt_all > 1000){\r
2029                                 CurrentIGI = CurrentIGI + 8;\r
2030                         }\r
2031                         else if(pFalseAlmCnt->Cnt_all > 200){\r
2032                                 CurrentIGI = CurrentIGI + 4;\r
2033                         }\r
2034                         else if (pFalseAlmCnt->Cnt_all > 50){\r
2035                                 CurrentIGI = CurrentIGI + 2;\r
2036                         }\r
2037                         else if (pFalseAlmCnt->Cnt_all < 2){\r
2038                                 CurrentIGI = CurrentIGI - 2;\r
2039                         }\r
2040                         \r
2041                         if (CurrentIGI < DIG_Lower ){\r
2042                                 CurrentIGI = DIG_Lower;\r
2043                         }\r
2044 \r
2045                         if(CurrentIGI > DIG_Upper){\r
2046                                 CurrentIGI = DIG_Upper;\r
2047                         }\r
2048 \r
2049                         odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);\r
2050                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n", \r
2051                                 CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));\r
2052                 }\r
2053         }\r
2054         else\r
2055         {\r
2056                 if(pDM_Odm->MPDIG_2G == FALSE)\r
2057                 {\r
2058                         if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B)))\r
2059                         {\r
2060                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));\r
2061                                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);\r
2062                                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);\r
2063                                 pDM_DigTable->CurIGValue = IGI_B;\r
2064                         }\r
2065                         else\r
2066                                 odm_MPT_Write_DIG(pDM_Odm, IGI_A);\r
2067                 }\r
2068 \r
2069 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2070                 pDM_Odm->Times_2G++;\r
2071 \r
2072                 if (pDM_Odm->Times_2G == 3)\r
2073 #endif\r
2074                 {\r
2075                         pDM_Odm->MPDIG_2G = TRUE;\r
2076                 }\r
2077         }\r
2078 \r
2079 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2080         if (pDM_Odm->SupportICType == ODM_RTL8812)\r
2081                 odm_RFEControl(pDM_Odm, RxPWDBAve_final);\r
2082 #endif\r
2083 \r
2084         ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);\r
2085 }\r
2086 #endif\r