xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8723ds/hal/hal_intf.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2017 Realtek Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of version 2 of the GNU General Public License as
8  * published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13  * more details.
14  *
15  *****************************************************************************/
16 
17 #define _HAL_INTF_C_
18 
19 #include <drv_types.h>
20 #include <hal_data.h>
21 
22 const u32 _chip_type_to_odm_ic_type[] = {
23 	0,
24 	ODM_RTL8188E,
25 	ODM_RTL8192E,
26 	ODM_RTL8812,
27 	ODM_RTL8821,
28 	ODM_RTL8723B,
29 	ODM_RTL8814A,
30 	ODM_RTL8703B,
31 	ODM_RTL8188F,
32 	ODM_RTL8188F,
33 	ODM_RTL8822B,
34 	ODM_RTL8723D,
35 	ODM_RTL8821C,
36 	ODM_RTL8710B,
37 	ODM_RTL8192F,
38 	ODM_RTL8822C,
39 	ODM_RTL8814B,
40 	0,
41 };
42 
rtw_hal_chip_configure(_adapter * padapter)43 void rtw_hal_chip_configure(_adapter *padapter)
44 {
45 	padapter->hal_func.intf_chip_configure(padapter);
46 }
47 
48 /*
49  * Description:
50  *	Read chip internal ROM data
51  *
52  * Return:
53  *	_SUCCESS success
54  *	_FAIL	 fail
55  */
rtw_hal_read_chip_info(_adapter * padapter)56 u8 rtw_hal_read_chip_info(_adapter *padapter)
57 {
58 	u8 rtn = _SUCCESS;
59 	u8 hci_type = rtw_get_intf_type(padapter);
60 	systime start = rtw_get_current_time();
61 
62 	/*  before access eFuse, make sure card enable has been called */
63 	if ((hci_type == RTW_SDIO || hci_type == RTW_GSPI)
64 	    && !rtw_is_hw_init_completed(padapter))
65 		rtw_hal_power_on(padapter);
66 
67 	rtn = padapter->hal_func.read_adapter_info(padapter);
68 
69 	if ((hci_type == RTW_SDIO || hci_type == RTW_GSPI)
70 	    && !rtw_is_hw_init_completed(padapter))
71 		rtw_hal_power_off(padapter);
72 
73 	RTW_INFO("%s in %d ms\n", __func__, rtw_get_passing_time_ms(start));
74 
75 	return rtn;
76 }
77 
rtw_hal_read_chip_version(_adapter * padapter)78 void rtw_hal_read_chip_version(_adapter *padapter)
79 {
80 	padapter->hal_func.read_chip_version(padapter);
81 	rtw_odm_init_ic_type(padapter);
82 }
83 
rtw_init_wireless_mode(_adapter * padapter)84 static void rtw_init_wireless_mode(_adapter *padapter)
85 {
86 	u8 proto_wireless_mode = 0;
87 	struct hal_spec_t *hal_spec = GET_HAL_SPEC(padapter);
88 	if(hal_spec->proto_cap & PROTO_CAP_11B)
89 		proto_wireless_mode |= WIRELESS_11B;
90 
91 	if(hal_spec->proto_cap & PROTO_CAP_11G)
92 		proto_wireless_mode |= WIRELESS_11G;
93 #ifdef CONFIG_80211AC_VHT
94 	if(hal_spec->band_cap & BAND_CAP_5G)
95 		proto_wireless_mode |= WIRELESS_11A;
96 #endif
97 
98 #ifdef CONFIG_80211N_HT
99 	if(hal_spec->proto_cap & PROTO_CAP_11N) {
100 
101 		if(hal_spec->band_cap & BAND_CAP_2G)
102 			proto_wireless_mode |= WIRELESS_11_24N;
103 		if(hal_spec->band_cap & BAND_CAP_5G)
104 			proto_wireless_mode |= WIRELESS_11_5N;
105 	}
106 #endif
107 
108 #ifdef CONFIG_80211AC_VHT
109 	if(hal_spec->proto_cap & PROTO_CAP_11AC)
110 		proto_wireless_mode |= WIRELESS_11AC;
111 #endif
112 	padapter->registrypriv.wireless_mode &= proto_wireless_mode;
113 }
114 
rtw_hal_def_value_init(_adapter * padapter)115 void rtw_hal_def_value_init(_adapter *padapter)
116 {
117 	if (is_primary_adapter(padapter)) {
118 		/*init fw_psmode_iface_id*/
119 		adapter_to_pwrctl(padapter)->fw_psmode_iface_id = 0xff;
120 		/*wireless_mode*/
121 		rtw_init_wireless_mode(padapter);
122 		padapter->hal_func.init_default_value(padapter);
123 
124 		rtw_init_hal_com_default_value(padapter);
125 
126 		#ifdef CONFIG_FW_MULTI_PORT_SUPPORT
127 		adapter_to_dvobj(padapter)->dft.port_id = 0xFF;
128 		adapter_to_dvobj(padapter)->dft.mac_id = 0xFF;
129 		#endif
130 		#ifdef CONFIG_HW_P0_TSF_SYNC
131 		adapter_to_dvobj(padapter)->p0_tsf.sync_port = MAX_HW_PORT;
132 		adapter_to_dvobj(padapter)->p0_tsf.offset = 0;
133 		#endif
134 
135 		GET_HAL_DATA(padapter)->rx_tsf_addr_filter_config = 0;
136 	}
137 }
138 
rtw_hal_data_init(_adapter * padapter)139 u8 rtw_hal_data_init(_adapter *padapter)
140 {
141 	if (is_primary_adapter(padapter)) {
142 		padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);
143 		padapter->HalData = rtw_zvmalloc(padapter->hal_data_sz);
144 		if (padapter->HalData == NULL) {
145 			RTW_INFO("cant not alloc memory for HAL DATA\n");
146 			return _FAIL;
147 		}
148 		rtw_phydm_priv_init(padapter);
149 	}
150 	return _SUCCESS;
151 }
152 
rtw_hal_data_deinit(_adapter * padapter)153 void rtw_hal_data_deinit(_adapter *padapter)
154 {
155 	if (is_primary_adapter(padapter)) {
156 		if (padapter->HalData) {
157 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
158 			phy_free_filebuf(padapter);
159 #endif
160 			rtw_vmfree(padapter->HalData, padapter->hal_data_sz);
161 			padapter->HalData = NULL;
162 			padapter->hal_data_sz = 0;
163 		}
164 	}
165 }
166 
rtw_hal_free_data(_adapter * padapter)167 void	rtw_hal_free_data(_adapter *padapter)
168 {
169 	/* free HAL Data	 */
170 	rtw_hal_data_deinit(padapter);
171 }
rtw_hal_dm_init(_adapter * padapter)172 void rtw_hal_dm_init(_adapter *padapter)
173 {
174 	if (is_primary_adapter(padapter)) {
175 		PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(padapter);
176 
177 		padapter->hal_func.dm_init(padapter);
178 
179 		_rtw_spinlock_init(&pHalData->IQKSpinLock);
180 
181 		#ifdef CONFIG_TXPWR_PG_WITH_PWR_IDX
182 		if (pHalData->txpwr_pg_mode == TXPWR_PG_WITH_PWR_IDX)
183 			hal_load_txpwr_info(padapter);
184 		#endif
185 		phy_load_tx_power_ext_info(padapter, 1);
186 	}
187 }
rtw_hal_dm_deinit(_adapter * padapter)188 void rtw_hal_dm_deinit(_adapter *padapter)
189 {
190 	if (is_primary_adapter(padapter)) {
191 		PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(padapter);
192 
193 		padapter->hal_func.dm_deinit(padapter);
194 
195 		_rtw_spinlock_free(&pHalData->IQKSpinLock);
196 	}
197 }
198 
rtw_chip_rftype_to_hal_rftype(_adapter * adapter,u8 limit)199 enum rf_type rtw_chip_rftype_to_hal_rftype(_adapter *adapter, u8 limit)
200 {
201 	PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
202 	u8 tx_num = 0, rx_num = 0;
203 
204 	/*get RF PATH from version_id.RF_TYPE */
205 	if (IS_1T1R(hal_data->version_id)) {
206 		tx_num = 1;
207 		rx_num = 1;
208 	} else if (IS_1T2R(hal_data->version_id)) {
209 		tx_num = 1;
210 		rx_num = 2;
211 	} else if (IS_2T2R(hal_data->version_id)) {
212 		tx_num = 2;
213 		rx_num = 2;
214 	} else if (IS_2T3R(hal_data->version_id)) {
215 		tx_num = 2;
216 		rx_num = 3;
217 	} else if (IS_2T4R(hal_data->version_id)) {
218 		tx_num = 2;
219 		rx_num = 4;
220 	} else if (IS_3T3R(hal_data->version_id)) {
221 		tx_num = 3;
222 		rx_num = 3;
223 	} else if (IS_3T4R(hal_data->version_id)) {
224 		tx_num = 3;
225 		rx_num = 4;
226 	} else if (IS_4T4R(hal_data->version_id)) {
227 		tx_num = 4;
228 		rx_num = 4;
229 	}
230 
231 	if (limit) {
232 		tx_num = rtw_min(tx_num, limit);
233 		rx_num = rtw_min(rx_num, limit);
234 	}
235 
236 	return trx_num_to_rf_type(tx_num, rx_num);
237 }
238 
dump_hal_runtime_trx_mode(void * sel,_adapter * adapter)239 void dump_hal_runtime_trx_mode(void *sel, _adapter *adapter)
240 {
241 	struct registry_priv *regpriv = &adapter->registrypriv;
242 	PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
243 	int i;
244 
245 	RTW_PRINT_SEL(sel, "txpath=0x%x, rxpath=0x%x\n", hal_data->txpath, hal_data->rxpath);
246 	for (i = 0; i < hal_data->tx_nss; i++)
247 		RTW_PRINT_SEL(sel, "txpath_%uss:0x%x, num:%u\n"
248 			, i + 1, hal_data->txpath_nss[i]
249 			, hal_data->txpath_num_nss[i]);
250 }
251 
dump_hal_trx_mode(void * sel,_adapter * adapter)252 void dump_hal_trx_mode(void *sel, _adapter *adapter)
253 {
254 	struct registry_priv *regpriv = &adapter->registrypriv;
255 	PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
256 
257 	RTW_PRINT_SEL(sel, "trx_path_bmp:0x%02x(%s), NumTotalRFPath:%u, max_tx_cnt:%u\n"
258 		, hal_data->trx_path_bmp
259 		, rf_type_to_rfpath_str(hal_data->rf_type)
260 		, hal_data->NumTotalRFPath
261 		, hal_data->max_tx_cnt
262 	);
263 	RTW_PRINT_SEL(sel, "tx_nss:%u, rx_nss:%u\n"
264 		, hal_data->tx_nss, hal_data->rx_nss);
265 	RTW_PRINT_SEL(sel, "\n");
266 
267 	dump_hal_runtime_trx_mode(sel, adapter);
268 }
269 
_dump_rf_path(void * sel,_adapter * adapter)270 void _dump_rf_path(void *sel, _adapter *adapter)
271 {
272 	PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
273 	struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
274 	struct registry_priv *regsty = adapter_to_regsty(adapter);
275 
276 	RTW_PRINT_SEL(sel, "[RF_PATH] ver_id.RF_TYPE:%s\n"
277 		, rf_type_to_rfpath_str(rtw_chip_rftype_to_hal_rftype(adapter, 0)));
278 	RTW_PRINT_SEL(sel, "[RF_PATH] HALSPEC's rf_reg_trx_path_bmp:0x%02x, rf_reg_path_avail_num:%u, max_tx_cnt:%u\n"
279 		, hal_spec->rf_reg_trx_path_bmp, hal_spec->rf_reg_path_avail_num, hal_spec->max_tx_cnt);
280 	RTW_PRINT_SEL(sel, "[RF_PATH] PG's trx_path_bmp:0x%02x, max_tx_cnt:%u\n"
281 		, hal_data->eeprom_trx_path_bmp, hal_data->eeprom_max_tx_cnt);
282 	RTW_PRINT_SEL(sel, "[RF_PATH] Registry's trx_path_bmp:0x%02x, tx_path_lmt:%u, rx_path_lmt:%u\n"
283 		, regsty->trx_path_bmp, regsty->tx_path_lmt, regsty->rx_path_lmt);
284 	RTW_PRINT_SEL(sel, "[RF_PATH] HALDATA's trx_path_bmp:0x%02x, max_tx_cnt:%u\n"
285 		, hal_data->trx_path_bmp, hal_data->max_tx_cnt);
286 	RTW_PRINT_SEL(sel, "[RF_PATH] HALDATA's rf_type:%s, NumTotalRFPath:%d\n"
287 		, rf_type_to_rfpath_str(hal_data->rf_type), hal_data->NumTotalRFPath);
288 }
289 
290 #ifdef CONFIG_RTL8814A
291 extern enum rf_type rtl8814a_rfpath_decision(_adapter *adapter);
292 #endif
293 
rtw_hal_rfpath_init(_adapter * adapter)294 u8 rtw_hal_rfpath_init(_adapter *adapter)
295 {
296 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
297 	struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
298 
299 #ifdef CONFIG_RTL8814A
300 if (IS_HARDWARE_TYPE_8814A(adapter)) {
301 	enum bb_path tx_bmp, rx_bmp;
302 	hal_data->rf_type = rtl8814a_rfpath_decision(adapter);
303 	rf_type_to_default_trx_bmp(hal_data->rf_type, &tx_bmp, &rx_bmp);
304 	hal_data->trx_path_bmp = (tx_bmp << 4) | rx_bmp;
305 	hal_data->NumTotalRFPath = 4;
306 	hal_data->max_tx_cnt = hal_spec->max_tx_cnt;
307 	hal_data->max_tx_cnt = rtw_min(hal_data->max_tx_cnt, rf_type_to_rf_tx_cnt(hal_data->rf_type));
308 } else
309 #endif
310 {
311 	struct registry_priv *regsty = adapter_to_regsty(adapter);
312 	u8 trx_path_bmp;
313 	u8 tx_path_num;
314 	u8 rx_path_num;
315 	int i;
316 
317 	trx_path_bmp = hal_spec->rf_reg_trx_path_bmp;
318 
319 	if (regsty->trx_path_bmp != 0x00) {
320 		/* restrict trx_path_bmp with regsty.trx_path_bmp */
321 		trx_path_bmp &= regsty->trx_path_bmp;
322 		if (!trx_path_bmp) {
323 			RTW_ERR("%s hal_spec.rf_reg_trx_path_bmp:0x%02x, regsty->trx_path_bmp:0x%02x no intersection\n"
324 				, __func__, hal_spec->rf_reg_trx_path_bmp, regsty->trx_path_bmp);
325 			return _FAIL;
326 		}
327 	} else if (hal_data->eeprom_trx_path_bmp != 0x00) {
328 		/* restrict trx_path_bmp with eeprom_trx_path_bmp */
329 		trx_path_bmp &= hal_data->eeprom_trx_path_bmp;
330 		if (!trx_path_bmp) {
331 			RTW_ERR("%s hal_spec.rf_reg_trx_path_bmp:0x%02x, hal_data->eeprom_trx_path_bmp:0x%02x no intersection\n"
332 				, __func__, hal_spec->rf_reg_trx_path_bmp, hal_data->eeprom_trx_path_bmp);
333 			return _FAIL;
334 		}
335 	}
336 
337 	/* restrict trx_path_bmp with TX and RX num limit */
338 	trx_path_bmp = rtw_restrict_trx_path_bmp_by_trx_num_lmt(trx_path_bmp
339 		, regsty->tx_path_lmt, regsty->rx_path_lmt, &tx_path_num, &rx_path_num);
340 	if (!trx_path_bmp) {
341 		RTW_ERR("%s rtw_restrict_trx_path_bmp_by_trx_num_lmt(0x%02x, %u, %u) failed\n"
342 			, __func__, trx_path_bmp, regsty->tx_path_lmt, regsty->rx_path_lmt);
343 		return _FAIL;
344 	}
345 	hal_data->trx_path_bmp = trx_path_bmp;
346 	hal_data->rf_type = trx_bmp_to_rf_type((trx_path_bmp & 0xF0) >> 4, trx_path_bmp & 0x0F);
347 	hal_data->NumTotalRFPath = rtw_max(tx_path_num, rx_path_num);
348 
349 	hal_data->max_tx_cnt = hal_spec->max_tx_cnt;
350 	hal_data->max_tx_cnt = rtw_min(hal_data->max_tx_cnt, tx_path_num);
351 	if (hal_data->eeprom_max_tx_cnt)
352 		hal_data->max_tx_cnt = rtw_min(hal_data->max_tx_cnt, hal_data->eeprom_max_tx_cnt);
353 
354 	if (1)
355 		_dump_rf_path(RTW_DBGDUMP, adapter);
356 }
357 
358 	RTW_INFO("%s trx_path_bmp:0x%02x(%s), NumTotalRFPath:%u, max_tx_cnt:%u\n"
359 		, __func__
360 		, hal_data->trx_path_bmp
361 		, rf_type_to_rfpath_str(hal_data->rf_type)
362 		, hal_data->NumTotalRFPath
363 		, hal_data->max_tx_cnt);
364 
365 	return _SUCCESS;
366 }
367 
_dump_trx_nss(void * sel,_adapter * adapter)368 void _dump_trx_nss(void *sel, _adapter *adapter)
369 {
370 	struct registry_priv *regpriv = &adapter->registrypriv;
371 	struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
372 
373 	RTW_PRINT_SEL(sel, "[TRX_Nss] HALSPEC - tx_nss:%d, rx_nss:%d\n", hal_spec->tx_nss_num, hal_spec->rx_nss_num);
374 	RTW_PRINT_SEL(sel, "[TRX_Nss] Registry - tx_nss:%d, rx_nss:%d\n", regpriv->tx_nss, regpriv->rx_nss);
375 	RTW_PRINT_SEL(sel, "[TRX_Nss] HALDATA - tx_nss:%d, rx_nss:%d\n", GET_HAL_TX_NSS(adapter), GET_HAL_RX_NSS(adapter));
376 
377 }
378 #define NSS_VALID(nss) (nss > 0)
379 
rtw_hal_trxnss_init(_adapter * adapter)380 u8 rtw_hal_trxnss_init(_adapter *adapter)
381 {
382 	struct registry_priv *regpriv = &adapter->registrypriv;
383 	struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
384 	PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
385 	enum rf_type rf_path = GET_HAL_RFPATH(adapter);
386 
387 	hal_data->tx_nss = hal_spec->tx_nss_num;
388 	hal_data->rx_nss = hal_spec->rx_nss_num;
389 
390 	if (NSS_VALID(regpriv->tx_nss))
391 		hal_data->tx_nss = rtw_min(hal_data->tx_nss, regpriv->tx_nss);
392 	hal_data->tx_nss = rtw_min(hal_data->tx_nss, hal_data->max_tx_cnt);
393 	if (NSS_VALID(regpriv->rx_nss))
394 		hal_data->rx_nss = rtw_min(hal_data->rx_nss, regpriv->rx_nss);
395 	hal_data->rx_nss = rtw_min(hal_data->rx_nss, rf_type_to_rf_rx_cnt(rf_path));
396 
397 	if (1)
398 		_dump_trx_nss(RTW_DBGDUMP, adapter);
399 
400 	RTW_INFO("%s tx_nss:%u, rx_nss:%u\n", __func__
401 		, hal_data->tx_nss, hal_data->rx_nss);
402 
403 	return _SUCCESS;
404 }
405 
406 #ifdef CONFIG_RTW_SW_LED
rtw_hal_sw_led_init(_adapter * padapter)407 void rtw_hal_sw_led_init(_adapter *padapter)
408 {
409 	struct led_priv *ledpriv = adapter_to_led(padapter);
410 
411 	if (ledpriv->bRegUseLed == _FALSE)
412 		return;
413 
414 	if (!is_primary_adapter(padapter))
415 		return;
416 
417 	if (padapter->hal_func.InitSwLeds) {
418 		padapter->hal_func.InitSwLeds(padapter);
419 		rtw_led_set_ctl_en_mask_primary(padapter);
420 		rtw_led_set_iface_en(padapter, 1);
421 	}
422 }
423 
rtw_hal_sw_led_deinit(_adapter * padapter)424 void rtw_hal_sw_led_deinit(_adapter *padapter)
425 {
426 	struct led_priv *ledpriv = adapter_to_led(padapter);
427 
428 	if (ledpriv->bRegUseLed == _FALSE)
429 		return;
430 
431 	if (!is_primary_adapter(padapter))
432 		return;
433 
434 	if (padapter->hal_func.DeInitSwLeds)
435 		padapter->hal_func.DeInitSwLeds(padapter);
436 }
437 #endif
438 
rtw_hal_power_on(_adapter * padapter)439 u32 rtw_hal_power_on(_adapter *padapter)
440 {
441 	u32 ret = 0;
442 	PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
443 
444 	ret = padapter->hal_func.hal_power_on(padapter);
445 
446 #ifdef CONFIG_BT_COEXIST
447 	if ((ret == _SUCCESS) && (pHalData->EEPROMBluetoothCoexist == _TRUE))
448 		rtw_btcoex_PowerOnSetting(padapter);
449 #endif
450 
451 	return ret;
452 }
rtw_hal_power_off(_adapter * padapter)453 void rtw_hal_power_off(_adapter *padapter)
454 {
455 	struct macid_ctl_t *macid_ctl = &padapter->dvobj->macid_ctl;
456 
457 	_rtw_memset(macid_ctl->h2c_msr, 0, MACID_NUM_SW_LIMIT);
458 	_rtw_memset(macid_ctl->op_num, 0, H2C_MSR_ROLE_MAX);
459 
460 #ifdef CONFIG_LPS_1T1R
461 	GET_HAL_DATA(padapter)->lps_1t1r = 0;
462 #endif
463 
464 #ifdef CONFIG_BT_COEXIST
465 	rtw_btcoex_PowerOffSetting(padapter);
466 #endif
467 
468 	padapter->hal_func.hal_power_off(padapter);
469 }
470 
471 
rtw_hal_init_opmode(_adapter * padapter)472 void rtw_hal_init_opmode(_adapter *padapter)
473 {
474 	NDIS_802_11_NETWORK_INFRASTRUCTURE networkType = Ndis802_11InfrastructureMax;
475 	struct  mlme_priv *pmlmepriv = &(padapter->mlmepriv);
476 	sint fw_state;
477 
478 	fw_state = get_fwstate(pmlmepriv);
479 
480 	if (fw_state & WIFI_ADHOC_STATE)
481 		networkType = Ndis802_11IBSS;
482 	else if (fw_state & WIFI_STATION_STATE)
483 		networkType = Ndis802_11Infrastructure;
484 #ifdef CONFIG_AP_MODE
485 	else if (fw_state & WIFI_AP_STATE)
486 		networkType = Ndis802_11APMode;
487 #endif
488 #ifdef CONFIG_RTW_MESH
489 	else if (fw_state & WIFI_MESH_STATE)
490 		networkType = Ndis802_11_mesh;
491 #endif
492 	else
493 		return;
494 
495 	rtw_setopmode_cmd(padapter, networkType, RTW_CMDF_DIRECTLY);
496 }
497 
498 #ifdef CONFIG_NEW_NETDEV_HDL
rtw_hal_iface_init(_adapter * adapter)499 uint rtw_hal_iface_init(_adapter *adapter)
500 {
501 	uint status = _SUCCESS;
502 
503 	rtw_hal_set_hwreg(adapter, HW_VAR_MAC_ADDR, adapter_mac_addr(adapter));
504 	#ifdef RTW_HALMAC
505 	rtw_hal_hw_port_enable(adapter);
506 	#endif
507 	rtw_sec_restore_wep_key(adapter);
508 	rtw_hal_init_opmode(adapter);
509 	rtw_hal_start_thread(adapter);
510 	return status;
511 }
rtw_hal_init(_adapter * padapter)512 uint rtw_hal_init(_adapter *padapter)
513 {
514 	uint status = _SUCCESS;
515 	PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
516 
517 	halrf_set_rfsupportability(adapter_to_phydm(padapter));
518 
519 	status = padapter->hal_func.hal_init(padapter);
520 
521 	if(pHalData ->phydm_init_result) {
522 
523 		status = _FAIL;
524 		RTW_ERR("%s phydm init fail reason=%u \n",
525 			__func__,
526 			pHalData ->phydm_init_result);
527 	}
528 
529 	if (status == _SUCCESS) {
530 		rtw_set_hw_init_completed(padapter, _TRUE);
531 		if (padapter->registrypriv.notch_filter == 1)
532 			rtw_hal_notch_filter(padapter, 1);
533 		rtw_led_control(padapter, LED_CTL_POWER_ON);
534 		init_hw_mlme_ext(padapter);
535 		#ifdef CONFIG_RF_POWER_TRIM
536 		rtw_bb_rf_gain_offset(padapter);
537 		#endif /*CONFIG_RF_POWER_TRIM*/
538 		GET_PRIMARY_ADAPTER(padapter)->bup = _TRUE; /*temporary*/
539 		#ifdef CONFIG_MI_WITH_MBSSID_CAM
540 		rtw_mi_set_mbid_cam(padapter);
541 		#endif
542 		#ifdef CONFIG_SUPPORT_MULTI_BCN
543 		rtw_ap_multi_bcn_cfg(padapter);
544 		#endif
545 		#if (RTL8822B_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)
546 		#ifdef CONFIG_DYNAMIC_SOML
547 		rtw_dyn_soml_config(padapter);
548 		#endif
549 		#endif
550 		#ifdef CONFIG_TDMADIG
551 		rtw_phydm_tdmadig(padapter, TDMADIG_INIT);
552 		#endif/*CONFIG_TDMADIG*/
553 		rtw_phydm_dyn_rrsr_en(padapter,padapter->registrypriv.en_dyn_rrsr);
554 		#ifdef RTW_HALMAC
555 		RTW_INFO("%s: padapter->registrypriv.set_rrsr_value=0x%x\n", __func__,padapter->registrypriv.set_rrsr_value);
556 		if(padapter->registrypriv.set_rrsr_value != 0xFFFFFFFF)
557 			rtw_phydm_set_rrsr(padapter, padapter->registrypriv.set_rrsr_value, TRUE);
558 		#endif
559 	} else {
560 		rtw_set_hw_init_completed(padapter, _FALSE);
561 		RTW_ERR("%s: hal_init fail\n", __func__);
562 	}
563 	return status;
564 }
565 #else
rtw_hal_init(_adapter * padapter)566 uint	 rtw_hal_init(_adapter *padapter)
567 {
568 	uint	status = _SUCCESS;
569 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
570 	PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
571 	int i;
572 
573 	halrf_set_rfsupportability(adapter_to_phydm(padapter));
574 
575 	status = padapter->hal_func.hal_init(padapter);
576 
577 	if(pHalData ->phydm_init_result) {
578 
579 		status = _FAIL;
580 		RTW_ERR("%s phydm init fail reason=%u \n",
581 				__func__,
582 				pHalData->phydm_init_result);
583 	}
584 
585 	if (status == _SUCCESS) {
586 		rtw_set_hw_init_completed(padapter, _TRUE);
587 		rtw_mi_set_mac_addr(padapter);/*set mac addr of all ifaces*/
588 		#ifdef RTW_HALMAC
589 		rtw_restore_hw_port_cfg(padapter);
590 		#endif
591 		if (padapter->registrypriv.notch_filter == 1)
592 			rtw_hal_notch_filter(padapter, 1);
593 
594 		for (i = 0; i < dvobj->iface_nums; i++)
595 			rtw_sec_restore_wep_key(dvobj->padapters[i]);
596 
597 		rtw_led_control(padapter, LED_CTL_POWER_ON);
598 
599 		init_hw_mlme_ext(padapter);
600 
601 		rtw_hal_init_opmode(padapter);
602 
603 		#ifdef CONFIG_RF_POWER_TRIM
604 		rtw_bb_rf_gain_offset(padapter);
605 		#endif /*CONFIG_RF_POWER_TRIM*/
606 
607 		#ifdef CONFIG_SUPPORT_MULTI_BCN
608 		rtw_ap_multi_bcn_cfg(padapter);
609 		#endif
610 
611 #if (RTL8822B_SUPPORT == 1) || (RTL8192F_SUPPORT == 1)
612 #ifdef CONFIG_DYNAMIC_SOML
613 		rtw_dyn_soml_config(padapter);
614 #endif
615 #endif
616 		#ifdef CONFIG_TDMADIG
617 		rtw_phydm_tdmadig(padapter, TDMADIG_INIT);
618 		#endif/*CONFIG_TDMADIG*/
619 
620 		rtw_phydm_dyn_rrsr_en(padapter,padapter->registrypriv.en_dyn_rrsr);
621 		#ifdef RTW_HALMAC
622 		RTW_INFO("%s: padapter->registrypriv.set_rrsr_value=0x%x\n", __func__,padapter->registrypriv.set_rrsr_value);
623 		if(padapter->registrypriv.set_rrsr_value != 0xFFFFFFFF)
624 			rtw_phydm_set_rrsr(padapter, padapter->registrypriv.set_rrsr_value, TRUE);
625 		#endif
626 
627 	} else {
628 		rtw_set_hw_init_completed(padapter, _FALSE);
629 		RTW_ERR("%s: fail\n", __func__);
630 	}
631 
632 
633 	return status;
634 
635 }
636 #endif
637 
rtw_hal_deinit(_adapter * padapter)638 uint rtw_hal_deinit(_adapter *padapter)
639 {
640 	uint	status = _SUCCESS;
641 
642 	status = padapter->hal_func.hal_deinit(padapter);
643 
644 	if (status == _SUCCESS) {
645 		rtw_led_control(padapter, LED_CTL_POWER_OFF);
646 		rtw_set_hw_init_completed(padapter, _FALSE);
647 	} else
648 		RTW_INFO("\n rtw_hal_deinit: hal_init fail\n");
649 
650 
651 	return status;
652 }
653 
rtw_hal_set_hwreg(_adapter * padapter,u8 variable,u8 * val)654 u8 rtw_hal_set_hwreg(_adapter *padapter, u8 variable, u8 *val)
655 {
656 	return padapter->hal_func.set_hw_reg_handler(padapter, variable, val);
657 }
658 
rtw_hal_get_hwreg(_adapter * padapter,u8 variable,u8 * val)659 void rtw_hal_get_hwreg(_adapter *padapter, u8 variable, u8 *val)
660 {
661 	padapter->hal_func.GetHwRegHandler(padapter, variable, val);
662 }
663 
rtw_hal_set_def_var(_adapter * padapter,HAL_DEF_VARIABLE eVariable,void * pValue)664 u8 rtw_hal_set_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, void *pValue)
665 {
666 	return padapter->hal_func.SetHalDefVarHandler(padapter, eVariable, pValue);
667 }
rtw_hal_get_def_var(_adapter * padapter,HAL_DEF_VARIABLE eVariable,void * pValue)668 u8 rtw_hal_get_def_var(_adapter *padapter, HAL_DEF_VARIABLE eVariable, void *pValue)
669 {
670 	return padapter->hal_func.get_hal_def_var_handler(padapter, eVariable, pValue);
671 }
672 
rtw_hal_set_odm_var(_adapter * padapter,HAL_ODM_VARIABLE eVariable,void * pValue1,BOOLEAN bSet)673 void rtw_hal_set_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, void *pValue1, BOOLEAN bSet)
674 {
675 	padapter->hal_func.SetHalODMVarHandler(padapter, eVariable, pValue1, bSet);
676 }
rtw_hal_get_odm_var(_adapter * padapter,HAL_ODM_VARIABLE eVariable,void * pValue1,void * pValue2)677 void	rtw_hal_get_odm_var(_adapter *padapter, HAL_ODM_VARIABLE eVariable, void *pValue1, void *pValue2)
678 {
679 	padapter->hal_func.GetHalODMVarHandler(padapter, eVariable, pValue1, pValue2);
680 }
681 
682 /* FOR SDIO & PCIE */
rtw_hal_enable_interrupt(_adapter * padapter)683 void rtw_hal_enable_interrupt(_adapter *padapter)
684 {
685 #if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
686 	padapter->hal_func.enable_interrupt(padapter);
687 #endif /* #if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) */
688 }
689 
690 /* FOR SDIO & PCIE */
rtw_hal_disable_interrupt(_adapter * padapter)691 void rtw_hal_disable_interrupt(_adapter *padapter)
692 {
693 #if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
694 	padapter->hal_func.disable_interrupt(padapter);
695 #endif /* #if defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) */
696 }
697 
698 
rtw_hal_check_ips_status(_adapter * padapter)699 u8 rtw_hal_check_ips_status(_adapter *padapter)
700 {
701 	u8 val = _FALSE;
702 	if (padapter->hal_func.check_ips_status)
703 		val = padapter->hal_func.check_ips_status(padapter);
704 	else
705 		RTW_INFO("%s: hal_func.check_ips_status is NULL!\n", __FUNCTION__);
706 
707 	return val;
708 }
709 
rtw_hal_fw_dl(_adapter * padapter,u8 wowlan)710 s32 rtw_hal_fw_dl(_adapter *padapter, u8 wowlan)
711 {
712 	s32 ret;
713 
714 	ret = padapter->hal_func.fw_dl(padapter, wowlan);
715 
716 #ifdef CONFIG_LPS_1T1R
717 	GET_HAL_DATA(padapter)->lps_1t1r = 0;
718 #endif
719 
720 	return ret;
721 }
722 
723 #ifdef RTW_HALMAC
rtw_hal_fw_mem_dl(_adapter * padapter,enum fw_mem mem)724 s32 rtw_hal_fw_mem_dl(_adapter *padapter, enum fw_mem mem)
725 {
726 	systime dlfw_start_time = rtw_get_current_time();
727 	struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
728 	struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
729 	s32 rst = _FALSE;
730 
731 	rst = padapter->hal_func.fw_mem_dl(padapter, mem);
732 	RTW_INFO("%s in %dms\n", __func__, rtw_get_passing_time_ms(dlfw_start_time));
733 
734 	if (rst == _FALSE)
735 		pdbgpriv->dbg_fw_mem_dl_error_cnt++;
736 	if (1)
737 		RTW_INFO("%s dbg_fw_mem_dl_error_cnt:%d\n", __func__, pdbgpriv->dbg_fw_mem_dl_error_cnt);
738 	return rst;
739 }
740 #endif
741 
742 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
rtw_hal_clear_interrupt(_adapter * padapter)743 void rtw_hal_clear_interrupt(_adapter *padapter)
744 {
745 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
746 	padapter->hal_func.clear_interrupt(padapter);
747 #endif
748 }
749 #endif
750 
751 #if defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI)
rtw_hal_inirp_init(_adapter * padapter)752 u32	rtw_hal_inirp_init(_adapter *padapter)
753 {
754 	if (is_primary_adapter(padapter))
755 		return padapter->hal_func.inirp_init(padapter);
756 	return _SUCCESS;
757 }
rtw_hal_inirp_deinit(_adapter * padapter)758 u32	rtw_hal_inirp_deinit(_adapter *padapter)
759 {
760 
761 	if (is_primary_adapter(padapter))
762 		return padapter->hal_func.inirp_deinit(padapter);
763 
764 	return _SUCCESS;
765 }
766 #endif /* #if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI) */
767 
768 #if defined(CONFIG_PCI_HCI)
rtw_hal_irp_reset(_adapter * padapter)769 void	rtw_hal_irp_reset(_adapter *padapter)
770 {
771 	padapter->hal_func.irp_reset(GET_PRIMARY_ADAPTER(padapter));
772 }
773 
rtw_hal_pci_dbi_write(_adapter * padapter,u16 addr,u8 data)774 void rtw_hal_pci_dbi_write(_adapter *padapter, u16 addr, u8 data)
775 {
776 	u16 cmd[2];
777 
778 	cmd[0] = addr;
779 	cmd[1] = data;
780 
781 	padapter->hal_func.set_hw_reg_handler(padapter, HW_VAR_DBI, (u8 *) cmd);
782 }
783 
rtw_hal_pci_dbi_read(_adapter * padapter,u16 addr)784 u8 rtw_hal_pci_dbi_read(_adapter *padapter, u16 addr)
785 {
786 	padapter->hal_func.GetHwRegHandler(padapter, HW_VAR_DBI, (u8 *)(&addr));
787 
788 	return (u8)addr;
789 }
790 
rtw_hal_pci_mdio_write(_adapter * padapter,u8 addr,u16 data)791 void rtw_hal_pci_mdio_write(_adapter *padapter, u8 addr, u16 data)
792 {
793 	u16 cmd[2];
794 
795 	cmd[0] = (u16)addr;
796 	cmd[1] = data;
797 
798 	padapter->hal_func.set_hw_reg_handler(padapter, HW_VAR_MDIO, (u8 *) cmd);
799 }
800 
rtw_hal_pci_mdio_read(_adapter * padapter,u8 addr)801 u16 rtw_hal_pci_mdio_read(_adapter *padapter, u8 addr)
802 {
803 	padapter->hal_func.GetHwRegHandler(padapter, HW_VAR_MDIO, &addr);
804 
805 	return (u8)addr;
806 }
807 
rtw_hal_pci_l1off_nic_support(_adapter * padapter)808 u8 rtw_hal_pci_l1off_nic_support(_adapter *padapter)
809 {
810 	u8 l1off;
811 
812 	padapter->hal_func.GetHwRegHandler(padapter, HW_VAR_L1OFF_NIC_SUPPORT, &l1off);
813 	return l1off;
814 }
815 
rtw_hal_pci_l1off_capability(_adapter * padapter)816 u8 rtw_hal_pci_l1off_capability(_adapter *padapter)
817 {
818 	u8 l1off;
819 
820 	padapter->hal_func.GetHwRegHandler(padapter, HW_VAR_L1OFF_CAPABILITY, &l1off);
821 	return l1off;
822 }
823 
824 
825 #endif /* #if defined(CONFIG_PCI_HCI) */
826 
827 /* for USB Auto-suspend */
rtw_hal_intf_ps_func(_adapter * padapter,HAL_INTF_PS_FUNC efunc_id,u8 * val)828 u8	rtw_hal_intf_ps_func(_adapter *padapter, HAL_INTF_PS_FUNC efunc_id, u8 *val)
829 {
830 	if (padapter->hal_func.interface_ps_func)
831 		return padapter->hal_func.interface_ps_func(padapter, efunc_id, val);
832 	return _FAIL;
833 }
834 
rtw_hal_xmitframe_enqueue(_adapter * padapter,struct xmit_frame * pxmitframe)835 s32	rtw_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
836 {
837 	return padapter->hal_func.hal_xmitframe_enqueue(padapter, pxmitframe);
838 }
839 
rtw_hal_xmit(_adapter * padapter,struct xmit_frame * pxmitframe)840 s32	rtw_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe)
841 {
842 	return padapter->hal_func.hal_xmit(padapter, pxmitframe);
843 }
844 
845 /*
846  * [IMPORTANT] This function would be run in interrupt context.
847  */
rtw_hal_mgnt_xmit(_adapter * padapter,struct xmit_frame * pmgntframe)848 s32	rtw_hal_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe)
849 {
850 	s32 ret = _FAIL;
851 
852 	update_mgntframe_attrib_addr(padapter, pmgntframe);
853 
854 #if defined(CONFIG_IEEE80211W) || defined(CONFIG_RTW_MESH)
855 	if ((!MLME_IS_MESH(padapter) && SEC_IS_BIP_KEY_INSTALLED(&padapter->securitypriv) == _TRUE)
856 		#ifdef CONFIG_RTW_MESH
857 		|| (MLME_IS_MESH(padapter) && padapter->mesh_info.mesh_auth_id)
858 		#endif
859 	)
860 		rtw_mgmt_xmitframe_coalesce(padapter, pmgntframe->pkt, pmgntframe);
861 #endif
862 
863 	ret = padapter->hal_func.mgnt_xmit(padapter, pmgntframe);
864 	return ret;
865 }
866 
rtw_hal_init_xmit_priv(_adapter * padapter)867 s32	rtw_hal_init_xmit_priv(_adapter *padapter)
868 {
869 	return padapter->hal_func.init_xmit_priv(padapter);
870 }
rtw_hal_free_xmit_priv(_adapter * padapter)871 void	rtw_hal_free_xmit_priv(_adapter *padapter)
872 {
873 	padapter->hal_func.free_xmit_priv(padapter);
874 }
875 
rtw_hal_init_recv_priv(_adapter * padapter)876 s32	rtw_hal_init_recv_priv(_adapter *padapter)
877 {
878 	return padapter->hal_func.init_recv_priv(padapter);
879 }
rtw_hal_free_recv_priv(_adapter * padapter)880 void	rtw_hal_free_recv_priv(_adapter *padapter)
881 {
882 	padapter->hal_func.free_recv_priv(padapter);
883 }
884 
rtw_sta_ra_registed(_adapter * padapter,struct sta_info * psta)885 void rtw_sta_ra_registed(_adapter *padapter, struct sta_info *psta)
886 {
887 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);
888 
889 	if (psta == NULL) {
890 		RTW_ERR(FUNC_ADPT_FMT" sta is NULL\n", FUNC_ADPT_ARG(padapter));
891 		rtw_warn_on(1);
892 		return;
893 	}
894 
895 #ifdef CONFIG_AP_MODE
896 	if (MLME_IS_AP(padapter) || MLME_IS_MESH(padapter)) {
897 		if (psta->cmn.aid > padapter->stapriv.max_aid) {
898 			RTW_ERR("station aid %d exceed the max number\n", psta->cmn.aid);
899 			rtw_warn_on(1);
900 			return;
901 		}
902 		rtw_ap_update_sta_ra_info(padapter, psta);
903 	}
904 #endif
905 
906 	psta->cmn.ra_info.ra_bw_mode = rtw_get_tx_bw_mode(padapter, psta);
907 	/*set correct initial date rate for each mac_id */
908 	hal_data->INIDATA_RATE[psta->cmn.mac_id] = psta->init_rate;
909 
910 	rtw_phydm_ra_registed(padapter, psta);
911 }
912 
rtw_hal_update_ra_mask(struct sta_info * psta)913 void rtw_hal_update_ra_mask(struct sta_info *psta)
914 {
915 	_adapter *padapter;
916 
917 	if (!psta)
918 		return;
919 
920 	padapter = psta->padapter;
921 	rtw_sta_ra_registed(padapter, psta);
922 }
923 
924 /*	Start specifical interface thread		*/
rtw_hal_start_thread(_adapter * padapter)925 void	rtw_hal_start_thread(_adapter *padapter)
926 {
927 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
928 #ifndef CONFIG_SDIO_TX_TASKLET
929 	padapter->hal_func.run_thread(padapter);
930 #endif
931 #endif
932 }
933 /*	Start specifical interface thread		*/
rtw_hal_stop_thread(_adapter * padapter)934 void	rtw_hal_stop_thread(_adapter *padapter)
935 {
936 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
937 #ifndef CONFIG_SDIO_TX_TASKLET
938 
939 	padapter->hal_func.cancel_thread(padapter);
940 
941 #endif
942 #endif
943 }
944 
rtw_hal_read_bbreg(_adapter * padapter,u32 RegAddr,u32 BitMask)945 u32	rtw_hal_read_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask)
946 {
947 	u32 data = 0;
948 	if (padapter->hal_func.read_bbreg)
949 		data = padapter->hal_func.read_bbreg(padapter, RegAddr, BitMask);
950 	return data;
951 }
rtw_hal_write_bbreg(_adapter * padapter,u32 RegAddr,u32 BitMask,u32 Data)952 void	rtw_hal_write_bbreg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data)
953 {
954 	if (padapter->hal_func.write_bbreg)
955 		padapter->hal_func.write_bbreg(padapter, RegAddr, BitMask, Data);
956 }
957 
rtw_hal_read_rfreg(_adapter * padapter,enum rf_path eRFPath,u32 RegAddr,u32 BitMask)958 u32 rtw_hal_read_rfreg(_adapter *padapter, enum rf_path eRFPath, u32 RegAddr, u32 BitMask)
959 {
960 	u32 data = 0;
961 
962 	if (padapter->hal_func.read_rfreg) {
963 		data = padapter->hal_func.read_rfreg(padapter, eRFPath, RegAddr, BitMask);
964 
965 		#ifdef DBG_IO
966 		if (match_rf_read_sniff_ranges(padapter, eRFPath, RegAddr, BitMask)) {
967 			RTW_INFO("DBG_IO rtw_hal_read_rfreg(%u, 0x%04x, 0x%08x) read:0x%08x(0x%08x)\n"
968 				, eRFPath, RegAddr, BitMask, (data << PHY_CalculateBitShift(BitMask)), data);
969 		}
970 		#endif
971 	}
972 
973 	return data;
974 }
975 
rtw_hal_write_rfreg(_adapter * padapter,enum rf_path eRFPath,u32 RegAddr,u32 BitMask,u32 Data)976 void rtw_hal_write_rfreg(_adapter *padapter, enum rf_path eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
977 {
978 	if (padapter->hal_func.write_rfreg) {
979 
980 		#ifdef DBG_IO
981 		if (match_rf_write_sniff_ranges(padapter, eRFPath, RegAddr, BitMask)) {
982 			RTW_INFO("DBG_IO rtw_hal_write_rfreg(%u, 0x%04x, 0x%08x) write:0x%08x(0x%08x)\n"
983 				, eRFPath, RegAddr, BitMask, (Data << PHY_CalculateBitShift(BitMask)), Data);
984 		}
985 		#endif
986 
987 		padapter->hal_func.write_rfreg(padapter, eRFPath, RegAddr, BitMask, Data);
988 
989 #ifdef CONFIG_PCI_HCI
990 		if (!IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(padapter)) /*For N-Series IC, suggest by Jenyu*/
991 			rtw_udelay_os(2);
992 #endif
993 	}
994 }
995 
996 #ifdef CONFIG_SYSON_INDIRECT_ACCESS
rtw_hal_read_syson_reg(PADAPTER padapter,u32 RegAddr,u32 BitMask)997 u32 rtw_hal_read_syson_reg(PADAPTER padapter, u32 RegAddr, u32 BitMask)
998 {
999 	u32 data = 0;
1000 	if (padapter->hal_func.read_syson_reg)
1001 		data = padapter->hal_func.read_syson_reg(padapter, RegAddr, BitMask);
1002 
1003 	return data;
1004 }
1005 
rtw_hal_write_syson_reg(_adapter * padapter,u32 RegAddr,u32 BitMask,u32 Data)1006 void rtw_hal_write_syson_reg(_adapter *padapter, u32 RegAddr, u32 BitMask, u32 Data)
1007 {
1008 	if (padapter->hal_func.write_syson_reg)
1009 		padapter->hal_func.write_syson_reg(padapter, RegAddr, BitMask, Data);
1010 }
1011 #endif
1012 
1013 #if defined(CONFIG_PCI_HCI)
rtw_hal_interrupt_handler(_adapter * padapter)1014 s32	rtw_hal_interrupt_handler(_adapter *padapter)
1015 {
1016 	s32 ret = _FAIL;
1017 	ret = padapter->hal_func.interrupt_handler(padapter);
1018 	return ret;
1019 }
1020 
rtw_hal_unmap_beacon_icf(_adapter * padapter)1021 void	rtw_hal_unmap_beacon_icf(_adapter *padapter)
1022 {
1023 	padapter->hal_func.unmap_beacon_icf(padapter);
1024 }
1025 #endif
1026 #if defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT)
rtw_hal_interrupt_handler(_adapter * padapter,u16 pkt_len,u8 * pbuf)1027 void	rtw_hal_interrupt_handler(_adapter *padapter, u16 pkt_len, u8 *pbuf)
1028 {
1029 	padapter->hal_func.interrupt_handler(padapter, pkt_len, pbuf);
1030 }
1031 #endif
1032 
rtw_hal_set_chnl_bw(_adapter * padapter,u8 channel,enum channel_width Bandwidth,u8 Offset40,u8 Offset80)1033 void	rtw_hal_set_chnl_bw(_adapter *padapter, u8 channel, enum channel_width Bandwidth, u8 Offset40, u8 Offset80)
1034 {
1035 	PHAL_DATA_TYPE	pHalData = GET_HAL_DATA(padapter);
1036 	/*u8 cch_160 = Bandwidth == CHANNEL_WIDTH_160 ? channel : 0;*/
1037 	u8 cch_80 = Bandwidth == CHANNEL_WIDTH_80 ? channel : 0;
1038 	u8 cch_40 = Bandwidth == CHANNEL_WIDTH_40 ? channel : 0;
1039 	u8 cch_20 = Bandwidth == CHANNEL_WIDTH_20 ? channel : 0;
1040 
1041 	if (rtw_phydm_is_iqk_in_progress(padapter))
1042 		RTW_ERR("%s, %d, IQK may race condition\n", __func__, __LINE__);
1043 
1044 #ifdef CONFIG_MP_INCLUDED
1045 	/* MP mode channel don't use secondary channel */
1046 	if (rtw_mp_mode_check(padapter) == _FALSE)
1047 #endif
1048 	{
1049 		#if 0
1050 		if (cch_160 != 0)
1051 			cch_80 = rtw_get_scch_by_cch_offset(cch_160, CHANNEL_WIDTH_160, Offset80);
1052 		#endif
1053 		if (cch_80 != 0)
1054 			cch_40 = rtw_get_scch_by_cch_offset(cch_80, CHANNEL_WIDTH_80, Offset80);
1055 		if (cch_40 != 0)
1056 			cch_20 = rtw_get_scch_by_cch_offset(cch_40, CHANNEL_WIDTH_40, Offset40);
1057 	}
1058 
1059 	pHalData->cch_80 = cch_80;
1060 	pHalData->cch_40 = cch_40;
1061 	pHalData->cch_20 = cch_20;
1062 
1063 	if (0)
1064 		RTW_INFO("%s cch:%u, %s, offset40:%u, offset80:%u (%u, %u, %u)\n", __func__
1065 			, channel, ch_width_str(Bandwidth), Offset40, Offset80
1066 			, pHalData->cch_80, pHalData->cch_40, pHalData->cch_20);
1067 
1068 	padapter->hal_func.set_chnl_bw_handler(padapter, channel, Bandwidth, Offset40, Offset80);
1069 }
1070 
rtw_hal_dm_watchdog(_adapter * padapter)1071 void	rtw_hal_dm_watchdog(_adapter *padapter)
1072 {
1073 
1074 	rtw_hal_turbo_edca(padapter);
1075 	padapter->hal_func.hal_dm_watchdog(padapter);
1076 }
1077 
1078 #ifdef CONFIG_LPS_LCLK_WD_TIMER
rtw_hal_dm_watchdog_in_lps(_adapter * padapter)1079 void	rtw_hal_dm_watchdog_in_lps(_adapter *padapter)
1080 {
1081 #if defined(CONFIG_CONCURRENT_MODE)
1082 #ifndef CONFIG_FW_MULTI_PORT_SUPPORT
1083 	if (padapter->hw_port != HW_PORT0)
1084 		return;
1085 #endif
1086 #endif
1087 
1088 	if (adapter_to_pwrctl(padapter)->bFwCurrentInPSMode == _TRUE)
1089 		rtw_phydm_watchdog_in_lps_lclk(padapter);/* this function caller is in interrupt context */
1090 }
1091 #endif /*CONFIG_LPS_LCLK_WD_TIMER*/
1092 
rtw_hal_bcn_related_reg_setting(_adapter * padapter)1093 void rtw_hal_bcn_related_reg_setting(_adapter *padapter)
1094 {
1095 	padapter->hal_func.SetBeaconRelatedRegistersHandler(padapter);
1096 }
1097 
1098 #ifdef CONFIG_HOSTAPD_MLME
rtw_hal_hostap_mgnt_xmit_entry(_adapter * padapter,_pkt * pkt)1099 s32	rtw_hal_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt)
1100 {
1101 	if (padapter->hal_func.hostap_mgnt_xmit_entry)
1102 		return padapter->hal_func.hostap_mgnt_xmit_entry(padapter, pkt);
1103 	return _FAIL;
1104 }
1105 #endif /* CONFIG_HOSTAPD_MLME */
1106 
1107 #ifdef DBG_CONFIG_ERROR_DETECT
rtw_hal_sreset_init(_adapter * padapter)1108 void	rtw_hal_sreset_init(_adapter *padapter)
1109 {
1110 	padapter->hal_func.sreset_init_value(padapter);
1111 }
rtw_hal_sreset_reset(_adapter * padapter)1112 void rtw_hal_sreset_reset(_adapter *padapter)
1113 {
1114 	padapter = GET_PRIMARY_ADAPTER(padapter);
1115 	padapter->hal_func.silentreset(padapter);
1116 }
1117 
rtw_hal_sreset_reset_value(_adapter * padapter)1118 void rtw_hal_sreset_reset_value(_adapter *padapter)
1119 {
1120 	padapter->hal_func.sreset_reset_value(padapter);
1121 }
1122 
rtw_hal_sreset_xmit_status_check(_adapter * padapter)1123 void rtw_hal_sreset_xmit_status_check(_adapter *padapter)
1124 {
1125 	padapter->hal_func.sreset_xmit_status_check(padapter);
1126 }
rtw_hal_sreset_linked_status_check(_adapter * padapter)1127 void rtw_hal_sreset_linked_status_check(_adapter *padapter)
1128 {
1129 	padapter->hal_func.sreset_linked_status_check(padapter);
1130 }
rtw_hal_sreset_get_wifi_status(_adapter * padapter)1131 u8   rtw_hal_sreset_get_wifi_status(_adapter *padapter)
1132 {
1133 	return padapter->hal_func.sreset_get_wifi_status(padapter);
1134 }
1135 
rtw_hal_sreset_inprogress(_adapter * padapter)1136 bool rtw_hal_sreset_inprogress(_adapter *padapter)
1137 {
1138 	padapter = GET_PRIMARY_ADAPTER(padapter);
1139 	return padapter->hal_func.sreset_inprogress(padapter);
1140 }
1141 #endif /* DBG_CONFIG_ERROR_DETECT */
1142 
1143 #ifdef CONFIG_IOL
rtw_hal_iol_cmd(ADAPTER * adapter,struct xmit_frame * xmit_frame,u32 max_waiting_ms,u32 bndy_cnt)1144 int rtw_hal_iol_cmd(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_waiting_ms, u32 bndy_cnt)
1145 {
1146 	if (adapter->hal_func.IOL_exec_cmds_sync)
1147 		return adapter->hal_func.IOL_exec_cmds_sync(adapter, xmit_frame, max_waiting_ms, bndy_cnt);
1148 	return _FAIL;
1149 }
1150 #endif
1151 
1152 #ifdef CONFIG_XMIT_THREAD_MODE
rtw_hal_xmit_thread_handler(_adapter * padapter)1153 s32 rtw_hal_xmit_thread_handler(_adapter *padapter)
1154 {
1155 	return padapter->hal_func.xmit_thread_handler(padapter);
1156 }
1157 #endif
1158 
1159 #ifdef CONFIG_RECV_THREAD_MODE
rtw_hal_recv_hdl(_adapter * adapter)1160 s32 rtw_hal_recv_hdl(_adapter *adapter)
1161 {
1162 	return adapter->hal_func.recv_hdl(adapter);
1163 }
1164 #endif
1165 
rtw_hal_notch_filter(_adapter * adapter,bool enable)1166 void rtw_hal_notch_filter(_adapter *adapter, bool enable)
1167 {
1168 	if (adapter->hal_func.hal_notch_filter)
1169 		adapter->hal_func.hal_notch_filter(adapter, enable);
1170 }
1171 
1172 #ifdef CONFIG_FW_C2H_REG
rtw_hal_c2h_valid(_adapter * adapter,u8 * buf)1173 inline bool rtw_hal_c2h_valid(_adapter *adapter, u8 *buf)
1174 {
1175 	HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
1176 	bool ret = _FAIL;
1177 
1178 	ret = C2H_ID_88XX(buf) || C2H_PLEN_88XX(buf);
1179 
1180 	return ret;
1181 }
1182 
rtw_hal_c2h_evt_read(_adapter * adapter,u8 * buf)1183 inline s32 rtw_hal_c2h_evt_read(_adapter *adapter, u8 *buf)
1184 {
1185 	HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
1186 	s32 ret = _FAIL;
1187 
1188 	ret = c2h_evt_read_88xx(adapter, buf);
1189 
1190 	return ret;
1191 }
1192 
rtw_hal_c2h_reg_hdr_parse(_adapter * adapter,u8 * buf,u8 * id,u8 * seq,u8 * plen,u8 ** payload)1193 bool rtw_hal_c2h_reg_hdr_parse(_adapter *adapter, u8 *buf, u8 *id, u8 *seq, u8 *plen, u8 **payload)
1194 {
1195 	HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
1196 	bool ret = _FAIL;
1197 
1198 	*id = C2H_ID_88XX(buf);
1199 	*seq = C2H_SEQ_88XX(buf);
1200 	*plen = C2H_PLEN_88XX(buf);
1201 	*payload = C2H_PAYLOAD_88XX(buf);
1202 	ret = _SUCCESS;
1203 
1204 	return ret;
1205 }
1206 #endif /* CONFIG_FW_C2H_REG */
1207 
1208 #ifdef CONFIG_FW_C2H_PKT
rtw_hal_c2h_pkt_hdr_parse(_adapter * adapter,u8 * buf,u16 len,u8 * id,u8 * seq,u8 * plen,u8 ** payload)1209 bool rtw_hal_c2h_pkt_hdr_parse(_adapter *adapter, u8 *buf, u16 len, u8 *id, u8 *seq, u8 *plen, u8 **payload)
1210 {
1211 	HAL_DATA_TYPE *HalData = GET_HAL_DATA(adapter);
1212 	bool ret = _FAIL;
1213 
1214 	if (!buf || len > 256 || len < 3)
1215 		goto exit;
1216 
1217 	*id = C2H_ID_88XX(buf);
1218 	*seq = C2H_SEQ_88XX(buf);
1219 	*plen = len - 2;
1220 	*payload = C2H_PAYLOAD_88XX(buf);
1221 	ret = _SUCCESS;
1222 
1223 exit:
1224 	return ret;
1225 }
1226 #endif /* CONFIG_FW_C2H_PKT */
1227 
1228 #if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_RTL8723B)
1229 #include <rtw_bt_mp.h> /* for MPTBT_FwC2hBtMpCtrl */
1230 #endif
c2h_handler(_adapter * adapter,u8 id,u8 seq,u8 plen,u8 * payload)1231 s32 c2h_handler(_adapter *adapter, u8 id, u8 seq, u8 plen, u8 *payload)
1232 {
1233 	u8 sub_id = 0;
1234 	s32 ret = _SUCCESS;
1235 
1236 	switch (id) {
1237 	case C2H_FW_SCAN_COMPLETE:
1238 		RTW_INFO("[C2H], FW Scan Complete\n");
1239 		break;
1240 
1241 #ifdef CONFIG_BT_COEXIST
1242 	case C2H_BT_INFO:
1243 		rtw_btcoex_BtInfoNotify(adapter, plen, payload);
1244 		break;
1245 	case C2H_BT_MP_INFO:
1246 		#if defined(CONFIG_MP_INCLUDED) && defined(CONFIG_RTL8723B)
1247 		MPTBT_FwC2hBtMpCtrl(adapter, payload, plen);
1248 		#endif
1249 		rtw_btcoex_BtMpRptNotify(adapter, plen, payload);
1250 		break;
1251 	case C2H_MAILBOX_STATUS:
1252 		RTW_DBG_DUMP("C2H_MAILBOX_STATUS: ", payload, plen);
1253 		break;
1254 	case C2H_WLAN_INFO:
1255 		rtw_btcoex_WlFwDbgInfoNotify(adapter, payload, plen);
1256 		break;
1257 #endif /* CONFIG_BT_COEXIST */
1258 
1259 	case C2H_IQK_FINISH:
1260 		c2h_iqk_offload(adapter, payload, plen);
1261 		break;
1262 
1263 #if defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)
1264 	case C2H_FW_CHNL_SWITCH_COMPLETE:
1265 		rtw_tdls_chsw_oper_done(adapter);
1266 		break;
1267 	case C2H_BCN_EARLY_RPT:
1268 		rtw_tdls_ch_sw_back_to_base_chnl(adapter);
1269 		break;
1270 #endif
1271 
1272 #ifdef CONFIG_MCC_MODE
1273 	case C2H_MCC:
1274 		rtw_hal_mcc_c2h_handler(adapter, plen, payload);
1275 		break;
1276 #endif
1277 
1278 #ifdef CONFIG_RTW_MAC_HIDDEN_RPT
1279 	case C2H_MAC_HIDDEN_RPT:
1280 		c2h_mac_hidden_rpt_hdl(adapter, payload, plen);
1281 		break;
1282 	case C2H_MAC_HIDDEN_RPT_2:
1283 		c2h_mac_hidden_rpt_2_hdl(adapter, payload, plen);
1284 		break;
1285 #endif
1286 
1287 	case C2H_DEFEATURE_DBG:
1288 		c2h_defeature_dbg_hdl(adapter, payload, plen);
1289 		break;
1290 
1291 #ifdef CONFIG_RTW_CUSTOMER_STR
1292 	case C2H_CUSTOMER_STR_RPT:
1293 		c2h_customer_str_rpt_hdl(adapter, payload, plen);
1294 		break;
1295 	case C2H_CUSTOMER_STR_RPT_2:
1296 		c2h_customer_str_rpt_2_hdl(adapter, payload, plen);
1297 		break;
1298 #endif
1299 #ifdef RTW_PER_CMD_SUPPORT_FW
1300 	case C2H_PER_RATE_RPT:
1301 		c2h_per_rate_rpt_hdl(adapter, payload, plen);
1302 		break;
1303 #endif
1304 #ifdef CONFIG_LPS_ACK
1305 	case C2H_LPS_STATUS_RPT:
1306 		c2h_lps_status_rpt(adapter, payload, plen);
1307 		break;
1308 #endif
1309 #ifdef CONFIG_FW_OFFLOAD_SET_TXPWR_IDX
1310 	case C2H_SET_TXPWR_FINISH:
1311 		c2h_txpwr_idx_offload_done(adapter, payload, plen);
1312 		break;
1313 #endif
1314 	case C2H_EXTEND:
1315 		sub_id = payload[0];
1316 		/* no handle, goto default */
1317 
1318 	default:
1319 		if (phydm_c2H_content_parsing(adapter_to_phydm(adapter), id, plen, payload) != TRUE)
1320 			ret = _FAIL;
1321 		break;
1322 	}
1323 
1324 	if (ret != _SUCCESS) {
1325 		if (id == C2H_EXTEND)
1326 			RTW_WARN("%s: unknown C2H(0x%02x, 0x%02x)\n", __func__, id, sub_id);
1327 		else
1328 			RTW_WARN("%s: unknown C2H(0x%02x)\n", __func__, id);
1329 	}
1330 
1331 	return ret;
1332 }
1333 
1334 #ifndef RTW_HALMAC
rtw_hal_c2h_handler(_adapter * adapter,u8 id,u8 seq,u8 plen,u8 * payload)1335 s32 rtw_hal_c2h_handler(_adapter *adapter, u8 id, u8 seq, u8 plen, u8 *payload)
1336 {
1337 	s32 ret = _FAIL;
1338 
1339 	ret = adapter->hal_func.c2h_handler(adapter, id, seq, plen, payload);
1340 	if (ret != _SUCCESS)
1341 		ret = c2h_handler(adapter, id, seq, plen, payload);
1342 
1343 	return ret;
1344 }
1345 
rtw_hal_c2h_id_handle_directly(_adapter * adapter,u8 id,u8 seq,u8 plen,u8 * payload)1346 s32 rtw_hal_c2h_id_handle_directly(_adapter *adapter, u8 id, u8 seq, u8 plen, u8 *payload)
1347 {
1348 	switch (id) {
1349 	case C2H_CCX_TX_RPT:
1350 	case C2H_BT_MP_INFO:
1351 	case C2H_FW_CHNL_SWITCH_COMPLETE:
1352 	case C2H_IQK_FINISH:
1353 	case C2H_MCC:
1354 	case C2H_BCN_EARLY_RPT:
1355 	case C2H_AP_REQ_TXRPT:
1356 	case C2H_SPC_STAT:
1357 	case C2H_SET_TXPWR_FINISH:
1358 		return _TRUE;
1359 	default:
1360 		return _FALSE;
1361 	}
1362 }
1363 #endif /* !RTW_HALMAC */
1364 
rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter)1365 s32 rtw_hal_is_disable_sw_channel_plan(PADAPTER padapter)
1366 {
1367 	return GET_HAL_DATA(padapter)->bDisableSWChannelPlan;
1368 }
1369 
1370 #ifdef CONFIG_PROTSEL_MACSLEEP
_rtw_hal_macid_sleep(_adapter * adapter,u8 macid,u8 sleep)1371 static s32 _rtw_hal_macid_sleep(_adapter *adapter, u8 macid, u8 sleep)
1372 {
1373 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
1374 	u16 reg_sleep_info = macid_ctl->reg_sleep_info;
1375 	u16 reg_sleep_ctrl = macid_ctl->reg_sleep_ctrl;
1376 	const u32 sel_mask_sel = BIT(0) | BIT(1) | BIT(2);
1377 	u8 bit_shift;
1378 	u32 val32;
1379 	s32 ret = _FAIL;
1380 
1381 	if (macid >= macid_ctl->num) {
1382 		RTW_ERR(ADPT_FMT" %s invalid macid(%u)\n"
1383 			, ADPT_ARG(adapter), sleep ? "sleep" : "wakeup" , macid);
1384 		goto exit;
1385 	}
1386 
1387 	if (macid < 32) {
1388 		bit_shift = macid;
1389 	#if (MACID_NUM_SW_LIMIT > 32)
1390 	} else if (macid < 64) {
1391 		bit_shift = macid - 32;
1392 	#endif
1393 	#if (MACID_NUM_SW_LIMIT > 64)
1394 	} else if (macid < 96) {
1395 		bit_shift = macid - 64;
1396 	#endif
1397 	#if (MACID_NUM_SW_LIMIT > 96)
1398 	} else if (macid < 128) {
1399 		bit_shift = macid - 96;
1400 	#endif
1401 	} else {
1402 		rtw_warn_on(1);
1403 		goto exit;
1404 	}
1405 
1406 	if (!reg_sleep_ctrl || !reg_sleep_info) {
1407 		rtw_warn_on(1);
1408 		goto exit;
1409 	}
1410 
1411 	val32 = rtw_read32(adapter, reg_sleep_ctrl);
1412 	val32 = (val32 &~sel_mask_sel) | ((macid / 32) & sel_mask_sel);
1413 	rtw_write32(adapter, reg_sleep_ctrl, val32);
1414 
1415 	val32 = rtw_read32(adapter, reg_sleep_info);
1416 	RTW_INFO(ADPT_FMT" %s macid=%d, ori reg_0x%03x=0x%08x\n"
1417 		, ADPT_ARG(adapter), sleep ? "sleep" : "wakeup"
1418 		, macid, reg_sleep_info, val32);
1419 
1420 	ret = _SUCCESS;
1421 
1422 	if (sleep) {
1423 		if (val32 & BIT(bit_shift))
1424 			goto exit;
1425 		val32 |= BIT(bit_shift);
1426 	} else {
1427 		if (!(val32 & BIT(bit_shift)))
1428 			goto exit;
1429 		val32 &= ~BIT(bit_shift);
1430 	}
1431 
1432 	rtw_write32(adapter, reg_sleep_info, val32);
1433 
1434 exit:
1435 	return ret;
1436 }
1437 #else
_rtw_hal_macid_sleep(_adapter * adapter,u8 macid,u8 sleep)1438 static s32 _rtw_hal_macid_sleep(_adapter *adapter, u8 macid, u8 sleep)
1439 {
1440 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
1441 	u16 reg_sleep;
1442 	u8 bit_shift;
1443 	u32 val32;
1444 	s32 ret = _FAIL;
1445 
1446 	if (macid >= macid_ctl->num) {
1447 		RTW_ERR(ADPT_FMT" %s invalid macid(%u)\n"
1448 			, ADPT_ARG(adapter), sleep ? "sleep" : "wakeup" , macid);
1449 		goto exit;
1450 	}
1451 
1452 	if (macid < 32) {
1453 		reg_sleep = macid_ctl->reg_sleep_m0;
1454 		bit_shift = macid;
1455 	#if (MACID_NUM_SW_LIMIT > 32)
1456 	} else if (macid < 64) {
1457 		reg_sleep = macid_ctl->reg_sleep_m1;
1458 		bit_shift = macid - 32;
1459 	#endif
1460 	#if (MACID_NUM_SW_LIMIT > 64)
1461 	} else if (macid < 96) {
1462 		reg_sleep = macid_ctl->reg_sleep_m2;
1463 		bit_shift = macid - 64;
1464 	#endif
1465 	#if (MACID_NUM_SW_LIMIT > 96)
1466 	} else if (macid < 128) {
1467 		reg_sleep = macid_ctl->reg_sleep_m3;
1468 		bit_shift = macid - 96;
1469 	#endif
1470 	} else {
1471 		rtw_warn_on(1);
1472 		goto exit;
1473 	}
1474 
1475 	if (!reg_sleep) {
1476 		rtw_warn_on(1);
1477 		goto exit;
1478 	}
1479 
1480 	val32 = rtw_read32(adapter, reg_sleep);
1481 	RTW_INFO(ADPT_FMT" %s macid=%d, ori reg_0x%03x=0x%08x\n"
1482 		, ADPT_ARG(adapter), sleep ? "sleep" : "wakeup"
1483 		, macid, reg_sleep, val32);
1484 
1485 	ret = _SUCCESS;
1486 
1487 	if (sleep) {
1488 		if (val32 & BIT(bit_shift))
1489 			goto exit;
1490 		val32 |= BIT(bit_shift);
1491 	} else {
1492 		if (!(val32 & BIT(bit_shift)))
1493 			goto exit;
1494 		val32 &= ~BIT(bit_shift);
1495 	}
1496 
1497 	rtw_write32(adapter, reg_sleep, val32);
1498 
1499 exit:
1500 	return ret;
1501 }
1502 #endif
1503 
rtw_hal_macid_sleep(_adapter * adapter,u8 macid)1504 inline s32 rtw_hal_macid_sleep(_adapter *adapter, u8 macid)
1505 {
1506 	return _rtw_hal_macid_sleep(adapter, macid, 1);
1507 }
1508 
rtw_hal_macid_wakeup(_adapter * adapter,u8 macid)1509 inline s32 rtw_hal_macid_wakeup(_adapter *adapter, u8 macid)
1510 {
1511 	return _rtw_hal_macid_sleep(adapter, macid, 0);
1512 }
1513 
1514 #ifdef CONFIG_PROTSEL_MACSLEEP
_rtw_hal_macid_bmp_sleep(_adapter * adapter,struct macid_bmp * bmp,u8 sleep)1515 static s32 _rtw_hal_macid_bmp_sleep(_adapter *adapter, struct macid_bmp *bmp, u8 sleep)
1516 {
1517 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
1518 	u16 reg_sleep_info = macid_ctl->reg_sleep_info;
1519 	u16 reg_sleep_ctrl = macid_ctl->reg_sleep_ctrl;
1520 	const u32 sel_mask_sel = BIT(0) | BIT(1) | BIT(2);
1521 	u32 m;
1522 	u8 mid = 0;
1523 	u32 val32;
1524 
1525 	do {
1526 		if (mid == 0) {
1527 			m = bmp->m0;
1528 		#if (MACID_NUM_SW_LIMIT > 32)
1529 		} else if (mid == 1) {
1530 			m = bmp->m1;
1531 		#endif
1532 		#if (MACID_NUM_SW_LIMIT > 64)
1533 		} else if (mid == 2) {
1534 			m = bmp->m2;
1535 		#endif
1536 		#if (MACID_NUM_SW_LIMIT > 96)
1537 		} else if (mid == 3) {
1538 			m = bmp->m3;
1539 		#endif
1540 		} else {
1541 			rtw_warn_on(1);
1542 			break;
1543 		}
1544 
1545 		if (m == 0)
1546 			goto move_next;
1547 
1548 		if (!reg_sleep_ctrl || !reg_sleep_info) {
1549 			rtw_warn_on(1);
1550 			break;
1551 		}
1552 
1553 		val32 = rtw_read32(adapter, reg_sleep_ctrl);
1554 		val32 = (val32 &~sel_mask_sel) | (mid & sel_mask_sel);
1555 		rtw_write32(adapter, reg_sleep_ctrl, val32);
1556 
1557 		val32 = rtw_read32(adapter, reg_sleep_info);
1558 		RTW_INFO(ADPT_FMT" %s m%u=0x%08x, ori reg_0x%03x=0x%08x\n"
1559 			, ADPT_ARG(adapter), sleep ? "sleep" : "wakeup"
1560 			, mid, m, reg_sleep_info, val32);
1561 
1562 		if (sleep) {
1563 			if ((val32 & m) == m)
1564 				goto move_next;
1565 			val32 |= m;
1566 		} else {
1567 			if ((val32 & m) == 0)
1568 				goto move_next;
1569 			val32 &= ~m;
1570 		}
1571 
1572 		rtw_write32(adapter, reg_sleep_info, val32);
1573 
1574 move_next:
1575 		mid++;
1576 	} while (mid * 32 < MACID_NUM_SW_LIMIT);
1577 
1578 	return _SUCCESS;
1579 }
1580 #else
_rtw_hal_macid_bmp_sleep(_adapter * adapter,struct macid_bmp * bmp,u8 sleep)1581 static s32 _rtw_hal_macid_bmp_sleep(_adapter *adapter, struct macid_bmp *bmp, u8 sleep)
1582 {
1583 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
1584 	u16 reg_sleep;
1585 	u32 m;
1586 	u8 mid = 0;
1587 	u32 val32;
1588 
1589 	do {
1590 		if (mid == 0) {
1591 			m = bmp->m0;
1592 			reg_sleep = macid_ctl->reg_sleep_m0;
1593 		#if (MACID_NUM_SW_LIMIT > 32)
1594 		} else if (mid == 1) {
1595 			m = bmp->m1;
1596 			reg_sleep = macid_ctl->reg_sleep_m1;
1597 		#endif
1598 		#if (MACID_NUM_SW_LIMIT > 64)
1599 		} else if (mid == 2) {
1600 			m = bmp->m2;
1601 			reg_sleep = macid_ctl->reg_sleep_m2;
1602 		#endif
1603 		#if (MACID_NUM_SW_LIMIT > 96)
1604 		} else if (mid == 3) {
1605 			m = bmp->m3;
1606 			reg_sleep = macid_ctl->reg_sleep_m3;
1607 		#endif
1608 		} else {
1609 			rtw_warn_on(1);
1610 			break;
1611 		}
1612 
1613 		if (m == 0)
1614 			goto move_next;
1615 
1616 		if (!reg_sleep) {
1617 			rtw_warn_on(1);
1618 			break;
1619 		}
1620 
1621 		val32 = rtw_read32(adapter, reg_sleep);
1622 		RTW_INFO(ADPT_FMT" %s m%u=0x%08x, ori reg_0x%03x=0x%08x\n"
1623 			, ADPT_ARG(adapter), sleep ? "sleep" : "wakeup"
1624 			, mid, m, reg_sleep, val32);
1625 
1626 		if (sleep) {
1627 			if ((val32 & m) == m)
1628 				goto move_next;
1629 			val32 |= m;
1630 		} else {
1631 			if ((val32 & m) == 0)
1632 				goto move_next;
1633 			val32 &= ~m;
1634 		}
1635 
1636 		rtw_write32(adapter, reg_sleep, val32);
1637 
1638 move_next:
1639 		mid++;
1640 	} while (mid * 32 < MACID_NUM_SW_LIMIT);
1641 
1642 	return _SUCCESS;
1643 }
1644 #endif
1645 
rtw_hal_macid_sleep_all_used(_adapter * adapter)1646 inline s32 rtw_hal_macid_sleep_all_used(_adapter *adapter)
1647 {
1648 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
1649 
1650 	return _rtw_hal_macid_bmp_sleep(adapter, &macid_ctl->used, 1);
1651 }
1652 
rtw_hal_macid_wakeup_all_used(_adapter * adapter)1653 inline s32 rtw_hal_macid_wakeup_all_used(_adapter *adapter)
1654 {
1655 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
1656 
1657 	return _rtw_hal_macid_bmp_sleep(adapter, &macid_ctl->used, 0);
1658 }
_rtw_hal_macid_drop(_adapter * adapter,u8 macid,u8 drop)1659 static s32 _rtw_hal_macid_drop(_adapter *adapter, u8 macid, u8 drop)
1660 {
1661 	struct macid_ctl_t *macid_ctl = adapter_to_macidctl(adapter);
1662 #ifndef CONFIG_PROTSEL_MACSLEEP
1663 	u16 reg_drop = 0;
1664 #else
1665 	u16 reg_drop_info = macid_ctl->reg_drop_info;
1666 	u16 reg_drop_ctrl = macid_ctl->reg_drop_ctrl;
1667 	const u32 sel_mask_sel = BIT(0) | BIT(1) | BIT(2);
1668 #endif /* CONFIG_PROTSEL_MACSLEEP */
1669 	u8 bit_shift;
1670 	u32 val32;
1671 	s32 ret = _FAIL;
1672 /* some IC doesn't have this register */
1673 #ifndef REG_PKT_BUFF_ACCESS_CTRL
1674 #define REG_PKT_BUFF_ACCESS_CTRL 0
1675 #endif
1676 
1677 	if (macid >= macid_ctl->num) {
1678 		RTW_ERR(ADPT_FMT" %s invalid macid(%u)\n"
1679 			, ADPT_ARG(adapter), drop ? "drop" : "undrop" , macid);
1680 		goto exit;
1681 	}
1682 
1683 	if(_rtw_macid_ctl_chk_cap(adapter, MACID_DROP)) {
1684 		if (macid < 32) {
1685 #ifndef CONFIG_PROTSEL_MACSLEEP
1686 			reg_drop = macid_ctl->reg_drop_m0;
1687 #endif /* CONFIG_PROTSEL_MACSLEEP */
1688 			bit_shift = macid;
1689 		#if (MACID_NUM_SW_LIMIT > 32)
1690 		} else if (macid < 64) {
1691 #ifndef CONFIG_PROTSEL_MACSLEEP
1692 			reg_drop = macid_ctl->reg_drop_m1;
1693 #endif /* CONFIG_PROTSEL_MACSLEEP */
1694 			bit_shift = macid - 32;
1695 		#endif
1696 		#if (MACID_NUM_SW_LIMIT > 64)
1697 		} else if (macid < 96) {
1698 #ifndef CONFIG_PROTSEL_MACSLEEP
1699 			reg_drop = macid_ctl->reg_drop_m2;
1700 #endif /* CONFIG_PROTSEL_MACSLEEP */
1701 			bit_shift = macid - 64;
1702 		#endif
1703 		#if (MACID_NUM_SW_LIMIT > 96)
1704 		} else if (macid < 128) {
1705 #ifndef CONFIG_PROTSEL_MACSLEEP
1706 			reg_drop = macid_ctl->reg_drop_m3;
1707 #endif /* CONFIG_PROTSEL_MACSLEEP */
1708 			bit_shift = macid - 96;
1709 		#endif
1710 		} else {
1711 			rtw_warn_on(1);
1712 			goto exit;
1713 		}
1714 
1715 #ifndef CONFIG_PROTSEL_MACSLEEP
1716 		if (!reg_drop) {
1717 			rtw_warn_on(1);
1718 			goto exit;
1719 		}
1720 		val32 = rtw_read32(adapter, reg_drop);
1721 		/*RTW_INFO(ADPT_FMT" %s macid=%d, ori reg_0x%03x=0x%08x \n"
1722 			, ADPT_ARG(adapter), drop ? "drop" : "undrop"
1723 			, macid, reg_drop, val32);*/
1724 #else
1725 		if (!reg_drop_ctrl || !reg_drop_info) {
1726 			rtw_warn_on(1);
1727 			goto exit;
1728 		}
1729 
1730 		val32 = rtw_read32(adapter, reg_drop_ctrl);
1731 		val32 = (val32 &~sel_mask_sel) | ((macid / 32) & sel_mask_sel);
1732 		rtw_write32(adapter, reg_drop_ctrl, val32);
1733 
1734 		val32 = rtw_read32(adapter, reg_drop_info);
1735 		/*RTW_INFO(ADPT_FMT" %s macid=%d, ori reg_0x%03x=0x%08x\n"
1736 			, ADPT_ARG(adapter), drop ? "drop" : "undrop"
1737 			, macid, reg_drop_info, val32);*/
1738 #endif /* CONFIG_PROTSEL_MACSLEEP */
1739 		ret = _SUCCESS;
1740 
1741 		if (drop) {
1742 			if (val32 & BIT(bit_shift))
1743 				goto exit;
1744 			val32 |= BIT(bit_shift);
1745 		} else {
1746 			if (!(val32 & BIT(bit_shift)))
1747 				goto exit;
1748 			val32 &= ~BIT(bit_shift);
1749 		}
1750 
1751 #ifndef CONFIG_PROTSEL_MACSLEEP
1752 		rtw_write32(adapter, reg_drop, val32);
1753 		RTW_INFO(ADPT_FMT" %s macid=%d, done reg_0x%03x=0x%08x\n"
1754 			, ADPT_ARG(adapter), drop ? "drop" : "undrop"
1755 			, macid, reg_drop, val32);
1756 #else
1757 		rtw_write32(adapter, reg_drop_info, val32);
1758 		RTW_INFO(ADPT_FMT" %s macid=%d, done reg_0x%03x=0x%08x\n"
1759 			, ADPT_ARG(adapter), drop ? "drop" : "undrop"
1760 			, macid, reg_drop_info, val32);
1761 #endif /* CONFIG_PROTSEL_MACSLEEP */
1762 
1763 
1764 	} else if(_rtw_macid_ctl_chk_cap(adapter, MACID_DROP_INDIRECT)) {
1765 		u16 start_addr = macid_ctl->macid_txrpt/8;
1766 		u32 txrpt_h4b = 0;
1767 		u8 i;
1768 
1769 		/* each address means 1 byte */
1770 		start_addr += macid*(macid_ctl->macid_txrpt_pgsz/8);
1771 		/* select tx report buffer */
1772 		rtw_write8(adapter, REG_PKT_BUFF_ACCESS_CTRL, TXREPORT_BUF_SELECT);
1773 		/* set tx report buffer start address for reading */
1774 		rtw_write32(adapter, REG_PKTBUF_DBG_CTRL, start_addr);
1775 		txrpt_h4b = rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H);
1776 		/* OFFSET5 BIT2 is BIT10 of high 4 bytes */
1777 		if (drop) {
1778 			if (txrpt_h4b & BIT(10))
1779 				goto exit;
1780 			txrpt_h4b |= BIT(10);
1781 		} else {
1782 			if (!(txrpt_h4b & BIT(10)))
1783 				goto exit;
1784 			txrpt_h4b &= ~BIT(10);
1785 		}
1786 		/* set to macid drop field */
1787 		rtw_write32(adapter, REG_PKTBUF_DBG_DATA_H, txrpt_h4b);
1788 		/* 0x20800000 only write BIT10 of tx report buf */
1789 		rtw_write32(adapter, REG_PKTBUF_DBG_CTRL, 0x20800000 | start_addr);
1790 #if 0 /* some ICs doesn't clear the write done bit */
1791 		/* checking TX queue status */
1792 		for (i = 0 ; i < 50 ; i++) {
1793 			txrpt_h4b = rtw_read32(adapter, REG_PKTBUF_DBG_CTRL);
1794 			if (txrpt_h4b & BIT(23)) {
1795 				RTW_INFO("%s: wait to write TX RTP buf (%d)!\n", __func__, i);
1796 				rtw_mdelay_os(10);
1797 			} else {
1798 				RTW_INFO("%s: wait to write TX RTP buf done (%d)!\n", __func__, i);
1799 				break;
1800 			}
1801 		}
1802 #endif
1803 		rtw_write32(adapter, REG_PKTBUF_DBG_CTRL, start_addr);
1804 		RTW_INFO("start_addr=%x, data_H:%08x, data_L:%08x, macid=%d, txrpt_h4b=%x\n", start_addr
1805 		,rtw_read32(adapter, REG_PKTBUF_DBG_DATA_H), rtw_read32(adapter, REG_PKTBUF_DBG_DATA_L), macid, txrpt_h4b);
1806 	} else {
1807 		RTW_INFO("There is no definition for camctl cap , please correct it\n");
1808 	}
1809 exit:
1810 	return ret;
1811 }
1812 
rtw_hal_macid_drop(_adapter * adapter,u8 macid)1813 inline s32 rtw_hal_macid_drop(_adapter *adapter, u8 macid)
1814 {
1815 	return _rtw_hal_macid_drop(adapter, macid, 1);
1816 }
1817 
rtw_hal_macid_undrop(_adapter * adapter,u8 macid)1818 inline s32 rtw_hal_macid_undrop(_adapter *adapter, u8 macid)
1819 {
1820 	return _rtw_hal_macid_drop(adapter, macid, 0);
1821 }
1822 
1823 
rtw_hal_fill_h2c_cmd(PADAPTER padapter,u8 ElementID,u32 CmdLen,u8 * pCmdBuffer)1824 s32 rtw_hal_fill_h2c_cmd(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer)
1825 {
1826 	_adapter *pri_adapter = GET_PRIMARY_ADAPTER(padapter);
1827 
1828 	if (GET_HAL_DATA(pri_adapter)->bFWReady == _TRUE)
1829 		return padapter->hal_func.fill_h2c_cmd(padapter, ElementID, CmdLen, pCmdBuffer);
1830 	else if (padapter->registrypriv.mp_mode == 0)
1831 		RTW_PRINT(FUNC_ADPT_FMT" FW doesn't exit when no MP mode, by pass H2C id:0x%02x\n"
1832 			  , FUNC_ADPT_ARG(padapter), ElementID);
1833 	return _FAIL;
1834 }
1835 
rtw_hal_fill_fake_txdesc(_adapter * padapter,u8 * pDesc,u32 BufferLen,u8 IsPsPoll,u8 IsBTQosNull,u8 bDataFrame)1836 void rtw_hal_fill_fake_txdesc(_adapter *padapter, u8 *pDesc, u32 BufferLen,
1837 			      u8 IsPsPoll, u8 IsBTQosNull, u8 bDataFrame)
1838 {
1839 	padapter->hal_func.fill_fake_txdesc(padapter, pDesc, BufferLen, IsPsPoll, IsBTQosNull, bDataFrame);
1840 
1841 }
1842 
rtw_hal_get_txbuff_rsvd_page_num(_adapter * adapter,bool wowlan)1843 u8 rtw_hal_get_txbuff_rsvd_page_num(_adapter *adapter, bool wowlan)
1844 {
1845 	u8 num = 0;
1846 
1847 
1848 	if (adapter->hal_func.hal_get_tx_buff_rsvd_page_num) {
1849 		num = adapter->hal_func.hal_get_tx_buff_rsvd_page_num(adapter, wowlan);
1850 	} else {
1851 #ifdef RTW_HALMAC
1852 		num = GET_HAL_DATA(adapter)->drv_rsvd_page_number;
1853 #endif /* RTW_HALMAC */
1854 	}
1855 
1856 	return num;
1857 }
1858 
1859 #ifdef CONFIG_GPIO_API
rtw_hal_update_hisr_hsisr_ind(_adapter * padapter,u32 flag)1860 void rtw_hal_update_hisr_hsisr_ind(_adapter *padapter, u32 flag)
1861 {
1862 	if (padapter->hal_func.update_hisr_hsisr_ind)
1863 		padapter->hal_func.update_hisr_hsisr_ind(padapter, flag);
1864 }
1865 
rtw_hal_gpio_func_check(_adapter * padapter,u8 gpio_num)1866 int rtw_hal_gpio_func_check(_adapter *padapter, u8 gpio_num)
1867 {
1868 	int ret = _SUCCESS;
1869 
1870 	if (padapter->hal_func.hal_gpio_func_check)
1871 		ret = padapter->hal_func.hal_gpio_func_check(padapter, gpio_num);
1872 
1873 	return ret;
1874 }
1875 
rtw_hal_gpio_multi_func_reset(_adapter * padapter,u8 gpio_num)1876 void rtw_hal_gpio_multi_func_reset(_adapter *padapter, u8 gpio_num)
1877 {
1878 	if (padapter->hal_func.hal_gpio_multi_func_reset)
1879 		padapter->hal_func.hal_gpio_multi_func_reset(padapter, gpio_num);
1880 }
1881 #endif
1882 
1883 #ifdef CONFIG_FW_CORRECT_BCN
rtw_hal_fw_correct_bcn(_adapter * padapter)1884 void rtw_hal_fw_correct_bcn(_adapter *padapter)
1885 {
1886 	if (padapter->hal_func.fw_correct_bcn)
1887 		padapter->hal_func.fw_correct_bcn(padapter);
1888 }
1889 #endif
1890 
rtw_hal_set_tx_power_level(_adapter * adapter,u8 channel)1891 void rtw_hal_set_tx_power_level(_adapter *adapter, u8 channel)
1892 {
1893 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1894 
1895 	if (phy_chk_ch_setting_consistency(adapter, channel) != _SUCCESS)
1896 		return;
1897 
1898 	hal_data->set_entire_txpwr = 1;
1899 
1900 	adapter->hal_func.set_tx_power_level_handler(adapter, channel);
1901 	rtw_hal_set_txpwr_done(adapter);
1902 
1903 	hal_data->set_entire_txpwr = 0;
1904 }
1905 
rtw_hal_update_txpwr_level(_adapter * adapter)1906 void rtw_hal_update_txpwr_level(_adapter *adapter)
1907 {
1908 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
1909 
1910 	rtw_hal_set_tx_power_level(adapter, hal_data->current_channel);
1911 }
1912 
rtw_hal_set_txpwr_done(_adapter * adapter)1913 void rtw_hal_set_txpwr_done(_adapter *adapter)
1914 {
1915 	if (adapter->hal_func.set_txpwr_done)
1916 		adapter->hal_func.set_txpwr_done(adapter);
1917 }
1918 
rtw_hal_set_tx_power_index(_adapter * adapter,u32 powerindex,enum rf_path rfpath,u8 rate)1919 void rtw_hal_set_tx_power_index(_adapter *adapter, u32 powerindex
1920 	, enum rf_path rfpath, u8 rate)
1921 {
1922 	adapter->hal_func.set_tx_power_index_handler(adapter, powerindex, rfpath, rate);
1923 }
1924 
rtw_hal_get_tx_power_index(_adapter * adapter,enum rf_path rfpath,RATE_SECTION rs,enum MGN_RATE rate,enum channel_width bw,BAND_TYPE band,u8 cch,u8 opch,struct txpwr_idx_comp * tic)1925 u8 rtw_hal_get_tx_power_index(_adapter *adapter, enum rf_path rfpath
1926 	, RATE_SECTION rs, enum MGN_RATE rate, enum channel_width bw, BAND_TYPE band, u8 cch, u8 opch
1927 	, struct txpwr_idx_comp *tic)
1928 {
1929 	return adapter->hal_func.get_tx_power_index_handler(adapter, rfpath
1930 		, rs, rate, bw, band, cch, opch, tic);
1931 }
1932 
rtw_hal_get_txpwr_target_extra_bias(_adapter * adapter,enum rf_path rfpath,RATE_SECTION rs,enum MGN_RATE rate,enum channel_width bw,BAND_TYPE band,u8 cch)1933 s8 rtw_hal_get_txpwr_target_extra_bias(_adapter *adapter, enum rf_path rfpath
1934 	, RATE_SECTION rs, enum MGN_RATE rate, enum channel_width bw, BAND_TYPE band, u8 cch)
1935 {
1936 	s8 val = 0;
1937 
1938 	if (adapter->hal_func.get_txpwr_target_extra_bias) {
1939 		val = adapter->hal_func.get_txpwr_target_extra_bias(adapter
1940 				, rfpath, rs, rate, bw, band, cch);
1941 	}
1942 
1943 	return val;
1944 }
1945 
1946 #ifdef RTW_HALMAC
1947 /*
1948  * Description:
1949  *	Initialize MAC registers
1950  *
1951  * Return:
1952  *	_TRUE	success
1953  *	_FALSE	fail
1954  */
rtw_hal_init_mac_register(PADAPTER adapter)1955 u8 rtw_hal_init_mac_register(PADAPTER adapter)
1956 {
1957 	return adapter->hal_func.init_mac_register(adapter);
1958 }
1959 
1960 /*
1961  * Description:
1962  *	Initialize PHY(BB/RF) related functions
1963  *
1964  * Return:
1965  *	_TRUE	success
1966  *	_FALSE	fail
1967  */
rtw_hal_init_phy(PADAPTER adapter)1968 u8 rtw_hal_init_phy(PADAPTER adapter)
1969 {
1970 	return adapter->hal_func.init_phy(adapter);
1971 }
1972 #endif /* RTW_HALMAC */
1973 
1974 #ifdef CONFIG_RFKILL_POLL
rtw_hal_rfkill_poll(_adapter * adapter,u8 * valid)1975 bool rtw_hal_rfkill_poll(_adapter *adapter, u8 *valid)
1976 {
1977 	bool ret;
1978 
1979 	if (adapter->hal_func.hal_radio_onoff_check)
1980 		ret = adapter->hal_func.hal_radio_onoff_check(adapter, valid);
1981 	else {
1982 		*valid = 0;
1983 		ret = _FALSE;
1984 	}
1985 	return ret;
1986 }
1987 #endif
1988 
1989 #define rtw_hal_error_msg(ops_fun)		\
1990 	RTW_PRINT("### %s - Error : Please hook hal_func.%s ###\n", __FUNCTION__, ops_fun)
1991 
rtw_hal_ops_check(_adapter * padapter)1992 u8 rtw_hal_ops_check(_adapter *padapter)
1993 {
1994 	u8 ret = _SUCCESS;
1995 #if 1
1996 	/*** initialize section ***/
1997 	if (NULL == padapter->hal_func.read_chip_version) {
1998 		rtw_hal_error_msg("read_chip_version");
1999 		ret = _FAIL;
2000 	}
2001 	if (NULL == padapter->hal_func.init_default_value) {
2002 		rtw_hal_error_msg("init_default_value");
2003 		ret = _FAIL;
2004 	}
2005 	if (NULL == padapter->hal_func.intf_chip_configure) {
2006 		rtw_hal_error_msg("intf_chip_configure");
2007 		ret = _FAIL;
2008 	}
2009 	if (NULL == padapter->hal_func.read_adapter_info) {
2010 		rtw_hal_error_msg("read_adapter_info");
2011 		ret = _FAIL;
2012 	}
2013 
2014 	if (NULL == padapter->hal_func.hal_power_on) {
2015 		rtw_hal_error_msg("hal_power_on");
2016 		ret = _FAIL;
2017 	}
2018 	if (NULL == padapter->hal_func.hal_power_off) {
2019 		rtw_hal_error_msg("hal_power_off");
2020 		ret = _FAIL;
2021 	}
2022 
2023 	if (NULL == padapter->hal_func.hal_init) {
2024 		rtw_hal_error_msg("hal_init");
2025 		ret = _FAIL;
2026 	}
2027 	if (NULL == padapter->hal_func.hal_deinit) {
2028 		rtw_hal_error_msg("hal_deinit");
2029 		ret = _FAIL;
2030 	}
2031 
2032 	/*** xmit section ***/
2033 	if (NULL == padapter->hal_func.init_xmit_priv) {
2034 		rtw_hal_error_msg("init_xmit_priv");
2035 		ret = _FAIL;
2036 	}
2037 	if (NULL == padapter->hal_func.free_xmit_priv) {
2038 		rtw_hal_error_msg("free_xmit_priv");
2039 		ret = _FAIL;
2040 	}
2041 	if (NULL == padapter->hal_func.hal_xmit) {
2042 		rtw_hal_error_msg("hal_xmit");
2043 		ret = _FAIL;
2044 	}
2045 	if (NULL == padapter->hal_func.mgnt_xmit) {
2046 		rtw_hal_error_msg("mgnt_xmit");
2047 		ret = _FAIL;
2048 	}
2049 #ifdef CONFIG_XMIT_THREAD_MODE
2050 	if (NULL == padapter->hal_func.xmit_thread_handler) {
2051 		rtw_hal_error_msg("xmit_thread_handler");
2052 		ret = _FAIL;
2053 	}
2054 #endif
2055 	if (NULL == padapter->hal_func.hal_xmitframe_enqueue) {
2056 		rtw_hal_error_msg("hal_xmitframe_enqueue");
2057 		ret = _FAIL;
2058 	}
2059 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2060 #ifndef CONFIG_SDIO_TX_TASKLET
2061 	if (NULL == padapter->hal_func.run_thread) {
2062 		rtw_hal_error_msg("run_thread");
2063 		ret = _FAIL;
2064 	}
2065 	if (NULL == padapter->hal_func.cancel_thread) {
2066 		rtw_hal_error_msg("cancel_thread");
2067 		ret = _FAIL;
2068 	}
2069 #endif
2070 #endif
2071 
2072 	/*** recv section ***/
2073 	if (NULL == padapter->hal_func.init_recv_priv) {
2074 		rtw_hal_error_msg("init_recv_priv");
2075 		ret = _FAIL;
2076 	}
2077 	if (NULL == padapter->hal_func.free_recv_priv) {
2078 		rtw_hal_error_msg("free_recv_priv");
2079 		ret = _FAIL;
2080 	}
2081 #ifdef CONFIG_RECV_THREAD_MODE
2082 	if (NULL == padapter->hal_func.recv_hdl) {
2083 		rtw_hal_error_msg("recv_hdl");
2084 		ret = _FAIL;
2085 	}
2086 #endif
2087 #if defined(CONFIG_USB_HCI) || defined(CONFIG_PCI_HCI)
2088 	if (NULL == padapter->hal_func.inirp_init) {
2089 		rtw_hal_error_msg("inirp_init");
2090 		ret = _FAIL;
2091 	}
2092 	if (NULL == padapter->hal_func.inirp_deinit) {
2093 		rtw_hal_error_msg("inirp_deinit");
2094 		ret = _FAIL;
2095 	}
2096 #endif /* #if defined(CONFIG_USB_HCI) || defined (CONFIG_PCI_HCI) */
2097 
2098 
2099 	/*** interrupt hdl section ***/
2100 #if defined(CONFIG_PCI_HCI)
2101 	if (NULL == padapter->hal_func.irp_reset) {
2102 		rtw_hal_error_msg("irp_reset");
2103 		ret = _FAIL;
2104 	}
2105 #endif/*#if defined(CONFIG_PCI_HCI)*/
2106 #if (defined(CONFIG_PCI_HCI)) || (defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT))
2107 	if (NULL == padapter->hal_func.interrupt_handler) {
2108 		rtw_hal_error_msg("interrupt_handler");
2109 		ret = _FAIL;
2110 	}
2111 #endif /*#if (defined(CONFIG_PCI_HCI)) || (defined(CONFIG_USB_HCI) && defined(CONFIG_SUPPORT_USB_INT))*/
2112 
2113 #if defined(CONFIG_PCI_HCI) || defined(CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI)
2114 	if (NULL == padapter->hal_func.enable_interrupt) {
2115 		rtw_hal_error_msg("enable_interrupt");
2116 		ret = _FAIL;
2117 	}
2118 	if (NULL == padapter->hal_func.disable_interrupt) {
2119 		rtw_hal_error_msg("disable_interrupt");
2120 		ret = _FAIL;
2121 	}
2122 #endif /* defined(CONFIG_PCI_HCI) || defined (CONFIG_SDIO_HCI) || defined (CONFIG_GSPI_HCI) */
2123 
2124 
2125 	/*** DM section ***/
2126 	if (NULL == padapter->hal_func.dm_init) {
2127 		rtw_hal_error_msg("dm_init");
2128 		ret = _FAIL;
2129 	}
2130 	if (NULL == padapter->hal_func.dm_deinit) {
2131 		rtw_hal_error_msg("dm_deinit");
2132 		ret = _FAIL;
2133 	}
2134 	if (NULL == padapter->hal_func.hal_dm_watchdog) {
2135 		rtw_hal_error_msg("hal_dm_watchdog");
2136 		ret = _FAIL;
2137 	}
2138 
2139 	/*** xxx section ***/
2140 	if (NULL == padapter->hal_func.set_chnl_bw_handler) {
2141 		rtw_hal_error_msg("set_chnl_bw_handler");
2142 		ret = _FAIL;
2143 	}
2144 
2145 	if (NULL == padapter->hal_func.set_hw_reg_handler) {
2146 		rtw_hal_error_msg("set_hw_reg_handler");
2147 		ret = _FAIL;
2148 	}
2149 	if (NULL == padapter->hal_func.GetHwRegHandler) {
2150 		rtw_hal_error_msg("GetHwRegHandler");
2151 		ret = _FAIL;
2152 	}
2153 	if (NULL == padapter->hal_func.get_hal_def_var_handler) {
2154 		rtw_hal_error_msg("get_hal_def_var_handler");
2155 		ret = _FAIL;
2156 	}
2157 	if (NULL == padapter->hal_func.SetHalDefVarHandler) {
2158 		rtw_hal_error_msg("SetHalDefVarHandler");
2159 		ret = _FAIL;
2160 	}
2161 	if (NULL == padapter->hal_func.GetHalODMVarHandler) {
2162 		rtw_hal_error_msg("GetHalODMVarHandler");
2163 		ret = _FAIL;
2164 	}
2165 	if (NULL == padapter->hal_func.SetHalODMVarHandler) {
2166 		rtw_hal_error_msg("SetHalODMVarHandler");
2167 		ret = _FAIL;
2168 	}
2169 
2170 	if (NULL == padapter->hal_func.SetBeaconRelatedRegistersHandler) {
2171 		rtw_hal_error_msg("SetBeaconRelatedRegistersHandler");
2172 		ret = _FAIL;
2173 	}
2174 
2175 	if (NULL == padapter->hal_func.fill_h2c_cmd) {
2176 		rtw_hal_error_msg("fill_h2c_cmd");
2177 		ret = _FAIL;
2178 	}
2179 
2180 #ifdef RTW_HALMAC
2181 	if (NULL == padapter->hal_func.hal_mac_c2h_handler) {
2182 		rtw_hal_error_msg("hal_mac_c2h_handler");
2183 		ret = _FAIL;
2184 	}
2185 #elif !defined(CONFIG_RTL8188E)
2186 	if (NULL == padapter->hal_func.c2h_handler) {
2187 		rtw_hal_error_msg("c2h_handler");
2188 		ret = _FAIL;
2189 	}
2190 #endif
2191 
2192 #if defined(CONFIG_LPS) || defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
2193 	if (NULL == padapter->hal_func.fill_fake_txdesc) {
2194 		rtw_hal_error_msg("fill_fake_txdesc");
2195 		ret = _FAIL;
2196 	}
2197 #endif
2198 
2199 #ifndef RTW_HALMAC
2200 	if (NULL == padapter->hal_func.hal_get_tx_buff_rsvd_page_num) {
2201 		rtw_hal_error_msg("hal_get_tx_buff_rsvd_page_num");
2202 		ret = _FAIL;
2203 	}
2204 #endif /* !RTW_HALMAC */
2205 
2206 #if defined(CONFIG_WOWLAN) || defined(CONFIG_AP_WOWLAN)
2207 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2208 	if (NULL == padapter->hal_func.clear_interrupt) {
2209 		rtw_hal_error_msg("clear_interrupt");
2210 		ret = _FAIL;
2211 	}
2212 #endif
2213 #endif /* CONFIG_WOWLAN */
2214 
2215 	if (NULL == padapter->hal_func.fw_dl) {
2216 		rtw_hal_error_msg("fw_dl");
2217 		ret = _FAIL;
2218 	}
2219 
2220 	#ifdef CONFIG_FW_CORRECT_BCN
2221 	if (IS_HARDWARE_TYPE_8814A(padapter)
2222 	    && NULL == padapter->hal_func.fw_correct_bcn) {
2223 		rtw_hal_error_msg("fw_correct_bcn");
2224 		ret = _FAIL;
2225 	}
2226 	#endif
2227 
2228 	if (!padapter->hal_func.set_tx_power_level_handler) {
2229 		rtw_hal_error_msg("set_tx_power_level_handler");
2230 		ret = _FAIL;
2231 	}
2232 	if (!padapter->hal_func.set_tx_power_index_handler) {
2233 		rtw_hal_error_msg("set_tx_power_index_handler");
2234 		ret = _FAIL;
2235 	}
2236 	if (!padapter->hal_func.get_tx_power_index_handler) {
2237 		rtw_hal_error_msg("get_tx_power_index_handler");
2238 		ret = _FAIL;
2239 	}
2240 
2241 	/*** SReset section ***/
2242 #ifdef DBG_CONFIG_ERROR_DETECT
2243 	if (NULL == padapter->hal_func.sreset_init_value) {
2244 		rtw_hal_error_msg("sreset_init_value");
2245 		ret = _FAIL;
2246 	}
2247 	if (NULL == padapter->hal_func.sreset_reset_value) {
2248 		rtw_hal_error_msg("sreset_reset_value");
2249 		ret = _FAIL;
2250 	}
2251 	if (NULL == padapter->hal_func.silentreset) {
2252 		rtw_hal_error_msg("silentreset");
2253 		ret = _FAIL;
2254 	}
2255 	if (NULL == padapter->hal_func.sreset_xmit_status_check) {
2256 		rtw_hal_error_msg("sreset_xmit_status_check");
2257 		ret = _FAIL;
2258 	}
2259 	if (NULL == padapter->hal_func.sreset_linked_status_check) {
2260 		rtw_hal_error_msg("sreset_linked_status_check");
2261 		ret = _FAIL;
2262 	}
2263 	if (NULL == padapter->hal_func.sreset_get_wifi_status) {
2264 		rtw_hal_error_msg("sreset_get_wifi_status");
2265 		ret = _FAIL;
2266 	}
2267 	if (NULL == padapter->hal_func.sreset_inprogress) {
2268 		rtw_hal_error_msg("sreset_inprogress");
2269 		ret = _FAIL;
2270 	}
2271 #endif  /* #ifdef DBG_CONFIG_ERROR_DETECT */
2272 
2273 #ifdef RTW_HALMAC
2274 	if (NULL == padapter->hal_func.init_mac_register) {
2275 		rtw_hal_error_msg("init_mac_register");
2276 		ret = _FAIL;
2277 	}
2278 	if (NULL == padapter->hal_func.init_phy) {
2279 		rtw_hal_error_msg("init_phy");
2280 		ret = _FAIL;
2281 	}
2282 #endif /* RTW_HALMAC */
2283 
2284 #ifdef CONFIG_RFKILL_POLL
2285 	if (padapter->hal_func.hal_radio_onoff_check == NULL) {
2286 		rtw_hal_error_msg("hal_radio_onoff_check");
2287 		ret = _FAIL;
2288 	}
2289 #endif
2290 #endif
2291 	return  ret;
2292 }
2293