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