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