1 /******************************************************************************
3 * Copyright(c) 2007 - 2015 Realtek Corporation. All rights reserved.
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.
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
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 #include <drv_types.h>
25 void rtw_mi_update_union_chan_inf(_adapter *adapter, u8 ch, u8 offset , u8 bw)
27 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
28 struct mi_state *iface_state = &dvobj->iface_state;
30 iface_state->union_ch = ch;
31 iface_state->union_bw = bw;
32 iface_state->union_offset = offset;
35 /* Find union about ch, bw, ch_offset of all linked/linking interfaces */
36 int _rtw_mi_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset, bool include_self)
38 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
40 struct mlme_ext_priv *mlmeext;
43 u8 bw_ret = CHANNEL_WIDTH_20;
44 u8 offset_ret = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
50 *bw = CHANNEL_WIDTH_20;
52 *offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
54 for (i = 0; i < dvobj->iface_nums; i++) {
55 iface = dvobj->padapters[i];
56 mlmeext = &iface->mlmeextpriv;
58 if (!check_fwstate(&iface->mlmepriv, _FW_LINKED | _FW_UNDER_LINKING))
61 if (check_fwstate(&iface->mlmepriv, WIFI_OP_CH_SWITCHING))
64 if (include_self == _FALSE && adapter == iface)
68 ch_ret = mlmeext->cur_channel;
69 bw_ret = mlmeext->cur_bwmode;
70 offset_ret = mlmeext->cur_ch_offset;
75 if (ch_ret != mlmeext->cur_channel) {
80 if (bw_ret < mlmeext->cur_bwmode) {
81 bw_ret = mlmeext->cur_bwmode;
82 offset_ret = mlmeext->cur_ch_offset;
83 } else if (bw_ret == mlmeext->cur_bwmode && offset_ret != mlmeext->cur_ch_offset) {
103 inline int rtw_mi_get_ch_setting_union(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)
105 return _rtw_mi_get_ch_setting_union(adapter, ch, bw, offset, 1);
108 inline int rtw_mi_get_ch_setting_union_no_self(_adapter *adapter, u8 *ch, u8 *bw, u8 *offset)
110 return _rtw_mi_get_ch_setting_union(adapter, ch, bw, offset, 0);
113 /* For now, not return union_ch/bw/offset */
114 void _rtw_mi_status(_adapter *adapter, struct mi_state *mstate, bool include_self)
116 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
120 _rtw_memset(mstate, 0, sizeof(struct mi_state));
122 for (i = 0; i < dvobj->iface_nums; i++) {
123 iface = dvobj->padapters[i];
125 if (include_self == _FALSE && iface == adapter)
128 if (check_fwstate(&iface->mlmepriv, WIFI_STATION_STATE) == _TRUE) {
129 MSTATE_STA_NUM(mstate)++;
130 if (check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE)
131 MSTATE_STA_LD_NUM(mstate)++;
133 if (check_fwstate(&iface->mlmepriv, _FW_UNDER_LINKING) == _TRUE)
134 MSTATE_STA_LG_NUM(mstate)++;
136 } else if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE
137 && check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE
139 MSTATE_AP_NUM(mstate)++;
140 if (iface->stapriv.asoc_sta_count > 2)
141 MSTATE_AP_LD_NUM(mstate)++;
143 } else if (check_fwstate(&iface->mlmepriv, WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) == _TRUE
144 && check_fwstate(&iface->mlmepriv, _FW_LINKED) == _TRUE
146 MSTATE_ADHOC_NUM(mstate)++;
147 if (iface->stapriv.asoc_sta_count > 2)
148 MSTATE_ADHOC_LD_NUM(mstate)++;
151 if (check_fwstate(&iface->mlmepriv, WIFI_UNDER_WPS) == _TRUE)
152 MSTATE_WPS_NUM(mstate)++;
154 #ifdef CONFIG_IOCTL_CFG80211
155 if (rtw_cfg80211_get_is_mgmt_tx(iface))
156 MSTATE_MGMT_TX_NUM(mstate)++;
158 if (rtw_cfg80211_get_is_roch(iface) == _TRUE)
159 MSTATE_ROCH_NUM(mstate)++;
161 #endif /* CONFIG_IOCTL_CFG80211 */
166 inline void rtw_mi_status(_adapter *adapter, struct mi_state *mstate)
168 return _rtw_mi_status(adapter, mstate, 1);
170 inline void rtw_mi_status_no_self(_adapter *adapter, struct mi_state *mstate)
172 return _rtw_mi_status(adapter, mstate, 0);
174 void dump_mi_status(void *sel, struct dvobj_priv *dvobj)
176 RTW_PRINT_SEL(sel, "== dvobj-iface_state ==\n");
177 RTW_PRINT_SEL(sel, "sta_num:%d\n", DEV_STA_NUM(dvobj));
178 RTW_PRINT_SEL(sel, "linking_sta_num:%d\n", DEV_STA_LG_NUM(dvobj));
179 RTW_PRINT_SEL(sel, "linked_sta_num:%d\n", DEV_STA_LD_NUM(dvobj));
180 RTW_PRINT_SEL(sel, "ap_num:%d\n", DEV_AP_NUM(dvobj));
181 RTW_PRINT_SEL(sel, "linked_ap_num:%d\n", DEV_AP_LD_NUM(dvobj));
182 RTW_PRINT_SEL(sel, "adhoc_num:%d\n", DEV_ADHOC_NUM(dvobj));
183 RTW_PRINT_SEL(sel, "linked_adhoc_num:%d\n", DEV_ADHOC_LD_NUM(dvobj));
185 RTW_PRINT_SEL(sel, "p2p_device_num:%d\n", rtw_mi_stay_in_p2p_mode(dvobj->padapters[IFACE_ID0]));
187 #if defined(CONFIG_IOCTL_CFG80211)
188 #if defined(CONFIG_P2P)
189 RTW_PRINT_SEL(sel, "roch_num:%d\n", DEV_ROCH_NUM(dvobj));
191 RTW_PRINT_SEL(sel, "mgmt_tx_num:%d\n", DEV_MGMT_TX_NUM(dvobj));
193 RTW_PRINT_SEL(sel, "under_wps_num:%d\n", DEV_WPS_NUM(dvobj));
194 RTW_PRINT_SEL(sel, "union_ch:%d\n", DEV_U_CH(dvobj));
195 RTW_PRINT_SEL(sel, "union_bw:%d\n", DEV_U_BW(dvobj));
196 RTW_PRINT_SEL(sel, "union_offset:%d\n", DEV_U_OFFSET(dvobj));
197 RTW_PRINT_SEL(sel, "================\n\n");
200 void dump_dvobj_mi_status(void *sel, const char *fun_name, _adapter *adapter)
202 RTW_INFO("\n[ %s ] call %s\n", fun_name, __func__);
203 dump_mi_status(sel, adapter_to_dvobj(adapter));
206 inline void rtw_mi_update_iface_status(struct mlme_priv *pmlmepriv, sint state)
208 _adapter *adapter = container_of(pmlmepriv, _adapter, mlmepriv);
209 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
210 struct mi_state *iface_state = &dvobj->iface_state;
211 struct mi_state tmp_mstate;
213 u8 u_ch, u_offset, u_bw;
216 if (state == WIFI_MONITOR_STATE
217 || state == WIFI_SITE_MONITOR
218 || state == 0xFFFFFFFF
223 RTW_INFO("%s => will change or clean state to 0x%08x\n", __func__, state);
225 rtw_mi_status(adapter, &tmp_mstate);
226 _rtw_memcpy(iface_state, &tmp_mstate, sizeof(struct mi_state));
228 if (rtw_mi_get_ch_setting_union(adapter, &u_ch, &u_bw, &u_offset))
229 rtw_mi_update_union_chan_inf(adapter , u_ch, u_offset , u_bw);
232 dump_adapters_status(RTW_DBGDUMP , dvobj);
233 RTW_INFO("%s-[ERROR] cannot get union channel\n", __func__);
238 #ifdef DBG_IFACE_STATUS
239 DBG_IFACE_STATUS_DUMP(adapter);
242 u8 rtw_mi_check_status(_adapter *adapter, u8 type)
244 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
245 struct mi_state *iface_state = &dvobj->iface_state;
248 #ifdef DBG_IFACE_STATUS
249 DBG_IFACE_STATUS_DUMP(adapter);
250 RTW_INFO("%s-"ADPT_FMT" check type:%d\n", __func__, ADPT_ARG(adapter), type);
255 if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_NUM(iface_state) || MSTATE_ADHOC_NUM(iface_state)) /*check_fwstate(&iface->mlmepriv, _FW_LINKED)*/
259 if (MSTATE_STA_LD_NUM(iface_state) || MSTATE_AP_LD_NUM(iface_state) || MSTATE_ADHOC_LD_NUM(iface_state))
263 if (MSTATE_WPS_NUM(iface_state))
268 if (MSTATE_AP_NUM(iface_state))
272 if (MSTATE_AP_LD_NUM(iface_state))
277 if (MSTATE_ADHOC_NUM(iface_state))
281 if (MSTATE_ADHOC_LD_NUM(iface_state))
285 case MI_STA_NOLINK: /* this is misleading, but not used now */
286 if (MSTATE_STA_NUM(iface_state) && (!(MSTATE_STA_LD_NUM(iface_state) || MSTATE_STA_LG_NUM(iface_state))))
290 if (MSTATE_STA_LD_NUM(iface_state))
294 if (MSTATE_STA_LG_NUM(iface_state))
304 u8 rtw_mi_mp_mode_check(_adapter *padapter)
306 #ifdef CONFIG_MP_INCLUDED
307 #ifdef CONFIG_CONCURRENT_MODE
309 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
310 _adapter *iface = NULL;
312 for (i = 0; i < dvobj->iface_nums; i++) {
313 iface = dvobj->padapters[i];
315 if ((iface) && (iface->registrypriv.mp_mode == 1))
319 if (padapter->registrypriv.mp_mode == 1)
322 #endif /* CONFIG_MP_INCLUDED */
327 * return value : 0 is failed or have not interface meet condition
328 * return value : !0 is success or interface numbers which meet condition
329 * return value of ops_func must be _TRUE or _FALSE
331 static u8 _rtw_mi_process(_adapter *padapter, bool exclude_self,
332 void *data, u8(*ops_func)(_adapter *padapter, void *data))
336 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
340 for (i = 0; i < dvobj->iface_nums; i++) {
341 iface = dvobj->padapters[i];
342 if ((iface) && rtw_is_adapter_up(iface)) {
344 if ((exclude_self) && (iface == padapter))
348 if (_TRUE == ops_func(iface, data))
354 static u8 _rtw_mi_netif_stop_queue(_adapter *padapter, void *data)
356 bool carrier_off = *(bool *)data;
357 struct net_device *pnetdev = padapter->pnetdev;
360 netif_carrier_off(pnetdev);
361 rtw_netif_stop_queue(pnetdev);
364 u8 rtw_mi_netif_stop_queue(_adapter *padapter, bool carrier_off)
366 bool in_data = carrier_off;
368 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_netif_stop_queue);
370 u8 rtw_mi_buddy_netif_stop_queue(_adapter *padapter, bool carrier_off)
372 bool in_data = carrier_off;
374 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_netif_stop_queue);
377 static u8 _rtw_mi_netif_wake_queue(_adapter *padapter, void *data)
379 struct net_device *pnetdev = padapter->pnetdev;
382 rtw_netif_wake_queue(pnetdev);
385 u8 rtw_mi_netif_wake_queue(_adapter *padapter)
387 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_wake_queue);
389 u8 rtw_mi_buddy_netif_wake_queue(_adapter *padapter)
391 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_wake_queue);
394 static u8 _rtw_mi_netif_carrier_on(_adapter *padapter, void *data)
396 struct net_device *pnetdev = padapter->pnetdev;
399 rtw_netif_carrier_on(pnetdev);
402 u8 rtw_mi_netif_carrier_on(_adapter *padapter)
404 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_netif_carrier_on);
406 u8 rtw_mi_buddy_netif_carrier_on(_adapter *padapter)
408 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_netif_carrier_on);
411 static u8 _rtw_mi_scan_abort(_adapter *adapter, void *data)
413 bool bwait = *(bool *)data;
416 rtw_scan_abort(adapter);
418 rtw_scan_abort_no_wait(adapter);
422 void rtw_mi_scan_abort(_adapter *adapter, bool bwait)
424 bool in_data = bwait;
426 _rtw_mi_process(adapter, _FALSE, &in_data, _rtw_mi_scan_abort);
429 void rtw_mi_buddy_scan_abort(_adapter *adapter, bool bwait)
431 bool in_data = bwait;
433 _rtw_mi_process(adapter, _TRUE, &in_data, _rtw_mi_scan_abort);
436 static u8 _rtw_mi_start_drv_threads(_adapter *adapter, void *data)
438 rtw_start_drv_threads(adapter);
441 void rtw_mi_start_drv_threads(_adapter *adapter)
443 _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_start_drv_threads);
445 void rtw_mi_buddy_start_drv_threads(_adapter *adapter)
447 _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_start_drv_threads);
450 static u8 _rtw_mi_stop_drv_threads(_adapter *adapter, void *data)
452 rtw_stop_drv_threads(adapter);
455 void rtw_mi_stop_drv_threads(_adapter *adapter)
457 _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_stop_drv_threads);
459 void rtw_mi_buddy_stop_drv_threads(_adapter *adapter)
461 _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_stop_drv_threads);
464 static u8 _rtw_mi_cancel_all_timer(_adapter *adapter, void *data)
466 rtw_cancel_all_timer(adapter);
469 void rtw_mi_cancel_all_timer(_adapter *adapter)
471 _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_cancel_all_timer);
473 void rtw_mi_buddy_cancel_all_timer(_adapter *adapter)
475 _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_cancel_all_timer);
478 static u8 _rtw_mi_reset_drv_sw(_adapter *adapter, void *data)
480 rtw_reset_drv_sw(adapter);
483 void rtw_mi_reset_drv_sw(_adapter *adapter)
485 _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_reset_drv_sw);
487 void rtw_mi_buddy_reset_drv_sw(_adapter *adapter)
489 _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_reset_drv_sw);
492 static u8 _rtw_mi_intf_start(_adapter *adapter, void *data)
494 rtw_intf_start(adapter);
497 void rtw_mi_intf_start(_adapter *adapter)
499 _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_intf_start);
501 void rtw_mi_buddy_intf_start(_adapter *adapter)
503 _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_intf_start);
506 static u8 _rtw_mi_intf_stop(_adapter *adapter, void *data)
508 rtw_intf_stop(adapter);
511 void rtw_mi_intf_stop(_adapter *adapter)
513 _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_intf_stop);
515 void rtw_mi_buddy_intf_stop(_adapter *adapter)
517 _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_intf_stop);
520 static u8 _rtw_mi_suspend_free_assoc_resource(_adapter *padapter, void *data)
522 return rtw_suspend_free_assoc_resource(padapter);
524 void rtw_mi_suspend_free_assoc_resource(_adapter *adapter)
526 _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_suspend_free_assoc_resource);
528 void rtw_mi_buddy_suspend_free_assoc_resource(_adapter *adapter)
530 _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_suspend_free_assoc_resource);
533 static u8 _rtw_mi_is_scan_deny(_adapter *adapter, void *data)
535 return rtw_is_scan_deny(adapter);
538 u8 rtw_mi_is_scan_deny(_adapter *adapter)
540 return _rtw_mi_process(adapter, _FALSE, NULL, _rtw_mi_is_scan_deny);
543 u8 rtw_mi_buddy_is_scan_deny(_adapter *adapter)
545 return _rtw_mi_process(adapter, _TRUE, NULL, _rtw_mi_is_scan_deny);
548 #ifdef CONFIG_SET_SCAN_DENY_TIMER
549 static u8 _rtw_mi_set_scan_deny(_adapter *adapter, void *data)
551 u32 ms = *(u32 *)data;
553 rtw_set_scan_deny(adapter, ms);
556 void rtw_mi_set_scan_deny(_adapter *adapter, u32 ms)
560 _rtw_mi_process(adapter, _FALSE, &in_data, _rtw_mi_set_scan_deny);
562 void rtw_mi_buddy_set_scan_deny(_adapter *adapter, u32 ms)
566 _rtw_mi_process(adapter, _TRUE, &in_data, _rtw_mi_set_scan_deny);
570 struct nulldata_param {
572 unsigned int power_mode;
577 static u8 _rtw_mi_issue_nulldata(_adapter *padapter, void *data)
579 struct nulldata_param *pnulldata_param = (struct nulldata_param *)data;
581 if (is_client_associated_to_ap(padapter) == _TRUE) {
582 /* TODO: TDLS peers */
583 issue_nulldata(padapter, pnulldata_param->da, pnulldata_param->power_mode, pnulldata_param->try_cnt, pnulldata_param->wait_ms);
589 u8 rtw_mi_issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)
591 struct nulldata_param nparam;
594 nparam.power_mode = power_mode;/*0 or 1*/
595 nparam.try_cnt = try_cnt;
596 nparam.wait_ms = wait_ms;
598 return _rtw_mi_process(padapter, _FALSE, &nparam, _rtw_mi_issue_nulldata);
600 u8 rtw_mi_buddy_issue_nulldata(_adapter *padapter, unsigned char *da, unsigned int power_mode, int try_cnt, int wait_ms)
602 struct nulldata_param nparam;
605 nparam.power_mode = power_mode;
606 nparam.try_cnt = try_cnt;
607 nparam.wait_ms = wait_ms;
609 return _rtw_mi_process(padapter, _TRUE, &nparam, _rtw_mi_issue_nulldata);
612 static u8 _rtw_mi_beacon_update(_adapter *padapter, void *data)
614 struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
616 if (mlmeext_msr(mlmeext) == WIFI_FW_AP_STATE
617 && check_fwstate(&padapter->mlmepriv, _FW_LINKED) == _TRUE) {
618 RTW_INFO(ADPT_FMT"-WIFI_FW_AP_STATE - update_beacon\n", ADPT_ARG(padapter));
619 update_beacon(padapter, 0, NULL, _TRUE);
624 void rtw_mi_beacon_update(_adapter *padapter)
626 _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_beacon_update);
629 void rtw_mi_buddy_beacon_update(_adapter *padapter)
631 _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_beacon_update);
634 static u8 _rtw_mi_hal_dump_macaddr(_adapter *padapter, void *data)
636 u8 mac_addr[ETH_ALEN] = {0};
638 rtw_hal_get_macaddr_port(padapter, mac_addr);
639 RTW_INFO(ADPT_FMT"MAC Address ="MAC_FMT"\n", ADPT_ARG(padapter), MAC_ARG(mac_addr));
642 void rtw_mi_hal_dump_macaddr(_adapter *padapter)
644 _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_hal_dump_macaddr);
646 void rtw_mi_buddy_hal_dump_macaddr(_adapter *padapter)
648 _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_hal_dump_macaddr);
651 #ifdef CONFIG_PCI_HCI
652 static u8 _rtw_mi_xmit_tasklet_schedule(_adapter *padapter, void *data)
654 if (rtw_txframes_pending(padapter)) {
655 /* try to deal with the pending packets */
656 tasklet_hi_schedule(&(padapter->xmitpriv.xmit_tasklet));
660 void rtw_mi_xmit_tasklet_schedule(_adapter *padapter)
662 _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_xmit_tasklet_schedule);
664 void rtw_mi_buddy_xmit_tasklet_schedule(_adapter *padapter)
666 _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_xmit_tasklet_schedule);
670 u8 _rtw_mi_busy_traffic_check(_adapter *padapter, void *data)
673 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
674 bool check_sc_interval = *(bool *)data;
676 if (pmlmepriv->LinkDetectInfo.bBusyTraffic == _TRUE) {
677 if (check_sc_interval) {
678 /* Miracast can't do AP scan*/
679 passtime = rtw_get_passing_time_ms(pmlmepriv->lastscantime);
680 pmlmepriv->lastscantime = rtw_get_current_time();
681 if (passtime > BUSY_TRAFFIC_SCAN_DENY_PERIOD) {
682 RTW_INFO(ADPT_FMT" bBusyTraffic == _TRUE\n", ADPT_ARG(padapter));
692 u8 rtw_mi_busy_traffic_check(_adapter *padapter, bool check_sc_interval)
694 bool in_data = check_sc_interval;
696 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_busy_traffic_check);
698 u8 rtw_mi_buddy_busy_traffic_check(_adapter *padapter, bool check_sc_interval)
700 bool in_data = check_sc_interval;
702 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_busy_traffic_check);
704 static u8 _rtw_mi_check_mlmeinfo_state(_adapter *padapter, void *data)
706 u32 state = *(u32 *)data;
707 struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
709 /*if (mlmeext_msr(mlmeext) == state)*/
710 if (check_mlmeinfo_state(mlmeext, state))
716 u8 rtw_mi_check_mlmeinfo_state(_adapter *padapter, u32 state)
720 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_mlmeinfo_state);
723 u8 rtw_mi_buddy_check_mlmeinfo_state(_adapter *padapter, u32 state)
727 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_mlmeinfo_state);
730 /*#define DBG_DUMP_FW_STATE*/
731 #ifdef DBG_DUMP_FW_STATE
732 static void rtw_dbg_dump_fwstate(_adapter *padapter, sint state)
736 if (state & WIFI_FW_NULL_STATE) {
737 _rtw_memset(buf, 0, 32);
738 sprintf(buf, "WIFI_FW_NULL_STATE");
739 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
742 if (state & _FW_LINKED) {
743 _rtw_memset(buf, 0, 32);
744 sprintf(buf, "_FW_LINKED");
745 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
748 if (state & _FW_UNDER_LINKING) {
749 _rtw_memset(buf, 0, 32);
750 sprintf(buf, "_FW_UNDER_LINKING");
751 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
754 if (state & _FW_UNDER_SURVEY) {
755 _rtw_memset(buf, 0, 32);
756 sprintf(buf, "_FW_UNDER_SURVEY");
757 RTW_INFO(FUNC_ADPT_FMT"fwstate-%s\n", FUNC_ADPT_ARG(padapter), buf);
762 static u8 _rtw_mi_check_fwstate(_adapter *padapter, void *data)
766 sint state = *(sint *)data;
768 if ((state == WIFI_FW_NULL_STATE) &&
769 (padapter->mlmepriv.fw_state == WIFI_FW_NULL_STATE))
771 else if (_TRUE == check_fwstate(&padapter->mlmepriv, state))
773 #ifdef DBG_DUMP_FW_STATE
775 rtw_dbg_dump_fwstate(padapter, state);
779 u8 rtw_mi_check_fwstate(_adapter *padapter, sint state)
781 sint in_data = state;
783 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_check_fwstate);
785 u8 rtw_mi_buddy_check_fwstate(_adapter *padapter, sint state)
787 sint in_data = state;
789 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_check_fwstate);
792 static u8 _rtw_mi_traffic_statistics(_adapter *padapter , void *data)
794 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
797 pdvobjpriv->traffic_stat.tx_bytes += padapter->xmitpriv.tx_bytes;
798 pdvobjpriv->traffic_stat.tx_pkts += padapter->xmitpriv.tx_pkts;
799 pdvobjpriv->traffic_stat.tx_drop += padapter->xmitpriv.tx_drop;
802 pdvobjpriv->traffic_stat.rx_bytes += padapter->recvpriv.rx_bytes;
803 pdvobjpriv->traffic_stat.rx_pkts += padapter->recvpriv.rx_pkts;
804 pdvobjpriv->traffic_stat.rx_drop += padapter->recvpriv.rx_drop;
807 u8 rtw_mi_traffic_statistics(_adapter *padapter)
809 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_traffic_statistics);
812 static u8 _rtw_mi_check_miracast_enabled(_adapter *padapter , void *data)
814 return is_miracast_enabled(padapter);
816 u8 rtw_mi_check_miracast_enabled(_adapter *padapter)
818 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_miracast_enabled);
821 #ifdef CONFIG_XMIT_THREAD_MODE
822 static u8 _rtw_mi_check_pending_xmitbuf(_adapter *padapter , void *data)
824 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
826 return check_pending_xmitbuf(pxmitpriv);
828 u8 rtw_mi_check_pending_xmitbuf(_adapter *padapter)
830 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_check_pending_xmitbuf);
832 u8 rtw_mi_buddy_check_pending_xmitbuf(_adapter *padapter)
834 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_check_pending_xmitbuf);
838 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
839 static u8 _rtw_mi_dequeue_writeport(_adapter *padapter , bool exclude_self)
842 u8 queue_empty = _TRUE;
844 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
846 for (i = 0; i < dvobj->iface_nums; i++) {
847 iface = dvobj->padapters[i];
848 if ((iface) && rtw_is_adapter_up(iface)) {
850 if ((exclude_self) && (iface == padapter))
853 queue_empty &= _dequeue_writeport(iface);
858 u8 rtw_mi_dequeue_writeport(_adapter *padapter)
860 return _rtw_mi_dequeue_writeport(padapter, _FALSE);
862 u8 rtw_mi_buddy_dequeue_writeport(_adapter *padapter)
864 return _rtw_mi_dequeue_writeport(padapter, _TRUE);
867 static void _rtw_mi_adapter_reset(_adapter *padapter , u8 exclude_self)
870 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
872 for (i = 0; i < dvobj->iface_nums; i++) {
873 if (dvobj->padapters[i]) {
874 if ((exclude_self) && (dvobj->padapters[i] == padapter))
876 dvobj->padapters[i] = NULL;
881 void rtw_mi_adapter_reset(_adapter *padapter)
883 _rtw_mi_adapter_reset(padapter, _FALSE);
886 void rtw_mi_buddy_adapter_reset(_adapter *padapter)
888 _rtw_mi_adapter_reset(padapter, _TRUE);
891 static u8 _rtw_mi_dynamic_check_timer_handlder(_adapter *adapter, void *data)
893 rtw_iface_dynamic_check_timer_handlder(adapter);
896 u8 rtw_mi_dynamic_check_timer_handlder(_adapter *padapter)
898 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_check_timer_handlder);
900 u8 rtw_mi_buddy_dynamic_check_timer_handlder(_adapter *padapter)
902 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_check_timer_handlder);
905 static u8 _rtw_mi_dev_unload(_adapter *adapter, void *data)
907 rtw_dev_unload(adapter);
910 u8 rtw_mi_dev_unload(_adapter *padapter)
912 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dev_unload);
914 u8 rtw_mi_buddy_dev_unload(_adapter *padapter)
916 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dev_unload);
919 static u8 _rtw_mi_dynamic_chk_wk_hdl(_adapter *adapter, void *data)
921 rtw_iface_dynamic_chk_wk_hdl(adapter);
924 u8 rtw_mi_dynamic_chk_wk_hdl(_adapter *padapter)
926 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_dynamic_chk_wk_hdl);
928 u8 rtw_mi_buddy_dynamic_chk_wk_hdl(_adapter *padapter)
930 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_dynamic_chk_wk_hdl);
933 static u8 _rtw_mi_os_xmit_schedule(_adapter *adapter, void *data)
935 rtw_os_xmit_schedule(adapter);
938 u8 rtw_mi_os_xmit_schedule(_adapter *padapter)
940 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_os_xmit_schedule);
942 u8 rtw_mi_buddy_os_xmit_schedule(_adapter *padapter)
944 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_os_xmit_schedule);
947 static u8 _rtw_mi_report_survey_event(_adapter *adapter, void *data)
949 union recv_frame *precv_frame = (union recv_frame *)data;
951 report_survey_event(adapter, precv_frame);
954 u8 rtw_mi_report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
956 return _rtw_mi_process(padapter, _FALSE, precv_frame, _rtw_mi_report_survey_event);
958 u8 rtw_mi_buddy_report_survey_event(_adapter *padapter, union recv_frame *precv_frame)
960 return _rtw_mi_process(padapter, _TRUE, precv_frame, _rtw_mi_report_survey_event);
963 static u8 _rtw_mi_sreset_adapter_hdl(_adapter *adapter, void *data)
965 u8 bstart = *(u8 *)data;
968 sreset_start_adapter(adapter);
970 sreset_stop_adapter(adapter);
973 u8 rtw_mi_sreset_adapter_hdl(_adapter *padapter, u8 bstart)
977 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_sreset_adapter_hdl);
979 u8 rtw_mi_buddy_sreset_adapter_hdl(_adapter *padapter, u8 bstart)
983 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_sreset_adapter_hdl);
985 static u8 _rtw_mi_tx_beacon_hdl(_adapter *adapter, void *data)
987 if (check_fwstate(&adapter->mlmepriv, WIFI_AP_STATE) == _TRUE
988 && check_fwstate(&adapter->mlmepriv, WIFI_ASOC_STATE) == _TRUE
990 adapter->mlmepriv.update_bcn = _TRUE;
991 #ifndef CONFIG_INTERRUPT_BASED_TXBCN
992 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
993 tx_beacon_hdl(adapter, NULL);
999 u8 rtw_mi_tx_beacon_hdl(_adapter *padapter)
1001 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_tx_beacon_hdl);
1003 u8 rtw_mi_buddy_tx_beacon_hdl(_adapter *padapter)
1005 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_sreset_adapter_hdl);
1008 static u8 _rtw_mi_set_tx_beacon_cmd(_adapter *adapter, void *data)
1010 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1012 if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
1013 if (pmlmepriv->update_bcn == _TRUE)
1014 set_tx_beacon_cmd(adapter);
1018 u8 rtw_mi_set_tx_beacon_cmd(_adapter *padapter)
1020 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_set_tx_beacon_cmd);
1022 u8 rtw_mi_buddy_set_tx_beacon_cmd(_adapter *padapter)
1024 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_set_tx_beacon_cmd);
1028 static u8 _rtw_mi_p2p_chk_state(_adapter *adapter, void *data)
1030 struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
1031 enum P2P_STATE state = *(enum P2P_STATE *)data;
1033 return rtw_p2p_chk_state(pwdinfo, state);
1035 u8 rtw_mi_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state)
1037 u8 in_data = p2p_state;
1039 return _rtw_mi_process(padapter, _FALSE, &in_data, _rtw_mi_p2p_chk_state);
1041 u8 rtw_mi_buddy_p2p_chk_state(_adapter *padapter, enum P2P_STATE p2p_state)
1043 u8 in_data = p2p_state;
1045 return _rtw_mi_process(padapter, _TRUE, &in_data, _rtw_mi_p2p_chk_state);
1047 static u8 _rtw_mi_stay_in_p2p_mode(_adapter *adapter, void *data)
1049 struct wifidirect_info *pwdinfo = &(adapter->wdinfo);
1051 if (rtw_p2p_role(pwdinfo) != P2P_ROLE_DISABLE)
1055 u8 rtw_mi_stay_in_p2p_mode(_adapter *padapter)
1057 return _rtw_mi_process(padapter, _FALSE, NULL, _rtw_mi_stay_in_p2p_mode);
1059 u8 rtw_mi_buddy_stay_in_p2p_mode(_adapter *padapter)
1061 return _rtw_mi_process(padapter, _TRUE, NULL, _rtw_mi_stay_in_p2p_mode);
1063 #endif /*CONFIG_P2P*/
1065 _adapter *rtw_get_iface_by_id(_adapter *padapter, u8 iface_id)
1067 _adapter *iface = NULL;
1068 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1070 if ((padapter == NULL) || (iface_id >= CONFIG_IFACE_NUMBER)) {
1075 return dvobj->padapters[iface_id];
1078 _adapter *rtw_get_iface_by_macddr(_adapter *padapter, u8 *mac_addr)
1081 _adapter *iface = NULL;
1083 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1085 for (i = 0; i < dvobj->iface_nums; i++) {
1086 iface = dvobj->padapters[i];
1087 if ((iface) && (_rtw_memcmp(mac_addr, adapter_mac_addr(iface), ETH_ALEN))) {
1098 _adapter *rtw_get_iface_by_hwport(_adapter *padapter, u8 hw_port)
1101 _adapter *iface = NULL;
1103 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1105 for (i = 0; i < dvobj->iface_nums; i++) {
1106 iface = dvobj->padapters[i];
1107 if ((iface) && (hw_port == iface->hw_port)) {
1118 /*#define CONFIG_SKB_ALLOCATED*/
1119 #define DBG_SKB_PROCESS
1120 #ifdef DBG_SKB_PROCESS
1121 void rtw_dbg_skb_process(_adapter *padapter, union recv_frame *precvframe, union recv_frame *pcloneframe)
1123 _pkt *pkt_copy, *pkt_org;
1125 pkt_org = precvframe->u.hdr.pkt;
1126 pkt_copy = pcloneframe->u.hdr.pkt;
1128 RTW_INFO("%s ===== ORG SKB =====\n", __func__);
1129 RTW_INFO(" SKB head(%p)\n", pkt_org->head);
1130 RTW_INFO(" SKB data(%p)\n", pkt_org->data);
1131 RTW_INFO(" SKB tail(%p)\n", pkt_org->tail);
1132 RTW_INFO(" SKB end(%p)\n", pkt_org->end);
1134 RTW_INFO(" recv frame head(%p)\n", precvframe->u.hdr.rx_head);
1135 RTW_INFO(" recv frame data(%p)\n", precvframe->u.hdr.rx_data);
1136 RTW_INFO(" recv frame tail(%p)\n", precvframe->u.hdr.rx_tail);
1137 RTW_INFO(" recv frame end(%p)\n", precvframe->u.hdr.rx_end);
1139 RTW_INFO("%s ===== COPY SKB =====\n", __func__);
1140 RTW_INFO(" SKB head(%p)\n", pkt_copy->head);
1141 RTW_INFO(" SKB data(%p)\n", pkt_copy->data);
1142 RTW_INFO(" SKB tail(%p)\n", pkt_copy->tail);
1143 RTW_INFO(" SKB end(%p)\n", pkt_copy->end);
1145 RTW_INFO(" recv frame head(%p)\n", pcloneframe->u.hdr.rx_head);
1146 RTW_INFO(" recv frame data(%p)\n", pcloneframe->u.hdr.rx_data);
1147 RTW_INFO(" recv frame tail(%p)\n", pcloneframe->u.hdr.rx_tail);
1148 RTW_INFO(" recv frame end(%p)\n", pcloneframe->u.hdr.rx_end);
1151 RTW_INFO("%s => recv_frame adapter(%p,%p)\n", __func__, precvframe->u.hdr.adapter, pcloneframe->u.hdr.adapter);
1152 RTW_INFO("%s => recv_frame dev(%p,%p)\n", __func__, pkt_org->dev , pkt_copy->dev);
1153 RTW_INFO("%s => recv_frame len(%d,%d)\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len);
1155 if (precvframe->u.hdr.len != pcloneframe->u.hdr.len)
1156 RTW_INFO("%s [WARN] recv_frame length(%d:%d) compare failed\n", __func__, precvframe->u.hdr.len, pcloneframe->u.hdr.len);
1158 if (_rtw_memcmp(&precvframe->u.hdr.attrib, &pcloneframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib)) == _FALSE)
1159 RTW_INFO("%s [WARN] recv_frame attrib compare failed\n", __func__);
1161 if (_rtw_memcmp(precvframe->u.hdr.rx_data, pcloneframe->u.hdr.rx_data, precvframe->u.hdr.len) == _FALSE)
1162 RTW_INFO("%s [WARN] recv_frame rx_data compare failed\n", __func__);
1167 static s32 _rtw_mi_buddy_clone_bcmc_packet(_adapter *adapter, union recv_frame *precvframe, u8 *pphy_status, union recv_frame *pcloneframe)
1170 u8 *pbuf = precvframe->u.hdr.rx_data;
1171 struct rx_pkt_attrib *pattrib = NULL;
1172 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
1175 pcloneframe->u.hdr.adapter = adapter;
1177 _rtw_init_listhead(&pcloneframe->u.hdr.list);
1178 pcloneframe->u.hdr.precvbuf = NULL; /*can't access the precvbuf for new arch.*/
1179 pcloneframe->u.hdr.len = 0;
1181 _rtw_memcpy(&pcloneframe->u.hdr.attrib, &precvframe->u.hdr.attrib, sizeof(struct rx_pkt_attrib));
1183 pattrib = &pcloneframe->u.hdr.attrib;
1184 #ifdef CONFIG_SKB_ALLOCATED
1185 if (rtw_os_alloc_recvframe(adapter, pcloneframe, pbuf, NULL) == _SUCCESS)
1187 if (rtw_os_recvframe_duplicate_skb(adapter, pcloneframe, precvframe->u.hdr.pkt) == _SUCCESS)
1190 #ifdef CONFIG_SKB_ALLOCATED
1191 recvframe_put(pcloneframe, pattrib->pkt_len);
1194 #ifdef DBG_SKB_PROCESS
1195 rtw_dbg_skb_process(adapter, precvframe, pcloneframe);
1198 if (pattrib->physt && pphy_status)
1199 rx_query_phy_status(pcloneframe, pphy_status);
1201 ret = rtw_recv_entry(pcloneframe);
1204 RTW_INFO("%s()-%d: rtw_os_alloc_recvframe() failed!\n", __func__, __LINE__);
1211 void rtw_mi_buddy_clone_bcmc_packet(_adapter *padapter, union recv_frame *precvframe, u8 *pphy_status)
1215 _adapter *iface = NULL;
1216 union recv_frame *pcloneframe = NULL;
1217 struct recv_priv *precvpriv = &padapter->recvpriv;/*primary_padapter*/
1218 _queue *pfree_recv_queue = &precvpriv->free_recv_queue;
1219 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1221 for (i = 0; i < dvobj->iface_nums; i++) {
1222 iface = dvobj->padapters[i];
1223 if (!iface || iface == padapter)
1225 if (rtw_is_adapter_up(iface) == _FALSE || iface->registered == 0)
1228 pcloneframe = rtw_alloc_recvframe(pfree_recv_queue);
1230 ret = _rtw_mi_buddy_clone_bcmc_packet(iface, precvframe, pphy_status, pcloneframe);
1231 if (_SUCCESS != ret) {
1233 rtw_free_recvframe(pcloneframe, pfree_recv_queue);
1234 /*RTW_INFO(ADPT_FMT"-clone BC/MC frame failed\n", ADPT_ARG(iface));*/
1241 #ifdef CONFIG_PCI_HCI
1242 /*API be created temporary for MI, caller is interrupt-handler, PCIE's interrupt handler cannot apply to multi-AP*/
1243 _adapter *rtw_mi_get_ap_adapter(_adapter *padapter)
1245 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1247 _adapter *iface = NULL;
1249 for (i = 0; i < dvobj->iface_nums; i++) {
1250 iface = dvobj->padapters[i];
1254 if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE
1255 && check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE)
1263 void rtw_mi_update_ap_bmc_camid(_adapter *padapter, u8 camid_a, u8 camid_b)
1265 #ifdef CONFIG_CONCURRENT_MODE
1266 struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
1267 struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
1270 _adapter *iface = NULL;
1272 for (i = 0; i < dvobj->iface_nums; i++) {
1273 iface = dvobj->padapters[i];
1277 if (macid_ctl->iface_bmc[iface->iface_id] != INVALID_SEC_MAC_CAM_ID) {
1278 if (macid_ctl->iface_bmc[iface->iface_id] == camid_a)
1279 macid_ctl->iface_bmc[iface->iface_id] = camid_b;
1280 else if (macid_ctl->iface_bmc[iface->iface_id] == camid_b)
1281 macid_ctl->iface_bmc[iface->iface_id] = camid_a;
1282 iface->securitypriv.dot118021x_bmc_cam_id = macid_ctl->iface_bmc[iface->iface_id];