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 #endif /* CONFIG_AP_MODE */
836
837 #ifndef CONFIG_MI_WITH_MBSSID_CAM
_rtw_mi_hal_dump_macaddr(_adapter * padapter,void * sel)838 static u8 _rtw_mi_hal_dump_macaddr(_adapter *padapter, void *sel)
839 {
840 u8 mac_addr[ETH_ALEN] = {0};
841
842 rtw_hal_get_hwreg(padapter, HW_VAR_MAC_ADDR, mac_addr);
843 RTW_PRINT_SEL(sel, ADPT_FMT"- hw port(%d) mac_addr ="MAC_FMT"\n",
844 ADPT_ARG(padapter), padapter->hw_port, MAC_ARG(mac_addr));
845
846 return _TRUE;
847 }
rtw_mi_hal_dump_macaddr(void * sel,_adapter * padapter)848 void rtw_mi_hal_dump_macaddr(void *sel, _adapter *padapter)
849 {
850 _rtw_mi_process(padapter, _FALSE, sel, _rtw_mi_hal_dump_macaddr);
851 }
rtw_mi_buddy_hal_dump_macaddr(void * sel,_adapter * padapter)852 void rtw_mi_buddy_hal_dump_macaddr(void *sel, _adapter *padapter)
853 {
854 _rtw_mi_process(padapter, _TRUE, sel, _rtw_mi_hal_dump_macaddr);
855 }
856 #endif
857
858 #ifdef CONFIG_PCI_HCI
_rtw_mi_xmit_tasklet_schedule(_adapter * padapter,void * data)859 static u8 _rtw_mi_xmit_tasklet_schedule(_adapter *padapter, void *data)
860 {
861 if (rtw_txframes_pending(padapter)) {
862 /* try to deal with the pending packets */
863 tasklet_hi_schedule(&(padapter->xmitpriv.xmit_tasklet));
864 }
865 return _TRUE;
866 }
rtw_mi_xmit_tasklet_schedule(_adapter * padapter)867 void rtw_mi_xmit_tasklet_schedule(_adapter *padapter)
868 {
869 _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_xmit_tasklet_schedule);
870 }
rtw_mi_buddy_xmit_tasklet_schedule(_adapter * padapter)871 void rtw_mi_buddy_xmit_tasklet_schedule(_adapter *padapter)
872 {
873 _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_xmit_tasklet_schedule);
874 }
875 #endif
876
_rtw_mi_busy_traffic_check(_adapter * padapter,void * data)877 u8 _rtw_mi_busy_traffic_check(_adapter *padapter, void *data)
878 {
879 return padapter->mlmepriv.LinkDetectInfo.bBusyTraffic;
880 }
881
rtw_mi_busy_traffic_check(_adapter * padapter)882 u8 rtw_mi_busy_traffic_check(_adapter *padapter)
883 {
884 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_busy_traffic_check);
885 }
rtw_mi_buddy_busy_traffic_check(_adapter * padapter)886 u8 rtw_mi_buddy_busy_traffic_check(_adapter *padapter)
887 {
888 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_busy_traffic_check);
889 }
_rtw_mi_check_mlmeinfo_state(_adapter * padapter,void * data)890 static u8 _rtw_mi_check_mlmeinfo_state(_adapter *padapter, void *data)
891 {
892 u32 state = *(u32 *)data;
893 struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
894
895 /*if (mlmeext_msr(mlmeext) == state)*/
896 if (check_mlmeinfo_state(mlmeext, state))
897 return _TRUE;
898 else
899 return _FALSE;
900 }
901
rtw_mi_check_mlmeinfo_state(_adapter * padapter,u32 state)902 u8 rtw_mi_check_mlmeinfo_state(_adapter *padapter, u32 state)
903 {
904 u32 in_data = state;
905
906 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_mlmeinfo_state);
907 }
908
rtw_mi_buddy_check_mlmeinfo_state(_adapter * padapter,u32 state)909 u8 rtw_mi_buddy_check_mlmeinfo_state(_adapter *padapter, u32 state)
910 {
911 u32 in_data = state;
912
913 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_mlmeinfo_state);
914 }
915
916 /*#define DBG_DUMP_FW_STATE*/
917 #ifdef DBG_DUMP_FW_STATE
rtw_dbg_dump_fwstate(_adapter * padapter,sint state)918 static void rtw_dbg_dump_fwstate(_adapter *padapter, sint state)
919 {
920 u8 buf[32] = {0};
921
922 if (state & WIFI_FW_NULL_STATE) {
923 _rtw_memset(buf, 0, 32);
924 sprintf(buf, "WIFI_FW_NULL_STATE");
925 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
926 }
927
928 if (state & WIFI_ASOC_STATE) {
929 _rtw_memset(buf, 0, 32);
930 sprintf(buf, "WIFI_ASOC_STATE");
931 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
932 }
933
934 if (state & WIFI_UNDER_LINKING) {
935 _rtw_memset(buf, 0, 32);
936 sprintf(buf, "WIFI_UNDER_LINKING");
937 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
938 }
939
940 if (state & WIFI_UNDER_SURVEY) {
941 _rtw_memset(buf, 0, 32);
942 sprintf(buf, "WIFI_UNDER_SURVEY");
943 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
944 }
945 }
946 #endif
947
_rtw_mi_check_fwstate(_adapter * padapter,void * data)948 static u8 _rtw_mi_check_fwstate(_adapter *padapter, void *data)
949 {
950 u8 ret = _FALSE;
951
952 sint state = *(sint *)data;
953
954 if ((state == WIFI_FW_NULL_STATE) &&
955 (padapter->mlmepriv.fw_state == WIFI_FW_NULL_STATE))
956 ret = _TRUE;
957 else if (_TRUE == check_fwstate(&padapter->mlmepriv, state))
958 ret = _TRUE;
959 #ifdef DBG_DUMP_FW_STATE
960 if (ret)
961 rtw_dbg_dump_fwstate(padapter, state);
962 #endif
963 return ret;
964 }
rtw_mi_check_fwstate(_adapter * padapter,sint state)965 u8 rtw_mi_check_fwstate(_adapter *padapter, sint state)
966 {
967 sint in_data = state;
968
969 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_fwstate);
970 }
rtw_mi_buddy_check_fwstate(_adapter * padapter,sint state)971 u8 rtw_mi_buddy_check_fwstate(_adapter *padapter, sint state)
972 {
973 sint in_data = state;
974
975 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_fwstate);
976 }
977
_rtw_mi_traffic_statistics(_adapter * padapter,void * data)978 static u8 _rtw_mi_traffic_statistics(_adapter *padapter , void *data)
979 {
980 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
981
982 /* Tx */
983 pdvobjpriv->traffic_stat.tx_bytes += padapter->xmitpriv.tx_bytes;
984 pdvobjpriv->traffic_stat.tx_pkts += padapter->xmitpriv.tx_pkts;
985 pdvobjpriv->traffic_stat.tx_drop += padapter->xmitpriv.tx_drop;
986
987 /* Rx */
988 pdvobjpriv->traffic_stat.rx_bytes += padapter->recvpriv.rx_bytes;
989 pdvobjpriv->traffic_stat.rx_pkts += padapter->recvpriv.rx_pkts;
990 pdvobjpriv->traffic_stat.rx_drop += padapter->recvpriv.rx_drop;
991 return _TRUE;
992 }
rtw_mi_traffic_statistics(_adapter * padapter)993 u8 rtw_mi_traffic_statistics(_adapter *padapter)
994 {
995 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_traffic_statistics);
996 }
997
_rtw_mi_check_miracast_enabled(_adapter * padapter,void * data)998 static u8 _rtw_mi_check_miracast_enabled(_adapter *padapter , void *data)
999 {
1000 return is_miracast_enabled(padapter);
1001 }
rtw_mi_check_miracast_enabled(_adapter * padapter)1002 u8 rtw_mi_check_miracast_enabled(_adapter *padapter)
1003 {
1004 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_miracast_enabled);
1005 }
1006
1007 #ifdef CONFIG_XMIT_THREAD_MODE
_rtw_mi_check_pending_xmitbuf(_adapter * padapter,void * data)1008 static u8 _rtw_mi_check_pending_xmitbuf(_adapter *padapter , void *data)
1009 {
1010 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1011
1012 return check_pending_xmitbuf(pxmitpriv);
1013 }
rtw_mi_check_pending_xmitbuf(_adapter * padapter)1014 u8 rtw_mi_check_pending_xmitbuf(_adapter *padapter)
1015 {
1016 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_pending_xmitbuf);
1017 }
rtw_mi_buddy_check_pending_xmitbuf(_adapter * padapter)1018 u8 rtw_mi_buddy_check_pending_xmitbuf(_adapter *padapter)
1019 {
1020 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_check_pending_xmitbuf);
1021 }
1022 #endif
1023
1024 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
_rtw_mi_dequeue_writeport(_adapter * padapter,bool exclude_self)1025 static u8 _rtw_mi_dequeue_writeport(_adapter *padapter , bool exclude_self)
1026 {
1027 int i;
1028 u8 queue_empty = _TRUE;
1029 _adapter *iface;
1030 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1031
1032 for (i = 0; i < dvobj->iface_nums; i++) {
1033 iface = dvobj->padapters[i];
1034 if ((iface) && rtw_is_adapter_up(iface)) {
1035
1036 if ((exclude_self) && (iface == padapter))
1037 continue;
1038
1039 queue_empty &= _dequeue_writeport(iface);
1040 }
1041 }
1042 return queue_empty;
1043 }
rtw_mi_dequeue_writeport(_adapter * padapter)1044 u8 rtw_mi_dequeue_writeport(_adapter *padapter)
1045 {
1046 return _rtw_mi_dequeue_writeport(padapter, _FALSE);
1047 }
rtw_mi_buddy_dequeue_writeport(_adapter * padapter)1048 u8 rtw_mi_buddy_dequeue_writeport(_adapter *padapter)
1049 {
1050 return _rtw_mi_dequeue_writeport(padapter, _TRUE);
1051 }
1052 #endif
_rtw_mi_adapter_reset(_adapter * padapter,u8 exclude_self)1053 static void _rtw_mi_adapter_reset(_adapter *padapter , u8 exclude_self)
1054 {
1055 int i;
1056 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1057
1058 for (i = 0; i < dvobj->iface_nums; i++) {
1059 if (dvobj->padapters[i]) {
1060 if ((exclude_self) && (dvobj->padapters[i] == padapter))
1061 continue;
1062 dvobj->padapters[i] = NULL;
1063 }
1064 }
1065 }
1066
rtw_mi_adapter_reset(_adapter * padapter)1067 void rtw_mi_adapter_reset(_adapter *padapter)
1068 {
1069 _rtw_mi_adapter_reset(padapter, _FALSE);
1070 }
1071
rtw_mi_buddy_adapter_reset(_adapter * padapter)1072 void rtw_mi_buddy_adapter_reset(_adapter *padapter)
1073 {
1074 _rtw_mi_adapter_reset(padapter, _TRUE);
1075 }
1076
_rtw_mi_dynamic_check_timer_handlder(_adapter * adapter,void * data)1077 static u8 _rtw_mi_dynamic_check_timer_handlder(_adapter *adapter, void *data)
1078 {
1079 rtw_iface_dynamic_check_timer_handlder(adapter);
1080 return _TRUE;
1081 }
rtw_mi_dynamic_check_timer_handlder(_adapter * padapter)1082 u8 rtw_mi_dynamic_check_timer_handlder(_adapter *padapter)
1083 {
1084 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_check_timer_handlder);
1085 }
rtw_mi_buddy_dynamic_check_timer_handlder(_adapter * padapter)1086 u8 rtw_mi_buddy_dynamic_check_timer_handlder(_adapter *padapter)
1087 {
1088 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_check_timer_handlder);
1089 }
1090
_rtw_mi_dynamic_chk_wk_hdl(_adapter * adapter,void * data)1091 static u8 _rtw_mi_dynamic_chk_wk_hdl(_adapter *adapter, void *data)
1092 {
1093 rtw_iface_dynamic_chk_wk_hdl(adapter);
1094 return _TRUE;
1095 }
rtw_mi_dynamic_chk_wk_hdl(_adapter * padapter)1096 u8 rtw_mi_dynamic_chk_wk_hdl(_adapter *padapter)
1097 {
1098 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_chk_wk_hdl);
1099 }
rtw_mi_buddy_dynamic_chk_wk_hdl(_adapter * padapter)1100 u8 rtw_mi_buddy_dynamic_chk_wk_hdl(_adapter *padapter)
1101 {
1102 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_chk_wk_hdl);
1103 }
1104
_rtw_mi_os_xmit_schedule(_adapter * adapter,void * data)1105 static u8 _rtw_mi_os_xmit_schedule(_adapter *adapter, void *data)
1106 {
1107 rtw_os_xmit_schedule(adapter);
1108 return _TRUE;
1109 }
rtw_mi_os_xmit_schedule(_adapter * padapter)1110 u8 rtw_mi_os_xmit_schedule(_adapter *padapter)
1111 {
1112 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_os_xmit_schedule);
1113 }
rtw_mi_buddy_os_xmit_schedule(_adapter * padapter)1114 u8 rtw_mi_buddy_os_xmit_schedule(_adapter *padapter)
1115 {
1116 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_os_xmit_schedule);
1117 }
1118
_rtw_mi_report_survey_event(_adapter * adapter,void * data)1119 static u8 _rtw_mi_report_survey_event(_adapter *adapter, void *data)
1120 {
1121 union recv_frame *precv_frame = (union recv_frame *)data;
1122
1123 report_survey_event(adapter, precv_frame);
1124 return _TRUE;
1125 }
rtw_mi_report_survey_event(_adapter * padapter,union recv_frame * precv_frame)1126 u8 rtw_mi_report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
1127 {
1128 return _rtw_mi_process(padapter, _FALSE, precv_frame, _rtw_mi_report_survey_event);
1129 }
rtw_mi_buddy_report_survey_event(_adapter * padapter,union recv_frame * precv_frame)1130 u8 rtw_mi_buddy_report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
1131 {
1132 return _rtw_mi_process(padapter, _TRUE, precv_frame, _rtw_mi_report_survey_event);
1133 }
1134
_rtw_mi_sreset_adapter_hdl(_adapter * adapter,void * data)1135 static u8 _rtw_mi_sreset_adapter_hdl(_adapter *adapter, void *data)
1136 {
1137 u8 bstart = *(u8 *)data;
1138
1139 if (bstart)
1140 sreset_start_adapter(adapter);
1141 else
1142 sreset_stop_adapter(adapter);
1143 return _TRUE;
1144 }
rtw_mi_sreset_adapter_hdl(_adapter * padapter,u8 bstart)1145 u8 rtw_mi_sreset_adapter_hdl(_adapter *padapter, u8 bstart)
1146 {
1147 u8 in_data = bstart;
1148
1149 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_sreset_adapter_hdl);
1150 }
1151
1152 #if defined(CONFIG_AP_MODE) && defined(DBG_CONFIG_ERROR_RESET) && defined(CONFIG_CONCURRENT_MODE)
rtw_mi_ap_info_restore(_adapter * adapter)1153 void rtw_mi_ap_info_restore(_adapter *adapter)
1154 {
1155 int i;
1156 _adapter *iface;
1157 struct mlme_priv *pmlmepriv;
1158 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1159
1160 for (i = 0; i < dvobj->iface_nums; i++) {
1161 iface = dvobj->padapters[i];
1162 if (iface) {
1163 pmlmepriv = &iface->mlmepriv;
1164
1165 if (MLME_IS_AP(iface) || MLME_IS_MESH(iface)) {
1166 RTW_INFO(FUNC_ADPT_FMT" %s\n", FUNC_ADPT_ARG(iface), MLME_IS_AP(iface) ? "AP" : "MESH");
1167 rtw_iface_bcmc_sec_cam_map_restore(iface);
1168 }
1169 }
1170 }
1171 }
1172 #endif /*#if defined(DBG_CONFIG_ERROR_RESET) && defined(CONFIG_CONCURRENT_MODE)*/
1173
rtw_mi_buddy_sreset_adapter_hdl(_adapter * padapter,u8 bstart)1174 u8 rtw_mi_buddy_sreset_adapter_hdl(_adapter *padapter, u8 bstart)
1175 {
1176 u8 in_data = bstart;
1177
1178 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_sreset_adapter_hdl);
1179 }
1180
1181 #ifdef CONFIG_AP_MODE
_rtw_mi_tx_beacon_hdl(_adapter * adapter,void * data)1182 static u8 _rtw_mi_tx_beacon_hdl(_adapter *adapter, void *data)
1183 {
1184 if ((MLME_IS_AP(adapter) || MLME_IS_MESH(adapter))
1185 && check_fwstate(&adapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE
1186 ) {
1187 adapter->mlmepriv.update_bcn = _TRUE;
1188 #ifndef CONFIG_INTERRUPT_BASED_TXBCN
1189 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) || defined(CONFIG_PCI_BCN_POLLING)
1190 tx_beacon_hdl(adapter, NULL);
1191 #endif
1192 #endif
1193 }
1194 return _TRUE;
1195 }
rtw_mi_tx_beacon_hdl(_adapter * padapter)1196 u8 rtw_mi_tx_beacon_hdl(_adapter *padapter)
1197 {
1198 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_tx_beacon_hdl);
1199 }
rtw_mi_buddy_tx_beacon_hdl(_adapter * padapter)1200 u8 rtw_mi_buddy_tx_beacon_hdl(_adapter *padapter)
1201 {
1202 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_sreset_adapter_hdl);
1203 }
1204
_rtw_mi_set_tx_beacon_cmd(_adapter * adapter,void * data)1205 static u8 _rtw_mi_set_tx_beacon_cmd(_adapter *adapter, void *data)
1206 {
1207 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1208
1209 if (MLME_IS_AP(adapter) || MLME_IS_MESH(adapter)) {
1210 if (pmlmepriv->update_bcn == _TRUE)
1211 set_tx_beacon_cmd(adapter, 0);
1212 }
1213 return _TRUE;
1214 }
rtw_mi_set_tx_beacon_cmd(_adapter * padapter)1215 u8 rtw_mi_set_tx_beacon_cmd(_adapter *padapter)
1216 {
1217 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_set_tx_beacon_cmd);
1218 }
rtw_mi_buddy_set_tx_beacon_cmd(_adapter * padapter)1219 u8 rtw_mi_buddy_set_tx_beacon_cmd(_adapter *padapter)
1220 {
1221 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_set_tx_beacon_cmd);
1222 }
1223 #endif /* CONFIG_AP_MODE */
1224
1225 #ifdef CONFIG_P2P
_rtw_mi_p2p_chk_state(_adapter * adapter,void * data)1226 static u8 _rtw_mi_p2p_chk_state(_adapter *adapter, void *data)
1227 {
1228 struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
1229 enum P2P_STATE state = *(enum P2P_STATE *)data;
1230
1231 return rtw_p2p_chk_state(pwdinfo, state);
1232 }
rtw_mi_p2p_chk_state(_adapter * padapter,enum P2P_STATE p2p_state)1233 u8 rtw_mi_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state)
1234 {
1235 u8 in_data = p2p_state;
1236
1237 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_p2p_chk_state);
1238 }
rtw_mi_buddy_p2p_chk_state(_adapter * padapter,enum P2P_STATE p2p_state)1239 u8 rtw_mi_buddy_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state)
1240 {
1241 u8 in_data = p2p_state;
1242
1243 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_p2p_chk_state);
1244 }
_rtw_mi_stay_in_p2p_mode(_adapter * adapter,void * data)1245 static u8 _rtw_mi_stay_in_p2p_mode(_adapter *adapter, void *data)
1246 {
1247 struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
1248
1249 if (rtw_p2p_role(pwdinfo) != P2P_ROLE_DISABLE)
1250 return _TRUE;
1251 return _FALSE;
1252 }
rtw_mi_stay_in_p2p_mode(_adapter * padapter)1253 u8 rtw_mi_stay_in_p2p_mode(_adapter *padapter)
1254 {
1255 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_stay_in_p2p_mode);
1256 }
rtw_mi_buddy_stay_in_p2p_mode(_adapter * padapter)1257 u8 rtw_mi_buddy_stay_in_p2p_mode(_adapter *padapter)
1258 {
1259 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_stay_in_p2p_mode);
1260 }
1261 #endif /*CONFIG_P2P*/
1262
rtw_get_iface_by_id(_adapter * padapter,u8 iface_id)1263 _adapter *rtw_get_iface_by_id(_adapter *padapter, u8 iface_id)
1264 {
1265 _adapter *iface = NULL;
1266 struct dvobj_priv *dvobj;
1267
1268 if ((padapter == NULL) || (iface_id >= CONFIG_IFACE_NUMBER)) {
1269 rtw_warn_on(1);
1270 return iface;
1271 }
1272
1273 dvobj = adapter_to_dvobj(padapter);
1274 return dvobj->padapters[iface_id];
1275 }
1276
rtw_get_iface_by_macddr(_adapter * padapter,const u8 * mac_addr)1277 _adapter *rtw_get_iface_by_macddr(_adapter *padapter, const u8 *mac_addr)
1278 {
1279 int i;
1280 _adapter *iface = NULL;
1281 u8 bmatch = _FALSE;
1282 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1283
1284 for (i = 0; i < dvobj->iface_nums; i++) {
1285 iface = dvobj->padapters[i];
1286 if ((iface) && (_rtw_memcmp(mac_addr, adapter_mac_addr(iface), ETH_ALEN))) {
1287 bmatch = _TRUE;
1288 break;
1289 }
1290 }
1291 if (bmatch)
1292 return iface;
1293 else
1294 return NULL;
1295 }
1296
rtw_get_iface_by_hwport(_adapter * padapter,u8 hw_port)1297 _adapter *rtw_get_iface_by_hwport(_adapter *padapter, u8 hw_port)
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) && (hw_port == iface->hw_port)) {
1307 bmatch = _TRUE;
1308 break;
1309 }
1310 }
1311 if (bmatch)
1312 return iface;
1313 else
1314 return NULL;
1315 }
1316
1317 /*#define CONFIG_SKB_ALLOCATED*/
1318 #define DBG_SKB_PROCESS
1319 #ifdef DBG_SKB_PROCESS
rtw_dbg_skb_process(_adapter * padapter,union recv_frame * precvframe,union recv_frame * pcloneframe)1320 void rtw_dbg_skb_process(_adapter *padapter, union recv_frame *precvframe, union recv_frame *pcloneframe)
1321 {
1322 _pkt *pkt_copy, *pkt_org;
1323
1324 pkt_org = precvframe->u.hdr.pkt;
1325 pkt_copy = pcloneframe->u.hdr.pkt;
1326 /*
1327 RTW_INFO("%s ===== ORG SKB =====\n", __func__);
1328 RTW_INFO(" SKB head(%p)\n", pkt_org->head);
1329 RTW_INFO(" SKB data(%p)\n", pkt_org->data);
1330 RTW_INFO(" SKB tail(%p)\n", pkt_org->tail);
1331 RTW_INFO(" SKB end(%p)\n", pkt_org->end);
1332
1333 RTW_INFO(" recv frame head(%p)\n", precvframe->u.hdr.rx_head);
1334 RTW_INFO(" recv frame data(%p)\n", precvframe->u.hdr.rx_data);
1335 RTW_INFO(" recv frame tail(%p)\n", precvframe->u.hdr.rx_tail);
1336 RTW_INFO(" recv frame end(%p)\n", precvframe->u.hdr.rx_end);
1337
1338 RTW_INFO("%s ===== COPY SKB =====\n", __func__);
1339 RTW_INFO(" SKB head(%p)\n", pkt_copy->head);
1340 RTW_INFO(" SKB data(%p)\n", pkt_copy->data);
1341 RTW_INFO(" SKB tail(%p)\n", pkt_copy->tail);
1342 RTW_INFO(" SKB end(%p)\n", pkt_copy->end);
1343
1344 RTW_INFO(" recv frame head(%p)\n", pcloneframe->u.hdr.rx_head);
1345 RTW_INFO(" recv frame data(%p)\n", pcloneframe->u.hdr.rx_data);
1346 RTW_INFO(" recv frame tail(%p)\n", pcloneframe->u.hdr.rx_tail);
1347 RTW_INFO(" recv frame end(%p)\n", pcloneframe->u.hdr.rx_end);
1348 */
1349 /*
1350 RTW_INFO("%s => recv_frame adapter(%p,%p)\n", __func__, precvframe->u.hdr.adapter, pcloneframe->u.hdr.adapter);
1351 RTW_INFO("%s => recv_frame dev(%p,%p)\n", __func__, pkt_org->dev , pkt_copy->dev);
1352 RTW_INFO("%s => recv_frame len(%d,%d)\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len);
1353 */
1354 if (precvframe->u.hdr.len != pcloneframe->u.hdr.len)
1355 RTW_INFO("%s [WARN] recv_frame length(%d:%d) compare failed\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len);
1356
1357 if (_rtw_memcmp(&precvframe->u.hdr.attrib, &pcloneframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib)) == _FALSE)
1358 RTW_INFO("%s [WARN] recv_frame attrib compare failed\n", __func__);
1359
1360 if (_rtw_memcmp(precvframe->u.hdr.rx_data, pcloneframe->u.hdr.rx_data, precvframe->u.hdr.len) == _FALSE)
1361 RTW_INFO("%s [WARN] recv_frame rx_data compare failed\n", __func__);
1362
1363 }
1364 #endif
1365
_rtw_mi_buddy_clone_bcmc_packet(_adapter * adapter,union recv_frame * precvframe,u8 * pphy_status,union recv_frame * pcloneframe)1366 static s32 _rtw_mi_buddy_clone_bcmc_packet(_adapter *adapter, union recv_frame *precvframe, u8 *pphy_status, union recv_frame *pcloneframe)
1367 {
1368 s32 ret = _SUCCESS;
1369 #ifdef CONFIG_SKB_ALLOCATED
1370 u8 *pbuf = precvframe->u.hdr.rx_data;
1371 #endif
1372 struct rx_pkt_attrib *pattrib = NULL;
1373
1374 if (pcloneframe) {
1375 pcloneframe->u.hdr.adapter = adapter;
1376
1377 _rtw_init_listhead(&pcloneframe->u.hdr.list);
1378 pcloneframe->u.hdr.precvbuf = NULL; /*can't access the precvbuf for new arch.*/
1379 pcloneframe->u.hdr.len = 0;
1380
1381 _rtw_memcpy(&pcloneframe->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib));
1382
1383 pattrib = &pcloneframe->u.hdr.attrib;
1384 #ifdef CONFIG_SKB_ALLOCATED
1385 if (rtw_os_alloc_recvframe(adapter, pcloneframe, pbuf, NULL) == _SUCCESS)
1386 #else
1387 if (rtw_os_recvframe_duplicate_skb(adapter, pcloneframe, precvframe->u.hdr.pkt) == _SUCCESS)
1388 #endif
1389 {
1390 #ifdef CONFIG_SKB_ALLOCATED
1391 recvframe_put(pcloneframe, pattrib->pkt_len);
1392 #endif
1393
1394 #ifdef DBG_SKB_PROCESS
1395 rtw_dbg_skb_process(adapter, precvframe, pcloneframe);
1396 #endif
1397
1398 if (pphy_status)
1399 rx_query_phy_status(pcloneframe, pphy_status);
1400
1401 ret = rtw_recv_entry(pcloneframe);
1402 } else {
1403 ret = -1;
1404 RTW_INFO("%s()-%d: rtw_os_alloc_recvframe() failed!\n", __func__, __LINE__);
1405 }
1406
1407 }
1408 return ret;
1409 }
1410
rtw_mi_buddy_clone_bcmc_packet(_adapter * padapter,union recv_frame * precvframe,u8 * pphy_status)1411 void rtw_mi_buddy_clone_bcmc_packet(_adapter *padapter, union recv_frame *precvframe, u8 *pphy_status)
1412 {
1413 int i;
1414 s32 ret = _SUCCESS;
1415 _adapter *iface = NULL;
1416 union recv_frame *pcloneframe = NULL;
1417 struct recv_priv *precvpriv = &padapter->recvpriv;/*primary_padapter*/
1418 _queue *pfree_recv_queue = &precvpriv->free_recv_queue;
1419 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1420 u8 *fhead = get_recvframe_data(precvframe);
1421 u8 type = GetFrameType(fhead);
1422
1423 for (i = 0; i < dvobj->iface_nums; i++) {
1424 iface = dvobj->padapters[i];
1425 if (!iface || iface == padapter)
1426 continue;
1427 if (rtw_is_adapter_up(iface) == _FALSE || iface->registered == 0)
1428 continue;
1429 if (type == WIFI_DATA_TYPE && !adapter_allow_bmc_data_rx(iface))
1430 continue;
1431
1432 pcloneframe = rtw_alloc_recvframe(pfree_recv_queue);
1433 if (pcloneframe) {
1434 ret = _rtw_mi_buddy_clone_bcmc_packet(iface, precvframe, pphy_status, pcloneframe);
1435 if (_SUCCESS != ret) {
1436 if (ret == -1)
1437 rtw_free_recvframe(pcloneframe, pfree_recv_queue);
1438 /*RTW_INFO(ADPT_FMT"-clone BC/MC frame failed\n", ADPT_ARG(iface));*/
1439 }
1440 }
1441 }
1442
1443 }
1444
1445 #ifdef CONFIG_PCI_HCI
1446 /*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)1447 _adapter *rtw_mi_get_ap_adapter(_adapter *padapter)
1448 {
1449 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1450 int i;
1451 _adapter *iface = NULL;
1452
1453 for (i = 0; i < dvobj->iface_nums; i++) {
1454 iface = dvobj->padapters[i];
1455 if (!iface)
1456 continue;
1457
1458 if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE
1459 && check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
1460 break;
1461
1462 }
1463 return iface;
1464 }
1465 #endif
1466
rtw_mi_get_ld_sta_ifbmp(_adapter * adapter)1467 u8 rtw_mi_get_ld_sta_ifbmp(_adapter *adapter)
1468 {
1469 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1470 int i;
1471 _adapter *iface = NULL;
1472 u8 ifbmp = 0;
1473
1474 for (i = 0; i < dvobj->iface_nums; i++) {
1475 iface = dvobj->padapters[i];
1476 if (!iface)
1477 continue;
1478
1479 if (MLME_IS_STA(iface) && MLME_IS_ASOC(iface))
1480 ifbmp |= BIT(i);
1481 }
1482
1483 return ifbmp;
1484 }
1485
rtw_mi_get_ap_mesh_ifbmp(_adapter * adapter)1486 u8 rtw_mi_get_ap_mesh_ifbmp(_adapter *adapter)
1487 {
1488 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1489 int i;
1490 _adapter *iface = NULL;
1491 u8 ifbmp = 0;
1492
1493 for (i = 0; i < dvobj->iface_nums; i++) {
1494 iface = dvobj->padapters[i];
1495 if (!iface)
1496 continue;
1497
1498 if (CHK_MLME_STATE(iface, WIFI_AP_STATE | WIFI_MESH_STATE)
1499 && MLME_IS_ASOC(iface))
1500 ifbmp |= BIT(i);
1501 }
1502
1503 return ifbmp;
1504 }
1505
rtw_mi_update_ap_bmc_camid(_adapter * padapter,u8 camid_a,u8 camid_b)1506 void rtw_mi_update_ap_bmc_camid(_adapter *padapter, u8 camid_a, u8 camid_b)
1507 {
1508 #ifdef CONFIG_CONCURRENT_MODE
1509 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1510 struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
1511
1512 int i;
1513 _adapter *iface = NULL;
1514
1515 for (i = 0; i < dvobj->iface_nums; i++) {
1516 iface = dvobj->padapters[i];
1517 if (!iface)
1518 continue;
1519
1520 if (macid_ctl->iface_bmc[iface->iface_id] != INVALID_SEC_MAC_CAM_ID) {
1521 if (macid_ctl->iface_bmc[iface->iface_id] == camid_a)
1522 macid_ctl->iface_bmc[iface->iface_id] = camid_b;
1523 else if (macid_ctl->iface_bmc[iface->iface_id] == camid_b)
1524 macid_ctl->iface_bmc[iface->iface_id] = camid_a;
1525 iface->securitypriv.dot118021x_bmc_cam_id = macid_ctl->iface_bmc[iface->iface_id];
1526 }
1527 }
1528 #endif
1529 }
1530
rtw_mi_get_assoc_if_num(_adapter * adapter)1531 u8 rtw_mi_get_assoc_if_num(_adapter *adapter)
1532 {
1533 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
1534 u8 n_assoc_iface = 0;
1535 #if 1
1536 u8 i;
1537
1538 for (i = 0; i < dvobj->iface_nums; i++) {
1539 if (check_fwstate(&(dvobj->padapters[i]->mlmepriv), WIFI_ASOC_STATE))
1540 n_assoc_iface++;
1541 }
1542 #else
1543 n_assoc_iface = DEV_STA_LD_NUM(dvobj) + DEV_AP_NUM(dvobj) + DEV_ADHOC_NUM(dvobj) + DEV_MESH_NUM(dvobj);
1544 #endif
1545 return n_assoc_iface;
1546 }
1547