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