1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
21 //============================================================
\r
23 //============================================================
\r
24 #include "mp_precomp.h"
\r
25 #include "phydm_precomp.h"
\r
29 ODM_ChangeDynamicInitGainThresh(
\r
35 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
36 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
38 if (DM_Type == DIG_TYPE_THRESH_HIGH)
\r
40 pDM_DigTable->RssiHighThresh = DM_Value;
\r
42 else if (DM_Type == DIG_TYPE_THRESH_LOW)
\r
44 pDM_DigTable->RssiLowThresh = DM_Value;
\r
46 else if (DM_Type == DIG_TYPE_ENABLE)
\r
48 pDM_DigTable->Dig_Enable_Flag = TRUE;
\r
50 else if (DM_Type == DIG_TYPE_DISABLE)
\r
52 pDM_DigTable->Dig_Enable_Flag = FALSE;
\r
54 else if (DM_Type == DIG_TYPE_BACKOFF)
\r
58 pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
\r
60 else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
\r
64 pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
\r
66 else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
\r
70 pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
\r
72 } // DM_ChangeDynamicInitGainThresh //
\r
75 getIGIForDiff(int value_IGI)
\r
77 #define ONERCCA_LOW_TH 0x30
\r
78 #define ONERCCA_LOW_DIFF 8
\r
80 if (value_IGI < ONERCCA_LOW_TH) {
\r
81 if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
\r
82 return ONERCCA_LOW_TH;
\r
84 return value_IGI + ONERCCA_LOW_DIFF;
\r
91 odm_FAThresholdCheck(
\r
93 IN BOOLEAN bDFSBand,
\r
94 IN BOOLEAN bPerformance,
\r
97 OUT u4Byte* dm_FA_thres
\r
100 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
102 if(pDM_Odm->bLinked && (bPerformance||bDFSBand))
\r
104 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
106 if ((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500) { /*10Mbps & 0.5Mbps*/
\r
107 dm_FA_thres[0] = 0x080;
\r
108 dm_FA_thres[1] = 0x100;
\r
109 dm_FA_thres[2] = 0x200;
\r
111 dm_FA_thres[0] = 0x100;
\r
112 dm_FA_thres[1] = 0x200;
\r
113 dm_FA_thres[2] = 0x300;
\r
117 dm_FA_thres[0] = DM_DIG_FA_TH0;
\r
118 dm_FA_thres[1] = DM_DIG_FA_TH1;
\r
119 dm_FA_thres[2] = DM_DIG_FA_TH2;
\r
122 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))
\r
125 // For DFS band and no link
\r
126 dm_FA_thres[0] = 250;
\r
127 dm_FA_thres[1] = 1000;
\r
128 dm_FA_thres[2] = 2000;
\r
133 dm_FA_thres[0] = 2000;
\r
134 dm_FA_thres[1] = 4000;
\r
135 dm_FA_thres[2] = 5000;
\r
142 odm_ForbiddenIGICheck(
\r
144 IN u1Byte DIG_Dynamic_MIN,
\r
145 IN u1Byte CurrentIGI
\r
148 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
149 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
150 PFALSE_ALARM_STATISTICS pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
\r
151 u1Byte rx_gain_range_min = pDM_DigTable->rx_gain_range_min;
\r
153 if (pDM_DigTable->LargeFA_Timeout) {
\r
154 if (--pDM_DigTable->LargeFA_Timeout == 0)
\r
155 pDM_DigTable->LargeFAHit = 0;
\r
158 if (pFalseAlmCnt->Cnt_all > 10000) {
\r
160 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case.\n"));
\r
162 if(pDM_DigTable->LargeFAHit != 3)
\r
163 pDM_DigTable->LargeFAHit++;
\r
165 if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
\r
167 pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
\r
168 pDM_DigTable->LargeFAHit = 1;
\r
169 pDM_DigTable->LargeFA_Timeout = LARGE_FA_TIMEOUT;
\r
172 if(pDM_DigTable->LargeFAHit >= 3)
\r
174 if((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)
\r
175 rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
\r
177 rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
\r
178 pDM_DigTable->Recover_cnt = 1800;
\r
179 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case: Recover_cnt = %d\n", pDM_DigTable->Recover_cnt));
\r
183 else if (pFalseAlmCnt->Cnt_all > 2000) {
\r
185 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Abnormally false alarm case.\n"));
\r
186 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Cnt_all=%d, Cnt_all_pre=%d, CurrentIGI=0x%x, PreIGValue=0x%x\n",
\r
187 pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_all_pre, CurrentIGI, pDM_DigTable->PreIGValue));
\r
189 /* pFalseAlmCnt->Cnt_all = 1.1875*pFalseAlmCnt->Cnt_all_pre */
\r
190 if ((pFalseAlmCnt->Cnt_all > (pFalseAlmCnt->Cnt_all_pre + (pFalseAlmCnt->Cnt_all_pre >> 3) + (pFalseAlmCnt->Cnt_all_pre >> 4))) && (CurrentIGI < pDM_DigTable->PreIGValue)) {
\r
191 if (pDM_DigTable->LargeFAHit != 3)
\r
192 pDM_DigTable->LargeFAHit++;
\r
194 if (pDM_DigTable->ForbiddenIGI < CurrentIGI) { /*if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)*/
\r
196 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Updating ForbiddenIGI by CurrentIGI, ForbiddenIGI=0x%x, CurrentIGI=0x%x\n",
\r
197 pDM_DigTable->ForbiddenIGI, CurrentIGI));
\r
199 pDM_DigTable->ForbiddenIGI = CurrentIGI; /*pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;*/
\r
200 pDM_DigTable->LargeFAHit = 1;
\r
201 pDM_DigTable->LargeFA_Timeout = LARGE_FA_TIMEOUT;
\r
206 if (pDM_DigTable->LargeFAHit >= 3) {
\r
208 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("FaHit is greater than 3, rx_gain_range_max=0x%x, rx_gain_range_min=0x%x, ForbiddenIGI=0x%x\n",
\r
209 pDM_DigTable->rx_gain_range_max, rx_gain_range_min, pDM_DigTable->ForbiddenIGI));
\r
211 if ((pDM_DigTable->ForbiddenIGI + 1) > pDM_DigTable->rx_gain_range_max)
\r
212 rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
\r
214 rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1);
\r
216 pDM_DigTable->Recover_cnt = 1200;
\r
217 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Abnormally false alarm case: Recover_cnt = %d, rx_gain_range_min = 0x%x\n", pDM_DigTable->Recover_cnt, rx_gain_range_min));
\r
223 if (pDM_DigTable->Recover_cnt != 0) {
\r
225 pDM_DigTable->Recover_cnt --;
\r
226 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d\n", pDM_DigTable->Recover_cnt));
\r
230 if(pDM_DigTable->LargeFAHit < 3)
\r
232 if((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)
\r
234 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
\r
235 rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
\r
236 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
\r
240 if (pDM_DigTable->LargeFAHit == 0) {
\r
241 pDM_DigTable->ForbiddenIGI -= 2;
\r
242 rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
\r
243 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
\r
249 pDM_DigTable->LargeFAHit = 0;
\r
254 return rx_gain_range_min;
\r
259 odm_InbandNoiseCalculate (
\r
263 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
264 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
265 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
266 u1Byte IGIBackup, TimeCnt = 0, ValidCnt = 0;
\r
267 BOOLEAN bTimeout = TRUE;
\r
268 s1Byte sNoise_A, sNoise_B;
\r
269 s4Byte NoiseRpt_A = 0,NoiseRpt_B = 0;
\r
271 static u1Byte failCnt = 0;
\r
273 if(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))
\r
276 if(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)
\r
279 if(!pDM_DigTable->bNoiseEst)
\r
282 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_InbandNoiseEstimate()========>\n"));
\r
284 //1 Set initial gain.
\r
285 IGIBackup = pDM_DigTable->CurIGValue;
\r
286 pDM_DigTable->IGIOffset_A = 0;
\r
287 pDM_DigTable->IGIOffset_B = 0;
\r
288 ODM_Write_DIG(pDM_Odm, 0x24);
\r
290 //1 Update idle time power report
\r
291 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
292 ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x0);
\r
296 //1 Get noise power level
\r
299 //2 Read Noise Floor Report
\r
300 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
301 tmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);
\r
303 sNoise_A = (s1Byte)(tmp & 0xff);
\r
304 sNoise_B = (s1Byte)((tmp & 0xff00)>>8);
\r
306 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
\r
308 if((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))
\r
311 NoiseRpt_A += sNoise_A;
\r
312 NoiseRpt_B += sNoise_B;
\r
313 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
\r
317 bTimeout = (TimeCnt >= 150)?TRUE:FALSE;
\r
319 if(ValidCnt == 20 || bTimeout)
\r
326 //1 Keep idle time power report
\r
327 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
328 ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x1);
\r
331 ODM_Write_DIG(pDM_Odm, IGIBackup);
\r
333 //1 Calculate Noise Floor
\r
336 NoiseRpt_A /= (ValidCnt<<1);
\r
337 NoiseRpt_B /= (ValidCnt<<1);
\r
346 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Noise estimate fail time = %d\n", failCnt));
\r
351 pDM_DigTable->bNoiseEst = FALSE;
\r
356 NoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;
\r
357 NoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;
\r
358 pDM_DigTable->bNoiseEst = FALSE;
\r
360 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NoiseRpt_A = %d, NoiseRpt_B = %d\n", NoiseRpt_A, NoiseRpt_B));
\r
363 //1 Calculate IGI Offset
\r
364 if(NoiseRpt_A > NoiseRpt_B)
\r
366 pDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;
\r
367 pDM_DigTable->IGIOffset_B = 0;
\r
371 pDM_DigTable->IGIOffset_A = 0;
\r
372 pDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;
\r
380 odm_DigForBtHsMode(
\r
384 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
385 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
386 pDIG_T pDM_DigTable=&pDM_Odm->DM_DigTable;
\r
387 u1Byte digForBtHs=0;
\r
388 u1Byte digUpBound=0x5a;
\r
390 if (pDM_Odm->bBtConnectProcess) {
\r
394 // Decide DIG value by BT HS RSSI.
\r
396 digForBtHs = pDM_Odm->btHsRssi+4;
\r
399 if(digForBtHs > digUpBound)
\r
400 digForBtHs = digUpBound;
\r
401 if(digForBtHs < 0x1c)
\r
404 // update Current IGI
\r
405 pDM_DigTable->BT30_CurIGI = digForBtHs;
\r
407 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
\r
412 phydm_setBigJumpStep(
\r
414 IN u1Byte CurrentIGI
\r
417 #if (RTL8822B_SUPPORT == 1 || RTL8197F_SUPPORT == 1)
\r
418 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
419 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
420 u1Byte step1[8] = {24, 30, 40, 50, 60, 70, 80, 90};
\r
423 if (pDM_DigTable->enableAdjustBigJump == 0)
\r
426 for (i = 0; i <= pDM_DigTable->bigJumpStep1; i++) {
\r
427 if ((CurrentIGI + step1[i]) > pDM_DigTable->bigJumpLmt[pDM_DigTable->agcTableIdx]) {
\r
431 } else if (i == pDM_DigTable->bigJumpStep1)
\r
434 if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
435 ODM_SetBBReg(pDM_Odm, 0x8c8, 0xe, i);
\r
436 else if (pDM_Odm->SupportICType & ODM_RTL8197F)
\r
437 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_AGC_SET_2_11N, 0xe, i);
\r
439 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_setBigJumpStep(): bigjump = %d (ori = 0x%d), LMT=0x%x\n", i, pDM_DigTable->bigJumpStep1, pDM_DigTable->bigJumpLmt[pDM_DigTable->agcTableIdx]));
\r
446 IN u1Byte CurrentIGI
\r
449 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
450 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
452 if (pDM_DigTable->bStopDIG) {
\r
453 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG(): Stop Writing IGI\n"));
\r
457 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_Write_DIG(): ODM_REG(IGI_A,pDM_Odm)=0x%x, ODM_BIT(IGI,pDM_Odm)=0x%x\n",
\r
458 ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
\r
460 //1 Check initial gain by upper bound
\r
461 if ((!pDM_DigTable->bPSDInProgress) && pDM_Odm->bLinked)
\r
463 if (CurrentIGI > pDM_DigTable->rx_gain_range_max) {
\r
464 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_Write_DIG(): CurrentIGI(0x%02x) is larger than upper bound !!\n", CurrentIGI));
\r
465 CurrentIGI = pDM_DigTable->rx_gain_range_max;
\r
467 if (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
\r
469 if(CurrentIGI > pDM_Odm->Adaptivity_IGI_upper)
\r
470 CurrentIGI = pDM_Odm->Adaptivity_IGI_upper;
\r
472 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("ODM_Write_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", CurrentIGI));
\r
476 if(pDM_DigTable->CurIGValue != CurrentIGI)
\r
479 #if (RTL8822B_SUPPORT == 1 | RTL8197F_SUPPORT == 1)
\r
480 /* Modify big jump step for 8822B and 8197F */
\r
481 if (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8197F))
\r
482 phydm_setBigJumpStep(pDM_Odm, CurrentIGI);
\r
485 #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)
\r
486 /* Set IGI value of CCK for new CCK AGC */
\r
487 if (pDM_Odm->cck_new_agc) {
\r
488 if (pDM_Odm->SupportICType & ODM_IC_PHY_STATUE_NEW_TYPE)
\r
489 ODM_SetBBReg(pDM_Odm, 0xa0c, 0x00003f00, (CurrentIGI>>1));
\r
493 /*Add by YuChen for USB IO too slow issue*/
\r
494 if ((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && (CurrentIGI > pDM_DigTable->CurIGValue))
\r
495 Phydm_Adaptivity(pDM_Odm, CurrentIGI);
\r
498 if (pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE)) {
\r
499 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
501 if(pDM_Odm->RFType > ODM_1T1R)
\r
502 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
504 #if (RTL8814A_SUPPORT == 1)
\r
505 if (pDM_Odm->SupportICType & ODM_RTL8814A) {
\r
506 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
507 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
510 } else if (pDM_Odm->SupportPlatform & (ODM_AP)) {
\r
511 switch(*(pDM_Odm->pOnePathCCA))
\r
514 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
516 if(pDM_Odm->RFType > ODM_1T1R)
\r
517 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
518 #if (RTL8814A_SUPPORT == 1)
\r
519 if (pDM_Odm->SupportICType & ODM_RTL8814A) {
\r
520 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
521 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
526 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
527 if(pDM_Odm->RFType != ODM_1T1R)
\r
528 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
\r
531 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
\r
532 if(pDM_Odm->RFType != ODM_1T1R)
\r
533 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
\r
538 pDM_DigTable->CurIGValue = CurrentIGI;
\r
541 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("ODM_Write_DIG(): CurrentIGI(0x%02x).\n", CurrentIGI));
\r
548 IN PHYDM_PAUSE_TYPE PauseType,
\r
549 IN PHYDM_PAUSE_LEVEL pause_level,
\r
553 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
554 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
556 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========> level = %d\n", pause_level));
\r
558 if ((pDM_DigTable->pause_dig_level == 0) && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) {
\r
559 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD,
\r
560 ("odm_PauseDIG(): Return: SupportAbility DIG or FA is disabled !!\n"));
\r
564 if (pause_level > DM_DIG_MAX_PAUSE_TYPE) {
\r
565 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD,
\r
566 ("odm_PauseDIG(): Return: Wrong pause level !!\n"));
\r
570 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_dig_level, IGIValue));
\r
571 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
\r
572 pDM_DigTable->pause_dig_value[7], pDM_DigTable->pause_dig_value[6], pDM_DigTable->pause_dig_value[5], pDM_DigTable->pause_dig_value[4],
\r
573 pDM_DigTable->pause_dig_value[3], pDM_DigTable->pause_dig_value[2], pDM_DigTable->pause_dig_value[1], pDM_DigTable->pause_dig_value[0]));
\r
575 switch (PauseType) {
\r
580 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
\r
581 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
\r
583 /* Backup IGI value */
\r
584 if (pDM_DigTable->pause_dig_level == 0) {
\r
585 pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
\r
586 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI = 0x%x, new IGI = 0x%x\n", pDM_DigTable->IGIBackup, IGIValue));
\r
589 /* Record IGI value */
\r
590 pDM_DigTable->pause_dig_value[pause_level] = IGIValue;
\r
592 /* Update pause level */
\r
593 pDM_DigTable->pause_dig_level = (pDM_DigTable->pause_dig_level | BIT(pause_level));
\r
595 /* Write new IGI value */
\r
596 if (BIT(pause_level + 1) > pDM_DigTable->pause_dig_level) {
\r
597 ODM_Write_DIG(pDM_Odm, IGIValue);
\r
598 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): IGI of higher level = 0x%x\n", IGIValue));
\r
605 /* check if the level is illegal or not */
\r
606 if ((pDM_DigTable->pause_dig_level & (BIT(pause_level))) != 0) {
\r
607 pDM_DigTable->pause_dig_level = pDM_DigTable->pause_dig_level & (~(BIT(pause_level)));
\r
608 pDM_DigTable->pause_dig_value[pause_level] = 0;
\r
609 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
\r
611 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong resume level !!\n"));
\r
616 if (pDM_DigTable->pause_dig_level == 0) {
\r
617 /* Write backup IGI value */
\r
618 ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
\r
619 pDM_DigTable->bIgnoreDIG = TRUE;
\r
620 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
\r
623 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);
\r
627 if (BIT(pause_level) > pDM_DigTable->pause_dig_level) {
\r
630 /* Calculate the maximum level now */
\r
631 for (max_level = (pause_level - 1); max_level >= 0; max_level--) {
\r
632 if ((pDM_DigTable->pause_dig_level & BIT(max_level)) > 0)
\r
636 /* write IGI of lower level */
\r
637 ODM_Write_DIG(pDM_Odm, pDM_DigTable->pause_dig_value[max_level]);
\r
638 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write IGI (0x%x) of level (%d)\n",
\r
639 pDM_DigTable->pause_dig_value[max_level], max_level));
\r
645 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong type !!\n"));
\r
649 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_dig_level, IGIValue));
\r
650 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
\r
651 pDM_DigTable->pause_dig_value[7], pDM_DigTable->pause_dig_value[6], pDM_DigTable->pause_dig_value[5], pDM_DigTable->pause_dig_value[4],
\r
652 pDM_DigTable->pause_dig_value[3], pDM_DigTable->pause_dig_value[2], pDM_DigTable->pause_dig_value[1], pDM_DigTable->pause_dig_value[0]));
\r
661 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
662 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
664 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
665 prtl8192cd_priv priv = pDM_Odm->priv;
\r
666 #elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
667 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
671 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
\r
673 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
\r
678 if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))
\r
680 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
\r
685 if(*(pDM_Odm->pbScanInProcess))
\r
687 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
\r
691 if(pDM_DigTable->bIgnoreDIG)
\r
693 pDM_DigTable->bIgnoreDIG = FALSE;
\r
694 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Ignore DIG \n"));
\r
698 //add by Neil Chen to avoid PSD is processing
\r
699 if(pDM_Odm->bDMInitialGainEnable == FALSE)
\r
701 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
\r
705 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
706 #if OS_WIN_FROM_WIN7(OS_VERSION)
\r
707 if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
\r
709 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));
\r
714 if(pDM_Odm->bBtHsOperation)
\r
716 odm_DigForBtHsMode(pDM_Odm);
\r
719 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
\r
720 #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
\r
721 if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
\r
723 printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
\r
724 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
\r
729 if (!(priv->up_time > 5))
\r
731 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
\r
744 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
745 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
746 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
747 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
\r
752 pDM_DigTable->bStopDIG = FALSE;
\r
753 pDM_DigTable->bIgnoreDIG = FALSE;
\r
754 pDM_DigTable->bPSDInProgress = FALSE;
\r
755 pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
\r
756 pDM_DigTable->PreIGValue = 0;
\r
757 pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
\r
758 pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
\r
759 pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
\r
760 pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
\r
761 pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
\r
762 pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
\r
763 pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
\r
764 pDM_DigTable->PreCCK_CCAThres = 0xFF;
\r
765 pDM_DigTable->CurCCK_CCAThres = 0x83;
\r
766 pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
\r
767 pDM_DigTable->LargeFAHit = 0;
\r
768 pDM_DigTable->LargeFA_Timeout = 0;
\r
769 pDM_DigTable->Recover_cnt = 0;
\r
770 pDM_DigTable->bMediaConnect_0 = FALSE;
\r
771 pDM_DigTable->bMediaConnect_1 = FALSE;
\r
773 //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
\r
774 pDM_Odm->bDMInitialGainEnable = TRUE;
\r
776 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
777 pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;
\r
778 pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;
\r
780 // For AP\ ADSL modified DIG
\r
781 pDM_DigTable->bTpTarget = FALSE;
\r
782 pDM_DigTable->bNoiseEst = TRUE;
\r
783 pDM_DigTable->IGIOffset_A = 0;
\r
784 pDM_DigTable->IGIOffset_B = 0;
\r
785 pDM_DigTable->TpTrainTH_min = 0;
\r
788 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
\r
791 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
793 ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
\r
796 pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
\r
797 pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
\r
799 //To Initi BT30 IGI
\r
800 pDM_DigTable->BT30_CurIGI=0x32;
\r
802 ODM_Memory_Set(pDM_Odm, pDM_DigTable->pause_dig_value, 0, (DM_DIG_MAX_PAUSE_TYPE + 1));
\r
803 pDM_DigTable->pause_dig_level = 0;
\r
804 ODM_Memory_Set(pDM_Odm, pDM_DigTable->pause_cckpd_value, 0, (DM_DIG_MAX_PAUSE_TYPE + 1));
\r
805 pDM_DigTable->pause_cckpd_level = 0;
\r
808 if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
\r
810 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
\r
811 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
\r
815 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
\r
816 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
\r
819 #if (RTL8822B_SUPPORT == 1 || RTL8197F_SUPPORT == 1)
\r
820 pDM_DigTable->enableAdjustBigJump = 1;
\r
821 if (pDM_Odm->SupportICType & ODM_RTL8822B) {
\r
822 ret_value = ODM_GetBBReg(pDM_Odm, 0x8c8, bMaskLWord);
\r
823 pDM_DigTable->bigJumpStep1 = (u1Byte)(ret_value & 0xe) >> 1;
\r
824 pDM_DigTable->bigJumpStep2 = (u1Byte)(ret_value & 0x30)>>4;
\r
825 pDM_DigTable->bigJumpStep3 = (u1Byte)(ret_value & 0xc0)>>6;
\r
827 } else if (pDM_Odm->SupportICType & ODM_RTL8197F) {
\r
828 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_AGC_SET_2_11N, bMaskLWord);
\r
829 pDM_DigTable->bigJumpStep1 = (u1Byte)(ret_value & 0xe) >> 1;
\r
830 pDM_DigTable->bigJumpStep2 = (u1Byte)(ret_value & 0x30)>>4;
\r
831 pDM_DigTable->bigJumpStep3 = (u1Byte)(ret_value & 0xc0)>>6;
\r
833 if (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8197F)) {
\r
834 for (i = 0; i < sizeof(pDM_DigTable->bigJumpLmt); i++) {
\r
835 if (pDM_DigTable->bigJumpLmt[i] == 0)
\r
836 pDM_DigTable->bigJumpLmt[i] = 0x64; /* Set -10dBm as default value */
\r
848 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
849 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
850 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
851 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
\r
852 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
853 prtl8192cd_priv priv = pDM_Odm->priv;
\r
854 PSTA_INFO_T pEntry;
\r
857 // Common parameters
\r
858 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
859 PFALSE_ALARM_STATISTICS pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
\r
860 BOOLEAN FirstConnect,FirstDisConnect;
\r
861 u1Byte DIG_MaxOfMin, DIG_Dynamic_MIN;
\r
862 u1Byte dm_dig_max, dm_dig_min;
\r
863 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
\r
865 u4Byte dm_FA_thres[3];
\r
866 u4Byte TxTp = 0, RxTp = 0;
\r
867 BOOLEAN DIG_GoUpCheck = TRUE;
\r
868 BOOLEAN bDFSBand = FALSE;
\r
869 BOOLEAN bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;
\r
870 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
871 u4Byte TpTrainTH_MIN = DM_DIG_TP_Target_TH0;
\r
872 static u1Byte TimeCnt = 0;
\r
876 if(odm_DigAbort(pDM_Odm) == TRUE)
\r
879 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
\r
884 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
\r
885 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
\r
886 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
\r
889 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
890 //1 Noise Floor Estimate
\r
891 //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;
\r
892 //odm_InbandNoiseCalculate (pDM_Odm);
\r
895 if(pDM_Odm->bLinked)
\r
897 //2 Calculate total TP
\r
898 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
\r
900 pEntry = pDM_Odm->pODM_StaInfo[i];
\r
901 if(IS_STA_VALID(pEntry))
\r
903 RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
\r
904 TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7); //Kbps
\r
907 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
\r
910 switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
\r
914 bPerformance = TRUE;
\r
919 bPerformance = FALSE;
\r
924 if(pDM_Odm->bLinked)
\r
926 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
\r
927 TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
\r
929 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
\r
930 TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
\r
932 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
\r
934 //2 Decide DIG mode by total TP
\r
935 if((TxTp + RxTp) > DM_DIG_TP_Target_TH1) // change to performance mode
\r
937 bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
\r
938 pDM_DigTable->bTpTarget = TRUE;
\r
939 bPerformance = TRUE;
\r
941 else if((TxTp + RxTp) < TpTrainTH_MIN) // change to coverage mode
\r
943 bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
\r
945 if(TimeCnt < DM_DIG_TP_Training_Period)
\r
947 pDM_DigTable->bTpTarget = FALSE;
\r
948 bPerformance = FALSE;
\r
953 pDM_DigTable->bTpTarget = TRUE;
\r
954 bPerformance = TRUE;
\r
955 bFirstTpTarget = TRUE;
\r
959 else // remain previous mode
\r
961 bPerformance = pDM_DigTable->bTpTarget;
\r
965 if(TimeCnt < DM_DIG_TP_Training_Period)
\r
969 pDM_DigTable->bTpTarget = TRUE;
\r
970 bPerformance = TRUE;
\r
971 bFirstTpTarget = TRUE;
\r
978 pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
\r
983 bPerformance = FALSE;
\r
984 pDM_DigTable->TpTrainTH_min = 0;
\r
989 bPerformance = TRUE;
\r
992 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== DIG mode = %d ======\n", pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable));
\r
993 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));
\r
996 //1 Boundary Decision
\r
998 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
1002 dm_dig_max = DM_DIG_MAX_AP_COVERAGR;
\r
1003 dm_dig_min = DM_DIG_MIN_AP_COVERAGE;
\r
1004 DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;
\r
1008 if (pDM_Odm->RFType == ODM_1T1R)
\r
1009 dm_dig_max = DM_DIG_MAX_AP - 6;
\r
1011 dm_dig_max = DM_DIG_MAX_AP;
\r
1012 dm_dig_min = DM_DIG_MIN_AP;
\r
1013 DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
\r
1017 if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))
\r
1018 dm_dig_max = 0x2A;
\r
1020 #if RTL8192E_SUPPORT
\r
1021 #ifdef HIGH_POWER_EXT_LNA
\r
1022 if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
\r
1023 dm_dig_max = 0x42;
\r
1026 if (pDM_Odm->IGI_LowerBound) {
\r
1027 if (dm_dig_min < pDM_Odm->IGI_LowerBound)
\r
1028 dm_dig_min = pDM_Odm->IGI_LowerBound;
\r
1029 if (DIG_MaxOfMin < pDM_Odm->IGI_LowerBound)
\r
1030 DIG_MaxOfMin = pDM_Odm->IGI_LowerBound;
\r
1032 if (pDM_Odm->IGI_UpperBound) {
\r
1033 if (dm_dig_max > pDM_Odm->IGI_UpperBound)
\r
1034 dm_dig_max = pDM_Odm->IGI_UpperBound;
\r
1035 if (DIG_MaxOfMin > pDM_Odm->IGI_UpperBound)
\r
1036 DIG_MaxOfMin = pDM_Odm->IGI_UpperBound;
\r
1040 if(pDM_Odm->SupportICType >= ODM_RTL8188E)
\r
1041 dm_dig_max = 0x5A;
\r
1043 dm_dig_max = DM_DIG_MAX_NIC;
\r
1045 if(pDM_Odm->SupportICType != ODM_RTL8821)
\r
1046 dm_dig_min = DM_DIG_MIN_NIC;
\r
1048 dm_dig_min = 0x1C;
\r
1050 DIG_MaxOfMin = DM_DIG_MAX_AP;
\r
1054 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))
\r
1055 /* Modify lower bound for DFS band */
\r
1056 if ((((*pDM_Odm->pChannel >= 52) && (*pDM_Odm->pChannel <= 64)) ||
\r
1057 ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))
\r
1058 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
\r
1059 && phydm_dfs_master_enabled(pDM_Odm) == TRUE
\r
1063 if (*pDM_Odm->pBandWidth == ODM_BW20M)
\r
1064 dm_dig_min = DM_DIG_MIN_AP_DFS+2;
\r
1066 dm_dig_min = DM_DIG_MIN_AP_DFS;
\r
1067 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));
\r
1071 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Absolutly upper bound = 0x%x, lower bound = 0x%x\n",dm_dig_max, dm_dig_min));
\r
1073 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1074 if (pDM_Odm->pu1ForcedIgiLb && (0 < *pDM_Odm->pu1ForcedIgiLb)) {
\r
1075 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Force IGI lb to: 0x%02x !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));
\r
1076 dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
\r
1077 dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
\r
1081 //1 Adjust boundary by RSSI
\r
1082 if(pDM_Odm->bLinked && bPerformance)
\r
1084 //2 Modify DIG upper bound
\r
1085 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
1088 //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT
\r
1089 if ((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821)) && (pDM_Odm->bBtLimitedDig == 1))
\r
1092 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));
\r
1098 if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
\r
1099 pDM_DigTable->rx_gain_range_max = dm_dig_max;
\r
1100 else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
\r
1101 pDM_DigTable->rx_gain_range_max = dm_dig_min;
\r
1103 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
\r
1105 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1106 //2 Modify DIG lower bound
\r
1107 //if(pDM_Odm->bOneEntryOnly)
\r
1109 if(pDM_Odm->RSSI_Min < dm_dig_min)
\r
1110 DIG_Dynamic_MIN = dm_dig_min;
\r
1111 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
\r
1112 DIG_Dynamic_MIN = DIG_MaxOfMin;
\r
1114 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
\r
1116 #if (DM_ODM_SUPPORT_TYPE & ODM_CE)
\r
1118 DIG_Dynamic_MIN = dm_dig_min;
\r
1119 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\n", dm_dig_min));
\r
1127 HAL_REORDER_BARRIER();
\r
1133 DIG_Dynamic_MIN = dm_dig_min;
\r
1134 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force lower bound to 0x%x after link !!!!!!\n", dm_dig_min));
\r
1138 if(pDM_Odm->RSSI_Min < dm_dig_min)
\r
1139 DIG_Dynamic_MIN = dm_dig_min;
\r
1140 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
\r
1141 DIG_Dynamic_MIN = DIG_MaxOfMin;
\r
1143 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
\r
1150 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))
\r
1151 if(bPerformance && bDFSBand)
\r
1153 pDM_DigTable->rx_gain_range_max = 0x28;
\r
1154 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: Force upper bound to 0x%x before link !!!!!!\n", pDM_DigTable->rx_gain_range_max));
\r
1160 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_OF_MIN;
\r
1162 pDM_DigTable->rx_gain_range_max = dm_dig_max;
\r
1164 DIG_Dynamic_MIN = dm_dig_min;
\r
1167 //1 Force Lower Bound for AntDiv
\r
1168 if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)
\r
1170 if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
\r
1172 if (pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV) {
\r
1173 if (pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
\r
1174 DIG_Dynamic_MIN = DIG_MaxOfMin;
\r
1176 DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
\r
1177 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n", DIG_Dynamic_MIN));
\r
1178 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n", pDM_DigTable->AntDiv_RSSI_max));
\r
1182 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",
\r
1183 pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));
\r
1184 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n",
\r
1185 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));
\r
1187 //1 Modify DIG lower bound, deal with abnormal case
\r
1188 //2 Abnormal false alarm case
\r
1189 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))
\r
1192 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
\r
1197 if(!pDM_Odm->bLinked)
\r
1199 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
\r
1201 if (FirstDisConnect)
\r
1202 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
\r
1205 pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
\r
1208 //2 Abnormal # beacon case
\r
1209 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1210 if(pDM_Odm->bLinked && !FirstConnect)
\r
1212 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Beacon Num (%d)\n", pDM_Odm->PhyDbgInfo.NumQryBeaconPkt));
\r
1213 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
\r
1215 pDM_DigTable->rx_gain_range_min = 0x1c;
\r
1216 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n",
\r
1217 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));
\r
1222 //2 Abnormal lower bound case
\r
1223 if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
\r
1225 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
\r
1226 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n",pDM_DigTable->rx_gain_range_min));
\r
1230 //1 False alarm threshold decision
\r
1231 odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);
\r
1232 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): False alarm threshold = %d, %d, %d \n\n", dm_FA_thres[0], dm_FA_thres[1], dm_FA_thres[2]));
\r
1234 //1 Adjust initial gain by false alarm
\r
1235 if(pDM_Odm->bLinked && bPerformance)
\r
1238 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
\r
1240 if(bFirstTpTarget || (FirstConnect && bPerformance))
\r
1242 pDM_DigTable->LargeFAHit = 0;
\r
1244 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_CE))
\r
1247 if(pDM_Odm->RSSI_Min > 0x28)
\r
1248 CurrentIGI = 0x28;
\r
1250 CurrentIGI = pDM_Odm->RSSI_Min;
\r
1251 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));
\r
1256 if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)
\r
1258 if(CurrentIGI < pDM_Odm->RSSI_Min)
\r
1259 CurrentIGI = pDM_Odm->RSSI_Min;
\r
1263 if(CurrentIGI < DIG_MaxOfMin)
\r
1264 CurrentIGI = DIG_MaxOfMin;
\r
1267 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1268 #if (RTL8812A_SUPPORT==1)
\r
1269 if(pDM_Odm->SupportICType == ODM_RTL8812)
\r
1270 ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
\r
1275 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First connect case: IGI does on-shot to 0x%x\n", CurrentIGI));
\r
1281 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
1283 if (priv->pshare->rf_ft_var.dig_upcheck_enable)
\r
1284 DIG_GoUpCheck = phydm_DIG_GoUpCheck(pDM_Odm);
\r
1287 if((pFalseAlmCnt->Cnt_all > dm_FA_thres[2]) && DIG_GoUpCheck)
\r
1288 CurrentIGI = CurrentIGI + 4;
\r
1289 else if ((pFalseAlmCnt->Cnt_all > dm_FA_thres[1]) && DIG_GoUpCheck)
\r
1290 CurrentIGI = CurrentIGI + 2;
\r
1291 else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
\r
1292 CurrentIGI = CurrentIGI - 2;
\r
1294 //4 Abnormal # beacon case
\r
1295 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1296 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
\r
1298 CurrentIGI = pDM_DigTable->rx_gain_range_min;
\r
1299 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n",
\r
1300 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));
\r
1308 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
\r
1310 if(FirstDisConnect || bFirstCoverage)
\r
1312 CurrentIGI = dm_dig_min;
\r
1313 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));
\r
1318 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
1319 if (priv->pshare->rf_ft_var.dig_upcheck_enable)
\r
1320 DIG_GoUpCheck = phydm_DIG_GoUpCheck(pDM_Odm);
\r
1323 if((pFalseAlmCnt->Cnt_all > dm_FA_thres[2]) && DIG_GoUpCheck)
\r
1324 CurrentIGI = CurrentIGI + 4;
\r
1325 else if ((pFalseAlmCnt->Cnt_all > dm_FA_thres[1]) && DIG_GoUpCheck)
\r
1326 CurrentIGI = CurrentIGI + 2;
\r
1327 else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
\r
1328 CurrentIGI = CurrentIGI - 2;
\r
1332 //1 Check initial gain by upper/lower bound
\r
1333 if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
\r
1334 CurrentIGI = pDM_DigTable->rx_gain_range_min;
\r
1336 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
\r
1337 CurrentIGI = pDM_DigTable->rx_gain_range_max;
\r
1339 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));
\r
1343 #if ((DM_ODM_SUPPORT_TYPE & ODM_WIN) || ((DM_ODM_SUPPORT_TYPE & ODM_CE) && (ODM_CONFIG_BT_COEXIST == 1)))
\r
1344 if(pDM_Odm->bBtHsOperation)
\r
1346 if(pDM_Odm->bLinked)
\r
1348 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
\r
1349 ODM_Write_DIG(pDM_Odm, CurrentIGI);
\r
1351 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
\r
1353 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
\r
1354 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
\r
1358 if(pDM_Odm->bLinkInProcess)
\r
1359 ODM_Write_DIG(pDM_Odm, 0x1c);
\r
1360 else if(pDM_Odm->bBtConnectProcess)
\r
1361 ODM_Write_DIG(pDM_Odm, 0x28);
\r
1363 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
\r
1366 else // BT is not using
\r
1369 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
\r
1370 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
\r
1371 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
\r
1377 odm_DIGbyRSSI_LPS(
\r
1381 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1382 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1383 PFALSE_ALARM_STATISTICS pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
\r
1385 u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
\r
1386 u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
\r
1388 if(odm_DigAbort(pDM_Odm) == TRUE)
\r
1391 CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
\r
1393 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
\r
1395 // Using FW PS mode to make IGI
\r
1396 //Adjust by FA in LPS MODE
\r
1397 if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
\r
1398 CurrentIGI = CurrentIGI+4;
\r
1399 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
\r
1400 CurrentIGI = CurrentIGI+2;
\r
1401 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
\r
1402 CurrentIGI = CurrentIGI-2;
\r
1405 //Lower bound checking
\r
1407 //RSSI Lower bound check
\r
1408 if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
\r
1409 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
\r
1411 RSSI_Lower =DM_DIG_MIN_NIC;
\r
1413 //Upper and Lower Bound checking
\r
1414 if(CurrentIGI > DM_DIG_MAX_NIC)
\r
1415 CurrentIGI = DM_DIG_MAX_NIC;
\r
1416 else if(CurrentIGI < RSSI_Lower)
\r
1417 CurrentIGI = RSSI_Lower;
\r
1419 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));
\r
1420 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));
\r
1421 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));
\r
1423 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
\r
1427 //3============================================================
\r
1428 //3 FASLE ALARM CHECK
\r
1429 //3============================================================
\r
1432 odm_FalseAlarmCounterStatistics(
\r
1436 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1437 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
\r
1438 #if (PHYDM_LA_MODE_SUPPORT == 1)
\r
1439 PRT_ADCSMP AdcSmp = &(pDM_Odm->adcsmp);
\r
1443 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
\r
1444 //Mark there, and check this in odm_DMWatchDog
\r
1445 #if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)
\r
1446 prtl8192cd_priv priv = pDM_Odm->priv;
\r
1447 if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
\r
1452 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
\r
1455 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics()======>\n"));
\r
1457 #if (ODM_IC_11N_SERIES_SUPPORT == 1)
\r
1458 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
1461 //hold ofdm counter
\r
1462 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
\r
1463 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
\r
1465 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
\r
1466 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
\r
1467 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
\r
1469 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
\r
1470 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
\r
1471 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
\r
1473 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
\r
1474 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
\r
1475 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
\r
1477 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
\r
1478 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
\r
1480 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
\r
1481 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
\r
1482 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
\r
1484 /* read CCK CRC32 counter */
\r
1485 FalseAlmCnt->cnt_cck_crc32_error = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CRC32_ERROR_CNT_11N, bMaskDWord);
\r
1486 FalseAlmCnt->cnt_cck_crc32_ok= ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CRC32_OK_CNT_11N, bMaskDWord);
\r
1488 /* read OFDM CRC32 counter */
\r
1489 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_CRC32_CNT_11N, bMaskDWord);
\r
1490 FalseAlmCnt->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;
\r
1491 FalseAlmCnt->cnt_ofdm_crc32_ok= ret_value & 0xffff;
\r
1493 /* read HT CRC32 counter */
\r
1494 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_HT_CRC32_CNT_11N, bMaskDWord);
\r
1495 FalseAlmCnt->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;
\r
1496 FalseAlmCnt->cnt_ht_crc32_ok= ret_value & 0xffff;
\r
1498 /* read VHT CRC32 counter */
\r
1499 FalseAlmCnt->cnt_vht_crc32_error = 0;
\r
1500 FalseAlmCnt->cnt_vht_crc32_ok= 0;
\r
1502 #if (RTL8188E_SUPPORT==1)
\r
1503 if(pDM_Odm->SupportICType == ODM_RTL8188E)
\r
1505 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
\r
1506 FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
\r
1507 FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
\r
1512 //hold cck counter
\r
1513 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
\r
1514 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
\r
1516 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
\r
1517 FalseAlmCnt->Cnt_Cck_fail = ret_value;
\r
1519 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
\r
1520 FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
\r
1522 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
\r
1523 FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
\r
1526 FalseAlmCnt->Cnt_all_pre = FalseAlmCnt->Cnt_all;
\r
1528 FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Fast_Fsync +
\r
1529 FalseAlmCnt->Cnt_SB_Search_fail +
\r
1530 FalseAlmCnt->Cnt_Parity_Fail +
\r
1531 FalseAlmCnt->Cnt_Rate_Illegal +
\r
1532 FalseAlmCnt->Cnt_Crc8_fail +
\r
1533 FalseAlmCnt->Cnt_Mcs_fail +
\r
1534 FalseAlmCnt->Cnt_Cck_fail);
\r
1536 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
\r
1538 if (pDM_Odm->SupportICType >= ODM_RTL8188E) {
\r
1539 /*reset false alarm counter registers*/
\r
1540 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
\r
1541 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
\r
1542 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
\r
1543 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
\r
1545 /*update ofdm counter*/
\r
1546 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); /*update page C counter*/
\r
1547 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); /*update page D counter*/
\r
1549 /*reset CCK CCA counter*/
\r
1550 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
\r
1551 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
\r
1553 /*reset CCK FA counter*/
\r
1554 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
\r
1555 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
\r
1557 /*reset CRC32 counter*/
\r
1558 ODM_SetBBReg(pDM_Odm, ODM_REG_PAGE_F_RST_11N, BIT16, 1);
\r
1559 ODM_SetBBReg(pDM_Odm, ODM_REG_PAGE_F_RST_11N, BIT16, 0);
\r
1562 /* Get debug port 0 */
\r
1563 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x0);
\r
1564 FalseAlmCnt->dbg_port0 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, bMaskDWord);
\r
1566 /* Get EDCCA flag */
\r
1567 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);
\r
1568 FalseAlmCnt->edcca_flag = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, BIT30);
\r
1570 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
\r
1571 FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
\r
1572 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
\r
1573 FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
\r
1574 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
\r
1575 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
\r
1579 #if (ODM_IC_11AC_SERIES_SUPPORT == 1)
\r
1580 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
1584 /* read OFDM FA counter */
\r
1585 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
\r
1587 /* Read CCK FA counter */
\r
1588 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
\r
1590 /* read CCK/OFDM CCA counter */
\r
1591 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);
\r
1592 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;
\r
1593 FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;
\r
1595 /* read CCK CRC32 counter */
\r
1596 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CRC32_CNT_11AC, bMaskDWord);
\r
1597 FalseAlmCnt->cnt_cck_crc32_error = (ret_value & 0xffff0000) >> 16;
\r
1598 FalseAlmCnt->cnt_cck_crc32_ok= ret_value & 0xffff;
\r
1600 /* read OFDM CRC32 counter */
\r
1601 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_CRC32_CNT_11AC, bMaskDWord);
\r
1602 FalseAlmCnt->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;
\r
1603 FalseAlmCnt->cnt_ofdm_crc32_ok= ret_value & 0xffff;
\r
1605 /* read HT CRC32 counter */
\r
1606 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_HT_CRC32_CNT_11AC, bMaskDWord);
\r
1607 FalseAlmCnt->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;
\r
1608 FalseAlmCnt->cnt_ht_crc32_ok= ret_value & 0xffff;
\r
1610 /* read VHT CRC32 counter */
\r
1611 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_VHT_CRC32_CNT_11AC, bMaskDWord);
\r
1612 FalseAlmCnt->cnt_vht_crc32_error = (ret_value & 0xffff0000) >> 16;
\r
1613 FalseAlmCnt->cnt_vht_crc32_ok= ret_value & 0xffff;
\r
1615 #if (RTL8881A_SUPPORT==1)
\r
1617 if(pDM_Odm->SupportICType == ODM_RTL8881A)
\r
1619 u4Byte Cnt_Ofdm_fail_temp = 0;
\r
1621 if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
\r
1623 Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;
\r
1624 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
\r
1625 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;
\r
1628 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
\r
1629 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail_pre));
\r
1630 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail_pre=%d\n", Cnt_Ofdm_fail_temp));
\r
1632 /* Reset FA counter by enable/disable OFDM */
\r
1633 if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
\r
1636 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);
\r
1637 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);
\r
1638 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
\r
1639 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Reset false alarm counter\n"));
\r
1644 /* reset OFDM FA coutner */
\r
1645 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
\r
1646 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
\r
1648 /* reset CCK FA counter */
\r
1649 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
\r
1650 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
\r
1652 /* reset CCA counter */
\r
1653 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);
\r
1654 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);
\r
1656 CCKenable = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
\r
1657 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
\r
1659 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
\r
1660 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;
\r
1664 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
\r
1665 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
\r
1668 #if (PHYDM_LA_MODE_SUPPORT == 1)
\r
1669 if (AdcSmp->ADCSmpState == ADCSMP_STATE_IDLE)
\r
1672 /* Get debug port 0 */
\r
1673 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x0);
\r
1674 FalseAlmCnt->dbg_port0 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, bMaskDWord);
\r
1676 /* Get EDCCA flag */
\r
1677 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);
\r
1678 FalseAlmCnt->edcca_flag = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, BIT30);
\r
1684 FalseAlmCnt->cnt_crc32_error_all = FalseAlmCnt->cnt_vht_crc32_error + FalseAlmCnt->cnt_ht_crc32_error + FalseAlmCnt->cnt_ofdm_crc32_error + FalseAlmCnt->cnt_cck_crc32_error;
\r
1685 FalseAlmCnt->cnt_crc32_ok_all = FalseAlmCnt->cnt_vht_crc32_ok + FalseAlmCnt->cnt_ht_crc32_ok + FalseAlmCnt->cnt_ofdm_crc32_ok + FalseAlmCnt->cnt_cck_crc32_ok;
\r
1687 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_OFDM_CCA=%d\n", FalseAlmCnt->Cnt_OFDM_CCA));
\r
1688 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_CCK_CCA=%d\n", FalseAlmCnt->Cnt_CCK_CCA));
\r
1689 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_CCA_all=%d\n", FalseAlmCnt->Cnt_CCA_all));
\r
1690 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
\r
1691 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
\r
1692 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
\r
1693 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));
\r
1694 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): CCK CRC32 fail: %d, ok: %d\n", FalseAlmCnt->cnt_cck_crc32_error, FalseAlmCnt->cnt_cck_crc32_ok));
\r
1695 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): OFDM CRC32 fail: %d, ok: %d\n", FalseAlmCnt->cnt_ofdm_crc32_error, FalseAlmCnt->cnt_ofdm_crc32_ok));
\r
1696 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): HT CRC32 fail: %d, ok: %d\n", FalseAlmCnt->cnt_ht_crc32_error, FalseAlmCnt->cnt_ht_crc32_ok));
\r
1697 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): VHT CRC32 fail: %d, ok: %d\n", FalseAlmCnt->cnt_vht_crc32_error, FalseAlmCnt->cnt_vht_crc32_ok));
\r
1698 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): Total CRC32 fail: %d, ok: %d\n", FalseAlmCnt->cnt_crc32_error_all, FalseAlmCnt->cnt_crc32_ok_all));
\r
1699 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("odm_FalseAlarmCounterStatistics(): dbg port 0x0 = 0x%x, EDCCA = %d\n\n", FalseAlmCnt->dbg_port0, FalseAlmCnt->edcca_flag));
\r
1702 //3============================================================
\r
1703 //3 CCK Packet Detect Threshold
\r
1704 //3============================================================
\r
1707 odm_PauseCCKPacketDetection(
\r
1708 IN PVOID pDM_VOID,
\r
1709 IN PHYDM_PAUSE_TYPE PauseType,
\r
1710 IN PHYDM_PAUSE_LEVEL pause_level,
\r
1711 IN u1Byte CCKPDThreshold
\r
1714 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1715 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
1717 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========> level = %d\n", pause_level));
\r
1719 if ((pDM_DigTable->pause_cckpd_level == 0) && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))) {
\r
1720 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Return: SupportAbility ODM_BB_CCK_PD or ODM_BB_FA_CNT is disabled\n"));
\r
1724 if (pause_level > DM_DIG_MAX_PAUSE_TYPE) {
\r
1725 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD,
\r
1726 ("odm_PauseCCKPacketDetection(): Return: Wrong pause level !!\n"));
\r
1730 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_cckpd_level, CCKPDThreshold));
\r
1731 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
\r
1732 pDM_DigTable->pause_cckpd_value[7], pDM_DigTable->pause_cckpd_value[6], pDM_DigTable->pause_cckpd_value[5], pDM_DigTable->pause_cckpd_value[4],
\r
1733 pDM_DigTable->pause_cckpd_value[3], pDM_DigTable->pause_cckpd_value[2], pDM_DigTable->pause_cckpd_value[1], pDM_DigTable->pause_cckpd_value[0]));
\r
1735 switch (PauseType) {
\r
1736 /* Pause CCK Packet Detection Threshold */
\r
1739 /* Disable CCK PD */
\r
1740 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));
\r
1741 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Pause CCK packet detection threshold !!\n"));
\r
1743 /* Backup original CCK PD threshold decided by CCK PD mechanism */
\r
1744 if (pDM_DigTable->pause_cckpd_level == 0) {
\r
1745 pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
\r
1746 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD,
\r
1747 ("odm_PauseCCKPacketDetection(): Backup CCKPD = 0x%x, new CCKPD = 0x%x\n", pDM_DigTable->CCKPDBackup, CCKPDThreshold));
\r
1750 /* Update pause level */
\r
1751 pDM_DigTable->pause_cckpd_level = (pDM_DigTable->pause_cckpd_level | BIT(pause_level));
\r
1753 /* Record CCK PD threshold */
\r
1754 pDM_DigTable->pause_cckpd_value[pause_level] = CCKPDThreshold;
\r
1756 /* Write new CCK PD threshold */
\r
1757 if (BIT(pause_level + 1) > pDM_DigTable->pause_cckpd_level) {
\r
1758 ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);
\r
1759 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): CCKPD of higher level = 0x%x\n", CCKPDThreshold));
\r
1763 /* Resume CCK Packet Detection Threshold */
\r
1764 case PHYDM_RESUME:
\r
1766 /* check if the level is illegal or not */
\r
1767 if ((pDM_DigTable->pause_cckpd_level & (BIT(pause_level))) != 0) {
\r
1768 pDM_DigTable->pause_cckpd_level = pDM_DigTable->pause_cckpd_level & (~(BIT(pause_level)));
\r
1769 pDM_DigTable->pause_cckpd_value[pause_level] = 0;
\r
1770 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Resume CCK PD !!\n"));
\r
1772 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Wrong resume level !!\n"));
\r
1777 if (pDM_DigTable->pause_cckpd_level == 0) {
\r
1778 /* Write backup IGI value */
\r
1779 ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
\r
1780 /* pDM_DigTable->bIgnoreDIG = TRUE; */
\r
1781 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Write original CCKPD = 0x%x\n", pDM_DigTable->CCKPDBackup));
\r
1784 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);
\r
1788 if (BIT(pause_level) > pDM_DigTable->pause_cckpd_level) {
\r
1791 /* Calculate the maximum level now */
\r
1792 for (max_level = (pause_level - 1); max_level >= 0; max_level--) {
\r
1793 if ((pDM_DigTable->pause_cckpd_level & BIT(max_level)) > 0)
\r
1797 /* write CCKPD of lower level */
\r
1798 ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->pause_cckpd_value[max_level]);
\r
1799 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Write CCKPD (0x%x) of level (%d)\n",
\r
1800 pDM_DigTable->pause_cckpd_value[max_level], max_level));
\r
1806 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): Wrong type !!\n"));
\r
1810 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause level = 0x%x, Current value = 0x%x\n", pDM_DigTable->pause_cckpd_level, CCKPDThreshold));
\r
1811 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection(): pause value = 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
\r
1812 pDM_DigTable->pause_cckpd_value[7], pDM_DigTable->pause_cckpd_value[6], pDM_DigTable->pause_cckpd_value[5], pDM_DigTable->pause_cckpd_value[4],
\r
1813 pDM_DigTable->pause_cckpd_value[3], pDM_DigTable->pause_cckpd_value[2], pDM_DigTable->pause_cckpd_value[1], pDM_DigTable->pause_cckpd_value[0]));
\r
1818 odm_CCKPacketDetectionThresh(
\r
1822 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1823 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
1824 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
\r
1825 u1Byte CurCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres, RSSI_thd = 35;
\r
1828 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
1829 //modify by Guo.Mingzhi 2011-12-29
\r
1830 if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
\r
1831 // if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
\r
1833 if(pDM_Odm->bBtHsOperation)
\r
1835 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
\r
1836 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
\r
1841 if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
\r
1843 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() return==========\n"));
\r
1844 #ifdef MCR_WIRELESS_EXTEND
\r
1845 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0x43);
\r
1850 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1851 if(pDM_Odm->ExtLNA)
\r
1855 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() ==========>\n"));
\r
1857 if (pDM_DigTable->cckFaMa == 0xffffffff)
\r
1858 pDM_DigTable->cckFaMa = FalseAlmCnt->Cnt_Cck_fail;
\r
1860 pDM_DigTable->cckFaMa = ((pDM_DigTable->cckFaMa<<1) + pDM_DigTable->cckFaMa + FalseAlmCnt->Cnt_Cck_fail) >> 2;
\r
1861 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh(): CCK FA moving average = %d\n", pDM_DigTable->cckFaMa));
\r
1863 if (pDM_Odm->bLinked) {
\r
1864 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1865 if (pDM_Odm->RSSI_Min > (RSSI_thd + 14))
\r
1866 CurCCK_CCAThres = 0xed;
\r
1867 else if (pDM_Odm->RSSI_Min > (RSSI_thd + 6))
\r
1868 CurCCK_CCAThres = 0xdd;
\r
1869 else if (pDM_Odm->RSSI_Min > RSSI_thd)
\r
1870 CurCCK_CCAThres = 0xcd;
\r
1871 else if (pDM_Odm->RSSI_Min > 20) {
\r
1872 if (pDM_DigTable->cckFaMa > ((DM_DIG_FA_TH1>>1) + (DM_DIG_FA_TH1>>3)))
\r
1873 CurCCK_CCAThres = 0xcd;
\r
1874 else if (pDM_DigTable->cckFaMa < (DM_DIG_FA_TH0>>1))
\r
1875 CurCCK_CCAThres = 0x83;
\r
1876 } else if (pDM_Odm->RSSI_Min > 7)
\r
1877 CurCCK_CCAThres = 0x83;
\r
1879 CurCCK_CCAThres = 0x40;
\r
1881 if (pDM_DigTable->CurIGValue > (0x24 + 14))
\r
1882 CurCCK_CCAThres = 0xed;
\r
1883 else if (pDM_DigTable->CurIGValue > (0x24 + 6))
\r
1884 CurCCK_CCAThres = 0xdd;
\r
1885 else if (pDM_DigTable->CurIGValue > 0x24)
\r
1886 CurCCK_CCAThres = 0xcd;
\r
1888 if (pDM_DigTable->cckFaMa > 0x400)
\r
1889 CurCCK_CCAThres = 0x83;
\r
1890 else if (pDM_DigTable->cckFaMa < 0x200)
\r
1891 CurCCK_CCAThres = 0x40;
\r
1896 if (pDM_DigTable->cckFaMa > 0x400)
\r
1897 CurCCK_CCAThres = 0x83;
\r
1898 else if (pDM_DigTable->cckFaMa < 0x200)
\r
1899 CurCCK_CCAThres = 0x40;
\r
1902 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
\r
1904 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() CurCCK_CCAThres = 0x%x\n", CurCCK_CCAThres));
\r
1908 ODM_Write_CCK_CCA_Thres(
\r
1909 IN PVOID pDM_VOID,
\r
1910 IN u1Byte CurCCK_CCAThres
\r
1913 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1914 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
1916 if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
\r
1918 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
\r
1919 pDM_DigTable->cckFaMa = 0xffffffff;
\r
1921 pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
\r
1922 pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
\r
1926 phydm_DIG_GoUpCheck(
\r
1930 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1931 PCCX_INFO CCX_INFO = &pDM_Odm->DM_CCX_INFO;
\r
1932 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
1933 u1Byte CurIGValue = pDM_DigTable->CurIGValue;
\r
1934 u1Byte max_DIG_cover_bond;
\r
1935 u1Byte current_IGI_MaxUp_resolution;
\r
1936 u1Byte rx_gain_range_max;
\r
1939 u4Byte total_NHM_cnt;
\r
1940 u4Byte DIG_cover_cnt;
\r
1941 u4Byte over_DIG_cover_cnt;
\r
1942 BOOLEAN ret = TRUE;
\r
1944 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
1945 prtl8192cd_priv priv = pDM_Odm->priv;
\r
1947 max_DIG_cover_bond = DM_DIG_MAX_AP - priv->pshare->rf_ft_var.dig_upcheck_initial_value;
\r
1948 current_IGI_MaxUp_resolution = CurIGValue + 6;
\r
1949 rx_gain_range_max = pDM_DigTable->rx_gain_range_max;
\r
1951 phydm_getNHMresult(pDM_Odm);
\r
1953 total_NHM_cnt = CCX_INFO->NHM_result[0] + CCX_INFO->NHM_result[1];
\r
1955 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): *****Get NHM results*****\n"));
\r
1957 if (total_NHM_cnt != 0) {
\r
1959 /* CurIGValue < max_DIG_cover_bond - 6 */
\r
1960 if (pDM_DigTable->DIG_GoUpCheck_Level == DIG_GOUPCHECK_LEVEL_0) {
\r
1961 DIG_cover_cnt = CCX_INFO->NHM_result[1];
\r
1962 ret = ((priv->pshare->rf_ft_var.dig_level0_ratio_reciprocal * DIG_cover_cnt) >= total_NHM_cnt) ? TRUE : FALSE;
\r
1965 /* (max_DIG_cover_bond - 6) <= CurIGValue < DM_DIG_MAX_AP */
\r
1966 else if (pDM_DigTable->DIG_GoUpCheck_Level == DIG_GOUPCHECK_LEVEL_1) {
\r
1967 over_DIG_cover_cnt = CCX_INFO->NHM_result[1];
\r
1968 ret = (priv->pshare->rf_ft_var.dig_level1_ratio_reciprocal * over_DIG_cover_cnt < total_NHM_cnt) ? TRUE : FALSE;
\r
1971 /* update pDM_DigTable->rx_gain_range_max */
\r
1972 pDM_DigTable->rx_gain_range_max = (rx_gain_range_max >= max_DIG_cover_bond - 6) ? (max_DIG_cover_bond - 6) : rx_gain_range_max;
\r
1974 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): Noise power is beyond DIG can filter, lock rx_gain_range_max to 0x%x\n",
\r
1975 pDM_DigTable->rx_gain_range_max));
\r
1979 /* CurIGValue > DM_DIG_MAX_AP, foolproof */
\r
1980 else if (pDM_DigTable->DIG_GoUpCheck_Level == DIG_GOUPCHECK_LEVEL_2) {
\r
1984 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): DIG_GoUpCheck_level = %d\n, current_IGI_MaxUp_resolution = 0x%x\n, max_DIG_cover_bond = 0x%x\n, rx_gain_range_max = 0x%x, ret = %d\n",
\r
1985 pDM_DigTable->DIG_GoUpCheck_Level,
\r
1986 current_IGI_MaxUp_resolution,
\r
1987 max_DIG_cover_bond,
\r
1988 pDM_DigTable->rx_gain_range_max,
\r
1991 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): NHM_result = %d, %d, %d, %d\n",
\r
1992 CCX_INFO->NHM_result[0], CCX_INFO->NHM_result[1], CCX_INFO->NHM_result[2], CCX_INFO->NHM_result[3]));
\r
1998 for (i = 0 ; i <= 10 ; i ++) {
\r
1999 CCX_INFO->NHM_th[i] = 0xFF;
\r
2002 if (CurIGValue < max_DIG_cover_bond - 6){
\r
2003 CCX_INFO->NHM_th[0] = 2 * (CurIGValue - priv->pshare->rf_ft_var.dig_upcheck_initial_value);
\r
2004 pDM_DigTable->DIG_GoUpCheck_Level = DIG_GOUPCHECK_LEVEL_0;
\r
2006 else if (CurIGValue <= DM_DIG_MAX_AP) {
\r
2007 CCX_INFO->NHM_th[0] = 2 * max_DIG_cover_bond;
\r
2008 pDM_DigTable->DIG_GoUpCheck_Level = DIG_GOUPCHECK_LEVEL_1;
\r
2010 /* CurIGValue > DM_DIG_MAX_AP, foolproof */
\r
2012 pDM_DigTable->DIG_GoUpCheck_Level = DIG_GOUPCHECK_LEVEL_2;
\r
2016 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): *****Set NHM settings*****\n"));
\r
2017 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): DIG_GoUpCheck_level = %d\n",
\r
2018 pDM_DigTable->DIG_GoUpCheck_Level));
\r
2019 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("phydm_DIG_GoUpCheck(): NHM_th = 0x%x, 0x%x, 0x%x\n",
\r
2020 CCX_INFO->NHM_th[0], CCX_INFO->NHM_th[1], CCX_INFO->NHM_th[2]));
\r
2022 CCX_INFO->NHM_inexclude_cca = NHM_EXCLUDE_CCA;
\r
2023 CCX_INFO->NHM_inexclude_txon = NHM_EXCLUDE_TXON;
\r
2024 CCX_INFO->NHM_period = 0xC350;
\r
2026 phydm_NHMsetting(pDM_Odm, SET_NHM_SETTING);
\r
2027 phydm_NHMtrigger(pDM_Odm);
\r
2033 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
2035 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
\r
2038 IN PDM_ODM_T pDM_Odm,
\r
2042 PADAPTER Adapter = (PADAPTER)pDM_Odm->Adapter;
\r
2043 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
2044 static u1Byte TRSW_HighPwr = 0;
\r
2046 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
\r
2047 RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
\r
2049 if (pHalData->RFEType == 3) {
\r
2051 pDM_Odm->RSSI_TRSW = RSSIVal;
\r
2053 if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H)
\r
2055 TRSW_HighPwr = 1; // Switch to
\r
2056 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
\r
2057 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); // Set ANTSW=1/ANTSWB=0 for SW control
\r
2060 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L)
\r
2062 TRSW_HighPwr = 0; // Switched back
\r
2063 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
\r
2064 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0); // Set ANTSW=1/ANTSWB=0 for SW control
\r
2070 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L) = (%d, %d)\n", pDM_Odm->RSSI_TRSW_H, pDM_Odm->RSSI_TRSW_L));
\r
2071 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n",
\r
2072 RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
\r
2073 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));
\r
2077 odm_MPT_DIGWorkItemCallback(
\r
2081 PADAPTER Adapter = (PADAPTER)pContext;
\r
2082 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
2083 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
2085 ODM_MPT_DIG(pDM_Odm);
\r
2089 odm_MPT_DIGCallback(
\r
2093 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
\r
2094 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
2095 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
2098 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
\r
2100 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
\r
2102 ODM_MPT_DIG(pDM_Odm);
\r
2105 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
\r
2112 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
\r
2114 odm_MPT_DIGCallback(
\r
2118 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
2120 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
\r
2122 ODM_MPT_DIG(pDM_Odm);
\r
2127 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
\r
2129 odm_MPT_Write_DIG(
\r
2130 IN PVOID pDM_VOID,
\r
2131 IN u1Byte CurIGValue
\r
2134 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
2135 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
2137 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
\r
2139 #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)
\r
2140 /* Set IGI value of CCK for new CCK AGC */
\r
2141 if (pDM_Odm->cck_new_agc) {
\r
2142 if (pDM_Odm->SupportICType & ODM_IC_PHY_STATUE_NEW_TYPE)
\r
2143 ODM_SetBBReg(pDM_Odm, 0xa0c, 0x00003f00, (CurIGValue>>1));
\r
2148 if(pDM_Odm->RFType > ODM_1T1R)
\r
2149 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
\r
2151 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
\r
2153 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
\r
2154 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);
\r
2157 pDM_DigTable->CurIGValue = CurIGValue;
\r
2159 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));
\r
2160 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));
\r
2168 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
2169 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
2170 PFALSE_ALARM_STATISTICS pFalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT);
\r
2171 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
\r
2172 u1Byte DIG_Upper = 0x40, DIG_Lower = 0x20;
\r
2174 u4Byte RxPWDBAve_final;
\r
2175 u1Byte IGI_A = 0x20, IGI_B = 0x20;
\r
2177 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
2179 #if ODM_FIX_2G_DIG
\r
2185 if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
\r
2188 if (*pDM_Odm->pBandType == ODM_BAND_5G)
\r
2192 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
\r
2194 #if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & ODM_AP))
\r
2195 if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))) // for 5G or 8814
\r
2197 if (1) // for both 2G/5G
\r
2200 odm_FalseAlarmCounterStatistics(pDM_Odm);
\r
2202 RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
\r
2203 RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
\r
2205 pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
\r
2206 pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
\r
2207 pDM_Odm->RxPWDBAve = 0;
\r
2208 pDM_Odm->MPDIG_2G = FALSE;
\r
2210 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
2211 pDM_Odm->Times_2G = 0;
\r
2214 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
\r
2215 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));
\r
2217 if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
\r
2219 if (CurrentIGI > 0x24)
\r
2220 odm_MPT_Write_DIG(pDM_Odm, 0x24);
\r
2224 if(pFalseAlmCnt->Cnt_all > 1000){
\r
2225 CurrentIGI = CurrentIGI + 8;
\r
2227 else if(pFalseAlmCnt->Cnt_all > 200){
\r
2228 CurrentIGI = CurrentIGI + 4;
\r
2230 else if (pFalseAlmCnt->Cnt_all > 50){
\r
2231 CurrentIGI = CurrentIGI + 2;
\r
2233 else if (pFalseAlmCnt->Cnt_all < 2){
\r
2234 CurrentIGI = CurrentIGI - 2;
\r
2237 if (CurrentIGI < DIG_Lower ){
\r
2238 CurrentIGI = DIG_Lower;
\r
2241 if(CurrentIGI > DIG_Upper){
\r
2242 CurrentIGI = DIG_Upper;
\r
2245 odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);
\r
2246 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG = 0x%x, Cnt_all = %d, Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d\n",
\r
2247 CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
\r
2252 if(pDM_Odm->MPDIG_2G == FALSE)
\r
2254 if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B)))
\r
2256 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));
\r
2257 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);
\r
2258 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);
\r
2259 pDM_DigTable->CurIGValue = IGI_B;
\r
2262 odm_MPT_Write_DIG(pDM_Odm, IGI_A);
\r
2265 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
2266 pDM_Odm->Times_2G++;
\r
2268 if (pDM_Odm->Times_2G == 3)
\r
2271 pDM_Odm->MPDIG_2G = TRUE;
\r
2275 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
2276 if (pDM_Odm->SupportICType == ODM_RTL8812)
\r
2277 odm_RFEControl(pDM_Odm, RxPWDBAve_final);
\r
2280 ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);
\r