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