xref: /linux/drivers/staging/rtl8723bs/hal/odm.c (revision 37bb2e7217b01404e2abf9d90d8e5705a5603b52)
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 
8 #include "odm_precomp.h"
9 
10 /*  Global var */
11 
12 u32 OFDMSwingTable_New[OFDM_TABLE_SIZE] = {
13 	0x0b40002d, /*  0,  -15.0dB */
14 	0x0c000030, /*  1,  -14.5dB */
15 	0x0cc00033, /*  2,  -14.0dB */
16 	0x0d800036, /*  3,  -13.5dB */
17 	0x0e400039, /*  4,  -13.0dB */
18 	0x0f00003c, /*  5,  -12.5dB */
19 	0x10000040, /*  6,  -12.0dB */
20 	0x11000044, /*  7,  -11.5dB */
21 	0x12000048, /*  8,  -11.0dB */
22 	0x1300004c, /*  9,  -10.5dB */
23 	0x14400051, /*  10, -10.0dB */
24 	0x15800056, /*  11, -9.5dB */
25 	0x16c0005b, /*  12, -9.0dB */
26 	0x18000060, /*  13, -8.5dB */
27 	0x19800066, /*  14, -8.0dB */
28 	0x1b00006c, /*  15, -7.5dB */
29 	0x1c800072, /*  16, -7.0dB */
30 	0x1e400079, /*  17, -6.5dB */
31 	0x20000080, /*  18, -6.0dB */
32 	0x22000088, /*  19, -5.5dB */
33 	0x24000090, /*  20, -5.0dB */
34 	0x26000098, /*  21, -4.5dB */
35 	0x288000a2, /*  22, -4.0dB */
36 	0x2ac000ab, /*  23, -3.5dB */
37 	0x2d4000b5, /*  24, -3.0dB */
38 	0x300000c0, /*  25, -2.5dB */
39 	0x32c000cb, /*  26, -2.0dB */
40 	0x35c000d7, /*  27, -1.5dB */
41 	0x390000e4, /*  28, -1.0dB */
42 	0x3c8000f2, /*  29, -0.5dB */
43 	0x40000100, /*  30, +0dB */
44 	0x43c0010f, /*  31, +0.5dB */
45 	0x47c0011f, /*  32, +1.0dB */
46 	0x4c000130, /*  33, +1.5dB */
47 	0x50800142, /*  34, +2.0dB */
48 	0x55400155, /*  35, +2.5dB */
49 	0x5a400169, /*  36, +3.0dB */
50 	0x5fc0017f, /*  37, +3.5dB */
51 	0x65400195, /*  38, +4.0dB */
52 	0x6b8001ae, /*  39, +4.5dB */
53 	0x71c001c7, /*  40, +5.0dB */
54 	0x788001e2, /*  41, +5.5dB */
55 	0x7f8001fe  /*  42, +6.0dB */
56 };
57 
58 u8 CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = {
59 	{0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, /*   0, -16.0dB */
60 	{0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /*   1, -15.5dB */
61 	{0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /*   2, -15.0dB */
62 	{0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /*   3, -14.5dB */
63 	{0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /*   4, -14.0dB */
64 	{0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /*   5, -13.5dB */
65 	{0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /*   6, -13.0dB */
66 	{0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /*   7, -12.5dB */
67 	{0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /*   8, -12.0dB */
68 	{0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /*   9, -11.5dB */
69 	{0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /*  10, -11.0dB */
70 	{0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /*  11, -10.5dB */
71 	{0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /*  12, -10.0dB */
72 	{0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /*  13, -9.5dB */
73 	{0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /*  14, -9.0dB */
74 	{0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /*  15, -8.5dB */
75 	{0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /*  16, -8.0dB */
76 	{0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /*  17, -7.5dB */
77 	{0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /*  18, -7.0dB */
78 	{0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /*  19, -6.5dB */
79 	{0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /*  20, -6.0dB */
80 	{0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /*  21, -5.5dB */
81 	{0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /*  22, -5.0dB */
82 	{0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /*  23, -4.5dB */
83 	{0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /*  24, -4.0dB */
84 	{0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /*  25, -3.5dB */
85 	{0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /*  26, -3.0dB */
86 	{0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /*  27, -2.5dB */
87 	{0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /*  28, -2.0dB */
88 	{0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /*  29, -1.5dB */
89 	{0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /*  30, -1.0dB */
90 	{0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /*  31, -0.5dB */
91 	{0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}	/*  32, +0dB */
92 };
93 
94 u8 CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8] = {
95 	{0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, /*   0, -16.0dB */
96 	{0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /*   1, -15.5dB */
97 	{0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /*   2, -15.0dB */
98 	{0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /*   3, -14.5dB */
99 	{0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /*   4, -14.0dB */
100 	{0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /*   5, -13.5dB */
101 	{0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /*   6, -13.0dB */
102 	{0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /*   7, -12.5dB */
103 	{0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /*   8, -12.0dB */
104 	{0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /*   9, -11.5dB */
105 	{0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /*  10, -11.0dB */
106 	{0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /*  11, -10.5dB */
107 	{0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /*  12, -10.0dB */
108 	{0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /*  13, -9.5dB */
109 	{0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /*  14, -9.0dB */
110 	{0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /*  15, -8.5dB */
111 	{0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /*  16, -8.0dB */
112 	{0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /*  17, -7.5dB */
113 	{0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /*  18, -7.0dB */
114 	{0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /*  19, -6.5dB */
115 	{0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /*  20, -6.0dB */
116 	{0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /*  21, -5.5dB */
117 	{0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /*  22, -5.0dB */
118 	{0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /*  23, -4.5dB */
119 	{0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /*  24, -4.0dB */
120 	{0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /*  25, -3.5dB */
121 	{0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /*  26, -3.0dB */
122 	{0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /*  27, -2.5dB */
123 	{0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /*  28, -2.0dB */
124 	{0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /*  29, -1.5dB */
125 	{0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /*  30, -1.0dB */
126 	{0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /*  31, -0.5dB */
127 	{0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}	/*  32, +0dB */
128 };
129 
130 /* Remove Edca by Yu Chen */
131 
odm_CommonInfoSelfInit(struct dm_odm_t * pDM_Odm)132 static void odm_CommonInfoSelfInit(struct dm_odm_t *pDM_Odm)
133 {
134 	pDM_Odm->bCckHighPower = (bool) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(CCK_RPT_FORMAT, pDM_Odm), ODM_BIT(CCK_RPT_FORMAT, pDM_Odm));
135 	pDM_Odm->RFPathRxEnable = (u8) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(BB_RX_PATH, pDM_Odm), ODM_BIT(BB_RX_PATH, pDM_Odm));
136 
137 	pDM_Odm->TxRate = 0xFF;
138 }
139 
odm_CommonInfoSelfUpdate(struct dm_odm_t * pDM_Odm)140 static void odm_CommonInfoSelfUpdate(struct dm_odm_t *pDM_Odm)
141 {
142 	u8 EntryCnt = 0;
143 	u8 i;
144 	PSTA_INFO_T	pEntry;
145 
146 	if (*(pDM_Odm->pBandWidth) == ODM_BW40M) {
147 		if (*(pDM_Odm->pSecChOffset) == 1)
148 			pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)-2;
149 		else if (*(pDM_Odm->pSecChOffset) == 2)
150 			pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)+2;
151 	} else
152 		pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);
153 
154 	for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
155 		pEntry = pDM_Odm->pODM_StaInfo[i];
156 		if (IS_STA_VALID(pEntry))
157 			EntryCnt++;
158 	}
159 
160 	if (EntryCnt == 1)
161 		pDM_Odm->bOneEntryOnly = true;
162 	else
163 		pDM_Odm->bOneEntryOnly = false;
164 }
165 
166 /* 3 ============================================================ */
167 /* 3 RATR MASK */
168 /* 3 ============================================================ */
169 /* 3 ============================================================ */
170 /* 3 Rate Adaptive */
171 /* 3 ============================================================ */
172 
odm_RateAdaptiveMaskInit(struct dm_odm_t * pDM_Odm)173 static void odm_RateAdaptiveMaskInit(struct dm_odm_t *pDM_Odm)
174 {
175 	struct odm_rate_adaptive *pOdmRA = &pDM_Odm->RateAdaptive;
176 
177 	pOdmRA->Type = DM_Type_ByDriver;
178 	if (pOdmRA->Type == DM_Type_ByDriver)
179 		pDM_Odm->bUseRAMask = true;
180 	else
181 		pDM_Odm->bUseRAMask = false;
182 
183 	pOdmRA->RATRState = DM_RATR_STA_INIT;
184 	pOdmRA->LdpcThres = 35;
185 	pOdmRA->bUseLdpc = false;
186 	pOdmRA->HighRSSIThresh = 50;
187 	pOdmRA->LowRSSIThresh = 20;
188 }
189 
ODM_Get_Rate_Bitmap(struct dm_odm_t * pDM_Odm,u32 macid,u32 ra_mask,u8 rssi_level)190 u32 ODM_Get_Rate_Bitmap(
191 	struct dm_odm_t *pDM_Odm,
192 	u32 macid,
193 	u32 ra_mask,
194 	u8 rssi_level
195 )
196 {
197 	PSTA_INFO_T	pEntry;
198 	u32 rate_bitmap = 0;
199 	u8 WirelessMode;
200 
201 	pEntry = pDM_Odm->pODM_StaInfo[macid];
202 	if (!IS_STA_VALID(pEntry))
203 		return ra_mask;
204 
205 	WirelessMode = pEntry->wireless_mode;
206 
207 	switch (WirelessMode) {
208 	case ODM_WM_B:
209 		if (ra_mask & 0x0000000c)		/* 11M or 5.5M enable */
210 			rate_bitmap = 0x0000000d;
211 		else
212 			rate_bitmap = 0x0000000f;
213 		break;
214 
215 	case (ODM_WM_G):
216 		if (rssi_level == DM_RATR_STA_HIGH)
217 			rate_bitmap = 0x00000f00;
218 		else
219 			rate_bitmap = 0x00000ff0;
220 		break;
221 
222 	case (ODM_WM_B|ODM_WM_G):
223 		if (rssi_level == DM_RATR_STA_HIGH)
224 			rate_bitmap = 0x00000f00;
225 		else if (rssi_level == DM_RATR_STA_MIDDLE)
226 			rate_bitmap = 0x00000ff0;
227 		else
228 			rate_bitmap = 0x00000ff5;
229 		break;
230 
231 	case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G):
232 	case (ODM_WM_B|ODM_WM_N24G):
233 	case (ODM_WM_G|ODM_WM_N24G):
234 		if (rssi_level == DM_RATR_STA_HIGH)
235 			rate_bitmap = 0x000f0000;
236 		else if (rssi_level == DM_RATR_STA_MIDDLE)
237 			rate_bitmap = 0x000ff000;
238 		else {
239 			if (*(pDM_Odm->pBandWidth) == ODM_BW40M)
240 				rate_bitmap = 0x000ff015;
241 			else
242 				rate_bitmap = 0x000ff005;
243 		}
244 		break;
245 
246 	default:
247 		rate_bitmap = 0x0fffffff;
248 		break;
249 	}
250 
251 	return ra_mask & rate_bitmap;
252 
253 }
254 
odm_RefreshRateAdaptiveMaskCE(struct dm_odm_t * pDM_Odm)255 static void odm_RefreshRateAdaptiveMaskCE(struct dm_odm_t *pDM_Odm)
256 {
257 	u8 i;
258 	struct adapter *padapter =  pDM_Odm->Adapter;
259 
260 	if (padapter->bDriverStopped)
261 		return;
262 
263 	if (!pDM_Odm->bUseRAMask)
264 		return;
265 
266 	for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
267 		PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
268 
269 		if (IS_STA_VALID(pstat)) {
270 			if (is_multicast_ether_addr(pstat->hwaddr))  /* if (psta->mac_id == 1) */
271 				continue;
272 
273 			if (true == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, false, &pstat->rssi_level)) {
274 				rtw_hal_update_ra_mask(pstat, pstat->rssi_level);
275 			}
276 
277 		}
278 	}
279 }
280 
281 /*-----------------------------------------------------------------------------
282 * Function:	odm_RefreshRateAdaptiveMask()
283 *
284 * Overview:	Update rate table mask according to rssi
285 *
286 * Input:		NONE
287 *
288 * Output:		NONE
289 *
290 * Return:		NONE
291 *
292 * Revised History:
293 *When		Who		Remark
294 *05/27/2009	hpfan	Create Version 0.
295 *
296 * --------------------------------------------------------------------------
297 */
odm_RefreshRateAdaptiveMask(struct dm_odm_t * pDM_Odm)298 static void odm_RefreshRateAdaptiveMask(struct dm_odm_t *pDM_Odm)
299 {
300 
301 	if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))
302 		return;
303 
304 	odm_RefreshRateAdaptiveMaskCE(pDM_Odm);
305 }
306 
307 /*  Return Value: bool */
308 /*  - true: RATRState is changed. */
ODM_RAStateCheck(struct dm_odm_t * pDM_Odm,s32 RSSI,bool bForceUpdate,u8 * pRATRState)309 bool ODM_RAStateCheck(
310 	struct dm_odm_t *pDM_Odm,
311 	s32 RSSI,
312 	bool bForceUpdate,
313 	u8 *pRATRState
314 )
315 {
316 	struct odm_rate_adaptive *pRA = &pDM_Odm->RateAdaptive;
317 	const u8 GoUpGap = 5;
318 	u8 HighRSSIThreshForRA = pRA->HighRSSIThresh;
319 	u8 LowRSSIThreshForRA = pRA->LowRSSIThresh;
320 	u8 RATRState;
321 
322 	/*  Threshold Adjustment: */
323 	/*  when RSSI state trends to go up one or two levels, make sure RSSI is high enough. */
324 	/*  Here GoUpGap is added to solve the boundary's level alternation issue. */
325 	switch (*pRATRState) {
326 	case DM_RATR_STA_INIT:
327 	case DM_RATR_STA_HIGH:
328 		break;
329 
330 	case DM_RATR_STA_MIDDLE:
331 		HighRSSIThreshForRA += GoUpGap;
332 		break;
333 
334 	case DM_RATR_STA_LOW:
335 		HighRSSIThreshForRA += GoUpGap;
336 		LowRSSIThreshForRA += GoUpGap;
337 		break;
338 
339 	default:
340 		netdev_dbg(pDM_Odm->Adapter->pnetdev,
341 			   "wrong rssi level setting %d !", *pRATRState);
342 		break;
343 	}
344 
345 	/*  Decide RATRState by RSSI. */
346 	if (RSSI > HighRSSIThreshForRA)
347 		RATRState = DM_RATR_STA_HIGH;
348 	else if (RSSI > LowRSSIThreshForRA)
349 		RATRState = DM_RATR_STA_MIDDLE;
350 	else
351 		RATRState = DM_RATR_STA_LOW;
352 
353 	if (*pRATRState != RATRState || bForceUpdate) {
354 		*pRATRState = RATRState;
355 		return true;
356 	}
357 
358 	return false;
359 }
360 
361 /*  */
362 
363 /* 3 ============================================================ */
364 /* 3 RSSI Monitor */
365 /* 3 ============================================================ */
366 
odm_RSSIMonitorInit(struct dm_odm_t * pDM_Odm)367 static void odm_RSSIMonitorInit(struct dm_odm_t *pDM_Odm)
368 {
369 	struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table;
370 
371 	pRA_Table->firstconnect = false;
372 
373 }
374 
FindMinimumRSSI(struct adapter * padapter)375 static void FindMinimumRSSI(struct adapter *padapter)
376 {
377 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
378 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
379 	struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
380 
381 	/* 1 1.Determine the minimum RSSI */
382 
383 	if (
384 		(pDM_Odm->bLinked != true) &&
385 		(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)
386 	) {
387 		pdmpriv->MinUndecoratedPWDBForDM = 0;
388 	} else
389 		pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
390 }
391 
odm_RSSIMonitorCheckCE(struct dm_odm_t * pDM_Odm)392 static void odm_RSSIMonitorCheckCE(struct dm_odm_t *pDM_Odm)
393 {
394 	struct adapter *Adapter = pDM_Odm->Adapter;
395 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
396 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
397 	int i;
398 	int tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;
399 	u8 sta_cnt = 0;
400 	u32 PWDB_rssi[NUM_STA] = {0};/* 0~15]:MACID, [16~31]:PWDB_rssi */
401 	struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table;
402 
403 	if (pDM_Odm->bLinked != true)
404 		return;
405 
406 	pRA_Table->firstconnect = pDM_Odm->bLinked;
407 
408 	/* if (check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == true) */
409 	{
410 		struct sta_info *psta;
411 
412 		for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
413 			psta = pDM_Odm->pODM_StaInfo[i];
414 			if (IS_STA_VALID(psta)) {
415 				if (is_multicast_ether_addr(psta->hwaddr))  /* if (psta->mac_id == 1) */
416 					continue;
417 
418 				if (psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))
419 					continue;
420 
421 				if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)
422 					tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
423 
424 				if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)
425 					tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
426 
427 				if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1))
428 					PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16));
429 			}
430 		}
431 
432 		for (i = 0; i < sta_cnt; i++) {
433 			if (PWDB_rssi[i] != (0)) {
434 				if (pHalData->fw_ractrl == true)/*  Report every sta's RSSI to FW */
435 					rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));
436 			}
437 		}
438 	}
439 
440 
441 
442 	if (tmpEntryMaxPWDB != 0)	/*  If associated entry is found */
443 		pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;
444 	else
445 		pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;
446 
447 	if (tmpEntryMinPWDB != 0xff) /*  If associated entry is found */
448 		pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;
449 	else
450 		pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;
451 
452 	FindMinimumRSSI(Adapter);/* get pdmpriv->MinUndecoratedPWDBForDM */
453 
454 	pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
455 	/* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */
456 }
457 
odm_RSSIMonitorCheck(struct dm_odm_t * pDM_Odm)458 static void odm_RSSIMonitorCheck(struct dm_odm_t *pDM_Odm)
459 {
460 	if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
461 		return;
462 
463 	odm_RSSIMonitorCheckCE(pDM_Odm);
464 
465 }	/*  odm_RSSIMonitorCheck */
466 
467 /* 3 ============================================================ */
468 /* 3 SW Antenna Diversity */
469 /* 3 ============================================================ */
odm_SwAntDetectInit(struct dm_odm_t * pDM_Odm)470 static void odm_SwAntDetectInit(struct dm_odm_t *pDM_Odm)
471 {
472 	struct swat_t *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
473 
474 	pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = rtw_read32(pDM_Odm->Adapter, rDPDT_control);
475 	pDM_SWAT_Table->PreAntenna = MAIN_ANT;
476 	pDM_SWAT_Table->CurAntenna = MAIN_ANT;
477 	pDM_SWAT_Table->SWAS_NoLink_State = 0;
478 }
479 
480 /* 3 ============================================================ */
481 /* 3 Tx Power Tracking */
482 /* 3 ============================================================ */
483 
getSwingIndex(struct dm_odm_t * pDM_Odm)484 static u8 getSwingIndex(struct dm_odm_t *pDM_Odm)
485 {
486 	struct adapter *Adapter = pDM_Odm->Adapter;
487 	u8 i = 0;
488 	u32 bbSwing;
489 	u32 swingTableSize;
490 	u32 *pSwingTable;
491 
492 	bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000);
493 
494 	pSwingTable = OFDMSwingTable_New;
495 	swingTableSize = OFDM_TABLE_SIZE;
496 
497 	for (i = 0; i < swingTableSize; ++i) {
498 		u32 tableValue = pSwingTable[i];
499 
500 		if (tableValue >= 0x100000)
501 			tableValue >>= 22;
502 		if (bbSwing == tableValue)
503 			break;
504 	}
505 	return i;
506 }
507 
odm_TXPowerTrackingInit(struct dm_odm_t * pDM_Odm)508 void odm_TXPowerTrackingInit(struct dm_odm_t *pDM_Odm)
509 {
510 	u8 defaultSwingIndex = getSwingIndex(pDM_Odm);
511 	u8 p = 0;
512 	struct adapter *Adapter = pDM_Odm->Adapter;
513 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
514 
515 
516 	struct dm_priv *pdmpriv = &pHalData->dmpriv;
517 
518 	pdmpriv->bTXPowerTracking = true;
519 	pdmpriv->TXPowercount = 0;
520 	pdmpriv->bTXPowerTrackingInit = false;
521 
522 	if (*(pDM_Odm->mp_mode) != 1)
523 		pdmpriv->TxPowerTrackControl = true;
524 	else
525 		pdmpriv->TxPowerTrackControl = false;
526 
527 	/* pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true; */
528 	pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
529 	pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
530 	pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
531 
532 	/*  The index of "0 dB" in SwingTable. */
533 	pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex;
534 	pDM_Odm->DefaultCckIndex = 20;
535 
536 	pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
537 	pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex;
538 
539 	for (p = RF_PATH_A; p < MAX_RF_PATH; ++p) {
540 		pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
541 		pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
542 		pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
543 		pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
544 		pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
545 	}
546 
547 }
548 
ODM_TXPowerTrackingCheck(struct dm_odm_t * pDM_Odm)549 void ODM_TXPowerTrackingCheck(struct dm_odm_t *pDM_Odm)
550 {
551 	struct adapter *Adapter = pDM_Odm->Adapter;
552 
553 	if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK))
554 		return;
555 
556 	if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) { /* at least delay 1 sec */
557 		PHY_SetRFReg(pDM_Odm->Adapter, RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03);
558 
559 		pDM_Odm->RFCalibrateInfo.TM_Trigger = 1;
560 		return;
561 	} else {
562 		ODM_TXPowerTrackingCallback_ThermalMeter(Adapter);
563 		pDM_Odm->RFCalibrateInfo.TM_Trigger = 0;
564 	}
565 }
566 
567 /*  */
568 /* 3 Export Interface */
569 /*  */
570 
571 /*  */
572 /*  2011/09/21 MH Add to describe different team necessary resource allocate?? */
573 /*  */
ODM_DMInit(struct dm_odm_t * pDM_Odm)574 void ODM_DMInit(struct dm_odm_t *pDM_Odm)
575 {
576 
577 	odm_CommonInfoSelfInit(pDM_Odm);
578 	odm_DIGInit(pDM_Odm);
579 	odm_NHMCounterStatisticsInit(pDM_Odm);
580 	odm_AdaptivityInit(pDM_Odm);
581 	odm_RateAdaptiveMaskInit(pDM_Odm);
582 	ODM_CfoTrackingInit(pDM_Odm);
583 	ODM_EdcaTurboInit(pDM_Odm);
584 	odm_RSSIMonitorInit(pDM_Odm);
585 	odm_TXPowerTrackingInit(pDM_Odm);
586 
587 	ODM_ClearTxPowerTrackingState(pDM_Odm);
588 
589 	odm_DynamicBBPowerSavingInit(pDM_Odm);
590 	odm_DynamicTxPowerInit(pDM_Odm);
591 
592 	odm_SwAntDetectInit(pDM_Odm);
593 }
594 
595 /*  */
596 /*  2011/09/20 MH This is the entry pointer for all team to execute HW out source DM. */
597 /*  You can not add any dummy function here, be care, you can only use DM structure */
598 /*  to perform any new ODM_DM. */
599 /*  */
ODM_DMWatchdog(struct dm_odm_t * pDM_Odm)600 void ODM_DMWatchdog(struct dm_odm_t *pDM_Odm)
601 {
602 	odm_CommonInfoSelfUpdate(pDM_Odm);
603 	odm_FalseAlarmCounterStatistics(pDM_Odm);
604 	odm_NHMCounterStatistics(pDM_Odm);
605 
606 	odm_RSSIMonitorCheck(pDM_Odm);
607 
608 	/* For CE Platform(SPRD or Tablet) */
609 	/* 8723A or 8189ES platform */
610 	/* NeilChen--2012--08--24-- */
611 	/* Fix Leave LPS issue */
612 	if (adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) {
613 		/* in LPS mode */
614 		odm_DIGbyRSSI_LPS(pDM_Odm);
615 	} else {
616 		odm_DIG(pDM_Odm);
617 	}
618 
619 	{
620 		struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable;
621 
622 		odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);
623 	}
624 	odm_CCKPacketDetectionThresh(pDM_Odm);
625 
626 	if (*(pDM_Odm->pbPowerSaving) == true)
627 		return;
628 
629 
630 	odm_RefreshRateAdaptiveMask(pDM_Odm);
631 	odm_EdcaTurboCheck(pDM_Odm);
632 	ODM_CfoTracking(pDM_Odm);
633 
634 	ODM_TXPowerTrackingCheck(pDM_Odm);
635 
636 	/* odm_EdcaTurboCheck(pDM_Odm); */
637 
638 	/* 2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled, */
639 	/*  so compile flags must be left here to prevent from compile errors */
640 	pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;
641 }
642 
643 
644 /*  */
645 /*  Init /.. Fixed HW value. Only init time. */
646 /*  */
ODM_CmnInfoInit(struct dm_odm_t * pDM_Odm,enum odm_cmninfo_e CmnInfo,u32 Value)647 void ODM_CmnInfoInit(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, u32 Value)
648 {
649 	/*  */
650 	/*  This section is used for init value */
651 	/*  */
652 	switch (CmnInfo) {
653 	/*  */
654 	/*  Fixed ODM value. */
655 	/*  */
656 	case ODM_CMNINFO_ABILITY:
657 		pDM_Odm->SupportAbility = (u32)Value;
658 		break;
659 
660 	case ODM_CMNINFO_PLATFORM:
661 		pDM_Odm->SupportPlatform = (u8)Value;
662 		break;
663 
664 	case ODM_CMNINFO_INTERFACE:
665 		pDM_Odm->SupportInterface = (u8)Value;
666 		break;
667 
668 	case ODM_CMNINFO_IC_TYPE:
669 		pDM_Odm->SupportICType = Value;
670 		break;
671 
672 	case ODM_CMNINFO_CUT_VER:
673 		pDM_Odm->CutVersion = (u8)Value;
674 		break;
675 
676 	case ODM_CMNINFO_FAB_VER:
677 		pDM_Odm->FabVersion = (u8)Value;
678 		break;
679 
680 	case ODM_CMNINFO_RFE_TYPE:
681 		pDM_Odm->RFEType = (u8)Value;
682 		break;
683 
684 	case    ODM_CMNINFO_RF_ANTENNA_TYPE:
685 		pDM_Odm->AntDivType = (u8)Value;
686 		break;
687 
688 	case ODM_CMNINFO_PACKAGE_TYPE:
689 		pDM_Odm->PackageType = (u8)Value;
690 		break;
691 
692 	case ODM_CMNINFO_EXT_LNA:
693 		pDM_Odm->ExtLNA = (u8)Value;
694 		break;
695 
696 	case ODM_CMNINFO_EXT_PA:
697 		pDM_Odm->ExtPA = (u8)Value;
698 		break;
699 
700 	case ODM_CMNINFO_GPA:
701 		pDM_Odm->TypeGPA = (enum odm_type_gpa_e)Value;
702 		break;
703 	case ODM_CMNINFO_APA:
704 		pDM_Odm->TypeAPA = (enum odm_type_apa_e)Value;
705 		break;
706 	case ODM_CMNINFO_GLNA:
707 		pDM_Odm->TypeGLNA = (enum odm_type_glna_e)Value;
708 		break;
709 	case ODM_CMNINFO_ALNA:
710 		pDM_Odm->TypeALNA = (enum odm_type_alna_e)Value;
711 		break;
712 
713 	case ODM_CMNINFO_EXT_TRSW:
714 		pDM_Odm->ExtTRSW = (u8)Value;
715 		break;
716 	case ODM_CMNINFO_PATCH_ID:
717 		pDM_Odm->PatchID = (u8)Value;
718 		break;
719 	case ODM_CMNINFO_BINHCT_TEST:
720 		pDM_Odm->bInHctTest = (bool)Value;
721 		break;
722 	case ODM_CMNINFO_BWIFI_TEST:
723 		pDM_Odm->bWIFITest = (bool)Value;
724 		break;
725 
726 	case ODM_CMNINFO_SMART_CONCURRENT:
727 		pDM_Odm->bDualMacSmartConcurrent = (bool)Value;
728 		break;
729 
730 	/* To remove the compiler warning, must add an empty default statement to handle the other values. */
731 	default:
732 		/* do nothing */
733 		break;
734 	}
735 
736 }
737 
738 
ODM_CmnInfoHook(struct dm_odm_t * pDM_Odm,enum odm_cmninfo_e CmnInfo,void * pValue)739 void ODM_CmnInfoHook(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, void *pValue)
740 {
741 	/*  */
742 	/*  Hook call by reference pointer. */
743 	/*  */
744 	switch (CmnInfo) {
745 	/*  */
746 	/*  Dynamic call by reference pointer. */
747 	/*  */
748 	case ODM_CMNINFO_MAC_PHY_MODE:
749 		pDM_Odm->pMacPhyMode = pValue;
750 		break;
751 
752 	case ODM_CMNINFO_TX_UNI:
753 		pDM_Odm->pNumTxBytesUnicast = pValue;
754 		break;
755 
756 	case ODM_CMNINFO_RX_UNI:
757 		pDM_Odm->pNumRxBytesUnicast = pValue;
758 		break;
759 
760 	case ODM_CMNINFO_WM_MODE:
761 		pDM_Odm->pwirelessmode = pValue;
762 		break;
763 
764 	case ODM_CMNINFO_SEC_CHNL_OFFSET:
765 		pDM_Odm->pSecChOffset = pValue;
766 		break;
767 
768 	case ODM_CMNINFO_SEC_MODE:
769 		pDM_Odm->pSecurity = pValue;
770 		break;
771 
772 	case ODM_CMNINFO_BW:
773 		pDM_Odm->pBandWidth = pValue;
774 		break;
775 
776 	case ODM_CMNINFO_CHNL:
777 		pDM_Odm->pChannel = pValue;
778 		break;
779 
780 	case ODM_CMNINFO_DMSP_GET_VALUE:
781 		pDM_Odm->pbGetValueFromOtherMac = pValue;
782 		break;
783 
784 	case ODM_CMNINFO_BUDDY_ADAPTOR:
785 		pDM_Odm->pBuddyAdapter = pValue;
786 		break;
787 
788 	case ODM_CMNINFO_DMSP_IS_MASTER:
789 		pDM_Odm->pbMasterOfDMSP = pValue;
790 		break;
791 
792 	case ODM_CMNINFO_SCAN:
793 		pDM_Odm->pbScanInProcess = pValue;
794 		break;
795 
796 	case ODM_CMNINFO_POWER_SAVING:
797 		pDM_Odm->pbPowerSaving = pValue;
798 		break;
799 
800 	case ODM_CMNINFO_ONE_PATH_CCA:
801 		pDM_Odm->pOnePathCCA = pValue;
802 		break;
803 
804 	case ODM_CMNINFO_DRV_STOP:
805 		pDM_Odm->pbDriverStopped =  pValue;
806 		break;
807 
808 	case ODM_CMNINFO_PNP_IN:
809 		pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep =  pValue;
810 		break;
811 
812 	case ODM_CMNINFO_INIT_ON:
813 		pDM_Odm->pinit_adpt_in_progress =  pValue;
814 		break;
815 
816 	case ODM_CMNINFO_ANT_TEST:
817 		pDM_Odm->pAntennaTest =  pValue;
818 		break;
819 
820 	case ODM_CMNINFO_NET_CLOSED:
821 		pDM_Odm->pbNet_closed = pValue;
822 		break;
823 
824 	case ODM_CMNINFO_FORCED_RATE:
825 		pDM_Odm->pForcedDataRate = pValue;
826 		break;
827 
828 	case ODM_CMNINFO_FORCED_IGI_LB:
829 		pDM_Odm->pu1ForcedIgiLb = pValue;
830 		break;
831 
832 	case ODM_CMNINFO_MP_MODE:
833 		pDM_Odm->mp_mode = pValue;
834 		break;
835 
836 	/* case ODM_CMNINFO_RTSTA_AID: */
837 	/* pDM_Odm->pAidMap =  (u8 *)pValue; */
838 	/* break; */
839 
840 	/* case ODM_CMNINFO_BT_COEXIST: */
841 	/* pDM_Odm->BTCoexist = (bool *)pValue; */
842 
843 	/* case ODM_CMNINFO_STA_STATUS: */
844 	/* pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue; */
845 	/* break; */
846 
847 	/* case ODM_CMNINFO_PHY_STATUS: */
848 	/* pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue; */
849 	/* break; */
850 
851 	/* case ODM_CMNINFO_MAC_STATUS: */
852 	/* pDM_Odm->pMacInfo = (struct odm_mac_status_info *)pValue; */
853 	/* break; */
854 	/* To remove the compiler warning, must add an empty default statement to handle the other values. */
855 	default:
856 		/* do nothing */
857 		break;
858 	}
859 
860 }
861 
862 
ODM_CmnInfoPtrArrayHook(struct dm_odm_t * pDM_Odm,enum odm_cmninfo_e CmnInfo,u16 Index,void * pValue)863 void ODM_CmnInfoPtrArrayHook(
864 	struct dm_odm_t *pDM_Odm,
865 	enum odm_cmninfo_e CmnInfo,
866 	u16 Index,
867 	void *pValue
868 )
869 {
870 	/*  */
871 	/*  Hook call by reference pointer. */
872 	/*  */
873 	switch (CmnInfo) {
874 	/*  */
875 	/*  Dynamic call by reference pointer. */
876 	/*  */
877 	case ODM_CMNINFO_STA_STATUS:
878 		pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;
879 		break;
880 	/* To remove the compiler warning, must add an empty default statement to handle the other values. */
881 	default:
882 		/* do nothing */
883 		break;
884 	}
885 
886 }
887 
888 
889 /*  */
890 /*  Update Band/CHannel/.. The values are dynamic but non-per-packet. */
891 /*  */
ODM_CmnInfoUpdate(struct dm_odm_t * pDM_Odm,u32 CmnInfo,u64 Value)892 void ODM_CmnInfoUpdate(struct dm_odm_t *pDM_Odm, u32 CmnInfo, u64 Value)
893 {
894 	/*  */
895 	/*  This init variable may be changed in run time. */
896 	/*  */
897 	switch (CmnInfo) {
898 	case ODM_CMNINFO_LINK_IN_PROGRESS:
899 		pDM_Odm->bLinkInProcess = (bool)Value;
900 		break;
901 
902 	case ODM_CMNINFO_ABILITY:
903 		pDM_Odm->SupportAbility = (u32)Value;
904 		break;
905 
906 	case ODM_CMNINFO_WIFI_DIRECT:
907 		pDM_Odm->bWIFI_Direct = (bool)Value;
908 		break;
909 
910 	case ODM_CMNINFO_WIFI_DISPLAY:
911 		pDM_Odm->bWIFI_Display = (bool)Value;
912 		break;
913 
914 	case ODM_CMNINFO_LINK:
915 		pDM_Odm->bLinked = (bool)Value;
916 		break;
917 
918 	case ODM_CMNINFO_STATION_STATE:
919 		pDM_Odm->bsta_state = (bool)Value;
920 		break;
921 
922 	case ODM_CMNINFO_RSSI_MIN:
923 		pDM_Odm->RSSI_Min = (u8)Value;
924 		break;
925 
926 	case ODM_CMNINFO_RA_THRESHOLD_HIGH:
927 		pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value;
928 		break;
929 
930 	case ODM_CMNINFO_RA_THRESHOLD_LOW:
931 		pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value;
932 		break;
933 	/*  The following is for BT HS mode and BT coexist mechanism. */
934 	case ODM_CMNINFO_BT_ENABLED:
935 		pDM_Odm->bBtEnabled = (bool)Value;
936 		break;
937 
938 	case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:
939 		pDM_Odm->bBtConnectProcess = (bool)Value;
940 		break;
941 
942 	case ODM_CMNINFO_BT_HS_RSSI:
943 		pDM_Odm->btHsRssi = (u8)Value;
944 		break;
945 
946 	case ODM_CMNINFO_BT_OPERATION:
947 		pDM_Odm->bBtHsOperation = (bool)Value;
948 		break;
949 
950 	case ODM_CMNINFO_BT_LIMITED_DIG:
951 		pDM_Odm->bBtLimitedDig = (bool)Value;
952 		break;
953 
954 	case ODM_CMNINFO_BT_DISABLE_EDCA:
955 		pDM_Odm->bBtDisableEdcaTurbo = (bool)Value;
956 		break;
957 
958 /*
959 	case	ODM_CMNINFO_OP_MODE:
960 		pDM_Odm->OPMode = (u8)Value;
961 		break;
962 
963 	case	ODM_CMNINFO_WM_MODE:
964 		pDM_Odm->WirelessMode = (u8)Value;
965 		break;
966 
967 	case	ODM_CMNINFO_SEC_CHNL_OFFSET:
968 		pDM_Odm->SecChOffset = (u8)Value;
969 		break;
970 
971 	case	ODM_CMNINFO_SEC_MODE:
972 		pDM_Odm->Security = (u8)Value;
973 		break;
974 
975 	case	ODM_CMNINFO_BW:
976 		pDM_Odm->BandWidth = (u8)Value;
977 		break;
978 
979 	case	ODM_CMNINFO_CHNL:
980 		pDM_Odm->Channel = (u8)Value;
981 		break;
982 */
983 	default:
984 		/* do nothing */
985 		break;
986 	}
987 
988 
989 }
990 
991 /* 3 ============================================================ */
992 /* 3 DIG */
993 /* 3 ============================================================ */
994 /*-----------------------------------------------------------------------------
995  * Function:	odm_DIGInit()
996  *
997  * Overview:	Set DIG scheme init value.
998  *
999  * Input:		NONE
1000  *
1001  * Output:		NONE
1002  *
1003  * Return:		NONE
1004  *
1005  * Revised History:
1006  *When		Who		Remark
1007  *
1008  *---------------------------------------------------------------------------
1009  */
1010 
1011 /* Remove DIG by yuchen */
1012 
1013 /* Remove DIG and FA check by Yu Chen */
1014 
1015 /* 3 ============================================================ */
1016 /* 3 BB Power Save */
1017 /* 3 ============================================================ */
1018 
1019 /* Remove BB power saving by Yuchen */
1020 
1021 /* 3 ============================================================ */
1022 /* 3 Dynamic Tx Power */
1023 /* 3 ============================================================ */
1024 
1025 /* Remove BY YuChen */
1026 
1027