Merge tag lsk-v3.10-15.03-android
[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         if(pDM_DigTable->CurIGValue != CurrentIGI)
417         {
418                 //1 Check initial gain by upper bound           
419                 if(!pDM_DigTable->bPSDInProgress)
420                 {
421                         if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
422                         {
423                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x) is larger than upper bound !!\n",CurrentIGI));
424                                 CurrentIGI = pDM_DigTable->rx_gain_range_max;
425                         }
426
427                 }
428
429                 //1 Set IGI value
430                 if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
431                 { 
432                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
433
434                         if(pDM_Odm->RFType > ODM_1T1R)
435                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
436
437                         if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
438                         {
439                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
440                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
441                         }
442                 }
443                 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
444                 {
445                         switch(*(pDM_Odm->pOnePathCCA))
446                         {
447                                 case ODM_CCA_2R:
448                                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
449
450                                         if(pDM_Odm->RFType > ODM_1T1R)
451                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
452                                         
453                                         if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
454                                         {
455                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
456                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
457                                         }
458                                         break;
459                                 case ODM_CCA_1R_A:
460                                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
461                                         if(pDM_Odm->RFType != ODM_1T1R)
462                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
463                                         break;
464                                 case ODM_CCA_1R_B:
465                                         ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
466                                         if(pDM_Odm->RFType != ODM_1T1R)
467                                                 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
468                                         break;
469                         }
470                 }
471                 pDM_DigTable->CurIGValue = CurrentIGI;
472         }
473
474         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x). \n",CurrentIGI));
475         
476 }
477
478 VOID
479 odm_PauseDIG(
480         IN              PVOID                                   pDM_VOID,
481         IN              ODM_Pause_DIG_TYPE              PauseType,
482         IN              u1Byte                                  IGIValue
483 )
484 {
485         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
486         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
487
488         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========>\n"));
489
490 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)     
491         if(*pDM_DigTable->pbP2pLinkInProgress)
492         {
493                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): P2P in progress !!\n"));
494                 return;
495         }
496 #endif
497
498         if(!pDM_DigTable->bPauseDIG && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
499         {
500                 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"));
501                 return;
502         }
503         
504         switch(PauseType)
505         {
506                 //1 Pause DIG
507                 case ODM_PAUSE_DIG:
508                         //2 Disable DIG
509                         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
510                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
511
512                         //2 Backup IGI value
513                         if(!pDM_DigTable->bPauseDIG)
514                         {
515                                 pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
516                                 pDM_DigTable->bPauseDIG = TRUE;
517                         }
518                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI  = 0x%x\n", pDM_DigTable->IGIBackup));
519
520                         //2 Write new IGI value
521                         ODM_Write_DIG(pDM_Odm, IGIValue);
522                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue));
523                         break;
524
525                 //1 Resume DIG
526                 case ODM_RESUME_DIG:
527                         if(pDM_DigTable->bPauseDIG)
528                         {
529                                 //2 Write backup IGI value
530                                 ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
531                                 pDM_DigTable->bPauseDIG = FALSE;
532                                 pDM_DigTable->bIgnoreDIG = TRUE;
533                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
534
535                                 //2 Enable DIG
536                                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);  
537                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
538                         }
539                         break;
540
541                 default:
542                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong  type !!\n"));
543                         break;
544         }
545 }
546
547 BOOLEAN 
548 odm_DigAbort(
549         IN              PVOID                   pDM_VOID
550         )
551 {
552         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
553         pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;
554
555 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
556         prtl8192cd_priv priv = pDM_Odm->priv;
557 #elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
558         PADAPTER                pAdapter        = pDM_Odm->Adapter;
559         pRXHP_T                 pRX_HP_Table  = &pDM_Odm->DM_RXHP_Table;
560 #endif
561
562         //SupportAbility
563         if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
564         {
565                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
566                 return  TRUE;
567         }
568
569         //SupportAbility
570         if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))
571         {       
572                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
573                 return  TRUE;
574         }
575
576         //ScanInProcess
577         if(*(pDM_Odm->pbScanInProcess))
578         {
579                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
580                 return  TRUE;
581         }
582
583         if(pDM_DigTable->bIgnoreDIG)
584         {
585                 pDM_DigTable->bIgnoreDIG = FALSE;
586                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Ignore DIG \n"));
587                 return  TRUE;
588         }
589
590         //add by Neil Chen to avoid PSD is processing
591         if(pDM_Odm->bDMInitialGainEnable == FALSE)
592         {
593                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
594                 return  TRUE;
595         }
596
597 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
598         #if OS_WIN_FROM_WIN7(OS_VERSION)
599         if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
600         {
601                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));
602                 return  TRUE;
603         }
604         #endif
605
606         if(pDM_Odm->bBtHsOperation)
607         {
608                 odm_DigForBtHsMode(pDM_Odm);
609         }       
610
611         if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
612         {
613                 if(pRX_HP_Table->RXHP_flag == 1)
614                 {
615                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));
616                         return  TRUE;   
617                 }
618         }
619 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
620         #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV      
621         if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
622         {       
623                 printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
624                 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
625                 return  TRUE;
626         }
627         #endif
628 #else
629         if (!(priv->up_time > 5))
630         {
631                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
632                 return  TRUE;
633         }
634 #endif
635
636         return  FALSE;
637 }
638
639 VOID
640 odm_DIGInit(
641         IN              PVOID           pDM_VOID
642         )
643 {
644         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
645         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
646 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
647         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
648 #endif
649
650         pDM_DigTable->bStopDIG = FALSE;
651         pDM_DigTable->bPauseDIG = FALSE;
652         pDM_DigTable->bIgnoreDIG = FALSE;
653         pDM_DigTable->bPSDInProgress = FALSE;
654         pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
655         pDM_DigTable->RssiLowThresh     = DM_DIG_THRESH_LOW;
656         pDM_DigTable->RssiHighThresh    = DM_DIG_THRESH_HIGH;
657         pDM_DigTable->FALowThresh       = DM_FALSEALARM_THRESH_LOW;
658         pDM_DigTable->FAHighThresh      = DM_FALSEALARM_THRESH_HIGH;
659         pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
660         pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
661         pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
662         pDM_DigTable->PreCCK_CCAThres = 0xFF;
663         pDM_DigTable->CurCCK_CCAThres = 0x83;
664         pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
665         pDM_DigTable->LargeFAHit = 0;
666         pDM_DigTable->Recover_cnt = 0;
667         pDM_DigTable->bMediaConnect_0 = FALSE;
668         pDM_DigTable->bMediaConnect_1 = FALSE;
669
670         //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
671         pDM_Odm->bDMInitialGainEnable = TRUE;
672
673 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
674         pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;
675         pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;
676
677         // For AP\ ADSL modified DIG
678         pDM_DigTable->bTpTarget = FALSE;
679         pDM_DigTable->bNoiseEst = TRUE;
680         pDM_DigTable->IGIOffset_A = 0;
681         pDM_DigTable->IGIOffset_B = 0;
682         pDM_DigTable->TpTrainTH_min = 0;
683
684         // For RTL8881A
685         FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
686
687         //Dyanmic EDCCA
688         if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
689         {
690                 ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
691         }
692 #else
693         pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
694         pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
695
696         //To Initi BT30 IGI
697         pDM_DigTable->BT30_CurIGI=0x32;
698
699         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
700         *pDM_DigTable->pbP2pLinkInProgress= FALSE;
701         #endif
702 #endif
703
704         if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
705         {
706                 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
707                 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
708         }
709         else
710         {
711                 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
712                 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
713         }
714         
715 }
716
717
718 VOID 
719 odm_DIG(
720         IN              PVOID           pDM_VOID
721         )
722 {
723         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
724 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
725         PADAPTER                                        pAdapter        = pDM_Odm->Adapter;
726         HAL_DATA_TYPE                           *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
727 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
728         prtl8192cd_priv                         priv = pDM_Odm->priv;
729         PSTA_INFO_T                             pEntry;
730 #endif
731
732         // Common parameters
733         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
734         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
735         BOOLEAN                                         FirstConnect,FirstDisConnect;
736         u1Byte                                          DIG_MaxOfMin, DIG_Dynamic_MIN;
737         u1Byte                                          dm_dig_max, dm_dig_min;
738         u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;
739         u1Byte                                          offset;
740         u4Byte                                          dm_FA_thres[3];
741         u1Byte                                          Adap_IGI_Upper = 0;
742         u4Byte                                          TxTp = 0, RxTp = 0;
743         BOOLEAN                                         bDFSBand = FALSE;
744         BOOLEAN                                         bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;
745 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
746         u4Byte                                          TpTrainTH_MIN = DM_DIG_TP_Target_TH0;
747         static          u1Byte                  TimeCnt = 0;
748         u1Byte                                          i;
749 #endif
750
751         if(odm_DigAbort(pDM_Odm) == TRUE)
752                 return;
753
754         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
755
756         if(pDM_Odm->adaptivity_flag == TRUE)
757                 Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper;
758         
759
760         //1 Update status
761 #if (RTL8192D_SUPPORT==1) 
762         if(pDM_Odm->SupportICType == ODM_RTL8192D)
763         {
764                 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
765                 {
766                         if(*(pDM_Odm->pbMasterOfDMSP))
767                         {
768                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
769                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
770                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
771                         }
772                         else
773                         {
774                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
775                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
776                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
777                         }
778                 }
779                 else
780                 {
781                         if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
782                         {
783                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
784                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
785                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
786                         }
787                         else
788                         {
789                                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
790                                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
791                                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
792                         }
793                 }
794         }
795         else
796 #endif
797         {       
798                 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
799                 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
800                 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
801         }
802
803 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
804         //1 Noise Floor Estimate
805         //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;
806         //odm_InbandNoiseCalculate (pDM_Odm);
807         
808         //1 Mode decision
809         if(pDM_Odm->bLinked)
810         {
811                 //2 Calculate total TP
812                 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
813                 {
814                         pEntry = pDM_Odm->pODM_StaInfo[i];
815                         if(IS_STA_VALID(pEntry))
816                         {
817                                 RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
818                                 TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7);                        //Kbps
819                         }
820                 }
821                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
822         }
823
824         switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
825         {
826                 case 0:
827                 {
828                         bPerformance = TRUE;
829                         break;
830                 }
831                 case 1:
832                 {
833                         bPerformance = FALSE;
834                         break;
835                 }
836                 case 2:
837                 {
838                         if(pDM_Odm->bLinked)
839                         {
840                                 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
841                                         TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
842
843                                 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
844                                         TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
845
846                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
847
848                                 //2 Decide DIG mode by total TP
849                                 if((TxTp + RxTp) > DM_DIG_TP_Target_TH1)                        // change to performance mode
850                                 {
851                                         bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
852                                         pDM_DigTable->bTpTarget = TRUE;
853                                         bPerformance = TRUE;
854                                 }
855                                 else if((TxTp + RxTp) < TpTrainTH_MIN)  // change to coverage mode
856                                 {
857                                         bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
858                                         
859                                         if(TimeCnt < DM_DIG_TP_Training_Period)
860                                         {
861                                                 pDM_DigTable->bTpTarget = FALSE;
862                                                 bPerformance = FALSE;
863                                                 TimeCnt++;
864                                         }
865                                         else
866                                         {
867                                                 pDM_DigTable->bTpTarget = TRUE;
868                                                 bPerformance = TRUE;
869                                                 bFirstTpTarget = TRUE;
870                                                 TimeCnt = 0;
871                                         }
872                                 }
873                                 else                                                                            // remain previous mode
874                                 {
875                                         bPerformance = pDM_DigTable->bTpTarget;
876
877                                         if(!bPerformance)
878                                         {
879                                                 if(TimeCnt < DM_DIG_TP_Training_Period)
880                                                         TimeCnt++;
881                                                 else
882                                                 {
883                                                         pDM_DigTable->bTpTarget = TRUE;
884                                                         bPerformance = TRUE;
885                                                         bFirstTpTarget = TRUE;
886                                                         TimeCnt = 0;
887                                                 }
888                                         }
889                                 }
890
891                                 if(!bPerformance)
892                                         pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
893
894                         }
895                         else
896                         {
897                                 bPerformance = FALSE;
898                                 pDM_DigTable->TpTrainTH_min = 0;
899                         }
900                         break;
901                 }
902                 default:
903                         bPerformance = TRUE;
904         }
905
906         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));
907         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));
908 #endif
909
910         //1 Boundary Decision
911 #if (RTL8192C_SUPPORT==1) 
912         if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
913         {
914                 //2 High power case
915                 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
916                 {
917                         dm_dig_max = DM_DIG_MAX_AP_HP;
918                         dm_dig_min = DM_DIG_MIN_AP_HP;
919                 }
920                 else
921                 {
922                         dm_dig_max = DM_DIG_MAX_NIC_HP;
923                         dm_dig_min = DM_DIG_MIN_NIC_HP;
924                 }
925                 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
926         }
927         else
928 #endif
929         {
930 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
931                 //2 For AP\ADSL
932                 if(!bPerformance)
933                 {
934                         dm_dig_max = DM_DIG_MAX_AP_COVERAGR;
935                         dm_dig_min = DM_DIG_MIN_AP_COVERAGE;
936                         DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;
937                 }
938                 else
939                 {
940                         dm_dig_max = DM_DIG_MAX_AP;
941                         dm_dig_min = DM_DIG_MIN_AP;
942                         DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
943                 }
944
945                 //4 DFS band
946                 if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||
947                         ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))
948                 {
949                         bDFSBand = TRUE;
950                         dm_dig_min = DM_DIG_MIN_AP_DFS;
951                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));
952                 }
953                 
954                 //4 TX2path
955                 if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))
956                                 dm_dig_max = 0x2A;
957
958 #if RTL8192E_SUPPORT
959 #ifdef HIGH_POWER_EXT_LNA
960                 if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
961                         dm_dig_max = 0x42;                                              
962 #endif
963 #endif
964
965 #else
966                 //2 For WIN\CE
967                 if(pDM_Odm->SupportICType >= ODM_RTL8188E)
968                         dm_dig_max = 0x5A;
969                 else
970                         dm_dig_max = DM_DIG_MAX_NIC;
971                 
972                 if(pDM_Odm->SupportICType != ODM_RTL8821)
973                         dm_dig_min = DM_DIG_MIN_NIC;
974                 else
975                         dm_dig_min = 0x1C;
976
977                 DIG_MaxOfMin = DM_DIG_MAX_AP;
978 #endif  
979         }
980         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));
981
982 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
983         // for P2P case
984         if(0 < *pDM_Odm->pu1ForcedIgiLb)
985         {
986                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));
987                 dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
988                 dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
989         }
990 #endif
991
992         //1 Adjust boundary by RSSI
993         if(pDM_Odm->bLinked && bPerformance)
994         {
995                 //2 Modify DIG upper bound
996 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
997                 offset = 15;
998 #else
999                 //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT
1000                 if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))
1001                 {
1002                         offset = 10;
1003                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));          
1004                 }
1005                 else
1006                         offset = 15;
1007 #endif
1008
1009                 if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
1010                         pDM_DigTable->rx_gain_range_max = dm_dig_max;
1011                 else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
1012                         pDM_DigTable->rx_gain_range_max = dm_dig_min;
1013                 else
1014                         pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
1015
1016 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1017                 //2 Modify DIG lower bound
1018                 //if(pDM_Odm->bOneEntryOnly)
1019                 {
1020                         if(pDM_Odm->RSSI_Min < dm_dig_min)
1021                                 DIG_Dynamic_MIN = dm_dig_min;
1022                         else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
1023                                 DIG_Dynamic_MIN = DIG_MaxOfMin;
1024                         else
1025                                 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1026                 }
1027 #else
1028                 {
1029                         //4 For AP
1030 #ifdef __ECOS
1031                         HAL_REORDER_BARRIER();
1032 #else
1033                         rmb();
1034 #endif
1035                         if (bDFSBand)
1036                         {
1037                                 DIG_Dynamic_MIN = dm_dig_min;
1038                                 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));
1039                         }
1040                         else 
1041                         {
1042                                 if(pDM_Odm->RSSI_Min < dm_dig_min)
1043                                         DIG_Dynamic_MIN = dm_dig_min;
1044                                 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
1045                                         DIG_Dynamic_MIN = DIG_MaxOfMin;
1046                                 else
1047                                         DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1048                         }
1049                 }
1050 #endif
1051         }
1052         else
1053         {
1054 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1055                 if(bPerformance && bDFSBand)
1056                 {
1057                         pDM_DigTable->rx_gain_range_max = 0x28;
1058                         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));
1059                 }
1060                 else
1061 #endif
1062                 {
1063                         pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;
1064                 }
1065                 DIG_Dynamic_MIN = dm_dig_min;
1066         }
1067         
1068         //1 Force Lower Bound for AntDiv
1069         if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)
1070         {
1071                 if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
1072                 {
1073                         if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
1074                         {
1075                                 if(pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
1076                                         DIG_Dynamic_MIN = DIG_MaxOfMin;
1077                                 else
1078                                         DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
1079                                 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));
1080                                 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));
1081                         }
1082                 }
1083         }
1084         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",
1085                 pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));
1086         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",
1087                 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));
1088
1089         //1 Modify DIG lower bound, deal with abnormal case
1090         //2 Abnormal false alarm case
1091 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1092         if(bDFSBand)
1093         {
1094                 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
1095         }
1096         else
1097 #endif
1098         {
1099                 if(!pDM_Odm->bLinked)
1100                 {
1101                         pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
1102
1103                         if(FirstDisConnect)
1104                         pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
1105                 }
1106                 else
1107                         pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
1108         }
1109
1110         //2 Abnormal # beacon case
1111 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1112         if(pDM_Odm->bLinked && !FirstConnect)
1113         {
1114                 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
1115                 {
1116                         pDM_DigTable->rx_gain_range_min = dm_dig_min;
1117                         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",
1118                                 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));
1119                 }
1120         }
1121 #endif
1122
1123         //2 Abnormal lower bound case
1124         if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
1125         {
1126                 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
1127                 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));
1128         }
1129
1130         
1131         //1 False alarm threshold decision
1132         odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);
1133         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]));
1134
1135         //1 Adjust initial gain by false alarm
1136         if(pDM_Odm->bLinked && bPerformance)
1137         {
1138                 //2 After link
1139                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
1140
1141                 if(bFirstTpTarget || (FirstConnect && bPerformance))
1142                 {       
1143                         pDM_DigTable->LargeFAHit = 0;
1144                         
1145 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1146                         if(bDFSBand)
1147                         {
1148                                 if(pDM_Odm->RSSI_Min > 0x28)
1149                                         CurrentIGI = 0x28;
1150                                 else
1151                                         CurrentIGI = pDM_Odm->RSSI_Min;
1152                                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));
1153                         }
1154                         else
1155 #endif
1156                         {
1157                                 if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)
1158                                 {
1159                                         if(CurrentIGI < pDM_Odm->RSSI_Min)
1160                                                 CurrentIGI = pDM_Odm->RSSI_Min;
1161                                 }
1162                                 else
1163                                 {
1164                                         if(CurrentIGI < DIG_MaxOfMin)
1165                                                 CurrentIGI = DIG_MaxOfMin;
1166                                 }
1167
1168 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1169 #if (RTL8812A_SUPPORT==1) 
1170                                 if(pDM_Odm->SupportICType == ODM_RTL8812)
1171                                         ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
1172 #endif
1173 #endif
1174                         }
1175
1176                         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));
1177
1178                 }
1179                 else
1180                 {
1181                         if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
1182                                 CurrentIGI = CurrentIGI + 4;
1183                         else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
1184                                 CurrentIGI = CurrentIGI + 2;
1185                         else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
1186                                 CurrentIGI = CurrentIGI - 2;
1187
1188                         //4 Abnormal # beacon case
1189 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1190                         if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
1191                         {                                               
1192                                 CurrentIGI = pDM_DigTable->rx_gain_range_min;
1193                                 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", 
1194                                         pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));
1195                         }
1196 #endif
1197                 }
1198         }       
1199         else
1200         {
1201                 //2 Before link
1202                 ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
1203                 
1204                 if(FirstDisConnect || bFirstCoverage)
1205                 {
1206                         CurrentIGI = dm_dig_min;
1207                         ODM_RT_TRACE(pDM_Odm,   ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));
1208                 }
1209                 else
1210                 {
1211                         if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
1212                                 CurrentIGI = CurrentIGI + 4;
1213                         else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
1214                                 CurrentIGI = CurrentIGI + 2;
1215                         else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
1216                                 CurrentIGI = CurrentIGI - 2;
1217                 }
1218         }
1219
1220         //1 Check initial gain by upper/lower bound
1221         if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
1222                 CurrentIGI = pDM_DigTable->rx_gain_range_min;
1223         
1224         if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
1225                 CurrentIGI = pDM_DigTable->rx_gain_range_max;
1226
1227         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));
1228
1229         //1 Force upper bound and lower bound for adaptivity
1230         if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
1231         {
1232                 if(CurrentIGI > Adap_IGI_Upper)
1233                         CurrentIGI = Adap_IGI_Upper;
1234                 
1235                 if(pDM_Odm->IGI_LowerBound != 0)
1236                 {
1237                         if(CurrentIGI < pDM_Odm->IGI_LowerBound)
1238                                 CurrentIGI = pDM_Odm->IGI_LowerBound;
1239                 }
1240                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", Adap_IGI_Upper));
1241                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force lower bound to 0x%x !!!!!!\n\n", pDM_Odm->IGI_LowerBound));
1242         }
1243         
1244
1245         //1 High power RSSI threshold
1246 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1247         if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
1248         {
1249                 // High power IGI lower bound
1250                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
1251                 if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
1252                 {
1253                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
1254                         //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
1255                         CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
1256                 }
1257         }
1258         if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
1259         {
1260                 if(pHalData->UndecoratedSmoothedPWDB > 0x28)
1261                 {
1262                         if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
1263                         {
1264                                 //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1265                                 CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1266                         }       
1267                 } 
1268         }
1269 #endif
1270
1271         //1 Update status
1272 #if (RTL8192D_SUPPORT==1) 
1273         if(pDM_Odm->SupportICType == ODM_RTL8192D)
1274         {
1275                 //sherry  delete DualMacSmartConncurrent 20110517
1276                 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
1277                 {
1278                         ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
1279                         if(*(pDM_Odm->pbMasterOfDMSP))
1280                         {
1281                                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1282                                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1283                         }
1284                         else
1285                         {
1286                                 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1287                                 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1288                         }
1289                 }
1290                 else
1291                 {
1292                         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1293                         if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
1294                         {
1295                                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1296                                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1297                         }
1298                         else
1299                         {
1300                                 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1301                                 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1302                         }
1303                 }
1304         }
1305         else
1306 #endif
1307         {
1308 #if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))
1309                 if(pDM_Odm->bBtHsOperation)
1310                 {
1311                         if(pDM_Odm->bLinked)
1312                         {
1313                                 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
1314                                         ODM_Write_DIG(pDM_Odm, CurrentIGI);
1315                                 else
1316                                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
1317                                         
1318                                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1319                                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1320                         }
1321                         else
1322                         {
1323                                 if(pDM_Odm->bLinkInProcess)
1324                                         ODM_Write_DIG(pDM_Odm, 0x1c);
1325                                 else if(pDM_Odm->bBtConnectProcess)
1326                                         ODM_Write_DIG(pDM_Odm, 0x28);
1327                                 else
1328                                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);   
1329                         }
1330                 }
1331                 else            // BT is not using
1332 #endif
1333                 {
1334                         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1335                         pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1336                         pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1337                 }
1338         }
1339 }
1340
1341 VOID
1342 odm_DIGbyRSSI_LPS(
1343         IN              PVOID           pDM_VOID
1344         )
1345 {
1346 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1347         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1348         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1349
1350 #if (DM_ODM_SUPPORT_TYPE & ODM_CE)
1351 #if 0           //and 2.3.5 coding rule
1352         struct mlme_priv        *pmlmepriv = &(pAdapter->mlmepriv);
1353         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);     
1354         struct dm_priv  *pdmpriv = &pHalData->dmpriv;
1355 #endif
1356 #endif
1357
1358         u1Byte  RSSI_Lower=DM_DIG_MIN_NIC;   //0x1E or 0x1C
1359         u1Byte  CurrentIGI=pDM_Odm->RSSI_Min;
1360
1361         if(odm_DigAbort(pDM_Odm) == TRUE)
1362                 return;
1363
1364         CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
1365
1366         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
1367
1368         // Using FW PS mode to make IGI
1369         //Adjust by  FA in LPS MODE
1370         if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
1371                 CurrentIGI = CurrentIGI+4;
1372         else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
1373                 CurrentIGI = CurrentIGI+2;
1374         else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
1375                 CurrentIGI = CurrentIGI-2;      
1376
1377
1378         //Lower bound checking
1379
1380         //RSSI Lower bound check
1381         if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
1382                 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
1383         else
1384                 RSSI_Lower =DM_DIG_MIN_NIC;
1385
1386         //Upper and Lower Bound checking
1387          if(CurrentIGI > DM_DIG_MAX_NIC)
1388                 CurrentIGI=DM_DIG_MAX_NIC;
1389          else if(CurrentIGI < RSSI_Lower)
1390                 CurrentIGI =RSSI_Lower;
1391
1392         
1393         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));
1394         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));
1395         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));
1396
1397         ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1398 #endif
1399 }
1400
1401 //3============================================================
1402 //3 FASLE ALARM CHECK
1403 //3============================================================
1404
1405 VOID 
1406 odm_FalseAlarmCounterStatistics(
1407         IN              PVOID           pDM_VOID
1408         )
1409 {
1410         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1411         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1412         u4Byte                                          ret_value;
1413
1414 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
1415 //Mark there, and check this in odm_DMWatchDog
1416 #if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)
1417         prtl8192cd_priv priv            = pDM_Odm->priv;
1418         if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
1419                 return;
1420 #endif
1421 #endif
1422
1423 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1424         if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
1425                 (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&&    ////modify by Guo.Mingzhi 2011-12-29
1426                 (!(*(pDM_Odm->pbMasterOfDMSP))))
1427         {
1428                 odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
1429                 return;
1430         }
1431 #endif          
1432
1433         if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
1434                 return;
1435
1436 #if (ODM_IC_11N_SERIES_SUPPORT == 1) 
1437         if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
1438         {
1439
1440                 //hold ofdm counter
1441                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
1442                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
1443         
1444                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
1445                 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
1446                 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);         
1447
1448                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
1449                 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); 
1450                 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);    
1451
1452                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
1453                 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
1454                 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
1455
1456                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
1457                 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
1458
1459                 FalseAlmCnt->Cnt_Ofdm_fail =    FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
1460                                                                 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
1461                                                                 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
1462
1463 #if (RTL8188E_SUPPORT==1)
1464                 if(pDM_Odm->SupportICType == ODM_RTL8188E)
1465                 {
1466                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
1467                         FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
1468                         FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
1469                 }
1470 #endif
1471
1472 #if (RTL8192D_SUPPORT==1) 
1473                 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1474                 {
1475                         odm_GetCCKFalseAlarm_92D(pDM_Odm);
1476                 }
1477                 else
1478 #endif
1479                 {
1480                         //hold cck counter
1481                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1); 
1482                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1); 
1483                 
1484                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
1485                         FalseAlmCnt->Cnt_Cck_fail = ret_value;
1486
1487                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
1488                         FalseAlmCnt->Cnt_Cck_fail +=  (ret_value& 0xff)<<8;
1489
1490                         ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
1491                         FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
1492                 }
1493         
1494                 FalseAlmCnt->Cnt_all = (        FalseAlmCnt->Cnt_Fast_Fsync + 
1495                                                         FalseAlmCnt->Cnt_SB_Search_fail +
1496                                                         FalseAlmCnt->Cnt_Parity_Fail +
1497                                                         FalseAlmCnt->Cnt_Rate_Illegal +
1498                                                         FalseAlmCnt->Cnt_Crc8_fail +
1499                                                         FalseAlmCnt->Cnt_Mcs_fail +
1500                                                         FalseAlmCnt->Cnt_Cck_fail);     
1501
1502                 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
1503
1504 #if (RTL8192C_SUPPORT==1)
1505                 if(pDM_Odm->SupportICType == ODM_RTL8192C)
1506                         odm_ResetFACounter_92C(pDM_Odm);
1507 #endif
1508
1509 #if (RTL8192D_SUPPORT==1)
1510                 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1511                         odm_ResetFACounter_92D(pDM_Odm);
1512 #endif
1513
1514                 if(pDM_Odm->SupportICType >=ODM_RTL8723A)
1515                 {
1516                         //reset false alarm counter registers
1517                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
1518                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
1519                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
1520                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
1521
1522                         //update ofdm counter
1523                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
1524                         ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
1525
1526                         //reset CCK CCA counter
1527                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0); 
1528                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2); 
1529                         //reset CCK FA counter
1530                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0); 
1531                         ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2); 
1532                 }
1533                 
1534                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
1535                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
1536                         FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
1537                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
1538                         FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
1539                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
1540                 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
1541         }
1542 #endif
1543
1544 #if (ODM_IC_11AC_SERIES_SUPPORT == 1) 
1545         if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
1546         {
1547                 u4Byte CCKenable;
1548                 
1549                 //read OFDM FA counter
1550                 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
1551                 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
1552
1553                 //read CCK/OFDM CCA counter
1554                 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);
1555                 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;
1556                 FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;
1557
1558 #if (RTL8881A_SUPPORT==1) 
1559                 // For 8881A
1560                 if(pDM_Odm->SupportICType == ODM_RTL8881A)
1561                 {
1562                         u4Byte Cnt_Ofdm_fail_temp = 0;
1563                 
1564                         if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
1565                         {
1566                                 Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;
1567                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
1568                                 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;
1569                         }
1570                         else
1571                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
1572                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail_pre));
1573                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail_pre=%d\n",  Cnt_Ofdm_fail_temp));
1574                         
1575                         // Reset FA counter by enable/disable OFDM
1576                         if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
1577                         {
1578                                 // reset OFDM
1579                                 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);
1580                                 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);
1581                                 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
1582                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Reset false alarm counter\n"));
1583                         }
1584                 }
1585 #endif
1586
1587                 // reset OFDM FA coutner
1588                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
1589                 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
1590
1591                 // reset CCK FA counter
1592                 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
1593                 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
1594
1595                 // reset CCA counter
1596                 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);
1597                 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);
1598
1599                 CCKenable =  ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
1600                 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
1601                 {
1602                         FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
1603                         FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;
1604                 }
1605                 else
1606                 {
1607                         FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
1608                         FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
1609                 }
1610
1611         }
1612 #endif
1613
1614         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_OFDM_CCA=%d\n",       FalseAlmCnt->Cnt_OFDM_CCA));
1615         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCK_CCA=%d\n",        FalseAlmCnt->Cnt_CCK_CCA));
1616         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCA_all=%d\n",        FalseAlmCnt->Cnt_CCA_all));
1617         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail));
1618         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n",       FalseAlmCnt->Cnt_Cck_fail));
1619         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n",      FalseAlmCnt->Cnt_Ofdm_fail));
1620         ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n",  FalseAlmCnt->Cnt_all));
1621 }
1622
1623 //3============================================================
1624 //3 CCK Packet Detect Threshold
1625 //3============================================================
1626
1627 VOID
1628 odm_PauseCCKPacketDetection(
1629         IN              PVOID                                   pDM_VOID,
1630         IN              ODM_Pause_CCKPD_TYPE    PauseType,
1631         IN              u1Byte                                  CCKPDThreshold
1632 )
1633 {
1634         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1635         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
1636         static  BOOLEAN         bPaused = FALSE;
1637
1638         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========>\n"));
1639
1640 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)     
1641         if(*pDM_DigTable->pbP2pLinkInProgress)
1642         {
1643                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("P2P in progress !!\n"));
1644                 return;
1645         }
1646 #endif
1647
1648         if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
1649         {
1650                 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"));
1651                 return;
1652         }
1653
1654         switch(PauseType)
1655         {
1656                 //1 Pause CCK Packet Detection Threshold
1657                 case ODM_PAUSE_CCKPD:
1658                         //2 Disable DIG
1659                         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));
1660                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Pause CCK packet detection threshold !!\n"));
1661
1662                         //2 Backup CCK Packet Detection Threshold value
1663                         if(!bPaused)
1664                         {
1665                                 pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
1666                                 bPaused = TRUE;
1667                         }
1668                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Backup CCK packet detection tgreshold  = %d\n", pDM_DigTable->CCKPDBackup));
1669
1670                         //2 Write new CCK Packet Detection Threshold value
1671                         ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);
1672                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write new CCK packet detection tgreshold = %d\n", CCKPDThreshold));
1673                         break;
1674                         
1675                 //1 Resume CCK Packet Detection Threshold
1676                 case ODM_RESUME_CCKPD:
1677                         if(bPaused)
1678                         {
1679                                 //2 Write backup CCK Packet Detection Threshold value
1680                                 ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
1681                                 bPaused = FALSE;
1682                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write original CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
1683
1684                                 //2 Enable CCK Packet Detection Threshold
1685                                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);               
1686                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Resume CCK packet detection threshold  !!\n"));
1687                         }
1688                         break;
1689                         
1690                 default:
1691                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Wrong  type !!\n"));
1692                         break;
1693         }       
1694         return;
1695 }
1696
1697
1698 VOID 
1699 odm_CCKPacketDetectionThresh(
1700         IN              PVOID           pDM_VOID
1701         )
1702 {
1703         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1704         PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1705         u1Byte                                          CurCCK_CCAThres;
1706
1707
1708 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1709 //modify by Guo.Mingzhi 2011-12-29
1710         if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
1711 //      if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
1712                 return;
1713         if(pDM_Odm->bBtHsOperation)
1714         {
1715                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
1716                 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
1717                 return;
1718         }
1719 #endif
1720
1721         if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
1722         {
1723                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  return==========\n"));
1724                 return;
1725         }
1726
1727 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1728         if(pDM_Odm->ExtLNA)
1729                 return;
1730 #endif
1731
1732         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  ==========>\n"));
1733
1734         if(pDM_Odm->bLinked)
1735         {
1736                 if(pDM_Odm->RSSI_Min > 25)
1737                         CurCCK_CCAThres = 0xcd;
1738                 else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
1739                         CurCCK_CCAThres = 0x83;
1740                 else
1741                 {
1742                         if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1743                                 CurCCK_CCAThres = 0x83;
1744                         else
1745                                 CurCCK_CCAThres = 0x40;
1746                 }
1747         }
1748         else
1749         {
1750                 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1751                         CurCCK_CCAThres = 0x83;
1752                 else
1753                         CurCCK_CCAThres = 0x40;
1754         }
1755         
1756 #if (RTL8192D_SUPPORT==1) 
1757         if((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))
1758                 ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
1759         else
1760 #endif
1761                 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
1762
1763         ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh()  CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));
1764 }
1765
1766 VOID
1767 ODM_Write_CCK_CCA_Thres(
1768         IN      PVOID                   pDM_VOID,
1769         IN      u1Byte                  CurCCK_CCAThres
1770         )
1771 {
1772         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1773         pDIG_T                          pDM_DigTable = &pDM_Odm->DM_DigTable;
1774
1775         if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres)              //modify by Guo.Mingzhi 2012-01-03
1776         {
1777                 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
1778         }
1779         pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
1780         pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
1781 }
1782
1783 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1784
1785 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
1786 VOID
1787 odm_RFEControl(
1788         IN      PDM_ODM_T       pDM_Odm,
1789         IN  u8Byte              RSSIVal
1790         )
1791 {
1792         PADAPTER                Adapter = (PADAPTER)pDM_Odm->Adapter;
1793     HAL_DATA_TYPE       *pHalData = GET_HAL_DATA(Adapter);
1794         static u1Byte   TRSW_HighPwr = 0;
1795          
1796         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
1797                          RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
1798
1799     if (pHalData->RFEType == 3) {          
1800                 
1801         pDM_Odm->RSSI_TRSW = RSSIVal;
1802
1803         if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H) 
1804                 {                                
1805             TRSW_HighPwr = 1; // Switch to
1806             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
1807             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3);  // Set ANTSW=1/ANTSWB=0  for SW control
1808             
1809         } 
1810                 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L) 
1811         {         
1812             TRSW_HighPwr = 0; // Switched back
1813             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1);  // Set ANTSW=1/ANTSWB=0  for SW control
1814             PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0);  // Set ANTSW=1/ANTSWB=0  for SW control
1815
1816         }
1817     }  
1818
1819         
1820         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));           
1821         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n", 
1822                                  RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
1823         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));    
1824 }
1825
1826 VOID
1827 odm_MPT_DIGWorkItemCallback(
1828     IN PVOID            pContext
1829     )
1830 {
1831         PADAPTER        Adapter = (PADAPTER)pContext;
1832         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);
1833         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;
1834
1835         ODM_MPT_DIG(pDM_Odm);
1836 }
1837
1838 VOID
1839 odm_MPT_DIGCallback(
1840         PRT_TIMER               pTimer
1841 )
1842 {
1843         PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;
1844        HAL_DATA_TYPE    *pHalData = GET_HAL_DATA(Adapter);
1845           PDM_ODM_T             pDM_Odm = &pHalData->DM_OutSrc;
1846
1847
1848         #if DEV_BUS_TYPE==RT_PCI_INTERFACE
1849                 #if USE_WORKITEM
1850                         PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1851                 #else
1852                         ODM_MPT_DIG(pDM_Odm);
1853                 #endif
1854         #else
1855                 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1856         #endif
1857
1858 }
1859
1860 #endif
1861
1862 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1863 VOID
1864 odm_MPT_DIGCallback(
1865         IN              PVOID                                   pDM_VOID
1866 )
1867 {
1868         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1869 #if USE_WORKITEM
1870         PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1871 #else
1872         ODM_MPT_DIG(pDM_Odm);
1873 #endif
1874 }
1875 #endif
1876
1877 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
1878 VOID
1879 odm_MPT_Write_DIG(
1880         IN              PVOID                                   pDM_VOID,
1881         IN              u1Byte                                  CurIGValue
1882 )
1883 {
1884         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1885         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
1886
1887         ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
1888
1889         if(pDM_Odm->RFType > ODM_1T1R)
1890                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
1891
1892         if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
1893         {
1894                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
1895                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);   
1896         }
1897
1898         pDM_DigTable->CurIGValue = CurIGValue;
1899         
1900         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));
1901         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));
1902 }
1903
1904 VOID
1905 ODM_MPT_DIG(
1906         IN              PVOID                                   pDM_VOID
1907         )
1908 {
1909         PDM_ODM_T                                       pDM_Odm = (PDM_ODM_T)pDM_VOID;
1910         pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;
1911         PFALSE_ALARM_STATISTICS         pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1912         u1Byte                                          CurrentIGI = pDM_DigTable->CurIGValue;
1913         u1Byte                                          DIG_Upper = 0x40, DIG_Lower = 0x20;
1914         u4Byte                                          RXOK_cal;
1915         u4Byte                                          RxPWDBAve_final;
1916         u1Byte                                          IGI_A = 0x20, IGI_B = 0x20;
1917         
1918 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1919
1920         #if ODM_FIX_2G_DIG
1921         IGI_A = 0x22;
1922         IGI_B = 0x24;           
1923         #endif
1924         
1925 #else
1926         if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
1927                 return;
1928
1929         if (*pDM_Odm->pBandType == ODM_BAND_5G)
1930                 DIG_Lower = 0x22;
1931 #endif
1932
1933         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
1934         
1935 #if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)))
1936         if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & ODM_RTL8814A)) // for 5G or 8814
1937 #else
1938         if (1) // for both 2G/5G
1939 #endif
1940                 {
1941                 odm_FalseAlarmCounterStatistics(pDM_Odm);
1942
1943                 RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
1944                 RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
1945
1946                 pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
1947                 pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
1948                 pDM_Odm->RxPWDBAve = 0;
1949                 pDM_Odm->MPDIG_2G = FALSE;
1950
1951 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1952                 pDM_Odm->Times_2G = 0;
1953 #endif
1954
1955                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
1956                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));
1957         
1958                 if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
1959                 {
1960                         if (CurrentIGI > 0x24)
1961                                 odm_MPT_Write_DIG(pDM_Odm, 0x24);
1962                 }
1963                 else
1964                 {
1965                         if(pFalseAlmCnt->Cnt_all > 1000){
1966                                 CurrentIGI = CurrentIGI + 8;
1967                         }
1968                         else if(pFalseAlmCnt->Cnt_all > 200){
1969                                 CurrentIGI = CurrentIGI + 4;
1970                         }
1971                         else if (pFalseAlmCnt->Cnt_all > 50){
1972                                 CurrentIGI = CurrentIGI + 2;
1973                         }
1974                         else if (pFalseAlmCnt->Cnt_all < 2){
1975                                 CurrentIGI = CurrentIGI - 2;
1976                         }
1977                         
1978                         if (CurrentIGI < DIG_Lower ){
1979                                 CurrentIGI = DIG_Lower;
1980                         }
1981
1982                         if(CurrentIGI > DIG_Upper){
1983                                 CurrentIGI = DIG_Upper;
1984                         }
1985
1986                         odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);
1987                         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", 
1988                                 CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
1989                 }
1990         }
1991         else
1992         {
1993                 if(pDM_Odm->MPDIG_2G == FALSE)
1994                 {
1995                         if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A))
1996                         {
1997                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));
1998                                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);
1999                                 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);
2000                                 pDM_DigTable->CurIGValue = IGI_B;
2001                         }
2002                         else
2003                                 odm_MPT_Write_DIG(pDM_Odm, IGI_A);
2004                 }
2005
2006 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2007                 pDM_Odm->Times_2G++;
2008
2009                 if (pDM_Odm->Times_2G == 3)
2010 #endif
2011                 {
2012                         pDM_Odm->MPDIG_2G = TRUE;
2013                 }
2014         }
2015
2016 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2017         if (pDM_Odm->SupportICType == ODM_RTL8812)
2018                 odm_RFEControl(pDM_Odm, RxPWDBAve_final);
2019 #endif
2020
2021         ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
2022 }
2023 #endif