162306a36Sopenharmony_ci/* SPDX-License-Identifier: BSD-3-Clause-Clear */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. 462306a36Sopenharmony_ci * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef ATH12K_DP_MON_H 862306a36Sopenharmony_ci#define ATH12K_DP_MON_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "core.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cienum dp_monitor_mode { 1362306a36Sopenharmony_ci ATH12K_DP_TX_MONITOR_MODE, 1462306a36Sopenharmony_ci ATH12K_DP_RX_MONITOR_MODE 1562306a36Sopenharmony_ci}; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cienum dp_mon_tx_ppdu_info_type { 1862306a36Sopenharmony_ci DP_MON_TX_PROT_PPDU_INFO, 1962306a36Sopenharmony_ci DP_MON_TX_DATA_PPDU_INFO 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cienum dp_mon_tx_tlv_status { 2362306a36Sopenharmony_ci DP_MON_TX_FES_SETUP, 2462306a36Sopenharmony_ci DP_MON_TX_FES_STATUS_END, 2562306a36Sopenharmony_ci DP_MON_RX_RESPONSE_REQUIRED_INFO, 2662306a36Sopenharmony_ci DP_MON_RESPONSE_END_STATUS_INFO, 2762306a36Sopenharmony_ci DP_MON_TX_MPDU_START, 2862306a36Sopenharmony_ci DP_MON_TX_MSDU_START, 2962306a36Sopenharmony_ci DP_MON_TX_BUFFER_ADDR, 3062306a36Sopenharmony_ci DP_MON_TX_DATA, 3162306a36Sopenharmony_ci DP_MON_TX_STATUS_PPDU_NOT_DONE, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cienum dp_mon_tx_medium_protection_type { 3562306a36Sopenharmony_ci DP_MON_TX_MEDIUM_NO_PROTECTION, 3662306a36Sopenharmony_ci DP_MON_TX_MEDIUM_RTS_LEGACY, 3762306a36Sopenharmony_ci DP_MON_TX_MEDIUM_RTS_11AC_STATIC_BW, 3862306a36Sopenharmony_ci DP_MON_TX_MEDIUM_RTS_11AC_DYNAMIC_BW, 3962306a36Sopenharmony_ci DP_MON_TX_MEDIUM_CTS2SELF, 4062306a36Sopenharmony_ci DP_MON_TX_MEDIUM_QOS_NULL_NO_ACK_3ADDR, 4162306a36Sopenharmony_ci DP_MON_TX_MEDIUM_QOS_NULL_NO_ACK_4ADDR 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistruct dp_mon_qosframe_addr4 { 4562306a36Sopenharmony_ci __le16 frame_control; 4662306a36Sopenharmony_ci __le16 duration; 4762306a36Sopenharmony_ci u8 addr1[ETH_ALEN]; 4862306a36Sopenharmony_ci u8 addr2[ETH_ALEN]; 4962306a36Sopenharmony_ci u8 addr3[ETH_ALEN]; 5062306a36Sopenharmony_ci __le16 seq_ctrl; 5162306a36Sopenharmony_ci u8 addr4[ETH_ALEN]; 5262306a36Sopenharmony_ci __le16 qos_ctrl; 5362306a36Sopenharmony_ci} __packed; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistruct dp_mon_frame_min_one { 5662306a36Sopenharmony_ci __le16 frame_control; 5762306a36Sopenharmony_ci __le16 duration; 5862306a36Sopenharmony_ci u8 addr1[ETH_ALEN]; 5962306a36Sopenharmony_ci} __packed; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistruct dp_mon_packet_info { 6262306a36Sopenharmony_ci u64 cookie; 6362306a36Sopenharmony_ci u16 dma_length; 6462306a36Sopenharmony_ci bool msdu_continuation; 6562306a36Sopenharmony_ci bool truncated; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistruct dp_mon_tx_ppdu_info { 6962306a36Sopenharmony_ci u32 ppdu_id; 7062306a36Sopenharmony_ci u8 num_users; 7162306a36Sopenharmony_ci bool is_used; 7262306a36Sopenharmony_ci struct hal_rx_mon_ppdu_info rx_status; 7362306a36Sopenharmony_ci struct list_head dp_tx_mon_mpdu_list; 7462306a36Sopenharmony_ci struct dp_mon_mpdu *tx_mon_mpdu; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cienum hal_rx_mon_status 7862306a36Sopenharmony_ciath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar, 7962306a36Sopenharmony_ci struct ath12k_mon_data *pmon, 8062306a36Sopenharmony_ci int mac_id, struct sk_buff *skb, 8162306a36Sopenharmony_ci struct napi_struct *napi); 8262306a36Sopenharmony_ciint ath12k_dp_mon_buf_replenish(struct ath12k_base *ab, 8362306a36Sopenharmony_ci struct dp_rxdma_ring *buf_ring, 8462306a36Sopenharmony_ci int req_entries); 8562306a36Sopenharmony_ciint ath12k_dp_mon_srng_process(struct ath12k *ar, int mac_id, 8662306a36Sopenharmony_ci int *budget, enum dp_monitor_mode monitor_mode, 8762306a36Sopenharmony_ci struct napi_struct *napi); 8862306a36Sopenharmony_ciint ath12k_dp_mon_process_ring(struct ath12k_base *ab, int mac_id, 8962306a36Sopenharmony_ci struct napi_struct *napi, int budget, 9062306a36Sopenharmony_ci enum dp_monitor_mode monitor_mode); 9162306a36Sopenharmony_cistruct sk_buff *ath12k_dp_mon_tx_alloc_skb(void); 9262306a36Sopenharmony_cienum dp_mon_tx_tlv_status 9362306a36Sopenharmony_ciath12k_dp_mon_tx_status_get_num_user(u16 tlv_tag, 9462306a36Sopenharmony_ci struct hal_tlv_hdr *tx_tlv, 9562306a36Sopenharmony_ci u8 *num_users); 9662306a36Sopenharmony_cienum hal_rx_mon_status 9762306a36Sopenharmony_ciath12k_dp_mon_tx_parse_mon_status(struct ath12k *ar, 9862306a36Sopenharmony_ci struct ath12k_mon_data *pmon, 9962306a36Sopenharmony_ci int mac_id, 10062306a36Sopenharmony_ci struct sk_buff *skb, 10162306a36Sopenharmony_ci struct napi_struct *napi, 10262306a36Sopenharmony_ci u32 ppdu_id); 10362306a36Sopenharmony_civoid ath12k_dp_mon_rx_process_ulofdma(struct hal_rx_mon_ppdu_info *ppdu_info); 10462306a36Sopenharmony_ciint ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id, 10562306a36Sopenharmony_ci struct napi_struct *napi, int *budget); 10662306a36Sopenharmony_ci#endif 107