Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_mi.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
#define _RTW_MI_C_
16
17
#include <drv_types.h>
18
#include <hal_data.h>
19
20
void rtw_mi_update_union_chan_inf(_adapter *adapter, u8 ch, u8 offset , u8 bw)
21
{
22
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
23
struct mi_state *iface_state = &dvobj->iface_state;
24
25
iface_state->union_ch = ch;
26
iface_state->union_bw = bw;
27
iface_state->union_offset = offset;
28
}
29
30
#ifdef DBG_IFACE_STATUS
31
#ifdef CONFIG_P2P
32
static u8 _rtw_mi_p2p_listen_scan_chk(_adapter *adapter)
33
{
34
int i;
35
_adapter *iface;
36
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
37
u8 p2p_listen_scan_state = _FALSE;
38
39
for (i = 0; i < dvobj->iface_nums; i++) {
40
iface = dvobj->padapters[i];
41
if (rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_LISTEN) ||
42
rtw_p2p_chk_state(&iface->wdinfo, P2P_STATE_SCAN)) {
43
p2p_listen_scan_state = _TRUE;
44
break;
45
}
46
}
47
return p2p_listen_scan_state;
48
}
49
#endif
50
#endif
51
52
u8 rtw_mi_stayin_union_ch_chk(_adapter *adapter)
53
{
54
u8 rst = _TRUE;
55
u8 u_ch, u_bw, u_offset;
56
u8 o_ch, o_bw, o_offset;
57
58
u_ch = rtw_mi_get_union_chan(adapter);
59
u_bw = rtw_mi_get_union_bw(adapter);
60
u_offset = rtw_mi_get_union_offset(adapter);
61
62
o_ch = rtw_get_oper_ch(adapter);
63
o_bw = rtw_get_oper_bw(adapter);
64
o_offset = rtw_get_oper_choffset(adapter);
65
66
if ((u_ch != o_ch) || (u_bw != o_bw) || (u_offset != o_offset))
67
rst = _FALSE;
68
69
#ifdef DBG_IFACE_STATUS
70
if (rst == _FALSE) {
71
RTW_ERR("%s Not stay in union channel\n", __func__);
72
if (GET_HAL_DATA(adapter)->bScanInProcess == _TRUE)
73
RTW_ERR("ScanInProcess\n");
74
#ifdef CONFIG_P2P
75
if (_rtw_mi_p2p_listen_scan_chk(adapter))
76
RTW_ERR("P2P in listen or scan state\n");
77
#endif
78
RTW_ERR("union ch, bw, offset: %u,%u,%u\n", u_ch, u_bw, u_offset);
79
RTW_ERR("oper ch, bw, offset: %u,%u,%u\n", o_ch, o_bw, o_offset);
80
RTW_ERR("=========================\n");
81
}
82
#endif
83
return rst;
84
}
85
86
u8 rtw_mi_stayin_union_band_chk(_adapter *adapter)
87
{
88
u8 rst = _TRUE;
89
u8 u_ch, o_ch;
90
u8 u_band, o_band;
91
92
u_ch = rtw_mi_get_union_chan(adapter);
93
o_ch = rtw_get_oper_ch(adapter);
94
u_band = (u_ch > 14) ? BAND_ON_5G : BAND_ON_2_4G;
95
o_band = (o_ch > 14) ? BAND_ON_5G : BAND_ON_2_4G;
96
97
if (u_ch != o_ch)
98
if(u_band != o_band)
99
rst = _FALSE;
100
101
#ifdef DBG_IFACE_STATUS
102
if (rst == _FALSE)
103
RTW_ERR("%s Not stay in union band\n", __func__);
104
#endif
105
106
return rst;
107
}
108
109
/* Find union about ch, bw, ch_offset of all linked/linking interfaces */
110
int rtw_mi_get_ch_setting_union_by_ifbmp(struct dvobj_priv *dvobj, u8 ifbmp, u8 *ch, u8 *bw, u8 *offset)
111
{
112
_adapter *iface;
113
struct mlme_ext_priv *mlmeext;
114
int i;
115
u8 ch_ret = 0;
116
u8 bw_ret = CHANNEL_WIDTH_20;
117
u8 offset_ret = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
118
int num = 0;
119
120
if (ch)
121
*ch = 0;
122
if (bw)
123
*bw = CHANNEL_WIDTH_20;
124
if (offset)
125
*offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
126
127
for (i = 0; i < dvobj->iface_nums; i++) {
128
iface = dvobj->padapters[i];
129
if (!iface || !(ifbmp & BIT(iface->iface_id)))
130
continue;
131
132
mlmeext = &iface->mlmeextpriv;
133
134
if (!check_fwstate(&iface->mlmepriv, _FW_LINKED | _FW_UNDER_LINKING))
135
continue;
136
137
if (check_fwstate(&iface->mlmepriv, WIFI_OP_CH_SWITCHING))
138
continue;
139
140
if (num == 0) {
141
ch_ret = mlmeext->cur_channel;
142
bw_ret = mlmeext->cur_bwmode;
143
offset_ret = mlmeext->cur_ch_offset;
144
num++;
145
continue;
146
}
147
148
if (ch_ret != mlmeext->cur_channel) {
149
num = 0;
150
break;
151
}
152
153
if (bw_ret < mlmeext->cur_bwmode) {
154
bw_ret = mlmeext->cur_bwmode;
155
offset_ret = mlmeext->cur_ch_offset;
156
} else if (bw_ret == mlmeext->cur_bwmode && offset_ret != mlmeext->cur_ch_offset) {
157
num = 0;
158
break;
159
}
160
161
num++;
162
}
163
164
if (num) {
165
if (ch)
166
*ch = ch_ret;
167
if (bw)
168
*bw = bw_ret;
169
if (offset)
170
*offset = offset_ret;
171
}
172
173
return num;
174
}
175
176
inline int rtw_mi_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)
177
{
178
return rtw_mi_get_ch_setting_union_by_ifbmp(adapter_to_dvobj(adapter), 0xFF, ch, bw, offset);
179
}
180
181
inline int rtw_mi_get_ch_setting_union_no_self(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)
182
{
183
return rtw_mi_get_ch_setting_union_by_ifbmp(adapter_to_dvobj(adapter), 0xFF & ~BIT(adapter->iface_id), ch, bw, offset);
184
}
185
186
/* For now, not return union_ch/bw/offset */
187
void rtw_mi_status_by_ifbmp(struct dvobj_priv *dvobj, u8 ifbmp, struct mi_state *mstate)
188
{
189
_adapter *iface;
190
int i;
191
192
_rtw_memset(mstate, 0, sizeof(struct mi_state));
193
194
for (i = 0; i < dvobj->iface_nums; i++) {
195
iface = dvobj->padapters[i];
196
if (!iface || !(ifbmp & BIT(iface->iface_id)))
197
continue;
198
199
if (check_fwstate(&iface->mlmepriv, WIFI_STATION_STATE) == _TRUE) {
200
MSTATE_STA_NUM(mstate)++;
201
if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE) {
202
MSTATE_STA_LD_NUM(mstate)++;
203
204
#ifdef CONFIG_TDLS
205
if (iface->tdlsinfo.link_established == _TRUE)
206
MSTATE_TDLS_LD_NUM(mstate)++;
207
#endif
208
#ifdef CONFIG_P2P
209
if (MLME_IS_GC(iface))
210
MSTATE_P2P_GC_NUM(mstate)++;
211
#endif
212
}
213
if (check_fwstate(&iface->mlmepriv, _FW_UNDER_LINKING) == _TRUE)
214
MSTATE_STA_LG_NUM(mstate)++;
215
216
#ifdef CONFIG_AP_MODE
217
} else if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE ) {
218
if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE) {
219
MSTATE_AP_NUM(mstate)++;
220
if (iface->stapriv.asoc_sta_count > 2)
221
MSTATE_AP_LD_NUM(mstate)++;
222
#ifdef CONFIG_P2P
223
if (MLME_IS_GO(iface))
224
MSTATE_P2P_GO_NUM(mstate)++;
225
#endif
226
} else
227
MSTATE_AP_STARTING_NUM(mstate)++;
228
#endif
229
230
} else if (check_fwstate(&iface->mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) == _TRUE
231
&& check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE
232
) {
233
MSTATE_ADHOC_NUM(mstate)++;
234
if (iface->stapriv.asoc_sta_count > 2)
235
MSTATE_ADHOC_LD_NUM(mstate)++;
236
237
#ifdef CONFIG_RTW_MESH
238
} else if (check_fwstate(&iface->mlmepriv, WIFI_MESH_STATE) == _TRUE
239
&& check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE
240
) {
241
MSTATE_MESH_NUM(mstate)++;
242
if (iface->stapriv.asoc_sta_count > 2)
243
MSTATE_MESH_LD_NUM(mstate)++;
244
#endif
245
246
}
247
248
if (check_fwstate(&iface->mlmepriv, WIFI_UNDER_WPS) == _TRUE)
249
MSTATE_WPS_NUM(mstate)++;
250
251
if (check_fwstate(&iface->mlmepriv, WIFI_SITE_MONITOR) == _TRUE) {
252
MSTATE_SCAN_NUM(mstate)++;
253
254
if (mlmeext_scan_state(&iface->mlmeextpriv) != SCAN_DISABLE
255
&& mlmeext_scan_state(&iface->mlmeextpriv) != SCAN_BACK_OP)
256
MSTATE_SCAN_ENTER_NUM(mstate)++;
257
}
258
259
#ifdef CONFIG_IOCTL_CFG80211
260
if (rtw_cfg80211_get_is_mgmt_tx(iface))
261
MSTATE_MGMT_TX_NUM(mstate)++;
262
#ifdef CONFIG_P2P
263
if (rtw_cfg80211_get_is_roch(iface) == _TRUE)
264
MSTATE_ROCH_NUM(mstate)++;
265
#endif
266
#endif /* CONFIG_IOCTL_CFG80211 */
267
#ifdef CONFIG_P2P
268
if (MLME_IS_PD(iface))
269
MSTATE_P2P_DV_NUM(mstate)++;
270
#endif
271
}
272
}
273
274
inline void rtw_mi_status(_adapter *adapter, struct mi_state *mstate)
275
{
276
return rtw_mi_status_by_ifbmp(adapter_to_dvobj(adapter), 0xFF, mstate);
277
}
278
279
inline void rtw_mi_status_no_self(_adapter *adapter, struct mi_state *mstate)
280
{
281
return rtw_mi_status_by_ifbmp(adapter_to_dvobj(adapter), 0xFF & ~BIT(adapter->iface_id), mstate);
282
}
283
284
inline void rtw_mi_status_no_others(_adapter *adapter, struct mi_state *mstate)
285
{
286
return rtw_mi_status_by_ifbmp(adapter_to_dvobj(adapter), BIT(adapter->iface_id), mstate);
287
}
288
289
/* For now, not handle union_ch/bw/offset */
290
inline void rtw_mi_status_merge(struct mi_state *d, struct mi_state *a)
291
{
292
d->sta_num += a->sta_num;
293
d->ld_sta_num += a->ld_sta_num;
294
d->lg_sta_num += a->lg_sta_num;
295
#ifdef CONFIG_TDLS
296
d->ld_tdls_num += a->ld_tdls_num;
297
#endif
298
#ifdef CONFIG_AP_MODE
299
d->ap_num += a->ap_num;
300
d->ld_ap_num += a->ld_ap_num;
301
#endif
302
d->adhoc_num += a->adhoc_num;
303
d->ld_adhoc_num += a->ld_adhoc_num;
304
#ifdef CONFIG_RTW_MESH
305
d->mesh_num += a->mesh_num;
306
d->ld_mesh_num += a->ld_mesh_num;
307
#endif
308
d->scan_num += a->scan_num;
309
d->scan_enter_num += a->scan_enter_num;
310
d->uwps_num += a->uwps_num;
311
#ifdef CONFIG_IOCTL_CFG80211
312
#ifdef CONFIG_P2P
313
d->roch_num += a->roch_num;
314
#endif
315
d->mgmt_tx_num += a->mgmt_tx_num;
316
#endif
317
}
318
319
void dump_mi_status(void *sel, struct dvobj_priv *dvobj)
320
{
321
RTW_PRINT_SEL(sel, "== dvobj-iface_state ==\n");
322
RTW_PRINT_SEL(sel, "sta_num:%d\n", DEV_STA_NUM(dvobj));
323
RTW_PRINT_SEL(sel, "linking_sta_num:%d\n", DEV_STA_LG_NUM(dvobj));
324
RTW_PRINT_SEL(sel, "linked_sta_num:%d\n", DEV_STA_LD_NUM(dvobj));
325
#ifdef CONFIG_TDLS
326
RTW_PRINT_SEL(sel, "linked_tdls_num:%d\n", DEV_TDLS_LD_NUM(dvobj));
327
#endif
328
#ifdef CONFIG_AP_MODE
329
RTW_PRINT_SEL(sel, "ap_num:%d\n", DEV_AP_NUM(dvobj));
330
RTW_PRINT_SEL(sel, "starting_ap_num:%d\n", DEV_AP_STARTING_NUM(dvobj));
331
RTW_PRINT_SEL(sel, "linked_ap_num:%d\n", DEV_AP_LD_NUM(dvobj));
332
#endif
333
RTW_PRINT_SEL(sel, "adhoc_num:%d\n", DEV_ADHOC_NUM(dvobj));
334
RTW_PRINT_SEL(sel, "linked_adhoc_num:%d\n", DEV_ADHOC_LD_NUM(dvobj));
335
#ifdef CONFIG_RTW_MESH
336
RTW_PRINT_SEL(sel, "mesh_num:%d\n", DEV_MESH_NUM(dvobj));
337
RTW_PRINT_SEL(sel, "linked_mesh_num:%d\n", DEV_MESH_LD_NUM(dvobj));
338
#endif
339
#ifdef CONFIG_P2P
340
RTW_PRINT_SEL(sel, "p2p_device_num:%d\n", DEV_P2P_DV_NUM(dvobj));
341
RTW_PRINT_SEL(sel, "p2p_gc_num:%d\n", DEV_P2P_GC_NUM(dvobj));
342
RTW_PRINT_SEL(sel, "p2p_go_num:%d\n", DEV_P2P_GO_NUM(dvobj));
343
#endif
344
RTW_PRINT_SEL(sel, "scan_num:%d\n", DEV_SCAN_NUM(dvobj));
345
RTW_PRINT_SEL(sel, "under_wps_num:%d\n", DEV_WPS_NUM(dvobj));
346
#if defined(CONFIG_IOCTL_CFG80211)
347
#if defined(CONFIG_P2P)
348
RTW_PRINT_SEL(sel, "roch_num:%d\n", DEV_ROCH_NUM(dvobj));
349
#endif
350
RTW_PRINT_SEL(sel, "mgmt_tx_num:%d\n", DEV_MGMT_TX_NUM(dvobj));
351
#endif
352
RTW_PRINT_SEL(sel, "union_ch:%d\n", DEV_U_CH(dvobj));
353
RTW_PRINT_SEL(sel, "union_bw:%d\n", DEV_U_BW(dvobj));
354
RTW_PRINT_SEL(sel, "union_offset:%d\n", DEV_U_OFFSET(dvobj));
355
RTW_PRINT_SEL(sel, "================\n\n");
356
}
357
358
void dump_dvobj_mi_status(void *sel, const char *fun_name, _adapter *adapter)
359
{
360
RTW_INFO("\n[ %s ] call %s\n", fun_name, __func__);
361
dump_mi_status(sel, adapter_to_dvobj(adapter));
362
}
363
364
inline void rtw_mi_update_iface_status(struct mlme_priv *pmlmepriv, sint state)
365
{
366
_adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv);
367
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
368
struct mi_state *iface_state = &dvobj->iface_state;
369
struct mi_state tmp_mstate;
370
u8 u_ch, u_offset, u_bw;
371
372
if (state == WIFI_MONITOR_STATE
373
|| state == 0xFFFFFFFF
374
)
375
return;
376
377
if (0)
378
RTW_INFO("%s => will change or clean state to 0x%08x\n", __func__, state);
379
380
rtw_mi_status(adapter, &tmp_mstate);
381
_rtw_memcpy(iface_state, &tmp_mstate, sizeof(struct mi_state));
382
383
if (rtw_mi_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset))
384
rtw_mi_update_union_chan_inf(adapter , u_ch, u_offset , u_bw);
385
else {
386
if (0) {
387
dump_adapters_status(RTW_DBGDUMP , dvobj);
388
RTW_INFO("%s-[ERROR] cannot get union channel\n", __func__);
389
rtw_warn_on(1);
390
}
391
}
392
393
#ifdef DBG_IFACE_STATUS
394
DBG_IFACE_STATUS_DUMP(adapter);
395
#endif
396
}
397
u8 rtw_mi_check_status(_adapter *adapter, u8 type)
398
{
399
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
400
struct mi_state *iface_state = &dvobj->iface_state;
401
u8 ret = _FALSE;
402
403
#ifdef DBG_IFACE_STATUS
404
DBG_IFACE_STATUS_DUMP(adapter);
405
RTW_INFO("%s-"ADPT_FMT" check type:%d\n", __func__, ADPT_ARG(adapter), type);
406
#endif
407
408
switch (type) {
409
case MI_LINKED:
410
if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_NUM(iface_state) || MSTATE_ADHOC_NUM(iface_state) || MSTATE_MESH_NUM(iface_state)) /*check_fwstate(&iface->mlmepriv, _FW_LINKED)*/
411
ret = _TRUE;
412
break;
413
case MI_ASSOC:
414
if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_LD_NUM(iface_state) || MSTATE_ADHOC_LD_NUM(iface_state) || MSTATE_MESH_LD_NUM(iface_state))
415
ret = _TRUE;
416
break;
417
case MI_UNDER_WPS:
418
if (MSTATE_WPS_NUM(iface_state))
419
ret = _TRUE;
420
break;
421
422
case MI_AP_MODE:
423
if (MSTATE_AP_NUM(iface_state))
424
ret = _TRUE;
425
break;
426
case MI_AP_ASSOC:
427
if (MSTATE_AP_LD_NUM(iface_state))
428
ret = _TRUE;
429
break;
430
431
case MI_ADHOC:
432
if (MSTATE_ADHOC_NUM(iface_state))
433
ret = _TRUE;
434
break;
435
case MI_ADHOC_ASSOC:
436
if (MSTATE_ADHOC_LD_NUM(iface_state))
437
ret = _TRUE;
438
break;
439
440
#ifdef CONFIG_RTW_MESH
441
case MI_MESH:
442
if (MSTATE_MESH_NUM(iface_state))
443
ret = _TRUE;
444
break;
445
case MI_MESH_ASSOC:
446
if (MSTATE_MESH_LD_NUM(iface_state))
447
ret = _TRUE;
448
break;
449
#endif
450
451
case MI_STA_NOLINK: /* this is misleading, but not used now */
452
if (MSTATE_STA_NUM(iface_state) && (!(MSTATE_STA_LD_NUM(iface_state) || MSTATE_STA_LG_NUM(iface_state))))
453
ret = _TRUE;
454
break;
455
case MI_STA_LINKED:
456
if (MSTATE_STA_LD_NUM(iface_state))
457
ret = _TRUE;
458
break;
459
case MI_STA_LINKING:
460
if (MSTATE_STA_LG_NUM(iface_state))
461
ret = _TRUE;
462
break;
463
464
default:
465
break;
466
}
467
return ret;
468
}
469
470
/*
471
* return value : 0 is failed or have not interface meet condition
472
* return value : !0 is success or interface numbers which meet condition
473
* return value of ops_func must be _TRUE or _FALSE
474
*/
475
static u8 _rtw_mi_process(_adapter *padapter, bool exclude_self,
476
void *data, u8(*ops_func)(_adapter *padapter, void *data))
477
{
478
int i;
479
_adapter *iface;
480
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
481
482
u8 ret = 0;
483
484
for (i = 0; i < dvobj->iface_nums; i++) {
485
iface = dvobj->padapters[i];
486
if ((iface) && rtw_is_adapter_up(iface)) {
487
488
if ((exclude_self) && (iface == padapter))
489
continue;
490
491
if (ops_func)
492
if (_TRUE == ops_func(iface, data))
493
ret++;
494
}
495
}
496
return ret;
497
}
498
static u8 _rtw_mi_process_without_schk(_adapter *padapter, bool exclude_self,
499
void *data, u8(*ops_func)(_adapter *padapter, void *data))
500
{
501
int i;
502
_adapter *iface;
503
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
504
505
u8 ret = 0;
506
507
for (i = 0; i < dvobj->iface_nums; i++) {
508
iface = dvobj->padapters[i];
509
if (iface) {
510
if ((exclude_self) && (iface == padapter))
511
continue;
512
513
if (ops_func)
514
if (ops_func(iface, data) == _TRUE)
515
ret++;
516
}
517
}
518
return ret;
519
}
520
521
static u8 _rtw_mi_netif_caroff_qstop(_adapter *padapter, void *data)
522
{
523
struct net_device *pnetdev = padapter->pnetdev;
524
525
rtw_netif_carrier_off(pnetdev);
526
rtw_netif_stop_queue(pnetdev);
527
return _TRUE;
528
}
529
u8 rtw_mi_netif_caroff_qstop(_adapter *padapter)
530
{
531
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_caroff_qstop);
532
}
533
u8 rtw_mi_buddy_netif_caroff_qstop(_adapter *padapter)
534
{
535
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_caroff_qstop);
536
}
537
538
static u8 _rtw_mi_netif_caron_qstart(_adapter *padapter, void *data)
539
{
540
struct net_device *pnetdev = padapter->pnetdev;
541
542
rtw_netif_carrier_on(pnetdev);
543
rtw_netif_start_queue(pnetdev);
544
return _TRUE;
545
}
546
u8 rtw_mi_netif_caron_qstart(_adapter *padapter)
547
{
548
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_caron_qstart);
549
}
550
u8 rtw_mi_buddy_netif_caron_qstart(_adapter *padapter)
551
{
552
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_caron_qstart);
553
}
554
555
static u8 _rtw_mi_netif_stop_queue(_adapter *padapter, void *data)
556
{
557
struct net_device *pnetdev = padapter->pnetdev;
558
559
rtw_netif_stop_queue(pnetdev);
560
return _TRUE;
561
}
562
u8 rtw_mi_netif_stop_queue(_adapter *padapter)
563
{
564
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_stop_queue);
565
}
566
u8 rtw_mi_buddy_netif_stop_queue(_adapter *padapter)
567
{
568
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_stop_queue);
569
}
570
571
static u8 _rtw_mi_netif_wake_queue(_adapter *padapter, void *data)
572
{
573
struct net_device *pnetdev = padapter->pnetdev;
574
575
if (pnetdev)
576
rtw_netif_wake_queue(pnetdev);
577
return _TRUE;
578
}
579
u8 rtw_mi_netif_wake_queue(_adapter *padapter)
580
{
581
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_wake_queue);
582
}
583
u8 rtw_mi_buddy_netif_wake_queue(_adapter *padapter)
584
{
585
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_wake_queue);
586
}
587
588
static u8 _rtw_mi_netif_carrier_on(_adapter *padapter, void *data)
589
{
590
struct net_device *pnetdev = padapter->pnetdev;
591
592
if (pnetdev)
593
rtw_netif_carrier_on(pnetdev);
594
return _TRUE;
595
}
596
u8 rtw_mi_netif_carrier_on(_adapter *padapter)
597
{
598
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_carrier_on);
599
}
600
u8 rtw_mi_buddy_netif_carrier_on(_adapter *padapter)
601
{
602
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_carrier_on);
603
}
604
605
static u8 _rtw_mi_netif_carrier_off(_adapter *padapter, void *data)
606
{
607
struct net_device *pnetdev = padapter->pnetdev;
608
609
if (pnetdev)
610
rtw_netif_carrier_off(pnetdev);
611
return _TRUE;
612
}
613
u8 rtw_mi_netif_carrier_off(_adapter *padapter)
614
{
615
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_carrier_off);
616
}
617
u8 rtw_mi_buddy_netif_carrier_off(_adapter *padapter)
618
{
619
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_carrier_off);
620
}
621
622
static u8 _rtw_mi_scan_abort(_adapter *adapter, void *data)
623
{
624
bool bwait = *(bool *)data;
625
626
if (bwait)
627
rtw_scan_abort(adapter);
628
else
629
rtw_scan_abort_no_wait(adapter);
630
631
return _TRUE;
632
}
633
void rtw_mi_scan_abort(_adapter *adapter, bool bwait)
634
{
635
bool in_data = bwait;
636
637
_rtw_mi_process(adapter, _FALSE, &in_data, _rtw_mi_scan_abort);
638
639
}
640
void rtw_mi_buddy_scan_abort(_adapter *adapter, bool bwait)
641
{
642
bool in_data = bwait;
643
644
_rtw_mi_process(adapter, _TRUE, &in_data, _rtw_mi_scan_abort);
645
}
646
647
static u32 _rtw_mi_start_drv_threads(_adapter *adapter, bool exclude_self)
648
{
649
int i;
650
_adapter *iface = NULL;
651
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
652
u32 _status = _SUCCESS;
653
654
for (i = 0; i < dvobj->iface_nums; i++) {
655
iface = dvobj->padapters[i];
656
if (iface) {
657
if ((exclude_self) && (iface == adapter))
658
continue;
659
if (rtw_start_drv_threads(iface) == _FAIL) {
660
_status = _FAIL;
661
break;
662
}
663
}
664
}
665
return _status;
666
}
667
u32 rtw_mi_start_drv_threads(_adapter *adapter)
668
{
669
return _rtw_mi_start_drv_threads(adapter, _FALSE);
670
}
671
u32 rtw_mi_buddy_start_drv_threads(_adapter *adapter)
672
{
673
return _rtw_mi_start_drv_threads(adapter, _TRUE);
674
}
675
676
static void _rtw_mi_stop_drv_threads(_adapter *adapter, bool exclude_self)
677
{
678
int i;
679
_adapter *iface = NULL;
680
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
681
682
for (i = 0; i < dvobj->iface_nums; i++) {
683
iface = dvobj->padapters[i];
684
if (iface) {
685
if ((exclude_self) && (iface == adapter))
686
continue;
687
rtw_stop_drv_threads(iface);
688
}
689
}
690
}
691
void rtw_mi_stop_drv_threads(_adapter *adapter)
692
{
693
_rtw_mi_stop_drv_threads(adapter, _FALSE);
694
}
695
void rtw_mi_buddy_stop_drv_threads(_adapter *adapter)
696
{
697
_rtw_mi_stop_drv_threads(adapter, _TRUE);
698
}
699
700
static u8 _rtw_mi_cancel_all_timer(_adapter *adapter, void *data)
701
{
702
rtw_cancel_all_timer(adapter);
703
return _TRUE;
704
}
705
void rtw_mi_cancel_all_timer(_adapter *adapter)
706
{
707
_rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_cancel_all_timer);
708
}
709
void rtw_mi_buddy_cancel_all_timer(_adapter *adapter)
710
{
711
_rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_cancel_all_timer);
712
}
713
714
static u8 _rtw_mi_reset_drv_sw(_adapter *adapter, void *data)
715
{
716
rtw_reset_drv_sw(adapter);
717
return _TRUE;
718
}
719
void rtw_mi_reset_drv_sw(_adapter *adapter)
720
{
721
_rtw_mi_process_without_schk(adapter, _FALSE, NULL, _rtw_mi_reset_drv_sw);
722
}
723
void rtw_mi_buddy_reset_drv_sw(_adapter *adapter)
724
{
725
_rtw_mi_process_without_schk(adapter, _TRUE, NULL, _rtw_mi_reset_drv_sw);
726
}
727
728
static u8 _rtw_mi_intf_start(_adapter *adapter, void *data)
729
{
730
rtw_intf_start(adapter);
731
return _TRUE;
732
}
733
void rtw_mi_intf_start(_adapter *adapter)
734
{
735
_rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_intf_start);
736
}
737
void rtw_mi_buddy_intf_start(_adapter *adapter)
738
{
739
_rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_intf_start);
740
}
741
742
static u8 _rtw_mi_intf_stop(_adapter *adapter, void *data)
743
{
744
rtw_intf_stop(adapter);
745
return _TRUE;
746
}
747
void rtw_mi_intf_stop(_adapter *adapter)
748
{
749
_rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_intf_stop);
750
}
751
void rtw_mi_buddy_intf_stop(_adapter *adapter)
752
{
753
_rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_intf_stop);
754
}
755
756
#ifdef CONFIG_NEW_NETDEV_HDL
757
u8 rtw_mi_hal_iface_init(_adapter *padapter)
758
{
759
int i;
760
_adapter *iface;
761
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
762
763
u8 ret = _TRUE;
764
765
for (i = 0; i < dvobj->iface_nums; i++) {
766
iface = dvobj->padapters[i];
767
if (iface && iface->netif_up)
768
rtw_hal_iface_init(padapter);
769
}
770
return ret;
771
}
772
#endif
773
774
static u8 _rtw_mi_suspend_free_assoc_resource(_adapter *padapter, void *data)
775
{
776
return rtw_suspend_free_assoc_resource(padapter);
777
}
778
void rtw_mi_suspend_free_assoc_resource(_adapter *adapter)
779
{
780
_rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_suspend_free_assoc_resource);
781
}
782
void rtw_mi_buddy_suspend_free_assoc_resource(_adapter *adapter)
783
{
784
_rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_suspend_free_assoc_resource);
785
}
786
787
static u8 _rtw_mi_is_scan_deny(_adapter *adapter, void *data)
788
{
789
return rtw_is_scan_deny(adapter);
790
}
791
792
u8 rtw_mi_is_scan_deny(_adapter *adapter)
793
{
794
return _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_is_scan_deny);
795
796
}
797
u8 rtw_mi_buddy_is_scan_deny(_adapter *adapter)
798
{
799
return _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_is_scan_deny);
800
}
801
802
#ifdef CONFIG_SET_SCAN_DENY_TIMER
803
static u8 _rtw_mi_set_scan_deny(_adapter *adapter, void *data)
804
{
805
u32 ms = *(u32 *)data;
806
807
rtw_set_scan_deny(adapter, ms);
808
return _TRUE;
809
}
810
void rtw_mi_set_scan_deny(_adapter *adapter, u32 ms)
811
{
812
u32 in_data = ms;
813
814
_rtw_mi_process(adapter, _FALSE, &in_data, _rtw_mi_set_scan_deny);
815
}
816
void rtw_mi_buddy_set_scan_deny(_adapter *adapter, u32 ms)
817
{
818
u32 in_data = ms;
819
820
_rtw_mi_process(adapter, _TRUE, &in_data, _rtw_mi_set_scan_deny);
821
}
822
#endif /*CONFIG_SET_SCAN_DENY_TIMER*/
823
824
static u8 _rtw_mi_beacon_update(_adapter *padapter, void *data)
825
{
826
if (!MLME_IS_STA(padapter)
827
&& check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _TRUE) {
828
RTW_INFO(ADPT_FMT" - update_beacon\n", ADPT_ARG(padapter));
829
update_beacon(padapter, 0xFF, NULL, _TRUE, 0);
830
}
831
return _TRUE;
832
}
833
834
void rtw_mi_beacon_update(_adapter *padapter)
835
{
836
_rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_beacon_update);
837
}
838
839
void rtw_mi_buddy_beacon_update(_adapter *padapter)
840
{
841
_rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_beacon_update);
842
}
843
844
static u8 _rtw_mi_hal_dump_macaddr(_adapter *padapter, void *data)
845
{
846
u8 mac_addr[ETH_ALEN] = {0};
847
848
rtw_hal_get_hwreg(padapter, HW_VAR_MAC_ADDR, mac_addr);
849
RTW_INFO(ADPT_FMT"MAC Address ="MAC_FMT"\n", ADPT_ARG(padapter), MAC_ARG(mac_addr));
850
return _TRUE;
851
}
852
void rtw_mi_hal_dump_macaddr(_adapter *padapter)
853
{
854
_rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_hal_dump_macaddr);
855
}
856
void rtw_mi_buddy_hal_dump_macaddr(_adapter *padapter)
857
{
858
_rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_hal_dump_macaddr);
859
}
860
861
#ifdef CONFIG_PCI_HCI
862
static u8 _rtw_mi_xmit_tasklet_schedule(_adapter *padapter, void *data)
863
{
864
if (rtw_txframes_pending(padapter)) {
865
/* try to deal with the pending packets */
866
tasklet_hi_schedule(&(padapter->xmitpriv.xmit_tasklet));
867
}
868
return _TRUE;
869
}
870
void rtw_mi_xmit_tasklet_schedule(_adapter *padapter)
871
{
872
_rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_xmit_tasklet_schedule);
873
}
874
void rtw_mi_buddy_xmit_tasklet_schedule(_adapter *padapter)
875
{
876
_rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_xmit_tasklet_schedule);
877
}
878
#endif
879
880
u8 _rtw_mi_busy_traffic_check(_adapter *padapter, void *data)
881
{
882
u32 passtime;
883
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
884
bool check_sc_interval = *(bool *)data;
885
886
if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) {
887
if (check_sc_interval) {
888
/* Miracast can't do AP scan*/
889
passtime = rtw_get_passing_time_ms(pmlmepriv->lastscantime);
890
if (passtime > BUSY_TRAFFIC_SCAN_DENY_PERIOD) {
891
RTW_INFO(ADPT_FMT" bBusyTraffic == _TRUE\n", ADPT_ARG(padapter));
892
return _TRUE;
893
}
894
} else
895
return _TRUE;
896
}
897
898
return _FALSE;
899
}
900
901
u8 rtw_mi_busy_traffic_check(_adapter *padapter, bool check_sc_interval)
902
{
903
bool in_data = check_sc_interval;
904
905
return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_busy_traffic_check);
906
}
907
u8 rtw_mi_buddy_busy_traffic_check(_adapter *padapter, bool check_sc_interval)
908
{
909
bool in_data = check_sc_interval;
910
911
return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_busy_traffic_check);
912
}
913
static u8 _rtw_mi_check_mlmeinfo_state(_adapter *padapter, void *data)
914
{
915
u32 state = *(u32 *)data;
916
struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
917
918
/*if (mlmeext_msr(mlmeext) == state)*/
919
if (check_mlmeinfo_state(mlmeext, state))
920
return _TRUE;
921
else
922
return _FALSE;
923
}
924
925
u8 rtw_mi_check_mlmeinfo_state(_adapter *padapter, u32 state)
926
{
927
u32 in_data = state;
928
929
return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_mlmeinfo_state);
930
}
931
932
u8 rtw_mi_buddy_check_mlmeinfo_state(_adapter *padapter, u32 state)
933
{
934
u32 in_data = state;
935
936
return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_mlmeinfo_state);
937
}
938
939
/*#define DBG_DUMP_FW_STATE*/
940
#ifdef DBG_DUMP_FW_STATE
941
static void rtw_dbg_dump_fwstate(_adapter *padapter, sint state)
942
{
943
u8 buf[32] = {0};
944
945
if (state & WIFI_FW_NULL_STATE) {
946
_rtw_memset(buf, 0, 32);
947
sprintf(buf, "WIFI_FW_NULL_STATE");
948
RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
949
}
950
951
if (state & _FW_LINKED) {
952
_rtw_memset(buf, 0, 32);
953
sprintf(buf, "_FW_LINKED");
954
RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
955
}
956
957
if (state & _FW_UNDER_LINKING) {
958
_rtw_memset(buf, 0, 32);
959
sprintf(buf, "_FW_UNDER_LINKING");
960
RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
961
}
962
963
if (state & _FW_UNDER_SURVEY) {
964
_rtw_memset(buf, 0, 32);
965
sprintf(buf, "_FW_UNDER_SURVEY");
966
RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
967
}
968
}
969
#endif
970
971
static u8 _rtw_mi_check_fwstate(_adapter *padapter, void *data)
972
{
973
u8 ret = _FALSE;
974
975
sint state = *(sint *)data;
976
977
if ((state == WIFI_FW_NULL_STATE) &&
978
(padapter->mlmepriv.fw_state == WIFI_FW_NULL_STATE))
979
ret = _TRUE;
980
else if (_TRUE == check_fwstate(&padapter->mlmepriv, state))
981
ret = _TRUE;
982
#ifdef DBG_DUMP_FW_STATE
983
if (ret)
984
rtw_dbg_dump_fwstate(padapter, state);
985
#endif
986
return ret;
987
}
988
u8 rtw_mi_check_fwstate(_adapter *padapter, sint state)
989
{
990
sint in_data = state;
991
992
return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_fwstate);
993
}
994
u8 rtw_mi_buddy_check_fwstate(_adapter *padapter, sint state)
995
{
996
sint in_data = state;
997
998
return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_fwstate);
999
}
1000
1001
static u8 _rtw_mi_traffic_statistics(_adapter *padapter , void *data)
1002
{
1003
struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
1004
1005
/* Tx */
1006
pdvobjpriv->traffic_stat.tx_bytes += padapter->xmitpriv.tx_bytes;
1007
pdvobjpriv->traffic_stat.tx_pkts += padapter->xmitpriv.tx_pkts;
1008
pdvobjpriv->traffic_stat.tx_drop += padapter->xmitpriv.tx_drop;
1009
1010
/* Rx */
1011
pdvobjpriv->traffic_stat.rx_bytes += padapter->recvpriv.rx_bytes;
1012
pdvobjpriv->traffic_stat.rx_pkts += padapter->recvpriv.rx_pkts;
1013
pdvobjpriv->traffic_stat.rx_drop += padapter->recvpriv.rx_drop;
1014
return _TRUE;
1015
}
1016
u8 rtw_mi_traffic_statistics(_adapter *padapter)
1017
{
1018
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_traffic_statistics);
1019
}
1020
1021
static u8 _rtw_mi_check_miracast_enabled(_adapter *padapter , void *data)
1022
{
1023
return is_miracast_enabled(padapter);
1024
}
1025
u8 rtw_mi_check_miracast_enabled(_adapter *padapter)
1026
{
1027
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_miracast_enabled);
1028
}
1029
1030
#ifdef CONFIG_XMIT_THREAD_MODE
1031
static u8 _rtw_mi_check_pending_xmitbuf(_adapter *padapter , void *data)
1032
{
1033
struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1034
1035
return check_pending_xmitbuf(pxmitpriv);
1036
}
1037
u8 rtw_mi_check_pending_xmitbuf(_adapter *padapter)
1038
{
1039
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_pending_xmitbuf);
1040
}
1041
u8 rtw_mi_buddy_check_pending_xmitbuf(_adapter *padapter)
1042
{
1043
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_check_pending_xmitbuf);
1044
}
1045
#endif
1046
1047
#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
1048
static u8 _rtw_mi_dequeue_writeport(_adapter *padapter , bool exclude_self)
1049
{
1050
int i;
1051
u8 queue_empty = _TRUE;
1052
_adapter *iface;
1053
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1054
1055
for (i = 0; i < dvobj->iface_nums; i++) {
1056
iface = dvobj->padapters[i];
1057
if ((iface) && rtw_is_adapter_up(iface)) {
1058
1059
if ((exclude_self) && (iface == padapter))
1060
continue;
1061
1062
queue_empty &= _dequeue_writeport(iface);
1063
}
1064
}
1065
return queue_empty;
1066
}
1067
u8 rtw_mi_dequeue_writeport(_adapter *padapter)
1068
{
1069
return _rtw_mi_dequeue_writeport(padapter, _FALSE);
1070
}
1071
u8 rtw_mi_buddy_dequeue_writeport(_adapter *padapter)
1072
{
1073
return _rtw_mi_dequeue_writeport(padapter, _TRUE);
1074
}
1075
#endif
1076
static void _rtw_mi_adapter_reset(_adapter *padapter , u8 exclude_self)
1077
{
1078
int i;
1079
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1080
1081
for (i = 0; i < dvobj->iface_nums; i++) {
1082
if (dvobj->padapters[i]) {
1083
if ((exclude_self) && (dvobj->padapters[i] == padapter))
1084
continue;
1085
dvobj->padapters[i] = NULL;
1086
}
1087
}
1088
}
1089
1090
void rtw_mi_adapter_reset(_adapter *padapter)
1091
{
1092
_rtw_mi_adapter_reset(padapter, _FALSE);
1093
}
1094
1095
void rtw_mi_buddy_adapter_reset(_adapter *padapter)
1096
{
1097
_rtw_mi_adapter_reset(padapter, _TRUE);
1098
}
1099
1100
static u8 _rtw_mi_dynamic_check_timer_handlder(_adapter *adapter, void *data)
1101
{
1102
rtw_iface_dynamic_check_timer_handlder(adapter);
1103
return _TRUE;
1104
}
1105
u8 rtw_mi_dynamic_check_timer_handlder(_adapter *padapter)
1106
{
1107
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_check_timer_handlder);
1108
}
1109
u8 rtw_mi_buddy_dynamic_check_timer_handlder(_adapter *padapter)
1110
{
1111
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_check_timer_handlder);
1112
}
1113
1114
static u8 _rtw_mi_dynamic_chk_wk_hdl(_adapter *adapter, void *data)
1115
{
1116
rtw_iface_dynamic_chk_wk_hdl(adapter);
1117
return _TRUE;
1118
}
1119
u8 rtw_mi_dynamic_chk_wk_hdl(_adapter *padapter)
1120
{
1121
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_chk_wk_hdl);
1122
}
1123
u8 rtw_mi_buddy_dynamic_chk_wk_hdl(_adapter *padapter)
1124
{
1125
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_chk_wk_hdl);
1126
}
1127
1128
static u8 _rtw_mi_os_xmit_schedule(_adapter *adapter, void *data)
1129
{
1130
rtw_os_xmit_schedule(adapter);
1131
return _TRUE;
1132
}
1133
u8 rtw_mi_os_xmit_schedule(_adapter *padapter)
1134
{
1135
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_os_xmit_schedule);
1136
}
1137
u8 rtw_mi_buddy_os_xmit_schedule(_adapter *padapter)
1138
{
1139
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_os_xmit_schedule);
1140
}
1141
1142
static u8 _rtw_mi_report_survey_event(_adapter *adapter, void *data)
1143
{
1144
union recv_frame *precv_frame = (union recv_frame *)data;
1145
1146
report_survey_event(adapter, precv_frame);
1147
return _TRUE;
1148
}
1149
u8 rtw_mi_report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
1150
{
1151
return _rtw_mi_process(padapter, _FALSE, precv_frame, _rtw_mi_report_survey_event);
1152
}
1153
u8 rtw_mi_buddy_report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
1154
{
1155
return _rtw_mi_process(padapter, _TRUE, precv_frame, _rtw_mi_report_survey_event);
1156
}
1157
1158
static u8 _rtw_mi_sreset_adapter_hdl(_adapter *adapter, void *data)
1159
{
1160
u8 bstart = *(u8 *)data;
1161
1162
if (bstart)
1163
sreset_start_adapter(adapter);
1164
else
1165
sreset_stop_adapter(adapter);
1166
return _TRUE;
1167
}
1168
u8 rtw_mi_sreset_adapter_hdl(_adapter *padapter, u8 bstart)
1169
{
1170
u8 in_data = bstart;
1171
1172
return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_sreset_adapter_hdl);
1173
}
1174
1175
#if defined(DBG_CONFIG_ERROR_RESET) && defined(CONFIG_CONCURRENT_MODE)
1176
void rtw_mi_ap_info_restore(_adapter *adapter)
1177
{
1178
int i;
1179
_adapter *iface;
1180
struct mlme_priv *pmlmepriv;
1181
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1182
1183
for (i = 0; i < dvobj->iface_nums; i++) {
1184
iface = dvobj->padapters[i];
1185
if (iface) {
1186
pmlmepriv = &iface->mlmepriv;
1187
1188
if (MLME_IS_AP(iface) || MLME_IS_MESH(iface)) {
1189
RTW_INFO(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(iface), MLME_IS_AP(iface) ? "AP" : "MESH");
1190
rtw_iface_bcmc_sec_cam_map_restore(iface);
1191
}
1192
}
1193
}
1194
}
1195
#endif /*#if defined(DBG_CONFIG_ERROR_RESET) && defined(CONFIG_CONCURRENT_MODE)*/
1196
1197
u8 rtw_mi_buddy_sreset_adapter_hdl(_adapter *padapter, u8 bstart)
1198
{
1199
u8 in_data = bstart;
1200
1201
return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_sreset_adapter_hdl);
1202
}
1203
static u8 _rtw_mi_tx_beacon_hdl(_adapter *adapter, void *data)
1204
{
1205
if ((MLME_IS_AP(adapter) || MLME_IS_MESH(adapter))
1206
&& check_fwstate(&adapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE
1207
) {
1208
adapter->mlmepriv.update_bcn = _TRUE;
1209
#ifndef CONFIG_INTERRUPT_BASED_TXBCN
1210
#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_PCI_BCN_POLLING)
1211
tx_beacon_hdl(adapter, NULL);
1212
#endif
1213
#endif
1214
}
1215
return _TRUE;
1216
}
1217
u8 rtw_mi_tx_beacon_hdl(_adapter *padapter)
1218
{
1219
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_tx_beacon_hdl);
1220
}
1221
u8 rtw_mi_buddy_tx_beacon_hdl(_adapter *padapter)
1222
{
1223
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_sreset_adapter_hdl);
1224
}
1225
1226
static u8 _rtw_mi_set_tx_beacon_cmd(_adapter *adapter, void *data)
1227
{
1228
struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1229
1230
if (MLME_IS_AP(adapter) || MLME_IS_MESH(adapter)) {
1231
if (pmlmepriv->update_bcn == _TRUE)
1232
set_tx_beacon_cmd(adapter, 0);
1233
}
1234
return _TRUE;
1235
}
1236
u8 rtw_mi_set_tx_beacon_cmd(_adapter *padapter)
1237
{
1238
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_set_tx_beacon_cmd);
1239
}
1240
u8 rtw_mi_buddy_set_tx_beacon_cmd(_adapter *padapter)
1241
{
1242
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_set_tx_beacon_cmd);
1243
}
1244
1245
#ifdef CONFIG_P2P
1246
static u8 _rtw_mi_p2p_chk_state(_adapter *adapter, void *data)
1247
{
1248
struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
1249
enum P2P_STATE state = *(enum P2P_STATE *)data;
1250
1251
return rtw_p2p_chk_state(pwdinfo, state);
1252
}
1253
u8 rtw_mi_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state)
1254
{
1255
u8 in_data = p2p_state;
1256
1257
return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_p2p_chk_state);
1258
}
1259
u8 rtw_mi_buddy_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state)
1260
{
1261
u8 in_data = p2p_state;
1262
1263
return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_p2p_chk_state);
1264
}
1265
static u8 _rtw_mi_stay_in_p2p_mode(_adapter *adapter, void *data)
1266
{
1267
struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
1268
1269
if (rtw_p2p_role(pwdinfo) != P2P_ROLE_DISABLE)
1270
return _TRUE;
1271
return _FALSE;
1272
}
1273
u8 rtw_mi_stay_in_p2p_mode(_adapter *padapter)
1274
{
1275
return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_stay_in_p2p_mode);
1276
}
1277
u8 rtw_mi_buddy_stay_in_p2p_mode(_adapter *padapter)
1278
{
1279
return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_stay_in_p2p_mode);
1280
}
1281
#endif /*CONFIG_P2P*/
1282
1283
_adapter *rtw_get_iface_by_id(_adapter *padapter, u8 iface_id)
1284
{
1285
_adapter *iface = NULL;
1286
struct dvobj_priv *dvobj;
1287
1288
if ((padapter == NULL) || (iface_id >= CONFIG_IFACE_NUMBER)) {
1289
rtw_warn_on(1);
1290
return iface;
1291
}
1292
1293
dvobj = adapter_to_dvobj(padapter);
1294
return dvobj->padapters[iface_id];
1295
}
1296
1297
_adapter *rtw_get_iface_by_macddr(_adapter *padapter, const u8 *mac_addr)
1298
{
1299
int i;
1300
_adapter *iface = NULL;
1301
u8 bmatch = _FALSE;
1302
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1303
1304
for (i = 0; i < dvobj->iface_nums; i++) {
1305
iface = dvobj->padapters[i];
1306
if ((iface) && (_rtw_memcmp(mac_addr, adapter_mac_addr(iface), ETH_ALEN))) {
1307
bmatch = _TRUE;
1308
break;
1309
}
1310
}
1311
if (bmatch)
1312
return iface;
1313
else
1314
return NULL;
1315
}
1316
1317
_adapter *rtw_get_iface_by_hwport(_adapter *padapter, u8 hw_port)
1318
{
1319
int i;
1320
_adapter *iface = NULL;
1321
u8 bmatch = _FALSE;
1322
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1323
1324
for (i = 0; i < dvobj->iface_nums; i++) {
1325
iface = dvobj->padapters[i];
1326
if ((iface) && (hw_port == iface->hw_port)) {
1327
bmatch = _TRUE;
1328
break;
1329
}
1330
}
1331
if (bmatch)
1332
return iface;
1333
else
1334
return NULL;
1335
}
1336
1337
/*#define CONFIG_SKB_ALLOCATED*/
1338
#define DBG_SKB_PROCESS
1339
#ifdef DBG_SKB_PROCESS
1340
void rtw_dbg_skb_process(_adapter *padapter, union recv_frame *precvframe, union recv_frame *pcloneframe)
1341
{
1342
_pkt *pkt_copy, *pkt_org;
1343
1344
pkt_org = precvframe->u.hdr.pkt;
1345
pkt_copy = pcloneframe->u.hdr.pkt;
1346
/*
1347
RTW_INFO("%s ===== ORG SKB =====\n", __func__);
1348
RTW_INFO(" SKB head(%p)\n", pkt_org->head);
1349
RTW_INFO(" SKB data(%p)\n", pkt_org->data);
1350
RTW_INFO(" SKB tail(%p)\n", pkt_org->tail);
1351
RTW_INFO(" SKB end(%p)\n", pkt_org->end);
1352
1353
RTW_INFO(" recv frame head(%p)\n", precvframe->u.hdr.rx_head);
1354
RTW_INFO(" recv frame data(%p)\n", precvframe->u.hdr.rx_data);
1355
RTW_INFO(" recv frame tail(%p)\n", precvframe->u.hdr.rx_tail);
1356
RTW_INFO(" recv frame end(%p)\n", precvframe->u.hdr.rx_end);
1357
1358
RTW_INFO("%s ===== COPY SKB =====\n", __func__);
1359
RTW_INFO(" SKB head(%p)\n", pkt_copy->head);
1360
RTW_INFO(" SKB data(%p)\n", pkt_copy->data);
1361
RTW_INFO(" SKB tail(%p)\n", pkt_copy->tail);
1362
RTW_INFO(" SKB end(%p)\n", pkt_copy->end);
1363
1364
RTW_INFO(" recv frame head(%p)\n", pcloneframe->u.hdr.rx_head);
1365
RTW_INFO(" recv frame data(%p)\n", pcloneframe->u.hdr.rx_data);
1366
RTW_INFO(" recv frame tail(%p)\n", pcloneframe->u.hdr.rx_tail);
1367
RTW_INFO(" recv frame end(%p)\n", pcloneframe->u.hdr.rx_end);
1368
*/
1369
/*
1370
RTW_INFO("%s => recv_frame adapter(%p,%p)\n", __func__, precvframe->u.hdr.adapter, pcloneframe->u.hdr.adapter);
1371
RTW_INFO("%s => recv_frame dev(%p,%p)\n", __func__, pkt_org->dev , pkt_copy->dev);
1372
RTW_INFO("%s => recv_frame len(%d,%d)\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len);
1373
*/
1374
if (precvframe->u.hdr.len != pcloneframe->u.hdr.len)
1375
RTW_INFO("%s [WARN] recv_frame length(%d:%d) compare failed\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len);
1376
1377
if (_rtw_memcmp(&precvframe->u.hdr.attrib, &pcloneframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib)) == _FALSE)
1378
RTW_INFO("%s [WARN] recv_frame attrib compare failed\n", __func__);
1379
1380
if (_rtw_memcmp(precvframe->u.hdr.rx_data, pcloneframe->u.hdr.rx_data, precvframe->u.hdr.len) == _FALSE)
1381
RTW_INFO("%s [WARN] recv_frame rx_data compare failed\n", __func__);
1382
1383
}
1384
#endif
1385
1386
static s32 _rtw_mi_buddy_clone_bcmc_packet(_adapter *adapter, union recv_frame *precvframe, u8 *pphy_status, union recv_frame *pcloneframe)
1387
{
1388
s32 ret = _SUCCESS;
1389
#ifdef CONFIG_SKB_ALLOCATED
1390
u8 *pbuf = precvframe->u.hdr.rx_data;
1391
#endif
1392
struct rx_pkt_attrib *pattrib = NULL;
1393
1394
if (pcloneframe) {
1395
pcloneframe->u.hdr.adapter = adapter;
1396
1397
_rtw_init_listhead(&pcloneframe->u.hdr.list);
1398
pcloneframe->u.hdr.precvbuf = NULL; /*can't access the precvbuf for new arch.*/
1399
pcloneframe->u.hdr.len = 0;
1400
1401
_rtw_memcpy(&pcloneframe->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib));
1402
1403
pattrib = &pcloneframe->u.hdr.attrib;
1404
#ifdef CONFIG_SKB_ALLOCATED
1405
if (rtw_os_alloc_recvframe(adapter, pcloneframe, pbuf, NULL) == _SUCCESS)
1406
#else
1407
if (rtw_os_recvframe_duplicate_skb(adapter, pcloneframe, precvframe->u.hdr.pkt) == _SUCCESS)
1408
#endif
1409
{
1410
#ifdef CONFIG_SKB_ALLOCATED
1411
recvframe_put(pcloneframe, pattrib->pkt_len);
1412
#endif
1413
1414
#ifdef DBG_SKB_PROCESS
1415
rtw_dbg_skb_process(adapter, precvframe, pcloneframe);
1416
#endif
1417
1418
if (pphy_status)
1419
rx_query_phy_status(pcloneframe, pphy_status);
1420
1421
ret = rtw_recv_entry(pcloneframe);
1422
} else {
1423
ret = -1;
1424
RTW_INFO("%s()-%d: rtw_os_alloc_recvframe() failed!\n", __func__, __LINE__);
1425
}
1426
1427
}
1428
return ret;
1429
}
1430
1431
void rtw_mi_buddy_clone_bcmc_packet(_adapter *padapter, union recv_frame *precvframe, u8 *pphy_status)
1432
{
1433
int i;
1434
s32 ret = _SUCCESS;
1435
_adapter *iface = NULL;
1436
union recv_frame *pcloneframe = NULL;
1437
struct recv_priv *precvpriv = &padapter->recvpriv;/*primary_padapter*/
1438
_queue *pfree_recv_queue = &precvpriv->free_recv_queue;
1439
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1440
u8 *fhead = get_recvframe_data(precvframe);
1441
u8 type = GetFrameType(fhead);
1442
1443
for (i = 0; i < dvobj->iface_nums; i++) {
1444
iface = dvobj->padapters[i];
1445
if (!iface || iface == padapter)
1446
continue;
1447
if (rtw_is_adapter_up(iface) == _FALSE || iface->registered == 0)
1448
continue;
1449
if (type == WIFI_DATA_TYPE && !adapter_allow_bmc_data_rx(iface))
1450
continue;
1451
1452
pcloneframe = rtw_alloc_recvframe(pfree_recv_queue);
1453
if (pcloneframe) {
1454
ret = _rtw_mi_buddy_clone_bcmc_packet(iface, precvframe, pphy_status, pcloneframe);
1455
if (_SUCCESS != ret) {
1456
if (ret == -1)
1457
rtw_free_recvframe(pcloneframe, pfree_recv_queue);
1458
/*RTW_INFO(ADPT_FMT"-clone BC/MC frame failed\n", ADPT_ARG(iface));*/
1459
}
1460
}
1461
}
1462
1463
}
1464
1465
#ifdef CONFIG_PCI_HCI
1466
/*API be created temporary for MI, caller is interrupt-handler, PCIE's interrupt handler cannot apply to multi-AP*/
1467
_adapter *rtw_mi_get_ap_adapter(_adapter *padapter)
1468
{
1469
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1470
int i;
1471
_adapter *iface = NULL;
1472
1473
for (i = 0; i < dvobj->iface_nums; i++) {
1474
iface = dvobj->padapters[i];
1475
if (!iface)
1476
continue;
1477
1478
if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE
1479
&& check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
1480
break;
1481
1482
}
1483
return iface;
1484
}
1485
#endif
1486
1487
u8 rtw_mi_get_ld_sta_ifbmp(_adapter *adapter)
1488
{
1489
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1490
int i;
1491
_adapter *iface = NULL;
1492
u8 ifbmp = 0;
1493
1494
for (i = 0; i < dvobj->iface_nums; i++) {
1495
iface = dvobj->padapters[i];
1496
if (!iface)
1497
continue;
1498
1499
if (MLME_IS_STA(iface) && MLME_IS_ASOC(iface))
1500
ifbmp |= BIT(i);
1501
}
1502
1503
return ifbmp;
1504
}
1505
1506
u8 rtw_mi_get_ap_mesh_ifbmp(_adapter *adapter)
1507
{
1508
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1509
int i;
1510
_adapter *iface = NULL;
1511
u8 ifbmp = 0;
1512
1513
for (i = 0; i < dvobj->iface_nums; i++) {
1514
iface = dvobj->padapters[i];
1515
if (!iface)
1516
continue;
1517
1518
if (CHK_MLME_STATE(iface, WIFI_AP_STATE | WIFI_MESH_STATE)
1519
&& MLME_IS_ASOC(iface))
1520
ifbmp |= BIT(i);
1521
}
1522
1523
return ifbmp;
1524
}
1525
1526
void rtw_mi_update_ap_bmc_camid(_adapter *padapter, u8 camid_a, u8 camid_b)
1527
{
1528
#ifdef CONFIG_CONCURRENT_MODE
1529
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1530
struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
1531
1532
int i;
1533
_adapter *iface = NULL;
1534
1535
for (i = 0; i < dvobj->iface_nums; i++) {
1536
iface = dvobj->padapters[i];
1537
if (!iface)
1538
continue;
1539
1540
if (macid_ctl->iface_bmc[iface->iface_id] != INVALID_SEC_MAC_CAM_ID) {
1541
if (macid_ctl->iface_bmc[iface->iface_id] == camid_a)
1542
macid_ctl->iface_bmc[iface->iface_id] = camid_b;
1543
else if (macid_ctl->iface_bmc[iface->iface_id] == camid_b)
1544
macid_ctl->iface_bmc[iface->iface_id] = camid_a;
1545
iface->securitypriv.dot118021x_bmc_cam_id = macid_ctl->iface_bmc[iface->iface_id];
1546
}
1547
}
1548
#endif
1549
}
1550
1551
u8 rtw_mi_get_assoc_if_num(_adapter *adapter)
1552
{
1553
struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1554
u8 n_assoc_iface = 0;
1555
#if 1
1556
u8 i;
1557
1558
for (i = 0; i < dvobj->iface_nums; i++) {
1559
if (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))
1560
n_assoc_iface++;
1561
}
1562
#else
1563
n_assoc_iface = DEV_STA_LD_NUM(dvobj) + DEV_AP_NUM(dvobj) + DEV_ADHOC_NUM(dvobj) + DEV_MESH_NUM(dvobj);
1564
#endif
1565
return n_assoc_iface;
1566
}
1567
1568