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 //1 Check initial gain by upper bound
417 if(!pDM_DigTable->bPSDInProgress)
419 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
421 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x) is larger than upper bound !!\n",CurrentIGI));
422 CurrentIGI = pDM_DigTable->rx_gain_range_max;
424 if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
426 if(CurrentIGI > pDM_Odm->Adaptivity_IGI_upper)
427 CurrentIGI = pDM_Odm->Adaptivity_IGI_upper;
429 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_write_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", CurrentIGI));
433 if(pDM_DigTable->CurIGValue != CurrentIGI)
436 if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
438 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
440 if(pDM_Odm->RFType > ODM_1T1R)
441 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
443 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
445 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
446 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
449 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
451 switch(*(pDM_Odm->pOnePathCCA))
454 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
456 if(pDM_Odm->RFType > ODM_1T1R)
457 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
459 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
461 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
462 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
466 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
467 if(pDM_Odm->RFType != ODM_1T1R)
468 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
471 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
472 if(pDM_Odm->RFType != ODM_1T1R)
473 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
477 pDM_DigTable->CurIGValue = CurrentIGI;
480 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x). \n",CurrentIGI));
487 IN ODM_Pause_DIG_TYPE PauseType,
491 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
492 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
494 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========>\n"));
496 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
497 if(*pDM_DigTable->pbP2pLinkInProgress)
499 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): P2P in progress !!\n"));
504 if(!pDM_DigTable->bPauseDIG && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
506 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n"));
515 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
516 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
519 if(!pDM_DigTable->bPauseDIG)
521 pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
522 pDM_DigTable->bPauseDIG = TRUE;
524 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI = 0x%x\n", pDM_DigTable->IGIBackup));
526 //2 Write new IGI value
527 ODM_Write_DIG(pDM_Odm, IGIValue);
528 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue));
533 if(pDM_DigTable->bPauseDIG)
535 //2 Write backup IGI value
536 ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
537 pDM_DigTable->bPauseDIG = FALSE;
538 pDM_DigTable->bIgnoreDIG = TRUE;
539 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
542 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);
543 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
548 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong type !!\n"));
558 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
559 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
561 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
562 prtl8192cd_priv priv = pDM_Odm->priv;
563 #elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
564 PADAPTER pAdapter = pDM_Odm->Adapter;
565 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
569 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
571 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
576 if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))
578 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
583 if(*(pDM_Odm->pbScanInProcess))
585 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
589 if(pDM_DigTable->bIgnoreDIG)
591 pDM_DigTable->bIgnoreDIG = FALSE;
592 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Ignore DIG \n"));
596 //add by Neil Chen to avoid PSD is processing
597 if(pDM_Odm->bDMInitialGainEnable == FALSE)
599 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
603 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
604 #if OS_WIN_FROM_WIN7(OS_VERSION)
605 if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
607 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));
612 if(pDM_Odm->bBtHsOperation)
614 odm_DigForBtHsMode(pDM_Odm);
617 if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
619 if(pRX_HP_Table->RXHP_flag == 1)
621 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));
625 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
626 #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
627 if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
629 printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
630 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
635 if (!(priv->up_time > 5))
637 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
650 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
651 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
652 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
653 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
656 pDM_DigTable->bStopDIG = FALSE;
657 pDM_DigTable->bPauseDIG = FALSE;
658 pDM_DigTable->bIgnoreDIG = FALSE;
659 pDM_DigTable->bPSDInProgress = FALSE;
660 pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
661 pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
662 pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
663 pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
664 pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
665 pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
666 pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
667 pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
668 pDM_DigTable->PreCCK_CCAThres = 0xFF;
669 pDM_DigTable->CurCCK_CCAThres = 0x83;
670 pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
671 pDM_DigTable->LargeFAHit = 0;
672 pDM_DigTable->Recover_cnt = 0;
673 pDM_DigTable->bMediaConnect_0 = FALSE;
674 pDM_DigTable->bMediaConnect_1 = FALSE;
676 //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
677 pDM_Odm->bDMInitialGainEnable = TRUE;
679 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
680 pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;
681 pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;
683 // For AP\ ADSL modified DIG
684 pDM_DigTable->bTpTarget = FALSE;
685 pDM_DigTable->bNoiseEst = TRUE;
686 pDM_DigTable->IGIOffset_A = 0;
687 pDM_DigTable->IGIOffset_B = 0;
688 pDM_DigTable->TpTrainTH_min = 0;
691 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
694 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
696 ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
699 pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
700 pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
703 pDM_DigTable->BT30_CurIGI=0x32;
705 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
706 *pDM_DigTable->pbP2pLinkInProgress= FALSE;
710 if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
712 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
713 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
717 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
718 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
729 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
730 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
731 PADAPTER pAdapter = pDM_Odm->Adapter;
732 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
733 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
734 prtl8192cd_priv priv = pDM_Odm->priv;
739 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
740 PFALSE_ALARM_STATISTICS pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
741 BOOLEAN FirstConnect,FirstDisConnect;
742 u1Byte DIG_MaxOfMin, DIG_Dynamic_MIN;
743 u1Byte dm_dig_max, dm_dig_min;
744 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
746 u4Byte dm_FA_thres[3];
747 u4Byte TxTp = 0, RxTp = 0;
748 BOOLEAN bDFSBand = FALSE;
749 BOOLEAN bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;
750 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
751 u4Byte TpTrainTH_MIN = DM_DIG_TP_Target_TH0;
752 static u1Byte TimeCnt = 0;
756 if(odm_DigAbort(pDM_Odm) == TRUE)
759 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
763 #if (RTL8192D_SUPPORT==1)
764 if(pDM_Odm->SupportICType == ODM_RTL8192D)
766 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
768 if(*(pDM_Odm->pbMasterOfDMSP))
770 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
771 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
772 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
776 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
777 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
778 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
783 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
785 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
786 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
787 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
791 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
792 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
793 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
800 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
801 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
802 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
805 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
806 //1 Noise Floor Estimate
807 //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;
808 //odm_InbandNoiseCalculate (pDM_Odm);
813 //2 Calculate total TP
814 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
816 pEntry = pDM_Odm->pODM_StaInfo[i];
817 if(IS_STA_VALID(pEntry))
819 RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
820 TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7); //Kbps
823 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
826 switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
835 bPerformance = FALSE;
842 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
843 TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
845 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
846 TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
848 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
850 //2 Decide DIG mode by total TP
851 if((TxTp + RxTp) > DM_DIG_TP_Target_TH1) // change to performance mode
853 bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
854 pDM_DigTable->bTpTarget = TRUE;
857 else if((TxTp + RxTp) < TpTrainTH_MIN) // change to coverage mode
859 bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
861 if(TimeCnt < DM_DIG_TP_Training_Period)
863 pDM_DigTable->bTpTarget = FALSE;
864 bPerformance = FALSE;
869 pDM_DigTable->bTpTarget = TRUE;
871 bFirstTpTarget = TRUE;
875 else // remain previous mode
877 bPerformance = pDM_DigTable->bTpTarget;
881 if(TimeCnt < DM_DIG_TP_Training_Period)
885 pDM_DigTable->bTpTarget = TRUE;
887 bFirstTpTarget = TRUE;
894 pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
899 bPerformance = FALSE;
900 pDM_DigTable->TpTrainTH_min = 0;
908 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== DIG mode = %d ======\n", pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable));
909 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));
912 //1 Boundary Decision
913 #if (RTL8192C_SUPPORT==1)
914 if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
917 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
919 dm_dig_max = DM_DIG_MAX_AP_HP;
920 dm_dig_min = DM_DIG_MIN_AP_HP;
924 dm_dig_max = DM_DIG_MAX_NIC_HP;
925 dm_dig_min = DM_DIG_MIN_NIC_HP;
927 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
932 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
936 dm_dig_max = DM_DIG_MAX_AP_COVERAGR;
937 dm_dig_min = DM_DIG_MIN_AP_COVERAGE;
938 DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;
942 dm_dig_max = DM_DIG_MAX_AP;
943 dm_dig_min = DM_DIG_MIN_AP;
944 DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
948 if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||
949 ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))
952 if (*pDM_Odm->pBandWidth == ODM_BW20M){
953 dm_dig_min = DM_DIG_MIN_AP_DFS+2;
956 dm_dig_min = DM_DIG_MIN_AP_DFS;
958 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));
962 if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))
966 #ifdef HIGH_POWER_EXT_LNA
967 if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
974 if(pDM_Odm->SupportICType >= ODM_RTL8188E)
977 dm_dig_max = DM_DIG_MAX_NIC;
979 if(pDM_Odm->SupportICType != ODM_RTL8821)
980 dm_dig_min = DM_DIG_MIN_NIC;
984 DIG_MaxOfMin = DM_DIG_MAX_AP;
987 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Absolutly upper bound = 0x%x, lower bound = 0x%x\n",dm_dig_max, dm_dig_min));
989 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
991 if(0 < *pDM_Odm->pu1ForcedIgiLb)
993 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));
994 dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
995 dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
999 //1 Adjust boundary by RSSI
1000 if(pDM_Odm->bLinked && bPerformance)
1002 //2 Modify DIG upper bound
1003 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1006 //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT
1007 if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))
1010 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));
1016 if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
1017 pDM_DigTable->rx_gain_range_max = dm_dig_max;
1018 else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
1019 pDM_DigTable->rx_gain_range_max = dm_dig_min;
1021 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
1023 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1024 //2 Modify DIG lower bound
1025 //if(pDM_Odm->bOneEntryOnly)
1027 if(pDM_Odm->RSSI_Min < dm_dig_min)
1028 DIG_Dynamic_MIN = dm_dig_min;
1029 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
1030 DIG_Dynamic_MIN = DIG_MaxOfMin;
1032 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1038 HAL_REORDER_BARRIER();
1044 DIG_Dynamic_MIN = dm_dig_min;
1045 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\n", dm_dig_min));
1049 if(pDM_Odm->RSSI_Min < dm_dig_min)
1050 DIG_Dynamic_MIN = dm_dig_min;
1051 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
1052 DIG_Dynamic_MIN = DIG_MaxOfMin;
1054 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
1061 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1062 if(bPerformance && bDFSBand)
1064 pDM_DigTable->rx_gain_range_max = 0x28;
1065 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force upper bound to 0x%x before link !!!!!!\n", pDM_DigTable->rx_gain_range_max));
1070 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;
1072 DIG_Dynamic_MIN = dm_dig_min;
1075 //1 Force Lower Bound for AntDiv
1076 if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)
1078 if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
1080 if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
1082 if(pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
1083 DIG_Dynamic_MIN = DIG_MaxOfMin;
1085 DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
1086 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n", DIG_Dynamic_MIN));
1087 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n", pDM_DigTable->AntDiv_RSSI_max));
1091 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",
1092 pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));
1093 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n",
1094 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));
1096 //1 Modify DIG lower bound, deal with abnormal case
1097 //2 Abnormal false alarm case
1098 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1101 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
1106 if(!pDM_Odm->bLinked)
1108 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
1110 if (FirstDisConnect)
1111 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
1114 pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
1117 //2 Abnormal # beacon case
1118 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1119 if(pDM_Odm->bLinked && !FirstConnect)
1121 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
1123 pDM_DigTable->rx_gain_range_min = dm_dig_min;
1124 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n",
1125 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));
1130 //2 Abnormal lower bound case
1131 if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
1133 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
1134 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n",pDM_DigTable->rx_gain_range_min));
1138 //1 False alarm threshold decision
1139 odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);
1140 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): False alarm threshold = %d, %d, %d \n\n", dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]));
1142 //1 Adjust initial gain by false alarm
1143 if(pDM_Odm->bLinked && bPerformance)
1146 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
1148 if(bFirstTpTarget || (FirstConnect && bPerformance))
1150 pDM_DigTable->LargeFAHit = 0;
1152 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1155 if(pDM_Odm->RSSI_Min > 0x28)
1158 CurrentIGI = pDM_Odm->RSSI_Min;
1159 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));
1164 if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)
1166 if(CurrentIGI < pDM_Odm->RSSI_Min)
1167 CurrentIGI = pDM_Odm->RSSI_Min;
1171 if(CurrentIGI < DIG_MaxOfMin)
1172 CurrentIGI = DIG_MaxOfMin;
1175 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1176 #if (RTL8812A_SUPPORT==1)
1177 if(pDM_Odm->SupportICType == ODM_RTL8812)
1178 ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
1183 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First connect case: IGI does on-shot to 0x%x\n", CurrentIGI));
1188 if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
1189 CurrentIGI = CurrentIGI + 4;
1190 else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
1191 CurrentIGI = CurrentIGI + 2;
1192 else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
1193 CurrentIGI = CurrentIGI - 2;
1195 //4 Abnormal # beacon case
1196 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1197 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
1199 CurrentIGI = pDM_DigTable->rx_gain_range_min;
1200 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n",
1201 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));
1209 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
1211 if(FirstDisConnect || bFirstCoverage)
1213 CurrentIGI = dm_dig_min;
1214 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));
1218 if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
1219 CurrentIGI = CurrentIGI + 4;
1220 else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
1221 CurrentIGI = CurrentIGI + 2;
1222 else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
1223 CurrentIGI = CurrentIGI - 2;
1227 //1 Check initial gain by upper/lower bound
1228 if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
1229 CurrentIGI = pDM_DigTable->rx_gain_range_min;
1231 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
1232 CurrentIGI = pDM_DigTable->rx_gain_range_max;
1234 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));
1236 //1 High power RSSI threshold
1237 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1238 if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
1240 // High power IGI lower bound
1241 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
1242 if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
1244 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
1245 //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
1246 CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
1249 if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
1251 if(pHalData->UndecoratedSmoothedPWDB > 0x28)
1253 if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
1255 //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1256 CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1263 #if (RTL8192D_SUPPORT==1)
1264 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1266 //sherry delete DualMacSmartConncurrent 20110517
1267 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
1269 ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
1270 if(*(pDM_Odm->pbMasterOfDMSP))
1272 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1273 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1277 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1278 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1283 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1284 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
1286 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1287 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1291 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1292 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
1299 #if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))
1300 if(pDM_Odm->bBtHsOperation)
1302 if(pDM_Odm->bLinked)
1304 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
1305 ODM_Write_DIG(pDM_Odm, CurrentIGI);
1307 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
1309 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1310 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1314 if(pDM_Odm->bLinkInProcess)
1315 ODM_Write_DIG(pDM_Odm, 0x1c);
1316 else if(pDM_Odm->bBtConnectProcess)
1317 ODM_Write_DIG(pDM_Odm, 0x28);
1319 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1322 else // BT is not using
1325 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1326 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1327 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1337 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1338 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1339 PFALSE_ALARM_STATISTICS pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1341 u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
1342 u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
1344 if(odm_DigAbort(pDM_Odm) == TRUE)
1347 CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
1349 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
1351 // Using FW PS mode to make IGI
1352 //Adjust by FA in LPS MODE
1353 if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
1354 CurrentIGI = CurrentIGI+4;
1355 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
1356 CurrentIGI = CurrentIGI+2;
1357 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
1358 CurrentIGI = CurrentIGI-2;
1361 //Lower bound checking
1363 //RSSI Lower bound check
1364 if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
1365 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
1367 RSSI_Lower =DM_DIG_MIN_NIC;
1369 //Upper and Lower Bound checking
1370 if(CurrentIGI > DM_DIG_MAX_NIC)
1371 CurrentIGI=DM_DIG_MAX_NIC;
1372 else if(CurrentIGI < RSSI_Lower)
1373 CurrentIGI =RSSI_Lower;
1375 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));
1376 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));
1377 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));
1379 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1383 //3============================================================
1384 //3 FASLE ALARM CHECK
1385 //3============================================================
1388 odm_FalseAlarmCounterStatistics(
1392 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1393 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1396 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
1397 //Mark there, and check this in odm_DMWatchDog
1398 #if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)
1399 prtl8192cd_priv priv = pDM_Odm->priv;
1400 if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
1405 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
1408 #if (ODM_IC_11N_SERIES_SUPPORT == 1)
1409 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
1413 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
1414 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
1416 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
1417 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
1418 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
1420 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
1421 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
1422 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
1424 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
1425 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
1426 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
1428 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
1429 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
1431 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
1432 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
1433 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
1435 #if (RTL8188E_SUPPORT==1)
1436 if(pDM_Odm->SupportICType == ODM_RTL8188E)
1438 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
1439 FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
1440 FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
1444 #if (RTL8192D_SUPPORT==1)
1445 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1447 odm_GetCCKFalseAlarm_92D(pDM_Odm);
1453 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
1454 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
1456 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
1457 FalseAlmCnt->Cnt_Cck_fail = ret_value;
1459 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
1460 FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
1462 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
1463 FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
1466 FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Fast_Fsync +
1467 FalseAlmCnt->Cnt_SB_Search_fail +
1468 FalseAlmCnt->Cnt_Parity_Fail +
1469 FalseAlmCnt->Cnt_Rate_Illegal +
1470 FalseAlmCnt->Cnt_Crc8_fail +
1471 FalseAlmCnt->Cnt_Mcs_fail +
1472 FalseAlmCnt->Cnt_Cck_fail);
1474 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
1476 #if (RTL8192C_SUPPORT==1)
1477 if(pDM_Odm->SupportICType == ODM_RTL8192C)
1478 odm_ResetFACounter_92C(pDM_Odm);
1481 #if (RTL8192D_SUPPORT==1)
1482 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1483 odm_ResetFACounter_92D(pDM_Odm);
1486 if(pDM_Odm->SupportICType >=ODM_RTL8723A)
1488 //reset false alarm counter registers
1489 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
1490 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
1491 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
1492 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
1494 //update ofdm counter
1495 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
1496 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
1498 //reset CCK CCA counter
1499 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
1500 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
1501 //reset CCK FA counter
1502 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
1503 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
1506 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
1507 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
1508 FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
1509 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
1510 FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
1511 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
1512 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
1516 #if (ODM_IC_11AC_SERIES_SUPPORT == 1)
1517 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
1521 //read OFDM FA counter
1522 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
1523 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
1525 //read CCK/OFDM CCA counter
1526 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);
1527 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;
1528 FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;
1530 #if (RTL8881A_SUPPORT==1)
1532 if(pDM_Odm->SupportICType == ODM_RTL8881A)
1534 u4Byte Cnt_Ofdm_fail_temp = 0;
1536 if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
1538 Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;
1539 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
1540 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;
1543 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
1544 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail_pre));
1545 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail_pre=%d\n", Cnt_Ofdm_fail_temp));
1547 // Reset FA counter by enable/disable OFDM
1548 if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
1551 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);
1552 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);
1553 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
1554 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Reset false alarm counter\n"));
1559 // reset OFDM FA coutner
1560 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
1561 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
1563 // reset CCK FA counter
1564 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
1565 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
1567 // reset CCA counter
1568 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);
1569 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);
1571 CCKenable = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
1572 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
1574 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
1575 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;
1579 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
1580 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
1586 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_OFDM_CCA=%d\n", FalseAlmCnt->Cnt_OFDM_CCA));
1587 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCK_CCA=%d\n", FalseAlmCnt->Cnt_CCK_CCA));
1588 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCA_all=%d\n", FalseAlmCnt->Cnt_CCA_all));
1589 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
1590 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
1591 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
1592 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n\n", FalseAlmCnt->Cnt_all));
1595 //3============================================================
1596 //3 CCK Packet Detect Threshold
1597 //3============================================================
1600 odm_PauseCCKPacketDetection(
1602 IN ODM_Pause_CCKPD_TYPE PauseType,
1603 IN u1Byte CCKPDThreshold
1606 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1607 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1608 static BOOLEAN bPaused = FALSE;
1610 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========>\n"));
1612 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
1613 if(*pDM_DigTable->pbP2pLinkInProgress)
1615 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("P2P in progress !!\n"));
1620 if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
1622 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Return: SupportAbility ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\n"));
1628 //1 Pause CCK Packet Detection Threshold
1629 case ODM_PAUSE_CCKPD:
1631 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));
1632 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Pause CCK packet detection threshold !!\n"));
1634 //2 Backup CCK Packet Detection Threshold value
1637 pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
1640 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Backup CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
1642 //2 Write new CCK Packet Detection Threshold value
1643 ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);
1644 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write new CCK packet detection tgreshold = %d\n", CCKPDThreshold));
1647 //1 Resume CCK Packet Detection Threshold
1648 case ODM_RESUME_CCKPD:
1651 //2 Write backup CCK Packet Detection Threshold value
1652 ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
1654 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write original CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
1656 //2 Enable CCK Packet Detection Threshold
1657 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);
1658 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Resume CCK packet detection threshold !!\n"));
1663 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Wrong type !!\n"));
1671 odm_CCKPacketDetectionThresh(
1675 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1676 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1677 u1Byte CurCCK_CCAThres;
1680 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1681 //modify by Guo.Mingzhi 2011-12-29
1682 if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
1683 // if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
1685 if(pDM_Odm->bBtHsOperation)
1687 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
1688 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
1693 if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
1695 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() return==========\n"));
1699 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1704 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() ==========>\n"));
1706 if(pDM_Odm->bLinked)
1708 if(pDM_Odm->RSSI_Min > 25)
1709 CurCCK_CCAThres = 0xcd;
1710 else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
1711 CurCCK_CCAThres = 0x83;
1714 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1715 CurCCK_CCAThres = 0x83;
1717 CurCCK_CCAThres = 0x40;
1722 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
1723 CurCCK_CCAThres = 0x83;
1725 CurCCK_CCAThres = 0x40;
1728 #if (RTL8192D_SUPPORT==1)
1729 if((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))
1730 ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
1733 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
1735 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));
1739 ODM_Write_CCK_CCA_Thres(
1741 IN u1Byte CurCCK_CCAThres
1744 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1745 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1747 if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
1749 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
1751 pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
1752 pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
1755 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1757 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
1760 IN PDM_ODM_T pDM_Odm,
1764 PADAPTER Adapter = (PADAPTER)pDM_Odm->Adapter;
1765 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1766 static u1Byte TRSW_HighPwr = 0;
1768 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
1769 RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
1771 if (pHalData->RFEType == 3) {
1773 pDM_Odm->RSSI_TRSW = RSSIVal;
1775 if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H)
1777 TRSW_HighPwr = 1; // Switch to
1778 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
1779 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); // Set ANTSW=1/ANTSWB=0 for SW control
1782 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L)
1784 TRSW_HighPwr = 0; // Switched back
1785 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
1786 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0); // Set ANTSW=1/ANTSWB=0 for SW control
1792 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));
1793 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n",
1794 RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
1795 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));
1799 odm_MPT_DIGWorkItemCallback(
1803 PADAPTER Adapter = (PADAPTER)pContext;
1804 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1805 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
1807 ODM_MPT_DIG(pDM_Odm);
1811 odm_MPT_DIGCallback(
1815 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
1816 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1817 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
1820 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
1822 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1824 ODM_MPT_DIG(pDM_Odm);
1827 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1834 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1836 odm_MPT_DIGCallback(
1840 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1842 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
1844 ODM_MPT_DIG(pDM_Odm);
1849 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
1853 IN u1Byte CurIGValue
1856 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1857 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1859 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
1861 if(pDM_Odm->RFType > ODM_1T1R)
1862 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
1864 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
1866 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
1867 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);
1870 pDM_DigTable->CurIGValue = CurIGValue;
1872 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));
1873 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));
1881 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1882 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1883 PFALSE_ALARM_STATISTICS pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
1884 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
1885 u1Byte DIG_Upper = 0x40, DIG_Lower = 0x20;
1887 u4Byte RxPWDBAve_final;
1888 u1Byte IGI_A = 0x20, IGI_B = 0x20;
1890 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1898 if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
1901 if (*pDM_Odm->pBandType == ODM_BAND_5G)
1905 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
1907 #if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & ODM_AP))
1908 if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))) // for 5G or 8814
1910 if (1) // for both 2G/5G
1913 odm_FalseAlarmCounterStatistics(pDM_Odm);
1915 RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
1916 RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
1918 pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
1919 pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
1920 pDM_Odm->RxPWDBAve = 0;
1921 pDM_Odm->MPDIG_2G = FALSE;
1923 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1924 pDM_Odm->Times_2G = 0;
1927 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
1928 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));
1930 if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
1932 if (CurrentIGI > 0x24)
1933 odm_MPT_Write_DIG(pDM_Odm, 0x24);
1937 if(pFalseAlmCnt->Cnt_all > 1000){
1938 CurrentIGI = CurrentIGI + 8;
1940 else if(pFalseAlmCnt->Cnt_all > 200){
1941 CurrentIGI = CurrentIGI + 4;
1943 else if (pFalseAlmCnt->Cnt_all > 50){
1944 CurrentIGI = CurrentIGI + 2;
1946 else if (pFalseAlmCnt->Cnt_all < 2){
1947 CurrentIGI = CurrentIGI - 2;
1950 if (CurrentIGI < DIG_Lower ){
1951 CurrentIGI = DIG_Lower;
1954 if(CurrentIGI > DIG_Upper){
1955 CurrentIGI = DIG_Upper;
1958 odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);
1959 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n",
1960 CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
1965 if(pDM_Odm->MPDIG_2G == FALSE)
1967 if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B)))
1969 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));
1970 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);
1971 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);
1972 pDM_DigTable->CurIGValue = IGI_B;
1975 odm_MPT_Write_DIG(pDM_Odm, IGI_A);
1978 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1979 pDM_Odm->Times_2G++;
1981 if (pDM_Odm->Times_2G == 3)
1984 pDM_Odm->MPDIG_2G = TRUE;
1988 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1989 if (pDM_Odm->SupportICType == ODM_RTL8812)
1990 odm_RFEControl(pDM_Odm, RxPWDBAve_final);
1993 ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);