162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * NXP Wireless LAN device driver: AP event handling 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2011-2020 NXP 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "decl.h" 962306a36Sopenharmony_ci#include "main.h" 1062306a36Sopenharmony_ci#include "11n.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define MWIFIEX_BSS_START_EVT_FIX_SIZE 12 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistatic int mwifiex_check_uap_capabilities(struct mwifiex_private *priv, 1562306a36Sopenharmony_ci struct sk_buff *event) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci int evt_len; 1862306a36Sopenharmony_ci u8 *curr; 1962306a36Sopenharmony_ci u16 tlv_len; 2062306a36Sopenharmony_ci struct mwifiex_ie_types_data *tlv_hdr; 2162306a36Sopenharmony_ci struct ieee_types_wmm_parameter *wmm_param_ie = NULL; 2262306a36Sopenharmony_ci int mask = IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci priv->wmm_enabled = false; 2562306a36Sopenharmony_ci skb_pull(event, MWIFIEX_BSS_START_EVT_FIX_SIZE); 2662306a36Sopenharmony_ci evt_len = event->len; 2762306a36Sopenharmony_ci curr = event->data; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci mwifiex_dbg_dump(priv->adapter, EVT_D, "uap capabilities:", 3062306a36Sopenharmony_ci event->data, event->len); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci skb_push(event, MWIFIEX_BSS_START_EVT_FIX_SIZE); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci while ((evt_len >= sizeof(tlv_hdr->header))) { 3562306a36Sopenharmony_ci tlv_hdr = (struct mwifiex_ie_types_data *)curr; 3662306a36Sopenharmony_ci tlv_len = le16_to_cpu(tlv_hdr->header.len); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci if (evt_len < tlv_len + sizeof(tlv_hdr->header)) 3962306a36Sopenharmony_ci break; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci switch (le16_to_cpu(tlv_hdr->header.type)) { 4262306a36Sopenharmony_ci case WLAN_EID_HT_CAPABILITY: 4362306a36Sopenharmony_ci priv->ap_11n_enabled = true; 4462306a36Sopenharmony_ci break; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci case WLAN_EID_VHT_CAPABILITY: 4762306a36Sopenharmony_ci priv->ap_11ac_enabled = true; 4862306a36Sopenharmony_ci break; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci case WLAN_EID_VENDOR_SPECIFIC: 5162306a36Sopenharmony_ci /* Point the regular IEEE IE 2 bytes into the Marvell IE 5262306a36Sopenharmony_ci * and setup the IEEE IE type and length byte fields 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_ci wmm_param_ie = (void *)(curr + 2); 5562306a36Sopenharmony_ci wmm_param_ie->vend_hdr.len = (u8)tlv_len; 5662306a36Sopenharmony_ci wmm_param_ie->vend_hdr.element_id = 5762306a36Sopenharmony_ci WLAN_EID_VENDOR_SPECIFIC; 5862306a36Sopenharmony_ci mwifiex_dbg(priv->adapter, EVENT, 5962306a36Sopenharmony_ci "info: check uap capabilities:\t" 6062306a36Sopenharmony_ci "wmm parameter set count: %d\n", 6162306a36Sopenharmony_ci wmm_param_ie->qos_info_bitmap & mask); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci mwifiex_wmm_setup_ac_downgrade(priv); 6462306a36Sopenharmony_ci priv->wmm_enabled = true; 6562306a36Sopenharmony_ci mwifiex_wmm_setup_queue_priorities(priv, wmm_param_ie); 6662306a36Sopenharmony_ci break; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci default: 6962306a36Sopenharmony_ci break; 7062306a36Sopenharmony_ci } 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci curr += (tlv_len + sizeof(tlv_hdr->header)); 7362306a36Sopenharmony_ci evt_len -= (tlv_len + sizeof(tlv_hdr->header)); 7462306a36Sopenharmony_ci } 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci return 0; 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/* 8062306a36Sopenharmony_ci * This function handles AP interface specific events generated by firmware. 8162306a36Sopenharmony_ci * 8262306a36Sopenharmony_ci * Event specific routines are called by this function based 8362306a36Sopenharmony_ci * upon the generated event cause. 8462306a36Sopenharmony_ci * 8562306a36Sopenharmony_ci * 8662306a36Sopenharmony_ci * Events supported for AP - 8762306a36Sopenharmony_ci * - EVENT_UAP_STA_ASSOC 8862306a36Sopenharmony_ci * - EVENT_UAP_STA_DEAUTH 8962306a36Sopenharmony_ci * - EVENT_UAP_BSS_ACTIVE 9062306a36Sopenharmony_ci * - EVENT_UAP_BSS_START 9162306a36Sopenharmony_ci * - EVENT_UAP_BSS_IDLE 9262306a36Sopenharmony_ci * - EVENT_UAP_MIC_COUNTERMEASURES: 9362306a36Sopenharmony_ci */ 9462306a36Sopenharmony_ciint mwifiex_process_uap_event(struct mwifiex_private *priv) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci struct mwifiex_adapter *adapter = priv->adapter; 9762306a36Sopenharmony_ci int len, i; 9862306a36Sopenharmony_ci u32 eventcause = adapter->event_cause; 9962306a36Sopenharmony_ci struct station_info *sinfo; 10062306a36Sopenharmony_ci struct mwifiex_assoc_event *event; 10162306a36Sopenharmony_ci struct mwifiex_sta_node *node; 10262306a36Sopenharmony_ci u8 *deauth_mac; 10362306a36Sopenharmony_ci struct host_cmd_ds_11n_batimeout *ba_timeout; 10462306a36Sopenharmony_ci u16 ctrl; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci switch (eventcause) { 10762306a36Sopenharmony_ci case EVENT_UAP_STA_ASSOC: 10862306a36Sopenharmony_ci sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); 10962306a36Sopenharmony_ci if (!sinfo) 11062306a36Sopenharmony_ci return -ENOMEM; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci event = (struct mwifiex_assoc_event *) 11362306a36Sopenharmony_ci (adapter->event_body + MWIFIEX_UAP_EVENT_EXTRA_HEADER); 11462306a36Sopenharmony_ci if (le16_to_cpu(event->type) == TLV_TYPE_UAP_MGMT_FRAME) { 11562306a36Sopenharmony_ci len = -1; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci if (ieee80211_is_assoc_req(event->frame_control)) 11862306a36Sopenharmony_ci len = 0; 11962306a36Sopenharmony_ci else if (ieee80211_is_reassoc_req(event->frame_control)) 12062306a36Sopenharmony_ci /* There will be ETH_ALEN bytes of 12162306a36Sopenharmony_ci * current_ap_addr before the re-assoc ies. 12262306a36Sopenharmony_ci */ 12362306a36Sopenharmony_ci len = ETH_ALEN; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci if (len != -1) { 12662306a36Sopenharmony_ci sinfo->assoc_req_ies = &event->data[len]; 12762306a36Sopenharmony_ci len = (u8 *)sinfo->assoc_req_ies - 12862306a36Sopenharmony_ci (u8 *)&event->frame_control; 12962306a36Sopenharmony_ci sinfo->assoc_req_ies_len = 13062306a36Sopenharmony_ci le16_to_cpu(event->len) - (u16)len; 13162306a36Sopenharmony_ci } 13262306a36Sopenharmony_ci } 13362306a36Sopenharmony_ci cfg80211_new_sta(priv->netdev, event->sta_addr, sinfo, 13462306a36Sopenharmony_ci GFP_KERNEL); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci node = mwifiex_add_sta_entry(priv, event->sta_addr); 13762306a36Sopenharmony_ci if (!node) { 13862306a36Sopenharmony_ci mwifiex_dbg(adapter, ERROR, 13962306a36Sopenharmony_ci "could not create station entry!\n"); 14062306a36Sopenharmony_ci kfree(sinfo); 14162306a36Sopenharmony_ci return -1; 14262306a36Sopenharmony_ci } 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci if (!priv->ap_11n_enabled) { 14562306a36Sopenharmony_ci kfree(sinfo); 14662306a36Sopenharmony_ci break; 14762306a36Sopenharmony_ci } 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci mwifiex_set_sta_ht_cap(priv, sinfo->assoc_req_ies, 15062306a36Sopenharmony_ci sinfo->assoc_req_ies_len, node); 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci for (i = 0; i < MAX_NUM_TID; i++) { 15362306a36Sopenharmony_ci if (node->is_11n_enabled) 15462306a36Sopenharmony_ci node->ampdu_sta[i] = 15562306a36Sopenharmony_ci priv->aggr_prio_tbl[i].ampdu_user; 15662306a36Sopenharmony_ci else 15762306a36Sopenharmony_ci node->ampdu_sta[i] = BA_STREAM_NOT_ALLOWED; 15862306a36Sopenharmony_ci } 15962306a36Sopenharmony_ci memset(node->rx_seq, 0xff, sizeof(node->rx_seq)); 16062306a36Sopenharmony_ci kfree(sinfo); 16162306a36Sopenharmony_ci break; 16262306a36Sopenharmony_ci case EVENT_UAP_STA_DEAUTH: 16362306a36Sopenharmony_ci deauth_mac = adapter->event_body + 16462306a36Sopenharmony_ci MWIFIEX_UAP_EVENT_EXTRA_HEADER; 16562306a36Sopenharmony_ci cfg80211_del_sta(priv->netdev, deauth_mac, GFP_KERNEL); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci if (priv->ap_11n_enabled) { 16862306a36Sopenharmony_ci mwifiex_11n_del_rx_reorder_tbl_by_ta(priv, deauth_mac); 16962306a36Sopenharmony_ci mwifiex_del_tx_ba_stream_tbl_by_ra(priv, deauth_mac); 17062306a36Sopenharmony_ci } 17162306a36Sopenharmony_ci mwifiex_wmm_del_peer_ra_list(priv, deauth_mac); 17262306a36Sopenharmony_ci mwifiex_del_sta_entry(priv, deauth_mac); 17362306a36Sopenharmony_ci break; 17462306a36Sopenharmony_ci case EVENT_UAP_BSS_IDLE: 17562306a36Sopenharmony_ci priv->media_connected = false; 17662306a36Sopenharmony_ci priv->port_open = false; 17762306a36Sopenharmony_ci mwifiex_clean_txrx(priv); 17862306a36Sopenharmony_ci mwifiex_del_all_sta_list(priv); 17962306a36Sopenharmony_ci break; 18062306a36Sopenharmony_ci case EVENT_UAP_BSS_ACTIVE: 18162306a36Sopenharmony_ci priv->media_connected = true; 18262306a36Sopenharmony_ci priv->port_open = true; 18362306a36Sopenharmony_ci break; 18462306a36Sopenharmony_ci case EVENT_UAP_BSS_START: 18562306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, 18662306a36Sopenharmony_ci "AP EVENT: event id: %#x\n", eventcause); 18762306a36Sopenharmony_ci priv->port_open = false; 18862306a36Sopenharmony_ci eth_hw_addr_set(priv->netdev, adapter->event_body + 2); 18962306a36Sopenharmony_ci if (priv->hist_data) 19062306a36Sopenharmony_ci mwifiex_hist_data_reset(priv); 19162306a36Sopenharmony_ci mwifiex_check_uap_capabilities(priv, adapter->event_skb); 19262306a36Sopenharmony_ci break; 19362306a36Sopenharmony_ci case EVENT_UAP_MIC_COUNTERMEASURES: 19462306a36Sopenharmony_ci /* For future development */ 19562306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, 19662306a36Sopenharmony_ci "AP EVENT: event id: %#x\n", eventcause); 19762306a36Sopenharmony_ci break; 19862306a36Sopenharmony_ci case EVENT_AMSDU_AGGR_CTRL: 19962306a36Sopenharmony_ci ctrl = get_unaligned_le16(adapter->event_body); 20062306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, 20162306a36Sopenharmony_ci "event: AMSDU_AGGR_CTRL %d\n", ctrl); 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci if (priv->media_connected) { 20462306a36Sopenharmony_ci adapter->tx_buf_size = 20562306a36Sopenharmony_ci min_t(u16, adapter->curr_tx_buf_size, ctrl); 20662306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, 20762306a36Sopenharmony_ci "event: tx_buf_size %d\n", 20862306a36Sopenharmony_ci adapter->tx_buf_size); 20962306a36Sopenharmony_ci } 21062306a36Sopenharmony_ci break; 21162306a36Sopenharmony_ci case EVENT_ADDBA: 21262306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: ADDBA Request\n"); 21362306a36Sopenharmony_ci if (priv->media_connected) 21462306a36Sopenharmony_ci mwifiex_send_cmd(priv, HostCmd_CMD_11N_ADDBA_RSP, 21562306a36Sopenharmony_ci HostCmd_ACT_GEN_SET, 0, 21662306a36Sopenharmony_ci adapter->event_body, false); 21762306a36Sopenharmony_ci break; 21862306a36Sopenharmony_ci case EVENT_DELBA: 21962306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: DELBA Request\n"); 22062306a36Sopenharmony_ci if (priv->media_connected) 22162306a36Sopenharmony_ci mwifiex_11n_delete_ba_stream(priv, adapter->event_body); 22262306a36Sopenharmony_ci break; 22362306a36Sopenharmony_ci case EVENT_BA_STREAM_TIEMOUT: 22462306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: BA Stream timeout\n"); 22562306a36Sopenharmony_ci if (priv->media_connected) { 22662306a36Sopenharmony_ci ba_timeout = (void *)adapter->event_body; 22762306a36Sopenharmony_ci mwifiex_11n_ba_stream_timeout(priv, ba_timeout); 22862306a36Sopenharmony_ci } 22962306a36Sopenharmony_ci break; 23062306a36Sopenharmony_ci case EVENT_EXT_SCAN_REPORT: 23162306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: EXT_SCAN Report\n"); 23262306a36Sopenharmony_ci if (adapter->ext_scan) 23362306a36Sopenharmony_ci return mwifiex_handle_event_ext_scan_report(priv, 23462306a36Sopenharmony_ci adapter->event_skb->data); 23562306a36Sopenharmony_ci break; 23662306a36Sopenharmony_ci case EVENT_TX_STATUS_REPORT: 23762306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: TX_STATUS Report\n"); 23862306a36Sopenharmony_ci mwifiex_parse_tx_status_event(priv, adapter->event_body); 23962306a36Sopenharmony_ci break; 24062306a36Sopenharmony_ci case EVENT_PS_SLEEP: 24162306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "info: EVENT: SLEEP\n"); 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci adapter->ps_state = PS_STATE_PRE_SLEEP; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci mwifiex_check_ps_cond(adapter); 24662306a36Sopenharmony_ci break; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci case EVENT_PS_AWAKE: 24962306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "info: EVENT: AWAKE\n"); 25062306a36Sopenharmony_ci if (!adapter->pps_uapsd_mode && 25162306a36Sopenharmony_ci priv->media_connected && adapter->sleep_period.period) { 25262306a36Sopenharmony_ci adapter->pps_uapsd_mode = true; 25362306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, 25462306a36Sopenharmony_ci "event: PPS/UAPSD mode activated\n"); 25562306a36Sopenharmony_ci } 25662306a36Sopenharmony_ci adapter->tx_lock_flag = false; 25762306a36Sopenharmony_ci if (adapter->pps_uapsd_mode && adapter->gen_null_pkt) { 25862306a36Sopenharmony_ci if (mwifiex_check_last_packet_indication(priv)) { 25962306a36Sopenharmony_ci if (adapter->data_sent || 26062306a36Sopenharmony_ci (adapter->if_ops.is_port_ready && 26162306a36Sopenharmony_ci !adapter->if_ops.is_port_ready(priv))) { 26262306a36Sopenharmony_ci adapter->ps_state = PS_STATE_AWAKE; 26362306a36Sopenharmony_ci adapter->pm_wakeup_card_req = false; 26462306a36Sopenharmony_ci adapter->pm_wakeup_fw_try = false; 26562306a36Sopenharmony_ci break; 26662306a36Sopenharmony_ci } 26762306a36Sopenharmony_ci if (!mwifiex_send_null_packet 26862306a36Sopenharmony_ci (priv, 26962306a36Sopenharmony_ci MWIFIEX_TxPD_POWER_MGMT_NULL_PACKET | 27062306a36Sopenharmony_ci MWIFIEX_TxPD_POWER_MGMT_LAST_PACKET)) 27162306a36Sopenharmony_ci adapter->ps_state = 27262306a36Sopenharmony_ci PS_STATE_SLEEP; 27362306a36Sopenharmony_ci return 0; 27462306a36Sopenharmony_ci } 27562306a36Sopenharmony_ci } 27662306a36Sopenharmony_ci adapter->ps_state = PS_STATE_AWAKE; 27762306a36Sopenharmony_ci adapter->pm_wakeup_card_req = false; 27862306a36Sopenharmony_ci adapter->pm_wakeup_fw_try = false; 27962306a36Sopenharmony_ci break; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci case EVENT_CHANNEL_REPORT_RDY: 28262306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: Channel Report\n"); 28362306a36Sopenharmony_ci mwifiex_11h_handle_chanrpt_ready(priv, adapter->event_skb); 28462306a36Sopenharmony_ci break; 28562306a36Sopenharmony_ci case EVENT_RADAR_DETECTED: 28662306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: Radar detected\n"); 28762306a36Sopenharmony_ci mwifiex_11h_handle_radar_detected(priv, adapter->event_skb); 28862306a36Sopenharmony_ci break; 28962306a36Sopenharmony_ci case EVENT_BT_COEX_WLAN_PARA_CHANGE: 29062306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: BT coex wlan param update\n"); 29162306a36Sopenharmony_ci mwifiex_bt_coex_wlan_param_update_event(priv, 29262306a36Sopenharmony_ci adapter->event_skb); 29362306a36Sopenharmony_ci break; 29462306a36Sopenharmony_ci case EVENT_TX_DATA_PAUSE: 29562306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: TX DATA PAUSE\n"); 29662306a36Sopenharmony_ci mwifiex_process_tx_pause_event(priv, adapter->event_skb); 29762306a36Sopenharmony_ci break; 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci case EVENT_MULTI_CHAN_INFO: 30062306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, "event: multi-chan info\n"); 30162306a36Sopenharmony_ci mwifiex_process_multi_chan_event(priv, adapter->event_skb); 30262306a36Sopenharmony_ci break; 30362306a36Sopenharmony_ci case EVENT_RXBA_SYNC: 30462306a36Sopenharmony_ci dev_dbg(adapter->dev, "EVENT: RXBA_SYNC\n"); 30562306a36Sopenharmony_ci mwifiex_11n_rxba_sync_event(priv, adapter->event_body, 30662306a36Sopenharmony_ci adapter->event_skb->len - 30762306a36Sopenharmony_ci sizeof(eventcause)); 30862306a36Sopenharmony_ci break; 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci case EVENT_REMAIN_ON_CHAN_EXPIRED: 31162306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, 31262306a36Sopenharmony_ci "event: uap: Remain on channel expired\n"); 31362306a36Sopenharmony_ci cfg80211_remain_on_channel_expired(&priv->wdev, 31462306a36Sopenharmony_ci priv->roc_cfg.cookie, 31562306a36Sopenharmony_ci &priv->roc_cfg.chan, 31662306a36Sopenharmony_ci GFP_ATOMIC); 31762306a36Sopenharmony_ci memset(&priv->roc_cfg, 0x00, sizeof(struct mwifiex_roc_cfg)); 31862306a36Sopenharmony_ci break; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci default: 32162306a36Sopenharmony_ci mwifiex_dbg(adapter, EVENT, 32262306a36Sopenharmony_ci "event: unknown event id: %#x\n", eventcause); 32362306a36Sopenharmony_ci break; 32462306a36Sopenharmony_ci } 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci return 0; 32762306a36Sopenharmony_ci} 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_ci/* This function deletes station entry from associated station list. 33062306a36Sopenharmony_ci * Also if both AP and STA are 11n enabled, RxReorder tables and TxBA stream 33162306a36Sopenharmony_ci * tables created for this station are deleted. 33262306a36Sopenharmony_ci */ 33362306a36Sopenharmony_civoid mwifiex_uap_del_sta_data(struct mwifiex_private *priv, 33462306a36Sopenharmony_ci struct mwifiex_sta_node *node) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci if (priv->ap_11n_enabled && node->is_11n_enabled) { 33762306a36Sopenharmony_ci mwifiex_11n_del_rx_reorder_tbl_by_ta(priv, node->mac_addr); 33862306a36Sopenharmony_ci mwifiex_del_tx_ba_stream_tbl_by_ra(priv, node->mac_addr); 33962306a36Sopenharmony_ci } 34062306a36Sopenharmony_ci mwifiex_del_sta_entry(priv, node->mac_addr); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci return; 34362306a36Sopenharmony_ci} 344