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