1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 #include <drv_types.h>
8 #include <hal_data.h>
9 
rtw_hal_chip_configure(struct adapter * padapter)10 void rtw_hal_chip_configure(struct adapter *padapter)
11 {
12 	rtl8723bs_interface_configure(padapter);
13 }
14 
rtw_hal_read_chip_info(struct adapter * padapter)15 void rtw_hal_read_chip_info(struct adapter *padapter)
16 {
17 	ReadAdapterInfo8723BS(padapter);
18 }
19 
rtw_hal_read_chip_version(struct adapter * padapter)20 void rtw_hal_read_chip_version(struct adapter *padapter)
21 {
22 	rtl8723b_read_chip_version(padapter);
23 }
24 
rtw_hal_def_value_init(struct adapter * padapter)25 void rtw_hal_def_value_init(struct adapter *padapter)
26 {
27 	rtl8723bs_init_default_value(padapter);
28 }
29 
rtw_hal_free_data(struct adapter * padapter)30 void rtw_hal_free_data(struct adapter *padapter)
31 {
32 	/* free HAL Data */
33 	rtw_hal_data_deinit(padapter);
34 }
35 
rtw_hal_dm_init(struct adapter * padapter)36 void rtw_hal_dm_init(struct adapter *padapter)
37 {
38 	rtl8723b_init_dm_priv(padapter);
39 }
40 
rtw_hal_dm_deinit(struct adapter * padapter)41 void rtw_hal_dm_deinit(struct adapter *padapter)
42 {
43 }
44 
rtw_hal_init_opmode(struct adapter * padapter)45 static void rtw_hal_init_opmode(struct adapter *padapter)
46 {
47 	enum ndis_802_11_network_infrastructure networkType = Ndis802_11InfrastructureMax;
48 	struct  mlme_priv *pmlmepriv = &(padapter->mlmepriv);
49 	signed int fw_state;
50 
51 	fw_state = get_fwstate(pmlmepriv);
52 
53 	if (fw_state & WIFI_ADHOC_STATE)
54 		networkType = Ndis802_11IBSS;
55 	else if (fw_state & WIFI_STATION_STATE)
56 		networkType = Ndis802_11Infrastructure;
57 	else if (fw_state & WIFI_AP_STATE)
58 		networkType = Ndis802_11APMode;
59 	else
60 		return;
61 
62 	rtw_setopmode_cmd(padapter, networkType, false);
63 }
64 
rtw_hal_init(struct adapter * padapter)65 uint rtw_hal_init(struct adapter *padapter)
66 {
67 	uint status;
68 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
69 
70 	status = rtl8723bs_hal_init(padapter);
71 
72 	if (status == _SUCCESS) {
73 		rtw_hal_init_opmode(padapter);
74 
75 		dvobj->padapters->hw_init_completed = true;
76 
77 		if (padapter->registrypriv.notch_filter == 1)
78 			rtw_hal_notch_filter(padapter, 1);
79 
80 		rtw_hal_reset_security_engine(padapter);
81 
82 		rtw_sec_restore_wep_key(dvobj->padapters);
83 
84 		init_hw_mlme_ext(padapter);
85 
86 		rtw_bb_rf_gain_offset(padapter);
87 	} else {
88 		dvobj->padapters->hw_init_completed = false;
89 	}
90 
91 	return status;
92 }
93 
rtw_hal_deinit(struct adapter * padapter)94 uint rtw_hal_deinit(struct adapter *padapter)
95 {
96 	uint status = _SUCCESS;
97 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
98 
99 	status = rtl8723bs_hal_deinit(padapter);
100 
101 	if (status == _SUCCESS) {
102 		padapter = dvobj->padapters;
103 		padapter->hw_init_completed = false;
104 	}
105 
106 	return status;
107 }
108 
rtw_hal_set_hwreg(struct adapter * padapter,u8 variable,u8 * val)109 void rtw_hal_set_hwreg(struct adapter *padapter, u8 variable, u8 *val)
110 {
111 	SetHwReg8723BS(padapter, variable, val);
112 }
113 
rtw_hal_get_hwreg(struct adapter * padapter,u8 variable,u8 * val)114 void rtw_hal_get_hwreg(struct adapter *padapter, u8 variable, u8 *val)
115 {
116 	GetHwReg8723BS(padapter, variable, val);
117 }
118 
rtw_hal_set_hwreg_with_buf(struct adapter * padapter,u8 variable,u8 * pbuf,int len)119 void rtw_hal_set_hwreg_with_buf(struct adapter *padapter, u8 variable, u8 *pbuf, int len)
120 {
121 	SetHwRegWithBuf8723B(padapter, variable, pbuf, len);
122 }
123 
rtw_hal_set_def_var(struct adapter * padapter,enum hal_def_variable eVariable,void * pValue)124 u8 rtw_hal_set_def_var(struct adapter *padapter, enum hal_def_variable eVariable, void *pValue)
125 {
126 	return SetHalDefVar8723BSDIO(padapter, eVariable, pValue);
127 }
128 
rtw_hal_get_def_var(struct adapter * padapter,enum hal_def_variable eVariable,void * pValue)129 u8 rtw_hal_get_def_var(struct adapter *padapter, enum hal_def_variable eVariable, void *pValue)
130 {
131 	return GetHalDefVar8723BSDIO(padapter, eVariable, pValue);
132 }
133 
rtw_hal_set_odm_var(struct adapter * padapter,enum hal_odm_variable eVariable,void * pValue1,bool bSet)134 void rtw_hal_set_odm_var(struct adapter *padapter, enum hal_odm_variable eVariable, void *pValue1, bool bSet)
135 {
136 	if (padapter->HalFunc.SetHalODMVarHandler)
137 		padapter->HalFunc.SetHalODMVarHandler(padapter, eVariable, pValue1, bSet);
138 }
139 
rtw_hal_enable_interrupt(struct adapter * padapter)140 void rtw_hal_enable_interrupt(struct adapter *padapter)
141 {
142 	EnableInterrupt8723BSdio(padapter);
143 }
144 
rtw_hal_disable_interrupt(struct adapter * padapter)145 void rtw_hal_disable_interrupt(struct adapter *padapter)
146 {
147 	DisableInterrupt8723BSdio(padapter);
148 }
149 
rtw_hal_check_ips_status(struct adapter * padapter)150 u8 rtw_hal_check_ips_status(struct adapter *padapter)
151 {
152 	return CheckIPSStatus(padapter);
153 }
154 
rtw_hal_xmitframe_enqueue(struct adapter * padapter,struct xmit_frame * pxmitframe)155 s32	rtw_hal_xmitframe_enqueue(struct adapter *padapter, struct xmit_frame *pxmitframe)
156 {
157 	return rtl8723bs_hal_xmitframe_enqueue(padapter, pxmitframe);
158 }
159 
rtw_hal_xmit(struct adapter * padapter,struct xmit_frame * pxmitframe)160 s32	rtw_hal_xmit(struct adapter *padapter, struct xmit_frame *pxmitframe)
161 {
162 	return rtl8723bs_hal_xmit(padapter, pxmitframe);
163 }
164 
165 /*
166  * [IMPORTANT] This function would be run in interrupt context.
167  */
rtw_hal_mgnt_xmit(struct adapter * padapter,struct xmit_frame * pmgntframe)168 s32	rtw_hal_mgnt_xmit(struct adapter *padapter, struct xmit_frame *pmgntframe)
169 {
170 	update_mgntframe_attrib_addr(padapter, pmgntframe);
171 	/* pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; */
172 	/* pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; */
173 	/* memcpy(pmgntframe->attrib.ra, pwlanhdr->addr1, ETH_ALEN); */
174 
175 	if (padapter->securitypriv.binstallBIPkey == true) {
176 		if (is_multicast_ether_addr(pmgntframe->attrib.ra)) {
177 			pmgntframe->attrib.encrypt = _BIP_;
178 			/* pmgntframe->attrib.bswenc = true; */
179 		} else {
180 			pmgntframe->attrib.encrypt = _AES_;
181 			pmgntframe->attrib.bswenc = true;
182 		}
183 		rtw_mgmt_xmitframe_coalesce(padapter, pmgntframe->pkt, pmgntframe);
184 	}
185 
186 	return rtl8723bs_mgnt_xmit(padapter, pmgntframe);
187 }
188 
rtw_hal_init_xmit_priv(struct adapter * padapter)189 s32	rtw_hal_init_xmit_priv(struct adapter *padapter)
190 {
191 	return rtl8723bs_init_xmit_priv(padapter);
192 }
193 
rtw_hal_free_xmit_priv(struct adapter * padapter)194 void rtw_hal_free_xmit_priv(struct adapter *padapter)
195 {
196 	rtl8723bs_free_xmit_priv(padapter);
197 }
198 
rtw_hal_init_recv_priv(struct adapter * padapter)199 s32	rtw_hal_init_recv_priv(struct adapter *padapter)
200 {
201 	return rtl8723bs_init_recv_priv(padapter);
202 }
203 
rtw_hal_free_recv_priv(struct adapter * padapter)204 void rtw_hal_free_recv_priv(struct adapter *padapter)
205 {
206 	rtl8723bs_free_recv_priv(padapter);
207 }
208 
rtw_hal_update_ra_mask(struct sta_info * psta,u8 rssi_level)209 void rtw_hal_update_ra_mask(struct sta_info *psta, u8 rssi_level)
210 {
211 	struct adapter *padapter;
212 	struct mlme_priv *pmlmepriv;
213 
214 	if (!psta)
215 		return;
216 
217 	padapter = psta->padapter;
218 
219 	pmlmepriv = &(padapter->mlmepriv);
220 
221 	if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == true)
222 		add_RATid(padapter, psta, rssi_level);
223 	else {
224 		UpdateHalRAMask8723B(padapter, psta->mac_id, rssi_level);
225 	}
226 }
227 
rtw_hal_add_ra_tid(struct adapter * padapter,u32 bitmap,u8 * arg,u8 rssi_level)228 void rtw_hal_add_ra_tid(struct adapter *padapter, u32 bitmap, u8 *arg, u8 rssi_level)
229 {
230 	rtl8723b_Add_RateATid(padapter, bitmap, arg, rssi_level);
231 }
232 
233 /*Start specifical interface thread		*/
rtw_hal_start_thread(struct adapter * padapter)234 void rtw_hal_start_thread(struct adapter *padapter)
235 {
236 	rtl8723b_start_thread(padapter);
237 }
238 /*Start specifical interface thread		*/
rtw_hal_stop_thread(struct adapter * padapter)239 void rtw_hal_stop_thread(struct adapter *padapter)
240 {
241 	rtl8723b_stop_thread(padapter);
242 }
243 
rtw_hal_read_bbreg(struct adapter * padapter,u32 RegAddr,u32 BitMask)244 u32 rtw_hal_read_bbreg(struct adapter *padapter, u32 RegAddr, u32 BitMask)
245 {
246 	return PHY_QueryBBReg_8723B(padapter, RegAddr, BitMask);
247 }
rtw_hal_write_bbreg(struct adapter * padapter,u32 RegAddr,u32 BitMask,u32 Data)248 void rtw_hal_write_bbreg(struct adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data)
249 {
250 	PHY_SetBBReg_8723B(padapter, RegAddr, BitMask, Data);
251 }
252 
rtw_hal_read_rfreg(struct adapter * padapter,u32 eRFPath,u32 RegAddr,u32 BitMask)253 u32 rtw_hal_read_rfreg(struct adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask)
254 {
255 	return PHY_QueryRFReg_8723B(padapter, eRFPath, RegAddr, BitMask);
256 }
rtw_hal_write_rfreg(struct adapter * padapter,u32 eRFPath,u32 RegAddr,u32 BitMask,u32 Data)257 void rtw_hal_write_rfreg(struct adapter *padapter, u32 eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
258 {
259 	PHY_SetRFReg_8723B(padapter, eRFPath, RegAddr, BitMask, Data);
260 }
261 
rtw_hal_set_chan(struct adapter * padapter,u8 channel)262 void rtw_hal_set_chan(struct adapter *padapter, u8 channel)
263 {
264 	PHY_SwChnl8723B(padapter, channel);
265 }
266 
rtw_hal_set_chnl_bw(struct adapter * padapter,u8 channel,enum channel_width Bandwidth,u8 Offset40,u8 Offset80)267 void rtw_hal_set_chnl_bw(struct adapter *padapter, u8 channel,
268 			 enum channel_width Bandwidth, u8 Offset40, u8 Offset80)
269 {
270 	PHY_SetSwChnlBWMode8723B(padapter, channel, Bandwidth, Offset40, Offset80);
271 }
272 
rtw_hal_dm_watchdog(struct adapter * padapter)273 void rtw_hal_dm_watchdog(struct adapter *padapter)
274 {
275 	rtl8723b_HalDmWatchDog(padapter);
276 }
277 
rtw_hal_dm_watchdog_in_lps(struct adapter * padapter)278 void rtw_hal_dm_watchdog_in_lps(struct adapter *padapter)
279 {
280 	if (adapter_to_pwrctl(padapter)->fw_current_in_ps_mode) {
281 		rtl8723b_HalDmWatchDog_in_LPS(padapter); /* this function caller is in interrupt context */
282 	}
283 }
284 
beacon_timing_control(struct adapter * padapter)285 void beacon_timing_control(struct adapter *padapter)
286 {
287 	rtl8723b_SetBeaconRelatedRegisters(padapter);
288 }
289 
290 
rtw_hal_xmit_thread_handler(struct adapter * padapter)291 s32 rtw_hal_xmit_thread_handler(struct adapter *padapter)
292 {
293 	if (padapter->HalFunc.xmit_thread_handler)
294 		return padapter->HalFunc.xmit_thread_handler(padapter);
295 	return _FAIL;
296 }
297 
rtw_hal_notch_filter(struct adapter * adapter,bool enable)298 void rtw_hal_notch_filter(struct adapter *adapter, bool enable)
299 {
300 	if (adapter->HalFunc.hal_notch_filter)
301 		adapter->HalFunc.hal_notch_filter(adapter, enable);
302 }
303 
rtw_hal_reset_security_engine(struct adapter * adapter)304 void rtw_hal_reset_security_engine(struct adapter *adapter)
305 {
306 	if (adapter->HalFunc.hal_reset_security_engine)
307 		adapter->HalFunc.hal_reset_security_engine(adapter);
308 }
309 
rtw_hal_c2h_valid(struct adapter * adapter,u8 * buf)310 bool rtw_hal_c2h_valid(struct adapter *adapter, u8 *buf)
311 {
312 	return c2h_evt_valid((struct c2h_evt_hdr_88xx *)buf);
313 }
314 
rtw_hal_c2h_handler(struct adapter * adapter,u8 * c2h_evt)315 s32 rtw_hal_c2h_handler(struct adapter *adapter, u8 *c2h_evt)
316 {
317 	s32 ret = _FAIL;
318 
319 	if (adapter->HalFunc.c2h_handler)
320 		ret = adapter->HalFunc.c2h_handler(adapter, c2h_evt);
321 	return ret;
322 }
323 
rtw_hal_c2h_id_filter_ccx(struct adapter * adapter)324 c2h_id_filter rtw_hal_c2h_id_filter_ccx(struct adapter *adapter)
325 {
326 	return adapter->HalFunc.c2h_id_filter_ccx;
327 }
328 
rtw_hal_macid_sleep(struct adapter * padapter,u32 macid)329 s32 rtw_hal_macid_sleep(struct adapter *padapter, u32 macid)
330 {
331 	u8 support;
332 
333 	support = false;
334 	rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
335 	if (false == support)
336 		return _FAIL;
337 
338 	rtw_hal_set_hwreg(padapter, HW_VAR_MACID_SLEEP, (u8 *)&macid);
339 
340 	return _SUCCESS;
341 }
342 
rtw_hal_macid_wakeup(struct adapter * padapter,u32 macid)343 s32 rtw_hal_macid_wakeup(struct adapter *padapter, u32 macid)
344 {
345 	u8 support;
346 
347 	support = false;
348 	rtw_hal_get_def_var(padapter, HAL_DEF_MACID_SLEEP, &support);
349 	if (false == support)
350 		return _FAIL;
351 
352 	rtw_hal_set_hwreg(padapter, HW_VAR_MACID_WAKEUP, (u8 *)&macid);
353 
354 	return _SUCCESS;
355 }
356 
rtw_hal_fill_h2c_cmd(struct adapter * padapter,u8 ElementID,u32 CmdLen,u8 * pCmdBuffer)357 s32 rtw_hal_fill_h2c_cmd(struct adapter *padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
358 {
359 	s32 ret = _FAIL;
360 
361 	if (padapter->HalFunc.fill_h2c_cmd)
362 		ret = padapter->HalFunc.fill_h2c_cmd(padapter, ElementID, CmdLen, pCmdBuffer);
363 
364 	return ret;
365 }
366