xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name #ifndef _DP_MON_2_0_H_
19*5113495bSYour Name #define _DP_MON_2_0_H_
20*5113495bSYour Name 
21*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG)
22*5113495bSYour Name #include <qdf_lock.h>
23*5113495bSYour Name #include <dp_types.h>
24*5113495bSYour Name #include <dp_mon.h>
25*5113495bSYour Name #include <dp_mon_filter.h>
26*5113495bSYour Name #include <dp_htt.h>
27*5113495bSYour Name #include <dp_mon.h>
28*5113495bSYour Name #ifdef WLAN_PKT_CAPTURE_TX_2_0
29*5113495bSYour Name #include <dp_tx_mon_2.0.h>
30*5113495bSYour Name #endif
31*5113495bSYour Name #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048
32*5113495bSYour Name #define DP_MON_DATA_BUFFER_SIZE     2048
33*5113495bSYour Name #define DP_MON_DESC_MAGIC 0xdeadabcd
34*5113495bSYour Name #define DP_MON_MAX_STATUS_BUF 1200
35*5113495bSYour Name #define DP_MON_QUEUE_DEPTH_MAX 16
36*5113495bSYour Name #define DP_MON_MSDU_LOGGING 0
37*5113495bSYour Name #define DP_MON_MPDU_LOGGING 1
38*5113495bSYour Name #define DP_MON_DESC_ADDR_MASK 0x000000FFFFFFFFFF
39*5113495bSYour Name #define DP_MON_DESC_ADDR_SHIFT 40
40*5113495bSYour Name #define DP_MON_DESC_FIXED_ADDR_MASK 0xFFFFFF
41*5113495bSYour Name #define DP_MON_DESC_FIXED_ADDR ((uint64_t)DP_MON_DESC_FIXED_ADDR_MASK << \
42*5113495bSYour Name 	DP_MON_DESC_COOKIE_LSB)
43*5113495bSYour Name #define DP_MON_DESC_COOKIE_MASK 0xFFFFFF0000000000
44*5113495bSYour Name #define DP_MON_DESC_COOKIE_SHIFT 24
45*5113495bSYour Name #define DP_MON_DESC_COOKIE_LSB 40
46*5113495bSYour Name #define DP_MON_GET_COOKIE(mon_desc) \
47*5113495bSYour Name 	((uint32_t)(((unsigned long long)(mon_desc) & DP_MON_DESC_COOKIE_MASK) \
48*5113495bSYour Name 	>> DP_MON_DESC_COOKIE_LSB))
49*5113495bSYour Name 
50*5113495bSYour Name #ifdef DP_RX_MON_DESC_64_BIT
51*5113495bSYour Name #define  DP_MON_GET_DESC(mon_desc) \
52*5113495bSYour Name 	((struct dp_mon_desc *)(uintptr_t)(((unsigned long long)(mon_desc) & \
53*5113495bSYour Name 	DP_MON_DESC_ADDR_MASK) | ((unsigned long long)DP_MON_DESC_FIXED_ADDR)))
54*5113495bSYour Name 
55*5113495bSYour Name #else
56*5113495bSYour Name #define  DP_MON_GET_DESC(mon_desc) \
57*5113495bSYour Name 	((struct dp_mon_desc *)(uintptr_t)(((unsigned long)(mon_desc) & \
58*5113495bSYour Name 	DP_MON_DESC_ADDR_MASK)))
59*5113495bSYour Name #endif
60*5113495bSYour Name 
61*5113495bSYour Name #define DP_MON_DECAP_FORMAT_INVALID 0xff
62*5113495bSYour Name #define DP_MON_MIN_FRAGS_FOR_RESTITCH 2
63*5113495bSYour Name 
64*5113495bSYour Name #ifdef MONITOR_TLV_RECORDING_ENABLE
65*5113495bSYour Name #define MONITOR_TLV_RECORDING_RX 1
66*5113495bSYour Name #define MONITOR_TLV_RECORDING_TX 2
67*5113495bSYour Name #define MONITOR_TLV_RECORDING_RXTX 3
68*5113495bSYour Name 
69*5113495bSYour Name #define MAX_TLV_LOGGING_SIZE 1024
70*5113495bSYour Name 
71*5113495bSYour Name #define MAX_PPDU_START_TLV_NUM 38
72*5113495bSYour Name #define MAX_MPDU_TLV_NUM 160
73*5113495bSYour Name #define MAX_PPDU_END_TLV_NUM 57
74*5113495bSYour Name 
75*5113495bSYour Name #define MAX_NUM_PPDU_RECORD 4
76*5113495bSYour Name #define MAX_TLVS_PER_PPDU 255
77*5113495bSYour Name 
78*5113495bSYour Name /*
79*5113495bSYour Name  * struct dp_mon_tlv_info - recorded information of each TLV
80*5113495bSYour Name  * @tlv_tag: tlv tag
81*5113495bSYour Name  * @data: union of struct of fields to be recorded for each TLV
82*5113495bSYour Name  *
83*5113495bSYour Name  * Tag and its corresponding important fields are stored in this struct
84*5113495bSYour Name  */
85*5113495bSYour Name struct dp_mon_tlv_info {
86*5113495bSYour Name 	uint32_t tlv_tag:10;
87*5113495bSYour Name 	union {
88*5113495bSYour Name 		struct hal_ppdu_start_tlv_record ppdu_start;
89*5113495bSYour Name 		struct hal_ppdu_start_user_info_tlv_record  ppdu_start_user_info;
90*5113495bSYour Name 		struct hal_mpdu_start_tlv_record mpdu_start;
91*5113495bSYour Name 		struct hal_mpdu_end_tlv_record mpdu_end;
92*5113495bSYour Name 		struct hal_header_tlv_record header;
93*5113495bSYour Name 		struct hal_msdu_end_tlv_record msdu_end;
94*5113495bSYour Name 		struct hal_mon_buffer_addr_tlv_record mon_buffer_addr;
95*5113495bSYour Name 		struct hal_phy_location_tlv_record phy_location;
96*5113495bSYour Name 		struct hal_ppdu_end_user_stats_tlv_record ppdu_end_user_stats;
97*5113495bSYour Name 		struct hal_pcu_ppdu_end_info_tlv_record pcu_ppdu_end_info;
98*5113495bSYour Name 		struct hal_phy_rx_ht_sig_tlv_record phy_rx_ht_sig;
99*5113495bSYour Name 		uint32_t data:22;
100*5113495bSYour Name 	} data;
101*5113495bSYour Name };
102*5113495bSYour Name 
103*5113495bSYour Name /*
104*5113495bSYour Name  * struct dp_tx_mon_tlv_info - recorded information of each Tx TLV
105*5113495bSYour Name  * @tlv_tag: tlv tag
106*5113495bSYour Name  * @data: union of struct of fields to be recorded for each TLV
107*5113495bSYour Name  *
108*5113495bSYour Name  * Tag and its corresponding important fields are stored in this struct
109*5113495bSYour Name  */
110*5113495bSYour Name 
111*5113495bSYour Name struct dp_tx_mon_tlv_info {
112*5113495bSYour Name 	uint32_t tlv_tag:10;
113*5113495bSYour Name 	union {
114*5113495bSYour Name 		/*struct of Tx TLVs to be added here*/
115*5113495bSYour Name 		uint32_t data:22;
116*5113495bSYour Name 	} data;
117*5113495bSYour Name };
118*5113495bSYour Name 
119*5113495bSYour Name /**
120*5113495bSYour Name  * struct dp_mon_tlv_logger - contains indexes and other data of the buffer
121*5113495bSYour Name  * @buff: buffer in which TLVs are stored
122*5113495bSYour Name  * @curr_ppdu_pos: position of the next ppdu to be written
123*5113495bSYour Name  * @ppdu_start_idx: starting index form which PPDU start level TLVs are stored for a ppdu
124*5113495bSYour Name  * @mpdu_idx: starting index form which MPDU TLVs are stored for a ppdu
125*5113495bSYour Name  * @ppdu_end_idx: starting index form which PPDU end level TLVs are stored for a ppdu
126*5113495bSYour Name  * @max_ppdu_start_idx: ending index for PPDU start level TLVs for a ppdu
127*5113495bSYour Name  * @max_mpdu_idx: ending index for MPDU level TLVs for a ppdu
128*5113495bSYour Name  * @max_ppdu_end_idx: ending index for PPDU end level TLVs for a ppdu
129*5113495bSYour Name  * @wrap_flag: flag toggle between consecutive PPDU
130*5113495bSYour Name  * @tlv_logging_enable: check is tlv logging is enabled
131*5113495bSYour Name  *
132*5113495bSYour Name  */
133*5113495bSYour Name struct dp_mon_tlv_logger {
134*5113495bSYour Name 	void *buff;
135*5113495bSYour Name 	uint16_t curr_ppdu_pos;
136*5113495bSYour Name 	uint16_t ppdu_start_idx;
137*5113495bSYour Name 	uint16_t mpdu_idx;
138*5113495bSYour Name 	uint16_t ppdu_end_idx;
139*5113495bSYour Name 	uint16_t max_ppdu_start_idx;
140*5113495bSYour Name 	uint16_t max_ppdu_end_idx;
141*5113495bSYour Name 	uint16_t max_mpdu_idx;
142*5113495bSYour Name 	uint8_t wrap_flag;
143*5113495bSYour Name 	bool tlv_logging_enable;
144*5113495bSYour Name };
145*5113495bSYour Name #endif
146*5113495bSYour Name 
147*5113495bSYour Name /* monitor frame filter modes */
148*5113495bSYour Name enum dp_mon_frm_filter_mode {
149*5113495bSYour Name 	/* mode filter pass */
150*5113495bSYour Name 	DP_MON_FRM_FILTER_MODE_FP = 0,
151*5113495bSYour Name 	/* mode monitor direct */
152*5113495bSYour Name 	DP_MON_FRM_FILTER_MODE_MD = 1,
153*5113495bSYour Name 	/* mode monitor other */
154*5113495bSYour Name 	DP_MON_FRM_FILTER_MODE_MO = 2,
155*5113495bSYour Name 	/* mode filter pass monitor other */
156*5113495bSYour Name 	DP_MON_FRM_FILTER_MODE_FP_MO = 3,
157*5113495bSYour Name };
158*5113495bSYour Name 
159*5113495bSYour Name /* mpdu filter categories */
160*5113495bSYour Name enum dp_mpdu_filter_category {
161*5113495bSYour Name 	/* category filter pass */
162*5113495bSYour Name 	DP_MPDU_FILTER_CATEGORY_FP = 0,
163*5113495bSYour Name 	/* category monitor direct */
164*5113495bSYour Name 	DP_MPDU_FILTER_CATEGORY_MD = 1,
165*5113495bSYour Name 	/* category monitor other */
166*5113495bSYour Name 	DP_MPDU_FILTER_CATEGORY_MO = 2,
167*5113495bSYour Name 	/* category filter pass monitor override */
168*5113495bSYour Name 	DP_MPDU_FILTER_CATEGORY_FP_MO = 3,
169*5113495bSYour Name };
170*5113495bSYour Name 
171*5113495bSYour Name /**
172*5113495bSYour Name  * struct dp_mon_filter_be - Monitor TLV filter
173*5113495bSYour Name  * @rx_tlv_filter: Rx MON TLV filter
174*5113495bSYour Name  * @tx_tlv_filter: Tx MON TLV filter
175*5113495bSYour Name  * @tx_valid: enable/disable Tx Mon TLV filter
176*5113495bSYour Name  */
177*5113495bSYour Name struct dp_mon_filter_be {
178*5113495bSYour Name 	struct dp_mon_filter rx_tlv_filter;
179*5113495bSYour Name #ifdef WLAN_PKT_CAPTURE_TX_2_0
180*5113495bSYour Name 	struct htt_tx_ring_tlv_filter tx_tlv_filter;
181*5113495bSYour Name #endif
182*5113495bSYour Name 	bool tx_valid;
183*5113495bSYour Name };
184*5113495bSYour Name 
185*5113495bSYour Name /**
186*5113495bSYour Name  * struct dp_mon_desc
187*5113495bSYour Name  *
188*5113495bSYour Name  * @buf_addr: virtual address
189*5113495bSYour Name  * @paddr: physical address
190*5113495bSYour Name  * @in_use: desc is in use
191*5113495bSYour Name  * @unmapped: used to mark desc an unmapped if the corresponding
192*5113495bSYour Name  * nbuf is already unmapped
193*5113495bSYour Name  * @cookie_2: unique cookie provided as part of 64 bit cookie to HW
194*5113495bSYour Name  * @end_offset: offset in status buffer where DMA ended
195*5113495bSYour Name  * @cookie: unique desc identifier
196*5113495bSYour Name  * @magic: magic number to validate desc data
197*5113495bSYour Name  */
198*5113495bSYour Name struct dp_mon_desc {
199*5113495bSYour Name 	uint8_t *buf_addr;
200*5113495bSYour Name 	qdf_dma_addr_t paddr;
201*5113495bSYour Name 	uint32_t in_use:1,
202*5113495bSYour Name 		unmapped:1,
203*5113495bSYour Name 		cookie_2:24;
204*5113495bSYour Name 	uint16_t end_offset;
205*5113495bSYour Name 	uint32_t cookie;
206*5113495bSYour Name 	uint32_t magic;
207*5113495bSYour Name };
208*5113495bSYour Name 
209*5113495bSYour Name /**
210*5113495bSYour Name  * struct dp_mon_desc_list_elem_t
211*5113495bSYour Name  * @next: Next pointer to form free list
212*5113495bSYour Name  * @mon_desc: DP mon descriptor
213*5113495bSYour Name  */
214*5113495bSYour Name union dp_mon_desc_list_elem_t {
215*5113495bSYour Name 	union dp_mon_desc_list_elem_t *next;
216*5113495bSYour Name 	struct dp_mon_desc mon_desc;
217*5113495bSYour Name };
218*5113495bSYour Name 
219*5113495bSYour Name /**
220*5113495bSYour Name  * struct dp_mon_desc_pool - monitor desc pool
221*5113495bSYour Name  * @pool_size: number of descriptor in the pool
222*5113495bSYour Name  * @array: pointer to array of descriptor
223*5113495bSYour Name  * @freelist: pointer to free descriptor list
224*5113495bSYour Name  * @lock: Protection for the descriptor pool
225*5113495bSYour Name  * @owner: owner for nbuf
226*5113495bSYour Name  * @buf_size: Buffer size
227*5113495bSYour Name  * @buf_alignment: Buffer alignment
228*5113495bSYour Name  * @pf_cache: page frag cache
229*5113495bSYour Name  */
230*5113495bSYour Name struct dp_mon_desc_pool {
231*5113495bSYour Name 	uint32_t pool_size;
232*5113495bSYour Name 	union dp_mon_desc_list_elem_t *array;
233*5113495bSYour Name 	union dp_mon_desc_list_elem_t *freelist;
234*5113495bSYour Name 	qdf_spinlock_t lock;
235*5113495bSYour Name 	uint8_t owner;
236*5113495bSYour Name 	uint16_t buf_size;
237*5113495bSYour Name 	uint8_t buf_alignment;
238*5113495bSYour Name 	qdf_frag_cache_t pf_cache;
239*5113495bSYour Name };
240*5113495bSYour Name 
241*5113495bSYour Name /*
242*5113495bSYour Name  * NB: intentionally not using kernel-doc comment because the kernel-doc
243*5113495bSYour Name  *     script does not handle the TAILQ_HEAD macro
244*5113495bSYour Name  * struct dp_mon_pdev_be - BE specific monitor pdev object
245*5113495bSYour Name  * @mon_pdev: monitor pdev structure
246*5113495bSYour Name  * @filter_be: filters sent to fw
247*5113495bSYour Name  * @tx_mon_mode: tx monitor mode
248*5113495bSYour Name  * @tx_mon_filter_length: tx monitor filter length
249*5113495bSYour Name  * @tx_monitor_be: pointer to tx monitor be structure
250*5113495bSYour Name  * @tx_stats: tx monitor drop stats
251*5113495bSYour Name  * @rx_mon_wq_lock: Rx mon workqueue lock
252*5113495bSYour Name  * @rx_mon_workqueue: Rx mon workqueue
253*5113495bSYour Name  * @rx_mon_work: Rx mon work
254*5113495bSYour Name  * @rx_mon_queue: RxMON queue
255*5113495bSYour Name  * @rx_mon_free_queue: RxMON ppdu info free element queue
256*5113495bSYour Name  * @ppdu_info_lock: RxPPDU ppdu info queue lock
257*5113495bSYour Name  * @rx_mon_queue_depth: RxMON queue depth
258*5113495bSYour Name  * @ppdu_info_cache: PPDU info cache
259*5113495bSYour Name  * @desc_count: reaped status desc count
260*5113495bSYour Name  * @status: reaped status buffer per ppdu
261*5113495bSYour Name  * @lite_mon_rx_config: rx litemon config
262*5113495bSYour Name  * @lite_mon_tx_config: tx litemon config
263*5113495bSYour Name  * @prev_rxmon_desc: prev destination desc
264*5113495bSYour Name  * @prev_rxmon_cookie: prev rxmon cookie
265*5113495bSYour Name  * @prev_rxmon_pkt_desc: prev packet buff desc
266*5113495bSYour Name  * @prev_rxmon_pkt_cookie: prev packet buff desc cookie
267*5113495bSYour Name  * @total_free_elem: total free element in queue
268*5113495bSYour Name  * @rx_tlv_logger: Rx TLV logger struct
269*5113495bSYour Name  */
270*5113495bSYour Name struct dp_mon_pdev_be {
271*5113495bSYour Name 	struct dp_mon_pdev mon_pdev;
272*5113495bSYour Name 	struct dp_mon_filter_be **filter_be;
273*5113495bSYour Name #ifdef WLAN_PKT_CAPTURE_TX_2_0
274*5113495bSYour Name 	uint8_t tx_mon_mode;
275*5113495bSYour Name 	uint8_t tx_mon_filter_length;
276*5113495bSYour Name 	struct dp_pdev_tx_monitor_be tx_monitor_be;
277*5113495bSYour Name 	struct dp_tx_monitor_drop_stats tx_stats;
278*5113495bSYour Name #endif
279*5113495bSYour Name #if defined(WLAN_PKT_CAPTURE_RX_2_0) && defined(QCA_MONITOR_2_0_PKT_SUPPORT)
280*5113495bSYour Name 	qdf_spinlock_t rx_mon_wq_lock;
281*5113495bSYour Name 	qdf_workqueue_t *rx_mon_workqueue;
282*5113495bSYour Name 	qdf_work_t rx_mon_work;
283*5113495bSYour Name 
284*5113495bSYour Name 	TAILQ_HEAD(, hal_rx_ppdu_info) rx_mon_queue;
285*5113495bSYour Name 	TAILQ_HEAD(, hal_rx_ppdu_info) rx_mon_free_queue;
286*5113495bSYour Name 	qdf_spinlock_t ppdu_info_lock;
287*5113495bSYour Name 	qdf_kmem_cache_t ppdu_info_cache;
288*5113495bSYour Name #endif
289*5113495bSYour Name 	uint16_t rx_mon_queue_depth;
290*5113495bSYour Name 	uint16_t desc_count;
291*5113495bSYour Name 	struct dp_mon_desc *status[DP_MON_MAX_STATUS_BUF];
292*5113495bSYour Name #ifdef QCA_SUPPORT_LITE_MONITOR
293*5113495bSYour Name 	struct dp_lite_mon_rx_config *lite_mon_rx_config;
294*5113495bSYour Name 	struct dp_lite_mon_tx_config *lite_mon_tx_config;
295*5113495bSYour Name #endif
296*5113495bSYour Name 	void *prev_rxmon_desc;
297*5113495bSYour Name 	uint32_t prev_rxmon_cookie;
298*5113495bSYour Name 	void *prev_rxmon_pkt_desc;
299*5113495bSYour Name 	uint32_t prev_rxmon_pkt_cookie;
300*5113495bSYour Name 	uint32_t total_free_elem;
301*5113495bSYour Name #ifdef MONITOR_TLV_RECORDING_ENABLE
302*5113495bSYour Name 	struct dp_mon_tlv_logger *rx_tlv_log;
303*5113495bSYour Name 	struct dp_mon_tlv_logger *tx_tlv_log;
304*5113495bSYour Name #endif
305*5113495bSYour Name };
306*5113495bSYour Name 
307*5113495bSYour Name /**
308*5113495bSYour Name  * struct dp_mon_soc_be - BE specific monitor soc
309*5113495bSYour Name  * @mon_soc: Monitor soc structure
310*5113495bSYour Name  * @tx_mon_buf_ring: TxMon replenish ring
311*5113495bSYour Name  * @tx_mon_dst_ring: TxMon Destination ring
312*5113495bSYour Name  * @tx_desc_mon: descriptor pool for tx mon src ring
313*5113495bSYour Name  * @rx_desc_mon: descriptor pool for rx mon src ring
314*5113495bSYour Name  * @rx_mon_ring_fill_level: rx mon ring refill level
315*5113495bSYour Name  * @tx_mon_ring_fill_level: tx mon ring refill level
316*5113495bSYour Name  * @tx_low_thresh_intrs: number of tx mon low threshold interrupts received
317*5113495bSYour Name  * @rx_low_thresh_intrs: number of rx mon low threshold interrupts received
318*5113495bSYour Name  * @is_dp_mon_soc_initialized: flag to indicate soc is initialized
319*5113495bSYour Name  */
320*5113495bSYour Name struct dp_mon_soc_be {
321*5113495bSYour Name 	struct dp_mon_soc mon_soc;
322*5113495bSYour Name 	/* Source ring for Tx monitor */
323*5113495bSYour Name 	struct dp_srng tx_mon_buf_ring;
324*5113495bSYour Name 	struct dp_srng tx_mon_dst_ring[MAX_NUM_LMAC_HW];
325*5113495bSYour Name 
326*5113495bSYour Name 	/* Sw descriptor pool for tx mon source ring */
327*5113495bSYour Name 	struct dp_mon_desc_pool tx_desc_mon;
328*5113495bSYour Name 	/* Sw descriptor pool for rx mon source ring */
329*5113495bSYour Name 	struct dp_mon_desc_pool rx_desc_mon;
330*5113495bSYour Name 
331*5113495bSYour Name 	uint16_t rx_mon_ring_fill_level;
332*5113495bSYour Name 	uint16_t tx_mon_ring_fill_level;
333*5113495bSYour Name 	uint32_t tx_low_thresh_intrs;
334*5113495bSYour Name 	uint32_t rx_low_thresh_intrs;
335*5113495bSYour Name 
336*5113495bSYour Name 	bool is_dp_mon_soc_initialized;
337*5113495bSYour Name };
338*5113495bSYour Name #endif
339*5113495bSYour Name 
340*5113495bSYour Name /**
341*5113495bSYour Name  * dp_mon_desc_pool_init() - Monitor descriptor pool init
342*5113495bSYour Name  * @mon_desc_pool: mon desc pool
343*5113495bSYour Name  * @pool_size: Pool size
344*5113495bSYour Name  *
345*5113495bSYour Name  * Return: non-zero for failure, zero for success
346*5113495bSYour Name  */
347*5113495bSYour Name QDF_STATUS
348*5113495bSYour Name dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool,
349*5113495bSYour Name 		      uint32_t pool_size);
350*5113495bSYour Name 
351*5113495bSYour Name /**
352*5113495bSYour Name  * dp_mon_desc_pool_deinit()- monitor descriptor pool deinit
353*5113495bSYour Name  * @mon_desc_pool: mon desc pool
354*5113495bSYour Name  *
355*5113495bSYour Name  * Return: None
356*5113495bSYour Name  *
357*5113495bSYour Name  */
358*5113495bSYour Name void dp_mon_desc_pool_deinit(struct dp_mon_desc_pool *mon_desc_pool);
359*5113495bSYour Name 
360*5113495bSYour Name /**
361*5113495bSYour Name  * dp_mon_desc_pool_free()- monitor descriptor pool free
362*5113495bSYour Name  * @soc: DP soc handle
363*5113495bSYour Name  * @mon_desc_pool: mon desc pool
364*5113495bSYour Name  * @ctx_type: DP context type
365*5113495bSYour Name  *
366*5113495bSYour Name  * Return: None
367*5113495bSYour Name  *
368*5113495bSYour Name  */
369*5113495bSYour Name void dp_mon_desc_pool_free(struct dp_soc *soc,
370*5113495bSYour Name 			   struct dp_mon_desc_pool *mon_desc_pool,
371*5113495bSYour Name 			   enum dp_ctxt_type ctx_type);
372*5113495bSYour Name 
373*5113495bSYour Name /**
374*5113495bSYour Name  * dp_mon_desc_pool_alloc() - Monitor descriptor pool alloc
375*5113495bSYour Name  * @soc: DP soc handle
376*5113495bSYour Name  * @ctx_type: DP context type
377*5113495bSYour Name  * @pool_size: Pool size
378*5113495bSYour Name  * @mon_desc_pool: mon desc pool
379*5113495bSYour Name  *
380*5113495bSYour Name  * Return: non-zero for failure, zero for success
381*5113495bSYour Name  */
382*5113495bSYour Name QDF_STATUS dp_mon_desc_pool_alloc(struct dp_soc *soc,
383*5113495bSYour Name 				  enum dp_ctxt_type ctx_type,
384*5113495bSYour Name 				  uint32_t pool_size,
385*5113495bSYour Name 				  struct dp_mon_desc_pool *mon_desc_pool);
386*5113495bSYour Name 
387*5113495bSYour Name /**
388*5113495bSYour Name  * dp_mon_pool_frag_unmap_and_free() - free the mon desc frag called during
389*5113495bSYour Name  *			    de-initialization of wifi module.
390*5113495bSYour Name  *
391*5113495bSYour Name  * @dp_soc: DP soc handle
392*5113495bSYour Name  * @mon_desc_pool: monitor descriptor pool pointer
393*5113495bSYour Name  *
394*5113495bSYour Name  * Return: None
395*5113495bSYour Name  */
396*5113495bSYour Name void dp_mon_pool_frag_unmap_and_free(struct dp_soc *dp_soc,
397*5113495bSYour Name 				     struct dp_mon_desc_pool *mon_desc_pool);
398*5113495bSYour Name 
399*5113495bSYour Name /**
400*5113495bSYour Name  * dp_mon_buffers_replenish() - replenish monitor ring with nbufs
401*5113495bSYour Name  *
402*5113495bSYour Name  * @dp_soc: core txrx main context
403*5113495bSYour Name  * @dp_mon_srng: dp monitor circular ring
404*5113495bSYour Name  * @mon_desc_pool: Pointer to free mon descriptor pool
405*5113495bSYour Name  * @num_req_buffers: number of buffer to be replenished
406*5113495bSYour Name  * @desc_list: list of descs if called from dp_rx_process
407*5113495bSYour Name  *	       or NULL during dp rx initialization or out of buffer
408*5113495bSYour Name  *	       interrupt.
409*5113495bSYour Name  * @tail: tail of descs list
410*5113495bSYour Name  * @replenish_cnt_ref: pointer to update replenish_cnt
411*5113495bSYour Name  *
412*5113495bSYour Name  * Return: return success or failure
413*5113495bSYour Name  */
414*5113495bSYour Name QDF_STATUS dp_mon_buffers_replenish(struct dp_soc *dp_soc,
415*5113495bSYour Name 				struct dp_srng *dp_mon_srng,
416*5113495bSYour Name 				struct dp_mon_desc_pool *mon_desc_pool,
417*5113495bSYour Name 				uint32_t num_req_buffers,
418*5113495bSYour Name 				union dp_mon_desc_list_elem_t **desc_list,
419*5113495bSYour Name 				union dp_mon_desc_list_elem_t **tail,
420*5113495bSYour Name 				uint32_t *replenish_cnt_ref);
421*5113495bSYour Name 
422*5113495bSYour Name /**
423*5113495bSYour Name  * dp_mon_filter_show_tx_filter_be() - Show the set filters
424*5113495bSYour Name  * @mode: The filter modes
425*5113495bSYour Name  * @filter: tlv filter
426*5113495bSYour Name  */
427*5113495bSYour Name void dp_mon_filter_show_tx_filter_be(enum dp_mon_filter_mode mode,
428*5113495bSYour Name 				     struct dp_mon_filter_be *filter);
429*5113495bSYour Name 
430*5113495bSYour Name /**
431*5113495bSYour Name  * dp_mon_filter_show_rx_filter_be() - Show the set filters
432*5113495bSYour Name  * @mode: The filter modes
433*5113495bSYour Name  * @filter: tlv filter
434*5113495bSYour Name  */
435*5113495bSYour Name void dp_mon_filter_show_rx_filter_be(enum dp_mon_filter_mode mode,
436*5113495bSYour Name 				     struct dp_mon_filter_be *filter);
437*5113495bSYour Name 
438*5113495bSYour Name /**
439*5113495bSYour Name  * dp_vdev_set_monitor_mode_buf_rings_tx_2_0() - Add buffers to tx ring
440*5113495bSYour Name  * @pdev: Pointer to dp_pdev object
441*5113495bSYour Name  * @num_of_buffers: Number of buffers to allocate
442*5113495bSYour Name  *
443*5113495bSYour Name  * Return: QDF_STATUS
444*5113495bSYour Name  */
445*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev,
446*5113495bSYour Name 						     uint16_t num_of_buffers);
447*5113495bSYour Name 
448*5113495bSYour Name /**
449*5113495bSYour Name  * dp_vdev_set_monitor_mode_buf_rings_rx_2_0() - Add buffers to rx ring
450*5113495bSYour Name  * @pdev: Pointer to dp_pdev object
451*5113495bSYour Name  *
452*5113495bSYour Name  * Return: QDF_STATUS
453*5113495bSYour Name  */
454*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev);
455*5113495bSYour Name 
456*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
457*5113495bSYour Name /**
458*5113495bSYour Name  * dp_mon_get_puncture_type() - Get puncture type
459*5113495bSYour Name  * @puncture_pattern: puncture bitmap
460*5113495bSYour Name  * @bw: Bandwidth
461*5113495bSYour Name  */
462*5113495bSYour Name enum cdp_punctured_modes
463*5113495bSYour Name dp_mon_get_puncture_type(uint16_t puncture_pattern, uint8_t bw);
464*5113495bSYour Name #endif
465*5113495bSYour Name 
466*5113495bSYour Name /**
467*5113495bSYour Name  * dp_mon_desc_get() - get monitor sw descriptor
468*5113495bSYour Name  *
469*5113495bSYour Name  * @cookie: cookie
470*5113495bSYour Name  *
471*5113495bSYour Name  * Return: dp_mon_desc
472*5113495bSYour Name  */
473*5113495bSYour Name static inline
dp_mon_desc_get(uint64_t * cookie)474*5113495bSYour Name struct dp_mon_desc *dp_mon_desc_get(uint64_t *cookie)
475*5113495bSYour Name {
476*5113495bSYour Name 	return (struct dp_mon_desc *)cookie;
477*5113495bSYour Name }
478*5113495bSYour Name 
479*5113495bSYour Name /**
480*5113495bSYour Name  * __dp_mon_add_to_free_desc_list() - Adds to a local free descriptor list
481*5113495bSYour Name  *
482*5113495bSYour Name  * @head: pointer to the head of local free list
483*5113495bSYour Name  * @tail: pointer to the tail of local free list
484*5113495bSYour Name  * @new: new descriptor that is added to the free list
485*5113495bSYour Name  * @func_name: caller func name
486*5113495bSYour Name  *
487*5113495bSYour Name  * Return: void
488*5113495bSYour Name  */
489*5113495bSYour Name static inline
__dp_mon_add_to_free_desc_list(union dp_mon_desc_list_elem_t ** head,union dp_mon_desc_list_elem_t ** tail,struct dp_mon_desc * new,const char * func_name)490*5113495bSYour Name void __dp_mon_add_to_free_desc_list(union dp_mon_desc_list_elem_t **head,
491*5113495bSYour Name 				    union dp_mon_desc_list_elem_t **tail,
492*5113495bSYour Name 				    struct dp_mon_desc *new,
493*5113495bSYour Name 				    const char *func_name)
494*5113495bSYour Name {
495*5113495bSYour Name 	if (!(head && new))
496*5113495bSYour Name 		return;
497*5113495bSYour Name 
498*5113495bSYour Name 	new->buf_addr = NULL;
499*5113495bSYour Name 	new->in_use = 0;
500*5113495bSYour Name 
501*5113495bSYour Name 	((union dp_mon_desc_list_elem_t *)new)->next = *head;
502*5113495bSYour Name 	*head = (union dp_mon_desc_list_elem_t *)new;
503*5113495bSYour Name 	 /* reset tail if head->next is NULL */
504*5113495bSYour Name 	if (!*tail || !(*head)->next)
505*5113495bSYour Name 		*tail = *head;
506*5113495bSYour Name }
507*5113495bSYour Name 
508*5113495bSYour Name #define dp_mon_add_to_free_desc_list(head, tail, new) \
509*5113495bSYour Name 	__dp_mon_add_to_free_desc_list(head, tail, new, __func__)
510*5113495bSYour Name 
511*5113495bSYour Name /**
512*5113495bSYour Name  * dp_mon_add_desc_list_to_free_list() - append unused desc_list back to
513*5113495bSYour Name  * freelist.
514*5113495bSYour Name  *
515*5113495bSYour Name  * @soc: core txrx main context
516*5113495bSYour Name  * @local_desc_list: local desc list provided by the caller
517*5113495bSYour Name  * @tail: attach the point to last desc of local desc list
518*5113495bSYour Name  * @mon_desc_pool: monitor descriptor pool pointer
519*5113495bSYour Name  */
520*5113495bSYour Name 
521*5113495bSYour Name void
522*5113495bSYour Name dp_mon_add_desc_list_to_free_list(struct dp_soc *soc,
523*5113495bSYour Name 				  union dp_mon_desc_list_elem_t **local_desc_list,
524*5113495bSYour Name 				  union dp_mon_desc_list_elem_t **tail,
525*5113495bSYour Name 				  struct dp_mon_desc_pool *mon_desc_pool);
526*5113495bSYour Name 
527*5113495bSYour Name /**
528*5113495bSYour Name  * dp_rx_mon_add_frag_to_skb() - Add page frag to skb
529*5113495bSYour Name  *
530*5113495bSYour Name  * @ppdu_info: PPDU status info
531*5113495bSYour Name  * @nbuf: SKB to which frag need to be added
532*5113495bSYour Name  * @status_frag: Frag to add
533*5113495bSYour Name  *
534*5113495bSYour Name  * Return: void
535*5113495bSYour Name  */
536*5113495bSYour Name static inline void
dp_rx_mon_add_frag_to_skb(struct hal_rx_ppdu_info * ppdu_info,qdf_nbuf_t nbuf,qdf_frag_t status_frag)537*5113495bSYour Name dp_rx_mon_add_frag_to_skb(struct hal_rx_ppdu_info *ppdu_info,
538*5113495bSYour Name 			  qdf_nbuf_t nbuf,
539*5113495bSYour Name 			  qdf_frag_t status_frag)
540*5113495bSYour Name {
541*5113495bSYour Name 	uint16_t num_frags;
542*5113495bSYour Name 
543*5113495bSYour Name 	num_frags = qdf_nbuf_get_nr_frags(nbuf);
544*5113495bSYour Name 	if (num_frags < QDF_NBUF_MAX_FRAGS) {
545*5113495bSYour Name 		qdf_nbuf_add_rx_frag(status_frag, nbuf,
546*5113495bSYour Name 				     ppdu_info->data - (unsigned char *)status_frag,
547*5113495bSYour Name 				     ppdu_info->hdr_len,
548*5113495bSYour Name 				     RX_MONITOR_BUFFER_SIZE,
549*5113495bSYour Name 				     false);
550*5113495bSYour Name 	} else {
551*5113495bSYour Name 		dp_mon_err("num_frags exceeding MAX frags");
552*5113495bSYour Name 		qdf_assert_always(0);
553*5113495bSYour Name 	}
554*5113495bSYour Name }
555*5113495bSYour Name 
556*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG) && (defined(WLAN_PKT_CAPTURE_TX_2_0) || \
557*5113495bSYour Name 	defined(WLAN_PKT_CAPTURE_RX_2_0))
558*5113495bSYour Name /**
559*5113495bSYour Name  * dp_mon_get_context_size_be() - get BE specific size for mon pdev/soc
560*5113495bSYour Name  * @context_type: context type for which the size is needed
561*5113495bSYour Name  *
562*5113495bSYour Name  * Return: size in bytes for the context_type
563*5113495bSYour Name  */
564*5113495bSYour Name static inline
dp_mon_get_context_size_be(enum dp_context_type context_type)565*5113495bSYour Name qdf_size_t dp_mon_get_context_size_be(enum dp_context_type context_type)
566*5113495bSYour Name {
567*5113495bSYour Name 	switch (context_type) {
568*5113495bSYour Name 	case DP_CONTEXT_TYPE_MON_SOC:
569*5113495bSYour Name 		return sizeof(struct dp_mon_soc_be);
570*5113495bSYour Name 	case DP_CONTEXT_TYPE_MON_PDEV:
571*5113495bSYour Name 		return sizeof(struct dp_mon_pdev_be);
572*5113495bSYour Name 	default:
573*5113495bSYour Name 		return 0;
574*5113495bSYour Name 	}
575*5113495bSYour Name }
576*5113495bSYour Name #endif
577*5113495bSYour Name 
578*5113495bSYour Name /**
579*5113495bSYour Name  * dp_get_be_mon_soc_from_dp_mon_soc() - get dp_mon_soc_be from dp_mon_soc
580*5113495bSYour Name  * @soc: dp_mon_soc pointer
581*5113495bSYour Name  *
582*5113495bSYour Name  * Return: dp_mon_soc_be pointer
583*5113495bSYour Name  */
584*5113495bSYour Name static inline
dp_get_be_mon_soc_from_dp_mon_soc(struct dp_mon_soc * soc)585*5113495bSYour Name struct dp_mon_soc_be *dp_get_be_mon_soc_from_dp_mon_soc(struct dp_mon_soc *soc)
586*5113495bSYour Name {
587*5113495bSYour Name 	return (struct dp_mon_soc_be *)soc;
588*5113495bSYour Name }
589*5113495bSYour Name 
590*5113495bSYour Name /**
591*5113495bSYour Name  * dp_get_be_mon_pdev_from_dp_mon_pdev() - get dp_mon_pdev_be from dp_mon_pdev
592*5113495bSYour Name  * @mon_pdev: dp_mon_pdev pointer
593*5113495bSYour Name  *
594*5113495bSYour Name  * Return: dp_mon_pdev_be pointer
595*5113495bSYour Name  */
596*5113495bSYour Name static inline
dp_get_be_mon_pdev_from_dp_mon_pdev(struct dp_mon_pdev * mon_pdev)597*5113495bSYour Name struct dp_mon_pdev_be *dp_get_be_mon_pdev_from_dp_mon_pdev(struct dp_mon_pdev *mon_pdev)
598*5113495bSYour Name {
599*5113495bSYour Name 	return (struct dp_mon_pdev_be *)mon_pdev;
600*5113495bSYour Name }
601*5113495bSYour Name 
602*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
603*5113495bSYour Name /*
604*5113495bSYour Name  * dp_enable_enhanced_stats_2_0() - BE Wrapper to enable stats
605*5113495bSYour Name  * @soc: Datapath soc handle
606*5113495bSYour Name  * @pdev_id: Pdev Id on which stats will get enable
607*5113495bSYour Name  *
608*5113495bSYour Name  * Return: status success/failure
609*5113495bSYour Name  */
610*5113495bSYour Name QDF_STATUS
611*5113495bSYour Name dp_enable_enhanced_stats_2_0(struct cdp_soc_t *soc, uint8_t pdev_id);
612*5113495bSYour Name 
613*5113495bSYour Name /*
614*5113495bSYour Name  * dp_disable_enhanced_stats_2_0() - BE Wrapper to disable stats
615*5113495bSYour Name  * @soc: Datapath soc handle
616*5113495bSYour Name  * @pdev_id: Pdev Id on which stats will get disable
617*5113495bSYour Name  *
618*5113495bSYour Name  * Return: status success/failure
619*5113495bSYour Name  */
620*5113495bSYour Name QDF_STATUS
621*5113495bSYour Name dp_disable_enhanced_stats_2_0(struct cdp_soc_t *soc, uint8_t pdev_id);
622*5113495bSYour Name #endif /* QCA_ENHANCED_STATS_SUPPORT */
623*5113495bSYour Name 
624*5113495bSYour Name #ifdef WLAN_PKT_CAPTURE_RX_2_0
625*5113495bSYour Name static inline unsigned long long
dp_mon_get_debug_desc_addr(union dp_mon_desc_list_elem_t ** desc_list)626*5113495bSYour Name dp_mon_get_debug_desc_addr(union dp_mon_desc_list_elem_t **desc_list)
627*5113495bSYour Name {
628*5113495bSYour Name 	unsigned long long desc;
629*5113495bSYour Name 
630*5113495bSYour Name 	desc = (unsigned long)&((*desc_list)->mon_desc);
631*5113495bSYour Name 	desc = (unsigned long long)((unsigned long long)desc & DP_MON_DESC_ADDR_MASK);
632*5113495bSYour Name 	desc = (desc | ((unsigned long long)(*desc_list)->mon_desc.cookie_2 << DP_MON_DESC_ADDR_SHIFT));
633*5113495bSYour Name 	return desc;
634*5113495bSYour Name }
635*5113495bSYour Name #else
636*5113495bSYour Name static inline unsigned long long
dp_mon_get_debug_desc_addr(union dp_mon_desc_list_elem_t ** desc_list)637*5113495bSYour Name dp_mon_get_debug_desc_addr(union dp_mon_desc_list_elem_t **desc_list)
638*5113495bSYour Name {
639*5113495bSYour Name 	unsigned long long desc = (unsigned long long)&((*desc_list)->mon_desc);
640*5113495bSYour Name 	return desc;
641*5113495bSYour Name }
642*5113495bSYour Name #endif
643*5113495bSYour Name #endif /* _DP_MON_2_0_H_ */
644