1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
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
19 ******************************************************************************/
21 //============================================================
23 //============================================================
24 #include "Mp_Precomp.h"
25 #include "phydm_precomp.h"
29 ODM_ChangeDynamicInitGainThresh(
35 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
36 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
38 if (DM_Type == DIG_TYPE_THRESH_HIGH)
40 pDM_DigTable->RssiHighThresh = DM_Value;
42 else if (DM_Type == DIG_TYPE_THRESH_LOW)
44 pDM_DigTable->RssiLowThresh = DM_Value;
46 else if (DM_Type == DIG_TYPE_ENABLE)
48 pDM_DigTable->Dig_Enable_Flag = TRUE;
50 else if (DM_Type == DIG_TYPE_DISABLE)
52 pDM_DigTable->Dig_Enable_Flag = FALSE;
54 else if (DM_Type == DIG_TYPE_BACKOFF)
58 pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
60 else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
64 pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
66 else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
70 pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
72 } // DM_ChangeDynamicInitGainThresh //
75 getIGIForDiff(int value_IGI)
77 #define ONERCCA_LOW_TH 0x30
78 #define ONERCCA_LOW_DIFF 8
80 if (value_IGI < ONERCCA_LOW_TH) {
81 if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
82 return ONERCCA_LOW_TH;
84 return value_IGI + ONERCCA_LOW_DIFF;
94 IN BOOLEAN bPerformance,
97 OUT u4Byte* dm_FA_thres
100 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
102 if(pDM_Odm->bLinked && (bPerformance||bDFSBand))
104 if(pDM_Odm->SupportICType == ODM_RTL8192D)
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;
111 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
112 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
115 if((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500) // 10Mbps & 0.5Mbps
117 dm_FA_thres[0] = 0x080;
118 dm_FA_thres[1] = 0x100;
119 dm_FA_thres[2] = 0x200;
123 dm_FA_thres[0] = 0x100;
124 dm_FA_thres[1] = 0x200;
125 dm_FA_thres[2] = 0x300;
129 else if(pDM_Odm->SupportICType == ODM_RTL8723A && pDM_Odm->bBtLimitedDig)
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;
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;
147 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
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;
158 dm_FA_thres[0] = 2000;
159 dm_FA_thres[1] = 4000;
160 dm_FA_thres[2] = 5000;
167 odm_ForbiddenIGICheck(
169 IN u1Byte DIG_Dynamic_MIN,
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;
178 if(pFalseAlmCnt->Cnt_all > 10000)
180 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case. \n"));
182 if(pDM_DigTable->LargeFAHit != 3)
183 pDM_DigTable->LargeFAHit++;
185 if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
187 pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
188 pDM_DigTable->LargeFAHit = 1;
191 if(pDM_DigTable->LargeFAHit >= 3)
193 if((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)
194 rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
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));
203 if(pDM_DigTable->Recover_cnt != 0)
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));
210 if(pDM_DigTable->LargeFAHit < 3)
212 if((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)
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"));
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"));
227 pDM_DigTable->LargeFAHit = 0;
232 return rx_gain_range_min;
237 odm_InbandNoiseCalculate (
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;
249 static u1Byte failCnt = 0;
251 if(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))
254 if(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)
257 if(!pDM_DigTable->bNoiseEst)
260 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_InbandNoiseEstimate()========>\n"));
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);
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);
274 //1 Get noise power level
277 //2 Read Noise Floor Report
278 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
279 tmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);
281 sNoise_A = (s1Byte)(tmp & 0xff);
282 sNoise_B = (s1Byte)((tmp & 0xff00)>>8);
284 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
286 if((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))
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));
295 bTimeout = (TimeCnt >= 150)?TRUE:FALSE;
297 if(ValidCnt == 20 || bTimeout)
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);
309 ODM_Write_DIG(pDM_Odm, IGIBackup);
311 //1 Calculate Noise Floor
314 NoiseRpt_A /= (ValidCnt<<1);
315 NoiseRpt_B /= (ValidCnt<<1);
324 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Noise estimate fail time = %d\n", failCnt));
329 pDM_DigTable->bNoiseEst = FALSE;
334 NoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;
335 NoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;
336 pDM_DigTable->bNoiseEst = FALSE;
338 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NoiseRpt_A = %d, NoiseRpt_B = %d\n", NoiseRpt_A, NoiseRpt_B));
341 //1 Calculate IGI Offset
342 if(NoiseRpt_A > NoiseRpt_B)
344 pDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;
345 pDM_DigTable->IGIOffset_B = 0;
349 pDM_DigTable->IGIOffset_A = 0;
350 pDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;
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;
366 u1Byte digUpBound=0x5a;
368 if(pDM_Odm->bBtConnectProcess)
370 if(pDM_Odm->SupportICType&(ODM_RTL8723A))
378 // Decide DIG value by BT HS RSSI.
380 digForBtHs = pDM_Odm->btHsRssi+4;
383 if(pDM_Odm->SupportICType&(ODM_RTL8723A))
386 if(digForBtHs > digUpBound)
387 digForBtHs = digUpBound;
388 if(digForBtHs < 0x1c)
391 // update Current IGI
392 pDM_DigTable->BT30_CurIGI = digForBtHs;
394 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
404 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
405 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
407 if(pDM_DigTable->bStopDIG)
409 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
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)));
416 if(pDM_DigTable->CurIGValue != CurrentIGI)
418 //1 Check initial gain by upper bound
419 if(!pDM_DigTable->bPSDInProgress)
421 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
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;
430 if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
432 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
434 if(pDM_Odm->RFType > ODM_1T1R)
435 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
437 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
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);
443 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
445 switch(*(pDM_Odm->pOnePathCCA))
448 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
450 if(pDM_Odm->RFType > ODM_1T1R)
451 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
453 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
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);
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));
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);
471 pDM_DigTable->CurIGValue = CurrentIGI;
474 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x). \n",CurrentIGI));
481 IN ODM_Pause_DIG_TYPE PauseType,
485 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
486 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
488 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========>\n"));
490 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
491 if(*pDM_DigTable->pbP2pLinkInProgress)
493 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): P2P in progress !!\n"));
498 if(!pDM_DigTable->bPauseDIG && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
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"));
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"));
513 if(!pDM_DigTable->bPauseDIG)
515 pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
516 pDM_DigTable->bPauseDIG = TRUE;
518 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI = 0x%x\n", pDM_DigTable->IGIBackup));
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));
527 if(pDM_DigTable->bPauseDIG)
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));
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"));
542 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong type !!\n"));
552 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
553 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
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;
563 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
565 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
570 if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))
572 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
577 if(*(pDM_Odm->pbScanInProcess))
579 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
583 if(pDM_DigTable->bIgnoreDIG)
585 pDM_DigTable->bIgnoreDIG = FALSE;
586 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Ignore DIG \n"));
590 //add by Neil Chen to avoid PSD is processing
591 if(pDM_Odm->bDMInitialGainEnable == FALSE)
593 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
597 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
598 #if OS_WIN_FROM_WIN7(OS_VERSION)
599 if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
601 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));
606 if(pDM_Odm->bBtHsOperation)
608 odm_DigForBtHsMode(pDM_Odm);
611 if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
613 if(pRX_HP_Table->RXHP_flag == 1)
615 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));
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))
623 printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
624 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
629 if (!(priv->up_time > 5))
631 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
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);
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;
670 //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
671 pDM_Odm->bDMInitialGainEnable = TRUE;
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;
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;
685 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
688 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
690 ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
693 pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
694 pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
697 pDM_DigTable->BT30_CurIGI=0x32;
699 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
700 *pDM_DigTable->pbP2pLinkInProgress= FALSE;
704 if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
706 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
707 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
711 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
712 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
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;
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;
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;
751 if(odm_DigAbort(pDM_Odm) == TRUE)
754 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
756 if(pDM_Odm->adaptivity_flag == TRUE)
757 Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper;
761 #if (RTL8192D_SUPPORT==1)
762 if(pDM_Odm->SupportICType == ODM_RTL8192D)
764 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
766 if(*(pDM_Odm->pbMasterOfDMSP))
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);
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);
781 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
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);
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);
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);
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);
811 //2 Calculate total TP
812 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
814 pEntry = pDM_Odm->pODM_StaInfo[i];
815 if(IS_STA_VALID(pEntry))
817 RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
818 TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7); //Kbps
821 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
824 switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
833 bPerformance = FALSE;
840 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
841 TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
843 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
844 TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
846 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
848 //2 Decide DIG mode by total TP
849 if((TxTp + RxTp) > DM_DIG_TP_Target_TH1) // change to performance mode
851 bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
852 pDM_DigTable->bTpTarget = TRUE;
855 else if((TxTp + RxTp) < TpTrainTH_MIN) // change to coverage mode
857 bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
859 if(TimeCnt < DM_DIG_TP_Training_Period)
861 pDM_DigTable->bTpTarget = FALSE;
862 bPerformance = FALSE;
867 pDM_DigTable->bTpTarget = TRUE;
869 bFirstTpTarget = TRUE;
873 else // remain previous mode
875 bPerformance = pDM_DigTable->bTpTarget;
879 if(TimeCnt < DM_DIG_TP_Training_Period)
883 pDM_DigTable->bTpTarget = TRUE;
885 bFirstTpTarget = TRUE;
892 pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
897 bPerformance = FALSE;
898 pDM_DigTable->TpTrainTH_min = 0;
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));
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)))
915 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
917 dm_dig_max = DM_DIG_MAX_AP_HP;
918 dm_dig_min = DM_DIG_MIN_AP_HP;
922 dm_dig_max = DM_DIG_MAX_NIC_HP;
923 dm_dig_min = DM_DIG_MIN_NIC_HP;
925 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
930 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
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;
940 dm_dig_max = DM_DIG_MAX_AP;
941 dm_dig_min = DM_DIG_MIN_AP;
942 DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
946 if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||
947 ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))
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"));
955 if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))
959 #ifdef HIGH_POWER_EXT_LNA
960 if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
967 if(pDM_Odm->SupportICType >= ODM_RTL8188E)
970 dm_dig_max = DM_DIG_MAX_NIC;
972 if(pDM_Odm->SupportICType != ODM_RTL8821)
973 dm_dig_min = DM_DIG_MIN_NIC;
977 DIG_MaxOfMin = DM_DIG_MAX_AP;
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));
982 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
984 if(0 < *pDM_Odm->pu1ForcedIgiLb)
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);
992 //1 Adjust boundary by RSSI
993 if(pDM_Odm->bLinked && bPerformance)
995 //2 Modify DIG upper bound
996 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
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))
1003 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));
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;
1014 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
1016 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1017 //2 Modify DIG lower bound
1018 //if(pDM_Odm->bOneEntryOnly)
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;
1025 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1031 HAL_REORDER_BARRIER();
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));
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;
1047 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1054 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1055 if(bPerformance && bDFSBand)
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));
1063 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;
1065 DIG_Dynamic_MIN = dm_dig_min;
1068 //1 Force Lower Bound for AntDiv
1069 if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)
1071 if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
1073 if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
1075 if(pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
1076 DIG_Dynamic_MIN = DIG_MaxOfMin;
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));
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));
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))
1094 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
1099 if(!pDM_Odm->bLinked)
1101 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
1104 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
1107 pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
1110 //2 Abnormal # beacon case
1111 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1112 if(pDM_Odm->bLinked && !FirstConnect)
1114 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
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));
1123 //2 Abnormal lower bound case
1124 if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
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));
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]));
1135 //1 Adjust initial gain by false alarm
1136 if(pDM_Odm->bLinked && bPerformance)
1139 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
1141 if(bFirstTpTarget || (FirstConnect && bPerformance))
1143 pDM_DigTable->LargeFAHit = 0;
1145 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1148 if(pDM_Odm->RSSI_Min > 0x28)
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"));
1157 if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)
1159 if(CurrentIGI < pDM_Odm->RSSI_Min)
1160 CurrentIGI = pDM_Odm->RSSI_Min;
1164 if(CurrentIGI < DIG_MaxOfMin)
1165 CurrentIGI = DIG_MaxOfMin;
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);
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));
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;
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))
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));
1202 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
1204 if(FirstDisConnect || bFirstCoverage)
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"));
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;
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;
1224 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
1225 CurrentIGI = pDM_DigTable->rx_gain_range_max;
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));
1229 //1 Force upper bound and lower bound for adaptivity
1230 if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
1232 if(CurrentIGI > Adap_IGI_Upper)
1233 CurrentIGI = Adap_IGI_Upper;
1235 if(pDM_Odm->IGI_LowerBound != 0)
1237 if(CurrentIGI < pDM_Odm->IGI_LowerBound)
1238 CurrentIGI = pDM_Odm->IGI_LowerBound;
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));
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))
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)
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;
1258 if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
1260 if(pHalData->UndecoratedSmoothedPWDB > 0x28)
1262 if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
1264 //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1265 CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1272 #if (RTL8192D_SUPPORT==1)
1273 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1275 //sherry delete DualMacSmartConncurrent 20110517
1276 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
1278 ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
1279 if(*(pDM_Odm->pbMasterOfDMSP))
1281 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1282 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1286 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1287 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1292 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1293 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
1295 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1296 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1300 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1301 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1308 #if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))
1309 if(pDM_Odm->bBtHsOperation)
1311 if(pDM_Odm->bLinked)
1313 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
1314 ODM_Write_DIG(pDM_Odm, CurrentIGI);
1316 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
1318 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1319 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
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);
1328 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1331 else // BT is not using
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;
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);
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;
1358 u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
1359 u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
1361 if(odm_DigAbort(pDM_Odm) == TRUE)
1364 CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
1366 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
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;
1378 //Lower bound checking
1380 //RSSI Lower bound check
1381 if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
1382 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
1384 RSSI_Lower =DM_DIG_MIN_NIC;
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;
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));
1397 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1401 //3============================================================
1402 //3 FASLE ALARM CHECK
1403 //3============================================================
1406 odm_FalseAlarmCounterStatistics(
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);
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) )
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))))
1428 odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
1433 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
1436 #if (ODM_IC_11N_SERIES_SUPPORT == 1)
1437 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
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
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);
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);
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);
1456 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
1457 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
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;
1463 #if (RTL8188E_SUPPORT==1)
1464 if(pDM_Odm->SupportICType == ODM_RTL8188E)
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);
1472 #if (RTL8192D_SUPPORT==1)
1473 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1475 odm_GetCCKFalseAlarm_92D(pDM_Odm);
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);
1484 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
1485 FalseAlmCnt->Cnt_Cck_fail = ret_value;
1487 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
1488 FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
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);
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);
1502 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
1504 #if (RTL8192C_SUPPORT==1)
1505 if(pDM_Odm->SupportICType == ODM_RTL8192C)
1506 odm_ResetFACounter_92C(pDM_Odm);
1509 #if (RTL8192D_SUPPORT==1)
1510 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1511 odm_ResetFACounter_92D(pDM_Odm);
1514 if(pDM_Odm->SupportICType >=ODM_RTL8723A)
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);
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
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);
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));
1544 #if (ODM_IC_11AC_SERIES_SUPPORT == 1)
1545 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
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);
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;
1558 #if (RTL8881A_SUPPORT==1)
1560 if(pDM_Odm->SupportICType == ODM_RTL8881A)
1562 u4Byte Cnt_Ofdm_fail_temp = 0;
1564 if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
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;
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));
1575 // Reset FA counter by enable/disable OFDM
1576 if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
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"));
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);
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);
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);
1599 CCKenable = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
1600 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
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;
1607 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
1608 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
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));
1623 //3============================================================
1624 //3 CCK Packet Detect Threshold
1625 //3============================================================
1628 odm_PauseCCKPacketDetection(
1630 IN ODM_Pause_CCKPD_TYPE PauseType,
1631 IN u1Byte CCKPDThreshold
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;
1638 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========>\n"));
1640 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1641 if(*pDM_DigTable->pbP2pLinkInProgress)
1643 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("P2P in progress !!\n"));
1648 if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
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"));
1656 //1 Pause CCK Packet Detection Threshold
1657 case ODM_PAUSE_CCKPD:
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"));
1662 //2 Backup CCK Packet Detection Threshold value
1665 pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
1668 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Backup CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
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));
1675 //1 Resume CCK Packet Detection Threshold
1676 case ODM_RESUME_CCKPD:
1679 //2 Write backup CCK Packet Detection Threshold value
1680 ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
1682 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write original CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
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"));
1691 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Wrong type !!\n"));
1699 odm_CCKPacketDetectionThresh(
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;
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)
1713 if(pDM_Odm->bBtHsOperation)
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);
1721 if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
1723 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() return==========\n"));
1727 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1732 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() ==========>\n"));
1734 if(pDM_Odm->bLinked)
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;
1742 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1743 CurCCK_CCAThres = 0x83;
1745 CurCCK_CCAThres = 0x40;
1750 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1751 CurCCK_CCAThres = 0x83;
1753 CurCCK_CCAThres = 0x40;
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);
1761 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
1763 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));
1767 ODM_Write_CCK_CCA_Thres(
1769 IN u1Byte CurCCK_CCAThres
1772 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1773 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1775 if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
1777 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
1779 pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
1780 pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
1783 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1785 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
1788 IN PDM_ODM_T pDM_Odm,
1792 PADAPTER Adapter = (PADAPTER)pDM_Odm->Adapter;
1793 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1794 static u1Byte TRSW_HighPwr = 0;
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 ));
1799 if (pHalData->RFEType == 3) {
1801 pDM_Odm->RSSI_TRSW = RSSIVal;
1803 if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H)
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
1810 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L)
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
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));
1827 odm_MPT_DIGWorkItemCallback(
1831 PADAPTER Adapter = (PADAPTER)pContext;
1832 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1833 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
1835 ODM_MPT_DIG(pDM_Odm);
1839 odm_MPT_DIGCallback(
1843 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
1844 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1845 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
1848 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
1850 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1852 ODM_MPT_DIG(pDM_Odm);
1855 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1862 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1864 odm_MPT_DIGCallback(
1868 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1870 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1872 ODM_MPT_DIG(pDM_Odm);
1877 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
1881 IN u1Byte CurIGValue
1884 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1885 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1887 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
1889 if(pDM_Odm->RFType > ODM_1T1R)
1890 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
1892 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
1894 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
1895 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);
1898 pDM_DigTable->CurIGValue = CurIGValue;
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));
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;
1915 u4Byte RxPWDBAve_final;
1916 u1Byte IGI_A = 0x20, IGI_B = 0x20;
1918 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1926 if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
1929 if (*pDM_Odm->pBandType == ODM_BAND_5G)
1933 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
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
1938 if (1) // for both 2G/5G
1941 odm_FalseAlarmCounterStatistics(pDM_Odm);
1943 RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
1944 RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
1946 pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
1947 pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
1948 pDM_Odm->RxPWDBAve = 0;
1949 pDM_Odm->MPDIG_2G = FALSE;
1951 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1952 pDM_Odm->Times_2G = 0;
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));
1958 if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
1960 if (CurrentIGI > 0x24)
1961 odm_MPT_Write_DIG(pDM_Odm, 0x24);
1965 if(pFalseAlmCnt->Cnt_all > 1000){
1966 CurrentIGI = CurrentIGI + 8;
1968 else if(pFalseAlmCnt->Cnt_all > 200){
1969 CurrentIGI = CurrentIGI + 4;
1971 else if (pFalseAlmCnt->Cnt_all > 50){
1972 CurrentIGI = CurrentIGI + 2;
1974 else if (pFalseAlmCnt->Cnt_all < 2){
1975 CurrentIGI = CurrentIGI - 2;
1978 if (CurrentIGI < DIG_Lower ){
1979 CurrentIGI = DIG_Lower;
1982 if(CurrentIGI > DIG_Upper){
1983 CurrentIGI = DIG_Upper;
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));
1993 if(pDM_Odm->MPDIG_2G == FALSE)
1995 if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A))
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;
2003 odm_MPT_Write_DIG(pDM_Odm, IGI_A);
2006 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2007 pDM_Odm->Times_2G++;
2009 if (pDM_Odm->Times_2G == 3)
2012 pDM_Odm->MPDIG_2G = TRUE;
2016 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2017 if (pDM_Odm->SupportICType == ODM_RTL8812)
2018 odm_RFEControl(pDM_Odm, RxPWDBAve_final);
2021 ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);