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