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 ******************************************************************************/
18 #include <drv_types.h>
19 #include <rtw_debug.h>
22 void rtw_hal_chip_configure(struct adapter *padapter)
24 if (padapter->HalFunc.intf_chip_configure)
25 padapter->HalFunc.intf_chip_configure(padapter);
28 void rtw_hal_read_chip_info(struct adapter *padapter)
30 if (padapter->HalFunc.read_adapter_info)
31 padapter->HalFunc.read_adapter_info(padapter);
34 void rtw_hal_read_chip_version(struct adapter *padapter)
36 if (padapter->HalFunc.read_chip_version)
37 padapter->HalFunc.read_chip_version(padapter);
40 void rtw_hal_def_value_init(struct adapter *padapter)
42 if (is_primary_adapter(padapter))
43 if (padapter->HalFunc.init_default_value)
44 padapter->HalFunc.init_default_value(padapter);
46 void rtw_hal_free_data(struct adapter *padapter)
49 rtw_hal_data_deinit(padapter);
51 if (is_primary_adapter(padapter))
52 if (padapter->HalFunc.free_hal_data)
53 padapter->HalFunc.free_hal_data(padapter);
55 void rtw_hal_dm_init(struct adapter *padapter)
57 if (is_primary_adapter(padapter))
58 if (padapter->HalFunc.dm_init)
59 padapter->HalFunc.dm_init(padapter);
61 void rtw_hal_dm_deinit(struct adapter *padapter)
64 if (is_primary_adapter(padapter))
65 if (padapter->HalFunc.dm_deinit)
66 padapter->HalFunc.dm_deinit(padapter);
69 static void rtw_hal_init_opmode(struct adapter *padapter)
71 enum NDIS_802_11_NETWORK_INFRASTRUCTURE networkType = Ndis802_11InfrastructureMax;
72 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
75 fw_state = get_fwstate(pmlmepriv);
77 if (fw_state & WIFI_ADHOC_STATE)
78 networkType = Ndis802_11IBSS;
79 else if (fw_state & WIFI_STATION_STATE)
80 networkType = Ndis802_11Infrastructure;
81 else if (fw_state & WIFI_AP_STATE)
82 networkType = Ndis802_11APMode;
86 rtw_setopmode_cmd(padapter, networkType, false);
89 uint rtw_hal_init(struct adapter *padapter)
92 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
94 status = padapter->HalFunc.hal_init(padapter);
96 if (status == _SUCCESS) {
97 rtw_hal_init_opmode(padapter);
99 dvobj->padapters->hw_init_completed = true;
101 if (padapter->registrypriv.notch_filter == 1)
102 rtw_hal_notch_filter(padapter, 1);
104 rtw_hal_reset_security_engine(padapter);
106 rtw_sec_restore_wep_key(dvobj->padapters);
108 init_hw_mlme_ext(padapter);
110 rtw_bb_rf_gain_offset(padapter);
112 dvobj->padapters->hw_init_completed = false;
113 DBG_871X("rtw_hal_init: hal__init fail\n");
116 RT_TRACE(_module_hal_init_c_, _drv_err_, ("-rtl871x_hal_init:status = 0x%x\n", status));
122 uint rtw_hal_deinit(struct adapter *padapter)
124 uint status = _SUCCESS;
125 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
127 status = padapter->HalFunc.hal_deinit(padapter);
129 if (status == _SUCCESS) {
130 padapter = dvobj->padapters;
131 padapter->hw_init_completed = false;
133 DBG_871X("\n rtw_hal_deinit: hal_init fail\n");
138 void rtw_hal_set_hwreg(struct adapter *padapter, u8 variable, u8 *val)
140 if (padapter->HalFunc.SetHwRegHandler)
141 padapter->HalFunc.SetHwRegHandler(padapter, variable, val);
144 void rtw_hal_get_hwreg(struct adapter *padapter, u8 variable, u8 *val)
146 if (padapter->HalFunc.GetHwRegHandler)
147 padapter->HalFunc.GetHwRegHandler(padapter, variable, val);
150 void rtw_hal_set_hwreg_with_buf(struct adapter *padapter, u8 variable, u8 *pbuf, int len)
152 if (padapter->HalFunc.SetHwRegHandlerWithBuf)
153 padapter->HalFunc.SetHwRegHandlerWithBuf(padapter, variable, pbuf, len);
156 u8 rtw_hal_set_def_var(struct adapter *padapter, enum HAL_DEF_VARIABLE eVariable, void *pValue)
158 if (padapter->HalFunc.SetHalDefVarHandler)
159 return padapter->HalFunc.SetHalDefVarHandler(padapter, eVariable, pValue);
162 u8 rtw_hal_get_def_var(struct adapter *padapter, enum HAL_DEF_VARIABLE eVariable, void *pValue)
164 if (padapter->HalFunc.GetHalDefVarHandler)
165 return padapter->HalFunc.GetHalDefVarHandler(padapter, eVariable, pValue);
169 void rtw_hal_set_odm_var(struct adapter *padapter, enum HAL_ODM_VARIABLE eVariable, void *pValue1, bool bSet)
171 if (padapter->HalFunc.SetHalODMVarHandler)
172 padapter->HalFunc.SetHalODMVarHandler(padapter, eVariable, pValue1, bSet);
174 void rtw_hal_get_odm_var(struct adapter *padapter, enum HAL_ODM_VARIABLE eVariable, void *pValue1, void *pValue2)
176 if (padapter->HalFunc.GetHalODMVarHandler)
177 padapter->HalFunc.GetHalODMVarHandler(padapter, eVariable, pValue1, pValue2);
180 void rtw_hal_enable_interrupt(struct adapter *padapter)
182 if (padapter->HalFunc.enable_interrupt)
183 padapter->HalFunc.enable_interrupt(padapter);
185 DBG_871X("%s: HalFunc.enable_interrupt is NULL!\n", __func__);
188 void rtw_hal_disable_interrupt(struct adapter *padapter)
190 if (padapter->HalFunc.disable_interrupt)
191 padapter->HalFunc.disable_interrupt(padapter);
193 DBG_871X("%s: HalFunc.disable_interrupt is NULL!\n", __func__);
197 u8 rtw_hal_check_ips_status(struct adapter *padapter)
200 if (padapter->HalFunc.check_ips_status)
201 val = padapter->HalFunc.check_ips_status(padapter);
203 DBG_871X("%s: HalFunc.check_ips_status is NULL!\n", __func__);
208 s32 rtw_hal_xmitframe_enqueue(struct adapter *padapter, struct xmit_frame *pxmitframe)
210 if (padapter->HalFunc.hal_xmitframe_enqueue)
211 return padapter->HalFunc.hal_xmitframe_enqueue(padapter, pxmitframe);
216 s32 rtw_hal_xmit(struct adapter *padapter, struct xmit_frame *pxmitframe)
218 if (padapter->HalFunc.hal_xmit)
219 return padapter->HalFunc.hal_xmit(padapter, pxmitframe);
225 * [IMPORTANT] This function would be run in interrupt context.
227 s32 rtw_hal_mgnt_xmit(struct adapter *padapter, struct xmit_frame *pmgntframe)
230 update_mgntframe_attrib_addr(padapter, pmgntframe);
231 /* pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; */
232 /* pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; */
233 /* memcpy(pmgntframe->attrib.ra, pwlanhdr->addr1, ETH_ALEN); */
235 if (padapter->securitypriv.binstallBIPkey == true)
237 if (IS_MCAST(pmgntframe->attrib.ra))
239 pmgntframe->attrib.encrypt = _BIP_;
240 /* pmgntframe->attrib.bswenc = true; */
244 pmgntframe->attrib.encrypt = _AES_;
245 pmgntframe->attrib.bswenc = true;
247 rtw_mgmt_xmitframe_coalesce(padapter, pmgntframe->pkt, pmgntframe);
250 if (padapter->HalFunc.mgnt_xmit)
251 ret = padapter->HalFunc.mgnt_xmit(padapter, pmgntframe);
255 s32 rtw_hal_init_xmit_priv(struct adapter *padapter)
257 if (padapter->HalFunc.init_xmit_priv != NULL)
258 return padapter->HalFunc.init_xmit_priv(padapter);
261 void rtw_hal_free_xmit_priv(struct adapter *padapter)
263 if (padapter->HalFunc.free_xmit_priv != NULL)
264 padapter->HalFunc.free_xmit_priv(padapter);
267 s32 rtw_hal_init_recv_priv(struct adapter *padapter)
269 if (padapter->HalFunc.init_recv_priv)
270 return padapter->HalFunc.init_recv_priv(padapter);
274 void rtw_hal_free_recv_priv(struct adapter *padapter)
277 if (padapter->HalFunc.free_recv_priv)
278 padapter->HalFunc.free_recv_priv(padapter);
281 void rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level)
283 struct adapter *padapter;
284 struct mlme_priv *pmlmepriv;
289 padapter = psta->padapter;
291 pmlmepriv = &(padapter->mlmepriv);
293 if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true)
295 add_RATid(padapter, psta, rssi_level);
299 if (padapter->HalFunc.UpdateRAMaskHandler)
300 padapter->HalFunc.UpdateRAMaskHandler(padapter, psta->mac_id, rssi_level);
304 void rtw_hal_add_ra_tid(struct adapter *padapter, u32 bitmap, u8 *arg, u8 rssi_level)
306 if (padapter->HalFunc.Add_RateATid)
307 padapter->HalFunc.Add_RateATid(padapter, bitmap, arg, rssi_level);
310 /*Start specifical interface thread */
311 void rtw_hal_start_thread(struct adapter *padapter)
313 if (padapter->HalFunc.run_thread)
314 padapter->HalFunc.run_thread(padapter);
316 /*Start specifical interface thread */
317 void rtw_hal_stop_thread(struct adapter *padapter)
319 if (padapter->HalFunc.cancel_thread)
320 padapter->HalFunc.cancel_thread(padapter);
323 u32 rtw_hal_read_bbreg(struct adapter *padapter, u32 RegAddr, u32 BitMask)
326 if (padapter->HalFunc.read_bbreg)
327 data = padapter->HalFunc.read_bbreg(padapter, RegAddr, BitMask);
330 void rtw_hal_write_bbreg(struct adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data)
332 if (padapter->HalFunc.write_bbreg)
333 padapter->HalFunc.write_bbreg(padapter, RegAddr, BitMask, Data);
336 u32 rtw_hal_read_rfreg(struct adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask)
339 if (padapter->HalFunc.read_rfreg)
340 data = padapter->HalFunc.read_rfreg(padapter, eRFPath, RegAddr, BitMask);
343 void rtw_hal_write_rfreg(struct adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
345 if (padapter->HalFunc.write_rfreg)
346 padapter->HalFunc.write_rfreg(padapter, eRFPath, RegAddr, BitMask, Data);
349 void rtw_hal_set_chan(struct adapter *padapter, u8 channel)
351 if (padapter->HalFunc.set_channel_handler)
352 padapter->HalFunc.set_channel_handler(padapter, channel);
355 void rtw_hal_set_chnl_bw(struct adapter *padapter, u8 channel,
356 enum CHANNEL_WIDTH Bandwidth, u8 Offset40, u8 Offset80)
358 if (padapter->HalFunc.set_chnl_bw_handler)
359 padapter->HalFunc.set_chnl_bw_handler(padapter, channel,
364 void rtw_hal_dm_watchdog(struct adapter *padapter)
366 if (padapter->HalFunc.hal_dm_watchdog)
367 padapter->HalFunc.hal_dm_watchdog(padapter);
371 void rtw_hal_dm_watchdog_in_lps(struct adapter *padapter)
373 if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode ==true)
375 if (padapter->HalFunc.hal_dm_watchdog_in_lps)
377 padapter->HalFunc.hal_dm_watchdog_in_lps(padapter);/* this fuction caller is in interrupt context */
382 void rtw_hal_bcn_related_reg_setting(struct adapter *padapter)
384 if (padapter->HalFunc.SetBeaconRelatedRegistersHandler)
385 padapter->HalFunc.SetBeaconRelatedRegistersHandler(padapter);
389 s32 rtw_hal_xmit_thread_handler(struct adapter *padapter)
391 if (padapter->HalFunc.xmit_thread_handler)
392 return padapter->HalFunc.xmit_thread_handler(padapter);
396 void rtw_hal_notch_filter(struct adapter *adapter, bool enable)
398 if (adapter->HalFunc.hal_notch_filter)
399 adapter->HalFunc.hal_notch_filter(adapter, enable);
402 void rtw_hal_reset_security_engine(struct adapter * adapter)
404 if (adapter->HalFunc.hal_reset_security_engine)
405 adapter->HalFunc.hal_reset_security_engine(adapter);
408 bool rtw_hal_c2h_valid(struct adapter *adapter, u8 *buf)
410 return c2h_evt_valid((struct c2h_evt_hdr_88xx*)buf);
413 s32 rtw_hal_c2h_evt_read(struct adapter *adapter, u8 *buf)
415 return c2h_evt_read_88xx(adapter, buf);
418 s32 rtw_hal_c2h_handler(struct adapter *adapter, u8 *c2h_evt)
421 if (adapter->HalFunc.c2h_handler)
422 ret = adapter->HalFunc.c2h_handler(adapter, c2h_evt);
426 c2h_id_filter rtw_hal_c2h_id_filter_ccx(struct adapter *adapter)
428 return adapter->HalFunc.c2h_id_filter_ccx;
431 s32 rtw_hal_is_disable_sw_channel_plan(struct adapter *padapter)
433 return GET_HAL_DATA(padapter)->bDisableSWChannelPlan;
436 s32 rtw_hal_macid_sleep(struct adapter *padapter, u32 macid)
442 rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
443 if (false == support)
446 rtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, (u8 *)&macid);
451 s32 rtw_hal_macid_wakeup(struct adapter *padapter, u32 macid)
457 rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
458 if (false == support)
461 rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, (u8 *)&macid);
466 s32 rtw_hal_fill_h2c_cmd(struct adapter *padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
470 if (padapter->HalFunc.fill_h2c_cmd)
471 ret = padapter->HalFunc.fill_h2c_cmd(padapter, ElementID, CmdLen, pCmdBuffer);
474 DBG_871X("%s: func[fill_h2c_cmd] not defined!\n", __func__);