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