xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8822be/core/rtw_mi.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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