root/drivers/staging/rtl8723bs/hal/odm_DIG.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. odm_NHMCounterStatisticsInit
  2. odm_NHMCounterStatistics
  3. odm_GetNHMCounterStatistics
  4. odm_NHMCounterStatisticsReset
  5. odm_NHMBBInit
  6. odm_NHMBB
  7. odm_SearchPwdBLowerBound
  8. odm_AdaptivityInit
  9. odm_Adaptivity
  10. ODM_Write_DIG
  11. odm_PauseDIG
  12. odm_DigAbort
  13. odm_DIGInit
  14. odm_DIG
  15. odm_DIGbyRSSI_LPS
  16. odm_FalseAlarmCounterStatistics
  17. odm_FAThresholdCheck
  18. odm_ForbiddenIGICheck
  19. odm_CCKPacketDetectionThresh
  20. ODM_Write_CCK_CCA_Thres

   1 // SPDX-License-Identifier: GPL-2.0
   2 /******************************************************************************
   3  *
   4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
   5  *
   6  ******************************************************************************/
   7 
   8 #include "odm_precomp.h"
   9 
  10 #define ADAPTIVITY_VERSION "5.0"
  11 
  12 void odm_NHMCounterStatisticsInit(void *pDM_VOID)
  13 {
  14         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
  15 
  16         /* PHY parameters initialize for n series */
  17         rtw_write16(pDM_Odm->Adapter, ODM_REG_NHM_TIMER_11N+2, 0x2710); /* 0x894[31:16]= 0x2710 Time duration for NHM unit: 4us, 0x2710 =40ms */
  18         /* rtw_write16(pDM_Odm->Adapter, ODM_REG_NHM_TIMER_11N+2, 0x4e20);      0x894[31:16]= 0x4e20    Time duration for NHM unit: 4us, 0x4e20 =80ms */
  19         rtw_write16(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff);      /* 0x890[31:16]= 0xffff th_9, th_10 */
  20         /* rtw_write32(pDM_Odm->Adapter, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c);       0x898 = 0xffffff5c              th_3, th_2, th_1, th_0 */
  21         rtw_write32(pDM_Odm->Adapter, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff52);  /* 0x898 = 0xffffff52           th_3, th_2, th_1, th_0 */
  22         rtw_write32(pDM_Odm->Adapter, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff);  /* 0x89c = 0xffffffff           th_7, th_6, th_5, th_4 */
  23         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff);                /* 0xe28[7:0]= 0xff             th_8 */
  24         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7); /* 0x890[9:8]=3                 enable CCX */
  25         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1);            /* 0xc0c[7]= 1                  max power among all RX ants */
  26 }
  27 
  28 void odm_NHMCounterStatistics(void *pDM_VOID)
  29 {
  30         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
  31 
  32         /*  Get NHM report */
  33         odm_GetNHMCounterStatistics(pDM_Odm);
  34 
  35         /*  Reset NHM counter */
  36         odm_NHMCounterStatisticsReset(pDM_Odm);
  37 }
  38 
  39 void odm_GetNHMCounterStatistics(void *pDM_VOID)
  40 {
  41         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
  42         u32 value32 = 0;
  43 
  44         value32 = PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG_NHM_CNT_11N, bMaskDWord);
  45 
  46         pDM_Odm->NHM_cnt_0 = (u8)(value32 & bMaskByte0);
  47 }
  48 
  49 void odm_NHMCounterStatisticsReset(void *pDM_VOID)
  50 {
  51         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
  52 
  53         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);
  54         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);
  55 }
  56 
  57 void odm_NHMBBInit(void *pDM_VOID)
  58 {
  59         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
  60 
  61         pDM_Odm->adaptivity_flag = 0;
  62         pDM_Odm->tolerance_cnt = 3;
  63         pDM_Odm->NHMLastTxOkcnt = 0;
  64         pDM_Odm->NHMLastRxOkcnt = 0;
  65         pDM_Odm->NHMCurTxOkcnt = 0;
  66         pDM_Odm->NHMCurRxOkcnt = 0;
  67 }
  68 
  69 /*  */
  70 void odm_NHMBB(void *pDM_VOID)
  71 {
  72         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
  73         /* u8 test_status; */
  74         /* Pfalse_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt); */
  75 
  76         pDM_Odm->NHMCurTxOkcnt =
  77                 *(pDM_Odm->pNumTxBytesUnicast)-pDM_Odm->NHMLastTxOkcnt;
  78         pDM_Odm->NHMCurRxOkcnt =
  79                 *(pDM_Odm->pNumRxBytesUnicast)-pDM_Odm->NHMLastRxOkcnt;
  80         pDM_Odm->NHMLastTxOkcnt =
  81                 *(pDM_Odm->pNumTxBytesUnicast);
  82         pDM_Odm->NHMLastRxOkcnt =
  83                 *(pDM_Odm->pNumRxBytesUnicast);
  84         ODM_RT_TRACE(
  85                 pDM_Odm,
  86                 ODM_COMP_DIG,
  87                 ODM_DBG_LOUD,
  88                 (
  89                         "NHM_cnt_0 =%d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n",
  90                         pDM_Odm->NHM_cnt_0,
  91                         pDM_Odm->NHMCurTxOkcnt,
  92                         pDM_Odm->NHMCurRxOkcnt
  93                 )
  94         );
  95 
  96 
  97         if ((pDM_Odm->NHMCurTxOkcnt) + 1 > (u64)(pDM_Odm->NHMCurRxOkcnt<<2) + 1) { /* Tx > 4*Rx possible for adaptivity test */
  98                 if (pDM_Odm->NHM_cnt_0 >= 190 || pDM_Odm->adaptivity_flag == true) {
  99                         /* Enable EDCCA since it is possible running Adaptivity testing */
 100                         /* test_status = 1; */
 101                         pDM_Odm->adaptivity_flag = true;
 102                         pDM_Odm->tolerance_cnt = 0;
 103                 } else {
 104                         if (pDM_Odm->tolerance_cnt < 3)
 105                                 pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
 106                         else
 107                                 pDM_Odm->tolerance_cnt = 4;
 108                         /* test_status = 5; */
 109                         if (pDM_Odm->tolerance_cnt > 3) {
 110                                 /* test_status = 3; */
 111                                 pDM_Odm->adaptivity_flag = false;
 112                         }
 113                 }
 114         } else { /*  TX<RX */
 115                 if (pDM_Odm->adaptivity_flag == true && pDM_Odm->NHM_cnt_0 <= 200) {
 116                         /* test_status = 2; */
 117                         pDM_Odm->tolerance_cnt = 0;
 118                 } else {
 119                         if (pDM_Odm->tolerance_cnt < 3)
 120                                 pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1;
 121                         else
 122                                 pDM_Odm->tolerance_cnt = 4;
 123                         /* test_status = 5; */
 124                         if (pDM_Odm->tolerance_cnt > 3) {
 125                                 /* test_status = 4; */
 126                                 pDM_Odm->adaptivity_flag = false;
 127                         }
 128                 }
 129         }
 130 
 131         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag));
 132 }
 133 
 134 void odm_SearchPwdBLowerBound(void *pDM_VOID, u8 IGI_target)
 135 {
 136         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 137         u32 value32 = 0;
 138         u8 cnt, IGI;
 139         bool bAdjust = true;
 140         s8 TH_L2H_dmc, TH_H2L_dmc;
 141         s8 Diff;
 142 
 143         IGI = 0x50; /*  find H2L, L2H lower bound */
 144         ODM_Write_DIG(pDM_Odm, IGI);
 145 
 146 
 147         Diff = IGI_target-(s8)IGI;
 148         TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
 149         if (TH_L2H_dmc > 10)
 150                 TH_L2H_dmc = 10;
 151         TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
 152         PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc);
 153         PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc);
 154 
 155         mdelay(5);
 156 
 157         while (bAdjust) {
 158                 for (cnt = 0; cnt < 20; cnt++) {
 159                         value32 = PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG_RPT_11N, bMaskDWord);
 160 
 161                         if (value32 & BIT30)
 162                                 pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
 163                         else if (value32 & BIT29)
 164                                 pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1;
 165                         else
 166                                 pDM_Odm->txEdcca0 = pDM_Odm->txEdcca0 + 1;
 167                 }
 168                 /* DbgPrint("txEdcca1 = %d, txEdcca0 = %d\n", pDM_Odm->txEdcca1, pDM_Odm->txEdcca0); */
 169 
 170                 if (pDM_Odm->txEdcca1 > 5) {
 171                         IGI = IGI-1;
 172                         TH_L2H_dmc = TH_L2H_dmc + 1;
 173                         if (TH_L2H_dmc > 10)
 174                                 TH_L2H_dmc = 10;
 175                         TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
 176                         PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc);
 177                         PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc);
 178 
 179                         pDM_Odm->TxHangFlg = true;
 180                         pDM_Odm->txEdcca1 = 0;
 181                         pDM_Odm->txEdcca0 = 0;
 182 
 183                         if (TH_L2H_dmc == 10) {
 184                                 bAdjust = false;
 185                                 pDM_Odm->TxHangFlg = false;
 186                                 pDM_Odm->txEdcca1 = 0;
 187                                 pDM_Odm->txEdcca0 = 0;
 188                                 pDM_Odm->H2L_lb = TH_H2L_dmc;
 189                                 pDM_Odm->L2H_lb = TH_L2H_dmc;
 190                                 pDM_Odm->Adaptivity_IGI_upper = IGI;
 191                         }
 192                 } else {
 193                         bAdjust = false;
 194                         pDM_Odm->TxHangFlg = false;
 195                         pDM_Odm->txEdcca1 = 0;
 196                         pDM_Odm->txEdcca0 = 0;
 197                         pDM_Odm->H2L_lb = TH_H2L_dmc;
 198                         pDM_Odm->L2H_lb = TH_L2H_dmc;
 199                         pDM_Odm->Adaptivity_IGI_upper = IGI;
 200                 }
 201         }
 202 
 203         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));
 204 }
 205 
 206 void odm_AdaptivityInit(void *pDM_VOID)
 207 {
 208         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 209 
 210         if (pDM_Odm->Carrier_Sense_enable == false)
 211                 pDM_Odm->TH_L2H_ini = 0xf7; /*  -7 */
 212         else
 213                 pDM_Odm->TH_L2H_ini = 0xa;
 214 
 215         pDM_Odm->AdapEn_RSSI = 20;
 216         pDM_Odm->TH_EDCCA_HL_diff = 7;
 217 
 218         pDM_Odm->IGI_Base = 0x32;
 219         pDM_Odm->IGI_target = 0x1c;
 220         pDM_Odm->ForceEDCCA = 0;
 221         pDM_Odm->NHM_disable = false;
 222         pDM_Odm->TxHangFlg = true;
 223         pDM_Odm->txEdcca0 = 0;
 224         pDM_Odm->txEdcca1 = 0;
 225         pDM_Odm->H2L_lb = 0;
 226         pDM_Odm->L2H_lb = 0;
 227         pDM_Odm->Adaptivity_IGI_upper = 0;
 228         odm_NHMBBInit(pDM_Odm);
 229 
 230         PHY_SetBBReg(pDM_Odm->Adapter, REG_RD_CTRL, BIT11, 1); /*  stop counting if EDCCA is asserted */
 231 }
 232 
 233 
 234 void odm_Adaptivity(void *pDM_VOID, u8 IGI)
 235 {
 236         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 237         s8 TH_L2H_dmc, TH_H2L_dmc;
 238         s8 Diff, IGI_target;
 239         bool EDCCA_State = false;
 240 
 241         if (!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)) {
 242                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA()\n"));
 243                 return;
 244         }
 245         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====>\n"));
 246         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",
 247                 pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI));
 248 
 249         if (*pDM_Odm->pBandWidth == ODM_BW20M) /* CHANNEL_WIDTH_20 */
 250                 IGI_target = pDM_Odm->IGI_Base;
 251         else if (*pDM_Odm->pBandWidth == ODM_BW40M)
 252                 IGI_target = pDM_Odm->IGI_Base + 2;
 253         else if (*pDM_Odm->pBandWidth == ODM_BW80M)
 254                 IGI_target = pDM_Odm->IGI_Base + 2;
 255         else
 256                 IGI_target = pDM_Odm->IGI_Base;
 257         pDM_Odm->IGI_target = (u8) IGI_target;
 258 
 259         /* Search pwdB lower bound */
 260         if (pDM_Odm->TxHangFlg == true) {
 261                 PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);
 262                 odm_SearchPwdBLowerBound(pDM_Odm, pDM_Odm->IGI_target);
 263         }
 264 
 265         if ((!pDM_Odm->bLinked) || (*pDM_Odm->pChannel > 149)) { /*  Band4 doesn't need adaptivity */
 266                 PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
 267                 PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
 268                 return;
 269         }
 270 
 271         if (!pDM_Odm->ForceEDCCA) {
 272                 if (pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI)
 273                         EDCCA_State = true;
 274                 else if (pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5))
 275                         EDCCA_State = false;
 276         } else
 277                 EDCCA_State = true;
 278 
 279         if (
 280                 pDM_Odm->bLinked &&
 281                 pDM_Odm->Carrier_Sense_enable == false &&
 282                 pDM_Odm->NHM_disable == false &&
 283                 pDM_Odm->TxHangFlg == false
 284         )
 285                 odm_NHMBB(pDM_Odm);
 286 
 287         ODM_RT_TRACE(
 288                 pDM_Odm,
 289                 ODM_COMP_DIG,
 290                 ODM_DBG_LOUD,
 291                 (
 292                         "BandWidth =%s, IGI_target = 0x%x, EDCCA_State =%d\n",
 293                         (*pDM_Odm->pBandWidth == ODM_BW80M) ? "80M" :
 294                         ((*pDM_Odm->pBandWidth == ODM_BW40M) ? "40M" : "20M"),
 295                         IGI_target,
 296                         EDCCA_State
 297                 )
 298         );
 299 
 300         if (EDCCA_State) {
 301                 Diff = IGI_target-(s8)IGI;
 302                 TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
 303                 if (TH_L2H_dmc > 10)
 304                         TH_L2H_dmc = 10;
 305 
 306                 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
 307 
 308                 /* replace lower bound to prevent EDCCA always equal  */
 309                 if (TH_H2L_dmc < pDM_Odm->H2L_lb)
 310                         TH_H2L_dmc = pDM_Odm->H2L_lb;
 311                 if (TH_L2H_dmc < pDM_Odm->L2H_lb)
 312                         TH_L2H_dmc = pDM_Odm->L2H_lb;
 313         } else {
 314                 TH_L2H_dmc = 0x7f;
 315                 TH_H2L_dmc = 0x7f;
 316         }
 317         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI = 0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n",
 318                 IGI, TH_L2H_dmc, TH_H2L_dmc));
 319         PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc);
 320         PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc);
 321 }
 322 
 323 void ODM_Write_DIG(void *pDM_VOID, u8 CurrentIGI)
 324 {
 325         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 326         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
 327 
 328         if (pDM_DigTable->bStopDIG) {
 329                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n"));
 330                 return;
 331         }
 332 
 333         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",
 334                 ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm)));
 335 
 336         if (pDM_DigTable->CurIGValue != CurrentIGI) {
 337                 /* 1 Check initial gain by upper bound */
 338                 if (!pDM_DigTable->bPSDInProgress) {
 339                         if (CurrentIGI > pDM_DigTable->rx_gain_range_max) {
 340                                 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));
 341                                 CurrentIGI = pDM_DigTable->rx_gain_range_max;
 342                         }
 343 
 344                 }
 345 
 346                 /* 1 Set IGI value */
 347                 PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI);
 348 
 349                 if (pDM_Odm->RFType > ODM_1T1R)
 350                         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG(IGI_B, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI);
 351 
 352                 pDM_DigTable->CurIGValue = CurrentIGI;
 353         }
 354 
 355         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x).\n", CurrentIGI));
 356 
 357 }
 358 
 359 void odm_PauseDIG(
 360         void *pDM_VOID,
 361         ODM_Pause_DIG_TYPE PauseType,
 362         u8 IGIValue
 363 )
 364 {
 365         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 366         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
 367         static bool bPaused;
 368 
 369         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG() =========>\n"));
 370 
 371         if (
 372                 (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) &&
 373                 pDM_Odm->TxHangFlg == true
 374         ) {
 375                 ODM_RT_TRACE(
 376                         pDM_Odm,
 377                         ODM_COMP_DIG,
 378                         ODM_DBG_LOUD,
 379                         ("odm_PauseDIG(): Dynamic adjust threshold in progress !!\n")
 380                 );
 381                 return;
 382         }
 383 
 384         if (
 385                 !bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) ||
 386                 !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
 387         ){
 388                 ODM_RT_TRACE(
 389                         pDM_Odm,
 390                         ODM_COMP_DIG,
 391                         ODM_DBG_LOUD,
 392                         ("odm_PauseDIG(): Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n")
 393                 );
 394                 return;
 395         }
 396 
 397         switch (PauseType) {
 398         /* 1 Pause DIG */
 399         case ODM_PAUSE_DIG:
 400                 /* 2 Disable DIG */
 401                 ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG));
 402                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n"));
 403 
 404                 /* 2 Backup IGI value */
 405                 if (!bPaused) {
 406                         pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue;
 407                         bPaused = true;
 408                 }
 409                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI  = 0x%x\n", pDM_DigTable->IGIBackup));
 410 
 411                 /* 2 Write new IGI value */
 412                 ODM_Write_DIG(pDM_Odm, IGIValue);
 413                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue));
 414                 break;
 415 
 416         /* 1 Resume DIG */
 417         case ODM_RESUME_DIG:
 418                 if (bPaused) {
 419                         /* 2 Write backup IGI value */
 420                         ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup);
 421                         bPaused = false;
 422                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup));
 423 
 424                         /* 2 Enable DIG */
 425                         ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG);
 426                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n"));
 427                 }
 428                 break;
 429 
 430         default:
 431                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong  type !!\n"));
 432                 break;
 433         }
 434 }
 435 
 436 bool odm_DigAbort(void *pDM_VOID)
 437 {
 438         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 439 
 440         /* SupportAbility */
 441         if (!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)) {
 442                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n"));
 443                 return  true;
 444         }
 445 
 446         /* SupportAbility */
 447         if (!(pDM_Odm->SupportAbility & ODM_BB_DIG)) {
 448                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n"));
 449                 return  true;
 450         }
 451 
 452         /* ScanInProcess */
 453         if (*(pDM_Odm->pbScanInProcess)) {
 454                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress\n"));
 455                 return  true;
 456         }
 457 
 458         /* add by Neil Chen to avoid PSD is processing */
 459         if (pDM_Odm->bDMInitialGainEnable == false) {
 460                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing\n"));
 461                 return  true;
 462         }
 463 
 464         return  false;
 465 }
 466 
 467 void odm_DIGInit(void *pDM_VOID)
 468 {
 469         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 470         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
 471 
 472         pDM_DigTable->bStopDIG = false;
 473         pDM_DigTable->bPSDInProgress = false;
 474         pDM_DigTable->CurIGValue = (u8) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm));
 475         pDM_DigTable->RssiLowThresh     = DM_DIG_THRESH_LOW;
 476         pDM_DigTable->RssiHighThresh    = DM_DIG_THRESH_HIGH;
 477         pDM_DigTable->FALowThresh       = DMfalseALARM_THRESH_LOW;
 478         pDM_DigTable->FAHighThresh      = DMfalseALARM_THRESH_HIGH;
 479         pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT;
 480         pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
 481         pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
 482         pDM_DigTable->PreCCK_CCAThres = 0xFF;
 483         pDM_DigTable->CurCCK_CCAThres = 0x83;
 484         pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC;
 485         pDM_DigTable->LargeFAHit = 0;
 486         pDM_DigTable->Recover_cnt = 0;
 487         pDM_DigTable->bMediaConnect_0 = false;
 488         pDM_DigTable->bMediaConnect_1 = false;
 489 
 490         /* To Initialize pDM_Odm->bDMInitialGainEnable == false to avoid DIG error */
 491         pDM_Odm->bDMInitialGainEnable = true;
 492 
 493         pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC;
 494         pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC;
 495 
 496         /* To Initi BT30 IGI */
 497         pDM_DigTable->BT30_CurIGI = 0x32;
 498 
 499         pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC;
 500         pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC;
 501 
 502 }
 503 
 504 
 505 void odm_DIG(void *pDM_VOID)
 506 {
 507         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 508 
 509         /*  Common parameters */
 510         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
 511         Pfalse_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
 512         bool FirstConnect, FirstDisConnect;
 513         u8 DIG_MaxOfMin, DIG_Dynamic_MIN;
 514         u8 dm_dig_max, dm_dig_min;
 515         u8 CurrentIGI = pDM_DigTable->CurIGValue;
 516         u8 offset;
 517         u32 dm_FA_thres[3];
 518         u8 Adap_IGI_Upper = 0;
 519         u32 TxTp = 0, RxTp = 0;
 520         bool bDFSBand = false;
 521         bool bPerformance = true, bFirstTpTarget = false, bFirstCoverage = false;
 522 
 523         if (odm_DigAbort(pDM_Odm))
 524                 return;
 525 
 526         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() ===========================>\n\n"));
 527 
 528         if (pDM_Odm->adaptivity_flag == true)
 529                 Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper;
 530 
 531 
 532         /* 1 Update status */
 533         DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0;
 534         FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == false);
 535         FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == true);
 536 
 537         /* 1 Boundary Decision */
 538         /* 2 For WIN\CE */
 539         dm_dig_max = 0x5A;
 540         dm_dig_min = DM_DIG_MIN_NIC;
 541         DIG_MaxOfMin = DM_DIG_MAX_AP;
 542 
 543         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Absolutely upper bound = 0x%x, lower bound = 0x%x\n", dm_dig_max, dm_dig_min));
 544 
 545         /* 1 Adjust boundary by RSSI */
 546         if (pDM_Odm->bLinked && bPerformance) {
 547                 /* 2 Modify DIG upper bound */
 548                 /* 4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT */
 549                 if (pDM_Odm->bBtLimitedDig == 1) {
 550                         offset = 10;
 551                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset));
 552                 } else
 553                         offset = 15;
 554 
 555                 if ((pDM_Odm->RSSI_Min + offset) > dm_dig_max)
 556                         pDM_DigTable->rx_gain_range_max = dm_dig_max;
 557                 else if ((pDM_Odm->RSSI_Min + offset) < dm_dig_min)
 558                         pDM_DigTable->rx_gain_range_max = dm_dig_min;
 559                 else
 560                         pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset;
 561 
 562                 /* 2 Modify DIG lower bound */
 563                 /* if (pDM_Odm->bOneEntryOnly) */
 564                 {
 565                         if (pDM_Odm->RSSI_Min < dm_dig_min)
 566                                 DIG_Dynamic_MIN = dm_dig_min;
 567                         else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin)
 568                                 DIG_Dynamic_MIN = DIG_MaxOfMin;
 569                         else
 570                                 DIG_Dynamic_MIN = pDM_Odm->RSSI_Min;
 571                 }
 572         } else {
 573                 pDM_DigTable->rx_gain_range_max = dm_dig_max;
 574                 DIG_Dynamic_MIN = dm_dig_min;
 575         }
 576 
 577         /* 1 Force Lower Bound for AntDiv */
 578         if (pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly) {
 579                 if (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) {
 580                         if (
 581                                 pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV ||
 582                                 pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV ||
 583                                 pDM_Odm->AntDivType == S0S1_SW_ANTDIV
 584                         ) {
 585                                 if (pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin)
 586                                         DIG_Dynamic_MIN = DIG_MaxOfMin;
 587                                 else
 588                                         DIG_Dynamic_MIN = (u8) pDM_DigTable->AntDiv_RSSI_max;
 589                                 ODM_RT_TRACE(
 590                                         pDM_Odm,
 591                                         ODM_COMP_ANT_DIV,
 592                                         ODM_DBG_LOUD,
 593                                         (
 594                                                 "odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n",
 595                                                 DIG_Dynamic_MIN
 596                                         )
 597                                 );
 598                                 ODM_RT_TRACE(
 599                                         pDM_Odm,
 600                                         ODM_COMP_ANT_DIV,
 601                                         ODM_DBG_LOUD,
 602                                         (
 603                                                 "odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n",
 604                                                 pDM_DigTable->AntDiv_RSSI_max
 605                                         )
 606                                 );
 607                         }
 608                 }
 609         }
 610         ODM_RT_TRACE(
 611                 pDM_Odm,
 612                 ODM_COMP_DIG,
 613                 ODM_DBG_LOUD,
 614                 (
 615                         "odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n",
 616                         pDM_DigTable->rx_gain_range_max,
 617                         DIG_Dynamic_MIN
 618                 )
 619         );
 620         ODM_RT_TRACE(
 621                 pDM_Odm,
 622                 ODM_COMP_DIG,
 623                 ODM_DBG_LOUD,
 624                 (
 625                         "odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n",
 626                         pDM_Odm->bLinked,
 627                         pDM_Odm->RSSI_Min,
 628                         FirstConnect,
 629                         FirstDisConnect
 630                 )
 631         );
 632 
 633         /* 1 Modify DIG lower bound, deal with abnormal case */
 634         /* 2 Abnormal false alarm case */
 635         if (FirstDisConnect) {
 636                 pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN;
 637                 pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN;
 638         } else
 639                 pDM_DigTable->rx_gain_range_min =
 640                         odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI);
 641 
 642         if (pDM_Odm->bLinked && !FirstConnect) {
 643                 if (
 644                         (pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) &&
 645                         pDM_Odm->bsta_state
 646                 ) {
 647                         pDM_DigTable->rx_gain_range_min = dm_dig_min;
 648                         ODM_RT_TRACE(
 649                                 pDM_Odm,
 650                                 ODM_COMP_DIG,
 651                                 ODM_DBG_LOUD,
 652                                 (
 653                                         "odm_DIG(): Abnormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n",
 654                                         pDM_Odm->PhyDbgInfo.NumQryBeaconPkt,
 655                                         pDM_DigTable->rx_gain_range_min
 656                                 )
 657                         );
 658                 }
 659         }
 660 
 661         /* 2 Abnormal lower bound case */
 662         if (pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max) {
 663                 pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
 664                 ODM_RT_TRACE(
 665                         pDM_Odm,
 666                         ODM_COMP_DIG,
 667                         ODM_DBG_LOUD,
 668                         (
 669                                 "odm_DIG(): Abnormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n",
 670                                 pDM_DigTable->rx_gain_range_min
 671                         )
 672                 );
 673         }
 674 
 675 
 676         /* 1 False alarm threshold decision */
 677         odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres);
 678         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]));
 679 
 680         /* 1 Adjust initial gain by false alarm */
 681         if (pDM_Odm->bLinked && bPerformance) {
 682                 /* 2 After link */
 683                 ODM_RT_TRACE(
 684                         pDM_Odm,
 685                         ODM_COMP_DIG,
 686                         ODM_DBG_LOUD,
 687                         ("odm_DIG(): Adjust IGI after link\n")
 688                 );
 689 
 690                 if (bFirstTpTarget || (FirstConnect && bPerformance)) {
 691                         pDM_DigTable->LargeFAHit = 0;
 692 
 693                         if (pDM_Odm->RSSI_Min < DIG_MaxOfMin) {
 694                                 if (CurrentIGI < pDM_Odm->RSSI_Min)
 695                                         CurrentIGI = pDM_Odm->RSSI_Min;
 696                         } else {
 697                                 if (CurrentIGI < DIG_MaxOfMin)
 698                                         CurrentIGI = DIG_MaxOfMin;
 699                         }
 700 
 701                         ODM_RT_TRACE(
 702                                 pDM_Odm,
 703                                 ODM_COMP_DIG,
 704                                 ODM_DBG_LOUD,
 705                                 (
 706                                         "odm_DIG(): First connect case: IGI does on-shot to 0x%x\n",
 707                                         CurrentIGI
 708                                 )
 709                         );
 710 
 711                 } else {
 712                         if (pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
 713                                 CurrentIGI = CurrentIGI + 4;
 714                         else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
 715                                 CurrentIGI = CurrentIGI + 2;
 716                         else if (pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
 717                                 CurrentIGI = CurrentIGI - 2;
 718 
 719                         if (
 720                                 (pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) &&
 721                                 (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) &&
 722                                 (pDM_Odm->bsta_state)
 723                         ) {
 724                                 CurrentIGI = pDM_DigTable->rx_gain_range_min;
 725                                 ODM_RT_TRACE(
 726                                         pDM_Odm,
 727                                         ODM_COMP_DIG,
 728                                         ODM_DBG_LOUD,
 729                                         (
 730                                                 "odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n",
 731                                                 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt,
 732                                                 CurrentIGI
 733                                         )
 734                                 );
 735                         }
 736                 }
 737         } else {
 738                 /* 2 Before link */
 739                 ODM_RT_TRACE(
 740                         pDM_Odm,
 741                         ODM_COMP_DIG,
 742                         ODM_DBG_LOUD,
 743                         ("odm_DIG(): Adjust IGI before link\n")
 744                 );
 745 
 746                 if (FirstDisConnect || bFirstCoverage) {
 747                         CurrentIGI = dm_dig_min;
 748                         ODM_RT_TRACE(
 749                                 pDM_Odm,
 750                                 ODM_COMP_DIG,
 751                                 ODM_DBG_LOUD,
 752                                 ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n")
 753                         );
 754                 } else {
 755                         if (pFalseAlmCnt->Cnt_all > dm_FA_thres[2])
 756                                 CurrentIGI = CurrentIGI + 4;
 757                         else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1])
 758                                 CurrentIGI = CurrentIGI + 2;
 759                         else if (pFalseAlmCnt->Cnt_all < dm_FA_thres[0])
 760                                 CurrentIGI = CurrentIGI - 2;
 761                 }
 762         }
 763 
 764         /* 1 Check initial gain by upper/lower bound */
 765         if (CurrentIGI < pDM_DigTable->rx_gain_range_min)
 766                 CurrentIGI = pDM_DigTable->rx_gain_range_min;
 767 
 768         if (CurrentIGI > pDM_DigTable->rx_gain_range_max)
 769                 CurrentIGI = pDM_DigTable->rx_gain_range_max;
 770 
 771         ODM_RT_TRACE(
 772                 pDM_Odm,
 773                 ODM_COMP_DIG,
 774                 ODM_DBG_LOUD,
 775                 (
 776                         "odm_DIG(): CurIGValue = 0x%x, TotalFA = %d\n\n",
 777                         CurrentIGI,
 778                         pFalseAlmCnt->Cnt_all
 779                 )
 780         );
 781 
 782         /* 1 Force upper bound and lower bound for adaptivity */
 783         if (
 784                 pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY &&
 785                 pDM_Odm->adaptivity_flag == true
 786         ) {
 787                 if (CurrentIGI > Adap_IGI_Upper)
 788                         CurrentIGI = Adap_IGI_Upper;
 789 
 790                 if (pDM_Odm->IGI_LowerBound != 0) {
 791                         if (CurrentIGI < pDM_Odm->IGI_LowerBound)
 792                                 CurrentIGI = pDM_Odm->IGI_LowerBound;
 793                 }
 794                 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));
 795                 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));
 796         }
 797 
 798 
 799         /* 1 Update status */
 800         if (pDM_Odm->bBtHsOperation) {
 801                 if (pDM_Odm->bLinked) {
 802                         if (pDM_DigTable->BT30_CurIGI > (CurrentIGI))
 803                                 ODM_Write_DIG(pDM_Odm, CurrentIGI);
 804                         else
 805                                 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);
 806 
 807                         pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
 808                         pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
 809                 } else {
 810                         if (pDM_Odm->bLinkInProcess)
 811                                 ODM_Write_DIG(pDM_Odm, 0x1c);
 812                         else if (pDM_Odm->bBtConnectProcess)
 813                                 ODM_Write_DIG(pDM_Odm, 0x28);
 814                         else
 815                                 ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);/* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */
 816                 }
 817         } else { /*  BT is not using */
 818                 ODM_Write_DIG(pDM_Odm, CurrentIGI);/* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */
 819                 pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked;
 820                 pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN;
 821         }
 822 }
 823 
 824 void odm_DIGbyRSSI_LPS(void *pDM_VOID)
 825 {
 826         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 827         Pfalse_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt;
 828 
 829         u8 RSSI_Lower = DM_DIG_MIN_NIC;   /* 0x1E or 0x1C */
 830         u8 CurrentIGI = pDM_Odm->RSSI_Min;
 831 
 832         CurrentIGI = CurrentIGI+RSSI_OFFSET_DIG;
 833 
 834         ODM_RT_TRACE(
 835                 pDM_Odm,
 836                 ODM_COMP_DIG,
 837                 ODM_DBG_LOUD,
 838                 ("odm_DIGbyRSSI_LPS() ==>\n")
 839         );
 840 
 841         /*  Using FW PS mode to make IGI */
 842         /* Adjust by  FA in LPS MODE */
 843         if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_LPS)
 844                 CurrentIGI = CurrentIGI+4;
 845         else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS)
 846                 CurrentIGI = CurrentIGI+2;
 847         else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS)
 848                 CurrentIGI = CurrentIGI-2;
 849 
 850 
 851         /* Lower bound checking */
 852 
 853         /* RSSI Lower bound check */
 854         if ((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC)
 855                 RSSI_Lower = pDM_Odm->RSSI_Min-10;
 856         else
 857                 RSSI_Lower = DM_DIG_MIN_NIC;
 858 
 859         /* Upper and Lower Bound checking */
 860         if (CurrentIGI > DM_DIG_MAX_NIC)
 861                 CurrentIGI = DM_DIG_MAX_NIC;
 862         else if (CurrentIGI < RSSI_Lower)
 863                 CurrentIGI = RSSI_Lower;
 864 
 865 
 866         ODM_RT_TRACE(
 867                 pDM_Odm,
 868                 ODM_COMP_DIG,
 869                 ODM_DBG_LOUD,
 870                 ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n", pFalseAlmCnt->Cnt_all)
 871         );
 872         ODM_RT_TRACE(
 873                 pDM_Odm,
 874                 ODM_COMP_DIG,
 875                 ODM_DBG_LOUD,
 876                 ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n", pDM_Odm->RSSI_Min)
 877         );
 878         ODM_RT_TRACE(
 879                 pDM_Odm,
 880                 ODM_COMP_DIG,
 881                 ODM_DBG_LOUD,
 882                 ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n", CurrentIGI)
 883         );
 884 
 885         ODM_Write_DIG(pDM_Odm, CurrentIGI);
 886         /* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */
 887 }
 888 
 889 /* 3 ============================================================ */
 890 /* 3 FASLE ALARM CHECK */
 891 /* 3 ============================================================ */
 892 
 893 void odm_FalseAlarmCounterStatistics(void *pDM_VOID)
 894 {
 895         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
 896         Pfalse_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
 897         u32 ret_value;
 898 
 899         if (!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT))
 900                 return;
 901 
 902         /* hold ofdm counter */
 903         /* hold page C counter */
 904         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1);
 905         /* hold page D counter */
 906         PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1);
 907 
 908         ret_value = PHY_QueryBBReg(
 909                 pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord
 910         );
 911         FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff);
 912         FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16);
 913 
 914         ret_value = PHY_QueryBBReg(
 915                 pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord
 916         );
 917         FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff);
 918         FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
 919 
 920         ret_value = PHY_QueryBBReg(
 921                 pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord
 922         );
 923         FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
 924         FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
 925 
 926         ret_value = PHY_QueryBBReg(
 927                 pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord
 928         );
 929         FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
 930 
 931         FalseAlmCnt->Cnt_Ofdm_fail =
 932                 FalseAlmCnt->Cnt_Parity_Fail +
 933                 FalseAlmCnt->Cnt_Rate_Illegal +
 934                 FalseAlmCnt->Cnt_Crc8_fail +
 935                 FalseAlmCnt->Cnt_Mcs_fail +
 936                 FalseAlmCnt->Cnt_Fast_Fsync +
 937                 FalseAlmCnt->Cnt_SB_Search_fail;
 938 
 939         {
 940                 /* hold cck counter */
 941                 PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_CCK_FA_RST_11N, BIT12, 1);
 942                 PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_CCK_FA_RST_11N, BIT14, 1);
 943 
 944                 ret_value = PHY_QueryBBReg(
 945                         pDM_Odm->Adapter, ODM_REG_CCK_FA_LSB_11N, bMaskByte0
 946                 );
 947                 FalseAlmCnt->Cnt_Cck_fail = ret_value;
 948 
 949                 ret_value = PHY_QueryBBReg(
 950                         pDM_Odm->Adapter, ODM_REG_CCK_FA_MSB_11N, bMaskByte3
 951                 );
 952                 FalseAlmCnt->Cnt_Cck_fail += (ret_value&0xff)<<8;
 953 
 954                 ret_value = PHY_QueryBBReg(
 955                         pDM_Odm->Adapter, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord
 956                 );
 957                 FalseAlmCnt->Cnt_CCK_CCA =
 958                         ((ret_value&0xFF)<<8) | ((ret_value&0xFF00)>>8);
 959         }
 960 
 961         FalseAlmCnt->Cnt_all = (
 962                 FalseAlmCnt->Cnt_Fast_Fsync +
 963                 FalseAlmCnt->Cnt_SB_Search_fail +
 964                 FalseAlmCnt->Cnt_Parity_Fail +
 965                 FalseAlmCnt->Cnt_Rate_Illegal +
 966                 FalseAlmCnt->Cnt_Crc8_fail +
 967                 FalseAlmCnt->Cnt_Mcs_fail +
 968                 FalseAlmCnt->Cnt_Cck_fail
 969         );
 970 
 971         FalseAlmCnt->Cnt_CCA_all =
 972                 FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA;
 973 
 974         ODM_RT_TRACE(
 975                 pDM_Odm,
 976                 ODM_COMP_FA_CNT,
 977                 ODM_DBG_LOUD,
 978                 ("Enter odm_FalseAlarmCounterStatistics\n")
 979         );
 980         ODM_RT_TRACE(
 981                 pDM_Odm,
 982                 ODM_COMP_FA_CNT,
 983                 ODM_DBG_LOUD,
 984                 (
 985                         "Cnt_Fast_Fsync =%d, Cnt_SB_Search_fail =%d\n",
 986                         FalseAlmCnt->Cnt_Fast_Fsync,
 987                         FalseAlmCnt->Cnt_SB_Search_fail
 988                 )
 989         );
 990         ODM_RT_TRACE(
 991                 pDM_Odm,
 992                 ODM_COMP_FA_CNT,
 993                 ODM_DBG_LOUD,
 994                 (
 995                         "Cnt_Parity_Fail =%d, Cnt_Rate_Illegal =%d\n",
 996                         FalseAlmCnt->Cnt_Parity_Fail,
 997                         FalseAlmCnt->Cnt_Rate_Illegal
 998                 )
 999         );
