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