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