1000         ODM_RT_TRACE(
1001                 pDM_Odm,
1002                 ODM_COMP_FA_CNT,
1003                 ODM_DBG_LOUD,
1004                 (
1005                         "Cnt_Crc8_fail =%d, Cnt_Mcs_fail =%d\n",
1006                         FalseAlmCnt->Cnt_Crc8_fail,
1007                         FalseAlmCnt->Cnt_Mcs_fail
1008                 )
1009         );
1010 
1011         ODM_RT_TRACE(
1012                 pDM_Odm,
1013                 ODM_COMP_FA_CNT,
1014                 ODM_DBG_LOUD,
1015                 ("Cnt_OFDM_CCA =%d\n", FalseAlmCnt->Cnt_OFDM_CCA)
1016         );
1017         ODM_RT_TRACE(
1018                 pDM_Odm,
1019                 ODM_COMP_FA_CNT,
1020                 ODM_DBG_LOUD,
1021                 ("Cnt_CCK_CCA =%d\n", FalseAlmCnt->Cnt_CCK_CCA)
1022         );
1023         ODM_RT_TRACE(
1024                 pDM_Odm,
1025                 ODM_COMP_FA_CNT,
1026                 ODM_DBG_LOUD,
1027                 ("Cnt_CCA_all =%d\n", FalseAlmCnt->Cnt_CCA_all)
1028         );
1029         ODM_RT_TRACE(
1030                 pDM_Odm,
1031                 ODM_COMP_FA_CNT,
1032                 ODM_DBG_LOUD,
1033                 ("Cnt_Ofdm_fail =%d\n", FalseAlmCnt->Cnt_Ofdm_fail)
1034         );
1035         ODM_RT_TRACE(
1036                 pDM_Odm,
1037                 ODM_COMP_FA_CNT,
1038                 ODM_DBG_LOUD,
1039                 ("Cnt_Cck_fail =%d\n",  FalseAlmCnt->Cnt_Cck_fail)
1040         );
1041         ODM_RT_TRACE(
1042                 pDM_Odm,
1043                 ODM_COMP_FA_CNT,
1044                 ODM_DBG_LOUD,
1045                 ("Cnt_Ofdm_fail =%d\n", FalseAlmCnt->Cnt_Ofdm_fail)
1046         );
1047         ODM_RT_TRACE(
1048                 pDM_Odm,
1049                 ODM_COMP_FA_CNT,
1050                 ODM_DBG_LOUD,
1051                 ("Total False Alarm =%d\n",     FalseAlmCnt->Cnt_all)
1052         );
1053 }
1054 
1055 
1056 void odm_FAThresholdCheck(
1057         void *pDM_VOID,
1058         bool bDFSBand,
1059         bool bPerformance,
1060         u32 RxTp,
1061         u32 TxTp,
1062         u32 *dm_FA_thres
1063 )
1064 {
1065         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1066 
1067         if (pDM_Odm->bLinked && (bPerformance || bDFSBand)) {
1068                 /*  For NIC */
1069                 dm_FA_thres[0] = DM_DIG_FA_TH0;
1070                 dm_FA_thres[1] = DM_DIG_FA_TH1;
1071                 dm_FA_thres[2] = DM_DIG_FA_TH2;
1072         } else {
1073                 dm_FA_thres[0] = 2000;
1074                 dm_FA_thres[1] = 4000;
1075                 dm_FA_thres[2] = 5000;
1076         }
1077         return;
1078 }
1079 
1080 u8 odm_ForbiddenIGICheck(void *pDM_VOID, u8 DIG_Dynamic_MIN, u8 CurrentIGI)
1081 {
1082         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1083         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1084         Pfalse_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1085         u8 rx_gain_range_min = pDM_DigTable->rx_gain_range_min;
1086 
1087         if (pFalseAlmCnt->Cnt_all > 10000) {
1088                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case.\n"));
1089 
1090                 if (pDM_DigTable->LargeFAHit != 3)
1091                         pDM_DigTable->LargeFAHit++;
1092 
1093                 /* if (pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue) */
1094                 if (pDM_DigTable->ForbiddenIGI < CurrentIGI) {
1095                         pDM_DigTable->ForbiddenIGI = CurrentIGI;
1096                         /* pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue; */
1097                         pDM_DigTable->LargeFAHit = 1;
1098                 }
1099 
1100                 if (pDM_DigTable->LargeFAHit >= 3) {
1101                         if ((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max)
1102                                 rx_gain_range_min = pDM_DigTable->rx_gain_range_max;
1103                         else
1104                                 rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
1105                         pDM_DigTable->Recover_cnt = 1800;
1106                         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));
1107                 }
1108         } else {
1109                 if (pDM_DigTable->Recover_cnt != 0) {
1110                         pDM_DigTable->Recover_cnt--;
1111                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d\n", pDM_DigTable->Recover_cnt));
1112                 } else {
1113                         if (pDM_DigTable->LargeFAHit < 3) {
1114                                 if ((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) { /* DM_DIG_MIN) */
1115                                         pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; /* DM_DIG_MIN; */
1116                                         rx_gain_range_min = DIG_Dynamic_MIN; /* DM_DIG_MIN; */
1117                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n"));
1118                                 } else {
1119                                         pDM_DigTable->ForbiddenIGI -= 2;
1120                                         rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2);
1121                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n"));
1122                                 }
1123                         } else
1124                                 pDM_DigTable->LargeFAHit = 0;
1125                 }
1126         }
1127 
1128         return rx_gain_range_min;
1129 
1130 }
1131 
1132 /* 3 ============================================================ */
1133 /* 3 CCK Packet Detect Threshold */
1134 /* 3 ============================================================ */
1135 
1136 void odm_CCKPacketDetectionThresh(void *pDM_VOID)
1137 {
1138         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1139         Pfalse_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt);
1140         u8 CurCCK_CCAThres;
1141 
1142 
1143         if (
1144                 !(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) ||
1145                 !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)
1146         ) {
1147                 ODM_RT_TRACE(
1148                         pDM_Odm,
1149                         ODM_COMP_CCK_PD,
1150                         ODM_DBG_LOUD,
1151                         ("odm_CCKPacketDetectionThresh()  return ==========\n")
1152                 );
1153                 return;
1154         }
1155 
1156         if (pDM_Odm->ExtLNA)
1157                 return;
1158 
1159         ODM_RT_TRACE(
1160                 pDM_Odm,
1161                 ODM_COMP_CCK_PD,
1162                 ODM_DBG_LOUD,
1163                 ("odm_CCKPacketDetectionThresh()  ==========>\n")
1164         );
1165 
1166         if (pDM_Odm->bLinked) {
1167                 if (pDM_Odm->RSSI_Min > 25)
1168                         CurCCK_CCAThres = 0xcd;
1169                 else if ((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10))
1170                         CurCCK_CCAThres = 0x83;
1171                 else {
1172                         if (FalseAlmCnt->Cnt_Cck_fail > 1000)
1173                                 CurCCK_CCAThres = 0x83;
1174                         else
1175                                 CurCCK_CCAThres = 0x40;
1176                 }
1177         } else {
1178                 if (FalseAlmCnt->Cnt_Cck_fail > 1000)
1179                         CurCCK_CCAThres = 0x83;
1180                 else
1181                         CurCCK_CCAThres = 0x40;
1182         }
1183 
1184         ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres);
1185 
1186         ODM_RT_TRACE(
1187                 pDM_Odm,
1188                 ODM_COMP_CCK_PD,
1189                 ODM_DBG_LOUD,
1190                 (
1191                         "odm_CCKPacketDetectionThresh()  CurCCK_CCAThres = 0x%x\n",
1192                         CurCCK_CCAThres
1193                 )
1194         );
1195 }
1196 
1197 void ODM_Write_CCK_CCA_Thres(void *pDM_VOID, u8 CurCCK_CCAThres)
1198 {
1199         PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
1200         pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
1201 
1202         /* modify by Guo.Mingzhi 2012-01-03 */
1203         if (pDM_DigTable->CurCCK_CCAThres != CurCCK_CCAThres)
1204                 rtw_write8(pDM_Odm->Adapter, ODM_REG(CCK_CCA, pDM_Odm), CurCCK_CCAThres);
1205 
1206         pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres;
1207         pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres;
1208 }

/* [<][>][^][v][top][bottom][index][help] */