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