1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 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 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
23 #include <drv_types.h>
26 const u32 _chip_type_to_odm_ic_type[] = {
38 void rtw_hal_chip_configure(_adapter *padapter)
40 padapter->HalFunc.intf_chip_configure(padapter);
43 void rtw_hal_read_chip_info(_adapter *padapter)
45 u8 hci_type = rtw_get_intf_type(padapter);
46 u32 start = rtw_get_current_time();
48 padapter->HalFunc.read_adapter_info(padapter);
50 DBG_871X("%s in %d ms\n", __func__, rtw_get_passing_time_ms(start));
53 void rtw_hal_read_chip_version(_adapter *padapter)
55 padapter->HalFunc.read_chip_version(padapter);
56 rtw_odm_init_ic_type(padapter);
59 void rtw_hal_def_value_init(_adapter *padapter)
61 if (is_primary_adapter(padapter)) {
62 padapter->HalFunc.init_default_value(padapter);
64 rtw_init_hal_com_default_value(padapter);
67 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
68 struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);
70 /* hal_spec is ready here */
71 dvobj->macid_ctl.num = rtw_min(hal_spec->macid_num, MACID_NUM_SW_LIMIT);
73 dvobj->cam_ctl.sec_cap = hal_spec->sec_cap;
74 dvobj->cam_ctl.num = rtw_min(hal_spec->sec_cam_ent_num, SEC_CAM_ENT_NUM_SW_LIMIT);
79 u8 rtw_hal_data_init(_adapter *padapter)
81 if (is_primary_adapter(padapter)) {
82 padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
83 padapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);
84 if(padapter->HalData == NULL){
85 DBG_8192C("cant not alloc memory for HAL DATA \n");
92 void rtw_hal_data_deinit(_adapter *padapter)
94 if (is_primary_adapter(padapter)) {
95 if (padapter->HalData)
97 rtw_vmfree(padapter->HalData, padapter->hal_data_sz);
98 padapter->HalData = NULL;
99 padapter->hal_data_sz = 0;
104 void rtw_hal_free_data(_adapter *padapter)
107 rtw_hal_data_deinit(padapter);
109 void rtw_hal_dm_init(_adapter *padapter)
111 if (is_primary_adapter(padapter)) {
112 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
114 padapter->HalFunc.dm_init(padapter);
116 _rtw_spinlock_init(&pHalData->IQKSpinLock);
118 phy_load_tx_power_ext_info(padapter);
121 void rtw_hal_dm_deinit(_adapter *padapter)
123 if (is_primary_adapter(padapter)) {
124 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
126 padapter->HalFunc.dm_deinit(padapter);
128 _rtw_spinlock_free(&pHalData->IQKSpinLock);
131 void rtw_hal_sw_led_init(_adapter *padapter)
133 if(padapter->HalFunc.InitSwLeds)
134 padapter->HalFunc.InitSwLeds(padapter);
137 void rtw_hal_sw_led_deinit(_adapter *padapter)
139 if(padapter->HalFunc.DeInitSwLeds)
140 padapter->HalFunc.DeInitSwLeds(padapter);
143 u32 rtw_hal_power_on(_adapter *padapter)
145 return padapter->HalFunc.hal_power_on(padapter);
147 void rtw_hal_power_off(_adapter *padapter)
149 struct macid_ctl_t *macid_ctl = &padapter->dvobj->macid_ctl;
151 _rtw_memset(macid_ctl->h2c_msr, 0, MACID_NUM_SW_LIMIT);
153 padapter->HalFunc.hal_power_off(padapter);
157 void rtw_hal_init_opmode(_adapter *padapter)
159 NDIS_802_11_NETWORK_INFRASTRUCTURE networkType = Ndis802_11InfrastructureMax;
160 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
163 fw_state = get_fwstate(pmlmepriv);
165 if (fw_state & WIFI_ADHOC_STATE)
166 networkType = Ndis802_11IBSS;
167 else if (fw_state & WIFI_STATION_STATE)
168 networkType = Ndis802_11Infrastructure;
169 else if (fw_state & WIFI_AP_STATE)
170 networkType = Ndis802_11APMode;
174 rtw_setopmode_cmd(padapter, networkType, _FALSE);
177 uint rtw_hal_init(_adapter *padapter)
179 uint status = _SUCCESS;
180 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
181 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
184 status = padapter->HalFunc.hal_init(padapter);
186 if (status == _SUCCESS) {
187 pHalData->hw_init_completed = _TRUE;
189 if (padapter->registrypriv.notch_filter == 1)
190 rtw_hal_notch_filter(padapter, 1);
192 for (i = 0; i<dvobj->iface_nums; i++)
193 rtw_sec_restore_wep_key(dvobj->padapters[i]);
195 rtw_led_control(padapter, LED_CTL_POWER_ON);
197 init_hw_mlme_ext(padapter);
199 rtw_hal_init_opmode(padapter);
201 #ifdef CONFIG_RF_GAIN_OFFSET
202 rtw_bb_rf_gain_offset(padapter);
203 #endif //CONFIG_RF_GAIN_OFFSET
206 pHalData->hw_init_completed = _FALSE;
207 DBG_871X("rtw_hal_init: hal__init fail\n");
210 RT_TRACE(_module_hal_init_c_,_drv_err_,("-rtl871x_hal_init:status=0x%x\n",status));
216 uint rtw_hal_deinit(_adapter *padapter)
218 uint status = _SUCCESS;
219 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
220 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
224 status = padapter->HalFunc.hal_deinit(padapter);
226 if(status == _SUCCESS){
227 rtw_led_control(padapter, LED_CTL_POWER_OFF);
228 pHalData->hw_init_completed = _FALSE;
232 DBG_871X("\n rtw_hal_deinit: hal_init fail\n");
240 void rtw_hal_set_hwreg(_adapter *padapter, u8 variable, u8 *val)
242 padapter->HalFunc.SetHwRegHandler(padapter, variable, val);
245 void rtw_hal_get_hwreg(_adapter *padapter, u8 variable, u8 *val)
247 padapter->HalFunc.GetHwRegHandler(padapter, variable, val);
250 #ifdef CONFIG_C2H_PACKET_EN
251 void rtw_hal_set_hwreg_with_buf(_adapter *padapter, u8 variable, u8 *pbuf, int len)
253 if (padapter->HalFunc.SetHwRegHandlerWithBuf)
254 padapter->HalFunc.SetHwRegHandlerWithBuf(padapter, variable, pbuf, len);
258 u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue)
260 return padapter->HalFunc.SetHalDefVarHandler(padapter,eVariable,pValue);
262 u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, PVOID pValue)
264 return padapter->HalFunc.GetHalDefVarHandler(padapter,eVariable,pValue);
267 void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,BOOLEAN bSet)
269 padapter->HalFunc.SetHalODMVarHandler(padapter,eVariable,pValue1,bSet);
271 void rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, PVOID pValue1,PVOID pValue2)
273 padapter->HalFunc.GetHalODMVarHandler(padapter,eVariable,pValue1,pValue2);
276 /* FOR SDIO & PCIE */
277 void rtw_hal_enable_interrupt(_adapter *padapter)
279 #if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
280 padapter->HalFunc.enable_interrupt(padapter);
281 #endif //#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
284 /* FOR SDIO & PCIE */
285 void rtw_hal_disable_interrupt(_adapter *padapter)
287 #if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
288 padapter->HalFunc.disable_interrupt(padapter);
289 #endif //#if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
293 u8 rtw_hal_check_ips_status(_adapter *padapter)
296 if (padapter->HalFunc.check_ips_status)
297 val = padapter->HalFunc.check_ips_status(padapter);
299 DBG_871X("%s: HalFunc.check_ips_status is NULL!\n", __FUNCTION__);
304 s32 rtw_hal_fw_dl(_adapter *padapter)
306 return padapter->HalFunc.fw_dl(padapter);
310 #if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)
311 u32 rtw_hal_inirp_init(_adapter *padapter)
313 if (is_primary_adapter(padapter))
314 return padapter->HalFunc.inirp_init(padapter);
317 u32 rtw_hal_inirp_deinit(_adapter *padapter)
320 if (is_primary_adapter(padapter))
321 return padapter->HalFunc.inirp_deinit(padapter);
325 #endif //#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)
327 #if defined(CONFIG_PCI_HCI)
328 void rtw_hal_irp_reset(_adapter *padapter)
330 padapter->HalFunc.irp_reset(GET_PRIMARY_ADAPTER(padapter));
332 #endif //#if defined(CONFIG_PCI_HCI)
334 /* for USB Auto-suspend */
335 u8 rtw_hal_intf_ps_func(_adapter *padapter,HAL_INTF_PS_FUNC efunc_id, u8* val)
337 if(padapter->HalFunc.interface_ps_func)
338 return padapter->HalFunc.interface_ps_func(padapter,efunc_id,val);
342 s32 rtw_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
344 return padapter->HalFunc.hal_xmitframe_enqueue(padapter, pxmitframe);
347 s32 rtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe)
349 return padapter->HalFunc.hal_xmit(padapter, pxmitframe);
353 * [IMPORTANT] This function would be run in interrupt context.
355 s32 rtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe)
359 struct rtw_ieee80211_hdr *pwlanhdr;
360 struct sta_info *psta;
361 struct sta_priv *pstapriv = &padapter->stapriv;
363 update_mgntframe_attrib_addr(padapter, pmgntframe);
364 pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
365 subtype = GetFrameSubType(pframe); /* bit(7)~bit(2) */
367 //pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
368 //_rtw_memcpy(pmgntframe->attrib.ra, pwlanhdr->addr1, ETH_ALEN);
370 #ifdef CONFIG_IEEE80211W
371 if (padapter->securitypriv.binstallBIPkey == _TRUE && (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||
372 subtype == WIFI_ACTION))
374 if (IS_MCAST(pmgntframe->attrib.ra) && pmgntframe->attrib.key_type != IEEE80211W_NO_KEY) {
375 pmgntframe->attrib.encrypt = _BIP_;
376 /* pmgntframe->attrib.bswenc = _TRUE; */
377 } else if (pmgntframe->attrib.key_type != IEEE80211W_NO_KEY) {
378 psta = rtw_get_stainfo(pstapriv, pmgntframe->attrib.ra);
379 if (psta && psta->bpairwise_key_installed == _TRUE) {
380 pmgntframe->attrib.encrypt = _AES_;
381 pmgntframe->attrib.bswenc = _TRUE;
383 DBG_871X("%s, %d, bpairwise_key_installed is FALSE\n", __func__, __LINE__);
384 goto no_mgmt_coalesce;
387 DBG_871X("encrypt=%d, bswenc=%d\n", pmgntframe->attrib.encrypt, pmgntframe->attrib.bswenc);
388 rtw_mgmt_xmitframe_coalesce(padapter, pmgntframe->pkt, pmgntframe);
390 #endif //CONFIG_IEEE80211W
392 ret = padapter->HalFunc.mgnt_xmit(padapter, pmgntframe);
396 s32 rtw_hal_init_xmit_priv(_adapter *padapter)
398 return padapter->HalFunc.init_xmit_priv(padapter);
400 void rtw_hal_free_xmit_priv(_adapter *padapter)
402 padapter->HalFunc.free_xmit_priv(padapter);
405 s32 rtw_hal_init_recv_priv(_adapter *padapter)
407 return padapter->HalFunc.init_recv_priv(padapter);
409 void rtw_hal_free_recv_priv(_adapter *padapter)
411 padapter->HalFunc.free_recv_priv(padapter);
414 void rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level)
417 struct mlme_priv *pmlmepriv;
422 padapter = psta->padapter;
424 pmlmepriv = &(padapter->mlmepriv);
426 if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
428 add_RATid(padapter, psta, rssi_level);
432 padapter->HalFunc.UpdateRAMaskHandler(padapter, psta->mac_id, rssi_level);
436 void rtw_hal_add_ra_tid(_adapter *padapter, u64 bitmap, u8 *arg, u8 rssi_level)
438 padapter->HalFunc.Add_RateATid(padapter, bitmap, arg, rssi_level);
441 /* Start specifical interface thread */
442 void rtw_hal_start_thread(_adapter *padapter)
444 #if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
445 #ifndef CONFIG_SDIO_TX_TASKLET
446 padapter->HalFunc.run_thread(padapter);
450 /* Start specifical interface thread */
451 void rtw_hal_stop_thread(_adapter *padapter)
453 #if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
454 #ifndef CONFIG_SDIO_TX_TASKLET
456 padapter->HalFunc.cancel_thread(padapter);
462 u32 rtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask)
465 if(padapter->HalFunc.read_bbreg)
466 data = padapter->HalFunc.read_bbreg(padapter, RegAddr, BitMask);
469 void rtw_hal_write_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data)
471 if(padapter->HalFunc.write_bbreg)
472 padapter->HalFunc.write_bbreg(padapter, RegAddr, BitMask, Data);
475 u32 rtw_hal_read_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask)
479 if (padapter->HalFunc.read_rfreg) {
480 data = padapter->HalFunc.read_rfreg(padapter, eRFPath, RegAddr, BitMask);
482 if (match_rf_read_sniff_ranges(eRFPath, RegAddr, BitMask)) {
483 DBG_871X("DBG_IO rtw_hal_read_rfreg(%u, 0x%04x, 0x%08x) read:0x%08x(0x%08x)\n"
484 , eRFPath, RegAddr, BitMask, (data << PHY_CalculateBitShift(BitMask)), data);
491 void rtw_hal_write_rfreg(_adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
493 if (padapter->HalFunc.write_rfreg) {
495 if (match_rf_write_sniff_ranges(eRFPath, RegAddr, BitMask)) {
496 DBG_871X("DBG_IO rtw_hal_write_rfreg(%u, 0x%04x, 0x%08x) write:0x%08x(0x%08x)\n"
497 , eRFPath, RegAddr, BitMask, (Data << PHY_CalculateBitShift(BitMask)), Data);
500 padapter->HalFunc.write_rfreg(padapter, eRFPath, RegAddr, BitMask, Data);
502 #ifdef CONFIG_PCI_HCI
503 if (!IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(padapter)) /*For N-Series IC, suggest by Jenyu*/
509 #if defined(CONFIG_PCI_HCI)
510 s32 rtw_hal_interrupt_handler(_adapter *padapter)
513 ret = padapter->HalFunc.interrupt_handler(padapter);
517 #if defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT)
518 void rtw_hal_interrupt_handler(_adapter *padapter, u16 pkt_len, u8 *pbuf)
520 padapter->HalFunc.interrupt_handler(padapter, pkt_len, pbuf);
524 void rtw_hal_set_bwmode(_adapter *padapter, CHANNEL_WIDTH Bandwidth, u8 Offset)
526 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
527 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
529 ODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
530 if(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)
531 DBG_871X_LEVEL(_drv_err_, "%s, %d, IQK may race condition\n", __func__,__LINE__);
532 ODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
533 padapter->HalFunc.set_bwmode_handler(padapter, Bandwidth, Offset);
537 void rtw_hal_set_chan(_adapter *padapter, u8 channel)
539 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
540 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
542 ODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
543 if(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)
544 DBG_871X_LEVEL(_drv_err_, "%s, %d, IQK may race condition\n", __func__,__LINE__);
545 ODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
546 padapter->HalFunc.set_channel_handler(padapter, channel);
549 void rtw_hal_set_chnl_bw(_adapter *padapter, u8 channel, CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80)
551 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
552 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
554 ODM_AcquireSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
555 if(pDM_Odm->RFCalibrateInfo.bIQKInProgress == _TRUE)
556 DBG_871X_LEVEL(_drv_err_, "%s, %d, IQK may race condition\n", __func__,__LINE__);
557 ODM_ReleaseSpinLock( pDM_Odm, RT_IQK_SPINLOCK);
558 padapter->HalFunc.set_chnl_bw_handler(padapter, channel, Bandwidth, Offset40, Offset80);
561 void rtw_hal_set_tx_power_level(_adapter *padapter, u8 channel)
563 if(padapter->HalFunc.set_tx_power_level_handler)
564 padapter->HalFunc.set_tx_power_level_handler(padapter, channel);
567 void rtw_hal_get_tx_power_level(_adapter *padapter, s32 *powerlevel)
569 if(padapter->HalFunc.get_tx_power_level_handler)
570 padapter->HalFunc.get_tx_power_level_handler(padapter, powerlevel);
573 void rtw_hal_dm_watchdog(_adapter *padapter)
575 if (!is_primary_adapter(padapter))
578 padapter->HalFunc.hal_dm_watchdog(padapter);
582 #ifdef CONFIG_LPS_LCLK_WD_TIMER
583 void rtw_hal_dm_watchdog_in_lps(_adapter *padapter)
585 #if defined(CONFIG_CONCURRENT_MODE)
586 if (padapter->iface_type != IFACE_PORT0)
590 if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==_TRUE ) {
591 padapter->HalFunc.hal_dm_watchdog_in_lps(padapter);//this fuction caller is in interrupt context
596 void rtw_hal_bcn_related_reg_setting(_adapter *padapter)
598 padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter);
601 #ifdef CONFIG_HOSTAPD_MLME
602 s32 rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt)
604 if(padapter->HalFunc.hostap_mgnt_xmit_entry)
605 return padapter->HalFunc.hostap_mgnt_xmit_entry(padapter, pkt);
608 #endif //CONFIG_HOSTAPD_MLME
610 #ifdef DBG_CONFIG_ERROR_DETECT
611 void rtw_hal_sreset_init(_adapter *padapter)
613 padapter->HalFunc.sreset_init_value(padapter);
615 void rtw_hal_sreset_reset(_adapter *padapter)
617 padapter = GET_PRIMARY_ADAPTER(padapter);
618 padapter->HalFunc.silentreset(padapter);
621 void rtw_hal_sreset_reset_value(_adapter *padapter)
623 padapter->HalFunc.sreset_reset_value(padapter);
626 void rtw_hal_sreset_xmit_status_check(_adapter *padapter)
628 if (!is_primary_adapter(padapter))
631 padapter->HalFunc.sreset_xmit_status_check(padapter);
633 void rtw_hal_sreset_linked_status_check(_adapter *padapter)
635 if (!is_primary_adapter(padapter))
637 padapter->HalFunc.sreset_linked_status_check(padapter);
639 u8 rtw_hal_sreset_get_wifi_status(_adapter *padapter)
641 return padapter->HalFunc.sreset_get_wifi_status(padapter);
644 bool rtw_hal_sreset_inprogress(_adapter *padapter)
646 padapter = GET_PRIMARY_ADAPTER(padapter);
647 return padapter->HalFunc.sreset_inprogress(padapter);
649 #endif //DBG_CONFIG_ERROR_DETECT
652 int rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt)
654 if(adapter->HalFunc.IOL_exec_cmds_sync)
655 return adapter->HalFunc.IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms,bndy_cnt);
660 #ifdef CONFIG_XMIT_THREAD_MODE
661 s32 rtw_hal_xmit_thread_handler(_adapter *padapter)
663 return padapter->HalFunc.xmit_thread_handler(padapter);
667 void rtw_hal_notch_filter(_adapter *adapter, bool enable)
669 if(adapter->HalFunc.hal_notch_filter)
670 adapter->HalFunc.hal_notch_filter(adapter,enable);
673 bool rtw_hal_c2h_valid(_adapter *adapter, u8 *buf)
675 HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
676 HAL_VERSION *hal_ver = &HalData->VersionID;
679 if (IS_8188E(*hal_ver)) {
680 ret = c2h_evt_valid((struct c2h_evt_hdr *)buf);
681 } else if(IS_8192E(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver) || IS_8723B_SERIES(*hal_ver)) {
682 ret = c2h_evt_valid((struct c2h_evt_hdr_88xx*)buf);
690 s32 rtw_hal_c2h_evt_read(_adapter *adapter, u8 *buf)
692 HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
693 HAL_VERSION *hal_ver = &HalData->VersionID;
696 if (IS_8188E(*hal_ver)) {
697 ret = c2h_evt_read(adapter, buf);
698 } else if(IS_8192E(*hal_ver) || IS_8812_SERIES(*hal_ver) || IS_8821_SERIES(*hal_ver) || IS_8723B_SERIES(*hal_ver)) {
699 ret = c2h_evt_read_88xx(adapter, buf);
707 s32 rtw_hal_c2h_handler(_adapter *adapter, u8 *c2h_evt)
710 if (adapter->HalFunc.c2h_handler)
711 ret = adapter->HalFunc.c2h_handler(adapter, c2h_evt);
715 c2h_id_filter rtw_hal_c2h_id_filter_ccx(_adapter *adapter)
717 return adapter->HalFunc.c2h_id_filter_ccx;
720 s32 rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter)
722 return GET_HAL_DATA(padapter)->bDisableSWChannelPlan;
725 s32 rtw_hal_macid_sleep(PADAPTER padapter, u8 macid)
727 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
728 struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
732 rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
733 if (_FALSE == support)
736 if (macid >= macid_ctl->num) {
737 DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n",
738 FUNC_ADPT_ARG(padapter), macid);
742 rtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, &macid);
747 s32 rtw_hal_macid_wakeup(PADAPTER padapter, u8 macid)
749 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
750 struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
754 rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
755 if (_FALSE == support)
758 if (macid >= macid_ctl->num) {
759 DBG_871X_LEVEL(_drv_err_, FUNC_ADPT_FMT": Invalid macid(%u)\n",
760 FUNC_ADPT_ARG(padapter), macid);
764 rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, &macid);
769 s32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
771 _adapter *pri_adapter = GET_PRIMARY_ADAPTER(padapter);
773 if (pri_adapter->bFWReady == _TRUE)
774 return padapter->HalFunc.fill_h2c_cmd(padapter, ElementID, CmdLen, pCmdBuffer);
776 DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" FW doesn't exit when no MP mode, by pass H2C id:0x%02x\n"
777 , FUNC_ADPT_ARG(padapter), ElementID);
781 void rtw_hal_fill_fake_txdesc(_adapter* padapter, u8* pDesc, u32 BufferLen,
782 u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)
784 padapter->HalFunc.fill_fake_txdesc(padapter, pDesc, BufferLen,IsPsPoll, IsBTQosNull, bDataFrame);
787 u8 rtw_hal_get_txbuff_rsvd_page_num(_adapter *adapter, bool wowlan)
789 return adapter->HalFunc.hal_get_tx_buff_rsvd_page_num(adapter, wowlan);
792 #ifdef CONFIG_GPIO_API
793 void rtw_hal_update_hisr_hsisr_ind(_adapter *padapter, u32 flag)
795 if (padapter->HalFunc.update_hisr_hsisr_ind)
796 padapter->HalFunc.update_hisr_hsisr_ind(padapter, flag);
799 int rtw_hal_gpio_func_check(_adapter *padapter, u8 gpio_num)
803 if (padapter->HalFunc.hal_gpio_func_check)
804 ret= padapter->HalFunc.hal_gpio_func_check(padapter, gpio_num);
809 void rtw_hal_gpio_multi_func_reset(_adapter *padapter, u8 gpio_num)
811 if (padapter->HalFunc.hal_gpio_multi_func_reset)
812 padapter->HalFunc.hal_gpio_multi_func_reset(padapter, gpio_num);
816 void rtw_hal_fw_correct_bcn(_adapter *padapter)
818 if (padapter->HalFunc.fw_correct_bcn)
819 padapter->HalFunc.fw_correct_bcn(padapter);
822 #define rtw_hal_error_msg(ops_fun) \
823 DBG_871X_LEVEL(_drv_always_, "### %s - Error : Please hook HalFunc.%s ###\n",__FUNCTION__,ops_fun)
825 u8 rtw_hal_ops_check(_adapter *padapter)
829 /*** initialize section ***/
830 if (NULL == padapter->HalFunc.read_chip_version) {
831 rtw_hal_error_msg("read_chip_version");
834 if (NULL == padapter->HalFunc.init_default_value) {
835 rtw_hal_error_msg("init_default_value");
838 if (NULL == padapter->HalFunc.intf_chip_configure) {
839 rtw_hal_error_msg("intf_chip_configure");
842 if (NULL == padapter->HalFunc.read_adapter_info) {
843 rtw_hal_error_msg("read_adapter_info");
847 if (NULL == padapter->HalFunc.hal_power_on) {
848 rtw_hal_error_msg("hal_power_on");
851 if (NULL == padapter->HalFunc.hal_power_off) {
852 rtw_hal_error_msg("hal_power_off");
856 if (NULL == padapter->HalFunc.hal_init) {
857 rtw_hal_error_msg("hal_init");
860 if (NULL == padapter->HalFunc.hal_deinit) {
861 rtw_hal_error_msg("hal_deinit");
865 /*** xmit section ***/
866 if (NULL == padapter->HalFunc.init_xmit_priv) {
867 rtw_hal_error_msg("init_xmit_priv");
870 if (NULL == padapter->HalFunc.free_xmit_priv) {
871 rtw_hal_error_msg("free_xmit_priv");
874 if (NULL == padapter->HalFunc.hal_xmit) {
875 rtw_hal_error_msg("hal_xmit");
878 if (NULL == padapter->HalFunc.mgnt_xmit) {
879 rtw_hal_error_msg("mgnt_xmit");
882 #ifdef CONFIG_XMIT_THREAD_MODE
883 if (NULL == padapter->HalFunc.xmit_thread_handler) {
884 rtw_hal_error_msg("xmit_thread_handler");
888 if (NULL == padapter->HalFunc.hal_xmitframe_enqueue) {
889 rtw_hal_error_msg("hal_xmitframe_enqueue");
892 #if defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
893 #ifndef CONFIG_SDIO_TX_TASKLET
894 if (NULL == padapter->HalFunc.run_thread) {
895 rtw_hal_error_msg("run_thread");
898 if (NULL == padapter->HalFunc.cancel_thread) {
899 rtw_hal_error_msg("cancel_thread");
905 /*** recv section ***/
906 if (NULL == padapter->HalFunc.init_recv_priv) {
907 rtw_hal_error_msg("init_recv_priv");
910 if (NULL == padapter->HalFunc.free_recv_priv) {
911 rtw_hal_error_msg("free_recv_priv");
914 #if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)
915 if (NULL == padapter->HalFunc.inirp_init) {
916 rtw_hal_error_msg("inirp_init");
919 if (NULL == padapter->HalFunc.inirp_deinit) {
920 rtw_hal_error_msg("inirp_deinit");
923 #endif //#if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI)
926 /*** interrupt hdl section ***/
927 #if defined(CONFIG_PCI_HCI)
928 if (NULL == padapter->HalFunc.irp_reset) {
929 rtw_hal_error_msg("irp_reset");
932 #endif/*#if defined(CONFIG_PCI_HCI)*/
933 #if (defined(CONFIG_PCI_HCI)) || (defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT))
934 if (NULL == padapter->HalFunc.interrupt_handler) {
935 rtw_hal_error_msg("interrupt_handler");
938 #endif /*#if (defined(CONFIG_PCI_HCI)) || (defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT))*/
940 #if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
941 if (NULL == padapter->HalFunc.enable_interrupt) {
942 rtw_hal_error_msg("enable_interrupt");
945 if (NULL == padapter->HalFunc.disable_interrupt) {
946 rtw_hal_error_msg("disable_interrupt");
949 #endif //defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
953 if (NULL == padapter->HalFunc.dm_init) {
954 rtw_hal_error_msg("dm_init");
957 if (NULL == padapter->HalFunc.dm_deinit) {
958 rtw_hal_error_msg("dm_deinit");
961 if (NULL == padapter->HalFunc.hal_dm_watchdog) {
962 rtw_hal_error_msg("hal_dm_watchdog");
965 #ifdef CONFIG_LPS_LCLK_WD_TIMER
966 if (NULL == padapter->HalFunc.hal_dm_watchdog_in_lps) {
967 rtw_hal_error_msg("hal_dm_watchdog_in_lps");
972 /*** xxx section ***/
973 if (NULL == padapter->HalFunc.set_bwmode_handler) {
974 rtw_hal_error_msg("set_bwmode_handler");
978 if (NULL == padapter->HalFunc.set_channel_handler) {
979 rtw_hal_error_msg("set_channel_handler");
983 if (NULL == padapter->HalFunc.set_chnl_bw_handler) {
984 rtw_hal_error_msg("set_chnl_bw_handler");
988 if (NULL == padapter->HalFunc.SetHwRegHandler) {
989 rtw_hal_error_msg("SetHwRegHandler");
992 if (NULL == padapter->HalFunc.GetHwRegHandler) {
993 rtw_hal_error_msg("GetHwRegHandler");
996 if (NULL == padapter->HalFunc.GetHalDefVarHandler) {
997 rtw_hal_error_msg("GetHalDefVarHandler");
1000 if (NULL == padapter->HalFunc.SetHalDefVarHandler) {
1001 rtw_hal_error_msg("SetHalDefVarHandler");
1004 if (NULL == padapter->HalFunc.GetHalODMVarHandler) {
1005 rtw_hal_error_msg("GetHalODMVarHandler");
1008 if (NULL == padapter->HalFunc.SetHalODMVarHandler) {
1009 rtw_hal_error_msg("SetHalODMVarHandler");
1012 if (NULL == padapter->HalFunc.UpdateRAMaskHandler) {
1013 rtw_hal_error_msg("UpdateRAMaskHandler");
1017 if (NULL == padapter->HalFunc.SetBeaconRelatedRegistersHandler) {
1018 rtw_hal_error_msg("SetBeaconRelatedRegistersHandler");
1022 if (NULL == padapter->HalFunc.Add_RateATid) {
1023 rtw_hal_error_msg("Add_RateATid");
1027 if (NULL == padapter->HalFunc.fill_h2c_cmd) {
1028 rtw_hal_error_msg("fill_h2c_cmd");
1031 #if defined(CONFIG_LPS)
1032 if (NULL == padapter->HalFunc.fill_fake_txdesc) {
1033 rtw_hal_error_msg("fill_fake_txdesc");
1037 if (NULL == padapter->HalFunc.hal_get_tx_buff_rsvd_page_num) {
1038 rtw_hal_error_msg("hal_get_tx_buff_rsvd_page_num");
1042 if (NULL == padapter->HalFunc.fw_dl) {
1043 rtw_hal_error_msg("fw_dl");
1047 if ((IS_HARDWARE_TYPE_8814A(padapter)
1048 || IS_HARDWARE_TYPE_8822BU(padapter) || IS_HARDWARE_TYPE_8822BS(padapter))
1049 && NULL == padapter->HalFunc.fw_correct_bcn) {
1050 rtw_hal_error_msg("fw_correct_bcn");
1055 /*** SReset section ***/
1056 #ifdef DBG_CONFIG_ERROR_DETECT
1057 if (NULL == padapter->HalFunc.sreset_init_value) {
1058 rtw_hal_error_msg("sreset_init_value");
1061 if (NULL == padapter->HalFunc.sreset_reset_value) {
1062 rtw_hal_error_msg("sreset_reset_value");
1065 if (NULL == padapter->HalFunc.silentreset) {
1066 rtw_hal_error_msg("silentreset");
1069 if (NULL == padapter->HalFunc.sreset_xmit_status_check) {
1070 rtw_hal_error_msg("sreset_xmit_status_check");
1073 if (NULL == padapter->HalFunc.sreset_linked_status_check) {
1074 rtw_hal_error_msg("sreset_linked_status_check");
1077 if (NULL == padapter->HalFunc.sreset_get_wifi_status) {
1078 rtw_hal_error_msg("sreset_get_wifi_status");
1081 if (NULL == padapter->HalFunc.sreset_inprogress) {
1082 rtw_hal_error_msg("sreset_inprogress");
1085 #endif //#ifdef DBG_CONFIG_ERROR_DETECT