1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #define _HAL_COM_C_
16 
17 #include <drv_types.h>
18 #include <rtw_debug.h>
19 #include "hal_com_h2c.h"
20 
21 #include "odm_precomp.h"
22 
23 u8 rtw_hal_data_init(struct adapter *padapter)
24 {
25 	if (is_primary_adapter(padapter)) {	/* if (padapter->isprimary) */
26 		padapter->hal_data_sz = sizeof(struct hal_com_data);
27 		padapter->HalData = vzalloc(padapter->hal_data_sz);
28 		if (padapter->HalData == NULL) {
29 			DBG_8192C("cannot alloc memory for HAL DATA\n");
30 			return _FAIL;
31 		}
32 	}
33 	return _SUCCESS;
34 }
35 
36 void rtw_hal_data_deinit(struct adapter *padapter)
37 {
38 	if (is_primary_adapter(padapter)) {	/* if (padapter->isprimary) */
39 		if (padapter->HalData) {
40 			phy_free_filebuf(padapter);
41 			vfree(padapter->HalData);
42 			padapter->HalData = NULL;
43 			padapter->hal_data_sz = 0;
44 		}
45 	}
46 }
47 
48 
49 void dump_chip_info(HAL_VERSION	ChipVersion)
50 {
51 	int cnt = 0;
52 	u8 buf[128];
53 
54 	cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8723B_");
55 	cnt += sprintf((buf+cnt), "%s_", IS_NORMAL_CHIP(ChipVersion) ? "Normal_Chip" : "Test_Chip");
56 	if (IS_CHIP_VENDOR_TSMC(ChipVersion))
57 		cnt += sprintf((buf+cnt), "%s_", "TSMC");
58 	else if (IS_CHIP_VENDOR_UMC(ChipVersion))
59 		cnt += sprintf((buf+cnt), "%s_", "UMC");
60 	else if (IS_CHIP_VENDOR_SMIC(ChipVersion))
61 		cnt += sprintf((buf+cnt), "%s_", "SMIC");
62 
63 	if (IS_A_CUT(ChipVersion))
64 		cnt += sprintf((buf+cnt), "A_CUT_");
65 	else if (IS_B_CUT(ChipVersion))
66 		cnt += sprintf((buf+cnt), "B_CUT_");
67 	else if (IS_C_CUT(ChipVersion))
68 		cnt += sprintf((buf+cnt), "C_CUT_");
69 	else if (IS_D_CUT(ChipVersion))
70 		cnt += sprintf((buf+cnt), "D_CUT_");
71 	else if (IS_E_CUT(ChipVersion))
72 		cnt += sprintf((buf+cnt), "E_CUT_");
73 	else if (IS_I_CUT(ChipVersion))
74 		cnt += sprintf((buf+cnt), "I_CUT_");
75 	else if (IS_J_CUT(ChipVersion))
76 		cnt += sprintf((buf+cnt), "J_CUT_");
77 	else if (IS_K_CUT(ChipVersion))
78 		cnt += sprintf((buf+cnt), "K_CUT_");
79 	else
80 		cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion);
81 
82 	if (IS_1T1R(ChipVersion))
83 		cnt += sprintf((buf+cnt), "1T1R_");
84 	else if (IS_1T2R(ChipVersion))
85 		cnt += sprintf((buf+cnt), "1T2R_");
86 	else if (IS_2T2R(ChipVersion))
87 		cnt += sprintf((buf+cnt), "2T2R_");
88 	else
89 		cnt += sprintf((buf+cnt), "UNKNOWN_RFTYPE(%d)_", ChipVersion.RFType);
90 
91 	cnt += sprintf((buf+cnt), "RomVer(%d)\n", ChipVersion.ROMVer);
92 
93 	DBG_871X("%s", buf);
94 }
95 
96 
97 #define	EEPROM_CHANNEL_PLAN_BY_HW_MASK	0x80
98 
99 /*
100  * Description:
101  *Use hardware(efuse), driver parameter(registry) and default channel plan
102  *to decide which one should be used.
103  *
104  * Parameters:
105  *padapter			pointer of adapter
106  *hw_channel_plan		channel plan from HW (efuse/eeprom)
107  *					BIT[7] software configure mode; 0:Enable, 1:disable
108  *					BIT[6:0] Channel Plan
109  *sw_channel_plan		channel plan from SW (registry/module param)
110  *def_channel_plan	channel plan used when HW/SW both invalid
111  *AutoLoadFail		efuse autoload fail or not
112  *
113  * Return:
114  *Final channel plan decision
115  *
116  */
117 u8 hal_com_config_channel_plan(
118 	struct adapter *padapter,
119 	u8 hw_channel_plan,
120 	u8 sw_channel_plan,
121 	u8 def_channel_plan,
122 	bool AutoLoadFail
123 )
124 {
125 	struct hal_com_data *pHalData;
126 	u8 chnlPlan;
127 
128 	pHalData = GET_HAL_DATA(padapter);
129 	pHalData->bDisableSWChannelPlan = false;
130 	chnlPlan = def_channel_plan;
131 
132 	if (0xFF == hw_channel_plan)
133 		AutoLoadFail = true;
134 
135 	if (false == AutoLoadFail) {
136 		u8 hw_chnlPlan;
137 
138 		hw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);
139 		if (rtw_is_channel_plan_valid(hw_chnlPlan)) {
140 #ifndef CONFIG_SW_CHANNEL_PLAN
141 			if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)
142 				pHalData->bDisableSWChannelPlan = true;
143 #endif /*  !CONFIG_SW_CHANNEL_PLAN */
144 
145 			chnlPlan = hw_chnlPlan;
146 		}
147 	}
148 
149 	if (
150 		(false == pHalData->bDisableSWChannelPlan) &&
151 		rtw_is_channel_plan_valid(sw_channel_plan)
152 	)
153 		chnlPlan = sw_channel_plan;
154 
155 	return chnlPlan;
156 }
157 
158 bool HAL_IsLegalChannel(struct adapter *Adapter, u32 Channel)
159 {
160 	bool bLegalChannel = true;
161 
162 	if (Channel > 14) {
163 		bLegalChannel = false;
164 		DBG_871X("Channel > 14 but wireless_mode do not support 5G\n");
165 	} else if ((Channel <= 14) && (Channel >= 1)) {
166 		if (IsSupported24G(Adapter->registrypriv.wireless_mode) == false) {
167 			bLegalChannel = false;
168 			DBG_871X("(Channel <= 14) && (Channel >= 1) but wireless_mode do not support 2.4G\n");
169 		}
170 	} else {
171 		bLegalChannel = false;
172 		DBG_871X("Channel is Invalid !!!\n");
173 	}
174 
175 	return bLegalChannel;
176 }
177 
178 u8 MRateToHwRate(u8 rate)
179 {
180 	u8 ret = DESC_RATE1M;
181 
182 	switch (rate) {
183 	case MGN_1M:
184 		ret = DESC_RATE1M;
185 		break;
186 	case MGN_2M:
187 		ret = DESC_RATE2M;
188 		break;
189 	case MGN_5_5M:
190 		ret = DESC_RATE5_5M;
191 		break;
192 	case MGN_11M:
193 		ret = DESC_RATE11M;
194 		break;
195 	case MGN_6M:
196 		ret = DESC_RATE6M;
197 		break;
198 	case MGN_9M:
199 		ret = DESC_RATE9M;
200 		break;
201 	case MGN_12M:
202 		ret = DESC_RATE12M;
203 		break;
204 	case MGN_18M:
205 		ret = DESC_RATE18M;
206 		break;
207 	case MGN_24M:
208 		ret = DESC_RATE24M;
209 		break;
210 	case MGN_36M:
211 		ret = DESC_RATE36M;
212 		break;
213 	case MGN_48M:
214 		ret = DESC_RATE48M;
215 		break;
216 	case MGN_54M:
217 		ret = DESC_RATE54M;
218 		break;
219 	case MGN_MCS0:
220 		ret = DESC_RATEMCS0;
221 		break;
222 	case MGN_MCS1:
223 		ret = DESC_RATEMCS1;
224 		break;
225 	case MGN_MCS2:
226 		ret = DESC_RATEMCS2;
227 		break;
228 	case MGN_MCS3:
229 		ret = DESC_RATEMCS3;
230 		break;
231 	case MGN_MCS4:
232 		ret = DESC_RATEMCS4;
233 		break;
234 	case MGN_MCS5:
235 		ret = DESC_RATEMCS5;
236 		break;
237 	case MGN_MCS6:
238 		ret = DESC_RATEMCS6;
239 		break;
240 	case MGN_MCS7:
241 		ret = DESC_RATEMCS7;
242 		break;
243 	case MGN_MCS8:
244 		ret = DESC_RATEMCS8;
245 		break;
246 	case MGN_MCS9:
247 		ret = DESC_RATEMCS9;
248 		break;
249 	case MGN_MCS10:
250 		ret = DESC_RATEMCS10;
251 		break;
252 	case MGN_MCS11:
253 		ret = DESC_RATEMCS11;
254 		break;
255 	case MGN_MCS12:
256 		ret = DESC_RATEMCS12;
257 		break;
258 	case MGN_MCS13:
259 		ret = DESC_RATEMCS13;
260 		break;
261 	case MGN_MCS14:
262 		ret = DESC_RATEMCS14;
263 		break;
264 	case MGN_MCS15:
265 		ret = DESC_RATEMCS15;
266 		break;
267 	case MGN_MCS16:
268 		ret = DESC_RATEMCS16;
269 		break;
270 	case MGN_MCS17:
271 		ret = DESC_RATEMCS17;
272 		break;
273 	case MGN_MCS18:
274 		ret = DESC_RATEMCS18;
275 		break;
276 	case MGN_MCS19:
277 		ret = DESC_RATEMCS19;
278 		break;
279 	case MGN_MCS20:
280 		ret = DESC_RATEMCS20;
281 		break;
282 	case MGN_MCS21:
283 		ret = DESC_RATEMCS21;
284 		break;
285 	case MGN_MCS22:
286 		ret = DESC_RATEMCS22;
287 		break;
288 	case MGN_MCS23:
289 		ret = DESC_RATEMCS23;
290 		break;
291 	case MGN_MCS24:
292 		ret = DESC_RATEMCS24;
293 		break;
294 	case MGN_MCS25:
295 		ret = DESC_RATEMCS25;
296 		break;
297 	case MGN_MCS26:
298 		ret = DESC_RATEMCS26;
299 		break;
300 	case MGN_MCS27:
301 		ret = DESC_RATEMCS27;
302 		break;
303 	case MGN_MCS28:
304 		ret = DESC_RATEMCS28;
305 		break;
306 	case MGN_MCS29:
307 		ret = DESC_RATEMCS29;
308 		break;
309 	case MGN_MCS30:
310 		ret = DESC_RATEMCS30;
311 		break;
312 	case MGN_MCS31:
313 		ret = DESC_RATEMCS31;
314 		break;
315 	case MGN_VHT1SS_MCS0:
316 		ret = DESC_RATEVHTSS1MCS0;
317 		break;
318 	case MGN_VHT1SS_MCS1:
319 		ret = DESC_RATEVHTSS1MCS1;
320 		break;
321 	case MGN_VHT1SS_MCS2:
322 		ret = DESC_RATEVHTSS1MCS2;
323 		break;
324 	case MGN_VHT1SS_MCS3:
325 		ret = DESC_RATEVHTSS1MCS3;
326 		break;
327 	case MGN_VHT1SS_MCS4:
328 		ret = DESC_RATEVHTSS1MCS4;
329 		break;
330 	case MGN_VHT1SS_MCS5:
331 		ret = DESC_RATEVHTSS1MCS5;
332 		break;
333 	case MGN_VHT1SS_MCS6:
334 		ret = DESC_RATEVHTSS1MCS6;
335 		break;
336 	case MGN_VHT1SS_MCS7:
337 		ret = DESC_RATEVHTSS1MCS7;
338 		break;
339 	case MGN_VHT1SS_MCS8:
340 		ret = DESC_RATEVHTSS1MCS8;
341 		break;
342 	case MGN_VHT1SS_MCS9:
343 		ret = DESC_RATEVHTSS1MCS9;
344 		break;
345 	case MGN_VHT2SS_MCS0:
346 		ret = DESC_RATEVHTSS2MCS0;
347 		break;
348 	case MGN_VHT2SS_MCS1:
349 		ret = DESC_RATEVHTSS2MCS1;
350 		break;
351 	case MGN_VHT2SS_MCS2:
352 		ret = DESC_RATEVHTSS2MCS2;
353 		break;
354 	case MGN_VHT2SS_MCS3:
355 		ret = DESC_RATEVHTSS2MCS3;
356 		break;
357 	case MGN_VHT2SS_MCS4:
358 		ret = DESC_RATEVHTSS2MCS4;
359 		break;
360 	case MGN_VHT2SS_MCS5:
361 		ret = DESC_RATEVHTSS2MCS5;
362 		break;
363 	case MGN_VHT2SS_MCS6:
364 		ret = DESC_RATEVHTSS2MCS6;
365 		break;
366 	case MGN_VHT2SS_MCS7:
367 		ret = DESC_RATEVHTSS2MCS7;
368 		break;
369 	case MGN_VHT2SS_MCS8:
370 		ret = DESC_RATEVHTSS2MCS8;
371 		break;
372 	case MGN_VHT2SS_MCS9:
373 		ret = DESC_RATEVHTSS2MCS9;
374 		break;
375 	case MGN_VHT3SS_MCS0:
376 		ret = DESC_RATEVHTSS3MCS0;
377 		break;
378 	case MGN_VHT3SS_MCS1:
379 		ret = DESC_RATEVHTSS3MCS1;
380 		break;
381 	case MGN_VHT3SS_MCS2:
382 		ret = DESC_RATEVHTSS3MCS2;
383 		break;
384 	case MGN_VHT3SS_MCS3:
385 		ret = DESC_RATEVHTSS3MCS3;
386 		break;
387 	case MGN_VHT3SS_MCS4:
388 		ret = DESC_RATEVHTSS3MCS4;
389 		break;
390 	case MGN_VHT3SS_MCS5:
391 		ret = DESC_RATEVHTSS3MCS5;
392 		break;
393 	case MGN_VHT3SS_MCS6:
394 		ret = DESC_RATEVHTSS3MCS6;
395 		break;
396 	case MGN_VHT3SS_MCS7:
397 		ret = DESC_RATEVHTSS3MCS7;
398 		break;
399 	case MGN_VHT3SS_MCS8:
400 		ret = DESC_RATEVHTSS3MCS8;
401 		break;
402 	case MGN_VHT3SS_MCS9:
403 		ret = DESC_RATEVHTSS3MCS9;
404 		break;
405 	case MGN_VHT4SS_MCS0:
406 		ret = DESC_RATEVHTSS4MCS0;
407 		break;
408 	case MGN_VHT4SS_MCS1:
409 		ret = DESC_RATEVHTSS4MCS1;
410 		break;
411 	case MGN_VHT4SS_MCS2:
412 		ret = DESC_RATEVHTSS4MCS2;
413 		break;
414 	case MGN_VHT4SS_MCS3:
415 		ret = DESC_RATEVHTSS4MCS3;
416 		break;
417 	case MGN_VHT4SS_MCS4:
418 		ret = DESC_RATEVHTSS4MCS4;
419 		break;
420 	case MGN_VHT4SS_MCS5:
421 		ret = DESC_RATEVHTSS4MCS5;
422 		break;
423 	case MGN_VHT4SS_MCS6:
424 		ret = DESC_RATEVHTSS4MCS6;
425 		break;
426 	case MGN_VHT4SS_MCS7:
427 		ret = DESC_RATEVHTSS4MCS7;
428 		break;
429 	case MGN_VHT4SS_MCS8:
430 		ret = DESC_RATEVHTSS4MCS8;
431 		break;
432 	case MGN_VHT4SS_MCS9:
433 		ret = DESC_RATEVHTSS4MCS9;
434 		break;
435 	default:
436 		break;
437 	}
438 
439 	return ret;
440 }
441 
442 u8 HwRateToMRate(u8 rate)
443 {
444 	u8 ret_rate = MGN_1M;
445 
446 	switch (rate) {
447 	case DESC_RATE1M:
448 		ret_rate = MGN_1M;
449 		break;
450 	case DESC_RATE2M:
451 		ret_rate = MGN_2M;
452 		break;
453 	case DESC_RATE5_5M:
454 		ret_rate = MGN_5_5M;
455 		break;
456 	case DESC_RATE11M:
457 		ret_rate = MGN_11M;
458 		break;
459 	case DESC_RATE6M:
460 		ret_rate = MGN_6M;
461 		break;
462 	case DESC_RATE9M:
463 		ret_rate = MGN_9M;
464 		break;
465 	case DESC_RATE12M:
466 		ret_rate = MGN_12M;
467 		break;
468 	case DESC_RATE18M:
469 		ret_rate = MGN_18M;
470 		break;
471 	case DESC_RATE24M:
472 		ret_rate = MGN_24M;
473 		break;
474 	case DESC_RATE36M:
475 		ret_rate = MGN_36M;
476 		break;
477 	case DESC_RATE48M:
478 		ret_rate = MGN_48M;
479 		break;
480 	case DESC_RATE54M:
481 		ret_rate = MGN_54M;
482 		break;
483 	case DESC_RATEMCS0:
484 		ret_rate = MGN_MCS0;
485 		break;
486 	case DESC_RATEMCS1:
487 		ret_rate = MGN_MCS1;
488 		break;
489 	case DESC_RATEMCS2:
490 		ret_rate = MGN_MCS2;
491 		break;
492 	case DESC_RATEMCS3:
493 		ret_rate = MGN_MCS3;
494 		break;
495 	case DESC_RATEMCS4:
496 		ret_rate = MGN_MCS4;
497 		break;
498 	case DESC_RATEMCS5:
499 		ret_rate = MGN_MCS5;
500 		break;
501 	case DESC_RATEMCS6:
502 		ret_rate = MGN_MCS6;
503 		break;
504 	case DESC_RATEMCS7:
505 		ret_rate = MGN_MCS7;
506 		break;
507 	case DESC_RATEMCS8:
508 		ret_rate = MGN_MCS8;
509 		break;
510 	case DESC_RATEMCS9:
511 		ret_rate = MGN_MCS9;
512 		break;
513 	case DESC_RATEMCS10:
514 		ret_rate = MGN_MCS10;
515 		break;
516 	case DESC_RATEMCS11:
517 		ret_rate = MGN_MCS11;
518 		break;
519 	case DESC_RATEMCS12:
520 		ret_rate = MGN_MCS12;
521 		break;
522 	case DESC_RATEMCS13:
523 		ret_rate = MGN_MCS13;
524 		break;
525 	case DESC_RATEMCS14:
526 		ret_rate = MGN_MCS14;
527 		break;
528 	case DESC_RATEMCS15:
529 		ret_rate = MGN_MCS15;
530 		break;
531 	case DESC_RATEMCS16:
532 		ret_rate = MGN_MCS16;
533 		break;
534 	case DESC_RATEMCS17:
535 		ret_rate = MGN_MCS17;
536 		break;
537 	case DESC_RATEMCS18:
538 		ret_rate = MGN_MCS18;
539 		break;
540 	case DESC_RATEMCS19:
541 		ret_rate = MGN_MCS19;
542 		break;
543 	case DESC_RATEMCS20:
544 		ret_rate = MGN_MCS20;
545 		break;
546 	case DESC_RATEMCS21:
547 		ret_rate = MGN_MCS21;
548 		break;
549 	case DESC_RATEMCS22:
550 		ret_rate = MGN_MCS22;
551 		break;
552 	case DESC_RATEMCS23:
553 		ret_rate = MGN_MCS23;
554 		break;
555 	case DESC_RATEMCS24:
556 		ret_rate = MGN_MCS24;
557 		break;
558 	case DESC_RATEMCS25:
559 		ret_rate = MGN_MCS25;
560 		break;
561 	case DESC_RATEMCS26:
562 		ret_rate = MGN_MCS26;
563 		break;
564 	case DESC_RATEMCS27:
565 		ret_rate = MGN_MCS27;
566 		break;
567 	case DESC_RATEMCS28:
568 		ret_rate = MGN_MCS28;
569 		break;
570 	case DESC_RATEMCS29:
571 		ret_rate = MGN_MCS29;
572 		break;
573 	case DESC_RATEMCS30:
574 		ret_rate = MGN_MCS30;
575 		break;
576 	case DESC_RATEMCS31:
577 		ret_rate = MGN_MCS31;
578 		break;
579 	case DESC_RATEVHTSS1MCS0:
580 		ret_rate = MGN_VHT1SS_MCS0;
581 		break;
582 	case DESC_RATEVHTSS1MCS1:
583 		ret_rate = MGN_VHT1SS_MCS1;
584 		break;
585 	case DESC_RATEVHTSS1MCS2:
586 		ret_rate = MGN_VHT1SS_MCS2;
587 		break;
588 	case DESC_RATEVHTSS1MCS3:
589 		ret_rate = MGN_VHT1SS_MCS3;
590 		break;
591 	case DESC_RATEVHTSS1MCS4:
592 		ret_rate = MGN_VHT1SS_MCS4;
593 		break;
594 	case DESC_RATEVHTSS1MCS5:
595 		ret_rate = MGN_VHT1SS_MCS5;
596 		break;
597 	case DESC_RATEVHTSS1MCS6:
598 		ret_rate = MGN_VHT1SS_MCS6;
599 		break;
600 	case DESC_RATEVHTSS1MCS7:
601 		ret_rate = MGN_VHT1SS_MCS7;
602 		break;
603 	case DESC_RATEVHTSS1MCS8:
604 		ret_rate = MGN_VHT1SS_MCS8;
605 		break;
606 	case DESC_RATEVHTSS1MCS9:
607 		ret_rate = MGN_VHT1SS_MCS9;
608 		break;
609 	case DESC_RATEVHTSS2MCS0:
610 		ret_rate = MGN_VHT2SS_MCS0;
611 		break;
612 	case DESC_RATEVHTSS2MCS1:
613 		ret_rate = MGN_VHT2SS_MCS1;
614 		break;
615 	case DESC_RATEVHTSS2MCS2:
616 		ret_rate = MGN_VHT2SS_MCS2;
617 		break;
618 	case DESC_RATEVHTSS2MCS3:
619 		ret_rate = MGN_VHT2SS_MCS3;
620 		break;
621 	case DESC_RATEVHTSS2MCS4:
622 		ret_rate = MGN_VHT2SS_MCS4;
623 		break;
624 	case DESC_RATEVHTSS2MCS5:
625 		ret_rate = MGN_VHT2SS_MCS5;
626 		break;
627 	case DESC_RATEVHTSS2MCS6:
628 		ret_rate = MGN_VHT2SS_MCS6;
629 		break;
630 	case DESC_RATEVHTSS2MCS7:
631 		ret_rate = MGN_VHT2SS_MCS7;
632 		break;
633 	case DESC_RATEVHTSS2MCS8:
634 		ret_rate = MGN_VHT2SS_MCS8;
635 		break;
636 	case DESC_RATEVHTSS2MCS9:
637 		ret_rate = MGN_VHT2SS_MCS9;
638 		break;
639 	case DESC_RATEVHTSS3MCS0:
640 		ret_rate = MGN_VHT3SS_MCS0;
641 		break;
642 	case DESC_RATEVHTSS3MCS1:
643 		ret_rate = MGN_VHT3SS_MCS1;
644 		break;
645 	case DESC_RATEVHTSS3MCS2:
646 		ret_rate = MGN_VHT3SS_MCS2;
647 		break;
648 	case DESC_RATEVHTSS3MCS3:
649 		ret_rate = MGN_VHT3SS_MCS3;
650 		break;
651 	case DESC_RATEVHTSS3MCS4:
652 		ret_rate = MGN_VHT3SS_MCS4;
653 		break;
654 	case DESC_RATEVHTSS3MCS5:
655 		ret_rate = MGN_VHT3SS_MCS5;
656 		break;
657 	case DESC_RATEVHTSS3MCS6:
658 		ret_rate = MGN_VHT3SS_MCS6;
659 		break;
660 	case DESC_RATEVHTSS3MCS7:
661 		ret_rate = MGN_VHT3SS_MCS7;
662 		break;
663 	case DESC_RATEVHTSS3MCS8:
664 		ret_rate = MGN_VHT3SS_MCS8;
665 		break;
666 	case DESC_RATEVHTSS3MCS9:
667 		ret_rate = MGN_VHT3SS_MCS9;
668 		break;
669 	case DESC_RATEVHTSS4MCS0:
670 		ret_rate = MGN_VHT4SS_MCS0;
671 		break;
672 	case DESC_RATEVHTSS4MCS1:
673 		ret_rate = MGN_VHT4SS_MCS1;
674 		break;
675 	case DESC_RATEVHTSS4MCS2:
676 		ret_rate = MGN_VHT4SS_MCS2;
677 		break;
678 	case DESC_RATEVHTSS4MCS3:
679 		ret_rate = MGN_VHT4SS_MCS3;
680 		break;
681 	case DESC_RATEVHTSS4MCS4:
682 		ret_rate = MGN_VHT4SS_MCS4;
683 		break;
684 	case DESC_RATEVHTSS4MCS5:
685 		ret_rate = MGN_VHT4SS_MCS5;
686 		break;
687 	case DESC_RATEVHTSS4MCS6:
688 		ret_rate = MGN_VHT4SS_MCS6;
689 		break;
690 	case DESC_RATEVHTSS4MCS7:
691 		ret_rate = MGN_VHT4SS_MCS7;
692 		break;
693 	case DESC_RATEVHTSS4MCS8:
694 		ret_rate = MGN_VHT4SS_MCS8;
695 		break;
696 	case DESC_RATEVHTSS4MCS9:
697 		ret_rate = MGN_VHT4SS_MCS9;
698 		break;
699 
700 	default:
701 		DBG_871X("HwRateToMRate(): Non supported Rate [%x]!!!\n", rate);
702 		break;
703 	}
704 
705 	return ret_rate;
706 }
707 
708 void HalSetBrateCfg(struct adapter *Adapter, u8 *mBratesOS, u16 *pBrateCfg)
709 {
710 	u8 i, is_brate, brate;
711 
712 	for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
713 
714 		is_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;
715 		brate = mBratesOS[i] & 0x7f;
716 
717 		if (is_brate) {
718 			switch (brate) {
719 			case IEEE80211_CCK_RATE_1MB:
720 				*pBrateCfg |= RATE_1M;
721 				break;
722 			case IEEE80211_CCK_RATE_2MB:
723 				*pBrateCfg |= RATE_2M;
724 				break;
725 			case IEEE80211_CCK_RATE_5MB:
726 				*pBrateCfg |= RATE_5_5M;
727 				break;
728 			case IEEE80211_CCK_RATE_11MB:
729 				*pBrateCfg |= RATE_11M;
730 				break;
731 			case IEEE80211_OFDM_RATE_6MB:
732 				*pBrateCfg |= RATE_6M;
733 				break;
734 			case IEEE80211_OFDM_RATE_9MB:
735 				*pBrateCfg |= RATE_9M;
736 				break;
737 			case IEEE80211_OFDM_RATE_12MB:
738 				*pBrateCfg |= RATE_12M;
739 				break;
740 			case IEEE80211_OFDM_RATE_18MB:
741 				*pBrateCfg |= RATE_18M;
742 				break;
743 			case IEEE80211_OFDM_RATE_24MB:
744 				*pBrateCfg |= RATE_24M;
745 				break;
746 			case IEEE80211_OFDM_RATE_36MB:
747 				*pBrateCfg |= RATE_36M;
748 				break;
749 			case IEEE80211_OFDM_RATE_48MB:
750 				*pBrateCfg |= RATE_48M;
751 				break;
752 			case IEEE80211_OFDM_RATE_54MB:
753 				*pBrateCfg |= RATE_54M;
754 				break;
755 			}
756 		}
757 	}
758 }
759 
760 static void _OneOutPipeMapping(struct adapter *padapter)
761 {
762 	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
763 
764 	pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
765 	pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
766 	pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */
767 	pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
768 
769 	pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
770 	pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
771 	pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
772 	pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
773 }
774 
775 static void _TwoOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
776 {
777 	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
778 
779 	if (bWIFICfg) { /* WMM */
780 
781 		/* 	BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
782 		/*   0,		1,	0,	1,	0,	0,	0,	0,		0	}; */
783 		/* 0:ep_0 num, 1:ep_1 num */
784 
785 		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */
786 		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
787 		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
788 		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
789 
790 		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
791 		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
792 		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
793 		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
794 
795 	} else { /* typical setting */
796 
797 
798 		/* BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
799 		/*   1,		1,	0,	0,	0,	0,	0,	0,		0	}; */
800 		/* 0:ep_0 num, 1:ep_1 num */
801 
802 		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
803 		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
804 		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
805 		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
806 
807 		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
808 		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
809 		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
810 		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
811 
812 	}
813 
814 }
815 
816 static void _ThreeOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
817 {
818 	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
819 
820 	if (bWIFICfg) { /* for WMM */
821 
822 		/* 	BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
823 		/*   1,		2,	1,	0,	0,	0,	0,	0,		0	}; */
824 		/* 0:H, 1:N, 2:L */
825 
826 		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
827 		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
828 		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
829 		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
830 
831 		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
832 		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
833 		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
834 		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
835 
836 	} else { /* typical setting */
837 
838 
839 		/* 	BK,	BE,	VI,	VO,	BCN,	CMD, MGT, HIGH, HCCA */
840 		/*   2,		2,	1,	0,	0,	0,	0,	0,		0	}; */
841 		/* 0:H, 1:N, 2:L */
842 
843 		pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
844 		pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
845 		pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
846 		pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */
847 
848 		pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
849 		pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
850 		pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
851 		pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
852 	}
853 
854 }
855 
856 bool Hal_MappingOutPipe(struct adapter *padapter, u8 NumOutPipe)
857 {
858 	struct registry_priv *pregistrypriv = &padapter->registrypriv;
859 
860 	bool bWIFICfg = (pregistrypriv->wifi_spec) ? true : false;
861 
862 	bool result = true;
863 
864 	switch (NumOutPipe) {
865 	case 2:
866 		_TwoOutPipeMapping(padapter, bWIFICfg);
867 		break;
868 	case 3:
869 	case 4:
870 		_ThreeOutPipeMapping(padapter, bWIFICfg);
871 		break;
872 	case 1:
873 		_OneOutPipeMapping(padapter);
874 		break;
875 	default:
876 		result = false;
877 		break;
878 	}
879 
880 	return result;
881 
882 }
883 
884 void hal_init_macaddr(struct adapter *adapter)
885 {
886 	rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr);
887 }
888 
889 void rtw_init_hal_com_default_value(struct adapter *Adapter)
890 {
891 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
892 
893 	pHalData->AntDetection = 1;
894 }
895 
896 /*
897 * C2H event format:
898 * Field	 TRIGGER		CONTENT	   CMD_SEQ	CMD_LEN		 CMD_ID
899 * BITS	 [127:120]	[119:16]      [15:8]		  [7:4]		   [3:0]
900 */
901 
902 void c2h_evt_clear(struct adapter *adapter)
903 {
904 	rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
905 }
906 
907 /*
908 * C2H event format:
909 * Field    TRIGGER    CMD_LEN    CONTENT    CMD_SEQ    CMD_ID
910 * BITS    [127:120]   [119:112]    [111:16]	     [15:8]         [7:0]
911 */
912 s32 c2h_evt_read_88xx(struct adapter *adapter, u8 *buf)
913 {
914 	s32 ret = _FAIL;
915 	struct c2h_evt_hdr_88xx *c2h_evt;
916 	int i;
917 	u8 trigger;
918 
919 	if (buf == NULL)
920 		goto exit;
921 
922 	trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
923 
924 	if (trigger == C2H_EVT_HOST_CLOSE)
925 		goto exit; /* Not ready */
926 	else if (trigger != C2H_EVT_FW_CLOSE)
927 		goto clear_evt; /* Not a valid value */
928 
929 	c2h_evt = (struct c2h_evt_hdr_88xx *)buf;
930 
931 	memset(c2h_evt, 0, 16);
932 
933 	c2h_evt->id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
934 	c2h_evt->seq = rtw_read8(adapter, REG_C2HEVT_CMD_SEQ_88XX);
935 	c2h_evt->plen = rtw_read8(adapter, REG_C2HEVT_CMD_LEN_88XX);
936 
937 	RT_PRINT_DATA(
938 		_module_hal_init_c_,
939 		_drv_info_,
940 		"c2h_evt_read(): ",
941 		&c2h_evt,
942 		sizeof(c2h_evt)
943 	);
944 
945 	DBG_871X(
946 		"%s id:%u, len:%u, seq:%u, trigger:0x%02x\n",
947 		__func__,
948 		c2h_evt->id,
949 		c2h_evt->plen,
950 		c2h_evt->seq,
951 		trigger
952 	);
953 
954 	/* Read the content */
955 	for (i = 0; i < c2h_evt->plen; i++)
956 		c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);
957 
958 	RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): Command Content:\n",
959 		c2h_evt->payload, c2h_evt->plen);
960 
961 	ret = _SUCCESS;
962 
963 clear_evt:
964 	/*
965 	* Clear event to notify FW we have read the command.
966 	* If this field isn't clear, the FW won't update the next command message.
967 	*/
968 	c2h_evt_clear(adapter);
969 exit:
970 	return ret;
971 }
972 
973 
974 u8  rtw_hal_networktype_to_raid(struct adapter *adapter, struct sta_info *psta)
975 {
976 	return networktype_to_raid_ex(adapter, psta);
977 }
978 
979 u8 rtw_get_mgntframe_raid(struct adapter *adapter, unsigned char network_type)
980 {
981 
982 	u8 raid;
983 	raid = (network_type & WIRELESS_11B) ? RATEID_IDX_B : RATEID_IDX_G;
984 	return raid;
985 }
986 
987 void rtw_hal_update_sta_rate_mask(struct adapter *padapter, struct sta_info *psta)
988 {
989 	u8 i, rf_type, limit;
990 	u32 tx_ra_bitmap;
991 
992 	if (psta == NULL)
993 		return;
994 
995 	tx_ra_bitmap = 0;
996 
997 	/* b/g mode ra_bitmap */
998 	for (i = 0; i < sizeof(psta->bssrateset); i++) {
999 		if (psta->bssrateset[i])
1000 			tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
1001 	}
1002 
1003 	/* n mode ra_bitmap */
1004 	if (psta->htpriv.ht_option) {
1005 		rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
1006 		if (rf_type == RF_2T2R)
1007 			limit = 16; /*  2R */
1008 		else
1009 			limit = 8; /*   1R */
1010 
1011 		for (i = 0; i < limit; i++) {
1012 			if (psta->htpriv.ht_cap.supp_mcs_set[i/8] & BIT(i%8))
1013 				tx_ra_bitmap |= BIT(i+12);
1014 		}
1015 	}
1016 
1017 	psta->ra_mask = tx_ra_bitmap;
1018 	psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f;
1019 }
1020 
1021 void hw_var_port_switch(struct adapter *adapter)
1022 {
1023 }
1024 
1025 void SetHwReg(struct adapter *adapter, u8 variable, u8 *val)
1026 {
1027 	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1028 	DM_ODM_T *odm = &(hal_data->odmpriv);
1029 
1030 	switch (variable) {
1031 	case HW_VAR_PORT_SWITCH:
1032 		hw_var_port_switch(adapter);
1033 		break;
1034 	case HW_VAR_INIT_RTS_RATE:
1035 		rtw_warn_on(1);
1036 		break;
1037 	case HW_VAR_SEC_CFG:
1038 	{
1039 		u16 reg_scr;
1040 
1041 		reg_scr = rtw_read16(adapter, REG_SECCFG);
1042 		rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
1043 	}
1044 		break;
1045 	case HW_VAR_SEC_DK_CFG:
1046 	{
1047 		struct security_priv *sec = &adapter->securitypriv;
1048 		u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
1049 
1050 		if (val) { /* Enable default key related setting */
1051 			reg_scr |= SCR_TXBCUSEDK;
1052 			if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
1053 				reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
1054 		} else /* Disable default key related setting */
1055 			reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
1056 
1057 		rtw_write8(adapter, REG_SECCFG, reg_scr);
1058 	}
1059 		break;
1060 	case HW_VAR_DM_FLAG:
1061 		odm->SupportAbility = *((u32 *)val);
1062 		break;
1063 	case HW_VAR_DM_FUNC_OP:
1064 		if (*((u8 *)val) == true) {
1065 			/* save dm flag */
1066 			odm->BK_SupportAbility = odm->SupportAbility;
1067 		} else {
1068 			/* restore dm flag */
1069 			odm->SupportAbility = odm->BK_SupportAbility;
1070 		}
1071 		break;
1072 	case HW_VAR_DM_FUNC_SET:
1073 		if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) {
1074 			struct dm_priv *dm = &hal_data->dmpriv;
1075 			dm->DMFlag = dm->InitDMFlag;
1076 			odm->SupportAbility = dm->InitODMFlag;
1077 		} else {
1078 			odm->SupportAbility |= *((u32 *)val);
1079 		}
1080 		break;
1081 	case HW_VAR_DM_FUNC_CLR:
1082 		/*
1083 		* input is already a mask to clear function
1084 		* don't invert it again! George, Lucas@20130513
1085 		*/
1086 		odm->SupportAbility &= *((u32 *)val);
1087 		break;
1088 	case HW_VAR_AMPDU_MIN_SPACE:
1089 		/* TODO - Is something needed here? */
1090 		break;
1091 	case HW_VAR_WIRELESS_MODE:
1092 		/* TODO - Is something needed here? */
1093 		break;
1094 	default:
1095 		DBG_871X_LEVEL(
1096 			_drv_always_,
1097 			FUNC_ADPT_FMT" variable(%d) not defined!\n",
1098 			FUNC_ADPT_ARG(adapter),
1099 			variable
1100 		);
1101 		break;
1102 	}
1103 }
1104 
1105 void GetHwReg(struct adapter *adapter, u8 variable, u8 *val)
1106 {
1107 	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1108 	DM_ODM_T *odm = &(hal_data->odmpriv);
1109 
1110 	switch (variable) {
1111 	case HW_VAR_BASIC_RATE:
1112 		*((u16 *)val) = hal_data->BasicRateSet;
1113 		break;
1114 	case HW_VAR_DM_FLAG:
1115 		*((u32 *)val) = odm->SupportAbility;
1116 		break;
1117 	case HW_VAR_RF_TYPE:
1118 		*((u8 *)val) = hal_data->rf_type;
1119 		break;
1120 	default:
1121 		DBG_871X_LEVEL(
1122 			_drv_always_,
1123 			FUNC_ADPT_FMT" variable(%d) not defined!\n",
1124 			FUNC_ADPT_ARG(adapter),
1125 			variable
1126 		);
1127 		break;
1128 	}
1129 }
1130 
1131 
1132 
1133 
1134 u8 SetHalDefVar(
1135 	struct adapter *adapter, enum HAL_DEF_VARIABLE variable, void *value
1136 )
1137 {
1138 	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1139 	DM_ODM_T *odm = &(hal_data->odmpriv);
1140 	u8 bResult = _SUCCESS;
1141 
1142 	switch (variable) {
1143 	case HW_DEF_FA_CNT_DUMP:
1144 		/* ODM_COMP_COMMON */
1145 		if (*((u8 *)value))
1146 			odm->DebugComponents |= (ODM_COMP_DIG | ODM_COMP_FA_CNT);
1147 		else
1148 			odm->DebugComponents &= ~(ODM_COMP_DIG | ODM_COMP_FA_CNT);
1149 		break;
1150 	case HAL_DEF_DBG_RX_INFO_DUMP:
1151 		DBG_871X("============ Rx Info dump ===================\n");
1152 		DBG_871X("bLinked = %d, RSSI_Min = %d(%%)\n",
1153 			odm->bLinked, odm->RSSI_Min);
1154 
1155 		if (odm->bLinked) {
1156 			DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
1157 				HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);
1158 
1159 			#ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1160 			rtw_dump_raw_rssi_info(adapter);
1161 			#endif
1162 		}
1163 		break;
1164 	case HW_DEF_ODM_DBG_FLAG:
1165 		ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u64 *)value));
1166 		break;
1167 	case HW_DEF_ODM_DBG_LEVEL:
1168 		ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u32 *)value));
1169 		break;
1170 	case HAL_DEF_DBG_DM_FUNC:
1171 	{
1172 		u8 dm_func = *((u8 *)value);
1173 		struct dm_priv *dm = &hal_data->dmpriv;
1174 
1175 		if (dm_func == 0) { /* disable all dynamic func */
1176 			odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
1177 			DBG_8192C("==> Disable all dynamic function...\n");
1178 		} else if (dm_func == 1) {/* disable DIG */
1179 			odm->SupportAbility  &= (~DYNAMIC_BB_DIG);
1180 			DBG_8192C("==> Disable DIG...\n");
1181 		} else if (dm_func == 2) {/* disable High power */
1182 			odm->SupportAbility  &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
1183 		} else if (dm_func == 3) {/* disable tx power tracking */
1184 			odm->SupportAbility  &= (~DYNAMIC_RF_CALIBRATION);
1185 			DBG_8192C("==> Disable tx power tracking...\n");
1186 		} else if (dm_func == 4) {/* disable BT coexistence */
1187 			dm->DMFlag &= (~DYNAMIC_FUNC_BT);
1188 		} else if (dm_func == 5) {/* disable antenna diversity */
1189 			odm->SupportAbility  &= (~DYNAMIC_BB_ANT_DIV);
1190 		} else if (dm_func == 6) {/* turn on all dynamic func */
1191 			if (!(odm->SupportAbility  & DYNAMIC_BB_DIG)) {
1192 				DIG_T	*pDigTable = &odm->DM_DigTable;
1193 				pDigTable->CurIGValue = rtw_read8(adapter, 0xc50);
1194 			}
1195 			dm->DMFlag |= DYNAMIC_FUNC_BT;
1196 			odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
1197 			DBG_8192C("==> Turn on all dynamic function...\n");
1198 		}
1199 	}
1200 		break;
1201 	case HAL_DEF_DBG_DUMP_RXPKT:
1202 		hal_data->bDumpRxPkt = *((u8 *)value);
1203 		break;
1204 	case HAL_DEF_DBG_DUMP_TXPKT:
1205 		hal_data->bDumpTxPkt = *((u8 *)value);
1206 		break;
1207 	case HAL_DEF_ANT_DETECT:
1208 		hal_data->AntDetection = *((u8 *)value);
1209 		break;
1210 	default:
1211 		DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __func__, variable);
1212 		bResult = _FAIL;
1213 		break;
1214 	}
1215 
1216 	return bResult;
1217 }
1218 
1219 u8 GetHalDefVar(
1220 	struct adapter *adapter, enum HAL_DEF_VARIABLE variable, void *value
1221 )
1222 {
1223 	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1224 	DM_ODM_T *odm = &(hal_data->odmpriv);
1225 	u8 bResult = _SUCCESS;
1226 
1227 	switch (variable) {
1228 	case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
1229 		{
1230 			struct mlme_priv *pmlmepriv;
1231 			struct sta_priv *pstapriv;
1232 			struct sta_info *psta;
1233 
1234 			pmlmepriv = &adapter->mlmepriv;
1235 			pstapriv = &adapter->stapriv;
1236 			psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
1237 			if (psta)
1238 				*((int *)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;
1239 		}
1240 		break;
1241 	case HW_DEF_ODM_DBG_FLAG:
1242 		*((u64 *)value) = odm->DebugComponents;
1243 		break;
1244 	case HW_DEF_ODM_DBG_LEVEL:
1245 		*((u32 *)value) = odm->DebugLevel;
1246 		break;
1247 	case HAL_DEF_DBG_DM_FUNC:
1248 		*((u32 *)value) = hal_data->odmpriv.SupportAbility;
1249 		break;
1250 	case HAL_DEF_DBG_DUMP_RXPKT:
1251 		*((u8 *)value) = hal_data->bDumpRxPkt;
1252 		break;
1253 	case HAL_DEF_DBG_DUMP_TXPKT:
1254 		*((u8 *)value) = hal_data->bDumpTxPkt;
1255 		break;
1256 	case HAL_DEF_ANT_DETECT:
1257 		*((u8 *)value) = hal_data->AntDetection;
1258 		break;
1259 	case HAL_DEF_MACID_SLEEP:
1260 		*(u8 *)value = false;
1261 		break;
1262 	case HAL_DEF_TX_PAGE_SIZE:
1263 		*((u32 *)value) = PAGE_SIZE_128;
1264 		break;
1265 	default:
1266 		DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __func__, variable);
1267 		bResult = _FAIL;
1268 		break;
1269 	}
1270 
1271 	return bResult;
1272 }
1273 
1274 void GetHalODMVar(
1275 	struct adapter *Adapter,
1276 	enum HAL_ODM_VARIABLE eVariable,
1277 	void *pValue1,
1278 	void *pValue2
1279 )
1280 {
1281 	switch (eVariable) {
1282 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
1283 	case HAL_ODM_NOISE_MONITOR:
1284 		{
1285 			struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
1286 			u8 chan = *(u8 *)pValue1;
1287 			*(s16 *)pValue2 = pHalData->noise[chan];
1288 			#ifdef DBG_NOISE_MONITOR
1289 			DBG_8192C("### Noise monitor chan(%d)-noise:%d (dBm) ###\n",
1290 				chan, pHalData->noise[chan]);
1291 			#endif
1292 
1293 		}
1294 		break;
1295 #endif/* ifdef CONFIG_BACKGROUND_NOISE_MONITOR */
1296 	default:
1297 		break;
1298 	}
1299 }
1300 
1301 void SetHalODMVar(
1302 	struct adapter *Adapter,
1303 	enum HAL_ODM_VARIABLE eVariable,
1304 	void *pValue1,
1305 	bool bSet
1306 )
1307 {
1308 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
1309 	PDM_ODM_T podmpriv = &pHalData->odmpriv;
1310 	/* _irqL irqL; */
1311 	switch (eVariable) {
1312 	case HAL_ODM_STA_INFO:
1313 		{
1314 			struct sta_info *psta = (struct sta_info *)pValue1;
1315 			if (bSet) {
1316 				DBG_8192C("### Set STA_(%d) info ###\n", psta->mac_id);
1317 				ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, psta);
1318 			} else {
1319 				DBG_8192C("### Clean STA_(%d) info ###\n", psta->mac_id);
1320 				/* spin_lock_bh(&pHalData->odm_stainfo_lock); */
1321 				ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, NULL);
1322 
1323 				/* spin_unlock_bh(&pHalData->odm_stainfo_lock); */
1324 		    }
1325 		}
1326 		break;
1327 	case HAL_ODM_P2P_STATE:
1328 			ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
1329 		break;
1330 	case HAL_ODM_WIFI_DISPLAY_STATE:
1331 			ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
1332 		break;
1333 	#if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
1334 	case HAL_ODM_NOISE_MONITOR:
1335 		{
1336 			struct noise_info *pinfo = (struct noise_info *)pValue1;
1337 
1338 			#ifdef DBG_NOISE_MONITOR
1339 			DBG_8192C("### Noise monitor chan(%d)-bPauseDIG:%d, IGIValue:0x%02x, max_time:%d (ms) ###\n",
1340 				pinfo->chan, pinfo->bPauseDIG, pinfo->IGIValue, pinfo->max_time);
1341 			#endif
1342 
1343 			pHalData->noise[pinfo->chan] = ODM_InbandNoise_Monitor(podmpriv, pinfo->bPauseDIG, pinfo->IGIValue, pinfo->max_time);
1344 			DBG_871X("chan_%d, noise = %d (dBm)\n", pinfo->chan, pHalData->noise[pinfo->chan]);
1345 			#ifdef DBG_NOISE_MONITOR
1346 			DBG_871X("noise_a = %d, noise_b = %d  noise_all:%d\n",
1347 				podmpriv->noise_level.noise[ODM_RF_PATH_A],
1348 				podmpriv->noise_level.noise[ODM_RF_PATH_B],
1349 				podmpriv->noise_level.noise_all);
1350 			#endif
1351 		}
1352 		break;
1353 	#endif/* ifdef CONFIG_BACKGROUND_NOISE_MONITOR */
1354 
1355 	default:
1356 		break;
1357 	}
1358 }
1359 
1360 
1361 bool eqNByte(u8 *str1, u8 *str2, u32 num)
1362 {
1363 	if (num == 0)
1364 		return false;
1365 	while (num > 0) {
1366 		num--;
1367 		if (str1[num] != str2[num])
1368 			return false;
1369 	}
1370 	return true;
1371 }
1372 
1373 /*  */
1374 /* 	Description: */
1375 /* 		Return true if chTmp is represent for hex digit and */
1376 /* 		false otherwise. */
1377 /*  */
1378 /*  */
1379 bool IsHexDigit(char chTmp)
1380 {
1381 	if (
1382 		(chTmp >= '0' && chTmp <= '9') ||
1383 		(chTmp >= 'a' && chTmp <= 'f') ||
1384 		(chTmp >= 'A' && chTmp <= 'F')
1385 	)
1386 		return true;
1387 	else
1388 		return false;
1389 }
1390 
1391 
1392 /*  */
1393 /* 	Description: */
1394 /* 		Translate a character to hex digit. */
1395 /*  */
1396 u32 MapCharToHexDigit(char chTmp)
1397 {
1398 	if (chTmp >= '0' && chTmp <= '9')
1399 		return (chTmp - '0');
1400 	else if (chTmp >= 'a' && chTmp <= 'f')
1401 		return (10 + (chTmp - 'a'));
1402 	else if (chTmp >= 'A' && chTmp <= 'F')
1403 		return (10 + (chTmp - 'A'));
1404 	else
1405 		return 0;
1406 }
1407 
1408 
1409 
1410 /* 	Description: */
1411 /* 		Parse hex number from the string pucStr. */
1412 bool GetHexValueFromString(char *szStr, u32 *pu4bVal, u32 *pu4bMove)
1413 {
1414 	char *szScan = szStr;
1415 
1416 	/*  Check input parameter. */
1417 	if (szStr == NULL || pu4bVal == NULL || pu4bMove == NULL) {
1418 		DBG_871X("GetHexValueFromString(): Invalid input arguments! szStr: %p, pu4bVal: %p, pu4bMove: %p\n",
1419 			 szStr, pu4bVal, pu4bMove);
1420 		return false;
1421 	}
1422 
1423 	/*  Initialize output. */
1424 	*pu4bMove = 0;
1425 	*pu4bVal = 0;
1426 
1427 	/*  Skip leading space. */
1428 	while (*szScan != '\0' && (*szScan == ' ' || *szScan == '\t')) {
1429 		szScan++;
1430 		(*pu4bMove)++;
1431 	}
1432 
1433 	/*  Skip leading '0x' or '0X'. */
1434 	if (*szScan == '0' && (*(szScan+1) == 'x' || *(szScan+1) == 'X')) {
1435 		szScan += 2;
1436 		(*pu4bMove) += 2;
1437 	}
1438 
1439 	/*  Check if szScan is now pointer to a character for hex digit, */
1440 	/*  if not, it means this is not a valid hex number. */
1441 	if (!IsHexDigit(*szScan))
1442 		return false;
1443 
1444 	/*  Parse each digit. */
1445 	do {
1446 		(*pu4bVal) <<= 4;
1447 		*pu4bVal += MapCharToHexDigit(*szScan);
1448 
1449 		szScan++;
1450 		(*pu4bMove)++;
1451 	} while (IsHexDigit(*szScan));
1452 
1453 	return true;
1454 }
1455 
1456 bool GetFractionValueFromString(
1457 	char *szStr, u8 *pInteger, u8 *pFraction, u32 *pu4bMove
1458 )
1459 {
1460 	char *szScan = szStr;
1461 
1462 	/*  Initialize output. */
1463 	*pu4bMove = 0;
1464 	*pInteger = 0;
1465 	*pFraction = 0;
1466 
1467 	/*  Skip leading space. */
1468 	while (*szScan != '\0' &&	(*szScan == ' ' || *szScan == '\t')) {
1469 		++szScan;
1470 		++(*pu4bMove);
1471 	}
1472 
1473 	/*  Parse each digit. */
1474 	do {
1475 		(*pInteger) *= 10;
1476 		*pInteger += (*szScan - '0');
1477 
1478 		++szScan;
1479 		++(*pu4bMove);
1480 
1481 		if (*szScan == '.') {
1482 			++szScan;
1483 			++(*pu4bMove);
1484 
1485 			if (*szScan < '0' || *szScan > '9')
1486 				return false;
1487 			else {
1488 				*pFraction = *szScan - '0';
1489 				++szScan;
1490 				++(*pu4bMove);
1491 				return true;
1492 			}
1493 		}
1494 	} while (*szScan >= '0' && *szScan <= '9');
1495 
1496 	return true;
1497 }
1498 
1499 /*  */
1500 /* 	Description: */
1501 /* 		Return true if szStr is comment out with leading "//". */
1502 /*  */
1503 bool IsCommentString(char *szStr)
1504 {
1505 	if (*szStr == '/' && *(szStr+1) == '/')
1506 		return true;
1507 	else
1508 		return false;
1509 }
1510 
1511 bool GetU1ByteIntegerFromStringInDecimal(char *Str, u8 *pInt)
1512 {
1513 	u16 i = 0;
1514 	*pInt = 0;
1515 
1516 	while (Str[i] != '\0') {
1517 		if (Str[i] >= '0' && Str[i] <= '9') {
1518 			*pInt *= 10;
1519 			*pInt += (Str[i] - '0');
1520 		} else
1521 			return false;
1522 
1523 		++i;
1524 	}
1525 
1526 	return true;
1527 }
1528 
1529 /*  <20121004, Kordan> For example,
1530  *  ParseQualifiedString(inString, 0, outString, '[', ']') gets "Kordan" from
1531  *  a string "Hello [Kordan]".
1532  *  If RightQualifier does not exist, it will hang in the while loop
1533  */
1534 bool ParseQualifiedString(
1535 	char *In, u32 *Start, char *Out, char LeftQualifier, char RightQualifier
1536 )
1537 {
1538 	u32 i = 0, j = 0;
1539 	char c = In[(*Start)++];
1540 
1541 	if (c != LeftQualifier)
1542 		return false;
1543 
1544 	i = (*Start);
1545 	while ((c = In[(*Start)++]) != RightQualifier)
1546 		; /*  find ']' */
1547 	j = (*Start) - 2;
1548 	strncpy((char *)Out, (const char *)(In+i), j-i+1);
1549 
1550 	return true;
1551 }
1552 
1553 bool isAllSpaceOrTab(u8 *data, u8 size)
1554 {
1555 	u8 cnt = 0, NumOfSpaceAndTab = 0;
1556 
1557 	while (size > cnt) {
1558 		if (data[cnt] == ' ' || data[cnt] == '\t' || data[cnt] == '\0')
1559 			++NumOfSpaceAndTab;
1560 
1561 		++cnt;
1562 	}
1563 
1564 	return size == NumOfSpaceAndTab;
1565 }
1566 
1567 
1568 void rtw_hal_check_rxfifo_full(struct adapter *adapter)
1569 {
1570 	struct dvobj_priv *psdpriv = adapter->dvobj;
1571 	struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
1572 	int save_cnt = false;
1573 
1574 	/* switch counter to RX fifo */
1575 	/* printk("8723b or 8192e , MAC_667 set 0xf0\n"); */
1576 	rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xf0);
1577 	save_cnt = true;
1578 	/* todo: other chips */
1579 
1580 	if (save_cnt) {
1581 		/* rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0); */
1582 		pdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;
1583 		pdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);
1584 		pdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;
1585 	}
1586 }
1587 
1588 void linked_info_dump(struct adapter *padapter, u8 benable)
1589 {
1590 	struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
1591 
1592 	if (padapter->bLinkInfoDump == benable)
1593 		return;
1594 
1595 	DBG_871X("%s %s\n", __func__, (benable) ? "enable" : "disable");
1596 
1597 	if (benable) {
1598 		pwrctrlpriv->org_power_mgnt = pwrctrlpriv->power_mgnt;/* keep org value */
1599 		rtw_pm_set_lps(padapter, PS_MODE_ACTIVE);
1600 
1601 		pwrctrlpriv->ips_org_mode = pwrctrlpriv->ips_mode;/* keep org value */
1602 		rtw_pm_set_ips(padapter, IPS_NONE);
1603 	} else {
1604 		rtw_pm_set_ips(padapter, pwrctrlpriv->ips_org_mode);
1605 
1606 		rtw_pm_set_lps(padapter, pwrctrlpriv->ips_org_mode);
1607 	}
1608 	padapter->bLinkInfoDump = benable;
1609 }
1610 
1611 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1612 void rtw_get_raw_rssi_info(void *sel, struct adapter *padapter)
1613 {
1614 	u8 isCCKrate, rf_path;
1615 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1616 	struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1617 
1618 	DBG_871X_SEL_NL(
1619 		sel,
1620 		"RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1621 		HDATA_RATE(psample_pkt_rssi->data_rate),
1622 		psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all
1623 	);
1624 
1625 	isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M) ? true : false;
1626 
1627 	if (isCCKrate)
1628 		psample_pkt_rssi->mimo_singal_strength[0] = psample_pkt_rssi->pwdball;
1629 
1630 	for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1631 		DBG_871X_SEL_NL(
1632 			sel,
1633 			"RF_PATH_%d =>singal_strength:%d(%%), singal_quality:%d(%%)\n",
1634 			rf_path, psample_pkt_rssi->mimo_singal_strength[rf_path],
1635 			psample_pkt_rssi->mimo_singal_quality[rf_path]
1636 		);
1637 
1638 		if (!isCCKrate) {
1639 			DBG_871X_SEL_NL(
1640 				sel,
1641 				"\trx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1642 				psample_pkt_rssi->ofdm_pwr[rf_path],
1643 				psample_pkt_rssi->ofdm_snr[rf_path]
1644 			);
1645 		}
1646 	}
1647 }
1648 
1649 void rtw_dump_raw_rssi_info(struct adapter *padapter)
1650 {
1651 	u8 isCCKrate, rf_path;
1652 	struct hal_com_data *pHalData =  GET_HAL_DATA(padapter);
1653 	struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1654 	DBG_871X("============ RAW Rx Info dump ===================\n");
1655 	DBG_871X("RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1656 			HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);
1657 
1658 	isCCKrate = (psample_pkt_rssi->data_rate <= DESC_RATE11M) ? true : false;
1659 
1660 	if (isCCKrate)
1661 		psample_pkt_rssi->mimo_singal_strength[0] = psample_pkt_rssi->pwdball;
1662 
1663 	for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1664 		DBG_871X("RF_PATH_%d =>singal_strength:%d(%%), singal_quality:%d(%%)"
1665 			, rf_path, psample_pkt_rssi->mimo_singal_strength[rf_path], psample_pkt_rssi->mimo_singal_quality[rf_path]);
1666 
1667 		if (!isCCKrate) {
1668 			printk(", rx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1669 			psample_pkt_rssi->ofdm_pwr[rf_path], psample_pkt_rssi->ofdm_snr[rf_path]);
1670 		} else {
1671 			printk("\n");
1672 		}
1673 	}
1674 }
1675 
1676 void rtw_store_phy_info(struct adapter *padapter, union recv_frame *prframe)
1677 {
1678 	u8 isCCKrate, rf_path;
1679 	struct hal_com_data *pHalData =  GET_HAL_DATA(padapter);
1680 	struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
1681 
1682 	PODM_PHY_INFO_T pPhyInfo  = (PODM_PHY_INFO_T)(&pattrib->phy_info);
1683 	struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1684 
1685 	psample_pkt_rssi->data_rate = pattrib->data_rate;
1686 	isCCKrate = (pattrib->data_rate <= DESC_RATE11M) ? true : false;
1687 
1688 	psample_pkt_rssi->pwdball = pPhyInfo->RxPWDBAll;
1689 	psample_pkt_rssi->pwr_all = pPhyInfo->RecvSignalPower;
1690 
1691 	for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1692 		psample_pkt_rssi->mimo_singal_strength[rf_path] = pPhyInfo->RxMIMOSignalStrength[rf_path];
1693 		psample_pkt_rssi->mimo_singal_quality[rf_path] = pPhyInfo->RxMIMOSignalQuality[rf_path];
1694 		if (!isCCKrate) {
1695 			psample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];
1696 			psample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];
1697 		}
1698 	}
1699 }
1700 #endif
1701 
1702 static u32 Array_kfreemap[] = {
1703 	0xf8, 0xe,
1704 	0xf6, 0xc,
1705 	0xf4, 0xa,
1706 	0xf2, 0x8,
1707 	0xf0, 0x6,
1708 	0xf3, 0x4,
1709 	0xf5, 0x2,
1710 	0xf7, 0x0,
1711 	0xf9, 0x0,
1712 	0xfc, 0x0,
1713 };
1714 
1715 void rtw_bb_rf_gain_offset(struct adapter *padapter)
1716 {
1717 	u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
1718 	u32 res, i = 0;
1719 	u32 ArrayLen = sizeof(Array_kfreemap)/sizeof(u32);
1720 	u32 *Array = Array_kfreemap;
1721 	u32 v1 = 0, v2 = 0, target = 0;
1722 	/* DBG_871X("+%s value: 0x%02x+\n", __func__, value); */
1723 
1724 	if (value & BIT4) {
1725 		DBG_871X("Offset RF Gain.\n");
1726 		DBG_871X("Offset RF Gain.  padapter->eeprompriv.EEPROMRFGainVal = 0x%x\n", padapter->eeprompriv.EEPROMRFGainVal);
1727 		if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
1728 			res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
1729 			res &= 0xfff87fff;
1730 			DBG_871X("Offset RF Gain. before reg 0x7f = 0x%08x\n", res);
1731 			/* res &= 0xfff87fff; */
1732 			for (i = 0; i < ArrayLen; i += 2) {
1733 				v1 = Array[i];
1734 				v2 = Array[i+1];
1735 				if (v1 == padapter->eeprompriv.EEPROMRFGainVal) {
1736 					DBG_871X("Offset RF Gain. got v1 = 0x%x , v2 = 0x%x\n", v1, v2);
1737 					target = v2;
1738 					break;
1739 				}
1740 			}
1741 			DBG_871X("padapter->eeprompriv.EEPROMRFGainVal = 0x%x , Gain offset Target Value = 0x%x\n", padapter->eeprompriv.EEPROMRFGainVal, target);
1742 			PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
1743 
1744 			/* res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; */
1745 			/* rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); */
1746 			res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
1747 			DBG_871X("Offset RF Gain. After reg 0x7f = 0x%08x\n", res);
1748 		} else
1749 			DBG_871X("Offset RF Gain.  padapter->eeprompriv.EEPROMRFGainVal = 0x%x	!= 0xff, didn't run Kfree\n", padapter->eeprompriv.EEPROMRFGainVal);
1750 	} else
1751 		DBG_871X("Using the default RF gain.\n");
1752 }
1753