1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
14 ******************************************************************************/
17 #include <drv_types.h>
18 #include <rtw_debug.h>
19 #include "hal_com_h2c.h"
21 #include "odm_precomp.h"
23 u8
rtw_hal_data_init(struct adapter
*padapter
)
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("cant not alloc memory for HAL DATA\n");
36 void rtw_hal_data_deinit(struct adapter
*padapter
)
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;
49 void dump_chip_info(HAL_VERSION ChipVersion
)
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");
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_");
80 cnt
+= sprintf((buf
+cnt
), "UNKNOWN_CUT(%d)_", ChipVersion
.CUTVersion
);
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_");
89 cnt
+= sprintf((buf
+cnt
), "UNKNOWN_RFTYPE(%d)_", ChipVersion
.RFType
);
91 cnt
+= sprintf((buf
+cnt
), "RomVer(%d)\n", ChipVersion
.ROMVer
);
97 #define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
101 *Use hardware(efuse), driver parameter(registry) and default channel plan
102 *to decide which one should be used.
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
114 *Final channel plan decision
117 u8
hal_com_config_channel_plan(
118 struct adapter
*padapter
,
125 struct hal_com_data
*pHalData
;
128 pHalData
= GET_HAL_DATA(padapter
);
129 pHalData
->bDisableSWChannelPlan
= false;
130 chnlPlan
= def_channel_plan
;
132 if (0xFF == hw_channel_plan
)
135 if (false == AutoLoadFail
) {
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 */
145 chnlPlan
= hw_chnlPlan
;
150 (false == pHalData
->bDisableSWChannelPlan
) &&
151 rtw_is_channel_plan_valid(sw_channel_plan
)
153 chnlPlan
= sw_channel_plan
;
158 bool HAL_IsLegalChannel(struct adapter
*Adapter
, u32 Channel
)
160 bool bLegalChannel
= true;
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");
171 bLegalChannel
= false;
172 DBG_871X("Channel is Invalid !!!\n");
175 return bLegalChannel
;
178 u8
MRateToHwRate(u8 rate
)
180 u8 ret
= DESC_RATE1M
;
250 ret
= DESC_RATEMCS10
;
253 ret
= DESC_RATEMCS11
;
256 ret
= DESC_RATEMCS12
;
259 ret
= DESC_RATEMCS13
;
262 ret
= DESC_RATEMCS14
;
265 ret
= DESC_RATEMCS15
;
268 ret
= DESC_RATEMCS16
;
271 ret
= DESC_RATEMCS17
;
274 ret
= DESC_RATEMCS18
;
277 ret
= DESC_RATEMCS19
;
280 ret
= DESC_RATEMCS20
;
283 ret
= DESC_RATEMCS21
;
286 ret
= DESC_RATEMCS22
;
289 ret
= DESC_RATEMCS23
;
292 ret
= DESC_RATEMCS24
;
295 ret
= DESC_RATEMCS25
;
298 ret
= DESC_RATEMCS26
;
301 ret
= DESC_RATEMCS27
;
304 ret
= DESC_RATEMCS28
;
307 ret
= DESC_RATEMCS29
;
310 ret
= DESC_RATEMCS30
;
313 ret
= DESC_RATEMCS31
;
315 case MGN_VHT1SS_MCS0
:
316 ret
= DESC_RATEVHTSS1MCS0
;
318 case MGN_VHT1SS_MCS1
:
319 ret
= DESC_RATEVHTSS1MCS1
;
321 case MGN_VHT1SS_MCS2
:
322 ret
= DESC_RATEVHTSS1MCS2
;
324 case MGN_VHT1SS_MCS3
:
325 ret
= DESC_RATEVHTSS1MCS3
;
327 case MGN_VHT1SS_MCS4
:
328 ret
= DESC_RATEVHTSS1MCS4
;
330 case MGN_VHT1SS_MCS5
:
331 ret
= DESC_RATEVHTSS1MCS5
;
333 case MGN_VHT1SS_MCS6
:
334 ret
= DESC_RATEVHTSS1MCS6
;
336 case MGN_VHT1SS_MCS7
:
337 ret
= DESC_RATEVHTSS1MCS7
;
339 case MGN_VHT1SS_MCS8
:
340 ret
= DESC_RATEVHTSS1MCS8
;
342 case MGN_VHT1SS_MCS9
:
343 ret
= DESC_RATEVHTSS1MCS9
;
345 case MGN_VHT2SS_MCS0
:
346 ret
= DESC_RATEVHTSS2MCS0
;
348 case MGN_VHT2SS_MCS1
:
349 ret
= DESC_RATEVHTSS2MCS1
;
351 case MGN_VHT2SS_MCS2
:
352 ret
= DESC_RATEVHTSS2MCS2
;
354 case MGN_VHT2SS_MCS3
:
355 ret
= DESC_RATEVHTSS2MCS3
;
357 case MGN_VHT2SS_MCS4
:
358 ret
= DESC_RATEVHTSS2MCS4
;
360 case MGN_VHT2SS_MCS5
:
361 ret
= DESC_RATEVHTSS2MCS5
;
363 case MGN_VHT2SS_MCS6
:
364 ret
= DESC_RATEVHTSS2MCS6
;
366 case MGN_VHT2SS_MCS7
:
367 ret
= DESC_RATEVHTSS2MCS7
;
369 case MGN_VHT2SS_MCS8
:
370 ret
= DESC_RATEVHTSS2MCS8
;
372 case MGN_VHT2SS_MCS9
:
373 ret
= DESC_RATEVHTSS2MCS9
;
375 case MGN_VHT3SS_MCS0
:
376 ret
= DESC_RATEVHTSS3MCS0
;
378 case MGN_VHT3SS_MCS1
:
379 ret
= DESC_RATEVHTSS3MCS1
;
381 case MGN_VHT3SS_MCS2
:
382 ret
= DESC_RATEVHTSS3MCS2
;
384 case MGN_VHT3SS_MCS3
:
385 ret
= DESC_RATEVHTSS3MCS3
;
387 case MGN_VHT3SS_MCS4
:
388 ret
= DESC_RATEVHTSS3MCS4
;
390 case MGN_VHT3SS_MCS5
:
391 ret
= DESC_RATEVHTSS3MCS5
;
393 case MGN_VHT3SS_MCS6
:
394 ret
= DESC_RATEVHTSS3MCS6
;
396 case MGN_VHT3SS_MCS7
:
397 ret
= DESC_RATEVHTSS3MCS7
;
399 case MGN_VHT3SS_MCS8
:
400 ret
= DESC_RATEVHTSS3MCS8
;
402 case MGN_VHT3SS_MCS9
:
403 ret
= DESC_RATEVHTSS3MCS9
;
405 case MGN_VHT4SS_MCS0
:
406 ret
= DESC_RATEVHTSS4MCS0
;
408 case MGN_VHT4SS_MCS1
:
409 ret
= DESC_RATEVHTSS4MCS1
;
411 case MGN_VHT4SS_MCS2
:
412 ret
= DESC_RATEVHTSS4MCS2
;
414 case MGN_VHT4SS_MCS3
:
415 ret
= DESC_RATEVHTSS4MCS3
;
417 case MGN_VHT4SS_MCS4
:
418 ret
= DESC_RATEVHTSS4MCS4
;
420 case MGN_VHT4SS_MCS5
:
421 ret
= DESC_RATEVHTSS4MCS5
;
423 case MGN_VHT4SS_MCS6
:
424 ret
= DESC_RATEVHTSS4MCS6
;
426 case MGN_VHT4SS_MCS7
:
427 ret
= DESC_RATEVHTSS4MCS7
;
429 case MGN_VHT4SS_MCS8
:
430 ret
= DESC_RATEVHTSS4MCS8
;
432 case MGN_VHT4SS_MCS9
:
433 ret
= DESC_RATEVHTSS4MCS9
;
442 u8
HwRateToMRate(u8 rate
)
444 u8 ret_rate
= MGN_1M
;
514 ret_rate
= MGN_MCS10
;
517 ret_rate
= MGN_MCS11
;
520 ret_rate
= MGN_MCS12
;
523 ret_rate
= MGN_MCS13
;
526 ret_rate
= MGN_MCS14
;
529 ret_rate
= MGN_MCS15
;
532 ret_rate
= MGN_MCS16
;
535 ret_rate
= MGN_MCS17
;
538 ret_rate
= MGN_MCS18
;
541 ret_rate
= MGN_MCS19
;
544 ret_rate
= MGN_MCS20
;
547 ret_rate
= MGN_MCS21
;
550 ret_rate
= MGN_MCS22
;
553 ret_rate
= MGN_MCS23
;
556 ret_rate
= MGN_MCS24
;
559 ret_rate
= MGN_MCS25
;
562 ret_rate
= MGN_MCS26
;
565 ret_rate
= MGN_MCS27
;
568 ret_rate
= MGN_MCS28
;
571 ret_rate
= MGN_MCS29
;
574 ret_rate
= MGN_MCS30
;
577 ret_rate
= MGN_MCS31
;
579 case DESC_RATEVHTSS1MCS0
:
580 ret_rate
= MGN_VHT1SS_MCS0
;
582 case DESC_RATEVHTSS1MCS1
:
583 ret_rate
= MGN_VHT1SS_MCS1
;
585 case DESC_RATEVHTSS1MCS2
:
586 ret_rate
= MGN_VHT1SS_MCS2
;
588 case DESC_RATEVHTSS1MCS3
:
589 ret_rate
= MGN_VHT1SS_MCS3
;
591 case DESC_RATEVHTSS1MCS4
:
592 ret_rate
= MGN_VHT1SS_MCS4
;
594 case DESC_RATEVHTSS1MCS5
:
595 ret_rate
= MGN_VHT1SS_MCS5
;
597 case DESC_RATEVHTSS1MCS6
:
598 ret_rate
= MGN_VHT1SS_MCS6
;
600 case DESC_RATEVHTSS1MCS7
:
601 ret_rate
= MGN_VHT1SS_MCS7
;
603 case DESC_RATEVHTSS1MCS8
:
604 ret_rate
= MGN_VHT1SS_MCS8
;
606 case DESC_RATEVHTSS1MCS9
:
607 ret_rate
= MGN_VHT1SS_MCS9
;
609 case DESC_RATEVHTSS2MCS0
:
610 ret_rate
= MGN_VHT2SS_MCS0
;
612 case DESC_RATEVHTSS2MCS1
:
613 ret_rate
= MGN_VHT2SS_MCS1
;
615 case DESC_RATEVHTSS2MCS2
:
616 ret_rate
= MGN_VHT2SS_MCS2
;
618 case DESC_RATEVHTSS2MCS3
:
619 ret_rate
= MGN_VHT2SS_MCS3
;
621 case DESC_RATEVHTSS2MCS4
:
622 ret_rate
= MGN_VHT2SS_MCS4
;
624 case DESC_RATEVHTSS2MCS5
:
625 ret_rate
= MGN_VHT2SS_MCS5
;
627 case DESC_RATEVHTSS2MCS6
:
628 ret_rate
= MGN_VHT2SS_MCS6
;
630 case DESC_RATEVHTSS2MCS7
:
631 ret_rate
= MGN_VHT2SS_MCS7
;
633 case DESC_RATEVHTSS2MCS8
:
634 ret_rate
= MGN_VHT2SS_MCS8
;
636 case DESC_RATEVHTSS2MCS9
:
637 ret_rate
= MGN_VHT2SS_MCS9
;
639 case DESC_RATEVHTSS3MCS0
:
640 ret_rate
= MGN_VHT3SS_MCS0
;
642 case DESC_RATEVHTSS3MCS1
:
643 ret_rate
= MGN_VHT3SS_MCS1
;
645 case DESC_RATEVHTSS3MCS2
:
646 ret_rate
= MGN_VHT3SS_MCS2
;
648 case DESC_RATEVHTSS3MCS3
:
649 ret_rate
= MGN_VHT3SS_MCS3
;
651 case DESC_RATEVHTSS3MCS4
:
652 ret_rate
= MGN_VHT3SS_MCS4
;
654 case DESC_RATEVHTSS3MCS5
:
655 ret_rate
= MGN_VHT3SS_MCS5
;
657 case DESC_RATEVHTSS3MCS6
:
658 ret_rate
= MGN_VHT3SS_MCS6
;
660 case DESC_RATEVHTSS3MCS7
:
661 ret_rate
= MGN_VHT3SS_MCS7
;
663 case DESC_RATEVHTSS3MCS8
:
664 ret_rate
= MGN_VHT3SS_MCS8
;
666 case DESC_RATEVHTSS3MCS9
:
667 ret_rate
= MGN_VHT3SS_MCS9
;
669 case DESC_RATEVHTSS4MCS0
:
670 ret_rate
= MGN_VHT4SS_MCS0
;
672 case DESC_RATEVHTSS4MCS1
:
673 ret_rate
= MGN_VHT4SS_MCS1
;
675 case DESC_RATEVHTSS4MCS2
:
676 ret_rate
= MGN_VHT4SS_MCS2
;
678 case DESC_RATEVHTSS4MCS3
:
679 ret_rate
= MGN_VHT4SS_MCS3
;
681 case DESC_RATEVHTSS4MCS4
:
682 ret_rate
= MGN_VHT4SS_MCS4
;
684 case DESC_RATEVHTSS4MCS5
:
685 ret_rate
= MGN_VHT4SS_MCS5
;
687 case DESC_RATEVHTSS4MCS6
:
688 ret_rate
= MGN_VHT4SS_MCS6
;
690 case DESC_RATEVHTSS4MCS7
:
691 ret_rate
= MGN_VHT4SS_MCS7
;
693 case DESC_RATEVHTSS4MCS8
:
694 ret_rate
= MGN_VHT4SS_MCS8
;
696 case DESC_RATEVHTSS4MCS9
:
697 ret_rate
= MGN_VHT4SS_MCS9
;
701 DBG_871X("HwRateToMRate(): Non supported Rate [%x]!!!\n", rate
);
708 void HalSetBrateCfg(struct adapter
*Adapter
, u8
*mBratesOS
, u16
*pBrateCfg
)
710 u8 i
, is_brate
, brate
;
712 for (i
= 0; i
< NDIS_802_11_LENGTH_RATES_EX
; i
++) {
714 is_brate
= mBratesOS
[i
] & IEEE80211_BASIC_RATE_MASK
;
715 brate
= mBratesOS
[i
] & 0x7f;
719 case IEEE80211_CCK_RATE_1MB
:
720 *pBrateCfg
|= RATE_1M
;
722 case IEEE80211_CCK_RATE_2MB
:
723 *pBrateCfg
|= RATE_2M
;
725 case IEEE80211_CCK_RATE_5MB
:
726 *pBrateCfg
|= RATE_5_5M
;
728 case IEEE80211_CCK_RATE_11MB
:
729 *pBrateCfg
|= RATE_11M
;
731 case IEEE80211_OFDM_RATE_6MB
:
732 *pBrateCfg
|= RATE_6M
;
734 case IEEE80211_OFDM_RATE_9MB
:
735 *pBrateCfg
|= RATE_9M
;
737 case IEEE80211_OFDM_RATE_12MB
:
738 *pBrateCfg
|= RATE_12M
;
740 case IEEE80211_OFDM_RATE_18MB
:
741 *pBrateCfg
|= RATE_18M
;
743 case IEEE80211_OFDM_RATE_24MB
:
744 *pBrateCfg
|= RATE_24M
;
746 case IEEE80211_OFDM_RATE_36MB
:
747 *pBrateCfg
|= RATE_36M
;
749 case IEEE80211_OFDM_RATE_48MB
:
750 *pBrateCfg
|= RATE_48M
;
752 case IEEE80211_OFDM_RATE_54MB
:
753 *pBrateCfg
|= RATE_54M
;
760 static void _OneOutPipeMapping(struct adapter
*padapter
)
762 struct dvobj_priv
*pdvobjpriv
= adapter_to_dvobj(padapter
);
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 */
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 */
775 static void _TwoOutPipeMapping(struct adapter
*padapter
, bool bWIFICfg
)
777 struct dvobj_priv
*pdvobjpriv
= adapter_to_dvobj(padapter
);
779 if (bWIFICfg
) { /* WMM */
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 */
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 */
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 */
795 } else { /* typical setting */
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 */
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 */
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 */
816 static void _ThreeOutPipeMapping(struct adapter
*padapter
, bool bWIFICfg
)
818 struct dvobj_priv
*pdvobjpriv
= adapter_to_dvobj(padapter
);
820 if (bWIFICfg
) { /* for WMM */
822 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
823 /* 1, 2, 1, 0, 0, 0, 0, 0, 0 }; */
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 */
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 */
836 } else { /* typical setting */
839 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
840 /* 2, 2, 1, 0, 0, 0, 0, 0, 0 }; */
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 */
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 */
856 bool Hal_MappingOutPipe(struct adapter
*padapter
, u8 NumOutPipe
)
858 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
860 bool bWIFICfg
= (pregistrypriv
->wifi_spec
) ? true : false;
864 switch (NumOutPipe
) {
866 _TwoOutPipeMapping(padapter
, bWIFICfg
);
870 _ThreeOutPipeMapping(padapter
, bWIFICfg
);
873 _OneOutPipeMapping(padapter
);
884 void hal_init_macaddr(struct adapter
*adapter
)
886 rtw_hal_set_hwreg(adapter
, HW_VAR_MAC_ADDR
, adapter
->eeprompriv
.mac_addr
);
889 void rtw_init_hal_com_default_value(struct adapter
*Adapter
)
891 struct hal_com_data
*pHalData
= GET_HAL_DATA(Adapter
);
893 pHalData
->AntDetection
= 1;
898 * Field TRIGGER CONTENT CMD_SEQ CMD_LEN CMD_ID
899 * BITS [127:120] [119:16] [15:8] [7:4] [3:0]
902 void c2h_evt_clear(struct adapter
*adapter
)
904 rtw_write8(adapter
, REG_C2HEVT_CLEAR
, C2H_EVT_HOST_CLOSE
);
909 * Field TRIGGER CMD_LEN CONTENT CMD_SEQ CMD_ID
910 * BITS [127:120] [119:112] [111:16] [15:8] [7:0]
912 s32
c2h_evt_read_88xx(struct adapter
*adapter
, u8
*buf
)
915 struct c2h_evt_hdr_88xx
*c2h_evt
;
922 trigger
= rtw_read8(adapter
, REG_C2HEVT_CLEAR
);
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 */
929 c2h_evt
= (struct c2h_evt_hdr_88xx
*)buf
;
931 memset(c2h_evt
, 0, 16);
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
);
946 "%s id:%u, len:%u, seq:%u, trigger:0x%02x\n",
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
);
958 RT_PRINT_DATA(_module_hal_init_c_
, _drv_info_
, "c2h_evt_read(): Command Content:\n",
959 c2h_evt
->payload
, c2h_evt
->plen
);
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.
968 c2h_evt_clear(adapter
);
974 u8
rtw_hal_networktype_to_raid(struct adapter
*adapter
, struct sta_info
*psta
)
976 return networktype_to_raid_ex(adapter
, psta
);
979 u8
rtw_get_mgntframe_raid(struct adapter
*adapter
, unsigned char network_type
)
983 raid
= (network_type
& WIRELESS_11B
) ? RATEID_IDX_B
: RATEID_IDX_G
;
987 void rtw_hal_update_sta_rate_mask(struct adapter
*padapter
, struct sta_info
*psta
)
989 u8 i
, rf_type
, limit
;
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);
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 */
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);
1017 psta
->ra_mask
= tx_ra_bitmap
;
1018 psta
->init_rate
= get_highest_rate_idx(tx_ra_bitmap
)&0x3f;
1021 void hw_var_port_switch(struct adapter
*adapter
)
1025 void SetHwReg(struct adapter
*adapter
, u8 variable
, u8
*val
)
1027 struct hal_com_data
*hal_data
= GET_HAL_DATA(adapter
);
1028 DM_ODM_T
*odm
= &(hal_data
->odmpriv
);
1031 case HW_VAR_PORT_SWITCH
:
1032 hw_var_port_switch(adapter
);
1034 case HW_VAR_INIT_RTS_RATE
:
1037 case HW_VAR_SEC_CFG
:
1041 reg_scr
= rtw_read16(adapter
, REG_SECCFG
);
1042 rtw_write16(adapter
, REG_SECCFG
, reg_scr
|SCR_CHK_KEYID
|SCR_RxDecEnable
|SCR_TxEncEnable
);
1045 case HW_VAR_SEC_DK_CFG
:
1047 struct security_priv
*sec
= &adapter
->securitypriv
;
1048 u8 reg_scr
= rtw_read8(adapter
, REG_SECCFG
);
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
);
1057 rtw_write8(adapter
, REG_SECCFG
, reg_scr
);
1060 case HW_VAR_DM_FLAG
:
1061 odm
->SupportAbility
= *((u32
*)val
);
1063 case HW_VAR_DM_FUNC_OP
:
1064 if (*((u8
*)val
) == true) {
1066 odm
->BK_SupportAbility
= odm
->SupportAbility
;
1068 /* restore dm flag */
1069 odm
->SupportAbility
= odm
->BK_SupportAbility
;
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
;
1078 odm
->SupportAbility
|= *((u32
*)val
);
1081 case HW_VAR_DM_FUNC_CLR
:
1083 * input is already a mask to clear function
1084 * don't invert it again! George, Lucas@20130513
1086 odm
->SupportAbility
&= *((u32
*)val
);
1088 case HW_VAR_AMPDU_MIN_SPACE
:
1089 /* TODO - Is something needed here? */
1091 case HW_VAR_WIRELESS_MODE
:
1092 /* TODO - Is something needed here? */
1097 FUNC_ADPT_FMT
" variable(%d) not defined!\n",
1098 FUNC_ADPT_ARG(adapter
),
1105 void GetHwReg(struct adapter
*adapter
, u8 variable
, u8
*val
)
1107 struct hal_com_data
*hal_data
= GET_HAL_DATA(adapter
);
1108 DM_ODM_T
*odm
= &(hal_data
->odmpriv
);
1111 case HW_VAR_BASIC_RATE
:
1112 *((u16
*)val
) = hal_data
->BasicRateSet
;
1114 case HW_VAR_DM_FLAG
:
1115 *((u32
*)val
) = odm
->SupportAbility
;
1117 case HW_VAR_RF_TYPE
:
1118 *((u8
*)val
) = hal_data
->rf_type
;
1123 FUNC_ADPT_FMT
" variable(%d) not defined!\n",
1124 FUNC_ADPT_ARG(adapter
),
1135 struct adapter
*adapter
, enum HAL_DEF_VARIABLE variable
, void *value
1138 struct hal_com_data
*hal_data
= GET_HAL_DATA(adapter
);
1139 DM_ODM_T
*odm
= &(hal_data
->odmpriv
);
1140 u8 bResult
= _SUCCESS
;
1143 case HW_DEF_FA_CNT_DUMP
:
1144 /* ODM_COMP_COMMON */
1146 odm
->DebugComponents
|= (ODM_COMP_DIG
| ODM_COMP_FA_CNT
);
1148 odm
->DebugComponents
&= ~(ODM_COMP_DIG
| ODM_COMP_FA_CNT
);
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
);
1156 DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
1157 HDATA_RATE(odm
->RxRate
), odm
->RSSI_A
, odm
->RSSI_B
);
1159 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1160 rtw_dump_raw_rssi_info(adapter
);
1164 case HW_DEF_ODM_DBG_FLAG
:
1165 ODM_CmnInfoUpdate(odm
, ODM_CMNINFO_DBG_COMP
, *((u64
*)value
));
1167 case HW_DEF_ODM_DBG_LEVEL
:
1168 ODM_CmnInfoUpdate(odm
, ODM_CMNINFO_DBG_LEVEL
, *((u32
*)value
));
1170 case HAL_DEF_DBG_DM_FUNC
:
1172 u8 dm_func
= *((u8
*)value
);
1173 struct dm_priv
*dm
= &hal_data
->dmpriv
;
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);
1195 dm
->DMFlag
|= DYNAMIC_FUNC_BT
;
1196 odm
->SupportAbility
= DYNAMIC_ALL_FUNC_ENABLE
;
1197 DBG_8192C("==> Turn on all dynamic function...\n");
1201 case HAL_DEF_DBG_DUMP_RXPKT
:
1202 hal_data
->bDumpRxPkt
= *((u8
*)value
);
1204 case HAL_DEF_DBG_DUMP_TXPKT
:
1205 hal_data
->bDumpTxPkt
= *((u8
*)value
);
1207 case HAL_DEF_ANT_DETECT
:
1208 hal_data
->AntDetection
= *((u8
*)value
);
1211 DBG_871X_LEVEL(_drv_always_
, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __func__
, variable
);
1220 struct adapter
*adapter
, enum HAL_DEF_VARIABLE variable
, void *value
1223 struct hal_com_data
*hal_data
= GET_HAL_DATA(adapter
);
1224 DM_ODM_T
*odm
= &(hal_data
->odmpriv
);
1225 u8 bResult
= _SUCCESS
;
1228 case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB
:
1230 struct mlme_priv
*pmlmepriv
;
1231 struct sta_priv
*pstapriv
;
1232 struct sta_info
*psta
;
1234 pmlmepriv
= &adapter
->mlmepriv
;
1235 pstapriv
= &adapter
->stapriv
;
1236 psta
= rtw_get_stainfo(pstapriv
, pmlmepriv
->cur_network
.network
.MacAddress
);
1238 *((int *)value
) = psta
->rssi_stat
.UndecoratedSmoothedPWDB
;
1241 case HW_DEF_ODM_DBG_FLAG
:
1242 *((u64
*)value
) = odm
->DebugComponents
;
1244 case HW_DEF_ODM_DBG_LEVEL
:
1245 *((u32
*)value
) = odm
->DebugLevel
;
1247 case HAL_DEF_DBG_DM_FUNC
:
1248 *((u32
*)value
) = hal_data
->odmpriv
.SupportAbility
;
1250 case HAL_DEF_DBG_DUMP_RXPKT
:
1251 *((u8
*)value
) = hal_data
->bDumpRxPkt
;
1253 case HAL_DEF_DBG_DUMP_TXPKT
:
1254 *((u8
*)value
) = hal_data
->bDumpTxPkt
;
1256 case HAL_DEF_ANT_DETECT
:
1257 *((u8
*)value
) = hal_data
->AntDetection
;
1259 case HAL_DEF_MACID_SLEEP
:
1260 *(u8
*)value
= false;
1262 case HAL_DEF_TX_PAGE_SIZE
:
1263 *((u32
*)value
) = PAGE_SIZE_128
;
1266 DBG_871X_LEVEL(_drv_always_
, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __func__
, variable
);
1275 struct adapter
*Adapter
,
1276 enum HAL_ODM_VARIABLE eVariable
,
1281 switch (eVariable
) {
1282 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
1283 case HAL_ODM_NOISE_MONITOR
:
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
]);
1295 #endif/* ifdef CONFIG_BACKGROUND_NOISE_MONITOR */
1302 struct adapter
*Adapter
,
1303 enum HAL_ODM_VARIABLE eVariable
,
1308 struct hal_com_data
*pHalData
= GET_HAL_DATA(Adapter
);
1309 PDM_ODM_T podmpriv
= &pHalData
->odmpriv
;
1311 switch (eVariable
) {
1312 case HAL_ODM_STA_INFO
:
1314 struct sta_info
*psta
= (struct sta_info
*)pValue1
;
1316 DBG_8192C("### Set STA_(%d) info ###\n", psta
->mac_id
);
1317 ODM_CmnInfoPtrArrayHook(podmpriv
, ODM_CMNINFO_STA_STATUS
, psta
->mac_id
, psta
);
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
);
1323 /* spin_unlock_bh(&pHalData->odm_stainfo_lock); */
1327 case HAL_ODM_P2P_STATE
:
1328 ODM_CmnInfoUpdate(podmpriv
, ODM_CMNINFO_WIFI_DIRECT
, bSet
);
1330 case HAL_ODM_WIFI_DISPLAY_STATE
:
1331 ODM_CmnInfoUpdate(podmpriv
, ODM_CMNINFO_WIFI_DISPLAY
, bSet
);
1333 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
1334 case HAL_ODM_NOISE_MONITOR
:
1336 struct noise_info
*pinfo
= (struct noise_info
*)pValue1
;
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
);
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
);
1353 #endif/* ifdef CONFIG_BACKGROUND_NOISE_MONITOR */
1361 bool eqNByte(u8
*str1
, u8
*str2
, u32 num
)
1367 if (str1
[num
] != str2
[num
])
1375 /* Return true if chTmp is represent for hex digit and */
1376 /* false otherwise. */
1379 bool IsHexDigit(char chTmp
)
1382 (chTmp
>= '0' && chTmp
<= '9') ||
1383 (chTmp
>= 'a' && chTmp
<= 'f') ||
1384 (chTmp
>= 'A' && chTmp
<= 'F')
1394 /* Translate a character to hex digit. */
1396 u32
MapCharToHexDigit(char chTmp
)
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'));
1411 /* Parse hex number from the string pucStr. */
1412 bool GetHexValueFromString(char *szStr
, u32
*pu4bVal
, u32
*pu4bMove
)
1414 char *szScan
= szStr
;
1416 /* Check input parameter. */
1417 if (szStr
== NULL
|| pu4bVal
== NULL
|| pu4bMove
== NULL
) {
1418 DBG_871X("GetHexValueFromString(): Invalid inpur argumetns! szStr: %p, pu4bVal: %p, pu4bMove: %p\n", szStr
, pu4bVal
, pu4bMove
);
1422 /* Initialize output. */
1426 /* Skip leading space. */
1427 while (*szScan
!= '\0' && (*szScan
== ' ' || *szScan
== '\t')) {
1432 /* Skip leading '0x' or '0X'. */
1433 if (*szScan
== '0' && (*(szScan
+1) == 'x' || *(szScan
+1) == 'X')) {
1438 /* Check if szScan is now pointer to a character for hex digit, */
1439 /* if not, it means this is not a valid hex number. */
1440 if (!IsHexDigit(*szScan
))
1443 /* Parse each digit. */
1446 *pu4bVal
+= MapCharToHexDigit(*szScan
);
1450 } while (IsHexDigit(*szScan
));
1455 bool GetFractionValueFromString(
1456 char *szStr
, u8
*pInteger
, u8
*pFraction
, u32
*pu4bMove
1459 char *szScan
= szStr
;
1461 /* Initialize output. */
1466 /* Skip leading space. */
1467 while (*szScan
!= '\0' && (*szScan
== ' ' || *szScan
== '\t')) {
1472 /* Parse each digit. */
1475 *pInteger
+= (*szScan
- '0');
1480 if (*szScan
== '.') {
1484 if (*szScan
< '0' || *szScan
> '9')
1487 *pFraction
= *szScan
- '0';
1493 } while (*szScan
>= '0' && *szScan
<= '9');
1500 /* Return true if szStr is comment out with leading "//". */
1502 bool IsCommentString(char *szStr
)
1504 if (*szStr
== '/' && *(szStr
+1) == '/')
1510 bool GetU1ByteIntegerFromStringInDecimal(char *Str
, u8
*pInt
)
1515 while (Str
[i
] != '\0') {
1516 if (Str
[i
] >= '0' && Str
[i
] <= '9') {
1518 *pInt
+= (Str
[i
] - '0');
1528 /* <20121004, Kordan> For example,
1529 * ParseQualifiedString(inString, 0, outString, '[', ']') gets "Kordan" from
1530 * a string "Hello [Kordan]".
1531 * If RightQualifier does not exist, it will hang in the while loop
1533 bool ParseQualifiedString(
1534 char *In
, u32
*Start
, char *Out
, char LeftQualifier
, char RightQualifier
1538 char c
= In
[(*Start
)++];
1540 if (c
!= LeftQualifier
)
1544 while ((c
= In
[(*Start
)++]) != RightQualifier
)
1547 strncpy((char *)Out
, (const char *)(In
+i
), j
-i
+1);
1552 bool isAllSpaceOrTab(u8
*data
, u8 size
)
1554 u8 cnt
= 0, NumOfSpaceAndTab
= 0;
1556 while (size
> cnt
) {
1557 if (data
[cnt
] == ' ' || data
[cnt
] == '\t' || data
[cnt
] == '\0')
1563 return size
== NumOfSpaceAndTab
;
1567 void rtw_hal_check_rxfifo_full(struct adapter
*adapter
)
1569 struct dvobj_priv
*psdpriv
= adapter
->dvobj
;
1570 struct debug_priv
*pdbgpriv
= &psdpriv
->drv_dbg
;
1571 int save_cnt
= false;
1573 /* switch counter to RX fifo */
1574 /* printk("8723b or 8192e , MAC_667 set 0xf0\n"); */
1575 rtw_write8(adapter
, REG_RXERR_RPT
+3, rtw_read8(adapter
, REG_RXERR_RPT
+3)|0xf0);
1577 /* todo: other chips */
1580 /* rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0); */
1581 pdbgpriv
->dbg_rx_fifo_last_overflow
= pdbgpriv
->dbg_rx_fifo_curr_overflow
;
1582 pdbgpriv
->dbg_rx_fifo_curr_overflow
= rtw_read16(adapter
, REG_RXERR_RPT
);
1583 pdbgpriv
->dbg_rx_fifo_diff_overflow
= pdbgpriv
->dbg_rx_fifo_curr_overflow
-pdbgpriv
->dbg_rx_fifo_last_overflow
;
1587 void linked_info_dump(struct adapter
*padapter
, u8 benable
)
1589 struct pwrctrl_priv
*pwrctrlpriv
= adapter_to_pwrctl(padapter
);
1591 if (padapter
->bLinkInfoDump
== benable
)
1594 DBG_871X("%s %s\n", __func__
, (benable
) ? "enable" : "disable");
1597 pwrctrlpriv
->org_power_mgnt
= pwrctrlpriv
->power_mgnt
;/* keep org value */
1598 rtw_pm_set_lps(padapter
, PS_MODE_ACTIVE
);
1600 pwrctrlpriv
->ips_org_mode
= pwrctrlpriv
->ips_mode
;/* keep org value */
1601 rtw_pm_set_ips(padapter
, IPS_NONE
);
1603 rtw_pm_set_ips(padapter
, pwrctrlpriv
->ips_org_mode
);
1605 rtw_pm_set_lps(padapter
, pwrctrlpriv
->ips_org_mode
);
1607 padapter
->bLinkInfoDump
= benable
;
1610 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1611 void rtw_get_raw_rssi_info(void *sel
, struct adapter
*padapter
)
1613 u8 isCCKrate
, rf_path
;
1614 struct hal_com_data
*pHalData
= GET_HAL_DATA(padapter
);
1615 struct rx_raw_rssi
*psample_pkt_rssi
= &padapter
->recvpriv
.raw_rssi_info
;
1619 "RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1620 HDATA_RATE(psample_pkt_rssi
->data_rate
),
1621 psample_pkt_rssi
->pwdball
, psample_pkt_rssi
->pwr_all
1624 isCCKrate
= (psample_pkt_rssi
->data_rate
<= DESC_RATE11M
) ? true : false;
1627 psample_pkt_rssi
->mimo_singal_strength
[0] = psample_pkt_rssi
->pwdball
;
1629 for (rf_path
= 0; rf_path
< pHalData
->NumTotalRFPath
; rf_path
++) {
1632 "RF_PATH_%d =>singal_strength:%d(%%), singal_quality:%d(%%)\n",
1633 rf_path
, psample_pkt_rssi
->mimo_singal_strength
[rf_path
],
1634 psample_pkt_rssi
->mimo_singal_quality
[rf_path
]
1640 "\trx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1641 psample_pkt_rssi
->ofdm_pwr
[rf_path
],
1642 psample_pkt_rssi
->ofdm_snr
[rf_path
]
1648 void rtw_dump_raw_rssi_info(struct adapter
*padapter
)
1650 u8 isCCKrate
, rf_path
;
1651 struct hal_com_data
*pHalData
= GET_HAL_DATA(padapter
);
1652 struct rx_raw_rssi
*psample_pkt_rssi
= &padapter
->recvpriv
.raw_rssi_info
;
1653 DBG_871X("============ RAW Rx Info dump ===================\n");
1654 DBG_871X("RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1655 HDATA_RATE(psample_pkt_rssi
->data_rate
), psample_pkt_rssi
->pwdball
, psample_pkt_rssi
->pwr_all
);
1657 isCCKrate
= (psample_pkt_rssi
->data_rate
<= DESC_RATE11M
) ? true : false;
1660 psample_pkt_rssi
->mimo_singal_strength
[0] = psample_pkt_rssi
->pwdball
;
1662 for (rf_path
= 0; rf_path
< pHalData
->NumTotalRFPath
; rf_path
++) {
1663 DBG_871X("RF_PATH_%d =>singal_strength:%d(%%), singal_quality:%d(%%)"
1664 , rf_path
, psample_pkt_rssi
->mimo_singal_strength
[rf_path
], psample_pkt_rssi
->mimo_singal_quality
[rf_path
]);
1667 printk(", rx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1668 psample_pkt_rssi
->ofdm_pwr
[rf_path
], psample_pkt_rssi
->ofdm_snr
[rf_path
]);
1675 void rtw_store_phy_info(struct adapter
*padapter
, union recv_frame
*prframe
)
1677 u8 isCCKrate
, rf_path
;
1678 struct hal_com_data
*pHalData
= GET_HAL_DATA(padapter
);
1679 struct rx_pkt_attrib
*pattrib
= &prframe
->u
.hdr
.attrib
;
1681 PODM_PHY_INFO_T pPhyInfo
= (PODM_PHY_INFO_T
)(&pattrib
->phy_info
);
1682 struct rx_raw_rssi
*psample_pkt_rssi
= &padapter
->recvpriv
.raw_rssi_info
;
1684 psample_pkt_rssi
->data_rate
= pattrib
->data_rate
;
1685 isCCKrate
= (pattrib
->data_rate
<= DESC_RATE11M
) ? true : false;
1687 psample_pkt_rssi
->pwdball
= pPhyInfo
->RxPWDBAll
;
1688 psample_pkt_rssi
->pwr_all
= pPhyInfo
->RecvSignalPower
;
1690 for (rf_path
= 0; rf_path
< pHalData
->NumTotalRFPath
; rf_path
++) {
1691 psample_pkt_rssi
->mimo_singal_strength
[rf_path
] = pPhyInfo
->RxMIMOSignalStrength
[rf_path
];
1692 psample_pkt_rssi
->mimo_singal_quality
[rf_path
] = pPhyInfo
->RxMIMOSignalQuality
[rf_path
];
1694 psample_pkt_rssi
->ofdm_pwr
[rf_path
] = pPhyInfo
->RxPwr
[rf_path
];
1695 psample_pkt_rssi
->ofdm_snr
[rf_path
] = pPhyInfo
->RxSNR
[rf_path
];
1701 static u32 Array_kfreemap
[] = {
1714 void rtw_bb_rf_gain_offset(struct adapter
*padapter
)
1716 u8 value
= padapter
->eeprompriv
.EEPROMRFGainOffset
;
1718 u32 ArrayLen
= sizeof(Array_kfreemap
)/sizeof(u32
);
1719 u32
*Array
= Array_kfreemap
;
1720 u32 v1
= 0, v2
= 0, target
= 0;
1721 /* DBG_871X("+%s value: 0x%02x+\n", __func__, value); */
1724 DBG_871X("Offset RF Gain.\n");
1725 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal = 0x%x\n", padapter
->eeprompriv
.EEPROMRFGainVal
);
1726 if (padapter
->eeprompriv
.EEPROMRFGainVal
!= 0xff) {
1727 res
= rtw_hal_read_rfreg(padapter
, RF_PATH_A
, 0x7f, 0xffffffff);
1729 DBG_871X("Offset RF Gain. before reg 0x7f = 0x%08x\n", res
);
1730 /* res &= 0xfff87fff; */
1731 for (i
= 0; i
< ArrayLen
; i
+= 2) {
1734 if (v1
== padapter
->eeprompriv
.EEPROMRFGainVal
) {
1735 DBG_871X("Offset RF Gain. got v1 = 0x%x , v2 = 0x%x\n", v1
, v2
);
1740 DBG_871X("padapter->eeprompriv.EEPROMRFGainVal = 0x%x , Gain offset Target Value = 0x%x\n", padapter
->eeprompriv
.EEPROMRFGainVal
, target
);
1741 PHY_SetRFReg(padapter
, RF_PATH_A
, REG_RF_BB_GAIN_OFFSET
, BIT18
|BIT17
|BIT16
|BIT15
, target
);
1743 /* res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; */
1744 /* rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); */
1745 res
= rtw_hal_read_rfreg(padapter
, RF_PATH_A
, 0x7f, 0xffffffff);
1746 DBG_871X("Offset RF Gain. After reg 0x7f = 0x%08x\n", res
);
1748 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal = 0x%x != 0xff, didn't run Kfree\n", padapter
->eeprompriv
.EEPROMRFGainVal
);
1750 DBG_871X("Using the default RF gain.\n");