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
25 #include "odm_precomp.h"
\r
26 #define ADAPTIVITY_VERSION "5.0"
30 ODM_ChangeDynamicInitGainThresh(
36 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
37 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
39 if (DM_Type == DIG_TYPE_THRESH_HIGH)
41 pDM_DigTable->RssiHighThresh = DM_Value;
43 else if (DM_Type == DIG_TYPE_THRESH_LOW)
45 pDM_DigTable->RssiLowThresh = DM_Value;
47 else if (DM_Type == DIG_TYPE_ENABLE)
49 pDM_DigTable->Dig_Enable_Flag = TRUE;
51 else if (DM_Type == DIG_TYPE_DISABLE)
53 pDM_DigTable->Dig_Enable_Flag = FALSE;
55 else if (DM_Type == DIG_TYPE_BACKOFF)
59 pDM_DigTable->BackoffVal = (u1Byte)DM_Value;
61 else if(DM_Type == DIG_TYPE_RX_GAIN_MIN)
65 pDM_DigTable->rx_gain_range_min = (u1Byte)DM_Value;
67 else if(DM_Type == DIG_TYPE_RX_GAIN_MAX)
71 pDM_DigTable->rx_gain_range_max = (u1Byte)DM_Value;
73 } // DM_ChangeDynamicInitGainThresh //
\r
76 odm_NHMCounterStatisticsInit(
80 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
82 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
84 //PHY parameters initialize for ac series
85 ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11AC+2, 0x2710); //0x990[31:16]=0x2710 Time duration for NHM unit: 4us, 0x2710=40ms
86 ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC+2, 0xffff); //0x994[31:16]=0xffff th_9, th_10
87 //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff5c); //0x998=0xffffff5c th_3, th_2, th_1, th_0
88 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff52); //0x998=0xffffff52 th_3, th_2, th_1, th_0
89 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff); //0x99c=0xffffffff th_7, th_6, th_5, th_4
90 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff); //0x9a0[7:0]=0xff th_8
91 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8|BIT9|BIT10, 0x7); //0x994[9:8]=3 enable CCX
92 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1); //0x9e8[7]=1 max power among all RX ants
94 //panic_printk("RTL8812AU phy parameters init %s,%d\n", __FUNCTION__, __LINE__);
96 else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
98 //PHY parameters initialize for n series
99 ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x2710); //0x894[31:16]=0x2710 Time duration for NHM unit: 4us, 0x2710=40ms
100 //ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TIMER_11N+2, 0x4e20); //0x894[31:16]=0x4e20 Time duration for NHM unit: 4us, 0x4e20=80ms
101 ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff); //0x890[31:16]=0xffff th_9, th_10
102 //ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c); //0x898=0xffffff5c th_3, th_2, th_1, th_0
103 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff52); //0x898=0xffffff52 th_3, th_2, th_1, th_0
104 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); //0x89c=0xffffffff th_7, th_6, th_5, th_4
105 ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff); //0xe28[7:0]=0xff th_8
106 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7); //0x890[9:8]=3 enable CCX
107 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1); //0xc0c[7]=1 max power among all RX ants
112 odm_NHMCounterStatistics(
116 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
119 odm_GetNHMCounterStatistics(pDM_Odm);
122 odm_NHMCounterStatisticsReset(pDM_Odm);
126 odm_GetNHMCounterStatistics(
130 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
131 u4Byte value32 = 0;
\r
133 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
134 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord);
135 else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
136 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord);
138 pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0);
142 odm_NHMCounterStatisticsReset(
146 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
148 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
150 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0);
151 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1);
153 else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
155 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);
156 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);
165 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
167 pDM_Odm->adaptivity_flag = 0;
168 pDM_Odm->tolerance_cnt = 3;
169 pDM_Odm->NHMLastTxOkcnt = 0;
170 pDM_Odm->NHMLastRxOkcnt = 0;
171 pDM_Odm->NHMCurTxOkcnt = 0;
172 pDM_Odm->NHMCurRxOkcnt = 0;
181 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
183 //u1Byte test_status;
184 //PFALSE_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
186 pDM_Odm->NHMCurTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast) - pDM_Odm->NHMLastTxOkcnt;
187 pDM_Odm->NHMCurRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast) - pDM_Odm->NHMLastRxOkcnt;
188 pDM_Odm->NHMLastTxOkcnt = *(pDM_Odm->pNumTxBytesUnicast);
189 pDM_Odm->NHMLastRxOkcnt = *(pDM_Odm->pNumRxBytesUnicast);
190 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NHM_cnt_0=%d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n",
191 pDM_Odm->NHM_cnt_0, pDM_Odm->NHMCurTxOkcnt, pDM_Odm->NHMCurRxOkcnt));
194 if ( (pDM_Odm->NHMCurTxOkcnt) + 1 > (u8Byte)(pDM_Odm->NHMCurRxOkcnt<<2) + 1) //Tx > 4*Rx possible for adaptivity test
196 if(pDM_Odm->NHM_cnt_0 >= 190 || pDM_Odm->adaptivity_flag == TRUE)
198 //Enable EDCCA since it is possible running Adaptivity testing
200 pDM_Odm->adaptivity_flag = TRUE;
201 ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); //don't ignore EDCCA reg520[15]=0
\14
202 ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); //reg524[11]=1
203 pDM_Odm->tolerance_cnt = 0;
204 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
205 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;
206 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;
211 if(pDM_Odm->tolerance_cnt<3)
212 pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
214 pDM_Odm->tolerance_cnt = 4;
216 if(pDM_Odm->tolerance_cnt > 3)
219 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
220 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
221 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;
223 ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); //ignore EDCCA reg520[15]=1
224 ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); //reg524[11]=0
226 pDM_Odm->adaptivity_flag = FALSE;
232 if(pDM_Odm->adaptivity_flag == TRUE && pDM_Odm->NHM_cnt_0 <= 200)
235 ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); //don't ignore EDCCA reg520[15]=0
\14
236 ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); //reg524[11]=1
237 pDM_Odm->tolerance_cnt = 0;
238 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
239 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_backup;
240 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_backup ;
245 if(pDM_Odm->tolerance_cnt<3)
246 pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
248 pDM_Odm->tolerance_cnt = 4;
250 if(pDM_Odm->tolerance_cnt >3)
253 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
254 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
255 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2 ;
257 ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); //ignore EDCCA reg520[15]=1
258 ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); //reg524[11]=0
260 pDM_Odm->adaptivity_flag = FALSE;
265 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag));
269 odm_SearchPwdBLowerBound(
274 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
277 BOOLEAN bAdjust=TRUE;
278 s1Byte TH_L2H_dmc, TH_H2L_dmc;
279 s1Byte TH_L2H, TH_H2L, Diff;
281 IGI = 0x50; // find H2L, L2H lower bound
282 ODM_Write_DIG(pDM_Odm, IGI);
285 Diff = IGI_target -(s1Byte)IGI;
286 TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
289 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
290 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
292 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
293 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
296 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
302 for(cnt=0; cnt<20; cnt ++)
304 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
305 value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11N, bMaskDWord);
306 else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
307 value32 = ODM_GetBBReg(pDM_Odm,ODM_REG_RPT_11AC, bMaskDWord);
309 if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8723B|ODM_RTL8188E)))
310 pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
311 else if(value32 & BIT29)
312 pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
314 pDM_Odm->txEdcca0 = pDM_Odm->txEdcca0 + 1;
316 //DbgPrint("txEdcca1 = %d, txEdcca0 = %d\n", pDM_Odm->txEdcca1, pDM_Odm->txEdcca0);
318 if(pDM_Odm->txEdcca1 > 5 )
321 TH_L2H_dmc = TH_L2H_dmc + 1;
324 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
325 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
327 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
328 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
331 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
333 pDM_Odm->TxHangFlg = TRUE;
334 pDM_Odm->txEdcca1 = 0;
335 pDM_Odm->txEdcca0 = 0;
340 pDM_Odm->TxHangFlg = FALSE;
341 pDM_Odm->txEdcca1 = 0;
342 pDM_Odm->txEdcca0 = 0;
343 pDM_Odm->H2L_lb = TH_H2L_dmc;
344 pDM_Odm->L2H_lb = TH_L2H_dmc;
345 pDM_Odm->Adaptivity_IGI_upper = IGI;
351 pDM_Odm->TxHangFlg = FALSE;
352 pDM_Odm->txEdcca1 = 0;
353 pDM_Odm->txEdcca0 = 0;
354 pDM_Odm->H2L_lb = TH_H2L_dmc;
355 pDM_Odm->L2H_lb = TH_L2H_dmc;
356 pDM_Odm->Adaptivity_IGI_upper = IGI;
361 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI = 0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", IGI, pDM_Odm->H2L_lb , pDM_Odm->L2H_lb));
370 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
371 #if(DM_ODM_SUPPORT_TYPE == ODM_WIN)
372 PADAPTER pAdapter = pDM_Odm->Adapter;
373 PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
374 pDM_Odm->Carrier_Sense_enable = (BOOLEAN)pMgntInfo->RegEnableCarrierSense;
377 #if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
379 if(pDM_Odm->Carrier_Sense_enable == FALSE)
\r
381 pDM_Odm->TH_L2H_ini = 0xf7; // -7
384 pDM_Odm->TH_L2H_ini = 0xa;
\r
386 pDM_Odm->AdapEn_RSSI = 20;
387 pDM_Odm->TH_EDCCA_HL_diff = 7;
389 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
391 if(pDM_Odm->Carrier_Sense_enable){
392 pDM_Odm->TH_L2H_ini = 10;
393 pDM_Odm->TH_EDCCA_HL_diff = 3;
394 pDM_Odm->AdapEn_RSSI = 30;
398 pDM_Odm->TH_L2H_ini = 0xf7;
399 pDM_Odm->TH_EDCCA_HL_diff = 7;
400 pDM_Odm->AdapEn_RSSI = 20;
403 pDM_Odm->TH_L2H_ini_mode2 = 20;
404 pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8;
405 pDM_Odm->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini;
406 pDM_Odm->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff ;
410 pDM_Odm->IGI_Base = 0x32;
411 pDM_Odm->IGI_target = 0x1c;
412 pDM_Odm->ForceEDCCA = 0;
413 pDM_Odm->NHM_disable = FALSE;
414 pDM_Odm->TxHangFlg = TRUE;
415 pDM_Odm->txEdcca0 = 0;
416 pDM_Odm->txEdcca1 = 0;
419 pDM_Odm->Adaptivity_IGI_upper = 0;
420 odm_NHMBBInit(pDM_Odm);
422 ODM_SetBBReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); // stop counting if EDCCA is asserted
432 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
433 s1Byte TH_L2H_dmc, TH_H2L_dmc;
\r
434 s1Byte Diff, IGI_target;
435 BOOLEAN EDCCA_State = FALSE;
437 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
438 PADAPTER pAdapter = pDM_Odm->Adapter;
439 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
440 BOOLEAN bFwCurrentInPSMode=FALSE;
441 PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
443 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
445 // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
446 if(bFwCurrentInPSMode)
450 if(!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY))
452 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA() \n"));
453 // Add by Neil Chen to enable edcca to MP Platform
454 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
456 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
457 odm_DynamicEDCCA(pDM_Odm);
461 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====> \n"));
462 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n",
463 pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));
465 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
466 ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); //ADC_mask enable
468 if(*pDM_Odm->pBandWidth == ODM_BW20M) //CHANNEL_WIDTH_20
469 IGI_target = pDM_Odm->IGI_Base;
470 else if(*pDM_Odm->pBandWidth == ODM_BW40M)
471 IGI_target = pDM_Odm->IGI_Base + 2;
472 else if(*pDM_Odm->pBandWidth == ODM_BW80M)
473 IGI_target = pDM_Odm->IGI_Base + 2;
475 IGI_target = pDM_Odm->IGI_Base;
476 pDM_Odm->IGI_target = (u1Byte) IGI_target;
478 //Search pwdB lower bound
479 if(pDM_Odm->TxHangFlg == TRUE)
481 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
482 ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);
483 else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
484 ODM_SetBBReg(pDM_Odm,ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);
485 odm_SearchPwdBLowerBound(pDM_Odm, pDM_Odm->IGI_target );
488 if((!pDM_Odm->bLinked)||(*pDM_Odm->pChannel > 149)) // Band4 doesn't need adaptivity
490 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
492 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
493 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
496 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
500 if(!pDM_Odm->ForceEDCCA)
502 if(pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)
504 else if(pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))
510 if(pDM_Odm->bLinked && pDM_Odm->Carrier_Sense_enable == FALSE && pDM_Odm->NHM_disable == FALSE &&pDM_Odm->TxHangFlg == FALSE)
\r
511 odm_NHMBB(pDM_Odm);
\r
513 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
514 (*pDM_Odm->pBandWidth==ODM_BW80M)?"80M":((*pDM_Odm->pBandWidth==ODM_BW40M)?"40M":"20M"), IGI_target, EDCCA_State));
518 Diff = IGI_target -(s1Byte)IGI;
519 TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
523 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
525 //replace lower bound to prevent EDCCA always equal 1
526 if(TH_H2L_dmc < pDM_Odm->H2L_lb)
527 TH_H2L_dmc = pDM_Odm->H2L_lb;
528 if(TH_L2H_dmc < pDM_Odm->L2H_lb)
529 TH_L2H_dmc = pDM_Odm->L2H_lb;
536 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n",
537 IGI, TH_L2H_dmc, TH_H2L_dmc));
538 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
540 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte0, (u1Byte)TH_L2H_dmc);
541 ODM_SetBBReg(pDM_Odm,rOFDM0_ECCAThreshold, bMaskByte2, (u1Byte)TH_H2L_dmc);
544 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u1Byte)TH_H2L_dmc<<8) | (u1Byte)TH_L2H_dmc);
548 getIGIForDiff(int value_IGI)
550 #define ONERCCA_LOW_TH 0x30
551 #define ONERCCA_LOW_DIFF 8
553 if (value_IGI < ONERCCA_LOW_TH) {
554 if ((ONERCCA_LOW_TH - value_IGI) < ONERCCA_LOW_DIFF)
555 return ONERCCA_LOW_TH;
557 return value_IGI + ONERCCA_LOW_DIFF;
569 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
570 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
572 if(pDM_DigTable->bStopDIG)
574 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
578 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",
579 ODM_REG(IGI_A,pDM_Odm),ODM_BIT(IGI,pDM_Odm)));
581 if(pDM_DigTable->CurIGValue != CurrentIGI)
583 //1 Check initial gain by upper bound
584 if(!pDM_DigTable->bPSDInProgress)
586 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
588 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x) is larger than upper bound !!\n",pDM_DigTable->rx_gain_range_max));
589 CurrentIGI = pDM_DigTable->rx_gain_range_max;
595 if(pDM_Odm->SupportPlatform & (ODM_WIN|ODM_CE))
597 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
599 if(pDM_Odm->RFType > ODM_1T1R)
600 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
602 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
604 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
605 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
608 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
610 switch(*(pDM_Odm->pOnePathCCA))
613 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
615 if(pDM_Odm->RFType > ODM_1T1R)
616 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
618 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
620 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_C,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
621 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_D,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
625 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
626 if(pDM_Odm->RFType != ODM_1T1R)
627 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
630 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm), getIGIForDiff(CurrentIGI));
631 if(pDM_Odm->RFType != ODM_1T1R)
632 ODM_SetBBReg(pDM_Odm, ODM_REG(IGI_B,pDM_Odm), ODM_BIT(IGI,pDM_Odm), CurrentIGI);
636 pDM_DigTable->CurIGValue = CurrentIGI;
639 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x). \n",CurrentIGI));
646 IN ODM_Pause_DIG_TYPE PauseType,
650 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
651 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
652 static BOOLEAN bPaused = FALSE;
654 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG()=========>\n"));
656 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
657 if(*pDM_DigTable->pbP2pLinkInProgress)
659 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): P2P in progress !!\n"));
664 if((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && pDM_Odm->TxHangFlg == TRUE)
666 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Dynamic adjust threshold in progress !!\n"));
670 if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
672 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"));
681 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
682 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
687 pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
690 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI = 0x%x\n", pDM_DigTable->IGIBackup));
692 //2 Write new IGI value
693 ODM_Write_DIG(pDM_Odm, IGIValue);
694 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue));
701 //2 Write backup IGI value
702 ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
704 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
707 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);
708 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
713 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong type !!\n"));
723 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
725 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
726 prtl8192cd_priv priv = pDM_Odm->priv;
\r
727 #elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
728 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
729 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
\r
733 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
\r
735 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
740 if(!(pDM_Odm->SupportAbility & ODM_BB_DIG))
\r
742 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
747 if(*(pDM_Odm->pbScanInProcess))
\r
749 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress \n"));
753 //add by Neil Chen to avoid PSD is processing
\r
754 if(pDM_Odm->bDMInitialGainEnable == FALSE)
\r
756 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing \n"));
760 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
761 #if OS_WIN_FROM_WIN7(OS_VERSION)
\r
762 if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest)
764 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Is AP mode or In HCT Test \n"));
769 if(pDM_Odm->bBtHsOperation)
\r
771 odm_DigForBtHsMode(pDM_Odm);
\r
774 if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E)))
\r
776 if(pRX_HP_Table->RXHP_flag == 1)
\r
778 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In RXHP Operation \n"));
782 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
\r
783 #ifdef CONFIG_SPECIAL_SETTING_FOR_FUNAI_TV
\r
784 if((pDM_Odm->bLinked) && (pDM_Odm->Adapter->registrypriv.force_igi !=0))
786 printk("pDM_Odm->RSSI_Min=%d \n",pDM_Odm->RSSI_Min);
787 ODM_Write_DIG(pDM_Odm,pDM_Odm->Adapter->registrypriv.force_igi);
792 if (!(priv->up_time > 5))
\r
794 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: Not In DIG Operation Period \n"));
807 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
808 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
809 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
811 pDM_DigTable->bStopDIG = FALSE;
812 pDM_DigTable->bPSDInProgress = FALSE;
813 pDM_DigTable->CurIGValue = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(IGI_A,pDM_Odm), ODM_BIT(IGI,pDM_Odm));
814 pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW;
815 pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH;
816 pDM_DigTable->FALowThresh = DM_FALSEALARM_THRESH_LOW;
817 pDM_DigTable->FAHighThresh = DM_FALSEALARM_THRESH_HIGH;
818 pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
819 pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
820 pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
821 pDM_DigTable->PreCCK_CCAThres = 0xFF;
822 pDM_DigTable->CurCCK_CCAThres = 0x83;
823 pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
824 pDM_DigTable->LargeFAHit = 0;
825 pDM_DigTable->Recover_cnt = 0;
826 pDM_DigTable->bMediaConnect_0 = FALSE;
827 pDM_DigTable->bMediaConnect_1 = FALSE;
829 //To Initialize pDM_Odm->bDMInitialGainEnable == FALSE to avoid DIG error
830 pDM_Odm->bDMInitialGainEnable = TRUE;
832 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
833 pDM_DigTable->DIG_Dynamic_MIN_0 = 0x25;
834 pDM_DigTable->DIG_Dynamic_MIN_1 = 0x25;
836 // For AP\ ADSL modified DIG
837 pDM_DigTable->bTpTarget = FALSE;
838 pDM_DigTable->bNoiseEst = TRUE;
839 pDM_DigTable->IGIOffset_A = 0;
840 pDM_DigTable->IGIOffset_B = 0;
841 pDM_DigTable->TpTrainTH_min = 0;
844 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
847 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
849 ODM_SetBBReg(pDM_Odm, 0xC50, 0xFFFF0000, 0xfafd);
852 pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
853 pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
856 pDM_DigTable->BT30_CurIGI=0x32;
\r
858 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
859 *pDM_DigTable->pbP2pLinkInProgress= FALSE;
\r
863 if(pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA))
865 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
866 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
870 pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
871 pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
882 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
883 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
884 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
885 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
\r
886 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
887 prtl8192cd_priv priv = pDM_Odm->priv;
\r
888 PSTA_INFO_T pEntry;
\r
892 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
893 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
894 BOOLEAN FirstConnect,FirstDisConnect;
895 u1Byte DIG_MaxOfMin, DIG_Dynamic_MIN, i;
896 u1Byte dm_dig_max, dm_dig_min;
\r
897 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
\r
899 u4Byte dm_FA_thres[3];
\r
900 u1Byte Adap_IGI_Upper = 0;
901 u4Byte TxTp = 0, RxTp = 0;
\r
902 BOOLEAN bDFSBand = FALSE;
\r
903 BOOLEAN bPerformance = TRUE, bFirstTpTarget = FALSE, bFirstCoverage = FALSE;
\r
904 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
905 u4Byte TpTrainTH_MIN = DM_DIG_TP_Target_TH0;
\r
906 static u1Byte TimeCnt = 0;
\r
909 if(odm_DigAbort(pDM_Odm) == TRUE)
\r
912 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()===========================>\n\n"));
914 if(pDM_Odm->adaptivity_flag == TRUE)
915 Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper;
919 if(pDM_Odm->SupportICType == ODM_RTL8192D)
921 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
923 if(*(pDM_Odm->pbMasterOfDMSP))
\r
925 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
\r
926 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
927 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
931 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
\r
932 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
933 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
938 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
\r
940 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
\r
941 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
942 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
946 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_1;
\r
947 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == FALSE);
948 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_1 == TRUE);
954 DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
955 FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);
956 FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE);
\r
959 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
960 //1 Noise Floor Estimate
961 //pDM_DigTable->bNoiseEst = (FirstConnect)?TRUE:pDM_DigTable->bNoiseEst;
962 //odm_InbandNoiseCalculate (pDM_Odm);
967 //2 Calculate total TP
968 for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
970 pEntry = pDM_Odm->pODM_StaInfo[i];
971 if(IS_STA_VALID(pEntry))
973 RxTp += (u4Byte)(pEntry->rx_byte_cnt_LowMAW>>7);
974 TxTp += (u4Byte)(pEntry->tx_byte_cnt_LowMAW>>7); //Kbps
977 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TX TP = %dkbps, RX TP = %dkbps\n", TxTp, RxTp));
980 switch(pDM_Odm->priv->pshare->rf_ft_var.dig_cov_enable)
989 bPerformance = FALSE;
996 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH0)
997 TpTrainTH_MIN = pDM_DigTable->TpTrainTH_min;
999 if(pDM_DigTable->TpTrainTH_min > DM_DIG_TP_Target_TH1)
1000 TpTrainTH_MIN = DM_DIG_TP_Target_TH1;
1002 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TP training mode lower bound = %dkbps\n", TpTrainTH_MIN));
1004 //2 Decide DIG mode by total TP
1005 if((TxTp + RxTp) > DM_DIG_TP_Target_TH1) // change to performance mode
1007 bFirstTpTarget = (!pDM_DigTable->bTpTarget)?TRUE:FALSE;
1008 pDM_DigTable->bTpTarget = TRUE;
1009 bPerformance = TRUE;
1011 else if((TxTp + RxTp) < TpTrainTH_MIN) // change to coverage mode
1013 bFirstCoverage = (pDM_DigTable->bTpTarget)?TRUE:FALSE;
1015 if(TimeCnt < DM_DIG_TP_Training_Period)
1017 pDM_DigTable->bTpTarget = FALSE;
1018 bPerformance = FALSE;
1023 pDM_DigTable->bTpTarget = TRUE;
1024 bPerformance = TRUE;
1025 bFirstTpTarget = TRUE;
1029 else // remain previous mode
1031 bPerformance = pDM_DigTable->bTpTarget;
1035 if(TimeCnt < DM_DIG_TP_Training_Period)
1039 pDM_DigTable->bTpTarget = TRUE;
1040 bPerformance = TRUE;
1041 bFirstTpTarget = TRUE;
1048 pDM_DigTable->TpTrainTH_min = RxTp + TxTp;
1053 bPerformance = FALSE;
1054 pDM_DigTable->TpTrainTH_min = 0;
1059 bPerformance = TRUE;
1062 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));
1063 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("====== bPerformance = %d ======\n", bPerformance));
1066 //1 Boundary Decision
1067 if((pDM_Odm->SupportICType & ODM_RTL8192C) && (pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA)))
1070 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1072 dm_dig_max = DM_DIG_MAX_AP_HP;
1073 dm_dig_min = DM_DIG_MIN_AP_HP;
1077 dm_dig_max = DM_DIG_MAX_NIC_HP;
1078 dm_dig_min = DM_DIG_MIN_NIC_HP;
1080 DIG_MaxOfMin = DM_DIG_MAX_AP_HP;
1084 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
1088 dm_dig_max = DM_DIG_MAX_AP_COVERAGR;
\r
1089 dm_dig_min = DM_DIG_MIN_AP_COVERAGE;
\r
1090 DIG_MaxOfMin = DM_DIG_MAX_OF_MIN_COVERAGE;
\r
1094 dm_dig_max = DM_DIG_MAX_AP;
\r
1095 dm_dig_min = DM_DIG_MIN_AP;
\r
1096 DIG_MaxOfMin = DM_DIG_MAX_OF_MIN;
1100 if (((*pDM_Odm->pChannel>= 52) &&(*pDM_Odm->pChannel <= 64)) ||
\r
1101 ((*pDM_Odm->pChannel >= 100) && (*pDM_Odm->pChannel <= 140)))
\r
1104 dm_dig_min = DM_DIG_MIN_AP_DFS;
\r
1105 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): ====== In DFS band ======\n"));
1109 if (priv->pmib->dot11RFEntry.tx2path && !bDFSBand && (*(pDM_Odm->pWirelessMode) == ODM_WM_B))
\r
1110 dm_dig_max = 0x2A;
\r
1112 #if RTL8192E_SUPPORT
1113 #ifdef HIGH_POWER_EXT_LNA
1114 if ((pDM_Odm->SupportICType & (ODM_RTL8192E)) && (pDM_Odm->ExtLNA))
1121 if(pDM_Odm->SupportICType >= ODM_RTL8188E)
\r
1122 dm_dig_max = 0x5A;
\r
1124 dm_dig_max = DM_DIG_MAX_NIC;
\r
1126 if(pDM_Odm->SupportICType != ODM_RTL8821)
\r
1127 dm_dig_min = DM_DIG_MIN_NIC;
\r
1129 dm_dig_min = 0x1C;
\r
1131 DIG_MaxOfMin = DM_DIG_MAX_AP;
1134 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));
1136 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
1138 if(0 < *pDM_Odm->pu1ForcedIgiLb)
1140 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): P2P case: Force IGI lb to: %u !!!!!!\n", *pDM_Odm->pu1ForcedIgiLb));
1141 dm_dig_min = *pDM_Odm->pu1ForcedIgiLb;
1142 dm_dig_max = (dm_dig_min <= dm_dig_max) ? (dm_dig_max) : (dm_dig_min + 1);
1146 //1 Adjust boundary by RSSI
\r
1147 if(pDM_Odm->bLinked && bPerformance)
\r
1149 //2 Modify DIG upper bound
\r
1150 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
1153 //4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT
\r
1154 if((pDM_Odm->SupportICType & (ODM_RTL8192E|ODM_RTL8723B|ODM_RTL8812|ODM_RTL8821|ODM_RTL8723A)) && (pDM_Odm->bBtLimitedDig==1))
1157 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));
1163 if((pDM_Odm->RSSI_Min + offset) > dm_dig_max )
\r
1164 pDM_DigTable->rx_gain_range_max = dm_dig_max;
\r
1165 else if((pDM_Odm->RSSI_Min + offset) < dm_dig_min )
1166 pDM_DigTable->rx_gain_range_max = dm_dig_min;
1168 pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
\r
1170 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1171 //2 Modify DIG lower bound
\r
1172 //if(pDM_Odm->bOneEntryOnly)
\r
1174 if(pDM_Odm->RSSI_Min < dm_dig_min)
\r
1175 DIG_Dynamic_MIN = dm_dig_min;
\r
1176 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
\r
1177 DIG_Dynamic_MIN = DIG_MaxOfMin;
\r
1179 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
\r
1185 HAL_REORDER_BARRIER();
\r
1191 DIG_Dynamic_MIN = dm_dig_min;
\r
1192 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));
1196 if(pDM_Odm->RSSI_Min < dm_dig_min)
\r
1197 DIG_Dynamic_MIN = dm_dig_min;
\r
1198 else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
\r
1199 DIG_Dynamic_MIN = DIG_MaxOfMin;
\r
1201 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
\r
1208 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
1209 if(bPerformance && bDFSBand)
\r
1211 pDM_DigTable->rx_gain_range_max = 0x28;
\r
1212 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));
1217 pDM_DigTable->rx_gain_range_max = dm_dig_max;
\r
1219 DIG_Dynamic_MIN = dm_dig_min;
\r
1222 //1 Force Lower Bound for AntDiv
1223 if(pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly)
\r
1225 if((pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT) && (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
\r
1227 if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
\r
1229 if(pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
\r
1230 DIG_Dynamic_MIN = DIG_MaxOfMin;
\r
1232 DIG_Dynamic_MIN = (u1Byte) pDM_DigTable->AntDiv_RSSI_max;
\r
1233 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));
1234 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));
1238 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
1239 pDM_DigTable->rx_gain_range_max, DIG_Dynamic_MIN));
\r
1240 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
1241 pDM_Odm->bLinked, pDM_Odm->RSSI_Min, FirstConnect, FirstDisConnect));
1243 //1 Modify DIG lower bound, deal with abnormal case
1244 //2 Abnormal false alarm case
1245 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
1248 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
\r
1255 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
\r
1256 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
\r
1259 pDM_DigTable->rx_gain_range_min = odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
1262 //2 Abnormal # beacon case
1263 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
1264 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter))
1265 pDM_Odm->bsta_state = TRUE;
1269 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1270 if(pDM_Odm->bLinked && !FirstConnect)
1272 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pDM_Odm->bsta_state))
1274 pDM_DigTable->rx_gain_range_min = dm_dig_min;
1275 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",
1276 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, pDM_DigTable->rx_gain_range_min));
1281 //2 Abnormal lower bound case
1282 if(pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max)
1284 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
1285 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));
1289 //1 False alarm threshold decision
\r
1290 odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);
\r
1291 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]));
1293 //1 Adjust initial gain by false alarm
1294 if(pDM_Odm->bLinked && bPerformance)
1297 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI after link\n"));
1299 if(bFirstTpTarget || (FirstConnect && bPerformance))
1301 pDM_DigTable->LargeFAHit = 0;
\r
1303 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
\r
1306 if(pDM_Odm->RSSI_Min > 0x28)
\r
1307 CurrentIGI = 0x28;
\r
1309 CurrentIGI = pDM_Odm->RSSI_Min;
\r
1310 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DFS band: One-shot to 0x28 upmost!!!!!!\n"));
1315 if(pDM_Odm->RSSI_Min < DIG_MaxOfMin)
\r
1317 if(CurrentIGI < pDM_Odm->RSSI_Min)
\r
1318 CurrentIGI = pDM_Odm->RSSI_Min;
\r
1322 if(CurrentIGI < DIG_MaxOfMin)
\r
1323 CurrentIGI = DIG_MaxOfMin;
\r
1326 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1327 if(pDM_Odm->SupportICType == ODM_RTL8812)
\r
1328 ODM_ConfigBBWithHeaderFile(pDM_Odm, CONFIG_BB_AGC_TAB_DIFF);
\r
1332 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));
1337 if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
\r
1338 CurrentIGI = CurrentIGI + 4;
1339 else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
\r
1340 CurrentIGI = CurrentIGI + 2;
1341 else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
\r
1342 CurrentIGI = CurrentIGI - 2;
1344 //4 Abnormal # beacon case
1345 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
1346 if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(pAdapter)) //STA mode is linked to AP
\r
1347 pDM_Odm->bsta_state = _TRUE;
\r
1350 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
1351 if((pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && (pDM_Odm->bsta_state))
\r
1353 CurrentIGI = pDM_DigTable->rx_gain_range_min;
\r
1354 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",
1355 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, CurrentIGI));
1363 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adjust IGI before link\n"));
1365 if(FirstDisConnect || bFirstCoverage)
1367 CurrentIGI = dm_dig_min;
\r
1368 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n"));
1372 if(pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
\r
1373 CurrentIGI = CurrentIGI + 4;
\r
1374 else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
\r
1375 CurrentIGI = CurrentIGI + 2;
\r
1376 else if(pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
\r
1377 CurrentIGI = CurrentIGI - 2;
\r
1381 //1 Check initial gain by upper/lower bound
1382 if(CurrentIGI < pDM_DigTable->rx_gain_range_min)
1383 CurrentIGI = pDM_DigTable->rx_gain_range_min;
1385 if(CurrentIGI > pDM_DigTable->rx_gain_range_max)
1386 CurrentIGI = pDM_DigTable->rx_gain_range_max;
1388 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x, TotalFA = %d\n\n", CurrentIGI, pFalseAlmCnt->Cnt_all));
1390 //1 Force upper bound and lower bound for adaptivity
1391 if(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && pDM_Odm->adaptivity_flag == TRUE)
1393 if(CurrentIGI > Adap_IGI_Upper)
1394 CurrentIGI = Adap_IGI_Upper;
1396 if(pDM_Odm->IGI_LowerBound != 0)
1398 if(CurrentIGI < pDM_Odm->IGI_LowerBound)
1399 CurrentIGI = pDM_Odm->IGI_LowerBound;
1401 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force upper bound to 0x%x !!!!!!\n", Adap_IGI_Upper));
1402 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Adaptivity case: Force lower bound to 0x%x !!!!!!\n\n", pDM_Odm->IGI_LowerBound));
1406 //1 High power RSSI threshold
1407 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
1408 if((pDM_Odm->SupportICType == ODM_RTL8723A)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD))
1410 // High power IGI lower bound
1411 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB));
1412 if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND)
1414 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue));
1415 //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
1416 CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND;
1419 if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter))
1421 if(pHalData->UndecoratedSmoothedPWDB > 0x28)
1423 if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND)
1425 //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1426 CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND;
1433 #if (RTL8192D_SUPPORT==1)
1434 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1436 //sherry delete DualMacSmartConncurrent 20110517
1437 if(*(pDM_Odm->pMacPhyMode) == ODM_DMSP)
1439 ODM_Write_DIG_DMSP(pDM_Odm, CurrentIGI);//ODM_Write_DIG_DMSP(pDM_Odm, pDM_DigTable->CurIGValue);
1440 if(*(pDM_Odm->pbMasterOfDMSP))
\r
1442 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1443 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
\r
1447 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1448 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
\r
1453 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1454 if(*(pDM_Odm->pBandType) == ODM_BAND_5G)
\r
1456 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1457 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
\r
1461 pDM_DigTable->bMediaConnect_1 = pDM_Odm->bLinked;
1462 pDM_DigTable->DIG_Dynamic_MIN_1 = DIG_Dynamic_MIN;
\r
1469 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1470 if(pDM_Odm->bBtHsOperation)
1472 if(pDM_Odm->bLinked)
1474 if(pDM_DigTable->BT30_CurIGI > (CurrentIGI))
1475 ODM_Write_DIG(pDM_Odm, CurrentIGI);
1477 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
\r
1479 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1480 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1484 if(pDM_Odm->bLinkInProcess)
1485 ODM_Write_DIG(pDM_Odm, 0x1c);
1486 else if(pDM_Odm->bBtConnectProcess)
1487 ODM_Write_DIG(pDM_Odm, 0x28);
1489 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1492 else // BT is not using
1495 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
\r
1496 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
1497 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
1507 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
1508 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1509 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
1511 #if (DM_ODM_SUPPORT_TYPE & ODM_CE)
1512 #if 0 //and 2.3.5 coding rule
1513 struct mlme_priv *pmlmepriv = &(pAdapter->mlmepriv);
1514 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1515 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1519 u1Byte RSSI_Lower=DM_DIG_MIN_NIC; //0x1E or 0x1C
1520 u1Byte CurrentIGI=pDM_Odm->RSSI_Min;
1522 CurrentIGI=CurrentIGI+RSSI_OFFSET_DIG;
1524 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS()==>\n"));
1526 // Using FW PS mode to make IGI
1527 //Adjust by FA in LPS MODE
1528 if(pFalseAlmCnt->Cnt_all> DM_DIG_FA_TH2_LPS)
1529 CurrentIGI = CurrentIGI+4;
1530 else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
1531 CurrentIGI = CurrentIGI+2;
1532 else if(pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
1533 CurrentIGI = CurrentIGI-2;
1536 //Lower bound checking
1538 //RSSI Lower bound check
1539 if((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
1540 RSSI_Lower =(pDM_Odm->RSSI_Min-10);
1542 RSSI_Lower =DM_DIG_MIN_NIC;
1544 //Upper and Lower Bound checking
1545 if(CurrentIGI > DM_DIG_MAX_NIC)
1546 CurrentIGI=DM_DIG_MAX_NIC;
1547 else if(CurrentIGI < RSSI_Lower)
1548 CurrentIGI =RSSI_Lower;
1551 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n",pFalseAlmCnt->Cnt_all));
1552 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n",pDM_Odm->RSSI_Min));
1553 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n",CurrentIGI));
1555 ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue);
1564 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
1565 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1566 pDIG_T pDM_DigTable=&pDM_Odm->DM_DigTable;
1567 u1Byte digForBtHs=0;
1568 u1Byte digUpBound=0x5a;
1570 if(pDM_Odm->bBtConnectProcess)
1572 if(pDM_Odm->SupportICType&(ODM_RTL8723A))
1580 // Decide DIG value by BT HS RSSI.
1582 digForBtHs = pDM_Odm->btHsRssi+4;
1585 if(pDM_Odm->SupportICType&(ODM_RTL8723A))
1588 if(digForBtHs > digUpBound)
1589 digForBtHs = digUpBound;
1590 if(digForBtHs < 0x1c)
1593 // update Current IGI
1594 pDM_DigTable->BT30_CurIGI = digForBtHs;
1596 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DigForBtHsMode() : set DigValue=0x%x\n", digForBtHs));
1601 //3============================================================
1602 //3 FASLE ALARM CHECK
1603 //3============================================================
1606 odm_FalseAlarmCounterStatistics(
1610 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1611 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1614 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
1615 //Mark there, and check this in odm_DMWatchDog
1616 #if 0 //(DM_ODM_SUPPORT_TYPE == ODM_AP)
1617 prtl8192cd_priv priv = pDM_Odm->priv;
1618 if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )
1623 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1624 if((pDM_Odm->SupportICType == ODM_RTL8192D) &&
1625 (*(pDM_Odm->pMacPhyMode)==ODM_DMSP)&& ////modify by Guo.Mingzhi 2011-12-29
1626 (!(*(pDM_Odm->pbMasterOfDMSP))))
1628 odm_FalseAlarmCounterStatistics_ForSlaveOfDMSP(pDM_Odm);
1633 if(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
1636 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
1640 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); //hold page C counter
1641 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); //hold page D counter
1643 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord);
1644 FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
1645 FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
1647 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord);
1648 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
1649 FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
1651 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord);
1652 FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
1653 FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
1655 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord);
1656 FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
1658 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
1659 FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail +
1660 FalseAlmCnt->Cnt_Fast_Fsync + FalseAlmCnt->Cnt_SB_Search_fail;
1662 #if (RTL8188E_SUPPORT==1)
1663 if(pDM_Odm->SupportICType == ODM_RTL8188E)
1665 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_SC_CNT_11N, bMaskDWord);
1666 FalseAlmCnt->Cnt_BW_LSC = (ret_value&0xffff);
1667 FalseAlmCnt->Cnt_BW_USC = ((ret_value&0xffff0000)>>16);
1671 #if (RTL8192D_SUPPORT==1)
1672 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1674 odm_GetCCKFalseAlarm_92D(pDM_Odm);
1680 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
1681 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
1683 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_LSB_11N, bMaskByte0);
1684 FalseAlmCnt->Cnt_Cck_fail = ret_value;
1686 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_MSB_11N, bMaskByte3);
1687 FalseAlmCnt->Cnt_Cck_fail += (ret_value& 0xff)<<8;
1689 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord);
1690 FalseAlmCnt->Cnt_CCK_CCA = ((ret_value&0xFF)<<8) |((ret_value&0xFF00)>>8);
1693 FalseAlmCnt->Cnt_all = ( FalseAlmCnt->Cnt_Fast_Fsync +
1694 FalseAlmCnt->Cnt_SB_Search_fail +
1695 FalseAlmCnt->Cnt_Parity_Fail +
1696 FalseAlmCnt->Cnt_Rate_Illegal +
1697 FalseAlmCnt->Cnt_Crc8_fail +
1698 FalseAlmCnt->Cnt_Mcs_fail +
1699 FalseAlmCnt->Cnt_Cck_fail);
1701 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
1703 #if (RTL8192C_SUPPORT==1)
1704 if(pDM_Odm->SupportICType == ODM_RTL8192C)
1705 odm_ResetFACounter_92C(pDM_Odm);
1708 #if (RTL8192D_SUPPORT==1)
1709 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1710 odm_ResetFACounter_92D(pDM_Odm);
1713 if(pDM_Odm->SupportICType >=ODM_RTL8723A)
1715 //reset false alarm counter registers
1716 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 1);
1717 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT31, 0);
1718 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 1);
1719 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT27, 0);
1721 //update ofdm counter
1722 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 0); //update page C counter
1723 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 0); //update page D counter
1725 //reset CCK CCA counter
1726 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 0);
1727 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT13|BIT12, 2);
1728 //reset CCK FA counter
1729 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 0);
1730 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11N, BIT15|BIT14, 2);
1733 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Enter odm_FalseAlarmCounterStatistics\n"));
1734 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Fast_Fsync=%d, Cnt_SB_Search_fail=%d\n",
1735 FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));
1736 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Parity_Fail=%d, Cnt_Rate_Illegal=%d\n",
1737 FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal));
1738 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Crc8_fail=%d, Cnt_Mcs_fail=%d\n",
1739 FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail));
1741 else if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
1744 u4Byte Cnt_Ofdm_fail_temp = 0;
1746 //read OFDM FA counter
1747 FalseAlmCnt->Cnt_Ofdm_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_OFDM_FA_11AC, bMaskLWord);
1748 FalseAlmCnt->Cnt_Cck_fail = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_FA_11AC, bMaskLWord);
1750 //read CCK/OFDM CCA counter
1751 ret_value = ODM_GetBBReg(pDM_Odm, ODM_REG_CCK_CCA_CNT_11AC, bMaskDWord);
\r
1752 FalseAlmCnt->Cnt_OFDM_CCA = (ret_value & 0xffff0000) >> 16;
1753 FalseAlmCnt->Cnt_CCK_CCA = ret_value & 0xffff;
1756 if(pDM_Odm->SupportICType == ODM_RTL8881A)
1758 if(FalseAlmCnt->Cnt_Ofdm_fail >= FalseAlmCnt->Cnt_Ofdm_fail_pre)
1760 Cnt_Ofdm_fail_temp = FalseAlmCnt->Cnt_Ofdm_fail_pre;
1761 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
1762 FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Ofdm_fail - Cnt_Ofdm_fail_temp;
1765 FalseAlmCnt->Cnt_Ofdm_fail_pre = FalseAlmCnt->Cnt_Ofdm_fail;
1766 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail_pre));
1767 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail_pre=%d\n", Cnt_Ofdm_fail_temp));
1769 // Reset FA counter by enable/disable OFDM
1770 if(FalseAlmCnt->Cnt_Ofdm_fail_pre >= 0x7fff)
1773 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,0);
1774 ODM_SetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT29,1);
1775 FalseAlmCnt->Cnt_Ofdm_fail_pre = 0;
1776 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Reset false alarm counter\n"));
1780 // reset OFDM FA coutner
1781 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 1);
1782 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RST_11AC, BIT17, 0);
1784 // reset CCK FA counter
1785 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 0);
1786 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_FA_RST_11AC, BIT15, 1);
1788 // reset CCA counter
1789 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 1);
1790 ODM_SetBBReg(pDM_Odm, ODM_REG_RST_RPT_11AC, BIT0, 0);
1792 CCKenable = ODM_GetBBReg(pDM_Odm, ODM_REG_BB_RX_PATH_11AC, BIT28);
1793 if(CCKenable)//if(*pDM_Odm->pBandType == ODM_BAND_2_4G)
1795 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail + FalseAlmCnt->Cnt_Cck_fail;
1796 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_CCK_CCA + FalseAlmCnt->Cnt_OFDM_CCA;
1800 FalseAlmCnt->Cnt_all = FalseAlmCnt->Cnt_Ofdm_fail;
1801 FalseAlmCnt->Cnt_CCA_all = FalseAlmCnt->Cnt_OFDM_CCA;
1806 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_OFDM_CCA=%d\n", FalseAlmCnt->Cnt_OFDM_CCA));
1807 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCK_CCA=%d\n", FalseAlmCnt->Cnt_CCK_CCA));
1808 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_CCA_all=%d\n", FalseAlmCnt->Cnt_CCA_all));
1809 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
1810 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Cck_fail=%d\n", FalseAlmCnt->Cnt_Cck_fail));
1811 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Cnt_Ofdm_fail=%d\n", FalseAlmCnt->Cnt_Ofdm_fail));
1812 ODM_RT_TRACE(pDM_Odm,ODM_COMP_FA_CNT, ODM_DBG_LOUD, ("Total False Alarm=%d\n", FalseAlmCnt->Cnt_all));
1817 odm_FAThresholdCheck(
1819 IN BOOLEAN bDFSBand,
1820 IN BOOLEAN bPerformance,
1823 OUT u4Byte* dm_FA_thres
1826 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1828 if(pDM_Odm->bLinked && (bPerformance||bDFSBand))
1830 if(pDM_Odm->SupportICType == ODM_RTL8192D)
1832 // 8192D special case
1833 dm_FA_thres[0] = DM_DIG_FA_TH0_92D;
1834 dm_FA_thres[1] = DM_DIG_FA_TH1_92D;
1835 dm_FA_thres[2] = DM_DIG_FA_TH2_92D;
1837 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1838 else if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL))
1841 if((RxTp>>2) > TxTp && RxTp < 10000 && RxTp > 500) // 10Mbps & 0.5Mbps
1843 dm_FA_thres[0] = 0x080;
1844 dm_FA_thres[1] = 0x100;
1845 dm_FA_thres[2] = 0x200;
1849 dm_FA_thres[0] = 0x100;
1850 dm_FA_thres[1] = 0x200;
1851 dm_FA_thres[2] = 0x300;
1855 else if(pDM_Odm->SupportICType == ODM_RTL8723A && pDM_Odm->bBtLimitedDig)
1857 // 8723A BT special case
1858 dm_FA_thres[0] = DM_DIG_FA_TH0;
1859 dm_FA_thres[1] = 0x250;
1860 dm_FA_thres[2] = 0x300;
1866 dm_FA_thres[0] = DM_DIG_FA_TH0;
1867 dm_FA_thres[1] = DM_DIG_FA_TH1;
1868 dm_FA_thres[2] = DM_DIG_FA_TH2;
1873 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1876 // For DFS band and no link
1877 dm_FA_thres[0] = 250;
1878 dm_FA_thres[1] = 1000;
1879 dm_FA_thres[2] = 2000;
1884 dm_FA_thres[0] = 2000;
1885 dm_FA_thres[1] = 4000;
1886 dm_FA_thres[2] = 5000;
1893 odm_ForbiddenIGICheck(
1895 IN u1Byte DIG_Dynamic_MIN,
1896 IN u1Byte CurrentIGI
1899 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1900 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1901 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1902 u1Byte rx_gain_range_min = pDM_DigTable->rx_gain_range_min;
1904 if(pFalseAlmCnt->Cnt_all > 10000)
1906 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case. \n"));
1908 if(pDM_DigTable->LargeFAHit != 3)
1909 pDM_DigTable->LargeFAHit++;
1911 if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue)
1913 pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue;
1914 pDM_DigTable->LargeFAHit = 1;
1917 if(pDM_DigTable->LargeFAHit >= 3)
1919 if((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)
1920 rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
1922 rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
1923 pDM_DigTable->Recover_cnt = 1800;
1924 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));
1929 if(pDM_DigTable->Recover_cnt != 0)
\r
1931 pDM_DigTable->Recover_cnt --;
\r
1932 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d \n", pDM_DigTable->Recover_cnt));
\r
1936 if(pDM_DigTable->LargeFAHit < 3)
1938 if((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) //DM_DIG_MIN)
1940 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN;
1941 rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN;
1942 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
1946 pDM_DigTable->ForbiddenIGI -= 2;
1947 rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
1948 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
1953 pDM_DigTable->LargeFAHit = 0;
1958 return rx_gain_range_min;
1963 odm_InbandNoiseCalculate (
1967 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
1968 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1969 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1970 u1Byte IGIBackup, TimeCnt = 0, ValidCnt = 0;
1971 BOOLEAN bTimeout = TRUE;
1972 s1Byte sNoise_A, sNoise_B;
1973 s4Byte NoiseRpt_A = 0,NoiseRpt_B = 0;
1975 static u1Byte failCnt = 0;
1977 if(!(pDM_Odm->SupportICType & (ODM_RTL8192E)))
1980 if(pDM_Odm->RFType == ODM_1T1R || *(pDM_Odm->pOnePathCCA) != ODM_CCA_2R)
1983 if(!pDM_DigTable->bNoiseEst)
1986 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_InbandNoiseEstimate()========>\n"));
1988 //1 Set initial gain.
1989 IGIBackup = pDM_DigTable->CurIGValue;
1990 pDM_DigTable->IGIOffset_A = 0;
1991 pDM_DigTable->IGIOffset_B = 0;
1992 ODM_Write_DIG(pDM_Odm, 0x24);
1994 //1 Update idle time power report
1995 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
1996 ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x0);
2000 //1 Get noise power level
2003 //2 Read Noise Floor Report
2004 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
2005 tmp = ODM_GetBBReg(pDM_Odm, 0x8f8, bMaskLWord);
2007 sNoise_A = (s1Byte)(tmp & 0xff);
2008 sNoise_B = (s1Byte)((tmp & 0xff00)>>8);
2010 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
2012 if((sNoise_A < 20 && sNoise_A >= -70) && (sNoise_B < 20 && sNoise_B >= -70))
2015 NoiseRpt_A += sNoise_A;
2016 NoiseRpt_B += sNoise_B;
2017 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("sNoise_A = %d, sNoise_B = %d\n",sNoise_A, sNoise_B));
2021 bTimeout = (TimeCnt >= 150)?TRUE:FALSE;
2023 if(ValidCnt == 20 || bTimeout)
2030 //1 Keep idle time power report
2031 if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
2032 ODM_SetBBReg(pDM_Odm, ODM_REG_TX_ANT_CTRL_11N, BIT25, 0x1);
2035 ODM_Write_DIG(pDM_Odm, IGIBackup);
2037 //1 Calculate Noise Floor
2040 NoiseRpt_A /= (ValidCnt<<1);
2041 NoiseRpt_B /= (ValidCnt<<1);
2050 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("Noise estimate fail time = %d\n", failCnt));
2055 pDM_DigTable->bNoiseEst = FALSE;
2060 NoiseRpt_A = -110 + 0x24 + NoiseRpt_A -6;
2061 NoiseRpt_B = -110 + 0x24 + NoiseRpt_B -6;
2062 pDM_DigTable->bNoiseEst = FALSE;
2064 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("NoiseRpt_A = %d, NoiseRpt_B = %d\n", NoiseRpt_A, NoiseRpt_B));
2067 //1 Calculate IGI Offset
2068 if(NoiseRpt_A > NoiseRpt_B)
2070 pDM_DigTable->IGIOffset_A = NoiseRpt_A - NoiseRpt_B;
2071 pDM_DigTable->IGIOffset_B = 0;
2075 pDM_DigTable->IGIOffset_A = 0;
2076 pDM_DigTable->IGIOffset_B = NoiseRpt_B - NoiseRpt_A;
2083 //3============================================================
2084 //3 CCK Packet Detect Threshold
2085 //3============================================================
2088 odm_PauseCCKPacketDetection(
2090 IN ODM_Pause_CCKPD_TYPE PauseType,
2091 IN u1Byte CCKPDThreshold
2094 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
2095 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2096 static BOOLEAN bPaused = FALSE;
2098 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_PauseCCKPacketDetection()=========>\n"));
2100 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
2101 if(*pDM_DigTable->pbP2pLinkInProgress)
2103 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("P2P in progress !!\n"));
2108 if(!bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
2110 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"));
2116 //1 Pause CCK Packet Detection Threshold
2117 case ODM_PAUSE_CCKPD:
2119 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_CCK_PD));
2120 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Pause CCK packet detection threshold !!\n"));
2122 //2 Backup CCK Packet Detection Threshold value
2125 pDM_DigTable->CCKPDBackup = pDM_DigTable->CurCCK_CCAThres;
2128 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Backup CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
2130 //2 Write new CCK Packet Detection Threshold value
2131 ODM_Write_CCK_CCA_Thres(pDM_Odm, CCKPDThreshold);
2132 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write new CCK packet detection tgreshold = %d\n", CCKPDThreshold));
2135 //1 Resume CCK Packet Detection Threshold
2136 case ODM_RESUME_CCKPD:
2139 //2 Write backup CCK Packet Detection Threshold value
2140 ODM_Write_CCK_CCA_Thres(pDM_Odm, pDM_DigTable->CCKPDBackup);
2142 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Write original CCK packet detection tgreshold = %d\n", pDM_DigTable->CCKPDBackup));
2144 //2 Enable CCK Packet Detection Threshold
2145 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_CCK_PD);
2146 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Resume CCK packet detection threshold !!\n"));
2151 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("Wrong type !!\n"));
2159 odm_CCKPacketDetectionThresh(
2163 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
2164 PFALSE_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
2165 u1Byte CurCCK_CCAThres;
2168 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2169 //modify by Guo.Mingzhi 2011-12-29
2170 if (pDM_Odm->bDualMacSmartConcurrent == TRUE)
2171 // if (pDM_Odm->bDualMacSmartConcurrent == FALSE)
2173 if(pDM_Odm->bBtHsOperation)
2175 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() write 0xcd for BT HS mode!!\n"));
2176 ODM_Write_CCK_CCA_Thres(pDM_Odm, 0xcd);
2181 if((!(pDM_Odm->SupportAbility & ODM_BB_CCK_PD)) ||(!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)))
2183 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() return==========\n"));
2187 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
2192 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() ==========>\n"));
2194 if(pDM_Odm->bLinked)
2196 if(pDM_Odm->RSSI_Min > 25)
2197 CurCCK_CCAThres = 0xcd;
2198 else if((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
2199 CurCCK_CCAThres = 0x83;
2202 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
2203 CurCCK_CCAThres = 0x83;
2205 CurCCK_CCAThres = 0x40;
2210 if(FalseAlmCnt->Cnt_Cck_fail > 1000)
2211 CurCCK_CCAThres = 0x83;
2213 CurCCK_CCAThres = 0x40;
2216 #if (RTL8192D_SUPPORT==1)
2217 if((pDM_Odm->SupportICType == ODM_RTL8192D) && (*pDM_Odm->pBandType == ODM_BAND_2_4G))
2218 ODM_Write_CCK_CCA_Thres_92D(pDM_Odm, CurCCK_CCAThres);
2221 ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
2223 ODM_RT_TRACE(pDM_Odm,ODM_COMP_CCK_PD, ODM_DBG_LOUD, ("odm_CCKPacketDetectionThresh() CurCCK_CCAThres = 0x%x\n",CurCCK_CCAThres));
2227 ODM_Write_CCK_CCA_Thres(
2229 IN u1Byte CurCCK_CCAThres
2232 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
2233 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2235 if(pDM_DigTable->CurCCK_CCAThres!=CurCCK_CCAThres) //modify by Guo.Mingzhi 2012-01-03
2237 ODM_Write1Byte(pDM_Odm, ODM_REG(CCK_CCA,pDM_Odm), CurCCK_CCAThres);
2239 pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
2240 pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
2243 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
2251 // This should be moved out of OUTSRC
2252 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
2253 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
2254 // Enable EDCCA. The value is suggested by SD3 Wilson.
2257 // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
2259 if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
2261 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x00);
2262 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x00);
2263 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0xFD);
2268 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold, 0x03);
2269 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold,0x03);
2270 ODM_Write1Byte(pDM_Odm,rOFDM0_ECCAThreshold+2,0x00);
2273 //PlatformEFIOWrite1Byte(Adapter, rOFDM0_ECCAThreshold+2, 0x00);
2281 // Disable EDCCA..
\r
2282 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
2283 ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold, 0x7f);
2284 ODM_Write1Byte(pDM_Odm, rOFDM0_ECCAThreshold+2, 0x7f);
2288 // Description: According to initial gain value to determine to enable or disable EDCCA.
2290 // Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
2297 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
2298 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
2299 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2300 u1Byte RegC50, RegC58;
2301 BOOLEAN bEDCCAenable = FALSE;
2303 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
2304 BOOLEAN bFwCurrentInPSMode=FALSE;
2306 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
2308 // Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.
2309 if(bFwCurrentInPSMode)
2313 // 2013/11/14 Ken According to BB team Jame's suggestion, we need to disable soft AP mode EDCCA.
2314 // 2014/01/08 MH For Miracst AP mode test. We need to disable EDCCA. Otherwise, we may stop
2315 // to send beacon in noisy environment or platform.
2317 if(ACTING_AS_AP(pAdapter) || ACTING_AS_AP(GetFirstAPAdapter(pAdapter)))
2318 //if(ACTING_AS_AP(pAdapter))
2320 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("At least One Port as AP disable EDCCA\n"));
2321 odm_DisableEDCCA(pDM_Odm);
2322 if(pHalData->bPreEdccaEnable)
2323 odm_DisableEDCCA(pDM_Odm);
2324 pHalData->bPreEdccaEnable = FALSE;
2328 RegC50 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
2329 RegC58 = (u1Byte)ODM_GetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0);
2332 if((RegC50 > 0x28 && RegC58 > 0x28) ||
2333 ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26)) ||
2334 (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28))
2336 if(!pHalData->bPreEdccaEnable)
2338 odm_EnableEDCCA(pDM_Odm);
2339 pHalData->bPreEdccaEnable = TRUE;
2343 else if((RegC50 < 0x25 && RegC58 < 0x25) || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25))
2345 if(pHalData->bPreEdccaEnable)
2347 odm_DisableEDCCA(pDM_Odm);
2348 pHalData->bPreEdccaEnable = FALSE;
2353 // <20130108, Kordan> E.g., With LNA used, we make the Rx power smaller to have a better EVM. (Asked by Willis)
\r
2356 IN PDM_ODM_T pDM_Odm,
2360 PADAPTER Adapter = (PADAPTER)pDM_Odm->Adapter;
2361 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2362 static u1Byte TRSW_HighPwr = 0;
2364 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("===> odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X, pHalData->RFEType = %d\n",
2365 RSSIVal, TRSW_HighPwr, pHalData->RFEType ));
2367 if (pHalData->RFEType == 3) {
2369 pDM_Odm->RSSI_TRSW = RSSIVal;
2371 if (pDM_Odm->RSSI_TRSW >= pDM_Odm->RSSI_TRSW_H)
2373 TRSW_HighPwr = 1; // Switch to
2374 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
2375 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x3); // Set ANTSW=1/ANTSWB=0 for SW control
2378 else if (pDM_Odm->RSSI_TRSW <= pDM_Odm->RSSI_TRSW_L)
2380 TRSW_HighPwr = 0; // Switched back
2381 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT1|BIT0, 0x1); // Set ANTSW=1/ANTSWB=0 for SW control
2382 PHY_SetBBReg(Adapter, r_ANTSEL_SW_Jaguar, BIT9|BIT8, 0x0); // Set ANTSW=1/ANTSWB=0 for SW control
2388 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));
2389 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("(RSSIVal, RSSIVal, pDM_Odm->RSSI_TRSW_iso) = (%d, %d, %d)\n",
2390 RSSIVal, pDM_Odm->RSSI_TRSW_iso, pDM_Odm->RSSI_TRSW));
2391 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("<=== odm_RFEControl, RSSI = %d, TRSW_HighPwr = 0x%X\n", RSSIVal, TRSW_HighPwr));
2395 odm_MPT_DIGWorkItemCallback(
2399 PADAPTER Adapter = (PADAPTER)pContext;
2400 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2401 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
2403 ODM_MPT_DIG(pDM_Odm);
2407 odm_MPT_DIGCallback(
2411 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
2412 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2413 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
2416 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
2418 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
2420 ODM_MPT_DIG(pDM_Odm);
2423 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
2430 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
2432 odm_MPT_DIGCallback(
2436 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
2438 PlatformScheduleWorkItem(&pDM_Odm->MPT_DIGWorkitem);
2440 ODM_MPT_DIG(pDM_Odm);
2445 #if (DM_ODM_SUPPORT_TYPE != ODM_CE)
2449 IN u1Byte CurIGValue
2452 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
2453 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2455 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), CurIGValue);
2457 if(pDM_Odm->RFType > ODM_1T1R)
2458 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), CurIGValue);
2460 if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (pDM_Odm->RFType > ODM_2T2R))
2462 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_C,pDM_Odm), CurIGValue);
2463 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_D,pDM_Odm), CurIGValue);
2466 pDM_DigTable->CurIGValue = CurIGValue;
2468 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("CurIGValue = 0x%x\n", CurIGValue));
2469 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("pDM_Odm->RFType = 0x%x\n", pDM_Odm->RFType));
2477 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
2478 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
2479 PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
2480 u1Byte CurrentIGI = pDM_DigTable->CurIGValue;
2481 u1Byte DIG_Upper = 0x40, DIG_Lower = 0x20;
2483 u4Byte RxPWDBAve_final;
2484 u1Byte IGI_A = 0x20, IGI_B = 0x20;
2486 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2494 if (!(pDM_Odm->priv->pshare->rf_ft_var.mp_specific && pDM_Odm->priv->pshare->mp_dig_on))
2497 if (*pDM_Odm->pBandType == ODM_BAND_5G)
2501 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> ODM_MPT_DIG, pBandType = %d\n", *pDM_Odm->pBandType));
2503 #if (ODM_FIX_2G_DIG || (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)))
2504 if (*pDM_Odm->pBandType == ODM_BAND_5G || (pDM_Odm->SupportICType & ODM_RTL8814A)) // for 5G or 8814
2506 if (1) // for both 2G/5G
2509 odm_FalseAlarmCounterStatistics(pDM_Odm);
2511 RXOK_cal = pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK + pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM;
2512 RxPWDBAve_final = (RXOK_cal != 0)?pDM_Odm->RxPWDBAve/RXOK_cal:0;
2514 pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;
2515 pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;
2516 pDM_Odm->RxPWDBAve = 0;
2517 pDM_Odm->MPDIG_2G = FALSE;
2519 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2520 pDM_Odm->Times_2G = 0;
2523 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RX OK = %d\n", RXOK_cal));
2524 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("RSSI = %d\n", RxPWDBAve_final));
2526 if (RXOK_cal >= 70 && RxPWDBAve_final <= 40)
2528 if (CurrentIGI > 0x24)
2529 odm_MPT_Write_DIG(pDM_Odm, 0x24);
2533 if(pFalseAlmCnt->Cnt_all > 1000){
2534 CurrentIGI = CurrentIGI + 8;
2536 else if(pFalseAlmCnt->Cnt_all > 200){
2537 CurrentIGI = CurrentIGI + 4;
2539 else if (pFalseAlmCnt->Cnt_all > 50){
2540 CurrentIGI = CurrentIGI + 2;
2542 else if (pFalseAlmCnt->Cnt_all < 2){
2543 CurrentIGI = CurrentIGI - 2;
2546 if (CurrentIGI < DIG_Lower ){
2547 CurrentIGI = DIG_Lower;
2550 if(CurrentIGI > DIG_Upper){
2551 CurrentIGI = DIG_Upper;
2554 odm_MPT_Write_DIG(pDM_Odm, CurrentIGI);
2555 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",
2556 CurrentIGI, pFalseAlmCnt->Cnt_all, pFalseAlmCnt->Cnt_Ofdm_fail, pFalseAlmCnt->Cnt_Cck_fail));
2561 if(pDM_Odm->MPDIG_2G == FALSE)
2563 if((pDM_Odm->SupportPlatform & ODM_WIN) && !(pDM_Odm->SupportICType & ODM_RTL8814A))
2565 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("===> Fix IGI\n"));
2566 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_A,pDM_Odm), IGI_A);
2567 ODM_Write1Byte( pDM_Odm, ODM_REG(IGI_B,pDM_Odm), IGI_B);
2568 pDM_DigTable->CurIGValue = IGI_B;
2571 odm_MPT_Write_DIG(pDM_Odm, IGI_A);
2574 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2575 pDM_Odm->Times_2G++;
2577 if (pDM_Odm->Times_2G == 3)
2580 pDM_Odm->MPDIG_2G = TRUE;
2584 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2585 if (pDM_Odm->SupportICType == ODM_RTL8812)
2586 odm_RFEControl(pDM_Odm, RxPWDBAve_final);
2589 ODM_SetTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, 700);