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