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