1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
9 #include <linux/kernel.h>
10 #include <drv_types.h>
11 #include <rtw_debug.h>
12 #include "hal_com_h2c.h"
14 #include "odm_precomp.h"
16 u8 rtw_hal_data_init(struct adapter *padapter)
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) {
22 DBG_8192C("cannot alloc memory for HAL DATA\n");
29 void rtw_hal_data_deinit(struct adapter *padapter)
31 if (is_primary_adapter(padapter)) { /* if (padapter->isprimary) */
32 if (padapter->HalData) {
33 vfree(padapter->HalData);
34 padapter->HalData = NULL;
35 padapter->hal_data_sz = 0;
41 void dump_chip_info(HAL_VERSION ChipVersion)
46 cnt += sprintf((buf+cnt), "Chip Version Info: CHIP_8723B_");
47 cnt += sprintf((buf+cnt), "%s_", IS_NORMAL_CHIP(ChipVersion) ? "Normal_Chip" : "Test_Chip");
48 if (IS_CHIP_VENDOR_TSMC(ChipVersion))
49 cnt += sprintf((buf+cnt), "%s_", "TSMC");
50 else if (IS_CHIP_VENDOR_UMC(ChipVersion))
51 cnt += sprintf((buf+cnt), "%s_", "UMC");
52 else if (IS_CHIP_VENDOR_SMIC(ChipVersion))
53 cnt += sprintf((buf+cnt), "%s_", "SMIC");
55 if (IS_A_CUT(ChipVersion))
56 cnt += sprintf((buf+cnt), "A_CUT_");
57 else if (IS_B_CUT(ChipVersion))
58 cnt += sprintf((buf+cnt), "B_CUT_");
59 else if (IS_C_CUT(ChipVersion))
60 cnt += sprintf((buf+cnt), "C_CUT_");
61 else if (IS_D_CUT(ChipVersion))
62 cnt += sprintf((buf+cnt), "D_CUT_");
63 else if (IS_E_CUT(ChipVersion))
64 cnt += sprintf((buf+cnt), "E_CUT_");
65 else if (IS_I_CUT(ChipVersion))
66 cnt += sprintf((buf+cnt), "I_CUT_");
67 else if (IS_J_CUT(ChipVersion))
68 cnt += sprintf((buf+cnt), "J_CUT_");
69 else if (IS_K_CUT(ChipVersion))
70 cnt += sprintf((buf+cnt), "K_CUT_");
72 cnt += sprintf((buf+cnt), "UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion);
74 if (IS_1T1R(ChipVersion))
75 cnt += sprintf((buf+cnt), "1T1R_");
76 else if (IS_1T2R(ChipVersion))
77 cnt += sprintf((buf+cnt), "1T2R_");
78 else if (IS_2T2R(ChipVersion))
79 cnt += sprintf((buf+cnt), "2T2R_");
81 cnt += sprintf((buf+cnt), "UNKNOWN_RFTYPE(%d)_", ChipVersion.RFType);
83 cnt += sprintf((buf+cnt), "RomVer(%d)\n", ChipVersion.ROMVer);
89 #define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
93 *Use hardware(efuse), driver parameter(registry) and default channel plan
94 *to decide which one should be used.
97 *padapter pointer of adapter
98 *hw_channel_plan channel plan from HW (efuse/eeprom)
99 * BIT[7] software configure mode; 0:Enable, 1:disable
100 * BIT[6:0] Channel Plan
101 *sw_channel_plan channel plan from SW (registry/module param)
102 *def_channel_plan channel plan used when HW/SW both invalid
103 *AutoLoadFail efuse autoload fail or not
106 *Final channel plan decision
109 u8 hal_com_config_channel_plan(
110 struct adapter *padapter,
117 struct hal_com_data *pHalData;
120 pHalData = GET_HAL_DATA(padapter);
121 pHalData->bDisableSWChannelPlan = false;
122 chnlPlan = def_channel_plan;
124 if (0xFF == hw_channel_plan)
130 hw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);
131 if (rtw_is_channel_plan_valid(hw_chnlPlan)) {
132 #ifndef CONFIG_SW_CHANNEL_PLAN
133 if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)
134 pHalData->bDisableSWChannelPlan = true;
135 #endif /* !CONFIG_SW_CHANNEL_PLAN */
137 chnlPlan = hw_chnlPlan;
142 (false == pHalData->bDisableSWChannelPlan) &&
143 rtw_is_channel_plan_valid(sw_channel_plan)
145 chnlPlan = sw_channel_plan;
150 bool HAL_IsLegalChannel(struct adapter *Adapter, u32 Channel)
152 bool bLegalChannel = true;
154 if ((Channel <= 14) && (Channel >= 1)) {
155 if (IsSupported24G(Adapter->registrypriv.wireless_mode) == false) {
156 bLegalChannel = false;
157 DBG_871X("(Channel <= 14) && (Channel >= 1) but wireless_mode do not support 2.4G\n");
160 bLegalChannel = false;
161 DBG_871X("Channel is Invalid !!!\n");
164 return bLegalChannel;
167 u8 MRateToHwRate(u8 rate)
169 u8 ret = DESC_RATE1M;
239 ret = DESC_RATEMCS10;
242 ret = DESC_RATEMCS11;
245 ret = DESC_RATEMCS12;
248 ret = DESC_RATEMCS13;
251 ret = DESC_RATEMCS14;
254 ret = DESC_RATEMCS15;
257 ret = DESC_RATEMCS16;
260 ret = DESC_RATEMCS17;
263 ret = DESC_RATEMCS18;
266 ret = DESC_RATEMCS19;
269 ret = DESC_RATEMCS20;
272 ret = DESC_RATEMCS21;
275 ret = DESC_RATEMCS22;
278 ret = DESC_RATEMCS23;
281 ret = DESC_RATEMCS24;
284 ret = DESC_RATEMCS25;
287 ret = DESC_RATEMCS26;
290 ret = DESC_RATEMCS27;
293 ret = DESC_RATEMCS28;
296 ret = DESC_RATEMCS29;
299 ret = DESC_RATEMCS30;
302 ret = DESC_RATEMCS31;
304 case MGN_VHT1SS_MCS0:
305 ret = DESC_RATEVHTSS1MCS0;
307 case MGN_VHT1SS_MCS1:
308 ret = DESC_RATEVHTSS1MCS1;
310 case MGN_VHT1SS_MCS2:
311 ret = DESC_RATEVHTSS1MCS2;
313 case MGN_VHT1SS_MCS3:
314 ret = DESC_RATEVHTSS1MCS3;
316 case MGN_VHT1SS_MCS4:
317 ret = DESC_RATEVHTSS1MCS4;
319 case MGN_VHT1SS_MCS5:
320 ret = DESC_RATEVHTSS1MCS5;
322 case MGN_VHT1SS_MCS6:
323 ret = DESC_RATEVHTSS1MCS6;
325 case MGN_VHT1SS_MCS7:
326 ret = DESC_RATEVHTSS1MCS7;
328 case MGN_VHT1SS_MCS8:
329 ret = DESC_RATEVHTSS1MCS8;
331 case MGN_VHT1SS_MCS9:
332 ret = DESC_RATEVHTSS1MCS9;
334 case MGN_VHT2SS_MCS0:
335 ret = DESC_RATEVHTSS2MCS0;
337 case MGN_VHT2SS_MCS1:
338 ret = DESC_RATEVHTSS2MCS1;
340 case MGN_VHT2SS_MCS2:
341 ret = DESC_RATEVHTSS2MCS2;
343 case MGN_VHT2SS_MCS3:
344 ret = DESC_RATEVHTSS2MCS3;
346 case MGN_VHT2SS_MCS4:
347 ret = DESC_RATEVHTSS2MCS4;
349 case MGN_VHT2SS_MCS5:
350 ret = DESC_RATEVHTSS2MCS5;
352 case MGN_VHT2SS_MCS6:
353 ret = DESC_RATEVHTSS2MCS6;
355 case MGN_VHT2SS_MCS7:
356 ret = DESC_RATEVHTSS2MCS7;
358 case MGN_VHT2SS_MCS8:
359 ret = DESC_RATEVHTSS2MCS8;
361 case MGN_VHT2SS_MCS9:
362 ret = DESC_RATEVHTSS2MCS9;
364 case MGN_VHT3SS_MCS0:
365 ret = DESC_RATEVHTSS3MCS0;
367 case MGN_VHT3SS_MCS1:
368 ret = DESC_RATEVHTSS3MCS1;
370 case MGN_VHT3SS_MCS2:
371 ret = DESC_RATEVHTSS3MCS2;
373 case MGN_VHT3SS_MCS3:
374 ret = DESC_RATEVHTSS3MCS3;
376 case MGN_VHT3SS_MCS4:
377 ret = DESC_RATEVHTSS3MCS4;
379 case MGN_VHT3SS_MCS5:
380 ret = DESC_RATEVHTSS3MCS5;
382 case MGN_VHT3SS_MCS6:
383 ret = DESC_RATEVHTSS3MCS6;
385 case MGN_VHT3SS_MCS7:
386 ret = DESC_RATEVHTSS3MCS7;
388 case MGN_VHT3SS_MCS8:
389 ret = DESC_RATEVHTSS3MCS8;
391 case MGN_VHT3SS_MCS9:
392 ret = DESC_RATEVHTSS3MCS9;
394 case MGN_VHT4SS_MCS0:
395 ret = DESC_RATEVHTSS4MCS0;
397 case MGN_VHT4SS_MCS1:
398 ret = DESC_RATEVHTSS4MCS1;
400 case MGN_VHT4SS_MCS2:
401 ret = DESC_RATEVHTSS4MCS2;
403 case MGN_VHT4SS_MCS3:
404 ret = DESC_RATEVHTSS4MCS3;
406 case MGN_VHT4SS_MCS4:
407 ret = DESC_RATEVHTSS4MCS4;
409 case MGN_VHT4SS_MCS5:
410 ret = DESC_RATEVHTSS4MCS5;
412 case MGN_VHT4SS_MCS6:
413 ret = DESC_RATEVHTSS4MCS6;
415 case MGN_VHT4SS_MCS7:
416 ret = DESC_RATEVHTSS4MCS7;
418 case MGN_VHT4SS_MCS8:
419 ret = DESC_RATEVHTSS4MCS8;
421 case MGN_VHT4SS_MCS9:
422 ret = DESC_RATEVHTSS4MCS9;
431 u8 HwRateToMRate(u8 rate)
433 u8 ret_rate = MGN_1M;
503 ret_rate = MGN_MCS10;
506 ret_rate = MGN_MCS11;
509 ret_rate = MGN_MCS12;
512 ret_rate = MGN_MCS13;
515 ret_rate = MGN_MCS14;
518 ret_rate = MGN_MCS15;
521 ret_rate = MGN_MCS16;
524 ret_rate = MGN_MCS17;
527 ret_rate = MGN_MCS18;
530 ret_rate = MGN_MCS19;
533 ret_rate = MGN_MCS20;
536 ret_rate = MGN_MCS21;
539 ret_rate = MGN_MCS22;
542 ret_rate = MGN_MCS23;
545 ret_rate = MGN_MCS24;
548 ret_rate = MGN_MCS25;
551 ret_rate = MGN_MCS26;
554 ret_rate = MGN_MCS27;
557 ret_rate = MGN_MCS28;
560 ret_rate = MGN_MCS29;
563 ret_rate = MGN_MCS30;
566 ret_rate = MGN_MCS31;
568 case DESC_RATEVHTSS1MCS0:
569 ret_rate = MGN_VHT1SS_MCS0;
571 case DESC_RATEVHTSS1MCS1:
572 ret_rate = MGN_VHT1SS_MCS1;
574 case DESC_RATEVHTSS1MCS2:
575 ret_rate = MGN_VHT1SS_MCS2;
577 case DESC_RATEVHTSS1MCS3:
578 ret_rate = MGN_VHT1SS_MCS3;
580 case DESC_RATEVHTSS1MCS4:
581 ret_rate = MGN_VHT1SS_MCS4;
583 case DESC_RATEVHTSS1MCS5:
584 ret_rate = MGN_VHT1SS_MCS5;
586 case DESC_RATEVHTSS1MCS6:
587 ret_rate = MGN_VHT1SS_MCS6;
589 case DESC_RATEVHTSS1MCS7:
590 ret_rate = MGN_VHT1SS_MCS7;
592 case DESC_RATEVHTSS1MCS8:
593 ret_rate = MGN_VHT1SS_MCS8;
595 case DESC_RATEVHTSS1MCS9:
596 ret_rate = MGN_VHT1SS_MCS9;
598 case DESC_RATEVHTSS2MCS0:
599 ret_rate = MGN_VHT2SS_MCS0;
601 case DESC_RATEVHTSS2MCS1:
602 ret_rate = MGN_VHT2SS_MCS1;
604 case DESC_RATEVHTSS2MCS2:
605 ret_rate = MGN_VHT2SS_MCS2;
607 case DESC_RATEVHTSS2MCS3:
608 ret_rate = MGN_VHT2SS_MCS3;
610 case DESC_RATEVHTSS2MCS4:
611 ret_rate = MGN_VHT2SS_MCS4;
613 case DESC_RATEVHTSS2MCS5:
614 ret_rate = MGN_VHT2SS_MCS5;
616 case DESC_RATEVHTSS2MCS6:
617 ret_rate = MGN_VHT2SS_MCS6;
619 case DESC_RATEVHTSS2MCS7:
620 ret_rate = MGN_VHT2SS_MCS7;
622 case DESC_RATEVHTSS2MCS8:
623 ret_rate = MGN_VHT2SS_MCS8;
625 case DESC_RATEVHTSS2MCS9:
626 ret_rate = MGN_VHT2SS_MCS9;
628 case DESC_RATEVHTSS3MCS0:
629 ret_rate = MGN_VHT3SS_MCS0;
631 case DESC_RATEVHTSS3MCS1:
632 ret_rate = MGN_VHT3SS_MCS1;
634 case DESC_RATEVHTSS3MCS2:
635 ret_rate = MGN_VHT3SS_MCS2;
637 case DESC_RATEVHTSS3MCS3:
638 ret_rate = MGN_VHT3SS_MCS3;
640 case DESC_RATEVHTSS3MCS4:
641 ret_rate = MGN_VHT3SS_MCS4;
643 case DESC_RATEVHTSS3MCS5:
644 ret_rate = MGN_VHT3SS_MCS5;
646 case DESC_RATEVHTSS3MCS6:
647 ret_rate = MGN_VHT3SS_MCS6;
649 case DESC_RATEVHTSS3MCS7:
650 ret_rate = MGN_VHT3SS_MCS7;
652 case DESC_RATEVHTSS3MCS8:
653 ret_rate = MGN_VHT3SS_MCS8;
655 case DESC_RATEVHTSS3MCS9:
656 ret_rate = MGN_VHT3SS_MCS9;
658 case DESC_RATEVHTSS4MCS0:
659 ret_rate = MGN_VHT4SS_MCS0;
661 case DESC_RATEVHTSS4MCS1:
662 ret_rate = MGN_VHT4SS_MCS1;
664 case DESC_RATEVHTSS4MCS2:
665 ret_rate = MGN_VHT4SS_MCS2;
667 case DESC_RATEVHTSS4MCS3:
668 ret_rate = MGN_VHT4SS_MCS3;
670 case DESC_RATEVHTSS4MCS4:
671 ret_rate = MGN_VHT4SS_MCS4;
673 case DESC_RATEVHTSS4MCS5:
674 ret_rate = MGN_VHT4SS_MCS5;
676 case DESC_RATEVHTSS4MCS6:
677 ret_rate = MGN_VHT4SS_MCS6;
679 case DESC_RATEVHTSS4MCS7:
680 ret_rate = MGN_VHT4SS_MCS7;
682 case DESC_RATEVHTSS4MCS8:
683 ret_rate = MGN_VHT4SS_MCS8;
685 case DESC_RATEVHTSS4MCS9:
686 ret_rate = MGN_VHT4SS_MCS9;
690 DBG_871X("HwRateToMRate(): Non supported Rate [%x]!!!\n", rate);
697 void HalSetBrateCfg(struct adapter *Adapter, u8 *mBratesOS, u16 *pBrateCfg)
699 u8 i, is_brate, brate;
701 for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
703 is_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;
704 brate = mBratesOS[i] & 0x7f;
708 case IEEE80211_CCK_RATE_1MB:
709 *pBrateCfg |= RATE_1M;
711 case IEEE80211_CCK_RATE_2MB:
712 *pBrateCfg |= RATE_2M;
714 case IEEE80211_CCK_RATE_5MB:
715 *pBrateCfg |= RATE_5_5M;
717 case IEEE80211_CCK_RATE_11MB:
718 *pBrateCfg |= RATE_11M;
720 case IEEE80211_OFDM_RATE_6MB:
721 *pBrateCfg |= RATE_6M;
723 case IEEE80211_OFDM_RATE_9MB:
724 *pBrateCfg |= RATE_9M;
726 case IEEE80211_OFDM_RATE_12MB:
727 *pBrateCfg |= RATE_12M;
729 case IEEE80211_OFDM_RATE_18MB:
730 *pBrateCfg |= RATE_18M;
732 case IEEE80211_OFDM_RATE_24MB:
733 *pBrateCfg |= RATE_24M;
735 case IEEE80211_OFDM_RATE_36MB:
736 *pBrateCfg |= RATE_36M;
738 case IEEE80211_OFDM_RATE_48MB:
739 *pBrateCfg |= RATE_48M;
741 case IEEE80211_OFDM_RATE_54MB:
742 *pBrateCfg |= RATE_54M;
749 static void _OneOutPipeMapping(struct adapter *padapter)
751 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
753 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
754 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
755 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */
756 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
758 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
759 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
760 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
761 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
764 static void _TwoOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
766 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
768 if (bWIFICfg) { /* WMM */
770 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
771 /* 0, 1, 0, 1, 0, 0, 0, 0, 0 }; */
772 /* 0:ep_0 num, 1:ep_1 num */
774 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */
775 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
776 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
777 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
779 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
780 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
781 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
782 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
784 } else { /* typical setting */
787 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
788 /* 1, 1, 0, 0, 0, 0, 0, 0, 0 }; */
789 /* 0:ep_0 num, 1:ep_1 num */
791 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
792 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
793 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
794 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
796 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
797 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
798 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
799 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
805 static void _ThreeOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
807 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
809 if (bWIFICfg) { /* for WMM */
811 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
812 /* 1, 2, 1, 0, 0, 0, 0, 0, 0 }; */
815 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
816 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
817 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
818 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
820 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
821 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
822 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
823 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
825 } else { /* typical setting */
828 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
829 /* 2, 2, 1, 0, 0, 0, 0, 0, 0 }; */
832 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
833 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
834 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
835 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */
837 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
838 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
839 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
840 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
845 bool Hal_MappingOutPipe(struct adapter *padapter, u8 NumOutPipe)
847 struct registry_priv *pregistrypriv = &padapter->registrypriv;
849 bool bWIFICfg = (pregistrypriv->wifi_spec) ? true : false;
853 switch (NumOutPipe) {
855 _TwoOutPipeMapping(padapter, bWIFICfg);
859 _ThreeOutPipeMapping(padapter, bWIFICfg);
862 _OneOutPipeMapping(padapter);
873 void hal_init_macaddr(struct adapter *adapter)
875 rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr);
878 void rtw_init_hal_com_default_value(struct adapter *Adapter)
880 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
882 pHalData->AntDetection = 1;
887 * Field TRIGGER CONTENT CMD_SEQ CMD_LEN CMD_ID
888 * BITS [127:120] [119:16] [15:8] [7:4] [3:0]
891 void c2h_evt_clear(struct adapter *adapter)
893 rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
898 * Field TRIGGER CMD_LEN CONTENT CMD_SEQ CMD_ID
899 * BITS [127:120] [119:112] [111:16] [15:8] [7:0]
901 s32 c2h_evt_read_88xx(struct adapter *adapter, u8 *buf)
904 struct c2h_evt_hdr_88xx *c2h_evt;
911 trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
913 if (trigger == C2H_EVT_HOST_CLOSE)
914 goto exit; /* Not ready */
915 else if (trigger != C2H_EVT_FW_CLOSE)
916 goto clear_evt; /* Not a valid value */
918 c2h_evt = (struct c2h_evt_hdr_88xx *)buf;
920 memset(c2h_evt, 0, 16);
922 c2h_evt->id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
923 c2h_evt->seq = rtw_read8(adapter, REG_C2HEVT_CMD_SEQ_88XX);
924 c2h_evt->plen = rtw_read8(adapter, REG_C2HEVT_CMD_LEN_88XX);
935 "%s id:%u, len:%u, seq:%u, trigger:0x%02x\n",
943 /* Read the content */
944 for (i = 0; i < c2h_evt->plen; i++)
945 c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);
947 RT_PRINT_DATA(_module_hal_init_c_, _drv_info_, "c2h_evt_read(): Command Content:\n",
948 c2h_evt->payload, c2h_evt->plen);
954 * Clear event to notify FW we have read the command.
955 * If this field isn't clear, the FW won't update the next command message.
957 c2h_evt_clear(adapter);
962 u8 rtw_get_mgntframe_raid(struct adapter *adapter, unsigned char network_type)
964 return (network_type & WIRELESS_11B) ? RATEID_IDX_B : RATEID_IDX_G;
967 void rtw_hal_update_sta_rate_mask(struct adapter *padapter, struct sta_info *psta)
969 u8 i, rf_type, limit;
977 /* b/g mode ra_bitmap */
978 for (i = 0; i < sizeof(psta->bssrateset); i++) {
979 if (psta->bssrateset[i])
980 tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
983 /* n mode ra_bitmap */
984 if (psta->htpriv.ht_option) {
985 rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
986 if (rf_type == RF_2T2R)
991 for (i = 0; i < limit; i++) {
992 if (psta->htpriv.ht_cap.supp_mcs_set[i/8] & BIT(i%8))
993 tx_ra_bitmap |= BIT(i+12);
997 psta->ra_mask = tx_ra_bitmap;
998 psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f;
1001 void hw_var_port_switch(struct adapter *adapter)
1005 void SetHwReg(struct adapter *adapter, u8 variable, u8 *val)
1007 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1008 DM_ODM_T *odm = &(hal_data->odmpriv);
1011 case HW_VAR_PORT_SWITCH:
1012 hw_var_port_switch(adapter);
1014 case HW_VAR_INIT_RTS_RATE:
1017 case HW_VAR_SEC_CFG:
1021 reg_scr = rtw_read16(adapter, REG_SECCFG);
1022 rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
1025 case HW_VAR_SEC_DK_CFG:
1027 struct security_priv *sec = &adapter->securitypriv;
1028 u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
1030 if (val) { /* Enable default key related setting */
1031 reg_scr |= SCR_TXBCUSEDK;
1032 if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
1033 reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
1034 } else /* Disable default key related setting */
1035 reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
1037 rtw_write8(adapter, REG_SECCFG, reg_scr);
1040 case HW_VAR_DM_FLAG:
1041 odm->SupportAbility = *((u32 *)val);
1043 case HW_VAR_DM_FUNC_OP:
1044 if (*((u8 *)val) == true) {
1046 odm->BK_SupportAbility = odm->SupportAbility;
1048 /* restore dm flag */
1049 odm->SupportAbility = odm->BK_SupportAbility;
1052 case HW_VAR_DM_FUNC_SET:
1053 if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) {
1054 struct dm_priv *dm = &hal_data->dmpriv;
1055 dm->DMFlag = dm->InitDMFlag;
1056 odm->SupportAbility = dm->InitODMFlag;
1058 odm->SupportAbility |= *((u32 *)val);
1061 case HW_VAR_DM_FUNC_CLR:
1063 * input is already a mask to clear function
1064 * don't invert it again! George, Lucas@20130513
1066 odm->SupportAbility &= *((u32 *)val);
1068 case HW_VAR_AMPDU_MIN_SPACE:
1069 /* TODO - Is something needed here? */
1071 case HW_VAR_WIRELESS_MODE:
1072 /* TODO - Is something needed here? */
1077 FUNC_ADPT_FMT" variable(%d) not defined!\n",
1078 FUNC_ADPT_ARG(adapter),
1085 void GetHwReg(struct adapter *adapter, u8 variable, u8 *val)
1087 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1088 DM_ODM_T *odm = &(hal_data->odmpriv);
1091 case HW_VAR_BASIC_RATE:
1092 *((u16 *)val) = hal_data->BasicRateSet;
1094 case HW_VAR_DM_FLAG:
1095 *((u32 *)val) = odm->SupportAbility;
1097 case HW_VAR_RF_TYPE:
1098 *((u8 *)val) = hal_data->rf_type;
1103 FUNC_ADPT_FMT" variable(%d) not defined!\n",
1104 FUNC_ADPT_ARG(adapter),
1115 struct adapter *adapter, enum HAL_DEF_VARIABLE variable, void *value
1118 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1119 DM_ODM_T *odm = &(hal_data->odmpriv);
1120 u8 bResult = _SUCCESS;
1123 case HW_DEF_FA_CNT_DUMP:
1124 /* ODM_COMP_COMMON */
1126 odm->DebugComponents |= (ODM_COMP_DIG | ODM_COMP_FA_CNT);
1128 odm->DebugComponents &= ~(ODM_COMP_DIG | ODM_COMP_FA_CNT);
1130 case HAL_DEF_DBG_RX_INFO_DUMP:
1131 DBG_871X("============ Rx Info dump ===================\n");
1132 DBG_871X("bLinked = %d, RSSI_Min = %d(%%)\n",
1133 odm->bLinked, odm->RSSI_Min);
1136 DBG_871X("RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
1137 HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);
1139 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1140 rtw_dump_raw_rssi_info(adapter);
1144 case HW_DEF_ODM_DBG_FLAG:
1145 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u64 *)value));
1147 case HW_DEF_ODM_DBG_LEVEL:
1148 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u32 *)value));
1150 case HAL_DEF_DBG_DM_FUNC:
1152 u8 dm_func = *((u8 *)value);
1153 struct dm_priv *dm = &hal_data->dmpriv;
1155 if (dm_func == 0) { /* disable all dynamic func */
1156 odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
1157 DBG_8192C("==> Disable all dynamic function...\n");
1158 } else if (dm_func == 1) {/* disable DIG */
1159 odm->SupportAbility &= (~DYNAMIC_BB_DIG);
1160 DBG_8192C("==> Disable DIG...\n");
1161 } else if (dm_func == 2) {/* disable High power */
1162 odm->SupportAbility &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
1163 } else if (dm_func == 3) {/* disable tx power tracking */
1164 odm->SupportAbility &= (~DYNAMIC_RF_CALIBRATION);
1165 DBG_8192C("==> Disable tx power tracking...\n");
1166 } else if (dm_func == 4) {/* disable BT coexistence */
1167 dm->DMFlag &= (~DYNAMIC_FUNC_BT);
1168 } else if (dm_func == 5) {/* disable antenna diversity */
1169 odm->SupportAbility &= (~DYNAMIC_BB_ANT_DIV);
1170 } else if (dm_func == 6) {/* turn on all dynamic func */
1171 if (!(odm->SupportAbility & DYNAMIC_BB_DIG)) {
1172 DIG_T *pDigTable = &odm->DM_DigTable;
1173 pDigTable->CurIGValue = rtw_read8(adapter, 0xc50);
1175 dm->DMFlag |= DYNAMIC_FUNC_BT;
1176 odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
1177 DBG_8192C("==> Turn on all dynamic function...\n");
1181 case HAL_DEF_DBG_DUMP_RXPKT:
1182 hal_data->bDumpRxPkt = *((u8 *)value);
1184 case HAL_DEF_DBG_DUMP_TXPKT:
1185 hal_data->bDumpTxPkt = *((u8 *)value);
1187 case HAL_DEF_ANT_DETECT:
1188 hal_data->AntDetection = *((u8 *)value);
1191 DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __func__, variable);
1200 struct adapter *adapter, enum HAL_DEF_VARIABLE variable, void *value
1203 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1204 DM_ODM_T *odm = &(hal_data->odmpriv);
1205 u8 bResult = _SUCCESS;
1208 case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
1210 struct mlme_priv *pmlmepriv;
1211 struct sta_priv *pstapriv;
1212 struct sta_info *psta;
1214 pmlmepriv = &adapter->mlmepriv;
1215 pstapriv = &adapter->stapriv;
1216 psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.MacAddress);
1218 *((int *)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;
1221 case HW_DEF_ODM_DBG_FLAG:
1222 *((u64 *)value) = odm->DebugComponents;
1224 case HW_DEF_ODM_DBG_LEVEL:
1225 *((u32 *)value) = odm->DebugLevel;
1227 case HAL_DEF_DBG_DM_FUNC:
1228 *((u32 *)value) = hal_data->odmpriv.SupportAbility;
1230 case HAL_DEF_DBG_DUMP_RXPKT:
1231 *((u8 *)value) = hal_data->bDumpRxPkt;
1233 case HAL_DEF_DBG_DUMP_TXPKT:
1234 *((u8 *)value) = hal_data->bDumpTxPkt;
1236 case HAL_DEF_ANT_DETECT:
1237 *((u8 *)value) = hal_data->AntDetection;
1239 case HAL_DEF_MACID_SLEEP:
1240 *(u8 *)value = false;
1242 case HAL_DEF_TX_PAGE_SIZE:
1243 *((u32 *)value) = PAGE_SIZE_128;
1246 DBG_871X_LEVEL(_drv_always_, "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n", __func__, variable);
1255 struct adapter *Adapter,
1256 enum HAL_ODM_VARIABLE eVariable,
1261 switch (eVariable) {
1262 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
1263 case HAL_ODM_NOISE_MONITOR:
1265 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
1266 u8 chan = *(u8 *)pValue1;
1267 *(s16 *)pValue2 = pHalData->noise[chan];
1268 #ifdef DBG_NOISE_MONITOR
1269 DBG_8192C("### Noise monitor chan(%d)-noise:%d (dBm) ###\n",
1270 chan, pHalData->noise[chan]);
1275 #endif/* ifdef CONFIG_BACKGROUND_NOISE_MONITOR */
1282 struct adapter *Adapter,
1283 enum HAL_ODM_VARIABLE eVariable,
1288 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
1289 PDM_ODM_T podmpriv = &pHalData->odmpriv;
1291 switch (eVariable) {
1292 case HAL_ODM_STA_INFO:
1294 struct sta_info *psta = pValue1;
1296 DBG_8192C("### Set STA_(%d) info ###\n", psta->mac_id);
1297 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, psta);
1299 DBG_8192C("### Clean STA_(%d) info ###\n", psta->mac_id);
1300 /* spin_lock_bh(&pHalData->odm_stainfo_lock); */
1301 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, NULL);
1303 /* spin_unlock_bh(&pHalData->odm_stainfo_lock); */
1307 case HAL_ODM_P2P_STATE:
1308 ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
1310 case HAL_ODM_WIFI_DISPLAY_STATE:
1311 ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
1313 #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
1314 case HAL_ODM_NOISE_MONITOR:
1316 struct noise_info *pinfo = pValue1;
1318 #ifdef DBG_NOISE_MONITOR
1319 DBG_8192C("### Noise monitor chan(%d)-bPauseDIG:%d, IGIValue:0x%02x, max_time:%d (ms) ###\n",
1320 pinfo->chan, pinfo->bPauseDIG, pinfo->IGIValue, pinfo->max_time);
1323 pHalData->noise[pinfo->chan] = ODM_InbandNoise_Monitor(podmpriv, pinfo->bPauseDIG, pinfo->IGIValue, pinfo->max_time);
1324 DBG_871X("chan_%d, noise = %d (dBm)\n", pinfo->chan, pHalData->noise[pinfo->chan]);
1325 #ifdef DBG_NOISE_MONITOR
1326 DBG_871X("noise_a = %d, noise_b = %d noise_all:%d\n",
1327 podmpriv->noise_level.noise[ODM_RF_PATH_A],
1328 podmpriv->noise_level.noise[ODM_RF_PATH_B],
1329 podmpriv->noise_level.noise_all);
1333 #endif/* ifdef CONFIG_BACKGROUND_NOISE_MONITOR */
1341 bool eqNByte(u8 *str1, u8 *str2, u32 num)
1347 if (str1[num] != str2[num])
1355 /* Return true if chTmp is represent for hex digit and */
1356 /* false otherwise. */
1359 bool IsHexDigit(char chTmp)
1362 (chTmp >= '0' && chTmp <= '9') ||
1363 (chTmp >= 'a' && chTmp <= 'f') ||
1364 (chTmp >= 'A' && chTmp <= 'F')
1374 /* Translate a character to hex digit. */
1376 u32 MapCharToHexDigit(char chTmp)
1378 if (chTmp >= '0' && chTmp <= '9')
1380 else if (chTmp >= 'a' && chTmp <= 'f')
1381 return 10 + (chTmp - 'a');
1382 else if (chTmp >= 'A' && chTmp <= 'F')
1383 return 10 + (chTmp - 'A');
1391 /* Parse hex number from the string pucStr. */
1392 bool GetHexValueFromString(char *szStr, u32 *pu4bVal, u32 *pu4bMove)
1394 char *szScan = szStr;
1396 /* Check input parameter. */
1397 if (!szStr || !pu4bVal || !pu4bMove) {
1398 DBG_871X("GetHexValueFromString(): Invalid input arguments! szStr: %p, pu4bVal: %p, pu4bMove: %p\n",
1399 szStr, pu4bVal, pu4bMove);
1403 /* Initialize output. */
1407 /* Skip leading space. */
1408 while (*szScan != '\0' && (*szScan == ' ' || *szScan == '\t')) {
1413 /* Skip leading '0x' or '0X'. */
1414 if (*szScan == '0' && (*(szScan+1) == 'x' || *(szScan+1) == 'X')) {
1419 /* Check if szScan is now pointer to a character for hex digit, */
1420 /* if not, it means this is not a valid hex number. */
1421 if (!IsHexDigit(*szScan))
1424 /* Parse each digit. */
1427 *pu4bVal += MapCharToHexDigit(*szScan);
1431 } while (IsHexDigit(*szScan));
1436 bool GetFractionValueFromString(
1437 char *szStr, u8 *pInteger, u8 *pFraction, u32 *pu4bMove
1440 char *szScan = szStr;
1442 /* Initialize output. */
1447 /* Skip leading space. */
1448 while (*szScan != '\0' && (*szScan == ' ' || *szScan == '\t')) {
1453 /* Parse each digit. */
1456 *pInteger += (*szScan - '0');
1461 if (*szScan == '.') {
1465 if (*szScan < '0' || *szScan > '9')
1468 *pFraction = *szScan - '0';
1474 } while (*szScan >= '0' && *szScan <= '9');
1481 /* Return true if szStr is comment out with leading "//". */
1483 bool IsCommentString(char *szStr)
1485 if (*szStr == '/' && *(szStr+1) == '/')
1491 bool GetU1ByteIntegerFromStringInDecimal(char *Str, u8 *pInt)
1496 while (Str[i] != '\0') {
1497 if (Str[i] >= '0' && Str[i] <= '9') {
1499 *pInt += (Str[i] - '0');
1509 /* <20121004, Kordan> For example,
1510 * ParseQualifiedString(inString, 0, outString, '[', ']') gets "Kordan" from
1511 * a string "Hello [Kordan]".
1512 * If RightQualifier does not exist, it will hang in the while loop
1514 bool ParseQualifiedString(
1515 char *In, u32 *Start, char *Out, char LeftQualifier, char RightQualifier
1519 char c = In[(*Start)++];
1521 if (c != LeftQualifier)
1525 while ((c = In[(*Start)++]) != RightQualifier)
1528 strncpy((char *)Out, (const char *)(In+i), j-i+1);
1533 bool isAllSpaceOrTab(u8 *data, u8 size)
1535 u8 cnt = 0, NumOfSpaceAndTab = 0;
1537 while (size > cnt) {
1538 if (data[cnt] == ' ' || data[cnt] == '\t' || data[cnt] == '\0')
1544 return size == NumOfSpaceAndTab;
1548 void rtw_hal_check_rxfifo_full(struct adapter *adapter)
1550 struct dvobj_priv *psdpriv = adapter->dvobj;
1551 struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
1552 int save_cnt = false;
1554 /* switch counter to RX fifo */
1555 /* printk("8723b or 8192e , MAC_667 set 0xf0\n"); */
1556 rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xf0);
1558 /* todo: other chips */
1561 /* rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0); */
1562 pdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;
1563 pdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);
1564 pdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;
1568 void linked_info_dump(struct adapter *padapter, u8 benable)
1570 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
1572 if (padapter->bLinkInfoDump == benable)
1575 DBG_871X("%s %s\n", __func__, (benable) ? "enable" : "disable");
1578 pwrctrlpriv->org_power_mgnt = pwrctrlpriv->power_mgnt;/* keep org value */
1579 rtw_pm_set_lps(padapter, PS_MODE_ACTIVE);
1581 pwrctrlpriv->ips_org_mode = pwrctrlpriv->ips_mode;/* keep org value */
1582 rtw_pm_set_ips(padapter, IPS_NONE);
1584 rtw_pm_set_ips(padapter, pwrctrlpriv->ips_org_mode);
1586 rtw_pm_set_lps(padapter, pwrctrlpriv->ips_org_mode);
1588 padapter->bLinkInfoDump = benable;
1591 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1592 void rtw_get_raw_rssi_info(void *sel, struct adapter *padapter)
1594 u8 isCCKrate, rf_path;
1595 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1596 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1600 "RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1601 HDATA_RATE(psample_pkt_rssi->data_rate),
1602 psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all
1605 isCCKrate = psample_pkt_rssi->data_rate <= DESC_RATE11M;
1608 psample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;
1610 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1613 "RF_PATH_%d =>signal_strength:%d(%%), signal_quality:%d(%%)\n",
1614 rf_path, psample_pkt_rssi->mimo_signal_strength[rf_path],
1615 psample_pkt_rssi->mimo_signal_quality[rf_path]
1621 "\trx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1622 psample_pkt_rssi->ofdm_pwr[rf_path],
1623 psample_pkt_rssi->ofdm_snr[rf_path]
1629 void rtw_dump_raw_rssi_info(struct adapter *padapter)
1631 u8 isCCKrate, rf_path;
1632 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1633 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1634 DBG_871X("============ RAW Rx Info dump ===================\n");
1635 DBG_871X("RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1636 HDATA_RATE(psample_pkt_rssi->data_rate), psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);
1638 isCCKrate = psample_pkt_rssi->data_rate <= DESC_RATE11M;
1641 psample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;
1643 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1644 DBG_871X("RF_PATH_%d =>signal_strength:%d(%%), signal_quality:%d(%%)"
1645 , rf_path, psample_pkt_rssi->mimo_signal_strength[rf_path], psample_pkt_rssi->mimo_signal_quality[rf_path]);
1648 printk(", rx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1649 psample_pkt_rssi->ofdm_pwr[rf_path], psample_pkt_rssi->ofdm_snr[rf_path]);
1656 void rtw_store_phy_info(struct adapter *padapter, union recv_frame *prframe)
1658 u8 isCCKrate, rf_path;
1659 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1660 struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
1662 struct odm_phy_info *pPhyInfo = (PODM_PHY_INFO_T)(&pattrib->phy_info);
1663 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1665 psample_pkt_rssi->data_rate = pattrib->data_rate;
1666 isCCKrate = pattrib->data_rate <= DESC_RATE11M;
1668 psample_pkt_rssi->pwdball = pPhyInfo->rx_pwd_ba11;
1669 psample_pkt_rssi->pwr_all = pPhyInfo->recv_signal_power;
1671 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1672 psample_pkt_rssi->mimo_signal_strength[rf_path] = pPhyInfo->rx_mimo_signal_strength[rf_path];
1673 psample_pkt_rssi->mimo_signal_quality[rf_path] = pPhyInfo->rx_mimo_signal_quality[rf_path];
1675 psample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];
1676 psample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];
1682 static u32 Array_kfreemap[] = {
1695 void rtw_bb_rf_gain_offset(struct adapter *padapter)
1697 u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
1699 u32 *Array = Array_kfreemap;
1700 u32 v1 = 0, v2 = 0, target = 0;
1701 /* DBG_871X("+%s value: 0x%02x+\n", __func__, value); */
1704 DBG_871X("Offset RF Gain.\n");
1705 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal = 0x%x\n", padapter->eeprompriv.EEPROMRFGainVal);
1706 if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
1707 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
1709 DBG_871X("Offset RF Gain. before reg 0x7f = 0x%08x\n", res);
1710 /* res &= 0xfff87fff; */
1711 for (i = 0; i < ARRAY_SIZE(Array_kfreemap); i += 2) {
1714 if (v1 == padapter->eeprompriv.EEPROMRFGainVal) {
1715 DBG_871X("Offset RF Gain. got v1 = 0x%x , v2 = 0x%x\n", v1, v2);
1720 DBG_871X("padapter->eeprompriv.EEPROMRFGainVal = 0x%x , Gain offset Target Value = 0x%x\n", padapter->eeprompriv.EEPROMRFGainVal, target);
1721 PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
1723 /* res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; */
1724 /* rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); */
1725 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
1726 DBG_871X("Offset RF Gain. After reg 0x7f = 0x%08x\n", res);
1728 DBG_871X("Offset RF Gain. padapter->eeprompriv.EEPROMRFGainVal = 0x%x != 0xff, didn't run Kfree\n", padapter->eeprompriv.EEPROMRFGainVal);
1730 DBG_871X("Using the default RF gain.\n");