xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h (revision aaf4382daf99a92dd525c63c2d626950de15c0cc)
1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef _DP_MON_2_0_H_
18 #define _DP_MON_2_0_H_
19 
20 #if !defined(DISABLE_MON_CONFIG)
21 #include <qdf_lock.h>
22 #include <dp_types.h>
23 
24 #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048
25 #define DP_MON_DATA_BUFFER_SIZE     2048
26 
27 /**
28  * struct dp_mon_filter_be - Monitor TLV filter
29  * @rx_tlv_filter: Rx MON TLV filter
30  * @tx_tlv_filter: Tx MON TLV filter
31  * @tx_valid: enable/disable Tx Mon TLV filter
32  */
33 struct dp_mon_filter_be {
34 	struct dp_mon_filter rx_tlv_filter;
35 	struct htt_tx_ring_tlv_filter tx_tlv_filter;
36 	bool tx_valid;
37 };
38 
39 /**
40  * struct dp_mon_desc
41  *
42  * @buf_addr: virtual address
43  * @paddr: physical address
44  * @in_use: desc is in use
45  * @unmapped: used to mark desc an unmapped if the corresponding
46  * nbuf is already unmapped
47  * @cookie: unique desc identifier
48  */
49 struct dp_mon_desc {
50 	uint8_t *buf_addr;
51 	qdf_dma_addr_t paddr;
52 	uint8_t in_use:1,
53 		unmapped:1;
54 	uint32_t cookie;
55 };
56 
57 /**
58  * struct dp_mon_desc_list_elem_t
59  * @next: Next pointer to form free list
60  * @mon_desc: DP mon descriptor
61  */
62 union dp_mon_desc_list_elem_t {
63 	union dp_mon_desc_list_elem_t *next;
64 	struct dp_mon_desc mon_desc;
65 };
66 
67 /**
68  * struct dp_mon_desc_pool - monitor desc pool
69  * @pool_size: number of descriptor in the pool
70  * @array: pointer to array of descriptor
71  * @freelist: pointer to free descriptor list
72  * @lock: Protection for the descriptor pool
73  * @owner: owner for nbuf
74  * @buf_size: Buffer size
75  * @buf_alignment: Buffer alignment
76  */
77 struct dp_mon_desc_pool {
78 	uint32_t pool_size;
79 	union dp_mon_desc_list_elem_t *array;
80 	union dp_mon_desc_list_elem_t *freelist;
81 	qdf_spinlock_t lock;
82 	uint8_t owner;
83 	uint16_t buf_size;
84 	uint8_t buf_alignment;
85 };
86 
87 /**
88  * struct dp_mon_pdev_be - BE specific monitor pdev object
89  * @filter_be: Monitor Filter pointer
90  * @mon_pdev: monitor pdev structure
91  */
92 struct dp_mon_pdev_be {
93 	struct dp_mon_filter_be **filter_be;
94 	struct dp_mon_pdev mon_pdev;
95 };
96 
97 /**
98  * struct dp_mon_soc_be - BE specific monitor soc
99  * @mon_soc: Monitor soc structure
100  * @tx_mon_buf_ring: TxMon replenish ring
101  * @tx_mon_dst_ring: TxMon Destination ring
102  * @tx_desc_mon: descriptor pool for tx mon src ring
103  * @rx_desc_mon: descriptor pool for rx mon src ring
104  * @rx_mon_ring_fill_level: rx mon ring refill level
105  * @tx_mon_ring_fill_level: tx mon ring refill level
106  */
107 struct dp_mon_soc_be {
108 	struct dp_mon_soc mon_soc;
109 	/* Source ring for Tx monitor */
110 	struct dp_srng tx_mon_buf_ring;
111 	struct dp_srng tx_mon_dst_ring[MAX_NUM_LMAC_HW];
112 
113 	/* Sw descriptor pool for tx mon source ring */
114 	struct dp_mon_desc_pool tx_desc_mon;
115 	/* Sw descriptor pool for rx mon source ring */
116 	struct dp_mon_desc_pool rx_desc_mon;
117 
118 	uint16_t rx_mon_ring_fill_level;
119 	uint16_t tx_mon_ring_fill_level;
120 };
121 #endif
122 
123 /**
124  * dp_mon_desc_pool_init() - Monitor descriptor pool init
125  * @mon_desc_pool: mon desc pool
126  *
127  * Return: non-zero for failure, zero for success
128  */
129 QDF_STATUS dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool);
130 
131 /*
132  * dp_mon_desc_pool_deinit()- monitor descriptor pool deinit
133  * @mon_desc_pool: mon desc pool
134  *
135  * Return: None
136  *
137  */
138 void dp_mon_desc_pool_deinit(struct dp_mon_desc_pool *mon_desc_pool);
139 
140 /*
141  * dp_mon_desc_pool_free()- monitor descriptor pool free
142  * @mon_desc_pool: mon desc pool
143  *
144  * Return: None
145  *
146  */
147 void dp_mon_desc_pool_free(struct dp_mon_desc_pool *mon_desc_pool);
148 
149 /**
150  * dp_mon_desc_pool_alloc() - Monitor descriptor pool alloc
151  * @mon_desc_pool: mon desc pool
152  * @pool_size: Pool size
153  *
154  * Return: non-zero for failure, zero for success
155  */
156 QDF_STATUS dp_mon_desc_pool_alloc(uint32_t pool_size,
157 				  struct dp_mon_desc_pool *mon_desc_pool);
158 
159 /*
160  * dp_mon_pool_frag_unmap_and_free() - free the mon desc frag called during
161  *			    de-initialization of wifi module.
162  *
163  * @soc: DP soc handle
164  * @mon_desc_pool: monitor descriptor pool pointer
165  *
166  * Return: None
167  */
168 void dp_mon_pool_frag_unmap_and_free(struct dp_soc *dp_soc,
169 				     struct dp_mon_desc_pool *mon_desc_pool);
170 
171 /*
172  * dp_mon_buffers_replenish() - replenish monitor ring with nbufs
173  *
174  * @soc: core txrx main context
175  * @dp_mon_srng: dp monitor circular ring
176  * @mon_desc_pool: Pointer to free mon descriptor pool
177  * @num_req_buffers: number of buffer to be replenished
178  * @desc_list: list of descs if called from dp_rx_process
179  *	       or NULL during dp rx initialization or out of buffer
180  *	       interrupt.
181  * @tail: tail of descs list
182  *
183  * Return: return success or failure
184  */
185 QDF_STATUS dp_mon_buffers_replenish(struct dp_soc *dp_soc,
186 				struct dp_srng *dp_mon_srng,
187 				struct dp_mon_desc_pool *mon_desc_pool,
188 				uint32_t num_req_buffers,
189 				union dp_mon_desc_list_elem_t **desc_list,
190 				union dp_mon_desc_list_elem_t **tail);
191 
192 /**
193  * dp_mon_filter_show_filter_be() - Show the set filters
194  * @pdev: DP pdev handle
195  * @mode: The filter modes
196  * @tlv_filter: tlv filter
197  */
198 void dp_mon_filter_show_filter_be(struct dp_mon_pdev *mon_pdev,
199 				  enum dp_mon_filter_mode mode,
200 				  struct dp_mon_filter_be *filter);
201 #endif /* _DP_MON_2_0_H_ */
202