1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
8 #include <linux/kernel.h>
10 #include <rtw_debug.h>
11 #include "hal_com_h2c.h"
13 #include "odm_precomp.h"
15 u8 rtw_hal_data_init(struct adapter *padapter)
17 if (is_primary_adapter(padapter)) { /* if (padapter->isprimary) */
18 padapter->hal_data_sz = sizeof(struct hal_com_data);
19 padapter->HalData = vzalloc(padapter->hal_data_sz);
20 if (!padapter->HalData)
26 void rtw_hal_data_deinit(struct adapter *padapter)
28 if (is_primary_adapter(padapter)) { /* if (padapter->isprimary) */
29 if (padapter->HalData) {
30 vfree(padapter->HalData);
31 padapter->HalData = NULL;
32 padapter->hal_data_sz = 0;
38 void dump_chip_info(struct hal_version ChipVersion)
43 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "Chip Version Info: CHIP_8723B_%s_",
44 IS_NORMAL_CHIP(ChipVersion) ? "Normal_Chip" : "Test_Chip");
46 if (IS_CHIP_VENDOR_TSMC(ChipVersion))
47 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "TSMC_");
48 else if (IS_CHIP_VENDOR_UMC(ChipVersion))
49 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "UMC_");
50 else if (IS_CHIP_VENDOR_SMIC(ChipVersion))
51 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "SMIC_");
53 if (IS_A_CUT(ChipVersion))
54 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "A_CUT_");
55 else if (IS_B_CUT(ChipVersion))
56 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "B_CUT_");
57 else if (IS_C_CUT(ChipVersion))
58 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "C_CUT_");
59 else if (IS_D_CUT(ChipVersion))
60 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "D_CUT_");
61 else if (IS_E_CUT(ChipVersion))
62 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "E_CUT_");
63 else if (IS_I_CUT(ChipVersion))
64 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "I_CUT_");
65 else if (IS_J_CUT(ChipVersion))
66 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "J_CUT_");
67 else if (IS_K_CUT(ChipVersion))
68 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "K_CUT_");
70 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt,
71 "UNKNOWN_CUT(%d)_", ChipVersion.CUTVersion);
73 if (IS_1T1R(ChipVersion))
74 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "1T1R_");
75 else if (IS_1T2R(ChipVersion))
76 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "1T2R_");
77 else if (IS_2T2R(ChipVersion))
78 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "2T2R_");
80 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt,
81 "UNKNOWN_RFTYPE(%d)_", ChipVersion.RFType);
83 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "RomVer(%d)\n", ChipVersion.ROMVer);
87 #define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
91 *Use hardware(efuse), driver parameter(registry) and default channel plan
92 *to decide which one should be used.
95 *padapter pointer of adapter
96 *hw_channel_plan channel plan from HW (efuse/eeprom)
97 * BIT[7] software configure mode; 0:Enable, 1:disable
98 * BIT[6:0] Channel Plan
99 *sw_channel_plan channel plan from SW (registry/module param)
100 *def_channel_plan channel plan used when HW/SW both invalid
101 *AutoLoadFail efuse autoload fail or not
104 *Final channel plan decision
107 u8 hal_com_config_channel_plan(
108 struct adapter *padapter,
115 struct hal_com_data *pHalData;
118 pHalData = GET_HAL_DATA(padapter);
119 pHalData->bDisableSWChannelPlan = false;
120 chnlPlan = def_channel_plan;
122 if (0xFF == hw_channel_plan)
128 hw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);
129 if (rtw_is_channel_plan_valid(hw_chnlPlan)) {
130 if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)
131 pHalData->bDisableSWChannelPlan = true;
133 chnlPlan = hw_chnlPlan;
138 (false == pHalData->bDisableSWChannelPlan) &&
139 rtw_is_channel_plan_valid(sw_channel_plan)
141 chnlPlan = sw_channel_plan;
146 bool HAL_IsLegalChannel(struct adapter *adapter, u32 Channel)
148 bool bLegalChannel = true;
150 if ((Channel <= 14) && (Channel >= 1)) {
151 if (is_supported_24g(adapter->registrypriv.wireless_mode) == false)
152 bLegalChannel = false;
154 bLegalChannel = false;
157 return bLegalChannel;
160 u8 MRateToHwRate(u8 rate)
162 u8 ret = DESC_RATE1M;
232 ret = DESC_RATEMCS10;
235 ret = DESC_RATEMCS11;
238 ret = DESC_RATEMCS12;
241 ret = DESC_RATEMCS13;
244 ret = DESC_RATEMCS14;
247 ret = DESC_RATEMCS15;
250 ret = DESC_RATEMCS16;
253 ret = DESC_RATEMCS17;
256 ret = DESC_RATEMCS18;
259 ret = DESC_RATEMCS19;
262 ret = DESC_RATEMCS20;
265 ret = DESC_RATEMCS21;
268 ret = DESC_RATEMCS22;
271 ret = DESC_RATEMCS23;
274 ret = DESC_RATEMCS24;
277 ret = DESC_RATEMCS25;
280 ret = DESC_RATEMCS26;
283 ret = DESC_RATEMCS27;
286 ret = DESC_RATEMCS28;
289 ret = DESC_RATEMCS29;
292 ret = DESC_RATEMCS30;
295 ret = DESC_RATEMCS31;
304 u8 HwRateToMRate(u8 rate)
306 u8 ret_rate = MGN_1M;
376 ret_rate = MGN_MCS10;
379 ret_rate = MGN_MCS11;
382 ret_rate = MGN_MCS12;
385 ret_rate = MGN_MCS13;
388 ret_rate = MGN_MCS14;
391 ret_rate = MGN_MCS15;
394 ret_rate = MGN_MCS16;
397 ret_rate = MGN_MCS17;
400 ret_rate = MGN_MCS18;
403 ret_rate = MGN_MCS19;
406 ret_rate = MGN_MCS20;
409 ret_rate = MGN_MCS21;
412 ret_rate = MGN_MCS22;
415 ret_rate = MGN_MCS23;
418 ret_rate = MGN_MCS24;
421 ret_rate = MGN_MCS25;
424 ret_rate = MGN_MCS26;
427 ret_rate = MGN_MCS27;
430 ret_rate = MGN_MCS28;
433 ret_rate = MGN_MCS29;
436 ret_rate = MGN_MCS30;
439 ret_rate = MGN_MCS31;
448 void HalSetBrateCfg(struct adapter *Adapter, u8 *mBratesOS, u16 *pBrateCfg)
450 u8 i, is_brate, brate;
452 for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
454 is_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;
455 brate = mBratesOS[i] & 0x7f;
459 case IEEE80211_CCK_RATE_1MB:
460 *pBrateCfg |= RATE_1M;
462 case IEEE80211_CCK_RATE_2MB:
463 *pBrateCfg |= RATE_2M;
465 case IEEE80211_CCK_RATE_5MB:
466 *pBrateCfg |= RATE_5_5M;
468 case IEEE80211_CCK_RATE_11MB:
469 *pBrateCfg |= RATE_11M;
471 case IEEE80211_OFDM_RATE_6MB:
472 *pBrateCfg |= RATE_6M;
474 case IEEE80211_OFDM_RATE_9MB:
475 *pBrateCfg |= RATE_9M;
477 case IEEE80211_OFDM_RATE_12MB:
478 *pBrateCfg |= RATE_12M;
480 case IEEE80211_OFDM_RATE_18MB:
481 *pBrateCfg |= RATE_18M;
483 case IEEE80211_OFDM_RATE_24MB:
484 *pBrateCfg |= RATE_24M;
486 case IEEE80211_OFDM_RATE_36MB:
487 *pBrateCfg |= RATE_36M;
489 case IEEE80211_OFDM_RATE_48MB:
490 *pBrateCfg |= RATE_48M;
492 case IEEE80211_OFDM_RATE_54MB:
493 *pBrateCfg |= RATE_54M;
500 static void _OneOutPipeMapping(struct adapter *padapter)
502 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
504 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
505 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
506 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */
507 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
509 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
510 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
511 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
512 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
515 static void _TwoOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
517 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
519 if (bWIFICfg) { /* WMM */
521 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
522 /* 0, 1, 0, 1, 0, 0, 0, 0, 0 }; */
523 /* 0:ep_0 num, 1:ep_1 num */
525 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */
526 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
527 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
528 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
530 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
531 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
532 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
533 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
535 } else { /* typical setting */
538 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
539 /* 1, 1, 0, 0, 0, 0, 0, 0, 0 }; */
540 /* 0:ep_0 num, 1:ep_1 num */
542 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
543 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
544 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
545 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
547 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
548 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
549 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
550 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
556 static void _ThreeOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
558 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
560 if (bWIFICfg) { /* for WMM */
562 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
563 /* 1, 2, 1, 0, 0, 0, 0, 0, 0 }; */
566 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
567 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
568 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
569 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
571 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
572 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
573 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
574 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
576 } else { /* typical setting */
579 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
580 /* 2, 2, 1, 0, 0, 0, 0, 0, 0 }; */
583 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
584 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
585 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
586 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */
588 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
589 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
590 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
591 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
596 bool Hal_MappingOutPipe(struct adapter *padapter, u8 NumOutPipe)
598 struct registry_priv *pregistrypriv = &padapter->registrypriv;
600 bool bWIFICfg = (pregistrypriv->wifi_spec) ? true : false;
604 switch (NumOutPipe) {
606 _TwoOutPipeMapping(padapter, bWIFICfg);
610 _ThreeOutPipeMapping(padapter, bWIFICfg);
613 _OneOutPipeMapping(padapter);
624 void hal_init_macaddr(struct adapter *adapter)
626 rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr);
629 void rtw_init_hal_com_default_value(struct adapter *Adapter)
631 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
633 pHalData->AntDetection = 1;
638 * Field TRIGGER CONTENT CMD_SEQ CMD_LEN CMD_ID
639 * BITS [127:120] [119:16] [15:8] [7:4] [3:0]
642 void c2h_evt_clear(struct adapter *adapter)
644 rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
649 * Field TRIGGER CMD_LEN CONTENT CMD_SEQ CMD_ID
650 * BITS [127:120] [119:112] [111:16] [15:8] [7:0]
652 s32 c2h_evt_read_88xx(struct adapter *adapter, u8 *buf)
655 struct c2h_evt_hdr_88xx *c2h_evt;
662 trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
664 if (trigger == C2H_EVT_HOST_CLOSE)
665 goto exit; /* Not ready */
666 else if (trigger != C2H_EVT_FW_CLOSE)
667 goto clear_evt; /* Not a valid value */
669 c2h_evt = (struct c2h_evt_hdr_88xx *)buf;
671 memset(c2h_evt, 0, 16);
673 c2h_evt->id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
674 c2h_evt->seq = rtw_read8(adapter, REG_C2HEVT_CMD_SEQ_88XX);
675 c2h_evt->plen = rtw_read8(adapter, REG_C2HEVT_CMD_LEN_88XX);
677 /* Read the content */
678 for (i = 0; i < c2h_evt->plen; i++)
679 c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);
685 * Clear event to notify FW we have read the command.
686 * If this field isn't clear, the FW won't update the next command message.
688 c2h_evt_clear(adapter);
693 u8 rtw_get_mgntframe_raid(struct adapter *adapter, unsigned char network_type)
695 return (network_type & WIRELESS_11B) ? RATEID_IDX_B : RATEID_IDX_G;
698 void rtw_hal_update_sta_rate_mask(struct adapter *padapter, struct sta_info *psta)
700 u8 i, rf_type, limit;
708 /* b/g mode ra_bitmap */
709 for (i = 0; i < sizeof(psta->bssrateset); i++) {
710 if (psta->bssrateset[i])
711 tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
714 /* n mode ra_bitmap */
715 if (psta->htpriv.ht_option) {
716 rtw_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
717 if (rf_type == RF_2T2R)
722 for (i = 0; i < limit; i++) {
723 if (psta->htpriv.ht_cap.mcs.rx_mask[i/8] & BIT(i%8))
724 tx_ra_bitmap |= BIT(i+12);
728 psta->ra_mask = tx_ra_bitmap;
729 psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f;
732 void hw_var_port_switch(struct adapter *adapter)
736 void SetHwReg(struct adapter *adapter, u8 variable, u8 *val)
738 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
739 struct dm_odm_t *odm = &(hal_data->odmpriv);
742 case HW_VAR_PORT_SWITCH:
743 hw_var_port_switch(adapter);
745 case HW_VAR_INIT_RTS_RATE:
752 reg_scr = rtw_read16(adapter, REG_SECCFG);
753 rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
756 case HW_VAR_SEC_DK_CFG:
758 struct security_priv *sec = &adapter->securitypriv;
759 u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
761 if (val) { /* Enable default key related setting */
762 reg_scr |= SCR_TXBCUSEDK;
763 if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
764 reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
765 } else /* Disable default key related setting */
766 reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
768 rtw_write8(adapter, REG_SECCFG, reg_scr);
772 odm->SupportAbility = *((u32 *)val);
774 case HW_VAR_DM_FUNC_OP:
775 if (*((u8 *)val) == true) {
777 odm->BK_SupportAbility = odm->SupportAbility;
779 /* restore dm flag */
780 odm->SupportAbility = odm->BK_SupportAbility;
783 case HW_VAR_DM_FUNC_SET:
784 if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) {
785 struct dm_priv *dm = &hal_data->dmpriv;
786 dm->DMFlag = dm->InitDMFlag;
787 odm->SupportAbility = dm->InitODMFlag;
789 odm->SupportAbility |= *((u32 *)val);
792 case HW_VAR_DM_FUNC_CLR:
794 * input is already a mask to clear function
795 * don't invert it again! George, Lucas@20130513
797 odm->SupportAbility &= *((u32 *)val);
799 case HW_VAR_AMPDU_MIN_SPACE:
800 /* TODO - Is something needed here? */
802 case HW_VAR_WIRELESS_MODE:
803 /* TODO - Is something needed here? */
806 netdev_dbg(adapter->pnetdev,
807 FUNC_ADPT_FMT " variable(%d) not defined!\n",
808 FUNC_ADPT_ARG(adapter), variable);
813 void GetHwReg(struct adapter *adapter, u8 variable, u8 *val)
815 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
816 struct dm_odm_t *odm = &(hal_data->odmpriv);
819 case HW_VAR_BASIC_RATE:
820 *((u16 *)val) = hal_data->BasicRateSet;
823 *((u32 *)val) = odm->SupportAbility;
826 *((u8 *)val) = hal_data->rf_type;
829 netdev_dbg(adapter->pnetdev,
830 FUNC_ADPT_FMT " variable(%d) not defined!\n",
831 FUNC_ADPT_ARG(adapter), variable);
840 struct adapter *adapter, enum hal_def_variable variable, void *value
843 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
844 struct dm_odm_t *odm = &(hal_data->odmpriv);
845 u8 bResult = _SUCCESS;
848 case HAL_DEF_DBG_RX_INFO_DUMP:
851 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
852 rtw_dump_raw_rssi_info(adapter);
856 case HW_DEF_ODM_DBG_FLAG:
857 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u64 *)value));
859 case HW_DEF_ODM_DBG_LEVEL:
860 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u32 *)value));
862 case HAL_DEF_DBG_DM_FUNC:
864 u8 dm_func = *((u8 *)value);
865 struct dm_priv *dm = &hal_data->dmpriv;
867 if (dm_func == 0) { /* disable all dynamic func */
868 odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
869 } else if (dm_func == 1) {/* disable DIG */
870 odm->SupportAbility &= (~DYNAMIC_BB_DIG);
871 } else if (dm_func == 2) {/* disable High power */
872 odm->SupportAbility &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
873 } else if (dm_func == 3) {/* disable tx power tracking */
874 odm->SupportAbility &= (~DYNAMIC_RF_CALIBRATION);
875 } else if (dm_func == 4) {/* disable BT coexistence */
876 dm->DMFlag &= (~DYNAMIC_FUNC_BT);
877 } else if (dm_func == 5) {/* disable antenna diversity */
878 odm->SupportAbility &= (~DYNAMIC_BB_ANT_DIV);
879 } else if (dm_func == 6) {/* turn on all dynamic func */
880 if (!(odm->SupportAbility & DYNAMIC_BB_DIG)) {
881 struct dig_t *pDigTable = &odm->DM_DigTable;
882 pDigTable->CurIGValue = rtw_read8(adapter, 0xc50);
884 dm->DMFlag |= DYNAMIC_FUNC_BT;
885 odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
889 case HAL_DEF_DBG_DUMP_RXPKT:
890 hal_data->bDumpRxPkt = *((u8 *)value);
892 case HAL_DEF_DBG_DUMP_TXPKT:
893 hal_data->bDumpTxPkt = *((u8 *)value);
895 case HAL_DEF_ANT_DETECT:
896 hal_data->AntDetection = *((u8 *)value);
899 netdev_dbg(adapter->pnetdev,
900 "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n",
910 struct adapter *adapter, enum hal_def_variable variable, void *value
913 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
914 u8 bResult = _SUCCESS;
917 case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
919 struct mlme_priv *pmlmepriv;
920 struct sta_priv *pstapriv;
921 struct sta_info *psta;
923 pmlmepriv = &adapter->mlmepriv;
924 pstapriv = &adapter->stapriv;
925 psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.mac_address);
927 *((int *)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;
930 case HAL_DEF_DBG_DM_FUNC:
931 *((u32 *)value) = hal_data->odmpriv.SupportAbility;
933 case HAL_DEF_DBG_DUMP_RXPKT:
934 *((u8 *)value) = hal_data->bDumpRxPkt;
936 case HAL_DEF_DBG_DUMP_TXPKT:
937 *((u8 *)value) = hal_data->bDumpTxPkt;
939 case HAL_DEF_ANT_DETECT:
940 *((u8 *)value) = hal_data->AntDetection;
942 case HAL_DEF_MACID_SLEEP:
943 *(u8 *)value = false;
945 case HAL_DEF_TX_PAGE_SIZE:
946 *((u32 *)value) = PAGE_SIZE_128;
949 netdev_dbg(adapter->pnetdev,
950 "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n",
960 struct adapter *Adapter,
961 enum hal_odm_variable eVariable,
973 struct adapter *Adapter,
974 enum hal_odm_variable eVariable,
979 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
980 struct dm_odm_t *podmpriv = &pHalData->odmpriv;
983 case HAL_ODM_STA_INFO:
985 struct sta_info *psta = pValue1;
987 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, psta);
989 /* spin_lock_bh(&pHalData->odm_stainfo_lock); */
990 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, NULL);
992 /* spin_unlock_bh(&pHalData->odm_stainfo_lock); */
996 case HAL_ODM_P2P_STATE:
997 ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
999 case HAL_ODM_WIFI_DISPLAY_STATE:
1000 ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
1009 bool eqNByte(u8 *str1, u8 *str2, u32 num)
1015 if (str1[num] != str2[num])
1023 /* Return true if chTmp is represent for hex digit and */
1024 /* false otherwise. */
1027 bool IsHexDigit(char chTmp)
1030 (chTmp >= '0' && chTmp <= '9') ||
1031 (chTmp >= 'a' && chTmp <= 'f') ||
1032 (chTmp >= 'A' && chTmp <= 'F')
1042 /* Translate a character to hex digit. */
1044 u32 MapCharToHexDigit(char chTmp)
1046 if (chTmp >= '0' && chTmp <= '9')
1048 else if (chTmp >= 'a' && chTmp <= 'f')
1049 return 10 + (chTmp - 'a');
1050 else if (chTmp >= 'A' && chTmp <= 'F')
1051 return 10 + (chTmp - 'A');
1059 /* Parse hex number from the string pucStr. */
1060 bool GetHexValueFromString(char *szStr, u32 *pu4bVal, u32 *pu4bMove)
1062 char *szScan = szStr;
1064 /* Check input parameter. */
1065 if (!szStr || !pu4bVal || !pu4bMove)
1068 /* Initialize output. */
1072 /* Skip leading space. */
1073 while (*szScan != '\0' && (*szScan == ' ' || *szScan == '\t')) {
1078 /* Skip leading '0x' or '0X'. */
1079 if (*szScan == '0' && (*(szScan+1) == 'x' || *(szScan+1) == 'X')) {
1084 /* Check if szScan is now pointer to a character for hex digit, */
1085 /* if not, it means this is not a valid hex number. */
1086 if (!IsHexDigit(*szScan))
1089 /* Parse each digit. */
1092 *pu4bVal += MapCharToHexDigit(*szScan);
1096 } while (IsHexDigit(*szScan));
1101 bool GetFractionValueFromString(
1102 char *szStr, u8 *pInteger, u8 *pFraction, u32 *pu4bMove
1105 char *szScan = szStr;
1107 /* Initialize output. */
1112 /* Skip leading space. */
1113 while (*szScan != '\0' && (*szScan == ' ' || *szScan == '\t')) {
1118 /* Parse each digit. */
1121 *pInteger += (*szScan - '0');
1126 if (*szScan == '.') {
1130 if (*szScan < '0' || *szScan > '9')
1133 *pFraction = *szScan - '0';
1139 } while (*szScan >= '0' && *szScan <= '9');
1146 /* Return true if szStr is comment out with leading "//". */
1148 bool IsCommentString(char *szStr)
1150 if (*szStr == '/' && *(szStr+1) == '/')
1156 bool GetU1ByteIntegerFromStringInDecimal(char *Str, u8 *pInt)
1161 while (Str[i] != '\0') {
1162 if (Str[i] >= '0' && Str[i] <= '9') {
1164 *pInt += (Str[i] - '0');
1174 /* <20121004, Kordan> For example,
1175 * ParseQualifiedString(inString, 0, outString, '[', ']') gets "Kordan" from
1176 * a string "Hello [Kordan]".
1177 * If RightQualifier does not exist, it will hang in the while loop
1179 bool ParseQualifiedString(
1180 char *In, u32 *Start, char *Out, char LeftQualifier, char RightQualifier
1184 char c = In[(*Start)++];
1186 if (c != LeftQualifier)
1190 while ((c = In[(*Start)++]) != RightQualifier)
1193 strncpy((char *)Out, (const char *)(In+i), j-i+1);
1198 bool isAllSpaceOrTab(u8 *data, u8 size)
1200 u8 cnt = 0, NumOfSpaceAndTab = 0;
1202 while (size > cnt) {
1203 if (data[cnt] == ' ' || data[cnt] == '\t' || data[cnt] == '\0')
1209 return size == NumOfSpaceAndTab;
1213 void rtw_hal_check_rxfifo_full(struct adapter *adapter)
1215 struct dvobj_priv *psdpriv = adapter->dvobj;
1216 struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
1217 int save_cnt = false;
1219 /* switch counter to RX fifo */
1220 /* printk("8723b or 8192e , MAC_667 set 0xf0\n"); */
1221 rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xf0);
1223 /* todo: other chips */
1226 /* rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0); */
1227 pdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;
1228 pdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);
1229 pdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;
1233 void linked_info_dump(struct adapter *padapter, u8 benable)
1235 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
1237 if (padapter->bLinkInfoDump == benable)
1241 pwrctrlpriv->org_power_mgnt = pwrctrlpriv->power_mgnt;/* keep org value */
1242 rtw_pm_set_lps(padapter, PS_MODE_ACTIVE);
1244 pwrctrlpriv->ips_org_mode = pwrctrlpriv->ips_mode;/* keep org value */
1245 rtw_pm_set_ips(padapter, IPS_NONE);
1247 rtw_pm_set_ips(padapter, pwrctrlpriv->ips_org_mode);
1249 rtw_pm_set_lps(padapter, pwrctrlpriv->ips_org_mode);
1251 padapter->bLinkInfoDump = benable;
1254 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1255 void rtw_get_raw_rssi_info(void *sel, struct adapter *padapter)
1257 u8 isCCKrate, rf_path;
1258 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1259 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1261 netdev_dbg(padapter->pnetdev,
1262 "RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1263 HDATA_RATE(psample_pkt_rssi->data_rate),
1264 psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);
1266 isCCKrate = psample_pkt_rssi->data_rate <= DESC_RATE11M;
1269 psample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;
1271 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1272 netdev_dbg(padapter->pnetdev,
1273 "RF_PATH_%d =>signal_strength:%d(%%), signal_quality:%d(%%)\n",
1275 psample_pkt_rssi->mimo_signal_strength[rf_path],
1276 psample_pkt_rssi->mimo_signal_quality[rf_path]);
1279 netdev_dbg(padapter->pnetdev,
1280 "\trx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1281 psample_pkt_rssi->ofdm_pwr[rf_path],
1282 psample_pkt_rssi->ofdm_snr[rf_path]);
1287 void rtw_dump_raw_rssi_info(struct adapter *padapter)
1289 u8 isCCKrate, rf_path;
1290 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1291 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1293 isCCKrate = psample_pkt_rssi->data_rate <= DESC_RATE11M;
1296 psample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;
1298 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1300 printk(", rx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1301 psample_pkt_rssi->ofdm_pwr[rf_path], psample_pkt_rssi->ofdm_snr[rf_path]);
1308 void rtw_store_phy_info(struct adapter *padapter, union recv_frame *prframe)
1310 u8 isCCKrate, rf_path;
1311 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1312 struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
1314 struct odm_phy_info *pPhyInfo = (PODM_PHY_INFO_T)(&pattrib->phy_info);
1315 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1317 psample_pkt_rssi->data_rate = pattrib->data_rate;
1318 isCCKrate = pattrib->data_rate <= DESC_RATE11M;
1320 psample_pkt_rssi->pwdball = pPhyInfo->rx_pwd_ba11;
1321 psample_pkt_rssi->pwr_all = pPhyInfo->recv_signal_power;
1323 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1324 psample_pkt_rssi->mimo_signal_strength[rf_path] = pPhyInfo->rx_mimo_signal_strength[rf_path];
1325 psample_pkt_rssi->mimo_signal_quality[rf_path] = pPhyInfo->rx_mimo_signal_quality[rf_path];
1327 psample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];
1328 psample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];
1334 static u32 Array_kfreemap[] = {
1347 void rtw_bb_rf_gain_offset(struct adapter *padapter)
1349 u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
1351 u32 *Array = Array_kfreemap;
1352 u32 v1 = 0, v2 = 0, target = 0;
1355 if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
1356 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
1358 /* res &= 0xfff87fff; */
1359 for (i = 0; i < ARRAY_SIZE(Array_kfreemap); i += 2) {
1362 if (v1 == padapter->eeprompriv.EEPROMRFGainVal) {
1367 PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
1369 /* res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; */
1370 /* rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); */
1371 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);