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 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "1T1R_");
75 cnt += scnprintf(buf + cnt, sizeof(buf) - cnt, "RomVer(%d)\n", ChipVersion.ROMVer);
79 #define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
83 *Use hardware(efuse), driver parameter(registry) and default channel plan
84 *to decide which one should be used.
87 *padapter pointer of adapter
88 *hw_channel_plan channel plan from HW (efuse/eeprom)
89 * BIT[7] software configure mode; 0:Enable, 1:disable
90 * BIT[6:0] Channel Plan
91 *sw_channel_plan channel plan from SW (registry/module param)
92 *def_channel_plan channel plan used when HW/SW both invalid
93 *AutoLoadFail efuse autoload fail or not
96 *Final channel plan decision
99 u8 hal_com_config_channel_plan(
100 struct adapter *padapter,
107 struct hal_com_data *pHalData;
110 pHalData = GET_HAL_DATA(padapter);
111 pHalData->bDisableSWChannelPlan = false;
112 chnlPlan = def_channel_plan;
114 if (0xFF == hw_channel_plan)
120 hw_chnlPlan = hw_channel_plan & (~EEPROM_CHANNEL_PLAN_BY_HW_MASK);
121 if (rtw_is_channel_plan_valid(hw_chnlPlan)) {
122 if (hw_channel_plan & EEPROM_CHANNEL_PLAN_BY_HW_MASK)
123 pHalData->bDisableSWChannelPlan = true;
125 chnlPlan = hw_chnlPlan;
130 (false == pHalData->bDisableSWChannelPlan) &&
131 rtw_is_channel_plan_valid(sw_channel_plan)
133 chnlPlan = sw_channel_plan;
138 bool HAL_IsLegalChannel(struct adapter *adapter, u32 Channel)
140 bool bLegalChannel = true;
142 if ((Channel <= 14) && (Channel >= 1)) {
143 if (is_supported_24g(adapter->registrypriv.wireless_mode) == false)
144 bLegalChannel = false;
146 bLegalChannel = false;
149 return bLegalChannel;
152 u8 MRateToHwRate(u8 rate)
154 u8 ret = DESC_RATE1M;
224 u8 HwRateToMRate(u8 rate)
226 u8 ret_rate = MGN_1M;
296 void HalSetBrateCfg(struct adapter *Adapter, u8 *mBratesOS, u16 *pBrateCfg)
298 u8 i, is_brate, brate;
300 for (i = 0; i < NDIS_802_11_LENGTH_RATES_EX; i++) {
302 is_brate = mBratesOS[i] & IEEE80211_BASIC_RATE_MASK;
303 brate = mBratesOS[i] & 0x7f;
307 case IEEE80211_CCK_RATE_1MB:
308 *pBrateCfg |= RATE_1M;
310 case IEEE80211_CCK_RATE_2MB:
311 *pBrateCfg |= RATE_2M;
313 case IEEE80211_CCK_RATE_5MB:
314 *pBrateCfg |= RATE_5_5M;
316 case IEEE80211_CCK_RATE_11MB:
317 *pBrateCfg |= RATE_11M;
319 case IEEE80211_OFDM_RATE_6MB:
320 *pBrateCfg |= RATE_6M;
322 case IEEE80211_OFDM_RATE_9MB:
323 *pBrateCfg |= RATE_9M;
325 case IEEE80211_OFDM_RATE_12MB:
326 *pBrateCfg |= RATE_12M;
328 case IEEE80211_OFDM_RATE_18MB:
329 *pBrateCfg |= RATE_18M;
331 case IEEE80211_OFDM_RATE_24MB:
332 *pBrateCfg |= RATE_24M;
334 case IEEE80211_OFDM_RATE_36MB:
335 *pBrateCfg |= RATE_36M;
337 case IEEE80211_OFDM_RATE_48MB:
338 *pBrateCfg |= RATE_48M;
340 case IEEE80211_OFDM_RATE_54MB:
341 *pBrateCfg |= RATE_54M;
348 static void _OneOutPipeMapping(struct adapter *padapter)
350 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
352 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
353 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
354 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[0];/* BE */
355 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
357 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
358 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
359 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
360 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
363 static void _TwoOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
365 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
367 if (bWIFICfg) { /* WMM */
369 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
370 /* 0, 1, 0, 1, 0, 0, 0, 0, 0 }; */
371 /* 0:ep_0 num, 1:ep_1 num */
373 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[1];/* VO */
374 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
375 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
376 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[0];/* BK */
378 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
379 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
380 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
381 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
383 } else { /* typical setting */
386 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
387 /* 1, 1, 0, 0, 0, 0, 0, 0, 0 }; */
388 /* 0:ep_0 num, 1:ep_1 num */
390 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
391 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[0];/* VI */
392 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[1];/* BE */
393 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
395 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
396 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
397 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
398 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
404 static void _ThreeOutPipeMapping(struct adapter *padapter, bool bWIFICfg)
406 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
408 if (bWIFICfg) { /* for WMM */
410 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
411 /* 1, 2, 1, 0, 0, 0, 0, 0, 0 }; */
414 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
415 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
416 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
417 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[1];/* BK */
419 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
420 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
421 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
422 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
424 } else { /* typical setting */
427 /* BK, BE, VI, VO, BCN, CMD, MGT, HIGH, HCCA */
428 /* 2, 2, 1, 0, 0, 0, 0, 0, 0 }; */
431 pdvobjpriv->Queue2Pipe[0] = pdvobjpriv->RtOutPipe[0];/* VO */
432 pdvobjpriv->Queue2Pipe[1] = pdvobjpriv->RtOutPipe[1];/* VI */
433 pdvobjpriv->Queue2Pipe[2] = pdvobjpriv->RtOutPipe[2];/* BE */
434 pdvobjpriv->Queue2Pipe[3] = pdvobjpriv->RtOutPipe[2];/* BK */
436 pdvobjpriv->Queue2Pipe[4] = pdvobjpriv->RtOutPipe[0];/* BCN */
437 pdvobjpriv->Queue2Pipe[5] = pdvobjpriv->RtOutPipe[0];/* MGT */
438 pdvobjpriv->Queue2Pipe[6] = pdvobjpriv->RtOutPipe[0];/* HIGH */
439 pdvobjpriv->Queue2Pipe[7] = pdvobjpriv->RtOutPipe[0];/* TXCMD */
444 bool Hal_MappingOutPipe(struct adapter *padapter, u8 NumOutPipe)
446 struct registry_priv *pregistrypriv = &padapter->registrypriv;
448 bool bWIFICfg = (pregistrypriv->wifi_spec) ? true : false;
452 switch (NumOutPipe) {
454 _TwoOutPipeMapping(padapter, bWIFICfg);
458 _ThreeOutPipeMapping(padapter, bWIFICfg);
461 _OneOutPipeMapping(padapter);
472 void hal_init_macaddr(struct adapter *adapter)
474 rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter->eeprompriv.mac_addr);
477 void rtw_init_hal_com_default_value(struct adapter *Adapter)
479 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
481 pHalData->AntDetection = 1;
486 * Field TRIGGER CONTENT CMD_SEQ CMD_LEN CMD_ID
487 * BITS [127:120] [119:16] [15:8] [7:4] [3:0]
490 void c2h_evt_clear(struct adapter *adapter)
492 rtw_write8(adapter, REG_C2HEVT_CLEAR, C2H_EVT_HOST_CLOSE);
497 * Field TRIGGER CMD_LEN CONTENT CMD_SEQ CMD_ID
498 * BITS [127:120] [119:112] [111:16] [15:8] [7:0]
500 s32 c2h_evt_read_88xx(struct adapter *adapter, u8 *buf)
503 struct c2h_evt_hdr_88xx *c2h_evt;
510 trigger = rtw_read8(adapter, REG_C2HEVT_CLEAR);
512 if (trigger == C2H_EVT_HOST_CLOSE)
513 goto exit; /* Not ready */
514 else if (trigger != C2H_EVT_FW_CLOSE)
515 goto clear_evt; /* Not a valid value */
517 c2h_evt = (struct c2h_evt_hdr_88xx *)buf;
519 memset(c2h_evt, 0, 16);
521 c2h_evt->id = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL);
522 c2h_evt->seq = rtw_read8(adapter, REG_C2HEVT_CMD_SEQ_88XX);
523 c2h_evt->plen = rtw_read8(adapter, REG_C2HEVT_CMD_LEN_88XX);
525 /* Read the content */
526 for (i = 0; i < c2h_evt->plen; i++)
527 c2h_evt->payload[i] = rtw_read8(adapter, REG_C2HEVT_MSG_NORMAL + 2 + i);
533 * Clear event to notify FW we have read the command.
534 * If this field isn't clear, the FW won't update the next command message.
536 c2h_evt_clear(adapter);
541 u8 rtw_get_mgntframe_raid(struct adapter *adapter, unsigned char network_type)
543 return (network_type & WIRELESS_11B) ? RATEID_IDX_B : RATEID_IDX_G;
546 void rtw_hal_update_sta_rate_mask(struct adapter *padapter, struct sta_info *psta)
556 /* b/g mode ra_bitmap */
557 for (i = 0; i < sizeof(psta->bssrateset); i++) {
558 if (psta->bssrateset[i])
559 tx_ra_bitmap |= rtw_get_bit_value_from_ieee_value(psta->bssrateset[i]&0x7f);
562 /* n mode ra_bitmap */
563 if (psta->htpriv.ht_option) {
566 for (i = 0; i < limit; i++) {
567 if (psta->htpriv.ht_cap.mcs.rx_mask[i/8] & BIT(i%8))
568 tx_ra_bitmap |= BIT(i+12);
572 psta->ra_mask = tx_ra_bitmap;
573 psta->init_rate = get_highest_rate_idx(tx_ra_bitmap)&0x3f;
576 void hw_var_port_switch(struct adapter *adapter)
580 void SetHwReg(struct adapter *adapter, u8 variable, u8 *val)
582 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
583 struct dm_odm_t *odm = &(hal_data->odmpriv);
586 case HW_VAR_PORT_SWITCH:
587 hw_var_port_switch(adapter);
589 case HW_VAR_INIT_RTS_RATE:
596 reg_scr = rtw_read16(adapter, REG_SECCFG);
597 rtw_write16(adapter, REG_SECCFG, reg_scr|SCR_CHK_KEYID|SCR_RxDecEnable|SCR_TxEncEnable);
600 case HW_VAR_SEC_DK_CFG:
602 struct security_priv *sec = &adapter->securitypriv;
603 u8 reg_scr = rtw_read8(adapter, REG_SECCFG);
605 if (val) { /* Enable default key related setting */
606 reg_scr |= SCR_TXBCUSEDK;
607 if (sec->dot11AuthAlgrthm != dot11AuthAlgrthm_8021X)
608 reg_scr |= (SCR_RxUseDK|SCR_TxUseDK);
609 } else /* Disable default key related setting */
610 reg_scr &= ~(SCR_RXBCUSEDK|SCR_TXBCUSEDK|SCR_RxUseDK|SCR_TxUseDK);
612 rtw_write8(adapter, REG_SECCFG, reg_scr);
616 odm->SupportAbility = *((u32 *)val);
618 case HW_VAR_DM_FUNC_OP:
619 if (*((u8 *)val) == true) {
621 odm->BK_SupportAbility = odm->SupportAbility;
623 /* restore dm flag */
624 odm->SupportAbility = odm->BK_SupportAbility;
627 case HW_VAR_DM_FUNC_SET:
628 if (*((u32 *)val) == DYNAMIC_ALL_FUNC_ENABLE) {
629 struct dm_priv *dm = &hal_data->dmpriv;
630 dm->DMFlag = dm->InitDMFlag;
631 odm->SupportAbility = dm->InitODMFlag;
633 odm->SupportAbility |= *((u32 *)val);
636 case HW_VAR_DM_FUNC_CLR:
638 * input is already a mask to clear function
639 * don't invert it again! George, Lucas@20130513
641 odm->SupportAbility &= *((u32 *)val);
643 case HW_VAR_AMPDU_MIN_SPACE:
644 /* TODO - Is something needed here? */
646 case HW_VAR_WIRELESS_MODE:
647 /* TODO - Is something needed here? */
650 netdev_dbg(adapter->pnetdev,
651 FUNC_ADPT_FMT " variable(%d) not defined!\n",
652 FUNC_ADPT_ARG(adapter), variable);
657 void GetHwReg(struct adapter *adapter, u8 variable, u8 *val)
659 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
660 struct dm_odm_t *odm = &(hal_data->odmpriv);
663 case HW_VAR_BASIC_RATE:
664 *((u16 *)val) = hal_data->BasicRateSet;
667 *((u32 *)val) = odm->SupportAbility;
670 netdev_dbg(adapter->pnetdev,
671 FUNC_ADPT_FMT " variable(%d) not defined!\n",
672 FUNC_ADPT_ARG(adapter), variable);
681 struct adapter *adapter, enum hal_def_variable variable, void *value
684 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
685 struct dm_odm_t *odm = &(hal_data->odmpriv);
686 u8 bResult = _SUCCESS;
689 case HAL_DEF_DBG_RX_INFO_DUMP:
692 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
693 rtw_dump_raw_rssi_info(adapter);
697 case HW_DEF_ODM_DBG_FLAG:
698 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_COMP, *((u64 *)value));
700 case HW_DEF_ODM_DBG_LEVEL:
701 ODM_CmnInfoUpdate(odm, ODM_CMNINFO_DBG_LEVEL, *((u32 *)value));
703 case HAL_DEF_DBG_DM_FUNC:
705 u8 dm_func = *((u8 *)value);
706 struct dm_priv *dm = &hal_data->dmpriv;
708 if (dm_func == 0) { /* disable all dynamic func */
709 odm->SupportAbility = DYNAMIC_FUNC_DISABLE;
710 } else if (dm_func == 1) {/* disable DIG */
711 odm->SupportAbility &= (~DYNAMIC_BB_DIG);
712 } else if (dm_func == 2) {/* disable High power */
713 odm->SupportAbility &= (~DYNAMIC_BB_DYNAMIC_TXPWR);
714 } else if (dm_func == 3) {/* disable tx power tracking */
715 odm->SupportAbility &= (~DYNAMIC_RF_CALIBRATION);
716 } else if (dm_func == 4) {/* disable BT coexistence */
717 dm->DMFlag &= (~DYNAMIC_FUNC_BT);
718 } else if (dm_func == 5) {/* disable antenna diversity */
719 odm->SupportAbility &= (~DYNAMIC_BB_ANT_DIV);
720 } else if (dm_func == 6) {/* turn on all dynamic func */
721 if (!(odm->SupportAbility & DYNAMIC_BB_DIG)) {
722 struct dig_t *pDigTable = &odm->DM_DigTable;
723 pDigTable->CurIGValue = rtw_read8(adapter, 0xc50);
725 dm->DMFlag |= DYNAMIC_FUNC_BT;
726 odm->SupportAbility = DYNAMIC_ALL_FUNC_ENABLE;
730 case HAL_DEF_DBG_DUMP_RXPKT:
731 hal_data->bDumpRxPkt = *((u8 *)value);
733 case HAL_DEF_DBG_DUMP_TXPKT:
734 hal_data->bDumpTxPkt = *((u8 *)value);
736 case HAL_DEF_ANT_DETECT:
737 hal_data->AntDetection = *((u8 *)value);
740 netdev_dbg(adapter->pnetdev,
741 "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n",
751 struct adapter *adapter, enum hal_def_variable variable, void *value
754 struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
755 u8 bResult = _SUCCESS;
758 case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
760 struct mlme_priv *pmlmepriv;
761 struct sta_priv *pstapriv;
762 struct sta_info *psta;
764 pmlmepriv = &adapter->mlmepriv;
765 pstapriv = &adapter->stapriv;
766 psta = rtw_get_stainfo(pstapriv, pmlmepriv->cur_network.network.mac_address);
768 *((int *)value) = psta->rssi_stat.UndecoratedSmoothedPWDB;
771 case HAL_DEF_DBG_DM_FUNC:
772 *((u32 *)value) = hal_data->odmpriv.SupportAbility;
774 case HAL_DEF_DBG_DUMP_RXPKT:
775 *((u8 *)value) = hal_data->bDumpRxPkt;
777 case HAL_DEF_DBG_DUMP_TXPKT:
778 *((u8 *)value) = hal_data->bDumpTxPkt;
780 case HAL_DEF_ANT_DETECT:
781 *((u8 *)value) = hal_data->AntDetection;
783 case HAL_DEF_MACID_SLEEP:
784 *(u8 *)value = false;
786 case HAL_DEF_TX_PAGE_SIZE:
787 *((u32 *)value) = PAGE_SIZE_128;
790 netdev_dbg(adapter->pnetdev,
791 "%s: [WARNING] HAL_DEF_VARIABLE(%d) not defined!\n",
801 struct adapter *Adapter,
802 enum hal_odm_variable eVariable,
814 struct adapter *Adapter,
815 enum hal_odm_variable eVariable,
820 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
821 struct dm_odm_t *podmpriv = &pHalData->odmpriv;
824 case HAL_ODM_STA_INFO:
826 struct sta_info *psta = pValue1;
828 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, psta);
830 /* spin_lock_bh(&pHalData->odm_stainfo_lock); */
831 ODM_CmnInfoPtrArrayHook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->mac_id, NULL);
833 /* spin_unlock_bh(&pHalData->odm_stainfo_lock); */
837 case HAL_ODM_P2P_STATE:
838 ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
840 case HAL_ODM_WIFI_DISPLAY_STATE:
841 ODM_CmnInfoUpdate(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
850 bool eqNByte(u8 *str1, u8 *str2, u32 num)
856 if (str1[num] != str2[num])
864 /* Return true if chTmp is represent for hex digit and */
865 /* false otherwise. */
868 bool IsHexDigit(char chTmp)
871 (chTmp >= '0' && chTmp <= '9') ||
872 (chTmp >= 'a' && chTmp <= 'f') ||
873 (chTmp >= 'A' && chTmp <= 'F')
883 /* Translate a character to hex digit. */
885 u32 MapCharToHexDigit(char chTmp)
887 if (chTmp >= '0' && chTmp <= '9')
889 else if (chTmp >= 'a' && chTmp <= 'f')
890 return 10 + (chTmp - 'a');
891 else if (chTmp >= 'A' && chTmp <= 'F')
892 return 10 + (chTmp - 'A');
900 /* Parse hex number from the string pucStr. */
901 bool GetHexValueFromString(char *szStr, u32 *pu4bVal, u32 *pu4bMove)
903 char *szScan = szStr;
905 /* Check input parameter. */
906 if (!szStr || !pu4bVal || !pu4bMove)
909 /* Initialize output. */
913 /* Skip leading space. */
914 while (*szScan != '\0' && (*szScan == ' ' || *szScan == '\t')) {
919 /* Skip leading '0x' or '0X'. */
920 if (*szScan == '0' && (*(szScan+1) == 'x' || *(szScan+1) == 'X')) {
925 /* Check if szScan is now pointer to a character for hex digit, */
926 /* if not, it means this is not a valid hex number. */
927 if (!IsHexDigit(*szScan))
930 /* Parse each digit. */
933 *pu4bVal += MapCharToHexDigit(*szScan);
937 } while (IsHexDigit(*szScan));
942 bool GetFractionValueFromString(
943 char *szStr, u8 *pInteger, u8 *pFraction, u32 *pu4bMove
946 char *szScan = szStr;
948 /* Initialize output. */
953 /* Skip leading space. */
954 while (*szScan != '\0' && (*szScan == ' ' || *szScan == '\t')) {
959 /* Parse each digit. */
962 *pInteger += (*szScan - '0');
967 if (*szScan == '.') {
971 if (*szScan < '0' || *szScan > '9')
974 *pFraction = *szScan - '0';
980 } while (*szScan >= '0' && *szScan <= '9');
987 /* Return true if szStr is comment out with leading "//". */
989 bool IsCommentString(char *szStr)
991 if (*szStr == '/' && *(szStr+1) == '/')
997 bool GetU1ByteIntegerFromStringInDecimal(char *Str, u8 *pInt)
1002 while (Str[i] != '\0') {
1003 if (Str[i] >= '0' && Str[i] <= '9') {
1005 *pInt += (Str[i] - '0');
1015 /* <20121004, Kordan> For example,
1016 * ParseQualifiedString(inString, 0, outString, '[', ']') gets "Kordan" from
1017 * a string "Hello [Kordan]".
1018 * If RightQualifier does not exist, it will hang in the while loop
1020 bool ParseQualifiedString(
1021 char *In, u32 *Start, char *Out, char LeftQualifier, char RightQualifier
1025 char c = In[(*Start)++];
1027 if (c != LeftQualifier)
1031 while ((c = In[(*Start)++]) != RightQualifier)
1034 strncpy((char *)Out, (const char *)(In+i), j-i+1);
1039 bool isAllSpaceOrTab(u8 *data, u8 size)
1041 u8 cnt = 0, NumOfSpaceAndTab = 0;
1043 while (size > cnt) {
1044 if (data[cnt] == ' ' || data[cnt] == '\t' || data[cnt] == '\0')
1050 return size == NumOfSpaceAndTab;
1054 void rtw_hal_check_rxfifo_full(struct adapter *adapter)
1056 struct dvobj_priv *psdpriv = adapter->dvobj;
1057 struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
1058 int save_cnt = false;
1060 /* switch counter to RX fifo */
1061 /* printk("8723b or 8192e , MAC_667 set 0xf0\n"); */
1062 rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xf0);
1064 /* todo: other chips */
1067 /* rtw_write8(adapter, REG_RXERR_RPT+3, rtw_read8(adapter, REG_RXERR_RPT+3)|0xa0); */
1068 pdbgpriv->dbg_rx_fifo_last_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow;
1069 pdbgpriv->dbg_rx_fifo_curr_overflow = rtw_read16(adapter, REG_RXERR_RPT);
1070 pdbgpriv->dbg_rx_fifo_diff_overflow = pdbgpriv->dbg_rx_fifo_curr_overflow-pdbgpriv->dbg_rx_fifo_last_overflow;
1074 void linked_info_dump(struct adapter *padapter, u8 benable)
1076 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
1078 if (padapter->bLinkInfoDump == benable)
1082 pwrctrlpriv->org_power_mgnt = pwrctrlpriv->power_mgnt;/* keep org value */
1083 rtw_pm_set_lps(padapter, PS_MODE_ACTIVE);
1085 pwrctrlpriv->ips_org_mode = pwrctrlpriv->ips_mode;/* keep org value */
1086 rtw_pm_set_ips(padapter, IPS_NONE);
1088 rtw_pm_set_ips(padapter, pwrctrlpriv->ips_org_mode);
1090 rtw_pm_set_lps(padapter, pwrctrlpriv->ips_org_mode);
1092 padapter->bLinkInfoDump = benable;
1095 #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
1096 void rtw_get_raw_rssi_info(void *sel, struct adapter *padapter)
1098 u8 isCCKrate, rf_path;
1099 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1100 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1102 netdev_dbg(padapter->pnetdev,
1103 "RxRate = %s, PWDBALL = %d(%%), rx_pwr_all = %d(dBm)\n",
1104 HDATA_RATE(psample_pkt_rssi->data_rate),
1105 psample_pkt_rssi->pwdball, psample_pkt_rssi->pwr_all);
1107 isCCKrate = psample_pkt_rssi->data_rate <= DESC_RATE11M;
1110 psample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;
1112 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1113 netdev_dbg(padapter->pnetdev,
1114 "RF_PATH_%d =>signal_strength:%d(%%), signal_quality:%d(%%)\n",
1116 psample_pkt_rssi->mimo_signal_strength[rf_path],
1117 psample_pkt_rssi->mimo_signal_quality[rf_path]);
1120 netdev_dbg(padapter->pnetdev,
1121 "\trx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1122 psample_pkt_rssi->ofdm_pwr[rf_path],
1123 psample_pkt_rssi->ofdm_snr[rf_path]);
1128 void rtw_dump_raw_rssi_info(struct adapter *padapter)
1130 u8 isCCKrate, rf_path;
1131 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1132 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1134 isCCKrate = psample_pkt_rssi->data_rate <= DESC_RATE11M;
1137 psample_pkt_rssi->mimo_signal_strength[0] = psample_pkt_rssi->pwdball;
1139 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1141 printk(", rx_ofdm_pwr:%d(dBm), rx_ofdm_snr:%d(dB)\n",
1142 psample_pkt_rssi->ofdm_pwr[rf_path], psample_pkt_rssi->ofdm_snr[rf_path]);
1149 void rtw_store_phy_info(struct adapter *padapter, union recv_frame *prframe)
1151 u8 isCCKrate, rf_path;
1152 struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1153 struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
1155 struct odm_phy_info *pPhyInfo = (PODM_PHY_INFO_T)(&pattrib->phy_info);
1156 struct rx_raw_rssi *psample_pkt_rssi = &padapter->recvpriv.raw_rssi_info;
1158 psample_pkt_rssi->data_rate = pattrib->data_rate;
1159 isCCKrate = pattrib->data_rate <= DESC_RATE11M;
1161 psample_pkt_rssi->pwdball = pPhyInfo->rx_pwd_ba11;
1162 psample_pkt_rssi->pwr_all = pPhyInfo->recv_signal_power;
1164 for (rf_path = 0; rf_path < pHalData->NumTotalRFPath; rf_path++) {
1165 psample_pkt_rssi->mimo_signal_strength[rf_path] = pPhyInfo->rx_mimo_signal_strength[rf_path];
1166 psample_pkt_rssi->mimo_signal_quality[rf_path] = pPhyInfo->rx_mimo_signal_quality[rf_path];
1168 psample_pkt_rssi->ofdm_pwr[rf_path] = pPhyInfo->RxPwr[rf_path];
1169 psample_pkt_rssi->ofdm_snr[rf_path] = pPhyInfo->RxSNR[rf_path];
1175 static u32 Array_kfreemap[] = {
1188 void rtw_bb_rf_gain_offset(struct adapter *padapter)
1190 u8 value = padapter->eeprompriv.EEPROMRFGainOffset;
1192 u32 *Array = Array_kfreemap;
1193 u32 v1 = 0, v2 = 0, target = 0;
1196 if (padapter->eeprompriv.EEPROMRFGainVal != 0xff) {
1197 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);
1199 /* res &= 0xfff87fff; */
1200 for (i = 0; i < ARRAY_SIZE(Array_kfreemap); i += 2) {
1203 if (v1 == padapter->eeprompriv.EEPROMRFGainVal) {
1208 PHY_SetRFReg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, BIT18|BIT17|BIT16|BIT15, target);
1210 /* res |= (padapter->eeprompriv.EEPROMRFGainVal & 0x0f)<< 15; */
1211 /* rtw_hal_write_rfreg(padapter, RF_PATH_A, REG_RF_BB_GAIN_OFFSET, RF_GAIN_OFFSET_MASK, res); */
1212 res = rtw_hal_read_rfreg(padapter, RF_PATH_A, 0x7f, 0xffffffff);