/* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the * above copyright notice and this permission notice appear in all * copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifndef __CDP_TXRX_MOB_DEF_H #define __CDP_TXRX_MOB_DEF_H #include #include #define TX_WMM_AC_NUM 4 #define ENABLE_DP_HIST_STATS #define DP_MEMORY_OPT #ifndef CONFIG_BERYLLIUM #define DP_USE_SINGLE_TCL #endif #define DP_RX_DISABLE_NDI_MDNS_FORWARDING #define OL_TXQ_PAUSE_REASON_FW (1 << 0) #define OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED (1 << 1) #define OL_TXQ_PAUSE_REASON_TX_ABORT (1 << 2) #define OL_TXQ_PAUSE_REASON_VDEV_STOP (1 << 3) #define OL_TXQ_PAUSE_REASON_THERMAL_MITIGATION (1 << 4) #define OL_TXRX_INVALID_NUM_PEERS (-1) /* Maximum number of station supported by data path, including BC. */ #define WLAN_MAX_STA_COUNT (HAL_NUM_STA) /* The symbolic station ID return to HDD to specify the packet is bc/mc */ #define WLAN_RX_BCMC_STA_ID (WLAN_MAX_STA_COUNT + 1) /* The symbolic station ID return to HDD to specify the packet is to soft-AP itself */ #define WLAN_RX_SAP_SELF_STA_ID (WLAN_MAX_STA_COUNT + 2) /* is 802.11 address multicast/broadcast? */ #define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01) #define MAX_PEERS 32 /* * Bins used for reporting delay histogram: * bin 0: 0 - 10 ms delay * bin 1: 10 - 20 ms delay * bin 2: 20 - 40 ms delay * bin 3: 40 - 80 ms delay * bin 4: 80 - 160 ms delay * bin 5: > 160 ms delay */ #define QCA_TX_DELAY_HIST_REPORT_BINS 6 /* BA actions */ #define IEEE80211_ACTION_BA_ADDBA_REQUEST 0 /* ADDBA request */ #define IEEE80211_ACTION_BA_ADDBA_RESPONSE 1 /* ADDBA response */ #define IEEE80211_ACTION_BA_DELBA 2 /* DELBA */ #define IEEE80211_BA_POLICY_DELAYED 0 #define IEEE80211_BA_POLICY_IMMEDIATE 1 #define IEEE80211_BA_AMSDU_SUPPORTED 1 /** * enum netif_action_type - Type of actions on netif queues * @WLAN_NETIF_ACTION_TYPE_NONE: perform no action * @WLAN_STOP_ALL_NETIF_QUEUE: stop all netif queues * @WLAN_START_ALL_NETIF_QUEUE: start all netif queues * @WLAN_WAKE_ALL_NETIF_QUEUE: wake all netif queues * @WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER: stop all queues and off carrier * @WLAN_START_ALL_NETIF_QUEUE_N_CARRIER: start all queues and on carrier * @WLAN_NETIF_TX_DISABLE: disable tx * @WLAN_NETIF_TX_DISABLE_N_CARRIER: disable tx and off carrier * @WLAN_NETIF_CARRIER_ON: on carrier * @WLAN_NETIF_CARRIER_OFF: off carrier * @WLAN_NETIF_PRIORITY_QUEUE_ON: start priority netif queues * @WLAN_NETIF_PRIORITY_QUEUE_OFF: stop priority netif queues * @WLAN_NETIF_VO_QUEUE_ON: start voice queue * @WLAN_NETIF_VO_QUEUE_OFF: stop voice queue * @WLAN_NETIF_VI_QUEUE_ON: start video queue * @WLAN_NETIF_VI_QUEUE_OFF: stop video queue * @WLAN_NETIF_BE_BK_QUEUE_OFF: start best-effort & background queue * @WLAN_NETIF_BE_BK_QUEUE_ON: stop best-effort & background queue * @WLAN_WAKE_NON_PRIORITY_QUEUE: wake non priority netif queues * @WLAN_STOP_NON_PRIORITY_QUEUE: stop non priority netif queues * @WLAN_NETIF_ACTION_TYPE_MAX: Maximum action */ enum netif_action_type { WLAN_NETIF_ACTION_TYPE_NONE = 0, WLAN_STOP_ALL_NETIF_QUEUE = 1, WLAN_START_ALL_NETIF_QUEUE = 2, WLAN_WAKE_ALL_NETIF_QUEUE = 3, WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER = 4, WLAN_START_ALL_NETIF_QUEUE_N_CARRIER = 5, WLAN_NETIF_TX_DISABLE = 6, WLAN_NETIF_TX_DISABLE_N_CARRIER = 7, WLAN_NETIF_CARRIER_ON = 8, WLAN_NETIF_CARRIER_OFF = 9, WLAN_NETIF_PRIORITY_QUEUE_ON = 10, WLAN_NETIF_PRIORITY_QUEUE_OFF = 11, WLAN_NETIF_VO_QUEUE_ON = 12, WLAN_NETIF_VO_QUEUE_OFF = 13, WLAN_NETIF_VI_QUEUE_ON = 14, WLAN_NETIF_VI_QUEUE_OFF = 15, WLAN_NETIF_BE_BK_QUEUE_OFF = 16, WLAN_NETIF_BE_BK_QUEUE_ON = 17, WLAN_WAKE_NON_PRIORITY_QUEUE = 18, WLAN_STOP_NON_PRIORITY_QUEUE = 19, WLAN_NETIF_ACTION_TYPE_MAX, }; /** * enum netif_reason_type - reason for netif queue action * @WLAN_CONTROL_PATH: action from control path * @WLAN_DATA_FLOW_CONTROL: because of flow control * @WLAN_FW_PAUSE: because of firmware pause * @WLAN_TX_ABORT: because of tx abort * @WLAN_VDEV_STOP: because of vdev stop * @WLAN_PEER_UNAUTHORISED: because of peer is unauthorised * @WLAN_THERMAL_MITIGATION: because of thermal mitigation * @WLAN_DATA_FLOW_CONTROL_PRIORITY: * @WLAN_DATA_FLOW_CTRL_BE_BK: * @WLAN_DATA_FLOW_CTRL_VI: * @WLAN_DATA_FLOW_CTRL_VO: * @WLAN_DATA_FLOW_CTRL_PRI: * @WLAN_REASON_TYPE_MAX: maximum reason */ enum netif_reason_type { WLAN_CONTROL_PATH = 1, WLAN_DATA_FLOW_CONTROL, WLAN_FW_PAUSE, WLAN_TX_ABORT, WLAN_VDEV_STOP, WLAN_PEER_UNAUTHORISED, WLAN_THERMAL_MITIGATION, WLAN_DATA_FLOW_CONTROL_PRIORITY, WLAN_DATA_FLOW_CTRL_BE_BK, WLAN_DATA_FLOW_CTRL_VI, WLAN_DATA_FLOW_CTRL_VO, WLAN_DATA_FLOW_CTRL_PRI, WLAN_REASON_TYPE_MAX, }; enum ol_rx_err_type { OL_RX_ERR_DEFRAG_MIC, OL_RX_ERR_PN, OL_RX_ERR_UNKNOWN_PEER, OL_RX_ERR_MALFORMED, OL_RX_ERR_TKIP_MIC, OL_RX_ERR_DECRYPT, OL_RX_ERR_MPDU_LENGTH, OL_RX_ERR_ENCRYPT_REQUIRED, OL_RX_ERR_DUP, OL_RX_ERR_UNKNOWN, OL_RX_ERR_FCS, OL_RX_ERR_PRIVACY, OL_RX_ERR_NONE_FRAG, OL_RX_ERR_NONE = 0xFF }; enum throttle_level { THROTTLE_LEVEL_0, THROTTLE_LEVEL_1, THROTTLE_LEVEL_2, THROTTLE_LEVEL_3, THROTTLE_LEVEL_4, THROTTLE_LEVEL_5, /* Invalid */ THROTTLE_LEVEL_MAX, }; enum { OL_TX_WMM_AC_BE, OL_TX_WMM_AC_BK, OL_TX_WMM_AC_VI, OL_TX_WMM_AC_VO, OL_TX_NUM_WMM_AC }; /** * enum ol_tx_spec - indicate what non-standard transmission actions to apply * @OL_TX_SPEC_STD: do regular processing * @OL_TX_SPEC_RAW: skip encap + A-MSDU aggr * @OL_TX_SPEC_NO_AGGR: skip encap + all aggr * @OL_TX_SPEC_NO_ENCRYPT: skip encap + encrypt * @OL_TX_SPEC_TSO: TCP segmented * @OL_TX_SPEC_NWIFI_NO_ENCRYPT: skip encrypt for nwifi * @OL_TX_SPEC_NO_FREE: give to cb rather than free * * Indicate one or more of the following: * - The tx frame already has a complete 802.11 header. * Thus, skip 802.3/native-WiFi to 802.11 header encapsulation and * A-MSDU aggregation. * - The tx frame should not be aggregated (A-MPDU or A-MSDU) * - The tx frame is already encrypted - don't attempt encryption. * - The tx frame is a segment of a TCP jumbo frame. * - This tx frame should not be unmapped and freed by the txrx layer * after transmission, but instead given to a registered tx completion * callback. * More than one of these specification can apply, though typically * only a single specification is applied to a tx frame. * A compound specification can be created, as a bit-OR of these * specifications. */ enum ol_tx_spec { OL_TX_SPEC_STD = 0x0, /* do regular processing */ OL_TX_SPEC_RAW = 0x1, /* skip encap + A-MSDU aggr */ OL_TX_SPEC_NO_AGGR = 0x2, /* skip encap + all aggr */ OL_TX_SPEC_NO_ENCRYPT = 0x4, /* skip encap + encrypt */ OL_TX_SPEC_TSO = 0x8, /* TCP segmented */ OL_TX_SPEC_NWIFI_NO_ENCRYPT = 0x10, /* skip encrypt for nwifi */ OL_TX_SPEC_NO_FREE = 0x20, /* give to cb rather than free */ }; /** * enum peer_debug_id_type - debug ids to track peer get_ref and release_ref * @PEER_DEBUG_ID_OL_INTERNAL: debug id for OL internal usage * @PEER_DEBUG_ID_WMA_PKT_DROP: debug id for wma_is_pkt_drop_candidate API * @PEER_DEBUG_ID_WMA_ADDBA_REQ: debug id for ADDBA request * @PEER_DEBUG_ID_WMA_DELBA_REQ: debug id for DELBA request * @PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP: debug id for send ADDBA response * @PEER_DEBUG_ID_OL_RX_THREAD: debug id for rx thread * @PEER_DEBUG_ID_WMA_CCMP_REPLAY_ATTACK: debug id for CCMP replay * @PEER_DEBUG_ID_WMA_DEL_BSS:debug id for remove BSS * @PEER_DEBUG_ID_WMA_VDEV_STOP_RESP:debug id for vdev stop response handler * @PEER_DEBUG_ID_OL_PEER_MAP:debug id for peer map/unmap * @PEER_DEBUG_ID_OL_PEER_ATTACH: debug id for peer attach/detach * @PEER_DEBUG_ID_OL_TXQ_VDEV_FL: debug id for vdev flush * @PEER_DEBUG_ID_OL_HASH_ERS: debug id for peer find hash erase * @PEER_DEBUG_ID_OL_UNMAP_TIMER_WORK: debug id for peer unmap timer work * @PEER_DEBUG_ID_MAX: debug id MAX * * Unique peer debug IDs to track the callers. Each new usage can add to * this enum list to create a new "PEER_DEBUG_ID_". */ enum peer_debug_id_type { PEER_DEBUG_ID_OL_INTERNAL, PEER_DEBUG_ID_WMA_PKT_DROP, PEER_DEBUG_ID_WMA_ADDBA_REQ, PEER_DEBUG_ID_WMA_DELBA_REQ, PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP, PEER_DEBUG_ID_OL_RX_THREAD, PEER_DEBUG_ID_WMA_CCMP_REPLAY_ATTACK, PEER_DEBUG_ID_WMA_DEL_BSS, PEER_DEBUG_ID_WMA_VDEV_STOP_RESP, PEER_DEBUG_ID_OL_PEER_MAP, PEER_DEBUG_ID_OL_PEER_ATTACH, PEER_DEBUG_ID_OL_TXQ_VDEV_FL, PEER_DEBUG_ID_OL_HASH_ERS, PEER_DEBUG_ID_OL_UNMAP_TIMER_WORK, PEER_DEBUG_ID_MAX }; /** * enum cdp_peer_bw - Bandwidth types * @CDP_20_MHZ: 20MHz BW * @CDP_40_MHZ: 40MHz BW * @CDP_80_MHZ: 80MHz BW * @CDP_160_MHZ: 160MHz BW * @CDP_80P80_MHZ: 80+80MHz BW * @CDP_5_MHZ: 5MHz BW * @CDP_10_MHZ: 10MHz BW * @CDP_320_MHZ: 320MHz BW * @CDP_BW_INVALID: Invalid BW * @CDP_BW_MAX: Max BW id */ enum cdp_peer_bw { CDP_20_MHZ, CDP_40_MHZ, CDP_80_MHZ, CDP_160_MHZ, CDP_80P80_MHZ, CDP_5_MHZ, CDP_10_MHZ, CDP_320_MHZ, CDP_BW_INVALID, CDP_BW_MAX }; /** * struct ol_txrx_desc_type - txrx descriptor type * @is_qos_enabled: is station qos enabled * @is_wapi_supported: is station wapi supported * @peer_addr: peer mac address * @bw: bandwidth of peer connection */ struct ol_txrx_desc_type { uint8_t is_qos_enabled; uint8_t is_wapi_supported; struct qdf_mac_addr peer_addr; enum cdp_peer_bw bw; }; /** * struct ol_tx_sched_wrr_ac_specs_t - the wrr ac specs params structure * @wrr_skip_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs. * wrr_skip_weight * @credit_threshold: map to ol_tx_sched_wrr_adv_category_info_t.specs. * credit_threshold * @send_limit: map to ol_tx_sched_wrr_adv_category_info_t.specs. * send_limit * @credit_reserve: map to ol_tx_sched_wrr_adv_category_info_t.specs. * credit_reserve * @discard_weight: map to ol_tx_sched_wrr_adv_category_info_t.specs. * discard_weight * * This structure is for wrr ac specs params set from user, it will update * its content corresponding to the ol_tx_sched_wrr_adv_category_info_t.specs. */ struct ol_tx_sched_wrr_ac_specs_t { int wrr_skip_weight; uint32_t credit_threshold; uint16_t send_limit; int credit_reserve; int discard_weight; }; /** * struct txrx_pdev_cfg_param_t - configuration information * passed to the data path * @is_full_reorder_offload: * @is_uc_offload_enabled: IPA Micro controller data path offload enable flag * @uc_tx_buffer_count: IPA Micro controller data path offload TX buffer count * @uc_tx_buffer_size: IPA Micro controller data path offload TX buffer size * @uc_rx_indication_ring_count: IPA Micro controller data path offload RX * indication ring count * @uc_tx_partition_base: IPA Micro controller data path offload TX partition * base * @ip_tcp_udp_checksum_offload: IP, TCP and UDP checksum offload * @nan_ip_tcp_udp_checksum_offload: IP, TCP and UDP checksum offload for NAN * Mode * @p2p_ip_tcp_udp_checksum_offload: IP, TCP and UDP checksum offload for P2P * Mod * @legacy_mode_csum_disable: Checksum offload override flag for Legcay modes * @enable_rxthread: Rx processing in thread from TXRX * @ce_classify_enabled: CE classification enabled through INI * @tx_flow_stop_queue_th: Threshold to stop queue in percentage * @tx_flow_start_queue_offset: Start queue offset in percentage * @del_ack_enable: enable the tcp delay ack feature in the driver * @del_ack_timer_value: timeout if no more tcp ack frames, unit is ms * @del_ack_pkt_count: the maximum number of replaced tcp ack frames * @ac_specs: * @gro_enable: * @tso_enable: * @lro_enable: * @sg_enable: * @enable_data_stall_detection: * @enable_flow_steering: * @disable_intra_bss_fwd: * @bundle_timer_value: * @bundle_size: * @pktlog_buffer_size: */ struct txrx_pdev_cfg_param_t { uint8_t is_full_reorder_offload; uint8_t is_uc_offload_enabled; uint32_t uc_tx_buffer_count; uint32_t uc_tx_buffer_size; uint32_t uc_rx_indication_ring_count; uint32_t uc_tx_partition_base; bool ip_tcp_udp_checksum_offload; bool nan_ip_tcp_udp_checksum_offload; bool p2p_ip_tcp_udp_checksum_offload; bool legacy_mode_csum_disable; bool enable_rxthread; bool ce_classify_enabled; #if defined(QCA_LL_TX_FLOW_CONTROL_V2) || defined(QCA_LL_PDEV_TX_FLOW_CONTROL) uint32_t tx_flow_stop_queue_th; uint32_t tx_flow_start_queue_offset; #endif #ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK bool del_ack_enable; uint16_t del_ack_timer_value; uint16_t del_ack_pkt_count; #endif struct ol_tx_sched_wrr_ac_specs_t ac_specs[TX_WMM_AC_NUM]; bool gro_enable; bool tso_enable; bool lro_enable; bool sg_enable; uint32_t enable_data_stall_detection; bool enable_flow_steering; bool disable_intra_bss_fwd; #ifdef WLAN_SUPPORT_TXRX_HL_BUNDLE uint16_t bundle_timer_value; uint16_t bundle_size; #endif uint8_t pktlog_buffer_size; }; #ifdef IPA_OFFLOAD /** * struct ol_txrx_ipa_resources - Resources needed for IPA * @ce_sr: * @ce_sr_ring_size: * @ce_reg_paddr: * @tx_comp_ring: * @tx_num_alloc_buffer: * @rx_rdy_ring: * @rx_proc_done_idx: * @rx2_rdy_ring: * @rx2_proc_done_idx: * @tx_comp_doorbell_dmaaddr: IPA UC Tx Complete doorbell register paddr * @rx_ready_doorbell_dmaaddr: IPA UC Rx Ready doorbell register paddr * @tx_pipe_handle: * @rx_pipe_handle: */ struct ol_txrx_ipa_resources { qdf_shared_mem_t *ce_sr; uint32_t ce_sr_ring_size; qdf_dma_addr_t ce_reg_paddr; qdf_shared_mem_t *tx_comp_ring; uint32_t tx_num_alloc_buffer; qdf_shared_mem_t *rx_rdy_ring; qdf_shared_mem_t *rx_proc_done_idx; qdf_shared_mem_t *rx2_rdy_ring; qdf_shared_mem_t *rx2_proc_done_idx; /* IPA UC doorbell registers paddr */ qdf_dma_addr_t tx_comp_doorbell_dmaaddr; qdf_dma_addr_t rx_ready_doorbell_dmaaddr; uint32_t tx_pipe_handle; uint32_t rx_pipe_handle; }; #endif struct ol_txrx_ocb_chan_info { uint32_t chan_freq; uint16_t disable_rx_stats_hdr:1; }; /** * struct ol_mic_error_info - carries the information associated with * a MIC error * @vdev_id: virtual device ID * @key_id: Key ID * @pn: packet number * @sa: source address * @da: destination address * @ta: transmitter address */ struct ol_mic_error_info { uint8_t vdev_id; uint32_t key_id; uint64_t pn; uint8_t sa[QDF_MAC_ADDR_SIZE]; uint8_t da[QDF_MAC_ADDR_SIZE]; uint8_t ta[QDF_MAC_ADDR_SIZE]; }; /** * struct ol_error_info - carries the information associated with an * error indicated by the firmware * @u: union of error information structs * @u.mic_err: MIC error information */ struct ol_error_info { union { struct ol_mic_error_info mic_err; } u; }; /** * struct ol_txrx_ocb_set_chan - txrx OCB channel info * @ocb_channel_count: Channel count * @ocb_channel_info: OCB channel info */ struct ol_txrx_ocb_set_chan { uint32_t ocb_channel_count; struct ol_txrx_ocb_chan_info *ocb_channel_info; }; /** * struct ol_tx_ac_param_t - WMM parameters * @aifs: Arbitration Inter-Frame Space * @cwmin: Minimum contention window size * @cwmax: Maximum contention window size * * The struct is used to specify information to update TX WMM scheduler. */ struct ol_tx_ac_param_t { uint32_t aifs; uint32_t cwmin; uint32_t cwmax; }; struct ol_tx_wmm_param_t { struct ol_tx_ac_param_t ac[OL_TX_NUM_WMM_AC]; }; struct ieee80211_ba_parameterset { #if _BYTE_ORDER == _BIG_ENDIAN uint16_t buffersize:10, /* B6-15 buffer size */ tid:4, /* B2-5 TID */ bapolicy:1, /* B1 block ack policy */ amsdusupported:1; /* B0 amsdu supported */ #else uint16_t amsdusupported:1, /* B0 amsdu supported */ bapolicy:1, /* B1 block ack policy */ tid:4, /* B2-5 TID */ buffersize:10; /* B6-15 buffer size */ #endif } __packed; struct ieee80211_ba_seqctrl { #if _BYTE_ORDER == _BIG_ENDIAN uint16_t startseqnum:12, /* B4-15 starting sequence number */ fragnum:4; /* B0-3 fragment number */ #else uint16_t fragnum:4, /* B0-3 fragment number */ startseqnum:12; /* B4-15 starting sequence number */ #endif } __packed; struct ieee80211_delba_parameterset { #if _BYTE_ORDER == _BIG_ENDIAN uint16_t tid:4, /* B12-15 tid */ initiator:1, /* B11 initiator */ reserved0:11; /* B0-10 reserved */ #else uint16_t reserved0:11, /* B0-10 reserved */ initiator:1, /* B11 initiator */ tid:4; /* B12-15 tid */ #endif } __packed; /** * typedef ol_txrx_vdev_peer_remove_cb() - wma_remove_peer callback * @handle: callback handle * @bssid: BSSID * @vdev_id: virtual device ID * @peer: peer */ typedef void (*ol_txrx_vdev_peer_remove_cb)(void *handle, uint8_t *bssid, uint8_t vdev_id, void *peer); /** * typedef tx_pause_callback() - OSIF function registered with the data path * @vdev_id: virtual device id * @action: tx pause action to take * @reason: reason for the tx pause action */ typedef void (*tx_pause_callback)(uint8_t vdev_id, enum netif_action_type action, enum netif_reason_type reason); /** * struct ol_rx_inv_peer_params - rx invalid peer data parameters * @vdev_id: Virtual device ID * @ra: RX data receiver MAC address * @ta: RX data transmitter MAC address */ struct ol_rx_inv_peer_params { uint8_t vdev_id; uint8_t ra[QDF_MAC_ADDR_SIZE]; uint8_t ta[QDF_MAC_ADDR_SIZE]; }; /** * struct cdp_txrx_ext_stats: dp extended stats * @tx_msdu_enqueue: tx msdu queued to hw * @tx_msdu_overflow: tx msdu overflow * @rx_mpdu_received: rx mpdu processed by hw * @rx_mpdu_delivered: rx mpdu received from hw * @rx_mpdu_error: rx mpdu error count * @rx_mpdu_missed: rx mpdu missed by hw */ struct cdp_txrx_ext_stats { uint32_t tx_msdu_enqueue; uint32_t tx_msdu_overflow; uint32_t rx_mpdu_received; uint32_t rx_mpdu_delivered; uint32_t rx_mpdu_error; uint32_t rx_mpdu_missed; }; #endif /* __CDP_TXRX_MOB_DEF_H */