158391efdSNathan Chancellor // SPDX-License-Identifier: GPL-2.0 2554c0a3aSHans de Goede /****************************************************************************** 3554c0a3aSHans de Goede * 4554c0a3aSHans de Goede * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 5554c0a3aSHans de Goede * 6554c0a3aSHans de Goede ******************************************************************************/ 7554c0a3aSHans de Goede 8554c0a3aSHans de Goede #include "odm_precomp.h" 9554c0a3aSHans de Goede 10554c0a3aSHans de Goede #define ADAPTIVITY_VERSION "5.0" 11554c0a3aSHans de Goede 12554c0a3aSHans de Goede void odm_NHMCounterStatisticsInit(void *pDM_VOID) 13554c0a3aSHans de Goede { 14554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 15554c0a3aSHans de Goede 16554c0a3aSHans de Goede /* PHY parameters initialize for n series */ 17554c0a3aSHans de Goede rtw_write16(pDM_Odm->Adapter, ODM_REG_NHM_TIMER_11N+2, 0x2710); /* 0x894[31:16]= 0x2710 Time duration for NHM unit: 4us, 0x2710 =40ms */ 18554c0a3aSHans de Goede /* rtw_write16(pDM_Odm->Adapter, ODM_REG_NHM_TIMER_11N+2, 0x4e20); 0x894[31:16]= 0x4e20 Time duration for NHM unit: 4us, 0x4e20 =80ms */ 19554c0a3aSHans de Goede rtw_write16(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N+2, 0xffff); /* 0x890[31:16]= 0xffff th_9, th_10 */ 20554c0a3aSHans de Goede /* rtw_write32(pDM_Odm->Adapter, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff5c); 0x898 = 0xffffff5c th_3, th_2, th_1, th_0 */ 21554c0a3aSHans de Goede rtw_write32(pDM_Odm->Adapter, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff52); /* 0x898 = 0xffffff52 th_3, th_2, th_1, th_0 */ 22554c0a3aSHans de Goede rtw_write32(pDM_Odm->Adapter, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); /* 0x89c = 0xffffffff th_7, th_6, th_5, th_4 */ 23554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff); /* 0xe28[7:0]= 0xff th_8 */ 24554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N, BIT10|BIT9|BIT8, 0x7); /* 0x890[9:8]=3 enable CCX */ 25554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1); /* 0xc0c[7]= 1 max power among all RX ants */ 26554c0a3aSHans de Goede } 27554c0a3aSHans de Goede 28554c0a3aSHans de Goede void odm_NHMCounterStatistics(void *pDM_VOID) 29554c0a3aSHans de Goede { 30554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 31554c0a3aSHans de Goede 32554c0a3aSHans de Goede /* Get NHM report */ 33554c0a3aSHans de Goede odm_GetNHMCounterStatistics(pDM_Odm); 34554c0a3aSHans de Goede 35554c0a3aSHans de Goede /* Reset NHM counter */ 36554c0a3aSHans de Goede odm_NHMCounterStatisticsReset(pDM_Odm); 37554c0a3aSHans de Goede } 38554c0a3aSHans de Goede 39554c0a3aSHans de Goede void odm_GetNHMCounterStatistics(void *pDM_VOID) 40554c0a3aSHans de Goede { 41554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 42554c0a3aSHans de Goede u32 value32 = 0; 43554c0a3aSHans de Goede 44554c0a3aSHans de Goede value32 = PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG_NHM_CNT_11N, bMaskDWord); 45554c0a3aSHans de Goede 46554c0a3aSHans de Goede pDM_Odm->NHM_cnt_0 = (u8)(value32 & bMaskByte0); 47554c0a3aSHans de Goede } 48554c0a3aSHans de Goede 49554c0a3aSHans de Goede void odm_NHMCounterStatisticsReset(void *pDM_VOID) 50554c0a3aSHans de Goede { 51554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 52554c0a3aSHans de Goede 53554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0); 54554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1); 55554c0a3aSHans de Goede } 56554c0a3aSHans de Goede 57554c0a3aSHans de Goede void odm_NHMBBInit(void *pDM_VOID) 58554c0a3aSHans de Goede { 59554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 60554c0a3aSHans de Goede 61554c0a3aSHans de Goede pDM_Odm->adaptivity_flag = 0; 62554c0a3aSHans de Goede pDM_Odm->tolerance_cnt = 3; 63554c0a3aSHans de Goede pDM_Odm->NHMLastTxOkcnt = 0; 64554c0a3aSHans de Goede pDM_Odm->NHMLastRxOkcnt = 0; 65554c0a3aSHans de Goede pDM_Odm->NHMCurTxOkcnt = 0; 66554c0a3aSHans de Goede pDM_Odm->NHMCurRxOkcnt = 0; 67554c0a3aSHans de Goede } 68554c0a3aSHans de Goede 69554c0a3aSHans de Goede /* */ 70554c0a3aSHans de Goede void odm_NHMBB(void *pDM_VOID) 71554c0a3aSHans de Goede { 72554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 73554c0a3aSHans de Goede /* u8 test_status; */ 74554c0a3aSHans de Goede /* Pfalse_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt); */ 75554c0a3aSHans de Goede 76554c0a3aSHans de Goede pDM_Odm->NHMCurTxOkcnt = 77554c0a3aSHans de Goede *(pDM_Odm->pNumTxBytesUnicast)-pDM_Odm->NHMLastTxOkcnt; 78554c0a3aSHans de Goede pDM_Odm->NHMCurRxOkcnt = 79554c0a3aSHans de Goede *(pDM_Odm->pNumRxBytesUnicast)-pDM_Odm->NHMLastRxOkcnt; 80554c0a3aSHans de Goede pDM_Odm->NHMLastTxOkcnt = 81554c0a3aSHans de Goede *(pDM_Odm->pNumTxBytesUnicast); 82554c0a3aSHans de Goede pDM_Odm->NHMLastRxOkcnt = 83554c0a3aSHans de Goede *(pDM_Odm->pNumRxBytesUnicast); 84554c0a3aSHans de Goede ODM_RT_TRACE( 85554c0a3aSHans de Goede pDM_Odm, 86554c0a3aSHans de Goede ODM_COMP_DIG, 87554c0a3aSHans de Goede ODM_DBG_LOUD, 88554c0a3aSHans de Goede ( 89554c0a3aSHans de Goede "NHM_cnt_0 =%d, NHMCurTxOkcnt = %llu, NHMCurRxOkcnt = %llu\n", 90554c0a3aSHans de Goede pDM_Odm->NHM_cnt_0, 91554c0a3aSHans de Goede pDM_Odm->NHMCurTxOkcnt, 92554c0a3aSHans de Goede pDM_Odm->NHMCurRxOkcnt 93554c0a3aSHans de Goede ) 94554c0a3aSHans de Goede ); 95554c0a3aSHans de Goede 96554c0a3aSHans de Goede 97554c0a3aSHans de Goede if ((pDM_Odm->NHMCurTxOkcnt) + 1 > (u64)(pDM_Odm->NHMCurRxOkcnt<<2) + 1) { /* Tx > 4*Rx possible for adaptivity test */ 98554c0a3aSHans de Goede if (pDM_Odm->NHM_cnt_0 >= 190 || pDM_Odm->adaptivity_flag == true) { 99554c0a3aSHans de Goede /* Enable EDCCA since it is possible running Adaptivity testing */ 100554c0a3aSHans de Goede /* test_status = 1; */ 101554c0a3aSHans de Goede pDM_Odm->adaptivity_flag = true; 102554c0a3aSHans de Goede pDM_Odm->tolerance_cnt = 0; 103554c0a3aSHans de Goede } else { 104554c0a3aSHans de Goede if (pDM_Odm->tolerance_cnt < 3) 105554c0a3aSHans de Goede pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1; 106554c0a3aSHans de Goede else 107554c0a3aSHans de Goede pDM_Odm->tolerance_cnt = 4; 108554c0a3aSHans de Goede /* test_status = 5; */ 109554c0a3aSHans de Goede if (pDM_Odm->tolerance_cnt > 3) { 110554c0a3aSHans de Goede /* test_status = 3; */ 111554c0a3aSHans de Goede pDM_Odm->adaptivity_flag = false; 112554c0a3aSHans de Goede } 113554c0a3aSHans de Goede } 114554c0a3aSHans de Goede } else { /* TX<RX */ 115554c0a3aSHans de Goede if (pDM_Odm->adaptivity_flag == true && pDM_Odm->NHM_cnt_0 <= 200) { 116554c0a3aSHans de Goede /* test_status = 2; */ 117554c0a3aSHans de Goede pDM_Odm->tolerance_cnt = 0; 118554c0a3aSHans de Goede } else { 119554c0a3aSHans de Goede if (pDM_Odm->tolerance_cnt < 3) 120554c0a3aSHans de Goede pDM_Odm->tolerance_cnt = pDM_Odm->tolerance_cnt + 1; 121554c0a3aSHans de Goede else 122554c0a3aSHans de Goede pDM_Odm->tolerance_cnt = 4; 123554c0a3aSHans de Goede /* test_status = 5; */ 124554c0a3aSHans de Goede if (pDM_Odm->tolerance_cnt > 3) { 125554c0a3aSHans de Goede /* test_status = 4; */ 126554c0a3aSHans de Goede pDM_Odm->adaptivity_flag = false; 127554c0a3aSHans de Goede } 128554c0a3aSHans de Goede } 129554c0a3aSHans de Goede } 130554c0a3aSHans de Goede 131554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("adaptivity_flag = %d\n ", pDM_Odm->adaptivity_flag)); 132554c0a3aSHans de Goede } 133554c0a3aSHans de Goede 134554c0a3aSHans de Goede void odm_SearchPwdBLowerBound(void *pDM_VOID, u8 IGI_target) 135554c0a3aSHans de Goede { 136554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 137554c0a3aSHans de Goede u32 value32 = 0; 138554c0a3aSHans de Goede u8 cnt, IGI; 139554c0a3aSHans de Goede bool bAdjust = true; 140554c0a3aSHans de Goede s8 TH_L2H_dmc, TH_H2L_dmc; 141554c0a3aSHans de Goede s8 Diff; 142554c0a3aSHans de Goede 143554c0a3aSHans de Goede IGI = 0x50; /* find H2L, L2H lower bound */ 144554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, IGI); 145554c0a3aSHans de Goede 146554c0a3aSHans de Goede 147554c0a3aSHans de Goede Diff = IGI_target-(s8)IGI; 148554c0a3aSHans de Goede TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff; 149554c0a3aSHans de Goede if (TH_L2H_dmc > 10) 150554c0a3aSHans de Goede TH_L2H_dmc = 10; 151554c0a3aSHans de Goede TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; 152554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc); 153554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc); 154554c0a3aSHans de Goede 155554c0a3aSHans de Goede mdelay(5); 156554c0a3aSHans de Goede 157554c0a3aSHans de Goede while (bAdjust) { 158554c0a3aSHans de Goede for (cnt = 0; cnt < 20; cnt++) { 159554c0a3aSHans de Goede value32 = PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG_RPT_11N, bMaskDWord); 160554c0a3aSHans de Goede 161554c0a3aSHans de Goede if (value32 & BIT30) 162554c0a3aSHans de Goede pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1; 163554c0a3aSHans de Goede else if (value32 & BIT29) 164554c0a3aSHans de Goede pDM_Odm->txEdcca1 = pDM_Odm->txEdcca1 + 1; 165554c0a3aSHans de Goede else 166554c0a3aSHans de Goede pDM_Odm->txEdcca0 = pDM_Odm->txEdcca0 + 1; 167554c0a3aSHans de Goede } 168554c0a3aSHans de Goede /* DbgPrint("txEdcca1 = %d, txEdcca0 = %d\n", pDM_Odm->txEdcca1, pDM_Odm->txEdcca0); */ 169554c0a3aSHans de Goede 170554c0a3aSHans de Goede if (pDM_Odm->txEdcca1 > 5) { 171554c0a3aSHans de Goede IGI = IGI-1; 172554c0a3aSHans de Goede TH_L2H_dmc = TH_L2H_dmc + 1; 173554c0a3aSHans de Goede if (TH_L2H_dmc > 10) 174554c0a3aSHans de Goede TH_L2H_dmc = 10; 175554c0a3aSHans de Goede TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; 176554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc); 177554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc); 178554c0a3aSHans de Goede 179554c0a3aSHans de Goede pDM_Odm->TxHangFlg = true; 180554c0a3aSHans de Goede pDM_Odm->txEdcca1 = 0; 181554c0a3aSHans de Goede pDM_Odm->txEdcca0 = 0; 182554c0a3aSHans de Goede 183554c0a3aSHans de Goede if (TH_L2H_dmc == 10) { 184554c0a3aSHans de Goede bAdjust = false; 185554c0a3aSHans de Goede pDM_Odm->TxHangFlg = false; 186554c0a3aSHans de Goede pDM_Odm->txEdcca1 = 0; 187554c0a3aSHans de Goede pDM_Odm->txEdcca0 = 0; 188554c0a3aSHans de Goede pDM_Odm->H2L_lb = TH_H2L_dmc; 189554c0a3aSHans de Goede pDM_Odm->L2H_lb = TH_L2H_dmc; 190554c0a3aSHans de Goede pDM_Odm->Adaptivity_IGI_upper = IGI; 191554c0a3aSHans de Goede } 192554c0a3aSHans de Goede } else { 193554c0a3aSHans de Goede bAdjust = false; 194554c0a3aSHans de Goede pDM_Odm->TxHangFlg = false; 195554c0a3aSHans de Goede pDM_Odm->txEdcca1 = 0; 196554c0a3aSHans de Goede pDM_Odm->txEdcca0 = 0; 197554c0a3aSHans de Goede pDM_Odm->H2L_lb = TH_H2L_dmc; 198554c0a3aSHans de Goede pDM_Odm->L2H_lb = TH_L2H_dmc; 199554c0a3aSHans de Goede pDM_Odm->Adaptivity_IGI_upper = IGI; 200554c0a3aSHans de Goede } 201554c0a3aSHans de Goede } 202554c0a3aSHans de Goede 203554c0a3aSHans de Goede 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)); 204554c0a3aSHans de Goede } 205554c0a3aSHans de Goede 206554c0a3aSHans de Goede void odm_AdaptivityInit(void *pDM_VOID) 207554c0a3aSHans de Goede { 208554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 209554c0a3aSHans de Goede 210554c0a3aSHans de Goede if (pDM_Odm->Carrier_Sense_enable == false) 211554c0a3aSHans de Goede pDM_Odm->TH_L2H_ini = 0xf7; /* -7 */ 212554c0a3aSHans de Goede else 213554c0a3aSHans de Goede pDM_Odm->TH_L2H_ini = 0xa; 214554c0a3aSHans de Goede 215554c0a3aSHans de Goede pDM_Odm->AdapEn_RSSI = 20; 216554c0a3aSHans de Goede pDM_Odm->TH_EDCCA_HL_diff = 7; 217554c0a3aSHans de Goede 218554c0a3aSHans de Goede pDM_Odm->IGI_Base = 0x32; 219554c0a3aSHans de Goede pDM_Odm->IGI_target = 0x1c; 220554c0a3aSHans de Goede pDM_Odm->ForceEDCCA = 0; 221554c0a3aSHans de Goede pDM_Odm->NHM_disable = false; 222554c0a3aSHans de Goede pDM_Odm->TxHangFlg = true; 223554c0a3aSHans de Goede pDM_Odm->txEdcca0 = 0; 224554c0a3aSHans de Goede pDM_Odm->txEdcca1 = 0; 225554c0a3aSHans de Goede pDM_Odm->H2L_lb = 0; 226554c0a3aSHans de Goede pDM_Odm->L2H_lb = 0; 227554c0a3aSHans de Goede pDM_Odm->Adaptivity_IGI_upper = 0; 228554c0a3aSHans de Goede odm_NHMBBInit(pDM_Odm); 229554c0a3aSHans de Goede 230554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, REG_RD_CTRL, BIT11, 1); /* stop counting if EDCCA is asserted */ 231554c0a3aSHans de Goede } 232554c0a3aSHans de Goede 233554c0a3aSHans de Goede 234554c0a3aSHans de Goede void odm_Adaptivity(void *pDM_VOID, u8 IGI) 235554c0a3aSHans de Goede { 236554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 237554c0a3aSHans de Goede s8 TH_L2H_dmc, TH_H2L_dmc; 238554c0a3aSHans de Goede s8 Diff, IGI_target; 239554c0a3aSHans de Goede bool EDCCA_State = false; 240554c0a3aSHans de Goede 241554c0a3aSHans de Goede if (!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)) { 242554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Go to odm_DynamicEDCCA()\n")); 243554c0a3aSHans de Goede return; 244554c0a3aSHans de Goede } 245554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_Adaptivity() =====>\n")); 246554c0a3aSHans de Goede 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", 247554c0a3aSHans de Goede pDM_Odm->ForceEDCCA, pDM_Odm->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, pDM_Odm->AdapEn_RSSI)); 248554c0a3aSHans de Goede 249554c0a3aSHans de Goede if (*pDM_Odm->pBandWidth == ODM_BW20M) /* CHANNEL_WIDTH_20 */ 250554c0a3aSHans de Goede IGI_target = pDM_Odm->IGI_Base; 251554c0a3aSHans de Goede else if (*pDM_Odm->pBandWidth == ODM_BW40M) 252554c0a3aSHans de Goede IGI_target = pDM_Odm->IGI_Base + 2; 253554c0a3aSHans de Goede else if (*pDM_Odm->pBandWidth == ODM_BW80M) 254554c0a3aSHans de Goede IGI_target = pDM_Odm->IGI_Base + 2; 255554c0a3aSHans de Goede else 256554c0a3aSHans de Goede IGI_target = pDM_Odm->IGI_Base; 257554c0a3aSHans de Goede pDM_Odm->IGI_target = (u8) IGI_target; 258554c0a3aSHans de Goede 259554c0a3aSHans de Goede /* Search pwdB lower bound */ 260554c0a3aSHans de Goede if (pDM_Odm->TxHangFlg == true) { 261554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208); 262554c0a3aSHans de Goede odm_SearchPwdBLowerBound(pDM_Odm, pDM_Odm->IGI_target); 263554c0a3aSHans de Goede } 264554c0a3aSHans de Goede 265554c0a3aSHans de Goede if ((!pDM_Odm->bLinked) || (*pDM_Odm->pChannel > 149)) { /* Band4 doesn't need adaptivity */ 266554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, 0x7f); 267554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, 0x7f); 268554c0a3aSHans de Goede return; 269554c0a3aSHans de Goede } 270554c0a3aSHans de Goede 271554c0a3aSHans de Goede if (!pDM_Odm->ForceEDCCA) { 272554c0a3aSHans de Goede if (pDM_Odm->RSSI_Min > pDM_Odm->AdapEn_RSSI) 2737bb0dffdSsimran singhal EDCCA_State = true; 274554c0a3aSHans de Goede else if (pDM_Odm->RSSI_Min < (pDM_Odm->AdapEn_RSSI - 5)) 2757bb0dffdSsimran singhal EDCCA_State = false; 276554c0a3aSHans de Goede } else 2777bb0dffdSsimran singhal EDCCA_State = true; 278554c0a3aSHans de Goede 279554c0a3aSHans de Goede if ( 280554c0a3aSHans de Goede pDM_Odm->bLinked && 281554c0a3aSHans de Goede pDM_Odm->Carrier_Sense_enable == false && 282554c0a3aSHans de Goede pDM_Odm->NHM_disable == false && 283554c0a3aSHans de Goede pDM_Odm->TxHangFlg == false 284554c0a3aSHans de Goede ) 285554c0a3aSHans de Goede odm_NHMBB(pDM_Odm); 286554c0a3aSHans de Goede 287554c0a3aSHans de Goede ODM_RT_TRACE( 288554c0a3aSHans de Goede pDM_Odm, 289554c0a3aSHans de Goede ODM_COMP_DIG, 290554c0a3aSHans de Goede ODM_DBG_LOUD, 291554c0a3aSHans de Goede ( 292554c0a3aSHans de Goede "BandWidth =%s, IGI_target = 0x%x, EDCCA_State =%d\n", 293554c0a3aSHans de Goede (*pDM_Odm->pBandWidth == ODM_BW80M) ? "80M" : 294554c0a3aSHans de Goede ((*pDM_Odm->pBandWidth == ODM_BW40M) ? "40M" : "20M"), 295554c0a3aSHans de Goede IGI_target, 296554c0a3aSHans de Goede EDCCA_State 297554c0a3aSHans de Goede ) 298554c0a3aSHans de Goede ); 299554c0a3aSHans de Goede 3007bb0dffdSsimran singhal if (EDCCA_State) { 301554c0a3aSHans de Goede Diff = IGI_target-(s8)IGI; 302554c0a3aSHans de Goede TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff; 303554c0a3aSHans de Goede if (TH_L2H_dmc > 10) 304554c0a3aSHans de Goede TH_L2H_dmc = 10; 305554c0a3aSHans de Goede 306554c0a3aSHans de Goede TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff; 307554c0a3aSHans de Goede 308554c0a3aSHans de Goede /* replace lower bound to prevent EDCCA always equal */ 309554c0a3aSHans de Goede if (TH_H2L_dmc < pDM_Odm->H2L_lb) 310554c0a3aSHans de Goede TH_H2L_dmc = pDM_Odm->H2L_lb; 311554c0a3aSHans de Goede if (TH_L2H_dmc < pDM_Odm->L2H_lb) 312554c0a3aSHans de Goede TH_L2H_dmc = pDM_Odm->L2H_lb; 313554c0a3aSHans de Goede } else { 314554c0a3aSHans de Goede TH_L2H_dmc = 0x7f; 315554c0a3aSHans de Goede TH_H2L_dmc = 0x7f; 316554c0a3aSHans de Goede } 317554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("IGI = 0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", 318554c0a3aSHans de Goede IGI, TH_L2H_dmc, TH_H2L_dmc)); 319554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc); 320554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc); 321554c0a3aSHans de Goede } 322554c0a3aSHans de Goede 323554c0a3aSHans de Goede void ODM_Write_DIG(void *pDM_VOID, u8 CurrentIGI) 324554c0a3aSHans de Goede { 325554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 326554c0a3aSHans de Goede pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; 327554c0a3aSHans de Goede 328554c0a3aSHans de Goede if (pDM_DigTable->bStopDIG) { 329554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("Stop Writing IGI\n")); 330554c0a3aSHans de Goede return; 331554c0a3aSHans de Goede } 332554c0a3aSHans de Goede 333554c0a3aSHans de Goede 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", 334554c0a3aSHans de Goede ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm))); 335554c0a3aSHans de Goede 336554c0a3aSHans de Goede if (pDM_DigTable->CurIGValue != CurrentIGI) { 337554c0a3aSHans de Goede /* 1 Check initial gain by upper bound */ 338554c0a3aSHans de Goede if (!pDM_DigTable->bPSDInProgress) { 339554c0a3aSHans de Goede if (CurrentIGI > pDM_DigTable->rx_gain_range_max) { 340554c0a3aSHans de Goede 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)); 341554c0a3aSHans de Goede CurrentIGI = pDM_DigTable->rx_gain_range_max; 342554c0a3aSHans de Goede } 343554c0a3aSHans de Goede 344554c0a3aSHans de Goede } 345554c0a3aSHans de Goede 346554c0a3aSHans de Goede /* 1 Set IGI value */ 347554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); 348554c0a3aSHans de Goede 349554c0a3aSHans de Goede if (pDM_Odm->RFType > ODM_1T1R) 350554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG(IGI_B, pDM_Odm), ODM_BIT(IGI, pDM_Odm), CurrentIGI); 351554c0a3aSHans de Goede 352554c0a3aSHans de Goede pDM_DigTable->CurIGValue = CurrentIGI; 353554c0a3aSHans de Goede } 354554c0a3aSHans de Goede 355554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_TRACE, ("CurrentIGI(0x%02x).\n", CurrentIGI)); 356554c0a3aSHans de Goede 357554c0a3aSHans de Goede } 358554c0a3aSHans de Goede 359554c0a3aSHans de Goede void odm_PauseDIG( 360554c0a3aSHans de Goede void *pDM_VOID, 361554c0a3aSHans de Goede ODM_Pause_DIG_TYPE PauseType, 362554c0a3aSHans de Goede u8 IGIValue 363554c0a3aSHans de Goede ) 364554c0a3aSHans de Goede { 365554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 366554c0a3aSHans de Goede pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; 367318dda31SJustin Vreeland static bool bPaused; 368554c0a3aSHans de Goede 369554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG() =========>\n")); 370554c0a3aSHans de Goede 371554c0a3aSHans de Goede if ( 372554c0a3aSHans de Goede (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) && 373554c0a3aSHans de Goede pDM_Odm->TxHangFlg == true 374554c0a3aSHans de Goede ) { 375554c0a3aSHans de Goede ODM_RT_TRACE( 376554c0a3aSHans de Goede pDM_Odm, 377554c0a3aSHans de Goede ODM_COMP_DIG, 378554c0a3aSHans de Goede ODM_DBG_LOUD, 379554c0a3aSHans de Goede ("odm_PauseDIG(): Dynamic adjust threshold in progress !!\n") 380554c0a3aSHans de Goede ); 381554c0a3aSHans de Goede return; 382554c0a3aSHans de Goede } 383554c0a3aSHans de Goede 384554c0a3aSHans de Goede if ( 385554c0a3aSHans de Goede !bPaused && (!(pDM_Odm->SupportAbility & ODM_BB_DIG) || 386554c0a3aSHans de Goede !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)) 387554c0a3aSHans de Goede ){ 388554c0a3aSHans de Goede ODM_RT_TRACE( 389554c0a3aSHans de Goede pDM_Odm, 390554c0a3aSHans de Goede ODM_COMP_DIG, 391554c0a3aSHans de Goede ODM_DBG_LOUD, 392554c0a3aSHans de Goede ("odm_PauseDIG(): Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n") 393554c0a3aSHans de Goede ); 394554c0a3aSHans de Goede return; 395554c0a3aSHans de Goede } 396554c0a3aSHans de Goede 397554c0a3aSHans de Goede switch (PauseType) { 398554c0a3aSHans de Goede /* 1 Pause DIG */ 399554c0a3aSHans de Goede case ODM_PAUSE_DIG: 400554c0a3aSHans de Goede /* 2 Disable DIG */ 401554c0a3aSHans de Goede ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility & (~ODM_BB_DIG)); 402554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Pause DIG !!\n")); 403554c0a3aSHans de Goede 404554c0a3aSHans de Goede /* 2 Backup IGI value */ 405554c0a3aSHans de Goede if (!bPaused) { 406554c0a3aSHans de Goede pDM_DigTable->IGIBackup = pDM_DigTable->CurIGValue; 407554c0a3aSHans de Goede bPaused = true; 408554c0a3aSHans de Goede } 409554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Backup IGI = 0x%x\n", pDM_DigTable->IGIBackup)); 410554c0a3aSHans de Goede 411554c0a3aSHans de Goede /* 2 Write new IGI value */ 412554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, IGIValue); 413554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write new IGI = 0x%x\n", IGIValue)); 414554c0a3aSHans de Goede break; 415554c0a3aSHans de Goede 416554c0a3aSHans de Goede /* 1 Resume DIG */ 417554c0a3aSHans de Goede case ODM_RESUME_DIG: 418554c0a3aSHans de Goede if (bPaused) { 419554c0a3aSHans de Goede /* 2 Write backup IGI value */ 420554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, pDM_DigTable->IGIBackup); 421554c0a3aSHans de Goede bPaused = false; 422554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Write original IGI = 0x%x\n", pDM_DigTable->IGIBackup)); 423554c0a3aSHans de Goede 424554c0a3aSHans de Goede /* 2 Enable DIG */ 425554c0a3aSHans de Goede ODM_CmnInfoUpdate(pDM_Odm, ODM_CMNINFO_ABILITY, pDM_Odm->SupportAbility | ODM_BB_DIG); 426554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Resume DIG !!\n")); 427554c0a3aSHans de Goede } 428554c0a3aSHans de Goede break; 429554c0a3aSHans de Goede 430554c0a3aSHans de Goede default: 431554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_PauseDIG(): Wrong type !!\n")); 432554c0a3aSHans de Goede break; 433554c0a3aSHans de Goede } 434554c0a3aSHans de Goede } 435554c0a3aSHans de Goede 436554c0a3aSHans de Goede bool odm_DigAbort(void *pDM_VOID) 437554c0a3aSHans de Goede { 438554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 439554c0a3aSHans de Goede 440554c0a3aSHans de Goede /* SupportAbility */ 441554c0a3aSHans de Goede if (!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)) { 442554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_FA_CNT is disabled\n")); 443554c0a3aSHans de Goede return true; 444554c0a3aSHans de Goede } 445554c0a3aSHans de Goede 446554c0a3aSHans de Goede /* SupportAbility */ 447554c0a3aSHans de Goede if (!(pDM_Odm->SupportAbility & ODM_BB_DIG)) { 448554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: SupportAbility ODM_BB_DIG is disabled\n")); 449554c0a3aSHans de Goede return true; 450554c0a3aSHans de Goede } 451554c0a3aSHans de Goede 452554c0a3aSHans de Goede /* ScanInProcess */ 453554c0a3aSHans de Goede if (*(pDM_Odm->pbScanInProcess)) { 454554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: In Scan Progress\n")); 455554c0a3aSHans de Goede return true; 456554c0a3aSHans de Goede } 457554c0a3aSHans de Goede 458554c0a3aSHans de Goede /* add by Neil Chen to avoid PSD is processing */ 459554c0a3aSHans de Goede if (pDM_Odm->bDMInitialGainEnable == false) { 460554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Return: PSD is Processing\n")); 461554c0a3aSHans de Goede return true; 462554c0a3aSHans de Goede } 463554c0a3aSHans de Goede 464554c0a3aSHans de Goede return false; 465554c0a3aSHans de Goede } 466554c0a3aSHans de Goede 467554c0a3aSHans de Goede void odm_DIGInit(void *pDM_VOID) 468554c0a3aSHans de Goede { 469554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 470554c0a3aSHans de Goede pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; 471554c0a3aSHans de Goede 472554c0a3aSHans de Goede pDM_DigTable->bStopDIG = false; 473554c0a3aSHans de Goede pDM_DigTable->bPSDInProgress = false; 474554c0a3aSHans de Goede pDM_DigTable->CurIGValue = (u8) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(IGI_A, pDM_Odm), ODM_BIT(IGI, pDM_Odm)); 475554c0a3aSHans de Goede pDM_DigTable->RssiLowThresh = DM_DIG_THRESH_LOW; 476554c0a3aSHans de Goede pDM_DigTable->RssiHighThresh = DM_DIG_THRESH_HIGH; 477554c0a3aSHans de Goede pDM_DigTable->FALowThresh = DMfalseALARM_THRESH_LOW; 478554c0a3aSHans de Goede pDM_DigTable->FAHighThresh = DMfalseALARM_THRESH_HIGH; 479554c0a3aSHans de Goede pDM_DigTable->BackoffVal = DM_DIG_BACKOFF_DEFAULT; 480554c0a3aSHans de Goede pDM_DigTable->BackoffVal_range_max = DM_DIG_BACKOFF_MAX; 481554c0a3aSHans de Goede pDM_DigTable->BackoffVal_range_min = DM_DIG_BACKOFF_MIN; 482554c0a3aSHans de Goede pDM_DigTable->PreCCK_CCAThres = 0xFF; 483554c0a3aSHans de Goede pDM_DigTable->CurCCK_CCAThres = 0x83; 484554c0a3aSHans de Goede pDM_DigTable->ForbiddenIGI = DM_DIG_MIN_NIC; 485554c0a3aSHans de Goede pDM_DigTable->LargeFAHit = 0; 486554c0a3aSHans de Goede pDM_DigTable->Recover_cnt = 0; 487554c0a3aSHans de Goede pDM_DigTable->bMediaConnect_0 = false; 488554c0a3aSHans de Goede pDM_DigTable->bMediaConnect_1 = false; 489554c0a3aSHans de Goede 490554c0a3aSHans de Goede /* To Initialize pDM_Odm->bDMInitialGainEnable == false to avoid DIG error */ 491554c0a3aSHans de Goede pDM_Odm->bDMInitialGainEnable = true; 492554c0a3aSHans de Goede 493554c0a3aSHans de Goede pDM_DigTable->DIG_Dynamic_MIN_0 = DM_DIG_MIN_NIC; 494554c0a3aSHans de Goede pDM_DigTable->DIG_Dynamic_MIN_1 = DM_DIG_MIN_NIC; 495554c0a3aSHans de Goede 496554c0a3aSHans de Goede /* To Initi BT30 IGI */ 497554c0a3aSHans de Goede pDM_DigTable->BT30_CurIGI = 0x32; 498554c0a3aSHans de Goede 499554c0a3aSHans de Goede if (pDM_Odm->BoardType & (ODM_BOARD_EXT_PA|ODM_BOARD_EXT_LNA)) { 500554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; 501554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC; 502554c0a3aSHans de Goede } else { 503554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; 504554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC; 505554c0a3aSHans de Goede } 506554c0a3aSHans de Goede 507554c0a3aSHans de Goede } 508554c0a3aSHans de Goede 509554c0a3aSHans de Goede 510554c0a3aSHans de Goede void odm_DIG(void *pDM_VOID) 511554c0a3aSHans de Goede { 512554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 513554c0a3aSHans de Goede 514554c0a3aSHans de Goede /* Common parameters */ 515554c0a3aSHans de Goede pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; 516554c0a3aSHans de Goede Pfalse_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; 517554c0a3aSHans de Goede bool FirstConnect, FirstDisConnect; 518554c0a3aSHans de Goede u8 DIG_MaxOfMin, DIG_Dynamic_MIN; 519554c0a3aSHans de Goede u8 dm_dig_max, dm_dig_min; 520554c0a3aSHans de Goede u8 CurrentIGI = pDM_DigTable->CurIGValue; 521554c0a3aSHans de Goede u8 offset; 522554c0a3aSHans de Goede u32 dm_FA_thres[3]; 523554c0a3aSHans de Goede u8 Adap_IGI_Upper = 0; 524554c0a3aSHans de Goede u32 TxTp = 0, RxTp = 0; 525554c0a3aSHans de Goede bool bDFSBand = false; 526554c0a3aSHans de Goede bool bPerformance = true, bFirstTpTarget = false, bFirstCoverage = false; 527554c0a3aSHans de Goede 528554c0a3aSHans de Goede if (odm_DigAbort(pDM_Odm) == true) 529554c0a3aSHans de Goede return; 530554c0a3aSHans de Goede 531554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() ===========================>\n\n")); 532554c0a3aSHans de Goede 533554c0a3aSHans de Goede if (pDM_Odm->adaptivity_flag == true) 534554c0a3aSHans de Goede Adap_IGI_Upper = pDM_Odm->Adaptivity_IGI_upper; 535554c0a3aSHans de Goede 536554c0a3aSHans de Goede 537554c0a3aSHans de Goede /* 1 Update status */ 538554c0a3aSHans de Goede DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0; 539554c0a3aSHans de Goede FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == false); 540554c0a3aSHans de Goede FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == true); 541554c0a3aSHans de Goede 542554c0a3aSHans de Goede /* 1 Boundary Decision */ 543554c0a3aSHans de Goede /* 2 For WIN\CE */ 544554c0a3aSHans de Goede dm_dig_max = 0x5A; 545554c0a3aSHans de Goede dm_dig_min = DM_DIG_MIN_NIC; 546554c0a3aSHans de Goede DIG_MaxOfMin = DM_DIG_MAX_AP; 547554c0a3aSHans de Goede 548d67051abSMasanari Iida 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)); 549554c0a3aSHans de Goede 550554c0a3aSHans de Goede /* 1 Adjust boundary by RSSI */ 551554c0a3aSHans de Goede if (pDM_Odm->bLinked && bPerformance) { 552554c0a3aSHans de Goede /* 2 Modify DIG upper bound */ 553554c0a3aSHans de Goede /* 4 Modify DIG upper bound for 92E, 8723A\B, 8821 & 8812 BT */ 554554c0a3aSHans de Goede if (pDM_Odm->bBtLimitedDig == 1) { 555554c0a3aSHans de Goede offset = 10; 556554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Coex. case: Force upper bound to RSSI + %d !!!!!!\n", offset)); 557554c0a3aSHans de Goede } else 558554c0a3aSHans de Goede offset = 15; 559554c0a3aSHans de Goede 560554c0a3aSHans de Goede if ((pDM_Odm->RSSI_Min + offset) > dm_dig_max) 561554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_max = dm_dig_max; 562554c0a3aSHans de Goede else if ((pDM_Odm->RSSI_Min + offset) < dm_dig_min) 563554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_max = dm_dig_min; 564554c0a3aSHans de Goede else 565554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + offset; 566554c0a3aSHans de Goede 567554c0a3aSHans de Goede /* 2 Modify DIG lower bound */ 568554c0a3aSHans de Goede /* if (pDM_Odm->bOneEntryOnly) */ 569554c0a3aSHans de Goede { 570554c0a3aSHans de Goede if (pDM_Odm->RSSI_Min < dm_dig_min) 571554c0a3aSHans de Goede DIG_Dynamic_MIN = dm_dig_min; 572554c0a3aSHans de Goede else if (pDM_Odm->RSSI_Min > DIG_MaxOfMin) 573554c0a3aSHans de Goede DIG_Dynamic_MIN = DIG_MaxOfMin; 574554c0a3aSHans de Goede else 575554c0a3aSHans de Goede DIG_Dynamic_MIN = pDM_Odm->RSSI_Min; 576554c0a3aSHans de Goede } 577554c0a3aSHans de Goede } else { 578554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_max = dm_dig_max; 579554c0a3aSHans de Goede DIG_Dynamic_MIN = dm_dig_min; 580554c0a3aSHans de Goede } 581554c0a3aSHans de Goede 582554c0a3aSHans de Goede /* 1 Force Lower Bound for AntDiv */ 583554c0a3aSHans de Goede if (pDM_Odm->bLinked && !pDM_Odm->bOneEntryOnly) { 584554c0a3aSHans de Goede if (pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) { 585554c0a3aSHans de Goede if ( 586554c0a3aSHans de Goede pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV || 587554c0a3aSHans de Goede pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV || 588554c0a3aSHans de Goede pDM_Odm->AntDivType == S0S1_SW_ANTDIV 589554c0a3aSHans de Goede ) { 590554c0a3aSHans de Goede if (pDM_DigTable->AntDiv_RSSI_max > DIG_MaxOfMin) 591554c0a3aSHans de Goede DIG_Dynamic_MIN = DIG_MaxOfMin; 592554c0a3aSHans de Goede else 593554c0a3aSHans de Goede DIG_Dynamic_MIN = (u8) pDM_DigTable->AntDiv_RSSI_max; 594554c0a3aSHans de Goede ODM_RT_TRACE( 595554c0a3aSHans de Goede pDM_Odm, 596554c0a3aSHans de Goede ODM_COMP_ANT_DIV, 597554c0a3aSHans de Goede ODM_DBG_LOUD, 598554c0a3aSHans de Goede ( 599554c0a3aSHans de Goede "odm_DIG(): Antenna diversity case: Force lower bound to 0x%x !!!!!!\n", 600554c0a3aSHans de Goede DIG_Dynamic_MIN 601554c0a3aSHans de Goede ) 602554c0a3aSHans de Goede ); 603554c0a3aSHans de Goede ODM_RT_TRACE( 604554c0a3aSHans de Goede pDM_Odm, 605554c0a3aSHans de Goede ODM_COMP_ANT_DIV, 606554c0a3aSHans de Goede ODM_DBG_LOUD, 607554c0a3aSHans de Goede ( 608554c0a3aSHans de Goede "odm_DIG(): Antenna diversity case: RSSI_max = 0x%x !!!!!!\n", 609554c0a3aSHans de Goede pDM_DigTable->AntDiv_RSSI_max 610554c0a3aSHans de Goede ) 611554c0a3aSHans de Goede ); 612554c0a3aSHans de Goede } 613554c0a3aSHans de Goede } 614554c0a3aSHans de Goede } 615554c0a3aSHans de Goede ODM_RT_TRACE( 616554c0a3aSHans de Goede pDM_Odm, 617554c0a3aSHans de Goede ODM_COMP_DIG, 618554c0a3aSHans de Goede ODM_DBG_LOUD, 619554c0a3aSHans de Goede ( 620554c0a3aSHans de Goede "odm_DIG(): Adjust boundary by RSSI Upper bound = 0x%x, Lower bound = 0x%x\n", 621554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_max, 622554c0a3aSHans de Goede DIG_Dynamic_MIN 623554c0a3aSHans de Goede ) 624554c0a3aSHans de Goede ); 625554c0a3aSHans de Goede ODM_RT_TRACE( 626554c0a3aSHans de Goede pDM_Odm, 627554c0a3aSHans de Goede ODM_COMP_DIG, 628554c0a3aSHans de Goede ODM_DBG_LOUD, 629554c0a3aSHans de Goede ( 630554c0a3aSHans de Goede "odm_DIG(): Link status: bLinked = %d, RSSI = %d, bFirstConnect = %d, bFirsrDisConnect = %d\n\n", 631554c0a3aSHans de Goede pDM_Odm->bLinked, 632554c0a3aSHans de Goede pDM_Odm->RSSI_Min, 633554c0a3aSHans de Goede FirstConnect, 634554c0a3aSHans de Goede FirstDisConnect 635554c0a3aSHans de Goede ) 636554c0a3aSHans de Goede ); 637554c0a3aSHans de Goede 638554c0a3aSHans de Goede /* 1 Modify DIG lower bound, deal with abnormal case */ 639554c0a3aSHans de Goede /* 2 Abnormal false alarm case */ 640554c0a3aSHans de Goede if (FirstDisConnect) { 641554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; 642554c0a3aSHans de Goede pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; 643554c0a3aSHans de Goede } else 644554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min = 645554c0a3aSHans de Goede odm_ForbiddenIGICheck(pDM_Odm, DIG_Dynamic_MIN, CurrentIGI); 646554c0a3aSHans de Goede 647554c0a3aSHans de Goede if (pDM_Odm->bLinked && !FirstConnect) { 648554c0a3aSHans de Goede if ( 649554c0a3aSHans de Goede (pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && 650554c0a3aSHans de Goede pDM_Odm->bsta_state 651554c0a3aSHans de Goede ) { 652554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min = dm_dig_min; 653554c0a3aSHans de Goede ODM_RT_TRACE( 654554c0a3aSHans de Goede pDM_Odm, 655554c0a3aSHans de Goede ODM_COMP_DIG, 656554c0a3aSHans de Goede ODM_DBG_LOUD, 657554c0a3aSHans de Goede ( 658554c0a3aSHans de Goede "odm_DIG(): Abnrormal #beacon (%d) case in STA mode: Force lower bound to 0x%x !!!!!!\n\n", 659554c0a3aSHans de Goede pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, 660554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min 661554c0a3aSHans de Goede ) 662554c0a3aSHans de Goede ); 663554c0a3aSHans de Goede } 664554c0a3aSHans de Goede } 665554c0a3aSHans de Goede 666554c0a3aSHans de Goede /* 2 Abnormal lower bound case */ 667554c0a3aSHans de Goede if (pDM_DigTable->rx_gain_range_min > pDM_DigTable->rx_gain_range_max) { 668554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max; 669554c0a3aSHans de Goede ODM_RT_TRACE( 670554c0a3aSHans de Goede pDM_Odm, 671554c0a3aSHans de Goede ODM_COMP_DIG, 672554c0a3aSHans de Goede ODM_DBG_LOUD, 673554c0a3aSHans de Goede ( 674554c0a3aSHans de Goede "odm_DIG(): Abnrormal lower bound case: Force lower bound to 0x%x !!!!!!\n\n", 675554c0a3aSHans de Goede pDM_DigTable->rx_gain_range_min 676554c0a3aSHans de Goede ) 677554c0a3aSHans de Goede ); 678554c0a3aSHans de Goede } 679554c0a3aSHans de Goede 680554c0a3aSHans de Goede 681554c0a3aSHans de Goede /* 1 False alarm threshold decision */ 682554c0a3aSHans de Goede odm_FAThresholdCheck(pDM_Odm, bDFSBand, bPerformance, RxTp, TxTp, dm_FA_thres); 683554c0a3aSHans de Goede 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])); 684554c0a3aSHans de Goede 685554c0a3aSHans de Goede /* 1 Adjust initial gain by false alarm */ 686554c0a3aSHans de Goede if (pDM_Odm->bLinked && bPerformance) { 687554c0a3aSHans de Goede /* 2 After link */ 688554c0a3aSHans de Goede ODM_RT_TRACE( 689554c0a3aSHans de Goede pDM_Odm, 690554c0a3aSHans de Goede ODM_COMP_DIG, 691554c0a3aSHans de Goede ODM_DBG_LOUD, 692554c0a3aSHans de Goede ("odm_DIG(): Adjust IGI after link\n") 693554c0a3aSHans de Goede ); 694554c0a3aSHans de Goede 695554c0a3aSHans de Goede if (bFirstTpTarget || (FirstConnect && bPerformance)) { 696554c0a3aSHans de Goede pDM_DigTable->LargeFAHit = 0; 697554c0a3aSHans de Goede 698554c0a3aSHans de Goede if (pDM_Odm->RSSI_Min < DIG_MaxOfMin) { 699554c0a3aSHans de Goede if (CurrentIGI < pDM_Odm->RSSI_Min) 700554c0a3aSHans de Goede CurrentIGI = pDM_Odm->RSSI_Min; 701554c0a3aSHans de Goede } else { 702554c0a3aSHans de Goede if (CurrentIGI < DIG_MaxOfMin) 703554c0a3aSHans de Goede CurrentIGI = DIG_MaxOfMin; 704554c0a3aSHans de Goede } 705554c0a3aSHans de Goede 706554c0a3aSHans de Goede ODM_RT_TRACE( 707554c0a3aSHans de Goede pDM_Odm, 708554c0a3aSHans de Goede ODM_COMP_DIG, 709554c0a3aSHans de Goede ODM_DBG_LOUD, 710554c0a3aSHans de Goede ( 711554c0a3aSHans de Goede "odm_DIG(): First connect case: IGI does on-shot to 0x%x\n", 712554c0a3aSHans de Goede CurrentIGI 713554c0a3aSHans de Goede ) 714554c0a3aSHans de Goede ); 715554c0a3aSHans de Goede 716554c0a3aSHans de Goede } else { 717554c0a3aSHans de Goede if (pFalseAlmCnt->Cnt_all > dm_FA_thres[2]) 718554c0a3aSHans de Goede CurrentIGI = CurrentIGI + 4; 719554c0a3aSHans de Goede else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1]) 720554c0a3aSHans de Goede CurrentIGI = CurrentIGI + 2; 721554c0a3aSHans de Goede else if (pFalseAlmCnt->Cnt_all < dm_FA_thres[0]) 722554c0a3aSHans de Goede CurrentIGI = CurrentIGI - 2; 723554c0a3aSHans de Goede 724554c0a3aSHans de Goede if ( 725554c0a3aSHans de Goede (pDM_Odm->PhyDbgInfo.NumQryBeaconPkt < 5) && 726554c0a3aSHans de Goede (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH1) && 727554c0a3aSHans de Goede (pDM_Odm->bsta_state) 728554c0a3aSHans de Goede ) { 729554c0a3aSHans de Goede CurrentIGI = pDM_DigTable->rx_gain_range_min; 730554c0a3aSHans de Goede ODM_RT_TRACE( 731554c0a3aSHans de Goede pDM_Odm, 732554c0a3aSHans de Goede ODM_COMP_DIG, 733554c0a3aSHans de Goede ODM_DBG_LOUD, 734554c0a3aSHans de Goede ( 735554c0a3aSHans de Goede "odm_DIG(): Abnormal #beacon (%d) case: IGI does one-shot to 0x%x\n", 736554c0a3aSHans de Goede pDM_Odm->PhyDbgInfo.NumQryBeaconPkt, 737554c0a3aSHans de Goede CurrentIGI 738554c0a3aSHans de Goede ) 739554c0a3aSHans de Goede ); 740554c0a3aSHans de Goede } 741554c0a3aSHans de Goede } 742554c0a3aSHans de Goede } else { 743554c0a3aSHans de Goede /* 2 Before link */ 744554c0a3aSHans de Goede ODM_RT_TRACE( 745554c0a3aSHans de Goede pDM_Odm, 746554c0a3aSHans de Goede ODM_COMP_DIG, 747554c0a3aSHans de Goede ODM_DBG_LOUD, 748554c0a3aSHans de Goede ("odm_DIG(): Adjust IGI before link\n") 749554c0a3aSHans de Goede ); 750554c0a3aSHans de Goede 751554c0a3aSHans de Goede if (FirstDisConnect || bFirstCoverage) { 752554c0a3aSHans de Goede CurrentIGI = dm_dig_min; 753554c0a3aSHans de Goede ODM_RT_TRACE( 754554c0a3aSHans de Goede pDM_Odm, 755554c0a3aSHans de Goede ODM_COMP_DIG, 756554c0a3aSHans de Goede ODM_DBG_LOUD, 757554c0a3aSHans de Goede ("odm_DIG(): First disconnect case: IGI does on-shot to lower bound\n") 758554c0a3aSHans de Goede ); 759554c0a3aSHans de Goede } else { 760554c0a3aSHans de Goede if (pFalseAlmCnt->Cnt_all > dm_FA_thres[2]) 761554c0a3aSHans de Goede CurrentIGI = CurrentIGI + 4; 762554c0a3aSHans de Goede else if (pFalseAlmCnt->Cnt_all > dm_FA_thres[1]) 763554c0a3aSHans de Goede CurrentIGI = CurrentIGI + 2; 764554c0a3aSHans de Goede else if (pFalseAlmCnt->Cnt_all < dm_FA_thres[0]) 765554c0a3aSHans de Goede CurrentIGI = CurrentIGI - 2; 766554c0a3aSHans de Goede } 767554c0a3aSHans de Goede } 768554c0a3aSHans de Goede 769554c0a3aSHans de Goede /* 1 Check initial gain by upper/lower bound */ 770554c0a3aSHans de Goede if (CurrentIGI < pDM_DigTable->rx_gain_range_min) 771554c0a3aSHans de Goede CurrentIGI = pDM_DigTable->rx_gain_range_min; 772554c0a3aSHans de Goede 773554c0a3aSHans de Goede if (CurrentIGI > pDM_DigTable->rx_gain_range_max) 774554c0a3aSHans de Goede CurrentIGI = pDM_DigTable->rx_gain_range_max; 775554c0a3aSHans de Goede 776554c0a3aSHans de Goede ODM_RT_TRACE( 777554c0a3aSHans de Goede pDM_Odm, 778554c0a3aSHans de Goede ODM_COMP_DIG, 779554c0a3aSHans de Goede ODM_DBG_LOUD, 780554c0a3aSHans de Goede ( 781554c0a3aSHans de Goede "odm_DIG(): CurIGValue = 0x%x, TotalFA = %d\n\n", 782554c0a3aSHans de Goede CurrentIGI, 783554c0a3aSHans de Goede pFalseAlmCnt->Cnt_all 784554c0a3aSHans de Goede ) 785554c0a3aSHans de Goede ); 786554c0a3aSHans de Goede 787554c0a3aSHans de Goede /* 1 Force upper bound and lower bound for adaptivity */ 788554c0a3aSHans de Goede if ( 789554c0a3aSHans de Goede pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY && 790554c0a3aSHans de Goede pDM_Odm->adaptivity_flag == true 791554c0a3aSHans de Goede ) { 792554c0a3aSHans de Goede if (CurrentIGI > Adap_IGI_Upper) 793554c0a3aSHans de Goede CurrentIGI = Adap_IGI_Upper; 794554c0a3aSHans de Goede 795554c0a3aSHans de Goede if (pDM_Odm->IGI_LowerBound != 0) { 796554c0a3aSHans de Goede if (CurrentIGI < pDM_Odm->IGI_LowerBound) 797554c0a3aSHans de Goede CurrentIGI = pDM_Odm->IGI_LowerBound; 798554c0a3aSHans de Goede } 799554c0a3aSHans de Goede 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)); 800554c0a3aSHans de Goede 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)); 801554c0a3aSHans de Goede } 802554c0a3aSHans de Goede 803554c0a3aSHans de Goede 804554c0a3aSHans de Goede /* 1 Update status */ 805554c0a3aSHans de Goede if (pDM_Odm->bBtHsOperation) { 806554c0a3aSHans de Goede if (pDM_Odm->bLinked) { 807554c0a3aSHans de Goede if (pDM_DigTable->BT30_CurIGI > (CurrentIGI)) 808554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, CurrentIGI); 809554c0a3aSHans de Goede else 810554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI); 811554c0a3aSHans de Goede 812554c0a3aSHans de Goede pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; 813554c0a3aSHans de Goede pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; 814554c0a3aSHans de Goede } else { 815554c0a3aSHans de Goede if (pDM_Odm->bLinkInProcess) 816554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, 0x1c); 817554c0a3aSHans de Goede else if (pDM_Odm->bBtConnectProcess) 818554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, 0x28); 819554c0a3aSHans de Goede else 820554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);/* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */ 821554c0a3aSHans de Goede } 822554c0a3aSHans de Goede } else { /* BT is not using */ 823554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, CurrentIGI);/* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */ 824554c0a3aSHans de Goede pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; 825554c0a3aSHans de Goede pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; 826554c0a3aSHans de Goede } 827554c0a3aSHans de Goede } 828554c0a3aSHans de Goede 829554c0a3aSHans de Goede void odm_DIGbyRSSI_LPS(void *pDM_VOID) 830554c0a3aSHans de Goede { 831554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 832554c0a3aSHans de Goede Pfalse_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; 833554c0a3aSHans de Goede 834554c0a3aSHans de Goede u8 RSSI_Lower = DM_DIG_MIN_NIC; /* 0x1E or 0x1C */ 835554c0a3aSHans de Goede u8 CurrentIGI = pDM_Odm->RSSI_Min; 836554c0a3aSHans de Goede 837554c0a3aSHans de Goede CurrentIGI = CurrentIGI+RSSI_OFFSET_DIG; 838554c0a3aSHans de Goede 839554c0a3aSHans de Goede ODM_RT_TRACE( 840554c0a3aSHans de Goede pDM_Odm, 841554c0a3aSHans de Goede ODM_COMP_DIG, 842554c0a3aSHans de Goede ODM_DBG_LOUD, 843554c0a3aSHans de Goede ("odm_DIGbyRSSI_LPS() ==>\n") 844554c0a3aSHans de Goede ); 845554c0a3aSHans de Goede 846554c0a3aSHans de Goede /* Using FW PS mode to make IGI */ 847554c0a3aSHans de Goede /* Adjust by FA in LPS MODE */ 848554c0a3aSHans de Goede if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH2_LPS) 849554c0a3aSHans de Goede CurrentIGI = CurrentIGI+4; 850554c0a3aSHans de Goede else if (pFalseAlmCnt->Cnt_all > DM_DIG_FA_TH1_LPS) 851554c0a3aSHans de Goede CurrentIGI = CurrentIGI+2; 852554c0a3aSHans de Goede else if (pFalseAlmCnt->Cnt_all < DM_DIG_FA_TH0_LPS) 853554c0a3aSHans de Goede CurrentIGI = CurrentIGI-2; 854554c0a3aSHans de Goede 855554c0a3aSHans de Goede 856554c0a3aSHans de Goede /* Lower bound checking */ 857554c0a3aSHans de Goede 858554c0a3aSHans de Goede /* RSSI Lower bound check */ 859554c0a3aSHans de Goede if ((pDM_Odm->RSSI_Min-10) > DM_DIG_MIN_NIC) 860554c0a3aSHans de Goede RSSI_Lower = pDM_Odm->RSSI_Min-10; 861554c0a3aSHans de Goede else 862554c0a3aSHans de Goede RSSI_Lower = DM_DIG_MIN_NIC; 863554c0a3aSHans de Goede 864554c0a3aSHans de Goede /* Upper and Lower Bound checking */ 865554c0a3aSHans de Goede if (CurrentIGI > DM_DIG_MAX_NIC) 866554c0a3aSHans de Goede CurrentIGI = DM_DIG_MAX_NIC; 867554c0a3aSHans de Goede else if (CurrentIGI < RSSI_Lower) 868554c0a3aSHans de Goede CurrentIGI = RSSI_Lower; 869554c0a3aSHans de Goede 870554c0a3aSHans de Goede 871554c0a3aSHans de Goede ODM_RT_TRACE( 872554c0a3aSHans de Goede pDM_Odm, 873554c0a3aSHans de Goede ODM_COMP_DIG, 874554c0a3aSHans de Goede ODM_DBG_LOUD, 875554c0a3aSHans de Goede ("odm_DIGbyRSSI_LPS(): pFalseAlmCnt->Cnt_all = %d\n", pFalseAlmCnt->Cnt_all) 876554c0a3aSHans de Goede ); 877554c0a3aSHans de Goede ODM_RT_TRACE( 878554c0a3aSHans de Goede pDM_Odm, 879554c0a3aSHans de Goede ODM_COMP_DIG, 880554c0a3aSHans de Goede ODM_DBG_LOUD, 881554c0a3aSHans de Goede ("odm_DIGbyRSSI_LPS(): pDM_Odm->RSSI_Min = %d\n", pDM_Odm->RSSI_Min) 882554c0a3aSHans de Goede ); 883554c0a3aSHans de Goede ODM_RT_TRACE( 884554c0a3aSHans de Goede pDM_Odm, 885554c0a3aSHans de Goede ODM_COMP_DIG, 886554c0a3aSHans de Goede ODM_DBG_LOUD, 887554c0a3aSHans de Goede ("odm_DIGbyRSSI_LPS(): CurrentIGI = 0x%x\n", CurrentIGI) 888554c0a3aSHans de Goede ); 889554c0a3aSHans de Goede 890554c0a3aSHans de Goede ODM_Write_DIG(pDM_Odm, CurrentIGI); 891554c0a3aSHans de Goede /* ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); */ 892554c0a3aSHans de Goede } 893554c0a3aSHans de Goede 894554c0a3aSHans de Goede /* 3 ============================================================ */ 895554c0a3aSHans de Goede /* 3 FASLE ALARM CHECK */ 896554c0a3aSHans de Goede /* 3 ============================================================ */ 897554c0a3aSHans de Goede 898554c0a3aSHans de Goede void odm_FalseAlarmCounterStatistics(void *pDM_VOID) 899554c0a3aSHans de Goede { 900554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 901554c0a3aSHans de Goede Pfalse_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt); 902554c0a3aSHans de Goede u32 ret_value; 903554c0a3aSHans de Goede 904554c0a3aSHans de Goede if (!(pDM_Odm->SupportAbility & ODM_BB_FA_CNT)) 905554c0a3aSHans de Goede return; 906554c0a3aSHans de Goede 907554c0a3aSHans de Goede /* hold ofdm counter */ 908554c0a3aSHans de Goede /* hold page C counter */ 909554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_OFDM_FA_HOLDC_11N, BIT31, 1); 910554c0a3aSHans de Goede /* hold page D counter */ 911554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_OFDM_FA_RSTD_11N, BIT31, 1); 912554c0a3aSHans de Goede 913554c0a3aSHans de Goede ret_value = PHY_QueryBBReg( 914554c0a3aSHans de Goede pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE1_11N, bMaskDWord 915554c0a3aSHans de Goede ); 916554c0a3aSHans de Goede FalseAlmCnt->Cnt_Fast_Fsync = (ret_value&0xffff); 917554c0a3aSHans de Goede FalseAlmCnt->Cnt_SB_Search_fail = ((ret_value&0xffff0000)>>16); 918554c0a3aSHans de Goede 919554c0a3aSHans de Goede ret_value = PHY_QueryBBReg( 920554c0a3aSHans de Goede pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE2_11N, bMaskDWord 921554c0a3aSHans de Goede ); 922554c0a3aSHans de Goede FalseAlmCnt->Cnt_OFDM_CCA = (ret_value&0xffff); 923554c0a3aSHans de Goede FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16); 924554c0a3aSHans de Goede 925554c0a3aSHans de Goede ret_value = PHY_QueryBBReg( 926554c0a3aSHans de Goede pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE3_11N, bMaskDWord 927554c0a3aSHans de Goede ); 928554c0a3aSHans de Goede FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff); 929554c0a3aSHans de Goede FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16); 930554c0a3aSHans de Goede 931554c0a3aSHans de Goede ret_value = PHY_QueryBBReg( 932554c0a3aSHans de Goede pDM_Odm->Adapter, ODM_REG_OFDM_FA_TYPE4_11N, bMaskDWord 933554c0a3aSHans de Goede ); 934554c0a3aSHans de Goede FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff); 935554c0a3aSHans de Goede 936554c0a3aSHans de Goede FalseAlmCnt->Cnt_Ofdm_fail = 937554c0a3aSHans de Goede FalseAlmCnt->Cnt_Parity_Fail + 938554c0a3aSHans de Goede FalseAlmCnt->Cnt_Rate_Illegal + 939554c0a3aSHans de Goede FalseAlmCnt->Cnt_Crc8_fail + 940554c0a3aSHans de Goede FalseAlmCnt->Cnt_Mcs_fail + 941554c0a3aSHans de Goede FalseAlmCnt->Cnt_Fast_Fsync + 942554c0a3aSHans de Goede FalseAlmCnt->Cnt_SB_Search_fail; 943554c0a3aSHans de Goede 944554c0a3aSHans de Goede { 945554c0a3aSHans de Goede /* hold cck counter */ 946554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_CCK_FA_RST_11N, BIT12, 1); 947554c0a3aSHans de Goede PHY_SetBBReg(pDM_Odm->Adapter, ODM_REG_CCK_FA_RST_11N, BIT14, 1); 948554c0a3aSHans de Goede 949554c0a3aSHans de Goede ret_value = PHY_QueryBBReg( 950554c0a3aSHans de Goede pDM_Odm->Adapter, ODM_REG_CCK_FA_LSB_11N, bMaskByte0 951554c0a3aSHans de Goede ); 952554c0a3aSHans de Goede FalseAlmCnt->Cnt_Cck_fail = ret_value; 953554c0a3aSHans de Goede 954554c0a3aSHans de Goede ret_value = PHY_QueryBBReg( 955554c0a3aSHans de Goede pDM_Odm->Adapter, ODM_REG_CCK_FA_MSB_11N, bMaskByte3 956554c0a3aSHans de Goede ); 957554c0a3aSHans de Goede FalseAlmCnt->Cnt_Cck_fail += (ret_value&0xff)<<8; 958554c0a3aSHans de Goede 959554c0a3aSHans de Goede ret_value = PHY_QueryBBReg( 960554c0a3aSHans de Goede pDM_Odm->Adapter, ODM_REG_CCK_CCA_CNT_11N, bMaskDWord 961554c0a3aSHans de Goede ); 962554c0a3aSHans de Goede FalseAlmCnt->Cnt_CCK_CCA = 963554c0a3aSHans de Goede ((ret_value&0xFF)<<8) | ((ret_value&0xFF00)>>8); 964554c0a3aSHans de Goede } 965554c0a3aSHans de Goede 966554c0a3aSHans de Goede FalseAlmCnt->Cnt_all = ( 967554c0a3aSHans de Goede FalseAlmCnt->Cnt_Fast_Fsync + 968554c0a3aSHans de Goede FalseAlmCnt->Cnt_SB_Search_fail + 969554c0a3aSHans de Goede FalseAlmCnt->Cnt_Parity_Fail + 970554c0a3aSHans de Goede FalseAlmCnt->Cnt_Rate_Illegal + 971554c0a3aSHans de Goede FalseAlmCnt->Cnt_Crc8_fail + 972554c0a3aSHans de Goede FalseAlmCnt->Cnt_Mcs_fail + 973554c0a3aSHans de Goede FalseAlmCnt->Cnt_Cck_fail 974554c0a3aSHans de Goede ); 975554c0a3aSHans de Goede 976554c0a3aSHans de Goede FalseAlmCnt->Cnt_CCA_all = 977554c0a3aSHans de Goede FalseAlmCnt->Cnt_OFDM_CCA + FalseAlmCnt->Cnt_CCK_CCA; 978554c0a3aSHans de Goede 979554c0a3aSHans de Goede ODM_RT_TRACE( 980554c0a3aSHans de Goede pDM_Odm, 981554c0a3aSHans de Goede ODM_COMP_FA_CNT, 982554c0a3aSHans de Goede ODM_DBG_LOUD, 983554c0a3aSHans de Goede ("Enter odm_FalseAlarmCounterStatistics\n") 984554c0a3aSHans de Goede ); 985554c0a3aSHans de Goede ODM_RT_TRACE( 986554c0a3aSHans de Goede pDM_Odm, 987554c0a3aSHans de Goede ODM_COMP_FA_CNT, 988554c0a3aSHans de Goede ODM_DBG_LOUD, 989554c0a3aSHans de Goede ( 990554c0a3aSHans de Goede "Cnt_Fast_Fsync =%d, Cnt_SB_Search_fail =%d\n", 991554c0a3aSHans de Goede FalseAlmCnt->Cnt_Fast_Fsync, 992554c0a3aSHans de Goede FalseAlmCnt->Cnt_SB_Search_fail 993554c0a3aSHans de Goede ) 994554c0a3aSHans de Goede ); 995554c0a3aSHans de Goede ODM_RT_TRACE( 996554c0a3aSHans de Goede pDM_Odm, 997554c0a3aSHans de Goede ODM_COMP_FA_CNT, 998554c0a3aSHans de Goede ODM_DBG_LOUD, 999554c0a3aSHans de Goede ( 1000554c0a3aSHans de Goede "Cnt_Parity_Fail =%d, Cnt_Rate_Illegal =%d\n", 1001554c0a3aSHans de Goede FalseAlmCnt->Cnt_Parity_Fail, 1002554c0a3aSHans de Goede FalseAlmCnt->Cnt_Rate_Illegal 1003554c0a3aSHans de Goede ) 1004554c0a3aSHans de Goede ); 1005554c0a3aSHans de Goede ODM_RT_TRACE( 1006554c0a3aSHans de Goede pDM_Odm, 1007554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1008554c0a3aSHans de Goede ODM_DBG_LOUD, 1009554c0a3aSHans de Goede ( 1010554c0a3aSHans de Goede "Cnt_Crc8_fail =%d, Cnt_Mcs_fail =%d\n", 1011554c0a3aSHans de Goede FalseAlmCnt->Cnt_Crc8_fail, 1012554c0a3aSHans de Goede FalseAlmCnt->Cnt_Mcs_fail 1013554c0a3aSHans de Goede ) 1014554c0a3aSHans de Goede ); 1015554c0a3aSHans de Goede 1016554c0a3aSHans de Goede ODM_RT_TRACE( 1017554c0a3aSHans de Goede pDM_Odm, 1018554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1019554c0a3aSHans de Goede ODM_DBG_LOUD, 1020554c0a3aSHans de Goede ("Cnt_OFDM_CCA =%d\n", FalseAlmCnt->Cnt_OFDM_CCA) 1021554c0a3aSHans de Goede ); 1022554c0a3aSHans de Goede ODM_RT_TRACE( 1023554c0a3aSHans de Goede pDM_Odm, 1024554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1025554c0a3aSHans de Goede ODM_DBG_LOUD, 1026554c0a3aSHans de Goede ("Cnt_CCK_CCA =%d\n", FalseAlmCnt->Cnt_CCK_CCA) 1027554c0a3aSHans de Goede ); 1028554c0a3aSHans de Goede ODM_RT_TRACE( 1029554c0a3aSHans de Goede pDM_Odm, 1030554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1031554c0a3aSHans de Goede ODM_DBG_LOUD, 1032554c0a3aSHans de Goede ("Cnt_CCA_all =%d\n", FalseAlmCnt->Cnt_CCA_all) 1033554c0a3aSHans de Goede ); 1034554c0a3aSHans de Goede ODM_RT_TRACE( 1035554c0a3aSHans de Goede pDM_Odm, 1036554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1037554c0a3aSHans de Goede ODM_DBG_LOUD, 1038554c0a3aSHans de Goede ("Cnt_Ofdm_fail =%d\n", FalseAlmCnt->Cnt_Ofdm_fail) 1039554c0a3aSHans de Goede ); 1040554c0a3aSHans de Goede ODM_RT_TRACE( 1041554c0a3aSHans de Goede pDM_Odm, 1042554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1043554c0a3aSHans de Goede ODM_DBG_LOUD, 1044554c0a3aSHans de Goede ("Cnt_Cck_fail =%d\n", FalseAlmCnt->Cnt_Cck_fail) 1045554c0a3aSHans de Goede ); 1046554c0a3aSHans de Goede ODM_RT_TRACE( 1047554c0a3aSHans de Goede pDM_Odm, 1048554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1049554c0a3aSHans de Goede ODM_DBG_LOUD, 1050554c0a3aSHans de Goede ("Cnt_Ofdm_fail =%d\n", FalseAlmCnt->Cnt_Ofdm_fail) 1051554c0a3aSHans de Goede ); 1052554c0a3aSHans de Goede ODM_RT_TRACE( 1053554c0a3aSHans de Goede pDM_Odm, 1054554c0a3aSHans de Goede ODM_COMP_FA_CNT, 1055554c0a3aSHans de Goede ODM_DBG_LOUD, 1056554c0a3aSHans de Goede ("Total False Alarm =%d\n", FalseAlmCnt->Cnt_all) 1057554c0a3aSHans de Goede ); 1058554c0a3aSHans de Goede } 1059554c0a3aSHans de Goede 1060554c0a3aSHans de Goede 1061554c0a3aSHans de Goede void odm_FAThresholdCheck( 1062554c0a3aSHans de Goede void *pDM_VOID, 1063554c0a3aSHans de Goede bool bDFSBand, 1064554c0a3aSHans de Goede bool bPerformance, 1065554c0a3aSHans de Goede u32 RxTp, 1066554c0a3aSHans de Goede u32 TxTp, 1067554c0a3aSHans de Goede u32 *dm_FA_thres 1068554c0a3aSHans de Goede ) 1069554c0a3aSHans de Goede { 1070554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 1071554c0a3aSHans de Goede 1072554c0a3aSHans de Goede if (pDM_Odm->bLinked && (bPerformance || bDFSBand)) { 1073554c0a3aSHans de Goede /* For NIC */ 1074554c0a3aSHans de Goede dm_FA_thres[0] = DM_DIG_FA_TH0; 1075554c0a3aSHans de Goede dm_FA_thres[1] = DM_DIG_FA_TH1; 1076554c0a3aSHans de Goede dm_FA_thres[2] = DM_DIG_FA_TH2; 1077554c0a3aSHans de Goede } else { 1078554c0a3aSHans de Goede dm_FA_thres[0] = 2000; 1079554c0a3aSHans de Goede dm_FA_thres[1] = 4000; 1080554c0a3aSHans de Goede dm_FA_thres[2] = 5000; 1081554c0a3aSHans de Goede } 1082554c0a3aSHans de Goede return; 1083554c0a3aSHans de Goede } 1084554c0a3aSHans de Goede 1085554c0a3aSHans de Goede u8 odm_ForbiddenIGICheck(void *pDM_VOID, u8 DIG_Dynamic_MIN, u8 CurrentIGI) 1086554c0a3aSHans de Goede { 1087554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 1088554c0a3aSHans de Goede pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; 1089554c0a3aSHans de Goede Pfalse_ALARM_STATISTICS pFalseAlmCnt = &(pDM_Odm->FalseAlmCnt); 1090554c0a3aSHans de Goede u8 rx_gain_range_min = pDM_DigTable->rx_gain_range_min; 1091554c0a3aSHans de Goede 1092554c0a3aSHans de Goede if (pFalseAlmCnt->Cnt_all > 10000) { 1093554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Abnormally false alarm case.\n")); 1094554c0a3aSHans de Goede 1095554c0a3aSHans de Goede if (pDM_DigTable->LargeFAHit != 3) 1096554c0a3aSHans de Goede pDM_DigTable->LargeFAHit++; 1097554c0a3aSHans de Goede 1098554c0a3aSHans de Goede /* if (pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue) */ 1099554c0a3aSHans de Goede if (pDM_DigTable->ForbiddenIGI < CurrentIGI) { 1100554c0a3aSHans de Goede pDM_DigTable->ForbiddenIGI = CurrentIGI; 1101554c0a3aSHans de Goede /* pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue; */ 1102554c0a3aSHans de Goede pDM_DigTable->LargeFAHit = 1; 1103554c0a3aSHans de Goede } 1104554c0a3aSHans de Goede 1105554c0a3aSHans de Goede if (pDM_DigTable->LargeFAHit >= 3) { 1106554c0a3aSHans de Goede if ((pDM_DigTable->ForbiddenIGI + 2) > pDM_DigTable->rx_gain_range_max) 1107554c0a3aSHans de Goede rx_gain_range_min = pDM_DigTable->rx_gain_range_max; 1108554c0a3aSHans de Goede else 1109554c0a3aSHans de Goede rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2); 1110554c0a3aSHans de Goede pDM_DigTable->Recover_cnt = 1800; 1111554c0a3aSHans de Goede 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)); 1112554c0a3aSHans de Goede } 1113554c0a3aSHans de Goede } else { 1114554c0a3aSHans de Goede if (pDM_DigTable->Recover_cnt != 0) { 1115554c0a3aSHans de Goede pDM_DigTable->Recover_cnt--; 1116554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Recover_cnt = %d\n", pDM_DigTable->Recover_cnt)); 1117554c0a3aSHans de Goede } else { 1118554c0a3aSHans de Goede if (pDM_DigTable->LargeFAHit < 3) { 1119554c0a3aSHans de Goede if ((pDM_DigTable->ForbiddenIGI - 2) < DIG_Dynamic_MIN) { /* DM_DIG_MIN) */ 1120554c0a3aSHans de Goede pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; /* DM_DIG_MIN; */ 1121554c0a3aSHans de Goede rx_gain_range_min = DIG_Dynamic_MIN; /* DM_DIG_MIN; */ 1122554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n")); 1123554c0a3aSHans de Goede } else { 1124554c0a3aSHans de Goede pDM_DigTable->ForbiddenIGI -= 2; 1125554c0a3aSHans de Goede rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 2); 1126554c0a3aSHans de Goede ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n")); 1127554c0a3aSHans de Goede } 1128554c0a3aSHans de Goede } else 1129554c0a3aSHans de Goede pDM_DigTable->LargeFAHit = 0; 1130554c0a3aSHans de Goede } 1131554c0a3aSHans de Goede } 1132554c0a3aSHans de Goede 1133554c0a3aSHans de Goede return rx_gain_range_min; 1134554c0a3aSHans de Goede 1135554c0a3aSHans de Goede } 1136554c0a3aSHans de Goede 1137554c0a3aSHans de Goede /* 3 ============================================================ */ 1138554c0a3aSHans de Goede /* 3 CCK Packet Detect Threshold */ 1139554c0a3aSHans de Goede /* 3 ============================================================ */ 1140554c0a3aSHans de Goede 1141554c0a3aSHans de Goede void odm_CCKPacketDetectionThresh(void *pDM_VOID) 1142554c0a3aSHans de Goede { 1143554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 1144554c0a3aSHans de Goede Pfalse_ALARM_STATISTICS FalseAlmCnt = &(pDM_Odm->FalseAlmCnt); 1145554c0a3aSHans de Goede u8 CurCCK_CCAThres; 1146554c0a3aSHans de Goede 1147554c0a3aSHans de Goede 1148554c0a3aSHans de Goede if ( 1149554c0a3aSHans de Goede !(pDM_Odm->SupportAbility & ODM_BB_CCK_PD) || 1150554c0a3aSHans de Goede !(pDM_Odm->SupportAbility & ODM_BB_FA_CNT) 1151554c0a3aSHans de Goede ) { 1152554c0a3aSHans de Goede ODM_RT_TRACE( 1153554c0a3aSHans de Goede pDM_Odm, 1154554c0a3aSHans de Goede ODM_COMP_CCK_PD, 1155554c0a3aSHans de Goede ODM_DBG_LOUD, 1156554c0a3aSHans de Goede ("odm_CCKPacketDetectionThresh() return ==========\n") 1157554c0a3aSHans de Goede ); 1158554c0a3aSHans de Goede return; 1159554c0a3aSHans de Goede } 1160554c0a3aSHans de Goede 1161554c0a3aSHans de Goede if (pDM_Odm->ExtLNA) 1162554c0a3aSHans de Goede return; 1163554c0a3aSHans de Goede 1164554c0a3aSHans de Goede ODM_RT_TRACE( 1165554c0a3aSHans de Goede pDM_Odm, 1166554c0a3aSHans de Goede ODM_COMP_CCK_PD, 1167554c0a3aSHans de Goede ODM_DBG_LOUD, 1168554c0a3aSHans de Goede ("odm_CCKPacketDetectionThresh() ==========>\n") 1169554c0a3aSHans de Goede ); 1170554c0a3aSHans de Goede 1171554c0a3aSHans de Goede if (pDM_Odm->bLinked) { 1172554c0a3aSHans de Goede if (pDM_Odm->RSSI_Min > 25) 1173554c0a3aSHans de Goede CurCCK_CCAThres = 0xcd; 1174554c0a3aSHans de Goede else if ((pDM_Odm->RSSI_Min <= 25) && (pDM_Odm->RSSI_Min > 10)) 1175554c0a3aSHans de Goede CurCCK_CCAThres = 0x83; 1176554c0a3aSHans de Goede else { 1177554c0a3aSHans de Goede if (FalseAlmCnt->Cnt_Cck_fail > 1000) 1178554c0a3aSHans de Goede CurCCK_CCAThres = 0x83; 1179554c0a3aSHans de Goede else 1180554c0a3aSHans de Goede CurCCK_CCAThres = 0x40; 1181554c0a3aSHans de Goede } 1182554c0a3aSHans de Goede } else { 1183554c0a3aSHans de Goede if (FalseAlmCnt->Cnt_Cck_fail > 1000) 1184554c0a3aSHans de Goede CurCCK_CCAThres = 0x83; 1185554c0a3aSHans de Goede else 1186554c0a3aSHans de Goede CurCCK_CCAThres = 0x40; 1187554c0a3aSHans de Goede } 1188554c0a3aSHans de Goede 1189554c0a3aSHans de Goede ODM_Write_CCK_CCA_Thres(pDM_Odm, CurCCK_CCAThres); 1190554c0a3aSHans de Goede 1191554c0a3aSHans de Goede ODM_RT_TRACE( 1192554c0a3aSHans de Goede pDM_Odm, 1193554c0a3aSHans de Goede ODM_COMP_CCK_PD, 1194554c0a3aSHans de Goede ODM_DBG_LOUD, 1195554c0a3aSHans de Goede ( 1196554c0a3aSHans de Goede "odm_CCKPacketDetectionThresh() CurCCK_CCAThres = 0x%x\n", 1197554c0a3aSHans de Goede CurCCK_CCAThres 1198554c0a3aSHans de Goede ) 1199554c0a3aSHans de Goede ); 1200554c0a3aSHans de Goede } 1201554c0a3aSHans de Goede 1202554c0a3aSHans de Goede void ODM_Write_CCK_CCA_Thres(void *pDM_VOID, u8 CurCCK_CCAThres) 1203554c0a3aSHans de Goede { 1204554c0a3aSHans de Goede PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; 1205554c0a3aSHans de Goede pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; 1206554c0a3aSHans de Goede 1207554c0a3aSHans de Goede /* modify by Guo.Mingzhi 2012-01-03 */ 1208554c0a3aSHans de Goede if (pDM_DigTable->CurCCK_CCAThres != CurCCK_CCAThres) 1209554c0a3aSHans de Goede rtw_write8(pDM_Odm->Adapter, ODM_REG(CCK_CCA, pDM_Odm), CurCCK_CCAThres); 1210554c0a3aSHans de Goede 1211554c0a3aSHans de Goede pDM_DigTable->PreCCK_CCAThres = pDM_DigTable->CurCCK_CCAThres; 1212554c0a3aSHans de Goede pDM_DigTable->CurCCK_CCAThres = CurCCK_CCAThres; 1213554c0a3aSHans de Goede } 1214