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