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