net: wireless: rockchip_wlan: add rtl8723ds support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723ds / 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_B, 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_A, 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 \r
1013                         if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) && (pDM_Odm->SupportICType & ODM_RTL8814A)) /* for 2G 8814 */\r
1014                                 dm_dig_min = 0x1c;\r
1015                         else\r
1016                                 dm_dig_min = DM_DIG_MIN_AP;\r
1017                         DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;\r
1018                 }\r
1019                 \r
1020                 //4 TX2path\r
1021                 if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))\r
1022                                 dm_dig_max = 0x2A;\r
1023 \r
1024 #if RTL8192E_SUPPORT\r
1025 #ifdef HIGH_POWER_EXT_LNA\r
1026                 if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))\r
1027                         dm_dig_max = 0x42;                                              \r
1028 #endif\r
1029 #endif\r
1030                 if (pDM_Odm->IGI_LowerBound) {\r
1031                         if (dm_dig_min < pDM_Odm->IGI_LowerBound)\r
1032                                 dm_dig_min = pDM_Odm->IGI_LowerBound;\r
1033                         if (DIG_MaxOfMin < pDM_Odm->IGI_LowerBound)\r
1034                                 DIG_MaxOfMin = pDM_Odm->IGI_LowerBound;                 \r
1035                 }\r
1036                 if (pDM_Odm->IGI_UpperBound) {\r
1037                         if (dm_dig_max > pDM_Odm->IGI_UpperBound)\r
1038                                 dm_dig_max = pDM_Odm->IGI_UpperBound;   \r
1039                         if (DIG_MaxOfMin > pDM_Odm->IGI_UpperBound)\r
1040                                 DIG_MaxOfMin = pDM_Odm->IGI_UpperBound;\r
1041                 }\r
1042 #else\r
1043                 //2 For WIN\CE\r
1044                 if(pDM_Odm->SupportICType >= ODM_RTL8188E)\r
1045                         dm_dig_max = 0x5A;\r
1046                 else\r
1047                         dm_dig_max = DM_DIG_MAX_NIC;\r
1048                 \r
1049                 if(pDM_Odm->SupportICType != ODM_RTL8821)\r
1050                         dm_dig_min = DM_DIG_MIN_NIC;\r
1051                 else\r
1052                         dm_dig_min = 0x1C;\r
1053 \r
1054                 DIG_MaxOfMin = DM_DIG_MAX_AP;\r
1055 #endif\r
1056 \r
1057 \r
1058 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))\r
1059                 /* Modify lower bound for DFS band */\r
1060                 if ((((*pDM_Odm->pChannel >= 52) && (*pDM_Odm->pChannel <= 64)) ||\r
1061                         ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))\r
1062                         #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
1063                         && phydm_dfs_master_enabled(pDM_Odm) == TRUE\r
1064                         #endif\r
1065                 ) {\r
1066                         bDFSBand = TRUE;\r
1067                         if (*pDM_Odm->pBandWidth == ODM_BW20M)\r
1068                                 dm_dig_min = DM_DIG_MIN_AP_DFS+2;\r
1069                         else\r
1070                                 dm_dig_min = DM_DIG_MIN_AP_DFS;\r
1071                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));\r
1072                 }\r
1073 #endif\r
1074         }\r
1075         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
1076 \r
1077 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1078         if (pDM_Odm->pu1ForcedIgiLb && (0 < *pDM_Odm->pu1ForcedIgiLb)) {\r
1079                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Force IGI lb to: 0x%02x !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));\r
1080                 dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;\r
1081                 dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);\r
1082         }\r
1083 #endif\r
1084 \r
1085         //1 Adjust boundary by RSSI\r
1086         if(pDM_Odm->bLinked && bPerformance)\r
1087         {\r
1088                 //2 Modify DIG upper bound\r
1089 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
1090                 offset = 15;\r
1091 #else\r
1092                 //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT\r
1093                 if ((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821)) && (pDM_Odm->bBtLimitedDig == 1))\r
1094                 {\r
1095                         offset = 10;\r
1096                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));          \r
1097                 }\r
1098                 else\r
1099                         offset = 15;\r
1100 #endif\r
1101 \r
1102                 if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )\r
1103                         pDM_DigTable->rx_gain_range_max = dm_dig_max;\r
1104                 else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )\r
1105                         pDM_DigTable->rx_gain_range_max = dm_dig_min;\r
1106                 else\r
1107                         pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;\r
1108 \r
1109 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1110                 //2 Modify DIG lower bound\r
1111                 //if(pDM_Odm->bOneEntryOnly)\r
1112                 {\r
1113                         if(pDM_Odm->RSSI_Min < dm_dig_min)\r
1114                                 DIG_Dynamic_MIN = dm_dig_min;\r
1115                         else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\r
1116                                 DIG_Dynamic_MIN = DIG_MaxOfMin;\r
1117                         else\r
1118                                 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\r
1119 \r
1120 #if (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
1121                         if (bDFSBand) {\r
1122                                 DIG_Dynamic_MIN = dm_dig_min;\r
1123                                 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
1124                         }\r
1125 #endif\r
1126                 }\r
1127 #else\r
1128                 {\r
1129                         //4 For AP\r
1130 #ifdef __ECOS\r
1131                         HAL_REORDER_BARRIER();\r
1132 #else\r
1133                         rmb();\r
1134 #endif\r
1135                         if (bDFSBand)\r
1136                         {\r
1137                                 DIG_Dynamic_MIN = dm_dig_min;\r
1138                                 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
1139                         }\r
1140                         else \r
1141                         {\r
1142                                 if(pDM_Odm->RSSI_Min < dm_dig_min)\r
1143                                         DIG_Dynamic_MIN = dm_dig_min;\r
1144                                 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)\r
1145                                         DIG_Dynamic_MIN = DIG_MaxOfMin;\r
1146                                 else\r
1147                                         DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;\r
1148                         }\r
1149                 }\r
1150 #endif\r
1151         }\r
1152         else\r
1153         {\r
1154 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))\r
1155                 if(bPerformance && bDFSBand)\r
1156                 {\r
1157                         pDM_DigTable->rx_gain_range_max = 0x28;\r
1158                         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
1159                 }\r
1160                 else\r
1161 #endif\r
1162                 {\r
1163                         if (bPerformance)\r
1164                                 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;\r
1165                         else\r
1166                                 pDM_DigTable->rx_gain_range_max = dm_dig_max;\r
1167                 }\r
1168                 DIG_Dynamic_MIN = dm_dig_min;\r
1169         }\r
1170         \r
1171         //1 Force Lower Bound for AntDiv\r
1172         if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)\r
1173         {\r
1174                 if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))\r
1175                 {\r
1176                         if (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) {\r
1177                                 if (pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)\r
1178                                         DIG_Dynamic_MIN = DIG_MaxOfMin;\r
1179                                 else\r
1180                                         DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;\r
1181                                 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
1182                                 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
1183                         }\r
1184                 }\r
1185         }\r
1186         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
1187                 pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));\r
1188         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
1189                 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));\r
1190 \r
1191         //1 Modify DIG lower bound, deal with abnormal case\r
1192         //2 Abnormal false alarm case\r
1193 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))\r
1194         if(bDFSBand)\r
1195         {\r
1196                 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\r
1197         }\r
1198         else\r
1199 #endif\r
1200         {\r
1201                 if(!pDM_Odm->bLinked)\r
1202                 {\r
1203                         pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;\r
1204 \r
1205                         if (FirstDisConnect)\r
1206                                 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;\r
1207                 }\r
1208                 else\r
1209                         pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);\r
1210         }\r
1211 \r
1212         //2 Abnormal # beacon case\r
1213 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1214         if(pDM_Odm->bLinked && !FirstConnect)\r
1215         {\r
1216                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Beacon Num (%d)\n", pDM_Odm->PhyDbgInfo.NumQryBeaconPkt));\r
1217                 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))\r
1218                 {\r
1219                         pDM_DigTable->rx_gain_range_min = 0x1c;\r
1220                         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
1221                                 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));\r
1222                 }\r
1223         }\r
1224 #endif\r
1225 \r
1226         //2 Abnormal lower bound case\r
1227         if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)\r
1228         {\r
1229                 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;\r
1230                 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
1231         }\r
1232 \r
1233         \r
1234         //1 False alarm threshold decision\r
1235         odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);\r
1236         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
1237 \r
1238         //1 Adjust initial gain by false alarm\r
1239         if(pDM_Odm->bLinked && bPerformance)\r
1240         {\r
1241                 //2 After link\r
1242                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));\r
1243 \r
1244                 if(bFirstTpTarget || (FirstConnect && bPerformance))\r
1245                 {       \r
1246                         pDM_DigTable->LargeFAHit = 0;\r
1247                         \r
1248 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))\r
1249                         if(bDFSBand)\r
1250                         {\r
1251                                 if(pDM_Odm->RSSI_Min > 0x28)\r
1252                                         CurrentIGI = 0x28;\r
1253                                 else\r
1254                                         CurrentIGI = pDM_Odm->RSSI_Min;\r
1255                                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));\r
1256                         }\r
1257                         else\r
1258 #endif\r
1259                         {\r
1260                                 if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)\r
1261                                 {\r
1262                                         if(CurrentIGI < pDM_Odm->RSSI_Min)\r
1263                                                 CurrentIGI = pDM_Odm->RSSI_Min;\r
1264                                 }\r
1265                                 else\r
1266                                 {\r
1267                                         if(CurrentIGI < DIG_MaxOfMin)\r
1268                                                 CurrentIGI = DIG_MaxOfMin;\r
1269                                 }\r
1270 \r
1271 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1272 #if (RTL8812A_SUPPORT==1) \r
1273                                 if(pDM_Odm->SupportICType == ODM_RTL8812)\r
1274                                         ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);\r
1275 #endif\r
1276 #endif\r
1277                         }\r
1278 \r
1279                         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
1280 \r
1281                 }\r
1282                 else\r
1283                 {\r
1284 \r
1285 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
1286 \r
1287                         if (priv->pshare->rf_ft_var.dig_upcheck_enable)\r
1288                                 DIG_GoUpCheck = phydm_DIG_GoUpCheck(pDM_Odm);                   \r
1289 #endif\r
1290 \r
1291                         if((pFalseAlmCnt->Cnt_all > dm_FA_thres[2]) && DIG_GoUpCheck)\r
1292                                 CurrentIGI = CurrentIGI + 4;\r
1293                         else if ((pFalseAlmCnt->Cnt_all > dm_FA_thres[1]) && DIG_GoUpCheck)\r
1294                                 CurrentIGI = CurrentIGI + 2;\r
1295                         else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\r
1296                                 CurrentIGI = CurrentIGI - 2;\r
1297 \r
1298                         //4 Abnormal # beacon case\r
1299 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1300                         if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))\r
1301                         {                                               \r
1302                                 CurrentIGI = pDM_DigTable->rx_gain_range_min;\r
1303                                 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
1304                                         pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));\r
1305                         }\r
1306 #endif\r
1307                 }\r
1308         }       \r
1309         else\r
1310         {\r
1311                 //2 Before link\r
1312                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));\r
1313                 \r
1314                 if(FirstDisConnect || bFirstCoverage)\r
1315                 {\r
1316                         CurrentIGI = dm_dig_min;\r
1317                         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
1318                 }\r
1319                 else\r
1320                 {\r
1321 \r
1322 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
1323                         if (priv->pshare->rf_ft_var.dig_upcheck_enable)\r
1324                                 DIG_GoUpCheck = phydm_DIG_GoUpCheck(pDM_Odm);                   \r
1325 #endif\r
1326                 \r
1327                         if((pFalseAlmCnt->Cnt_all > dm_FA_thres[2]) && DIG_GoUpCheck)\r
1328                                 CurrentIGI = CurrentIGI + 4;\r
1329                         else if ((pFalseAlmCnt->Cnt_all > dm_FA_thres[1]) && DIG_GoUpCheck)\r
1330                                 CurrentIGI = CurrentIGI + 2;\r
1331                         else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])\r
1332                                 CurrentIGI = CurrentIGI - 2;\r
1333                 }\r
1334         }\r
1335 \r
1336         //1 Check initial gain by upper/lower bound\r
1337         if(CurrentIGI < pDM_DigTable->rx_gain_range_min)\r
1338                 CurrentIGI = pDM_DigTable->rx_gain_range_min;\r
1339         \r
1340         if(CurrentIGI > pDM_DigTable->rx_gain_range_max)\r
1341                 CurrentIGI = pDM_DigTable->rx_gain_range_max;\r
1342 \r
1343         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
1344 \r
1345         //1 Update status\r
1346         {\r
1347 #if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))\r
1348                 if(pDM_Odm->bBtHsOperation)\r
1349                 {\r
1350                         if(pDM_Odm->bLinked)\r
1351                         {\r
1352                                 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))\r
1353                                         ODM_Write_DIG(pDM_Odm, CurrentIGI);\r
1354                                 else\r
1355                                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);\r
1356                                         \r
1357                                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\r
1358                                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
1359                         }\r
1360                         else\r
1361                         {\r
1362                                 if(pDM_Odm->bLinkInProcess)\r
1363                                         ODM_Write_DIG(pDM_Odm, 0x1c);\r
1364                                 else if(pDM_Odm->bBtConnectProcess)\r
1365                                         ODM_Write_DIG(pDM_Odm, 0x28);\r
1366                                 else\r
1367                                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);   \r
1368                         }\r
1369                 }\r
1370                 else            // BT is not using\r
1371 #endif\r
1372                 {\r
1373                         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\r
1374                         pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;\r
1375                         pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;\r
1376                 }\r
1377         }\r
1378 }\r
1379 \r
1380 VOID\r
1381 odm_DIGbyRSSI_LPS(\r
1382         IN              PVOID           pDM_VOID\r
1383         )\r
1384 {\r
1385 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1386         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1387         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
1388 \r
1389         u1Byte  RSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C\r
1390         u1Byte  CurrentIGI=pDM_Odm->RSSI_Min;\r
1391 \r
1392         if(odm_DigAbort(pDM_Odm) == TRUE)\r
1393                 return;\r
1394 \r
1395         CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;\r
1396 \r
1397         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));\r
1398 \r
1399         // Using FW PS mode to make IGI\r
1400         //Adjust by  FA in LPS MODE\r
1401         if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)\r
1402                 CurrentIGI = CurrentIGI+4;\r
1403         else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)\r
1404                 CurrentIGI = CurrentIGI+2;\r
1405         else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)\r
1406                 CurrentIGI = CurrentIGI-2;      \r
1407 \r
1408 \r
1409         //Lower bound checking\r
1410 \r
1411         //RSSI Lower bound check\r
1412         if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)\r
1413                 RSSI_Lower =(pDM_Odm->RSSI_Min-10);\r
1414         else\r
1415                 RSSI_Lower =DM_DIG_MIN_NIC;\r
1416 \r
1417         //Upper and Lower Bound checking\r
1418          if(CurrentIGI > DM_DIG_MAX_NIC)\r
1419                 CurrentIGI = DM_DIG_MAX_NIC;\r
1420          else if(CurrentIGI < RSSI_Lower)\r
1421                 CurrentIGI = RSSI_Lower;\r
1422 \r
1423         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));\r
1424         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
1425         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));\r
1426 \r
1427         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);\r
1428 #endif\r
1429 }\r
1430 \r
1431 //3============================================================\r
1432 //3 FASLE ALARM CHECK\r
1433 //3============================================================\r
1434 \r
1435 VOID \r
1436 odm_FalseAlarmCounterStatistics(\r
1437         IN              PVOID           pDM_VOID\r
1438         )\r
1439 {\r
1440         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1441         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
1442         u4Byte                                          ret_value;\r
1443 \r
1444 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1445 //Mark there, and check this in odm_DMWatchDog\r
1446 #if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1447         prtl8192cd_priv priv            = pDM_Odm->priv;\r
1448         if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )\r
1449                 return;\r
1450 #endif\r
1451 #endif\r
1452 \r
1453         if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))\r
1454                 return;\r
1455 \r
1456         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics()======>\n"));\r
1457 \r
1458 #if (ODM_IC_11N_SERIES_SUPPORT == 1) \r
1459         if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
1460         {\r
1461 \r
1462                 //hold ofdm counter\r
1463                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter\r
1464                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter\r
1465         \r
1466                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);\r
1467                 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);\r
1468                 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);         \r
1469 \r
1470                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);\r
1471                 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); \r
1472                 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);    \r
1473 \r
1474                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);\r
1475                 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);\r
1476                 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);\r
1477 \r
1478                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);\r
1479                 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);\r
1480 \r
1481                 FalseAlmCnt->Cnt_Ofdm_fail =    FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +\r
1482                                                                 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +\r
1483                                                                 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;\r
1484 \r
1485                 /* read CCK CRC32 counter */\r
1486                 FalseAlmCnt->cnt_cck_crc32_error = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CRC32_ERROR_CNT_11N, bMaskDWord);\r
1487                 FalseAlmCnt->cnt_cck_crc32_ok= ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CRC32_OK_CNT_11N, bMaskDWord);\r
1488 \r
1489                 /* read OFDM CRC32 counter */\r
1490                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_CRC32_CNT_11N, bMaskDWord);\r
1491                 FalseAlmCnt->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;\r
1492                 FalseAlmCnt->cnt_ofdm_crc32_ok= ret_value & 0xffff;\r
1493 \r
1494                 /* read HT CRC32 counter */\r
1495                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_HT_CRC32_CNT_11N, bMaskDWord);\r
1496                 FalseAlmCnt->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;\r
1497                 FalseAlmCnt->cnt_ht_crc32_ok= ret_value & 0xffff;\r
1498 \r
1499                 /* read VHT CRC32 counter */\r
1500                 FalseAlmCnt->cnt_vht_crc32_error = 0;\r
1501                 FalseAlmCnt->cnt_vht_crc32_ok= 0;\r
1502 \r
1503 #if (RTL8188E_SUPPORT==1)\r
1504                 if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
1505                 {\r
1506                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);\r
1507                         FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);\r
1508                         FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);\r
1509                 }\r
1510 #endif\r
1511 \r
1512                 {\r
1513                         //hold cck counter\r
1514                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1); \r
1515                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1); \r
1516                 \r
1517                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);\r
1518                         FalseAlmCnt->Cnt_Cck_fail = ret_value;\r
1519 \r
1520                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);\r
1521                         FalseAlmCnt->Cnt_Cck_fail +=  (ret_value& 0xff)<<8;\r
1522 \r
1523                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);\r
1524                         FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);\r
1525                 }\r
1526         \r
1527                 FalseAlmCnt->Cnt_all_pre = FalseAlmCnt->Cnt_all;\r
1528         \r
1529                 FalseAlmCnt->Cnt_all = (        FalseAlmCnt->Cnt_Fast_Fsync + \r
1530                                                         FalseAlmCnt->Cnt_SB_Search_fail +\r
1531                                                         FalseAlmCnt->Cnt_Parity_Fail +\r
1532                                                         FalseAlmCnt->Cnt_Rate_Illegal +\r
1533                                                         FalseAlmCnt->Cnt_Crc8_fail +\r
1534                                                         FalseAlmCnt->Cnt_Mcs_fail +\r
1535                                                         FalseAlmCnt->Cnt_Cck_fail);     \r
1536 \r
1537                 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;\r
1538 \r
1539                 if (pDM_Odm->SupportICType >= ODM_RTL8188E) {\r
1540                         /*reset false alarm counter registers*/\r
1541                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);\r
1542                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);\r
1543                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);\r
1544                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);\r
1545 \r
1546                         /*update ofdm counter*/\r
1547                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0);     /*update page C counter*/\r
1548                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0);      /*update page D counter*/\r
1549 \r
1550                         /*reset CCK CCA counter*/\r
1551                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0); \r
1552                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2); \r
1553 \r
1554                         /*reset CCK FA counter*/\r
1555                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0); \r
1556                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2); \r
1557 \r
1558                         /*reset CRC32 counter*/\r
1559                         ODM_SetBBReg(pDM_Odm, ODM_REG_PAGE_F_RST_11N, BIT16, 1); \r
1560                         ODM_SetBBReg(pDM_Odm, ODM_REG_PAGE_F_RST_11N, BIT16, 0); \r
1561                 }\r
1562                 \r
1563                 /* Get debug port 0 */\r
1564                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x0);\r
1565                 FalseAlmCnt->dbg_port0 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, bMaskDWord);\r
1566 \r
1567                 /* Get EDCCA flag */\r
1568                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);\r
1569                 FalseAlmCnt->edcca_flag = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, BIT30);\r
1570 \r
1571                 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
1572                         FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));\r
1573                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",\r
1574                         FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));\r
1575                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",\r
1576                 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));\r
1577         }\r
1578 #endif\r
1579 \r
1580 #if (ODM_IC_11AC_SERIES_SUPPORT == 1) \r
1581         if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
1582         {\r
1583                 u4Byte CCKenable;\r
1584                 \r
1585                 /* read OFDM FA counter */\r
1586                 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);\r
1587 \r
1588                 /* Read CCK FA counter */\r
1589                 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);\r
1590 \r
1591                 /* read CCK/OFDM CCA counter */\r
1592                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);\r
1593                 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;\r
1594                 FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;\r
1595 \r
1596                 /* read CCK CRC32 counter */\r
1597                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CRC32_CNT_11AC, bMaskDWord);\r
1598                 FalseAlmCnt->cnt_cck_crc32_error = (ret_value & 0xffff0000) >> 16;\r
1599                 FalseAlmCnt->cnt_cck_crc32_ok= ret_value & 0xffff;\r
1600 \r
1601                 /* read OFDM CRC32 counter */\r
1602                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_CRC32_CNT_11AC, bMaskDWord);\r
1603                 FalseAlmCnt->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;\r
1604                 FalseAlmCnt->cnt_ofdm_crc32_ok= ret_value & 0xffff;\r
1605 \r
1606                 /* read HT CRC32 counter */\r
1607                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_HT_CRC32_CNT_11AC, bMaskDWord);\r
1608                 FalseAlmCnt->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;\r
1609                 FalseAlmCnt->cnt_ht_crc32_ok= ret_value & 0xffff;\r
1610 \r
1611                 /* read VHT CRC32 counter */\r
1612                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_VHT_CRC32_CNT_11AC, bMaskDWord);\r
1613                 FalseAlmCnt->cnt_vht_crc32_error = (ret_value & 0xffff0000) >> 16;\r
1614                 FalseAlmCnt->cnt_vht_crc32_ok= ret_value & 0xffff;\r
1615 \r
1616 #if (RTL8881A_SUPPORT==1) \r
1617                 /* For 8881A */\r
1618                 if(pDM_Odm->SupportICType == ODM_RTL8881A)\r
1619                 {\r
1620                         u4Byte Cnt_Ofdm_fail_temp = 0;\r
1621                 \r
1622                         if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)\r
1623                         {\r
1624                                 Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;\r
1625                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;\r
1626                                 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;\r
1627                         }\r
1628                         else\r
1629                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;\r
1630                         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
1631                         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
1632                         \r
1633                         /* Reset FA counter by enable/disable OFDM */\r
1634                         if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)\r
1635                         {\r
1636                                 // reset OFDM\r
1637                                 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);\r
1638                                 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);\r
1639                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;\r
1640                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Reset false alarm counter\n"));\r
1641                         }\r
1642                 }\r
1643 #endif\r
1644 \r
1645                 /* reset OFDM FA coutner */\r
1646                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);\r
1647                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);\r
1648 \r
1649                 /* reset CCK FA counter */\r
1650                 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);\r
1651                 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);\r
1652 \r
1653                 /* reset CCA counter */\r
1654                 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);\r
1655                 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);\r
1656 \r
1657                 CCKenable =  ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);\r
1658                 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)\r
1659                 {\r
1660                         FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;\r
1661                         FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;\r
1662                 }\r
1663                 else\r
1664                 {\r
1665                         FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;\r
1666                         FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;\r
1667                 }\r
1668                 if (pDM_Odm->ADCSmp_count == 0) {\r
1669                         /* Get debug port 0 */\r
1670                         ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x0);\r
1671                         FalseAlmCnt->dbg_port0 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, bMaskDWord);\r
1672 \r
1673                         /* Get EDCCA flag */\r
1674                         ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);\r
1675                         FalseAlmCnt->edcca_flag = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, BIT30);\r
1676                 }\r
1677                 \r
1678         }\r
1679 #endif\r
1680 \r
1681 \r
1682         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
1683         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
1684 \r
1685         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_OFDM_CCA=%d\n", FalseAlmCnt->Cnt_OFDM_CCA));\r
1686         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_CCK_CCA=%d\n", FalseAlmCnt->Cnt_CCK_CCA));\r
1687         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_CCA_all=%d\n", FalseAlmCnt->Cnt_CCA_all));\r
1688         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));\r
1689         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));\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(): Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));\r
1692         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
1693         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
1694         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
1695         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
1696         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
1697         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
1698 }\r
1699 \r
1700 //3============================================================\r
1701 //3 CCK Packet Detect Threshold\r
1702 //3============================================================\r
1703 \r
1704 VOID\r
1705 odm_PauseCCKPacketDetection(\r
1706         IN              PVOID                                   pDM_VOID,\r
1707         IN              PHYDM_PAUSE_TYPE                PauseType,\r
1708         IN              PHYDM_PAUSE_LEVEL               pause_level,\r
1709         IN              u1Byte                                  CCKPDThreshold\r
1710 )\r
1711 {\r
1712         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1713         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1714 \r
1715         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========> level = %d\n", pause_level));\r
1716 \r
1717         if ((pDM_DigTable->pause_cckpd_level == 0) && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) {\r
1718                 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
1719                 return;\r
1720         }\r
1721 \r
1722         if (pause_level > DM_DIG_MAX_PAUSE_TYPE) {\r
1723                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, \r
1724                         ("odm_PauseCCKPacketDetection(): Return: Wrong pause level !!\n"));\r
1725                 return;\r
1726         }\r
1727 \r
1728         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
1729         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
1730                 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
1731                 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
1732 \r
1733         switch (PauseType) {\r
1734         /* Pause CCK Packet Detection Threshold */\r
1735         case PHYDM_PAUSE:\r
1736         {\r
1737                 /* Disable CCK PD */\r
1738                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));\r
1739                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Pause CCK packet detection threshold !!\n"));\r
1740 \r
1741                 /* Backup original CCK PD threshold decided by CCK PD mechanism */\r
1742                 if (pDM_DigTable->pause_cckpd_level == 0) {\r
1743                         pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;\r
1744                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, \r
1745                                 ("odm_PauseCCKPacketDetection(): Backup CCKPD  = 0x%x, new CCKPD = 0x%x\n", pDM_DigTable->CCKPDBackup, CCKPDThreshold));\r
1746                 }\r
1747 \r
1748                 /* Update pause level */\r
1749                 pDM_DigTable->pause_cckpd_level = (pDM_DigTable->pause_cckpd_level | BIT(pause_level));\r
1750 \r
1751                 /* Record CCK PD threshold */\r
1752                 pDM_DigTable->pause_cckpd_value[pause_level] = CCKPDThreshold;\r
1753 \r
1754                 /* Write new CCK PD threshold */\r
1755                 if (BIT(pause_level + 1) > pDM_DigTable->pause_cckpd_level) {\r
1756                         ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);\r
1757                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): CCKPD of higher level = 0x%x\n", CCKPDThreshold));\r
1758                 }\r
1759                 break;\r
1760         }\r
1761         /* Resume CCK Packet Detection Threshold */\r
1762         case PHYDM_RESUME:\r
1763         {       \r
1764                 /* check if the level is illegal or not */\r
1765                 if ((pDM_DigTable->pause_cckpd_level & (BIT(pause_level))) != 0) {\r
1766                         pDM_DigTable->pause_cckpd_level = pDM_DigTable->pause_cckpd_level & (~(BIT(pause_level)));\r
1767                         pDM_DigTable->pause_cckpd_value[pause_level] = 0;\r
1768                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Resume CCK PD !!\n"));\r
1769                 } else {\r
1770                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Wrong resume level !!\n"));\r
1771                         break;\r
1772                 }\r
1773 \r
1774                 /* Resume DIG */\r
1775                 if (pDM_DigTable->pause_cckpd_level == 0) {\r
1776                         /* Write backup IGI value */\r
1777                         ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);\r
1778                         /* pDM_DigTable->bIgnoreDIG = TRUE; */\r
1779                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Write original CCKPD = 0x%x\n", pDM_DigTable->CCKPDBackup));\r
1780 \r
1781                         /* Enable DIG */\r
1782                         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);       \r
1783                         break;\r
1784                 }\r
1785 \r
1786                 if (BIT(pause_level) > pDM_DigTable->pause_cckpd_level) {\r
1787                         s1Byte  max_level;\r
1788                 \r
1789                         /* Calculate the maximum level now */\r
1790                         for (max_level = (pause_level - 1); max_level >= 0; max_level--) {\r
1791                                 if ((pDM_DigTable->pause_cckpd_level & BIT(max_level)) > 0)\r
1792                                         break;\r
1793                         }\r
1794                 \r
1795                         /* write CCKPD of lower level */\r
1796                         ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->pause_cckpd_value[max_level]);\r
1797                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Write CCKPD (0x%x) of level (%d)\n", \r
1798                                 pDM_DigTable->pause_cckpd_value[max_level], max_level));\r
1799                         break;\r
1800                 }\r
1801                 break;\r
1802         }\r
1803         default:\r
1804                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Wrong  type !!\n"));\r
1805                 break;\r
1806         }       \r
1807         \r
1808         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
1809         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
1810                 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
1811                 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
1812 }\r
1813 \r
1814 \r
1815 VOID \r
1816 odm_CCKPacketDetectionThresh(\r
1817         IN              PVOID           pDM_VOID\r
1818         )\r
1819 {\r
1820         PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1821         pDIG_T                                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1822         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
1823         u1Byte                                  CurCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres, RSSI_thd = 35;\r
1824 \r
1825 \r
1826 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1827 //modify by Guo.Mingzhi 2011-12-29\r
1828         if (pDM_Odm->bDualMacSmartConcurrent == TRUE)\r
1829 //      if (pDM_Odm->bDualMacSmartConcurrent == FALSE)\r
1830                 return;\r
1831         if(pDM_Odm->bBtHsOperation)\r
1832         {\r
1833                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));\r
1834                 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);\r
1835                 return;\r
1836         }\r
1837 #endif\r
1838 \r
1839         if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))\r
1840         {\r
1841                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  return==========\n"));\r
1842 #ifdef MCR_WIRELESS_EXTEND\r
1843                 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0x43);\r
1844 #endif\r
1845                 return;\r
1846         }\r
1847 \r
1848 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1849         if(pDM_Odm->ExtLNA)\r
1850                 return;\r
1851 #endif\r
1852 \r
1853         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  ==========>\n"));\r
1854 \r
1855         if (pDM_DigTable->cckFaMa == 0xffffffff)\r
1856                 pDM_DigTable->cckFaMa = FalseAlmCnt->Cnt_Cck_fail;\r
1857         else\r
1858                 pDM_DigTable->cckFaMa = ((pDM_DigTable->cckFaMa<<1) + pDM_DigTable->cckFaMa + FalseAlmCnt->Cnt_Cck_fail) >> 2;\r
1859         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh(): CCK FA moving average = %d\n", pDM_DigTable->cckFaMa));\r
1860 \r
1861         if (pDM_Odm->bLinked) {\r
1862 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1863                 #if 0 /*for [PCIE-1596]*/\r
1864                 if (pDM_Odm->RSSI_Min > (RSSI_thd + 14))\r
1865                         CurCCK_CCAThres = 0xed;\r
1866                 else if (pDM_Odm->RSSI_Min > (RSSI_thd + 6))\r
1867                         CurCCK_CCAThres = 0xdd;\r
1868                 else \r
1869                 #endif\r
1870                 if (pDM_Odm->RSSI_Min > RSSI_thd)\r
1871                         CurCCK_CCAThres = 0xcd;\r
1872                 else if (pDM_Odm->RSSI_Min > 20) {\r
1873                         if (pDM_DigTable->cckFaMa > ((DM_DIG_FA_TH1>>1) + (DM_DIG_FA_TH1>>3)))\r
1874                                 CurCCK_CCAThres = 0xcd;\r
1875                         else if (pDM_DigTable->cckFaMa < (DM_DIG_FA_TH0>>1))\r
1876                                 CurCCK_CCAThres = 0x83;\r
1877                 } else if (pDM_Odm->RSSI_Min > 7)\r
1878                         CurCCK_CCAThres = 0x83;\r
1879                 else\r
1880                         CurCCK_CCAThres = 0x40;\r
1881 #else\r
1882                 if (pDM_DigTable->CurIGValue > (0x24 + 14))\r
1883                         CurCCK_CCAThres = 0xed;\r
1884                 else if (pDM_DigTable->CurIGValue > (0x24 + 6))\r
1885                         CurCCK_CCAThres = 0xdd;\r
1886                 else if (pDM_DigTable->CurIGValue > 0x24)\r
1887                         CurCCK_CCAThres = 0xcd;\r
1888                 else {\r
1889                         if (pDM_DigTable->cckFaMa > 0x400)\r
1890                                 CurCCK_CCAThres = 0x83;\r
1891                         else if (pDM_DigTable->cckFaMa < 0x200)\r
1892                                 CurCCK_CCAThres = 0x40;\r
1893                 }\r
1894 \r
1895 #endif\r
1896         } else {\r
1897                 if (pDM_DigTable->cckFaMa > 0x400)\r
1898                         CurCCK_CCAThres = 0x83;\r
1899                 else if (pDM_DigTable->cckFaMa < 0x200)\r
1900                         CurCCK_CCAThres = 0x40;\r
1901         }\r
1902         \r
1903         ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);\r
1904 \r
1905         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  CurCCK_CCAThres = 0x%x\n", CurCCK_CCAThres));\r
1906 }\r
1907 \r
1908 VOID\r
1909 ODM_Write_CCK_CCA_Thres(\r
1910         IN      PVOID                   pDM_VOID,\r
1911         IN      u1Byte                  CurCCK_CCAThres\r
1912         )\r
1913 {\r
1914         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1915         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1916 \r
1917         if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres)              //modify by Guo.Mingzhi 2012-01-03\r
1918         {\r
1919                 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);\r
1920                 pDM_DigTable->cckFaMa = 0xffffffff;\r
1921         }\r
1922         pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;\r
1923         pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;\r
1924 }\r
1925 \r
1926 BOOLEAN\r
1927 phydm_DIG_GoUpCheck(\r
1928         IN              PVOID           pDM_VOID\r
1929         )\r
1930 {\r
1931         PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1932         PCCX_INFO                               CCX_INFO = &pDM_Odm->DM_CCX_INFO;\r
1933         pDIG_T                                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1934         u1Byte                                  CurIGValue = pDM_DigTable->CurIGValue;\r
1935         u1Byte                                  max_DIG_cover_bond;\r
1936         u1Byte                                  current_IGI_MaxUp_resolution;\r
1937         u1Byte                                  rx_gain_range_max;\r
1938         u1Byte                                  i = 0;\r
1939         \r
1940         u4Byte                                  total_NHM_cnt;\r
1941         u4Byte                                  DIG_cover_cnt;\r
1942         u4Byte                                  over_DIG_cover_cnt;\r
1943         BOOLEAN                                 ret = TRUE;\r
1944 \r
1945 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
1946         prtl8192cd_priv                         priv = pDM_Odm->priv;\r
1947 \r
1948         max_DIG_cover_bond = DM_DIG_MAX_AP - priv->pshare->rf_ft_var.dig_upcheck_initial_value;\r
1949         current_IGI_MaxUp_resolution = CurIGValue + 6;\r
1950         rx_gain_range_max = pDM_DigTable->rx_gain_range_max;\r
1951         \r
1952         phydm_getNHMresult(pDM_Odm);\r
1953 \r
1954         total_NHM_cnt = CCX_INFO->NHM_result[0] + CCX_INFO->NHM_result[1];\r
1955 \r
1956         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): *****Get NHM results*****\n"));\r
1957         \r
1958         if (total_NHM_cnt != 0) {\r
1959 \r
1960                 /* CurIGValue < max_DIG_cover_bond - 6 */\r
1961                 if (pDM_DigTable->DIG_GoUpCheck_Level == DIG_GOUPCHECK_LEVEL_0) {\r
1962                         DIG_cover_cnt = CCX_INFO->NHM_result[1];\r
1963                         ret = ((priv->pshare->rf_ft_var.dig_level0_ratio_reciprocal * DIG_cover_cnt) >= total_NHM_cnt) ? TRUE : FALSE;\r
1964                 }\r
1965 \r
1966                 /* (max_DIG_cover_bond - 6) <= CurIGValue < DM_DIG_MAX_AP */\r
1967                 else if (pDM_DigTable->DIG_GoUpCheck_Level == DIG_GOUPCHECK_LEVEL_1) {\r
1968                         over_DIG_cover_cnt = CCX_INFO->NHM_result[1];\r
1969                         ret = (priv->pshare->rf_ft_var.dig_level1_ratio_reciprocal * over_DIG_cover_cnt < total_NHM_cnt) ? TRUE : FALSE;\r
1970 \r
1971                         if (!ret) {\r
1972                                 /* update pDM_DigTable->rx_gain_range_max */\r
1973                                 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
1974 \r
1975                                 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
1976                                         pDM_DigTable->rx_gain_range_max));\r
1977                         }\r
1978                 }\r
1979                 \r
1980                 /* CurIGValue > DM_DIG_MAX_AP, foolproof */\r
1981                 else if (pDM_DigTable->DIG_GoUpCheck_Level == DIG_GOUPCHECK_LEVEL_2) {\r
1982                         ret = TRUE;\r
1983                 }\r
1984 \r
1985                 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
1986                         pDM_DigTable->DIG_GoUpCheck_Level, \r
1987                         current_IGI_MaxUp_resolution, \r
1988                         max_DIG_cover_bond,\r
1989                         pDM_DigTable->rx_gain_range_max,\r
1990                         ret));\r
1991 \r
1992                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): NHM_result = %d, %d, %d, %d\n", \r
1993                         CCX_INFO->NHM_result[0], CCX_INFO->NHM_result[1], CCX_INFO->NHM_result[2], CCX_INFO->NHM_result[3]));\r
1994                 \r
1995         }\r
1996         else\r
1997                 ret = TRUE;\r
1998 \r
1999         for (i = 0 ; i <= 10 ; i ++) {\r
2000                 CCX_INFO->NHM_th[i] = 0xFF;\r
2001         }\r
2002         \r
2003         if (CurIGValue < max_DIG_cover_bond - 6){\r
2004                 CCX_INFO->NHM_th[0] = 2 * (CurIGValue - priv->pshare->rf_ft_var.dig_upcheck_initial_value);\r
2005                 pDM_DigTable->DIG_GoUpCheck_Level = DIG_GOUPCHECK_LEVEL_0;\r
2006         }\r
2007         else if (CurIGValue <= DM_DIG_MAX_AP) {\r
2008                 CCX_INFO->NHM_th[0] = 2 * max_DIG_cover_bond;\r
2009                 pDM_DigTable->DIG_GoUpCheck_Level = DIG_GOUPCHECK_LEVEL_1;\r
2010         }\r
2011         /* CurIGValue > DM_DIG_MAX_AP, foolproof */\r
2012         else {\r
2013                 pDM_DigTable->DIG_GoUpCheck_Level = DIG_GOUPCHECK_LEVEL_2;\r
2014                 ret = TRUE;\r
2015         }\r
2016         \r
2017         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): *****Set NHM settings*****\n"));\r
2018         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): DIG_GoUpCheck_level = %d\n", \r
2019                 pDM_DigTable->DIG_GoUpCheck_Level));\r
2020         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): NHM_th = 0x%x, 0x%x, 0x%x\n", \r
2021                 CCX_INFO->NHM_th[0], CCX_INFO->NHM_th[1], CCX_INFO->NHM_th[2]));\r
2022         \r
2023         CCX_INFO->NHM_inexclude_cca = NHM_EXCLUDE_CCA;  \r
2024         CCX_INFO->NHM_inexclude_txon = NHM_EXCLUDE_TXON;\r
2025         CCX_INFO->NHM_period = 0xC350;\r
2026 \r
2027         phydm_NHMsetting(pDM_Odm, SET_NHM_SETTING);\r
2028         phydm_NHMtrigger(pDM_Odm);\r
2029 #endif\r
2030 \r
2031         return ret;\r
2032 }\r
2033 \r
2034 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2035 \r
2036 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)\r
2037 VOID\r
2038 odm_RFEControl(\r
2039         IN      PDM_ODM_T       pDM_Odm,\r
2040         IN  u8Byte              RSSIVal\r
2041         )\r
2042 {\r
2043         PADAPTER                Adapter = (PADAPTER)pDM_Odm->Adapter;\r
2044     HAL_DATA_TYPE       *pHalData = GET_HAL_DATA(Adapter);\r
2045         static u1Byte   TRSW_HighPwr = 0;\r
2046          \r
2047         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",\r
2048                          RSSIVal, TRSW_HighPwr, pHalData->RFEType ));\r
2049 \r
2050     if (pHalData->RFEType == 3) {          \r
2051                 \r
2052         pDM_Odm->RSSI_TRSW = RSSIVal;\r
2053 \r
2054         if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H) \r
2055                 {                                \r
2056             TRSW_HighPwr = 1; // Switch to\r
2057             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control\r
2058             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3);  // Set ANTSW=1/ANTSWB=0  for SW control\r
2059             \r
2060         } \r
2061                 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L) \r
2062         {         \r
2063             TRSW_HighPwr = 0; // Switched back\r
2064             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control\r
2065             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0);  // Set ANTSW=1/ANTSWB=0  for SW control\r
2066 \r
2067         }\r
2068     }  \r
2069 \r
2070         \r
2071         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
2072         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n", \r
2073                                  RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));\r
2074         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));    \r
2075 }\r
2076 \r
2077 VOID\r
2078 odm_MPT_DIGWorkItemCallback(\r
2079     IN PVOID            pContext\r
2080     )\r
2081 {\r
2082         PADAPTER        Adapter = (PADAPTER)pContext;\r
2083         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2084         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
2085 \r
2086         ODM_MPT_DIG(pDM_Odm);\r
2087 }\r
2088 \r
2089 VOID\r
2090 odm_MPT_DIGCallback(\r
2091         PRT_TIMER               pTimer\r
2092 )\r
2093 {\r
2094         PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;\r
2095        HAL_DATA_TYPE    *pHalData = GET_HAL_DATA(Adapter);\r
2096           PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;\r
2097 \r
2098 \r
2099         #if DEV_BUS_TYPE==RT_PCI_INTERFACE\r
2100                 #if USE_WORKITEM\r
2101                         PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\r
2102                 #else\r
2103                         ODM_MPT_DIG(pDM_Odm);\r
2104                 #endif\r
2105         #else\r
2106                 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\r
2107         #endif\r
2108 \r
2109 }\r
2110 \r
2111 #endif\r
2112 \r
2113 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
2114 VOID\r
2115 odm_MPT_DIGCallback(\r
2116         IN              PVOID                                   pDM_VOID\r
2117 )\r
2118 {\r
2119         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2120 #if USE_WORKITEM\r
2121         PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);\r
2122 #else\r
2123         ODM_MPT_DIG(pDM_Odm);\r
2124 #endif\r
2125 }\r
2126 #endif\r
2127 \r
2128 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)\r
2129 VOID\r
2130 odm_MPT_Write_DIG(\r
2131         IN              PVOID                                   pDM_VOID,\r
2132         IN              u1Byte                                  CurIGValue\r
2133 )\r
2134 {\r
2135         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2136         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
2137 \r
2138         ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);\r
2139 \r
2140 #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)\r
2141         /* Set IGI value of CCK for new CCK AGC */\r
2142                 if (pDM_Odm->cck_new_agc) {\r
2143                         if (pDM_Odm->SupportICType & ODM_IC_PHY_STATUE_NEW_TYPE)\r
2144                                 ODM_SetBBReg(pDM_Odm, 0xa0c, 0x00003f00, (CurIGValue>>1));\r
2145                 }\r
2146 \r
2147 #endif\r
2148                         \r
2149         if(pDM_Odm->RFType > ODM_1T1R)\r
2150                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);\r
2151 \r
2152         if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))\r
2153         {\r
2154                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);\r
2155                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);   \r
2156         }\r
2157 \r
2158         pDM_DigTable->CurIGValue = CurIGValue;\r
2159         \r
2160         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));\r
2161         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));\r
2162 }\r
2163 \r
2164 VOID\r
2165 ODM_MPT_DIG(\r
2166         IN              PVOID                                   pDM_VOID\r
2167         )\r
2168 {\r
2169         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2170         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
2171         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);\r
2172         u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;\r
2173         u1Byte                                          DIG_Upper = 0x40, DIG_Lower = 0x20;\r
2174         u4Byte                                          RXOK_cal;\r
2175         u4Byte                                          RxPWDBAve_final;\r
2176         u1Byte                                          IGI_A = 0x20, IGI_B = 0x20;\r
2177         \r
2178 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2179 \r
2180         #if ODM_FIX_2G_DIG\r
2181         IGI_A = 0x22;\r
2182         IGI_B = 0x24;           \r
2183         #endif\r
2184         \r
2185 #else\r
2186         if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))\r
2187                 return;\r
2188 \r
2189         if (*pDM_Odm->pBandType == ODM_BAND_5G)\r
2190                 DIG_Lower = 0x22;\r
2191 #endif\r
2192 \r
2193         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));\r
2194         \r
2195 #if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & ODM_AP))\r
2196         if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))) // for 5G or 8814\r
2197 #else\r
2198         if (1) // for both 2G/5G\r
2199 #endif\r
2200                 {\r
2201                 odm_FalseAlarmCounterStatistics(pDM_Odm);\r
2202 \r
2203                 RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;\r
2204                 RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;\r
2205 \r
2206                 pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\r
2207                 pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\r
2208                 pDM_Odm->RxPWDBAve = 0;\r
2209                 pDM_Odm->MPDIG_2G = FALSE;\r
2210 \r
2211 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2212                 pDM_Odm->Times_2G = 0;\r
2213 #endif\r
2214 \r
2215                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));\r
2216                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));\r
2217         \r
2218                 if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)\r
2219                 {\r
2220                         if (CurrentIGI > 0x24)\r
2221                                 odm_MPT_Write_DIG(pDM_Odm, 0x24);\r
2222                 }\r
2223                 else\r
2224                 {\r
2225                         if(pFalseAlmCnt->Cnt_all > 1000){\r
2226                                 CurrentIGI = CurrentIGI + 8;\r
2227                         }\r
2228                         else if(pFalseAlmCnt->Cnt_all > 200){\r
2229                                 CurrentIGI = CurrentIGI + 4;\r
2230                         }\r
2231                         else if (pFalseAlmCnt->Cnt_all > 50){\r
2232                                 CurrentIGI = CurrentIGI + 2;\r
2233                         }\r
2234                         else if (pFalseAlmCnt->Cnt_all < 2){\r
2235                                 CurrentIGI = CurrentIGI - 2;\r
2236                         }\r
2237                         \r
2238                         if (CurrentIGI < DIG_Lower ){\r
2239                                 CurrentIGI = DIG_Lower;\r
2240                         }\r
2241 \r
2242                         if(CurrentIGI > DIG_Upper){\r
2243                                 CurrentIGI = DIG_Upper;\r
2244                         }\r
2245 \r
2246                         odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);\r
2247                         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
2248                                 CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));\r
2249                 }\r
2250         }\r
2251         else\r
2252         {\r
2253                 if(pDM_Odm->MPDIG_2G == FALSE)\r
2254                 {\r
2255                         if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B)))\r
2256                         {\r
2257                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));\r
2258                                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);\r
2259                                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);\r
2260                                 pDM_DigTable->CurIGValue = IGI_B;\r
2261                         }\r
2262                         else\r
2263                                 odm_MPT_Write_DIG(pDM_Odm, IGI_A);\r
2264                 }\r
2265 \r
2266 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2267                 pDM_Odm->Times_2G++;\r
2268 \r
2269                 if (pDM_Odm->Times_2G == 3)\r
2270 #endif\r
2271                 {\r
2272                         pDM_Odm->MPDIG_2G = TRUE;\r
2273                 }\r
2274         }\r
2275 \r
2276 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2277         if (pDM_Odm->SupportICType == ODM_RTL8812)\r
2278                 odm_RFEControl(pDM_Odm, RxPWDBAve_final);\r
2279 #endif\r
2280 \r
2281         ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);\r
2282 }\r
2283 #endif\r
2284 \r
2285 \r