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