xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c (revision 8cfe6b10058a04cafb17eed051f2ddf11bee8931)
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 #include <hal_api.h>
19 #include <wlan_cfg.h>
20 #include "dp_types.h"
21 #include "dp_internal.h"
22 #include "dp_htt.h"
23 #include "dp_mon.h"
24 #include "htt.h"
25 #include "htc_api.h"
26 #include "htc.h"
27 #include "htc_packet.h"
28 #include "dp_mon_filter.h"
29 #include <dp_mon_2.0.h>
30 #include <dp_rx_mon_2.0.h>
31 #include <dp_mon_filter_2.0.h>
32 #include <dp_be.h>
33 #ifdef QCA_SUPPORT_LITE_MONITOR
34 #include "dp_lite_mon.h"
35 #endif
36 
37 #define HTT_MSG_BUF_SIZE(msg_bytes) \
38    ((msg_bytes) + HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING)
39 
40 void dp_mon_filter_dealloc_2_0(struct dp_pdev *pdev)
41 {
42 	enum dp_mon_filter_mode mode;
43 	struct dp_mon_filter_be **mon_filter = NULL;
44 	struct dp_mon_pdev *mon_pdev = NULL;
45 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
46 
47 	if (!pdev) {
48 		dp_mon_filter_err("Pdev context is null");
49 		return;
50 	}
51 
52 	mon_pdev = pdev->monitor_pdev;
53 	if (!mon_pdev) {
54 		dp_mon_filter_err("Monitor pdev context is null");
55 		return;
56 	}
57 
58 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
59 	mon_filter = mon_pdev_be->filter_be;
60 	if (!mon_filter) {
61 		dp_mon_filter_err("Found NULL memory for the Monitor filter");
62 		return;
63 	}
64 
65 	for (mode = 0; mode < DP_MON_FILTER_MAX_MODE; mode++) {
66 		if (!mon_filter[mode])
67 			continue;
68 
69 		qdf_mem_free(mon_filter[mode]);
70 		mon_filter[mode] = NULL;
71 	}
72 
73 	qdf_mem_free(mon_filter);
74 	mon_pdev_be->filter_be = NULL;
75 }
76 
77 QDF_STATUS dp_mon_filter_alloc_2_0(struct dp_pdev *pdev)
78 {
79 	struct dp_mon_filter_be **mon_filter = NULL;
80 	enum dp_mon_filter_mode mode;
81 	struct dp_mon_pdev *mon_pdev = NULL;
82 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
83 
84 	if (!pdev) {
85 		dp_mon_filter_err("pdev Context is null");
86 		return QDF_STATUS_E_FAILURE;
87 	}
88 
89 	mon_pdev = pdev->monitor_pdev;
90 	if (!mon_pdev) {
91 		dp_mon_filter_err("Monitor pdev context is null");
92 		return QDF_STATUS_E_FAILURE;
93 	}
94 
95 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
96 
97 	mon_filter = (struct dp_mon_filter_be **)qdf_mem_malloc(
98 			(sizeof(struct dp_mon_filter_be *) *
99 			 DP_MON_FILTER_MAX_MODE));
100 	if (!mon_filter) {
101 		dp_mon_filter_err("Monitor filter mem allocation failed");
102 		return QDF_STATUS_E_NOMEM;
103 	}
104 
105 	qdf_mem_zero(mon_filter,
106 		     sizeof(struct dp_mon_filter_be *) * DP_MON_FILTER_MAX_MODE);
107 
108 	for (mode = 0; mode < DP_MON_FILTER_MAX_MODE; mode++) {
109 		mon_filter[mode] = qdf_mem_malloc(sizeof(struct dp_mon_filter_be) *
110 						  DP_MON_FILTER_SRNG_TYPE_MAX);
111 		mon_pdev_be->filter_be = mon_filter;
112 		if (!mon_filter[mode])
113 			goto fail;
114 	}
115 
116 	return QDF_STATUS_SUCCESS;
117 fail:
118 	dp_mon_filter_dealloc(mon_pdev);
119 	return QDF_STATUS_E_FAILURE;
120 }
121 
122 void dp_rx_mon_hdr_length_set(uint32_t *msg_word,
123 			      struct htt_rx_ring_tlv_filter *tlv_filter)
124 {
125 	if (!msg_word || !tlv_filter)
126 		return;
127 
128 	HTT_RX_RING_SELECTION_CFG_RX_HDR_LEN_SET(*msg_word,
129 						 tlv_filter->rx_hdr_length);
130 }
131 
132 void dp_rx_mon_packet_length_set(uint32_t *msg_word,
133 				 struct htt_rx_ring_tlv_filter *tlv_filter)
134 {
135 	if (!msg_word || !tlv_filter)
136 		return;
137 
138 	HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word,
139 							 tlv_filter->mgmt_dma_length);
140 	HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word,
141 							 tlv_filter->ctrl_dma_length);
142 	HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_DATA_SET(*msg_word,
143 							 tlv_filter->data_dma_length);
144 }
145 
146 void dp_rx_mon_enable_set(uint32_t *msg_word,
147 			  struct htt_rx_ring_tlv_filter *tlv_filter)
148 {
149 	if (!msg_word || !tlv_filter)
150 		return;
151 
152 	HTT_RX_RING_SELECTION_CFG_RX_MON_GLOBAL_EN_SET(*msg_word,
153 						       tlv_filter->enable);
154 }
155 
156 void dp_rx_mon_enable_mpdu_logging(uint32_t *msg_word,
157 				   struct htt_rx_ring_tlv_filter *tlv_filter)
158 {
159 	if (!msg_word || !tlv_filter)
160 		return;
161 
162 	if (tlv_filter->mgmt_dma_length) {
163 		HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 1);
164 		HTT_RX_RING_SELECTION_CFG_DMA_MPDU_MGMT_SET(*msg_word, tlv_filter->mgmt_mpdu_log);
165 	}
166 
167 	if (tlv_filter->ctrl_dma_length) {
168 		HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 2);
169 		HTT_RX_RING_SELECTION_CFG_DMA_MPDU_CTRL_SET(*msg_word, tlv_filter->ctrl_mpdu_log);
170 	}
171 
172 	if (tlv_filter->data_dma_length) {
173 		HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 4);
174 		HTT_RX_RING_SELECTION_CFG_DMA_MPDU_DATA_SET(*msg_word, tlv_filter->data_mpdu_log);
175 	}
176 }
177 
178 void
179 dp_rx_mon_word_mask_subscribe(uint32_t *msg_word,
180 				  struct htt_rx_ring_tlv_filter *tlv_filter)
181 {
182 	if (!msg_word || !tlv_filter)
183 		return;
184 
185 	if (!tlv_filter->enable)
186 		return;
187 
188 	HTT_RX_RING_SELECTION_CFG_WORD_MASK_COMPACTION_ENABLE_SET(*msg_word, 1);
189 
190 	/* word 14 */
191 	msg_word += 3;
192 	*msg_word = 0;
193 
194 	HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_SET(
195 				*msg_word,
196 				RX_MON_MPDU_START_WMASK);
197 
198 	/* word 15 */
199 	msg_word++;
200 	*msg_word = 0;
201 	HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_SET(
202 				*msg_word,
203 				RX_MON_MSDU_END_WMASK);
204 
205 	/* word 16 */
206 	msg_word++;
207 	/* word 17 */
208 	msg_word++;
209 	*msg_word = 0;
210 	HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_V2_SET(
211 				*msg_word,
212 				RX_MON_MPDU_START_WMASK);
213 
214 	/* word 18 */
215 	msg_word++;
216 	*msg_word = 0;
217 	HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_V2_SET(
218 				*msg_word,
219 				RX_MON_MSDU_END_WMASK);
220 	/* word 19 */
221 	msg_word++;
222 	*msg_word = 0;
223 	HTT_RX_RING_SELECTION_CFG_RX_PPDU_END_USR_STATS_WORD_MASK_V2_SET(
224 				*msg_word,
225 				RX_MON_PPDU_END_USR_STATS_WMASK);
226 }
227 
228 void
229 dp_rx_mon_pkt_tlv_offset_subscribe(uint32_t *msg_word,
230 				   struct htt_rx_ring_tlv_filter *tlv_filter)
231 {
232 	if (!msg_word || !tlv_filter)
233 		return;
234 
235 	/* word 16 */
236 	*msg_word = 0;
237 	if (tlv_filter->rx_pkt_tlv_offset) {
238 		HTT_RX_RING_SELECTION_CFG_ENABLE_RX_PKT_TLV_OFFSET_SET(*msg_word, 1);
239 		HTT_RX_RING_SELECTION_CFG_RX_PKT_TLV_OFFSET_SET(*msg_word,
240 								tlv_filter->rx_pkt_tlv_offset);
241 	}
242 
243 }
244 
245 void
246 dp_rx_mon_enable_fpmo(uint32_t *msg_word,
247 		      struct htt_rx_ring_tlv_filter *tlv_filter)
248 {
249 #ifdef FW_SUPPORT_NOT_YET
250 	if (!msg_word || !tlv_filter)
251 		return;
252 
253 	if (tlv_filter->enable_fpmo) {
254 		/* TYPE: MGMT */
255 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
256 			FPMO, MGMT, 0000,
257 			(tlv_filter->fpmo_mgmt_filter &
258 			FILTER_MGMT_ASSOC_REQ) ? 1 : 0);
259 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
260 			FPMO, MGMT, 0001,
261 			(tlv_filter->fpmo_mgmt_filter &
262 			FILTER_MGMT_ASSOC_RES) ? 1 : 0);
263 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
264 			FPMO, MGMT, 0010,
265 			(tlv_filter->fpmo_mgmt_filter &
266 			FILTER_MGMT_REASSOC_REQ) ? 1 : 0);
267 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
268 			FPMO, MGMT, 0011,
269 			(tlv_filter->fpmo_mgmt_filter &
270 			FILTER_MGMT_REASSOC_RES) ? 1 : 0);
271 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
272 			FPMO, MGMT, 0100,
273 			(tlv_filter->fpmo_mgmt_filter &
274 			FILTER_MGMT_PROBE_REQ) ? 1 : 0);
275 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
276 			FPMO, MGMT, 0101,
277 			(tlv_filter->fpmo_mgmt_filter &
278 			FILTER_MGMT_PROBE_RES) ? 1 : 0);
279 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
280 			FPMO, MGMT, 0110,
281 			(tlv_filter->fpmo_mgmt_filter &
282 			FILTER_MGMT_TIM_ADVT) ? 1 : 0);
283 		/* reserved */
284 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
285 			FPMO, MGMT, 0111,
286 			(tlv_filter->fpmo_mgmt_filter &
287 			FILTER_MGMT_RESERVED_7) ? 1 : 0);
288 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
289 			FPMO, MGMT, 1000,
290 			(tlv_filter->fpmo_mgmt_filter &
291 			FILTER_MGMT_BEACON) ? 1 : 0);
292 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
293 			FPMO, MGMT, 1001,
294 			(tlv_filter->fpmo_mgmt_filter &
295 			FILTER_MGMT_ATIM) ? 1 : 0);
296 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
297 			FPMO, MGMT, 1010,
298 			(tlv_filter->fpmo_mgmt_filter &
299 			FILTER_MGMT_DISASSOC) ? 1 : 0);
300 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
301 			FPMO, MGMT, 1011,
302 			(tlv_filter->fpmo_mgmt_filter &
303 			FILTER_MGMT_AUTH) ? 1 : 0);
304 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
305 			FPMO, MGMT, 1100,
306 			(tlv_filter->fpmo_mgmt_filter &
307 			FILTER_MGMT_DEAUTH) ? 1 : 0);
308 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
309 			FPMO, MGMT, 1101,
310 			(tlv_filter->fpmo_mgmt_filter &
311 			FILTER_MGMT_ACTION) ? 1 : 0);
312 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
313 			FPMO, MGMT, 1110,
314 			(tlv_filter->fpmo_mgmt_filter &
315 			FILTER_MGMT_ACT_NO_ACK) ? 1 : 0);
316 		/* reserved*/
317 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
318 			FPMO, MGMT, 1111,
319 			(tlv_filter->fpmo_mgmt_filter &
320 			FILTER_MGMT_RESERVED_15) ? 1 : 0);
321 
322 		/* TYPE: CTRL */
323 		/* reserved */
324 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
325 			FPMO, CTRL, 0000,
326 			(tlv_filter->fpmo_ctrl_filter &
327 			FILTER_CTRL_RESERVED_1) ? 1 : 0);
328 		/* reserved */
329 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
330 			FPMO, CTRL, 0001,
331 			(tlv_filter->fpmo_ctrl_filter &
332 			FILTER_CTRL_RESERVED_2) ? 1 : 0);
333 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
334 			FPMO, CTRL, 0010,
335 			(tlv_filter->fpmo_ctrl_filter &
336 			FILTER_CTRL_TRIGGER) ? 1 : 0);
337 		/* reserved */
338 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
339 			FPMO, CTRL, 0011,
340 			(tlv_filter->fpmo_ctrl_filter &
341 			FILTER_CTRL_RESERVED_4) ? 1 : 0);
342 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
343 			FPMO, CTRL, 0100,
344 			(tlv_filter->fpmo_ctrl_filter &
345 			FILTER_CTRL_BF_REP_POLL) ? 1 : 0);
346 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
347 			FPMO, CTRL, 0101,
348 			(tlv_filter->fpmo_ctrl_filter &
349 			FILTER_CTRL_VHT_NDP) ? 1 : 0);
350 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
351 			FPMO, CTRL, 0110,
352 			(tlv_filter->fpmo_ctrl_filter &
353 			FILTER_CTRL_FRAME_EXT) ? 1 : 0);
354 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
355 			FPMO, CTRL, 0111,
356 			(tlv_filter->fpmo_ctrl_filter &
357 			FILTER_CTRL_CTRLWRAP) ? 1 : 0);
358 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
359 			FPMO, CTRL, 1000,
360 			(tlv_filter->fpmo_ctrl_filter &
361 			FILTER_CTRL_BA_REQ) ? 1 : 0);
362 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
363 			FPMO, CTRL, 1001,
364 			(tlv_filter->fpmo_ctrl_filter &
365 			FILTER_CTRL_BA) ? 1 : 0);
366 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
367 			FPMO, CTRL, 1010,
368 			(tlv_filter->fpmo_ctrl_filter &
369 			FILTER_CTRL_PSPOLL) ? 1 : 0);
370 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
371 			FPMO, CTRL, 1011,
372 			(tlv_filter->fpmo_ctrl_filter &
373 			FILTER_CTRL_RTS) ? 1 : 0);
374 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
375 			FPMO, CTRL, 1100,
376 			(tlv_filter->fpmo_ctrl_filter &
377 			FILTER_CTRL_CTS) ? 1 : 0);
378 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
379 			FPMO, CTRL, 1101,
380 			(tlv_filter->fpmo_ctrl_filter &
381 			FILTER_CTRL_ACK) ? 1 : 0);
382 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
383 			FPMO, CTRL, 1110,
384 			(tlv_filter->fpmo_ctrl_filter &
385 			FILTER_CTRL_CFEND) ? 1 : 0);
386 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG0,
387 			FPMO, CTRL, 1111,
388 			(tlv_filter->fpmo_ctrl_filter &
389 			FILTER_CTRL_CFEND_CFACK) ? 1 : 0);
390 
391 		/* word 18 */
392 		msg_word++;
393 		*msg_word = 0;
394 
395 		/* TYPE: DATA */
396 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1,
397 			FPMO, DATA, MCAST,
398 			(tlv_filter->fpmo_data_filter &
399 			FILTER_DATA_MCAST) ? 1 : 0);
400 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1,
401 			FPMO, DATA, UCAST,
402 			(tlv_filter->fpmo_data_filter &
403 			FILTER_DATA_UCAST) ? 1 : 0);
404 		htt_rx_ring_pkt_enable_subtype_set(*msg_word, FLAG1,
405 			FPMO, DATA, NULL,
406 			(tlv_filter->fpmo_data_filter &
407 			FILTER_DATA_NULL) ? 1 : 0);
408 
409 	} else {
410 		/* clear word 18 if fpmo is disabled
411 		 * word 17 is already cleared by caller
412 		 */
413 
414 		/* word 18 */
415 		msg_word++;
416 		*msg_word = 0;
417 	}
418 #endif
419 }
420 
421 static void
422 htt_tx_tlv_filter_mask_set_in0(uint32_t *msg_word,
423 			       struct htt_tx_ring_tlv_filter *htt_tlv_filter)
424 {
425 	struct dp_tx_mon_downstream_tlv_config *tlv = &htt_tlv_filter->dtlvs;
426 
427 	if (tlv->tx_fes_setup)
428 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
429 							 TX_FES_SETUP,
430 							 tlv->tx_fes_setup);
431 
432 	if (tlv->tx_peer_entry)
433 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
434 							 TX_PEER_ENTRY,
435 							 tlv->tx_peer_entry);
436 
437 	if (tlv->tx_queue_extension)
438 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
439 							 TX_QUEUE_EXTENSION,
440 							 tlv->tx_queue_extension);
441 
442 	if (tlv->tx_last_mpdu_end)
443 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
444 							 TX_LAST_MPDU_END,
445 							 tlv->tx_last_mpdu_end);
446 
447 	if (tlv->tx_last_mpdu_fetched)
448 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
449 							 TX_LAST_MPDU_FETCHED,
450 							 tlv->tx_last_mpdu_fetched);
451 
452 	if (tlv->tx_data_sync)
453 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
454 							 TX_DATA_SYNC,
455 							 tlv->tx_data_sync);
456 
457 	if (tlv->pcu_ppdu_setup_init)
458 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
459 							 PCU_PPDU_SETUP_INIT,
460 							 tlv->pcu_ppdu_setup_init);
461 
462 	if (tlv->fw2s_mon)
463 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
464 							 FW2SW_MON,
465 							 tlv->fw2s_mon);
466 
467 	if (tlv->tx_loopback_setup)
468 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
469 							 TX_LOOPBACK_SETUP,
470 							 tlv->tx_loopback_setup);
471 
472 	if (tlv->sch_critical_tlv_ref)
473 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
474 							 SCH_CRITICAL_TLV_REFERENCE,
475 							 tlv->sch_critical_tlv_ref);
476 
477 	if (tlv->ndp_preamble_done)
478 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
479 							 NDP_PREAMBLE_DONE,
480 							 tlv->ndp_preamble_done);
481 
482 	if (tlv->tx_raw_frame_setup)
483 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
484 							 TX_RAW_OR_NATIVE_FRAME_SETUP,
485 							 tlv->tx_raw_frame_setup);
486 
487 	if (tlv->txpcu_user_setup)
488 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
489 							 TXPCU_USER_SETUP,
490 							 tlv->txpcu_user_setup);
491 
492 	if (tlv->rxpcu_setup)
493 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
494 							 RXPCU_SETUP,
495 							 tlv->rxpcu_setup);
496 
497 	if (tlv->rxpcu_setup_complete)
498 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
499 							 RXPCU_SETUP_COMPLETE,
500 							 tlv->rxpcu_setup_complete);
501 
502 	if (tlv->coex_tx_req)
503 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
504 							 COEX_TX_REQ,
505 							 tlv->coex_tx_req);
506 
507 	if (tlv->rxpcu_user_setup)
508 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
509 							 RXPCU_USER_SETUP,
510 							 tlv->rxpcu_user_setup);
511 
512 	if (tlv->rxpcu_user_setup_ext)
513 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
514 							 RXPCU_USER_SETUP_EXT,
515 							 tlv->rxpcu_user_setup_ext);
516 
517 	if (tlv->wur_data)
518 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
519 							 TX_WUR_DATA,
520 							 tlv->wur_data);
521 
522 	if (tlv->tqm_mpdu_global_start)
523 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
524 							 TQM_MPDU_GLOBAL_START,
525 							 tlv->tqm_mpdu_global_start);
526 
527 	if (tlv->tx_fes_setup_complete)
528 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
529 							 TX_FES_SETUP_COMPLETE,
530 							 tlv->tx_fes_setup_complete);
531 
532 	if (tlv->scheduler_end)
533 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
534 							 SCHEDULER_END,
535 							 tlv->scheduler_end);
536 
537 	if (tlv->sch_wait_instr_tx_path)
538 		htt_tx_monitor_tlv_filter_in0_enable_set(*msg_word,
539 							 SCH_WAIT_INSTR_TX_PATH,
540 							 tlv->sch_wait_instr_tx_path);
541 }
542 
543 static void
544 htt_tx_tlv_filter_mask_set_in1(uint32_t *msg_word,
545 			       struct htt_tx_ring_tlv_filter *htt_tlv_filter)
546 {
547 	struct dp_tx_mon_upstream_tlv_config *tlv = &htt_tlv_filter->utlvs;
548 
549 	if (tlv->rx_response_required_info)
550 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
551 							 RX_RESPONSE_REQUIRED_INFO,
552 							 tlv->rx_response_required_info);
553 
554 	if (tlv->response_start_status)
555 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
556 							 RESPONSE_START_STATUS,
557 							 tlv->response_start_status);
558 
559 	if (tlv->response_end_status)
560 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
561 							 RESPONSE_END_STATUS,
562 							 tlv->response_end_status);
563 
564 	if (tlv->tx_fes_status_start)
565 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
566 							 TX_FES_STATUS_START,
567 							 tlv->tx_fes_status_start);
568 
569 	if (tlv->tx_fes_status_end)
570 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
571 							 TX_FES_STATUS_END,
572 							 tlv->tx_fes_status_end);
573 
574 	if (tlv->tx_fes_status_start_ppdu)
575 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
576 							 TX_FES_STATUS_START_PPDU,
577 							 tlv->tx_fes_status_start_ppdu);
578 
579 	if (tlv->tx_fes_status_user_ppdu)
580 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
581 							 TX_FES_STATUS_USER_PPDU,
582 							 tlv->tx_fes_status_user_ppdu);
583 
584 	if (tlv->tx_fes_status_ack_or_ba)
585 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
586 							 TX_FES_STATUS_ACK_OR_BA,
587 							 tlv->tx_fes_status_ack_or_ba);
588 
589 	if (tlv->tx_fes_status_1k_ba)
590 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
591 							 TX_FES_STATUS_1K_BA,
592 							 tlv->tx_fes_status_1k_ba);
593 
594 	if (tlv->tx_fes_status_start_prot)
595 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
596 							 TX_FES_STATUS_START_PROT,
597 							 tlv->tx_fes_status_start_prot);
598 
599 	if (tlv->tx_fes_status_prot)
600 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
601 							 TX_FES_STATUS_PROT,
602 							 tlv->tx_fes_status_prot);
603 
604 	if (tlv->tx_fes_status_user_response)
605 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
606 							 TX_FES_STATUS_USER_RESPONSE,
607 							 tlv->tx_fes_status_user_response);
608 
609 	if (tlv->rx_frame_bitmap_ack)
610 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
611 							 RX_FRAME_BITMAP_ACK,
612 							 tlv->rx_frame_bitmap_ack);
613 
614 	if (tlv->rx_frame_1k_bitmap_ack)
615 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
616 							 RX_FRAME_1K_BITMAP_ACK,
617 							 tlv->rx_frame_1k_bitmap_ack);
618 
619 	if (tlv->coex_tx_status)
620 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
621 							 COEX_TX_STATUS,
622 							 tlv->coex_tx_status);
623 
624 	if (tlv->received_response_info)
625 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
626 							 RECEIVED_RESPONSE_INFO,
627 							 tlv->received_response_info);
628 
629 	if (tlv->received_response_info_p2)
630 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
631 							 RECEIVED_RESPONSE_INFO_PART2,
632 							 tlv->received_response_info_p2);
633 
634 	if (tlv->ofdma_trigger_details)
635 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
636 							 OFDMA_TRIGGER_DETAILS,
637 							 tlv->ofdma_trigger_details);
638 
639 	if (tlv->received_trigger_info)
640 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
641 							 RECEIVED_TRIGGER_INFO,
642 							 tlv->received_trigger_info);
643 
644 	if (tlv->pdg_tx_request)
645 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
646 							 PDG_TX_REQUEST,
647 							 tlv->pdg_tx_request);
648 
649 	if (tlv->pdg_response)
650 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
651 							 PDG_RESPONSE,
652 							 tlv->pdg_response);
653 
654 	if (tlv->pdg_trig_response)
655 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
656 							 PDG_TRIG_RESPONSE,
657 							 tlv->pdg_trig_response);
658 
659 	if (tlv->trigger_response_tx_done)
660 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
661 							 TRIGGER_RESPONSE_TX_DONE,
662 							 tlv->trigger_response_tx_done);
663 
664 	if (tlv->prot_tx_end)
665 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
666 							 PROT_TX_END,
667 							 tlv->prot_tx_end);
668 
669 	if (tlv->ppdu_tx_end)
670 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
671 							 PPDU_TX_END,
672 							 tlv->ppdu_tx_end);
673 
674 	if (tlv->r2r_status_end)
675 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
676 							 R2R_STATUS_END,
677 							 tlv->r2r_status_end);
678 
679 	if (tlv->flush_req)
680 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
681 							 FLUSH_REQ,
682 							 tlv->flush_req);
683 
684 	if (tlv->mactx_phy_desc)
685 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
686 							 MACTX_PHY_DESC,
687 							 tlv->mactx_phy_desc);
688 
689 	if (tlv->mactx_user_desc_cmn)
690 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
691 							 MACTX_USER_DESC_COMMON,
692 							 tlv->mactx_user_desc_cmn);
693 
694 	if (tlv->mactx_user_desc_per_usr)
695 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
696 							 MACTX_USER_DESC_PER_USER,
697 							 tlv->mactx_user_desc_per_usr);
698 
699 	if (tlv->l_sig_a)
700 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
701 							 L_SIG_A,
702 							 tlv->l_sig_a);
703 
704 	if (tlv->l_sig_b)
705 		htt_tx_monitor_tlv_filter_in1_enable_set(*msg_word,
706 							 L_SIG_B,
707 							 tlv->l_sig_b);
708 }
709 
710 static void
711 htt_tx_tlv_filter_mask_set_in2(uint32_t *msg_word,
712 			       struct htt_tx_ring_tlv_filter *htt_tlv_filter)
713 {
714 	struct dp_tx_mon_upstream_tlv_config *tlv = &htt_tlv_filter->utlvs;
715 
716 	if (tlv->ht_sig)
717 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
718 							 HT_SIG,
719 							 tlv->ht_sig);
720 
721 	if (tlv->vht_sig_a)
722 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
723 							 VHT_SIG_A,
724 							 tlv->vht_sig_a);
725 
726 	if (tlv->vht_sig_b_su20)
727 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
728 							 VHT_SIG_B_SU20,
729 							 tlv->vht_sig_b_su20);
730 
731 	if (tlv->vht_sig_b_su40)
732 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
733 							 VHT_SIG_B_SU40,
734 							 tlv->vht_sig_b_su40);
735 
736 	if (tlv->vht_sig_b_su80)
737 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
738 							 VHT_SIG_B_SU80,
739 							 tlv->vht_sig_b_su80);
740 
741 	if (tlv->vht_sig_b_su160)
742 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
743 							 VHT_SIG_B_SU160,
744 							 tlv->vht_sig_b_su160);
745 
746 	if (tlv->vht_sig_b_mu20)
747 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
748 							 VHT_SIG_B_MU20,
749 							 tlv->vht_sig_b_mu20);
750 
751 	if (tlv->vht_sig_b_mu40)
752 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
753 							 VHT_SIG_B_MU40,
754 							 tlv->vht_sig_b_mu40);
755 
756 	if (tlv->vht_sig_b_mu80)
757 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
758 							 VHT_SIG_B_MU80,
759 							 tlv->vht_sig_b_mu80);
760 
761 	if (tlv->vht_sig_b_mu160)
762 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
763 							 VHT_SIG_B_MU160,
764 							 tlv->vht_sig_b_mu160);
765 
766 	if (tlv->tx_service)
767 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
768 							 TX_SERVICE,
769 							 tlv->tx_service);
770 
771 	if (tlv->he_sig_a_su)
772 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
773 							 HE_SIG_A_SU,
774 							 tlv->he_sig_a_su);
775 
776 	if (tlv->he_sig_a_mu_dl)
777 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
778 							 HE_SIG_A_MU_DL,
779 							 tlv->he_sig_a_mu_dl);
780 
781 	if (tlv->he_sig_a_mu_ul)
782 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
783 							 HE_SIG_A_MU_UL,
784 							 tlv->he_sig_a_mu_ul);
785 
786 	if (tlv->he_sig_b1_mu)
787 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
788 							 HE_SIG_B1_MU,
789 							 tlv->he_sig_b1_mu);
790 
791 	if (tlv->he_sig_b2_mu)
792 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
793 							 HE_SIG_B2_MU,
794 							 tlv->he_sig_b2_mu);
795 
796 	if (tlv->he_sig_b2_ofdma)
797 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
798 							 HE_SIG_B2_OFDMA,
799 							 tlv->he_sig_b2_ofdma);
800 
801 	if (tlv->u_sig_eht_su_mu)
802 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
803 							 U_SIG_EHT_SU_MU,
804 							 tlv->u_sig_eht_su_mu);
805 
806 	if (tlv->u_sig_eht_su)
807 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
808 							 U_SIG_EHT_SU,
809 							 tlv->u_sig_eht_su);
810 
811 	if (tlv->u_sig_eht_tb)
812 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
813 							 U_SIG_EHT_TB,
814 							 tlv->u_sig_eht_tb);
815 
816 	if (tlv->eht_sig_usr_su)
817 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
818 							 EHT_SIG_USR_SU,
819 							 tlv->eht_sig_usr_su);
820 
821 	if (tlv->eht_sig_usr_mu_mimo)
822 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
823 							 EHT_SIG_USR_MU_MIMO,
824 							 tlv->eht_sig_usr_mu_mimo);
825 
826 	if (tlv->eht_sig_usr_ofdma)
827 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
828 							 EHT_SIG_USR_OFDMA,
829 							 tlv->eht_sig_usr_ofdma);
830 
831 	if (tlv->phytx_ppdu_header_info_request)
832 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
833 							 PHYTX_PPDU_HEADER_INFO_REQUEST,
834 							 tlv->phytx_ppdu_header_info_request);
835 
836 	if (tlv->tqm_update_tx_mpdu_count)
837 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
838 							 TQM_UPDATE_TX_MPDU_COUNT,
839 							 tlv->tqm_update_tx_mpdu_count);
840 
841 	if (tlv->tqm_acked_mpdu)
842 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
843 							 TQM_ACKED_MPDU,
844 							 tlv->tqm_acked_mpdu);
845 
846 	if (tlv->tqm_acked_1k_mpdu)
847 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
848 							 TQM_ACKED_1K_MPDU,
849 							 tlv->tqm_acked_1k_mpdu);
850 
851 	if (tlv->txpcu_buf_status)
852 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
853 							 TXPCU_BUFFER_STATUS,
854 							 tlv->txpcu_buf_status);
855 
856 	if (tlv->txpcu_user_buf_status)
857 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
858 							 TXPCU_USER_BUFFER_STATUS,
859 							 tlv->txpcu_user_buf_status);
860 
861 	if (tlv->txdma_stop_request)
862 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
863 							 TXDMA_STOP_REQUEST,
864 							 tlv->txdma_stop_request);
865 
866 	if (tlv->expected_response)
867 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
868 							 EXPECTED_RESPONSE,
869 							 tlv->expected_response);
870 
871 	if (tlv->tx_mpdu_count_transfer_end)
872 		htt_tx_monitor_tlv_filter_in2_enable_set(*msg_word,
873 							 TX_MPDU_COUNT_TRANSFER_END,
874 							 tlv->tx_mpdu_count_transfer_end);
875 }
876 
877 static void
878 htt_tx_tlv_filter_mask_set_in3(uint32_t *msg_word,
879 			       struct htt_tx_ring_tlv_filter *htt_tlv_filter)
880 {
881 	struct dp_tx_mon_upstream_tlv_config *tlv = &htt_tlv_filter->utlvs;
882 
883 	if (tlv->rx_trig_info)
884 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
885 							 RX_TRIG_INFO,
886 							 tlv->rx_trig_info);
887 
888 	if (tlv->rxpcu_tx_setup_clear)
889 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
890 							 RXPCU_TX_SETUP_CLEAR,
891 							 tlv->rxpcu_tx_setup_clear);
892 
893 	if (tlv->rx_frame_bitmap_req)
894 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
895 							 RX_FRAME_BITMAP_REQ,
896 							 tlv->rx_frame_bitmap_req);
897 
898 	if (tlv->rx_phy_sleep)
899 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
900 							 RX_PHY_SLEEP,
901 							 tlv->rx_phy_sleep);
902 
903 	if (tlv->txpcu_preamble_done)
904 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
905 							 TXPCU_PREAMBLE_DONE,
906 							 tlv->txpcu_preamble_done);
907 
908 	if (tlv->txpcu_phytx_debug32)
909 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
910 							 TXPCU_PHYTX_DEBUG32,
911 							 tlv->txpcu_phytx_debug32);
912 
913 	if (tlv->txpcu_phytx_other_transmit_info32)
914 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
915 							 TXPCU_PHYTX_OTHER_TRANSMIT_INFO32,
916 							 tlv->txpcu_phytx_other_transmit_info32);
917 
918 	if (tlv->rx_ppdu_noack_report)
919 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
920 							 RX_PPDU_NO_ACK_REPORT,
921 							 tlv->rx_ppdu_noack_report);
922 
923 	if (tlv->rx_ppdu_ack_report)
924 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
925 							 RX_PPDU_ACK_REPORT,
926 							 tlv->rx_ppdu_ack_report);
927 
928 	if (tlv->coex_rx_status)
929 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
930 							 COEX_RX_STATUS,
931 							 tlv->coex_rx_status);
932 
933 	if (tlv->rx_start_param)
934 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
935 							 RX_START_PARAM,
936 							 tlv->rx_start_param);
937 
938 	if (tlv->tx_cbf_info)
939 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
940 							 TX_CBF_INFO,
941 							 tlv->tx_cbf_info);
942 
943 	if (tlv->rxpcu_early_rx_indication)
944 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
945 							 RXPCU_EARLY_RX_INDICATION,
946 							 tlv->rxpcu_early_rx_indication);
947 
948 	if (tlv->received_response_user_7_0)
949 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
950 							 RECEIVED_RESPONSE_USER_7_0,
951 							 tlv->received_response_user_7_0);
952 
953 	if (tlv->received_response_user_15_8)
954 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
955 							 RECEIVED_RESPONSE_USER_15_8,
956 							 tlv->received_response_user_15_8);
957 
958 	if (tlv->received_response_user_23_16)
959 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
960 							 RECEIVED_RESPONSE_USER_23_16,
961 							 tlv->received_response_user_23_16);
962 
963 	if (tlv->received_response_user_31_24)
964 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
965 							 RECEIVED_RESPONSE_USER_31_24,
966 							 tlv->received_response_user_31_24);
967 
968 	if (tlv->received_response_user_36_32)
969 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
970 							 RECEIVED_RESPONSE_USER_36_32,
971 							 tlv->received_response_user_36_32);
972 
973 	if (tlv->rx_pm_info)
974 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
975 							 RX_PM_INFO,
976 							 tlv->rx_pm_info);
977 
978 	if (tlv->rx_preamble)
979 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
980 							 RX_PREAMBLE,
981 							 tlv->rx_preamble);
982 
983 	if (tlv->others)
984 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
985 							 OTHERS,
986 							 tlv->others);
987 
988 	if (tlv->mactx_pre_phy_desc)
989 		htt_tx_monitor_tlv_filter_in3_enable_set(*msg_word,
990 							 MACTX_PRE_PHY_DESC,
991 							 tlv->mactx_pre_phy_desc);
992 }
993 
994 /*
995  * dp_htt_h2t_send_complete_free_netbuf() - Free completed buffer
996  * @soc:	SOC handl
997  * @status:	Completion status
998  * @netbuf:	HTT buffer
999  */
1000 static void
1001 dp_htt_h2t_send_complete_free_netbuf(
1002 	void *soc, A_STATUS status, qdf_nbuf_t netbuf)
1003 {
1004 	qdf_nbuf_free(netbuf);
1005 }
1006 
1007 /*
1008  * htt_h2t_tx_ring_cfg() - Send SRNG packet and TLV filter
1009  * config message to target
1010  * @htt_soc:	HTT SOC handle
1011  * @pdev_id:	WIN- PDEV Id, MCL- mac id
1012  * @hal_srng:	Opaque HAL SRNG pointer
1013  * @hal_ring_type:	SRNG ring type
1014  * @ring_buf_size:	SRNG buffer size
1015  * @htt_tlv_filter:	Rx SRNG TLV and filter setting
1016  * Return: 0 on success; error code on failure
1017  */
1018 int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id,
1019 			hal_ring_handle_t hal_ring_hdl,
1020 			int hal_ring_type, int ring_buf_size,
1021 			struct htt_tx_ring_tlv_filter *htt_tlv_filter)
1022 {
1023 	struct htt_soc *soc = (struct htt_soc *)htt_soc;
1024 	struct dp_htt_htc_pkt *pkt;
1025 	qdf_nbuf_t htt_msg;
1026 	uint32_t *msg_word;
1027 	struct hal_srng_params srng_params;
1028 	uint32_t htt_ring_id;
1029 	uint8_t *htt_logger_bufp;
1030 	int target_pdev_id;
1031 	QDF_STATUS status;
1032 
1033 	htt_msg = qdf_nbuf_alloc(soc->osdev,
1034 				 HTT_MSG_BUF_SIZE(HTT_TX_MONITOR_CFG_SZ),
1035 
1036 	/* reserve room for the HTC header */
1037 	HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4, TRUE);
1038 	if (!htt_msg)
1039 		goto fail0;
1040 
1041 	hal_get_srng_params(soc->hal_soc, hal_ring_hdl, &srng_params);
1042 
1043 	switch (hal_ring_type) {
1044 	case TX_MONITOR_BUF:
1045 		htt_ring_id = HTT_TX_MON_HOST2MON_BUF_RING;
1046 		break;
1047 	case TX_MONITOR_DST:
1048 		htt_ring_id = HTT_TX_MON_MON2HOST_DEST_RING;
1049 		break;
1050 	default:
1051 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
1052 			  "%s: Ring currently not supported", __func__);
1053 		goto fail1;
1054 	}
1055 
1056 	/*
1057 	 * Set the length of the message.
1058 	 * The contribution from the HTC_HDR_ALIGNMENT_PADDING is added
1059 	 * separately during the below call to qdf_nbuf_push_head.
1060 	 * The contribution from the HTC header is added separately inside HTC.
1061 	 */
1062 	if (qdf_nbuf_put_tail(htt_msg, HTT_TX_MONITOR_CFG_SZ) == NULL) {
1063 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
1064 			  "%s: Failed to expand head for TX Ring Cfg msg",
1065 			  __func__);
1066 		goto fail1; /* failure */
1067 	}
1068 
1069 	msg_word = (uint32_t *)qdf_nbuf_data(htt_msg);
1070 
1071 	/* rewind beyond alignment pad to get to the HTC header reserved area */
1072 	qdf_nbuf_push_head(htt_msg, HTC_HDR_ALIGNMENT_PADDING);
1073 
1074 	/* word 0 */
1075 	htt_logger_bufp = (uint8_t *)msg_word;
1076 	*msg_word = 0;
1077 	HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_H2T_MSG_TYPE_TX_MONITOR_CFG);
1078 
1079 	/*
1080 	 * pdev_id is indexed from 0 whereas mac_id is indexed from 1
1081 	 * SW_TO_SW and SW_TO_HW rings are unaffected by this
1082 	 */
1083 	target_pdev_id =
1084 	dp_get_target_pdev_id_for_host_pdev_id(soc->dp_soc, pdev_id);
1085 
1086 	HTT_TX_MONITOR_CFG_PDEV_ID_SET(*msg_word,
1087 				       target_pdev_id);
1088 
1089 	HTT_TX_MONITOR_CFG_RING_ID_SET(*msg_word, htt_ring_id);
1090 
1091 	HTT_TX_MONITOR_CFG_STATUS_TLV_SET(*msg_word,
1092 		!!(srng_params.flags & HAL_SRNG_MSI_SWAP));
1093 
1094 	HTT_TX_MONITOR_CFG_TX_MON_GLOBAL_EN_SET(*msg_word,
1095 						htt_tlv_filter->enable);
1096 
1097 	/* word 1 */
1098 	msg_word++;
1099 	*msg_word = 0;
1100 	HTT_TX_MONITOR_CFG_RING_BUFFER_SIZE_SET(*msg_word,
1101 						ring_buf_size);
1102 
1103 	if (htt_tlv_filter->mgmt_filter)
1104 		htt_tx_ring_pkt_type_set(*msg_word, ENABLE_FLAGS,
1105 					 MGMT, 1);
1106 
1107 	if (htt_tlv_filter->ctrl_filter)
1108 		htt_tx_ring_pkt_type_set(*msg_word, ENABLE_FLAGS,
1109 					 CTRL, 2);
1110 
1111 	if (htt_tlv_filter->data_filter)
1112 		htt_tx_ring_pkt_type_set(*msg_word, ENABLE_FLAGS,
1113 					 DATA, 4);
1114 
1115 	if (htt_tlv_filter->mgmt_dma_length)
1116 		HTT_TX_MONITOR_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word,
1117 							  htt_tlv_filter->mgmt_dma_length);
1118 
1119 	if (htt_tlv_filter->ctrl_dma_length)
1120 		HTT_TX_MONITOR_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word,
1121 							  htt_tlv_filter->ctrl_dma_length);
1122 
1123 	if (htt_tlv_filter->data_dma_length)
1124 		HTT_TX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word,
1125 							  htt_tlv_filter->data_dma_length);
1126 
1127 	/* word 2*/
1128 	msg_word++;
1129 	*msg_word = 0;
1130 	if (htt_tlv_filter->mgmt_filter)
1131 		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1);
1132 
1133 	if (htt_tlv_filter->ctrl_filter)
1134 		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 2);
1135 
1136 	if (htt_tlv_filter->data_filter)
1137 		HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 4);
1138 
1139 	if (htt_tlv_filter->mgmt_mpdu_start)
1140 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_MGMT_SET(*msg_word, 1);
1141 
1142 	if (htt_tlv_filter->ctrl_mpdu_start)
1143 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_CTRL_SET(*msg_word, 1);
1144 
1145 	if (htt_tlv_filter->data_mpdu_start)
1146 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_DATA_SET(*msg_word, 1);
1147 
1148 	if (htt_tlv_filter->mgmt_msdu_start)
1149 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_MGMT_SET(*msg_word, 1);
1150 
1151 	if (htt_tlv_filter->ctrl_msdu_start)
1152 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_CTRL_SET(*msg_word, 1);
1153 
1154 	if (htt_tlv_filter->data_msdu_start)
1155 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_DATA_SET(*msg_word, 1);
1156 
1157 	if (htt_tlv_filter->mgmt_mpdu_end)
1158 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_MGMT_SET(*msg_word, 1);
1159 
1160 	if (htt_tlv_filter->ctrl_mpdu_end)
1161 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_CTRL_SET(*msg_word, 1);
1162 
1163 	if (htt_tlv_filter->data_mpdu_end)
1164 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_DATA_SET(*msg_word, 1);
1165 
1166 	if (htt_tlv_filter->mgmt_msdu_end)
1167 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_MGMT_SET(*msg_word, 1);
1168 
1169 	if (htt_tlv_filter->ctrl_msdu_end)
1170 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_CTRL_SET(*msg_word, 1);
1171 
1172 	if (htt_tlv_filter->data_msdu_end)
1173 		HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_DATA_SET(*msg_word, 1);
1174 
1175 	/* word 3 */
1176 	msg_word++;
1177 	*msg_word = 0;
1178 
1179 	htt_tx_tlv_filter_mask_set_in0(msg_word, htt_tlv_filter);
1180 
1181 	/* word 4 */
1182 	msg_word++;
1183 	*msg_word = 0;
1184 
1185 	htt_tx_tlv_filter_mask_set_in1(msg_word, htt_tlv_filter);
1186 
1187 	/* word 5 */
1188 	msg_word++;
1189 	*msg_word = 0;
1190 
1191 	htt_tx_tlv_filter_mask_set_in2(msg_word, htt_tlv_filter);
1192 
1193 	/* word 6 */
1194 	msg_word++;
1195 	*msg_word = 0;
1196 
1197 	htt_tx_tlv_filter_mask_set_in3(msg_word, htt_tlv_filter);
1198 
1199 	/* word 7 */
1200 	msg_word++;
1201 	*msg_word = 0;
1202 	if (htt_tlv_filter->wmask.tx_fes_setup)
1203 		HTT_TX_MONITOR_CFG_TX_FES_SETUP_WORD_MASK_SET(*msg_word,
1204 					htt_tlv_filter->wmask.tx_fes_setup);
1205 
1206 	if (htt_tlv_filter->wmask.tx_peer_entry)
1207 		HTT_TX_MONITOR_CFG_TX_PEER_ENTRY_WORD_MASK_SET(*msg_word,
1208 					htt_tlv_filter->wmask.tx_peer_entry);
1209 
1210 	if (htt_tlv_filter->wmask.tx_queue_ext)
1211 		HTT_TX_MONITOR_CFG_TX_QUEUE_EXT_WORD_MASK_SET(*msg_word,
1212 					htt_tlv_filter->wmask.tx_queue_ext);
1213 
1214 	if (htt_tlv_filter->wmask.tx_msdu_start)
1215 		HTT_TX_MONITOR_CFG_TX_MSDU_START_WORD_MASK_SET(*msg_word,
1216 					htt_tlv_filter->wmask.tx_msdu_start);
1217 
1218 	/* word 8 */
1219 	msg_word++;
1220 	*msg_word = 0;
1221 	if (htt_tlv_filter->wmask.pcu_ppdu_setup_init)
1222 		HTT_TX_MONITOR_CFG_PCU_PPDU_SETUP_WORD_MASK_SET(*msg_word,
1223 					htt_tlv_filter->wmask.pcu_ppdu_setup_init);
1224 
1225 	/* word 9 */
1226 	msg_word++;
1227 	*msg_word = 0;
1228 
1229 	if (htt_tlv_filter->wmask.tx_mpdu_start)
1230 		HTT_TX_MONITOR_CFG_TX_MPDU_START_WORD_MASK_SET(*msg_word,
1231 					htt_tlv_filter->wmask.tx_mpdu_start);
1232 
1233 	if (htt_tlv_filter->wmask.rxpcu_user_setup)
1234 		HTT_TX_MONITOR_CFG_RXPCU_USER_SETUP_WORD_MASK_SET(*msg_word,
1235 					htt_tlv_filter->wmask.rxpcu_user_setup);
1236 
1237 	htt_tx_ring_pkt_type_set(*msg_word, ENABLE_MSDU_OR_MPDU_LOGGING,
1238 				 MGMT,
1239 				 htt_tlv_filter->mgmt_mpdu_log);
1240 
1241 	htt_tx_ring_pkt_type_set(*msg_word, ENABLE_MSDU_OR_MPDU_LOGGING,
1242 				 CTRL,
1243 				 htt_tlv_filter->ctrl_mpdu_log);
1244 
1245 	htt_tx_ring_pkt_type_set(*msg_word, ENABLE_MSDU_OR_MPDU_LOGGING,
1246 				 DATA,
1247 				 htt_tlv_filter->data_mpdu_log);
1248 
1249 	HTT_TX_MONITOR_CFG_DMA_MPDU_MGMT_SET(*msg_word,
1250 					     htt_tlv_filter->mgmt_mpdu_log);
1251 	HTT_TX_MONITOR_CFG_DMA_MPDU_CTRL_SET(*msg_word,
1252 					     htt_tlv_filter->ctrl_mpdu_log);
1253 	HTT_TX_MONITOR_CFG_DMA_MPDU_DATA_SET(*msg_word,
1254 					     htt_tlv_filter->data_mpdu_log);
1255 
1256 	pkt = htt_htc_pkt_alloc(soc);
1257 	if (!pkt)
1258 		goto fail1;
1259 
1260 	pkt->soc_ctxt = NULL; /* not used during send-done callback */
1261 
1262 	SET_HTC_PACKET_INFO_TX(
1263 		&pkt->htc_pkt,
1264 		dp_htt_h2t_send_complete_free_netbuf,
1265 		qdf_nbuf_data(htt_msg),
1266 		qdf_nbuf_len(htt_msg),
1267 		soc->htc_endpoint,
1268 		HTC_TX_PACKET_TAG_RUNTIME_PUT); /* tag for no FW response msg */
1269 
1270 	SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, htt_msg);
1271 	status = DP_HTT_SEND_HTC_PKT(soc, pkt,
1272 				     HTT_H2T_MSG_TYPE_TX_MONITOR_CFG,
1273 				     htt_logger_bufp);
1274 
1275 	if (status != QDF_STATUS_SUCCESS) {
1276 		qdf_nbuf_free(htt_msg);
1277 		htt_htc_pkt_free(soc, pkt);
1278 	}
1279 
1280 	return status;
1281 
1282 fail1:
1283 	qdf_nbuf_free(htt_msg);
1284 fail0:
1285 	return QDF_STATUS_E_FAILURE;
1286 }
1287 
1288 #ifdef QCA_ENHANCED_STATS_SUPPORT
1289 void dp_mon_filter_setup_enhanced_stats_2_0(struct dp_pdev *pdev)
1290 {
1291 	struct dp_mon_filter_be filter = {0};
1292 	enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
1293 	enum dp_mon_filter_srng_type srng_type =
1294 				DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
1295 	struct dp_mon_filter *rx_tlv_filter;
1296 	struct dp_mon_pdev *mon_pdev;
1297 	struct dp_mon_pdev_be *mon_pdev_be;
1298 
1299 	if (!pdev) {
1300 		dp_mon_filter_err("pdev Context is null");
1301 		return;
1302 	}
1303 
1304 	mon_pdev = pdev->monitor_pdev;
1305 	mon_pdev_be =
1306 		dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1307 
1308 	rx_tlv_filter = &filter.rx_tlv_filter;
1309 	dp_mon_filter_set_status_cmn(mon_pdev, rx_tlv_filter);
1310 	/* Setup the filter */
1311 	rx_tlv_filter->tlv_filter.ppdu_end_user_stats_ext = 0;
1312 	rx_tlv_filter->tlv_filter.enable_mo = 0;
1313 	rx_tlv_filter->tlv_filter.mo_mgmt_filter = 0;
1314 	rx_tlv_filter->tlv_filter.mo_ctrl_filter = 0;
1315 	rx_tlv_filter->tlv_filter.mo_data_filter = 0;
1316 	rx_tlv_filter->tlv_filter.ppdu_start_user_info = 1;
1317 	/* Enabled the filter */
1318 	rx_tlv_filter->valid = true;
1319 
1320 	dp_mon_filter_show_rx_filter_be(mode, &filter);
1321 
1322 	mon_pdev_be->filter_be[mode][srng_type] = filter;
1323 }
1324 
1325 void dp_mon_filter_reset_enhanced_stats_2_0(struct dp_pdev *pdev)
1326 {
1327 	struct dp_mon_filter_be filter = {0};
1328 	enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
1329 	enum dp_mon_filter_srng_type srng_type =
1330 				DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
1331 	struct dp_mon_pdev *mon_pdev;
1332 	struct dp_mon_pdev_be *mon_pdev_be;
1333 
1334 	if (!pdev) {
1335 		dp_mon_filter_err("pdev Context is null");
1336 		return;
1337 	}
1338 
1339 	mon_pdev = pdev->monitor_pdev;
1340 	mon_pdev_be =
1341 		dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1342 
1343 	mon_pdev_be->filter_be[mode][srng_type] = filter;
1344 }
1345 #endif /* QCA_ENHANCED_STATS_SUPPORT */
1346 
1347 #ifdef QCA_UNDECODED_METADATA_SUPPORT
1348 void
1349 dp_mon_filter_setup_undecoded_metadata_capture_2_0(struct dp_pdev *pdev)
1350 {
1351 }
1352 
1353 void
1354 dp_mon_filter_reset_undecoded_metadata_capture_2_0(struct dp_pdev *pdev)
1355 {
1356 }
1357 #endif
1358 
1359 void dp_tx_mon_filter_set_downstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
1360 {
1361 	filter->dtlvs.tx_fes_setup = 1;
1362 	filter->dtlvs.pcu_ppdu_setup_init = 1;
1363 	filter->dtlvs.tx_peer_entry = 1;
1364 	filter->dtlvs.tx_queue_extension = 1;
1365 	filter->dtlvs.fw2s_mon = 1;
1366 }
1367 
1368 void dp_tx_mon_filter_set_upstream_tlvs(struct htt_tx_ring_tlv_filter *filter)
1369 {
1370 	filter->utlvs.tx_fes_status_end = 1;
1371 	filter->utlvs.rx_response_required_info = 1;
1372 	filter->utlvs.response_end_status = 1;
1373 	filter->utlvs.tx_fes_status_start = 1;
1374 	filter->utlvs.tx_fes_status_start_prot = 1;
1375 	filter->utlvs.tx_fes_status_prot = 1;
1376 	filter->utlvs.tx_fes_status_start_ppdu = 1;
1377 	filter->utlvs.tx_fes_status_user_ppdu = 1;
1378 	filter->utlvs.coex_tx_status = 1;
1379 	filter->utlvs.rx_frame_bitmap_ack = 1;
1380 	filter->utlvs.rx_frame_1k_bitmap_ack = 1;
1381 	filter->utlvs.he_sig_a_su = 1;
1382 	filter->utlvs.he_sig_a_mu_dl = 1;
1383 	filter->utlvs.he_sig_b1_mu = 1;
1384 	filter->utlvs.he_sig_b2_mu = 1;
1385 	filter->utlvs.he_sig_b2_ofdma = 1;
1386 	filter->utlvs.l_sig_b = 1;
1387 	filter->utlvs.l_sig_a = 1;
1388 	filter->utlvs.ht_sig = 1;
1389 	filter->utlvs.vht_sig_a = 1;
1390 	filter->utlvs.mactx_phy_desc = 1;
1391 	filter->utlvs.mactx_user_desc_cmn = 1;
1392 	filter->utlvs.mactx_user_desc_per_usr = 1;
1393 }
1394 
1395 void dp_tx_mon_filter_set_word_mask(struct htt_tx_ring_tlv_filter *filter)
1396 {
1397 	filter->wmask.tx_fes_setup = 1;
1398 	filter->wmask.tx_peer_entry = 1;
1399 	filter->wmask.tx_queue_ext = 1;
1400 	filter->wmask.tx_msdu_start = 1;
1401 	filter->wmask.tx_mpdu_start = 1;
1402 	filter->wmask.pcu_ppdu_setup_init = 1;
1403 	filter->wmask.rxpcu_user_setup = 1;
1404 }
1405 
1406 void dp_tx_mon_filter_set_all(struct dp_mon_pdev_be *mon_pdev_be,
1407 			      struct htt_tx_ring_tlv_filter *filter)
1408 {
1409 	qdf_mem_zero(&filter->dtlvs,
1410 		     sizeof(filter->dtlvs));
1411 	qdf_mem_zero(&filter->utlvs,
1412 		     sizeof(filter->utlvs));
1413 	qdf_mem_zero(&filter->wmask,
1414 		     sizeof(filter->wmask));
1415 
1416 	dp_tx_mon_filter_set_downstream_tlvs(filter);
1417 	dp_tx_mon_filter_set_upstream_tlvs(filter);
1418 	dp_tx_mon_filter_set_word_mask(filter);
1419 
1420 	filter->mgmt_filter = 0x1;
1421 	filter->data_filter = 0x1;
1422 	filter->ctrl_filter = 0x1;
1423 
1424 	filter->mgmt_mpdu_end = 1;
1425 	filter->mgmt_msdu_end = 1;
1426 	filter->mgmt_msdu_start = 1;
1427 	filter->mgmt_mpdu_start = 1;
1428 	filter->ctrl_mpdu_end = 1;
1429 	filter->ctrl_msdu_end = 1;
1430 	filter->ctrl_msdu_start = 1;
1431 	filter->ctrl_mpdu_start = 1;
1432 	filter->data_mpdu_end = 1;
1433 	filter->data_msdu_end = 1;
1434 	filter->data_msdu_start = 1;
1435 	filter->data_mpdu_start = 1;
1436 	filter->mgmt_mpdu_log = 1;
1437 	filter->ctrl_mpdu_log = 1;
1438 	filter->data_mpdu_log = 1;
1439 
1440 	filter->mgmt_dma_length = mon_pdev_be->tx_mon_filter_length;
1441 	filter->ctrl_dma_length = mon_pdev_be->tx_mon_filter_length;
1442 	filter->data_dma_length = mon_pdev_be->tx_mon_filter_length;
1443 }
1444 
1445 void dp_mon_filter_setup_tx_mon_mode_2_0(struct dp_pdev *pdev)
1446 {
1447 	struct dp_mon_filter_be filter = {0};
1448 	struct dp_soc *soc = NULL;
1449 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
1450 	enum dp_mon_filter_srng_type srng_type =
1451 				DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
1452 	struct dp_mon_pdev *mon_pdev = NULL;
1453 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
1454 
1455 	if (!pdev) {
1456 		dp_mon_filter_err("pdev Context is null");
1457 		return;
1458 	}
1459 
1460 	soc = pdev->soc;
1461 	if (!soc) {
1462 		dp_mon_filter_err("Soc Context is null");
1463 		return;
1464 	}
1465 
1466 	mon_pdev = pdev->monitor_pdev;
1467 	if (!mon_pdev) {
1468 		dp_mon_filter_err("Monitor pdev context is null");
1469 		return;
1470 	}
1471 
1472 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1473 
1474 	filter.tx_valid = !!mon_pdev_be->tx_mon_mode;
1475 	dp_tx_mon_filter_set_all(mon_pdev_be, &filter.tx_tlv_filter);
1476 	dp_mon_filter_show_tx_filter_be(mode, &filter);
1477 	mon_pdev_be->filter_be[mode][srng_type] = filter;
1478 }
1479 
1480 void dp_mon_filter_reset_tx_mon_mode_2_0(struct dp_pdev *pdev)
1481 {
1482 	struct dp_mon_filter_be filter = {0};
1483 	struct dp_soc *soc = NULL;
1484 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
1485 	enum dp_mon_filter_srng_type srng_type =
1486 				DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
1487 	struct dp_mon_pdev *mon_pdev;
1488 	struct dp_mon_soc *mon_soc;
1489 	struct dp_mon_pdev_be *mon_pdev_be;
1490 	struct dp_mon_soc_be *mon_soc_be = NULL;
1491 
1492 	if (!pdev) {
1493 		dp_mon_filter_err("pdev Context is null");
1494 		return;
1495 	}
1496 
1497 	soc = pdev->soc;
1498 	if (!soc) {
1499 		dp_mon_filter_err("Soc Context is null");
1500 		return;
1501 	}
1502 
1503 	mon_pdev = pdev->monitor_pdev;
1504 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1505 	mon_soc = soc->monitor_soc;
1506 	mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
1507 	mon_soc_be->tx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT;
1508 	mon_soc_be->rx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT;
1509 
1510 	mon_pdev_be->filter_be[mode][srng_type] = filter;
1511 }
1512 
1513 static void dp_mon_filter_set_mon_2_0(struct dp_mon_pdev *mon_pdev,
1514 				      struct dp_mon_filter *filter)
1515 {
1516 	filter->tlv_filter.mpdu_start = 1;
1517 	filter->tlv_filter.msdu_start = 1;
1518 	filter->tlv_filter.packet = 1;
1519 	filter->tlv_filter.packet_header = 1;
1520 	filter->tlv_filter.header_per_msdu = 1;
1521 	filter->tlv_filter.rx_hdr_length = RX_HDR_DMA_LENGTH_64B;
1522 	filter->tlv_filter.msdu_end = 1;
1523 	filter->tlv_filter.mpdu_end = 1;
1524 	filter->tlv_filter.attention = 0;
1525 	filter->tlv_filter.ppdu_start = 1;
1526 	filter->tlv_filter.ppdu_end = 1;
1527 	filter->tlv_filter.ppdu_end_user_stats = 1;
1528 	filter->tlv_filter.ppdu_end_user_stats_ext = 1;
1529 	filter->tlv_filter.ppdu_end_status_done = 1;
1530 	filter->tlv_filter.ppdu_start_user_info = 1;
1531 	filter->tlv_filter.enable_fp =
1532 		(mon_pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0;
1533 	filter->tlv_filter.enable_mo =
1534 		(mon_pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0;
1535 	filter->tlv_filter.fp_mgmt_filter = mon_pdev->fp_mgmt_filter;
1536 	filter->tlv_filter.fp_ctrl_filter = mon_pdev->fp_ctrl_filter;
1537 	filter->tlv_filter.fp_data_filter = mon_pdev->fp_data_filter;
1538 	filter->tlv_filter.mo_mgmt_filter = mon_pdev->mo_mgmt_filter;
1539 	filter->tlv_filter.mo_ctrl_filter = mon_pdev->mo_ctrl_filter;
1540 	filter->tlv_filter.mo_data_filter = mon_pdev->mo_data_filter;
1541 	filter->tlv_filter.enable_md = 0;
1542 	filter->tlv_filter.enable_fpmo = 0;
1543 	filter->tlv_filter.offset_valid = false;
1544 	filter->tlv_filter.mgmt_dma_length = DEFAULT_DMA_LENGTH;
1545 	filter->tlv_filter.data_dma_length = DEFAULT_DMA_LENGTH;
1546 	filter->tlv_filter.ctrl_dma_length = DEFAULT_DMA_LENGTH;
1547 	 /* compute offset size in QWORDS */
1548 	filter->tlv_filter.rx_pkt_tlv_offset = DP_RX_MON_PACKET_OFFSET / 8;
1549 	filter->tlv_filter.mgmt_mpdu_log = DP_MON_MSDU_LOGGING;
1550 	filter->tlv_filter.ctrl_mpdu_log = DP_MON_MSDU_LOGGING;
1551 	filter->tlv_filter.data_mpdu_log = DP_MON_MSDU_LOGGING;
1552 
1553 	if (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) {
1554 		filter->tlv_filter.enable_mo = 1;
1555 		filter->tlv_filter.mo_mgmt_filter = FILTER_MGMT_ALL;
1556 		filter->tlv_filter.mo_ctrl_filter = FILTER_CTRL_ALL;
1557 		filter->tlv_filter.mo_data_filter = FILTER_DATA_ALL;
1558 	} else {
1559 		filter->tlv_filter.enable_mo = 0;
1560 	}
1561 }
1562 
1563 void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev)
1564 {
1565 	struct dp_mon_filter_be filter = {0};
1566 	struct dp_mon_filter *rx_tlv_filter;
1567 	struct dp_soc *soc;
1568 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
1569 	enum dp_mon_filter_srng_type srng_type =
1570 				DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
1571 	struct dp_mon_pdev *mon_pdev;
1572 	struct dp_mon_pdev_be *mon_pdev_be;
1573 
1574 	if (!pdev) {
1575 		dp_mon_filter_err("pdev Context is null");
1576 		return;
1577 	}
1578 
1579 	soc = pdev->soc;
1580 	if (!soc) {
1581 		dp_mon_filter_err("Soc Context is null");
1582 		return;
1583 	}
1584 
1585 	mon_pdev = pdev->monitor_pdev;
1586 	if (!mon_pdev) {
1587 		dp_mon_filter_err("mon_pdev Context is null");
1588 		return;
1589 	}
1590 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1591 
1592 	rx_tlv_filter = &filter.rx_tlv_filter;
1593 	rx_tlv_filter->valid = true;
1594 
1595 	dp_mon_filter_set_mon_2_0(mon_pdev, rx_tlv_filter);
1596 	dp_mon_filter_show_rx_filter_be(mode, &filter);
1597 
1598 	/* Store the above filter */
1599 	mon_pdev_be->filter_be[mode][srng_type] = filter;
1600 }
1601 
1602 void dp_mon_filter_reset_rx_mon_mode_2_0(struct dp_pdev *pdev)
1603 {
1604 	struct dp_mon_filter_be filter = {0};
1605 	struct dp_mon_filter *rx_tlv_filter;
1606 	struct dp_soc *soc = NULL;
1607 
1608 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
1609 	enum dp_mon_filter_srng_type srng_type =
1610 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
1611 	struct dp_mon_pdev *mon_pdev;
1612 	struct dp_mon_pdev_be *mon_pdev_be;
1613 
1614 	if (!pdev) {
1615 		dp_mon_filter_err("pdev Context is null");
1616 		return;
1617 	}
1618 
1619 	soc = pdev->soc;
1620 	if (!soc) {
1621 		dp_mon_filter_err("Soc Context is null");
1622 		return;
1623 	}
1624 
1625 	mon_pdev = pdev->monitor_pdev;
1626 	if (!mon_pdev) {
1627 		dp_mon_filter_err("mon_pdev Context is null");
1628 		return;
1629 	}
1630 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1631 
1632 	rx_tlv_filter = &filter.rx_tlv_filter;
1633 	rx_tlv_filter->valid = true;
1634 
1635 	qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
1636 	/* Store the above filter */
1637 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
1638 	mon_pdev_be->filter_be[mode][srng_type] = filter;
1639 }
1640 
1641 static void dp_rx_mon_filter_show_filter(struct dp_mon_filter_be *filter)
1642 {
1643 	struct htt_rx_ring_tlv_filter *rx_tlv_filter =
1644 		&filter->rx_tlv_filter.tlv_filter;
1645 
1646 	DP_MON_FILTER_PRINT("Enable: %d", rx_tlv_filter->enable);
1647 	DP_MON_FILTER_PRINT("mpdu_start: %d", rx_tlv_filter->mpdu_start);
1648 	DP_MON_FILTER_PRINT("msdu_start: %d", rx_tlv_filter->msdu_start);
1649 	DP_MON_FILTER_PRINT("packet: %d", rx_tlv_filter->packet);
1650 	DP_MON_FILTER_PRINT("msdu_end: %d", rx_tlv_filter->msdu_end);
1651 	DP_MON_FILTER_PRINT("mpdu_end: %d", rx_tlv_filter->mpdu_end);
1652 	DP_MON_FILTER_PRINT("packet_header: %d",
1653 			    rx_tlv_filter->packet_header);
1654 	DP_MON_FILTER_PRINT("attention: %d", rx_tlv_filter->attention);
1655 	DP_MON_FILTER_PRINT("ppdu_start: %d", rx_tlv_filter->ppdu_start);
1656 	DP_MON_FILTER_PRINT("ppdu_end: %d", rx_tlv_filter->ppdu_end);
1657 	DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d",
1658 			    rx_tlv_filter->ppdu_end_user_stats);
1659 	DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d",
1660 			    rx_tlv_filter->ppdu_end_user_stats_ext);
1661 	DP_MON_FILTER_PRINT("ppdu_end_status_done: %d",
1662 			    rx_tlv_filter->ppdu_end_status_done);
1663 	DP_MON_FILTER_PRINT("ppdu_start_user_info: %d",
1664 			    rx_tlv_filter->ppdu_start_user_info);
1665 	DP_MON_FILTER_PRINT("header_per_msdu: %d",
1666 			    rx_tlv_filter->header_per_msdu);
1667 	DP_MON_FILTER_PRINT("enable_fp: %d", rx_tlv_filter->enable_fp);
1668 	DP_MON_FILTER_PRINT("enable_md: %d", rx_tlv_filter->enable_md);
1669 	DP_MON_FILTER_PRINT("enable_mo: %d", rx_tlv_filter->enable_mo);
1670 	DP_MON_FILTER_PRINT("enable_fpmo: %d", rx_tlv_filter->enable_fpmo);
1671 	DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x",
1672 			    rx_tlv_filter->fp_mgmt_filter);
1673 	DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x",
1674 			    rx_tlv_filter->mo_mgmt_filter);
1675 	DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x",
1676 			    rx_tlv_filter->fp_ctrl_filter);
1677 	DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x",
1678 			    rx_tlv_filter->mo_ctrl_filter);
1679 	DP_MON_FILTER_PRINT("fp_data_filter: 0x%x",
1680 			    rx_tlv_filter->fp_data_filter);
1681 	DP_MON_FILTER_PRINT("mo_data_filter: 0x%x",
1682 			    rx_tlv_filter->mo_data_filter);
1683 	DP_MON_FILTER_PRINT("md_data_filter: 0x%x",
1684 			    rx_tlv_filter->md_data_filter);
1685 	DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x",
1686 			    rx_tlv_filter->md_mgmt_filter);
1687 	DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x",
1688 			    rx_tlv_filter->md_ctrl_filter);
1689 	DP_MON_FILTER_PRINT("fpmo_data_filter: 0x%x",
1690 			    rx_tlv_filter->fpmo_data_filter);
1691 	DP_MON_FILTER_PRINT("fpmo_mgmt_filter: 0x%x",
1692 			    rx_tlv_filter->fpmo_mgmt_filter);
1693 	DP_MON_FILTER_PRINT("fpmo_ctrl_filter: 0x%x",
1694 			    rx_tlv_filter->fpmo_ctrl_filter);
1695 	DP_MON_FILTER_PRINT("mgmt_dma_length: %d",
1696 			    rx_tlv_filter->mgmt_dma_length);
1697 	DP_MON_FILTER_PRINT("ctrl_dma_length: %d",
1698 			    rx_tlv_filter->ctrl_dma_length);
1699 	DP_MON_FILTER_PRINT("data_dma_length: %d",
1700 			    rx_tlv_filter->data_dma_length);
1701 	DP_MON_FILTER_PRINT("rx_mpdu_start_wmask: 0x%x",
1702 			    rx_tlv_filter->rx_mpdu_start_wmask);
1703 	DP_MON_FILTER_PRINT("rx_msdu_end_wmask: 0x%x",
1704 			    rx_tlv_filter->rx_msdu_end_wmask);
1705 	DP_MON_FILTER_PRINT("rx_hdr_length: %d",
1706 			    rx_tlv_filter->rx_hdr_length);
1707 	DP_MON_FILTER_PRINT("mgmt_mpdu_log: 0x%x",
1708 			    rx_tlv_filter->mgmt_mpdu_log);
1709 	DP_MON_FILTER_PRINT("data_mpdu_log: 0x%x",
1710 			    rx_tlv_filter->data_mpdu_log);
1711 	DP_MON_FILTER_PRINT("ctrl_mpdu_log: 0x%x",
1712 			    rx_tlv_filter->ctrl_mpdu_log);
1713 	DP_MON_FILTER_PRINT("mgmt_dma_length: 0x%x",
1714 			    rx_tlv_filter->mgmt_dma_length);
1715 	DP_MON_FILTER_PRINT("data_dma_length: 0x%x",
1716 			    rx_tlv_filter->data_dma_length);
1717 	DP_MON_FILTER_PRINT("ctrl_dma_length: 0x%x",
1718 			    rx_tlv_filter->ctrl_dma_length);
1719 }
1720 
1721 static void dp_tx_mon_filter_show_filter(struct dp_mon_filter_be *filter)
1722 {
1723 	struct htt_tx_ring_tlv_filter *tlv_filter = &filter->tx_tlv_filter;
1724 
1725 	DP_MON_FILTER_PRINT("TX Monitor Filter configuration:");
1726 	DP_MON_FILTER_PRINT("Enable: %d", tlv_filter->enable);
1727 	DP_MON_FILTER_PRINT("mgmt_filter: %d", tlv_filter->mgmt_filter);
1728 	DP_MON_FILTER_PRINT("data_filter: %d", tlv_filter->data_filter);
1729 	DP_MON_FILTER_PRINT("ctrl_filter: %d", tlv_filter->ctrl_filter);
1730 	DP_MON_FILTER_PRINT("mgmt_dma_length: %d", tlv_filter->mgmt_dma_length);
1731 	DP_MON_FILTER_PRINT("ctrl_dma_length: %d", tlv_filter->ctrl_dma_length);
1732 	DP_MON_FILTER_PRINT("data_dma_length: %d", tlv_filter->data_dma_length);
1733 	DP_MON_FILTER_PRINT("mgmt_mpdu_end: %d", tlv_filter->mgmt_mpdu_end);
1734 	DP_MON_FILTER_PRINT("mgmt_msdu_end: %d", tlv_filter->mgmt_msdu_end);
1735 	DP_MON_FILTER_PRINT("mgmt_mpdu_start: %d", tlv_filter->mgmt_mpdu_start);
1736 	DP_MON_FILTER_PRINT("mgmt_msdu_start: %d", tlv_filter->mgmt_msdu_start);
1737 	DP_MON_FILTER_PRINT("ctrl_mpdu_end: %d", tlv_filter->ctrl_mpdu_end);
1738 	DP_MON_FILTER_PRINT("ctrl_msdu_end: %d", tlv_filter->ctrl_msdu_end);
1739 	DP_MON_FILTER_PRINT("ctrl_mpdu_start: %d", tlv_filter->ctrl_mpdu_start);
1740 	DP_MON_FILTER_PRINT("ctrl_msdu_start: %d", tlv_filter->ctrl_msdu_start);
1741 	DP_MON_FILTER_PRINT("data_mpdu_end: %d", tlv_filter->data_mpdu_end);
1742 	DP_MON_FILTER_PRINT("data_msdu_end: %d", tlv_filter->data_msdu_end);
1743 	DP_MON_FILTER_PRINT("data_mpdu_start: %d", tlv_filter->data_mpdu_start);
1744 	DP_MON_FILTER_PRINT("data_msdu_start: %d", tlv_filter->data_msdu_start);
1745 	DP_MON_FILTER_PRINT("mgmt_mpdu_log: %d", tlv_filter->mgmt_mpdu_log);
1746 	DP_MON_FILTER_PRINT("ctrl_mpdu_log: %d", tlv_filter->ctrl_mpdu_log);
1747 	DP_MON_FILTER_PRINT("data_mpdu_log: %d", tlv_filter->data_mpdu_log);
1748 
1749 	/* Downstream TLVs */
1750 	DP_MON_FILTER_PRINT("Downstream TLVs");
1751 	DP_MON_FILTER_PRINT("tx_fes_setup: %d", tlv_filter->dtlvs.tx_fes_setup);
1752 	DP_MON_FILTER_PRINT("tx_peer_entry: %d",
1753 			    tlv_filter->dtlvs.tx_peer_entry);
1754 	DP_MON_FILTER_PRINT("tx_queue_extension: %d",
1755 			    tlv_filter->dtlvs.tx_queue_extension);
1756 	DP_MON_FILTER_PRINT("tx_last_mpdu_fetched: %d",
1757 			    tlv_filter->dtlvs.tx_last_mpdu_fetched);
1758 	DP_MON_FILTER_PRINT("tx_data_sync: %d", tlv_filter->dtlvs.tx_data_sync);
1759 	DP_MON_FILTER_PRINT("pcu_ppdu_setup_init: %d",
1760 			    tlv_filter->dtlvs.pcu_ppdu_setup_init);
1761 	DP_MON_FILTER_PRINT("fw2s_mon: %d", tlv_filter->dtlvs.fw2s_mon);
1762 	DP_MON_FILTER_PRINT("tx_loopback_setup: %d",
1763 			    tlv_filter->dtlvs.tx_loopback_setup);
1764 	DP_MON_FILTER_PRINT("sch_critical_tlv_ref: %d",
1765 			    tlv_filter->dtlvs.sch_critical_tlv_ref);
1766 	DP_MON_FILTER_PRINT("ndp_preamble_done: %d",
1767 			    tlv_filter->dtlvs.ndp_preamble_done);
1768 	DP_MON_FILTER_PRINT("tx_raw_frame_setup: %d",
1769 			    tlv_filter->dtlvs.tx_raw_frame_setup);
1770 	DP_MON_FILTER_PRINT("txpcu_user_setup: %d",
1771 			    tlv_filter->dtlvs.txpcu_user_setup);
1772 	DP_MON_FILTER_PRINT("rxpcu_setup: %d", tlv_filter->dtlvs.rxpcu_setup);
1773 	DP_MON_FILTER_PRINT("rxpcu_setup_complete: %d",
1774 			    tlv_filter->dtlvs.rxpcu_setup_complete);
1775 	DP_MON_FILTER_PRINT("coex_tx_req: %d", tlv_filter->dtlvs.coex_tx_req);
1776 	DP_MON_FILTER_PRINT("rxpcu_user_setup: %d",
1777 			    tlv_filter->dtlvs.rxpcu_user_setup);
1778 	DP_MON_FILTER_PRINT("rxpcu_user_setup_ext: %d",
1779 			    tlv_filter->dtlvs.rxpcu_user_setup_ext);
1780 	DP_MON_FILTER_PRINT("wur_data: %d", tlv_filter->dtlvs.wur_data);
1781 	DP_MON_FILTER_PRINT("tqm_mpdu_global_start: %d",
1782 			    tlv_filter->dtlvs.tqm_mpdu_global_start);
1783 	DP_MON_FILTER_PRINT("tx_fes_setup_complete: %d",
1784 			    tlv_filter->dtlvs.tx_fes_setup_complete);
1785 	DP_MON_FILTER_PRINT("scheduler_end: %d",
1786 			    tlv_filter->dtlvs.scheduler_end);
1787 	DP_MON_FILTER_PRINT("sch_wait_instr_tx_path: %d",
1788 			    tlv_filter->dtlvs.sch_wait_instr_tx_path);
1789 
1790 	/* Upstream TLVs */
1791 	DP_MON_FILTER_PRINT("Upstream TLVs");
1792 	DP_MON_FILTER_PRINT("rx_response_required_info: %d",
1793 			    tlv_filter->utlvs.rx_response_required_info);
1794 	DP_MON_FILTER_PRINT("response_start_status: %d",
1795 			    tlv_filter->utlvs.response_start_status);
1796 	DP_MON_FILTER_PRINT("response_end_status: %d",
1797 			    tlv_filter->utlvs.response_end_status);
1798 	DP_MON_FILTER_PRINT("tx_fes_status_start: %d",
1799 			    tlv_filter->utlvs.tx_fes_status_start);
1800 	DP_MON_FILTER_PRINT("tx_fes_status_end: %d",
1801 			    tlv_filter->utlvs.tx_fes_status_end);
1802 	DP_MON_FILTER_PRINT("tx_fes_status_start_ppdu: %d",
1803 			    tlv_filter->utlvs.tx_fes_status_start_ppdu);
1804 	DP_MON_FILTER_PRINT("tx_fes_status_user_ppdu: %d",
1805 			    tlv_filter->utlvs.tx_fes_status_user_ppdu);
1806 	DP_MON_FILTER_PRINT("tx_fes_status_ack_or_ba: %d",
1807 			    tlv_filter->utlvs.tx_fes_status_ack_or_ba);
1808 	DP_MON_FILTER_PRINT("tx_fes_status_1k_ba: %d",
1809 			    tlv_filter->utlvs.tx_fes_status_1k_ba);
1810 	DP_MON_FILTER_PRINT("tx_fes_status_start_prot: %d",
1811 			    tlv_filter->utlvs.tx_fes_status_start_prot);
1812 	DP_MON_FILTER_PRINT("tx_fes_status_prot: %d",
1813 			    tlv_filter->utlvs.tx_fes_status_prot);
1814 	DP_MON_FILTER_PRINT("tx_fes_status_user_response: %d",
1815 			    tlv_filter->utlvs.tx_fes_status_user_response);
1816 	DP_MON_FILTER_PRINT("rx_frame_bitmap_ack: %d",
1817 			    tlv_filter->utlvs.rx_frame_bitmap_ack);
1818 	DP_MON_FILTER_PRINT("rx_frame_1k_bitmap_ack: %d",
1819 			    tlv_filter->utlvs.rx_frame_1k_bitmap_ack);
1820 	DP_MON_FILTER_PRINT("coex_tx_status: %d",
1821 			    tlv_filter->utlvs.coex_tx_status);
1822 	DP_MON_FILTER_PRINT("received_response_info: %d",
1823 			    tlv_filter->utlvs.received_response_info);
1824 	DP_MON_FILTER_PRINT("received_response_info_p2: %d",
1825 			    tlv_filter->utlvs.received_response_info_p2);
1826 	DP_MON_FILTER_PRINT("ofdma_trigger_details: %d",
1827 			    tlv_filter->utlvs.ofdma_trigger_details);
1828 	DP_MON_FILTER_PRINT("received_trigger_info: %d",
1829 			    tlv_filter->utlvs.received_trigger_info);
1830 	DP_MON_FILTER_PRINT("pdg_tx_request: %d",
1831 			    tlv_filter->utlvs.pdg_tx_request);
1832 	DP_MON_FILTER_PRINT("pdg_response: %d",
1833 			    tlv_filter->utlvs.pdg_response);
1834 	DP_MON_FILTER_PRINT("pdg_trig_response: %d",
1835 			    tlv_filter->utlvs.pdg_trig_response);
1836 	DP_MON_FILTER_PRINT("trigger_response_tx_done: %d",
1837 			    tlv_filter->utlvs.trigger_response_tx_done);
1838 	DP_MON_FILTER_PRINT("prot_tx_end: %d", tlv_filter->utlvs.prot_tx_end);
1839 	DP_MON_FILTER_PRINT("ppdu_tx_end: %d", tlv_filter->utlvs.ppdu_tx_end);
1840 	DP_MON_FILTER_PRINT("r2r_status_end: %d",
1841 			    tlv_filter->utlvs.r2r_status_end);
1842 	DP_MON_FILTER_PRINT("flush_req: %d", tlv_filter->utlvs.flush_req);
1843 	DP_MON_FILTER_PRINT("mactx_phy_desc: %d",
1844 			    tlv_filter->utlvs.mactx_phy_desc);
1845 	DP_MON_FILTER_PRINT("mactx_user_desc_cmn: %d",
1846 			    tlv_filter->utlvs.mactx_user_desc_cmn);
1847 	DP_MON_FILTER_PRINT("mactx_user_desc_per_usr: %d",
1848 			    tlv_filter->utlvs.mactx_user_desc_per_usr);
1849 
1850 	DP_MON_FILTER_PRINT("tqm_acked_1k_mpdu: %d",
1851 			    tlv_filter->utlvs.tqm_acked_1k_mpdu);
1852 	DP_MON_FILTER_PRINT("tqm_acked_mpdu: %d",
1853 			    tlv_filter->utlvs.tqm_acked_mpdu);
1854 	DP_MON_FILTER_PRINT("tqm_update_tx_mpdu_count: %d",
1855 			    tlv_filter->utlvs.tqm_update_tx_mpdu_count);
1856 	DP_MON_FILTER_PRINT("phytx_ppdu_header_info_request: %d",
1857 			    tlv_filter->utlvs.phytx_ppdu_header_info_request);
1858 	DP_MON_FILTER_PRINT("u_sig_eht_su_mu: %d",
1859 			    tlv_filter->utlvs.u_sig_eht_su_mu);
1860 	DP_MON_FILTER_PRINT("u_sig_eht_su: %d", tlv_filter->utlvs.u_sig_eht_su);
1861 	DP_MON_FILTER_PRINT("u_sig_eht_tb: %d", tlv_filter->utlvs.u_sig_eht_tb);
1862 	DP_MON_FILTER_PRINT("eht_sig_usr_su: %d",
1863 			    tlv_filter->utlvs.eht_sig_usr_su);
1864 	DP_MON_FILTER_PRINT("eht_sig_usr_mu_mimo: %d",
1865 			    tlv_filter->utlvs.eht_sig_usr_mu_mimo);
1866 	DP_MON_FILTER_PRINT("eht_sig_usr_ofdma: %d",
1867 			    tlv_filter->utlvs.eht_sig_usr_ofdma);
1868 	DP_MON_FILTER_PRINT("he_sig_a_su: %d",
1869 			    tlv_filter->utlvs.he_sig_a_su);
1870 	DP_MON_FILTER_PRINT("he_sig_a_mu_dl: %d",
1871 			    tlv_filter->utlvs.he_sig_a_mu_dl);
1872 	DP_MON_FILTER_PRINT("he_sig_a_mu_ul: %d",
1873 			    tlv_filter->utlvs.he_sig_a_mu_ul);
1874 	DP_MON_FILTER_PRINT("he_sig_b1_mu: %d",
1875 			    tlv_filter->utlvs.he_sig_b1_mu);
1876 	DP_MON_FILTER_PRINT("he_sig_b2_mu: %d",
1877 			    tlv_filter->utlvs.he_sig_b2_mu);
1878 	DP_MON_FILTER_PRINT("he_sig_b2_ofdma: %d",
1879 			    tlv_filter->utlvs.he_sig_b2_ofdma);
1880 	DP_MON_FILTER_PRINT("vht_sig_b_mu160: %d",
1881 			    tlv_filter->utlvs.vht_sig_b_mu160);
1882 	DP_MON_FILTER_PRINT("vht_sig_b_mu80: %d",
1883 			    tlv_filter->utlvs.vht_sig_b_mu80);
1884 	DP_MON_FILTER_PRINT("vht_sig_b_mu40: %d",
1885 			    tlv_filter->utlvs.vht_sig_b_mu40);
1886 	DP_MON_FILTER_PRINT("vht_sig_b_mu20: %d",
1887 			    tlv_filter->utlvs.vht_sig_b_mu20);
1888 	DP_MON_FILTER_PRINT("vht_sig_b_su160: %d",
1889 			    tlv_filter->utlvs.vht_sig_b_su160);
1890 	DP_MON_FILTER_PRINT("vht_sig_b_su80: %d",
1891 			    tlv_filter->utlvs.vht_sig_b_su80);
1892 	DP_MON_FILTER_PRINT("vht_sig_b_su40: %d",
1893 			    tlv_filter->utlvs.vht_sig_b_su40);
1894 	DP_MON_FILTER_PRINT("vht_sig_b_su20: %d",
1895 			    tlv_filter->utlvs.vht_sig_b_su20);
1896 	DP_MON_FILTER_PRINT("vht_sig_a: %d", tlv_filter->utlvs.vht_sig_a);
1897 	DP_MON_FILTER_PRINT("ht_sig: %d", tlv_filter->utlvs.ht_sig);
1898 	DP_MON_FILTER_PRINT("l_sig_b: %d", tlv_filter->utlvs.l_sig_b);
1899 	DP_MON_FILTER_PRINT("l_sig_a: %d", tlv_filter->utlvs.l_sig_a);
1900 	DP_MON_FILTER_PRINT("tx_service: %d", tlv_filter->utlvs.tx_service);
1901 
1902 	DP_MON_FILTER_PRINT("txpcu_buf_status: %d",
1903 			    tlv_filter->utlvs.txpcu_buf_status);
1904 	DP_MON_FILTER_PRINT("txpcu_user_buf_status: %d",
1905 			    tlv_filter->utlvs.txpcu_user_buf_status);
1906 	DP_MON_FILTER_PRINT("txdma_stop_request: %d",
1907 			    tlv_filter->utlvs.txdma_stop_request);
1908 	DP_MON_FILTER_PRINT("expected_response: %d",
1909 			    tlv_filter->utlvs.expected_response);
1910 	DP_MON_FILTER_PRINT("tx_mpdu_count_transfer_end: %d",
1911 			    tlv_filter->utlvs.tx_mpdu_count_transfer_end);
1912 	DP_MON_FILTER_PRINT("rx_trig_info: %d",
1913 			    tlv_filter->utlvs.rx_trig_info);
1914 	DP_MON_FILTER_PRINT("rxpcu_tx_setup_clear: %d",
1915 			    tlv_filter->utlvs.rxpcu_tx_setup_clear);
1916 	DP_MON_FILTER_PRINT("rx_frame_bitmap_req: %d",
1917 			    tlv_filter->utlvs.rx_frame_bitmap_req);
1918 	DP_MON_FILTER_PRINT("rx_phy_sleep: %d",
1919 			    tlv_filter->utlvs.rx_phy_sleep);
1920 	DP_MON_FILTER_PRINT("txpcu_preamble_done: %d",
1921 			    tlv_filter->utlvs.txpcu_preamble_done);
1922 	DP_MON_FILTER_PRINT("txpcu_phytx_debug32: %d",
1923 			    tlv_filter->utlvs.txpcu_phytx_debug32);
1924 	DP_MON_FILTER_PRINT("txpcu_phytx_other_transmit_info32: %d",
1925 			    tlv_filter->utlvs.txpcu_phytx_other_transmit_info32);
1926 	DP_MON_FILTER_PRINT("rx_ppdu_noack_report: %d",
1927 			    tlv_filter->utlvs.rx_ppdu_noack_report);
1928 	DP_MON_FILTER_PRINT("rx_ppdu_ack_report: %d",
1929 			    tlv_filter->utlvs.rx_ppdu_ack_report);
1930 	DP_MON_FILTER_PRINT("coex_rx_status: %d",
1931 			    tlv_filter->utlvs.coex_rx_status);
1932 	DP_MON_FILTER_PRINT("rx_start_param: %d",
1933 			    tlv_filter->utlvs.rx_start_param);
1934 	DP_MON_FILTER_PRINT("tx_cbf_info: %d",
1935 			    tlv_filter->utlvs.tx_cbf_info);
1936 	DP_MON_FILTER_PRINT("rxpcu_early_rx_indication: %d",
1937 			    tlv_filter->utlvs.rxpcu_early_rx_indication);
1938 	DP_MON_FILTER_PRINT("received_response_user_7_0: %d",
1939 			    tlv_filter->utlvs.received_response_user_7_0);
1940 	DP_MON_FILTER_PRINT("received_response_user_15_8: %d",
1941 			    tlv_filter->utlvs.received_response_user_15_8);
1942 	DP_MON_FILTER_PRINT("received_response_user_23_16: %d",
1943 			    tlv_filter->utlvs.received_response_user_23_16);
1944 	DP_MON_FILTER_PRINT("received_response_user_31_24: %d",
1945 			    tlv_filter->utlvs.received_response_user_31_24);
1946 	DP_MON_FILTER_PRINT("received_response_user_36_32: %d",
1947 			    tlv_filter->utlvs.received_response_user_36_32);
1948 	DP_MON_FILTER_PRINT("rx_pm_info: %d",
1949 			    tlv_filter->utlvs.rx_pm_info);
1950 	DP_MON_FILTER_PRINT("rx_preamble: %d",
1951 			    tlv_filter->utlvs.rx_preamble);
1952 	DP_MON_FILTER_PRINT("others: %d",
1953 			    tlv_filter->utlvs.others);
1954 	DP_MON_FILTER_PRINT("mactx_pre_phy_desc: %d",
1955 			    tlv_filter->utlvs.mactx_pre_phy_desc);
1956 
1957 	/* Word mask subscription */
1958 	DP_MON_FILTER_PRINT("wmask tx_fes_setup: %d",
1959 			    tlv_filter->wmask.tx_fes_setup);
1960 	DP_MON_FILTER_PRINT("wmask tx_peer_entry: %d",
1961 			    tlv_filter->wmask.tx_peer_entry);
1962 	DP_MON_FILTER_PRINT("wmask tx_queue_ext: %d",
1963 			    tlv_filter->wmask.tx_queue_ext);
1964 	DP_MON_FILTER_PRINT("wmask tx_msdu_start: %d",
1965 			    tlv_filter->wmask.tx_msdu_start);
1966 	DP_MON_FILTER_PRINT("wmask tx_mpdu_start: %d",
1967 			    tlv_filter->wmask.tx_mpdu_start);
1968 	DP_MON_FILTER_PRINT("wmask pcu_ppdu_setup_init: %d",
1969 			    tlv_filter->wmask.pcu_ppdu_setup_init);
1970 	DP_MON_FILTER_PRINT("wmask rxpcu_user_setup: %d",
1971 			    tlv_filter->wmask.rxpcu_user_setup);
1972 }
1973 
1974 void dp_mon_filter_show_rx_filter_be(enum dp_mon_filter_mode mode,
1975 				     struct dp_mon_filter_be *filter)
1976 {
1977 	DP_MON_FILTER_PRINT("RX MON RING TLV FILTER CONFIG:");
1978 	DP_MON_FILTER_PRINT("[Mode %d]: Valid: %d",
1979 			    mode, filter->rx_tlv_filter.valid);
1980 
1981 	if (filter->rx_tlv_filter.valid)
1982 		dp_rx_mon_filter_show_filter(filter);
1983 }
1984 
1985 void dp_mon_filter_show_tx_filter_be(enum dp_mon_filter_mode mode,
1986 				     struct dp_mon_filter_be *filter)
1987 {
1988 	dp_mon_filter_err("TX MON RING TLV FILTER CONFIG:");
1989 	dp_mon_filter_err("[Mode %d]: Valid: %d", mode, filter->tx_valid);
1990 
1991 	if (filter->tx_valid)
1992 		dp_tx_mon_filter_show_filter(filter);
1993 }
1994 
1995 #ifdef WDI_EVENT_ENABLE
1996 void dp_mon_filter_setup_rx_pkt_log_full_2_0(struct dp_pdev *pdev)
1997 {
1998 	struct dp_mon_filter_be filter = {0};
1999 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
2000 	enum dp_mon_filter_srng_type srng_type =
2001 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2002 	struct dp_mon_pdev *mon_pdev = NULL;
2003 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2004 	struct htt_rx_ring_tlv_filter *rx_tlv_filter =
2005 		&filter.rx_tlv_filter.tlv_filter;
2006 
2007 	if (!pdev) {
2008 		dp_mon_filter_err("pdev Context is null");
2009 		return;
2010 	}
2011 
2012 	mon_pdev = pdev->monitor_pdev;
2013 	if (!mon_pdev) {
2014 		dp_mon_filter_err("Monitor pdev context is null");
2015 		return;
2016 	}
2017 
2018 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2019 
2020 	/* Enabled the filter */
2021 	filter.rx_tlv_filter.valid = true;
2022 	dp_mon_filter_set_status_cmn(&mon_pdev_be->mon_pdev,
2023 				     &filter.rx_tlv_filter);
2024 
2025 	/* Setup the filter */
2026 	rx_tlv_filter->packet_header = 1;
2027 	rx_tlv_filter->msdu_start = 1;
2028 	rx_tlv_filter->msdu_end = 1;
2029 	rx_tlv_filter->mpdu_end = 1;
2030 
2031 	dp_mon_filter_show_rx_filter_be(mode, &filter);
2032 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2033 }
2034 
2035 void dp_mon_filter_reset_rx_pkt_log_full_2_0(struct dp_pdev *pdev)
2036 {
2037 	struct dp_mon_filter_be filter = {0};
2038 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
2039 	enum dp_mon_filter_srng_type srng_type =
2040 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2041 	struct dp_mon_pdev *mon_pdev = NULL;
2042 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2043 
2044 	if (!pdev) {
2045 		dp_mon_filter_err("pdev Context is null");
2046 		return;
2047 	}
2048 
2049 	mon_pdev = pdev->monitor_pdev;
2050 	if (!mon_pdev) {
2051 		dp_mon_filter_err("Monitor pdev context is null");
2052 		return;
2053 	}
2054 
2055 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2056 
2057 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2058 }
2059 
2060 void dp_mon_filter_setup_rx_pkt_log_lite_2_0(struct dp_pdev *pdev)
2061 {
2062 	struct dp_mon_filter_be filter = {0};
2063 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
2064 	enum dp_mon_filter_srng_type srng_type =
2065 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2066 	struct dp_mon_pdev *mon_pdev = NULL;
2067 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2068 
2069 	if (!pdev) {
2070 		dp_mon_filter_err("pdev Context is null");
2071 		return;
2072 	}
2073 
2074 	mon_pdev = pdev->monitor_pdev;
2075 	if (!mon_pdev) {
2076 		dp_mon_filter_err("Monitor pdev context is null");
2077 		return;
2078 	}
2079 
2080 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2081 
2082 	/* Enabled the filter */
2083 	filter.rx_tlv_filter.valid = true;
2084 	dp_mon_filter_set_status_cmn(&mon_pdev_be->mon_pdev,
2085 				     &filter.rx_tlv_filter);
2086 
2087 	dp_mon_filter_show_rx_filter_be(mode, &filter);
2088 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2089 }
2090 
2091 void dp_mon_filter_reset_rx_pkt_log_lite_2_0(struct dp_pdev *pdev)
2092 {
2093 	struct dp_mon_filter_be filter = {0};
2094 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
2095 	enum dp_mon_filter_srng_type srng_type =
2096 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2097 	struct dp_mon_pdev *mon_pdev = NULL;
2098 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2099 
2100 	if (!pdev) {
2101 		dp_mon_filter_err("pdev Context is null");
2102 		return;
2103 	}
2104 
2105 	mon_pdev = pdev->monitor_pdev;
2106 	if (!mon_pdev) {
2107 		dp_mon_filter_err("Monitor pdev context is null");
2108 		return;
2109 	}
2110 
2111 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2112 
2113 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2114 }
2115 
2116 #ifdef QCA_MONITOR_PKT_SUPPORT
2117 static void
2118 dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(struct dp_pdev_be *pdev_be,
2119 						struct dp_mon_filter_be *filter)
2120 {
2121 	struct dp_soc *soc = pdev_be->pdev.soc;
2122 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
2123 	enum dp_mon_filter_srng_type srng_type;
2124 	struct dp_mon_pdev *mon_pdev = pdev_be->pdev.monitor_pdev;
2125 	struct dp_mon_pdev_be *mon_pdev_be =
2126 			dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2127 	struct htt_rx_ring_tlv_filter *rx_tlv_filter =
2128 		&filter->rx_tlv_filter.tlv_filter;
2129 
2130 	srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
2131 		     DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
2132 		     DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
2133 
2134 	/*set the filter */
2135 	if (filter->rx_tlv_filter.valid) {
2136 		dp_mon_filter_set_cbf_cmn(&pdev_be->pdev,
2137 					  &filter->rx_tlv_filter);
2138 
2139 		rx_tlv_filter->attention = 0;
2140 		dp_mon_filter_show_rx_filter_be(mode, filter);
2141 		mon_pdev_be->filter_be[mode][srng_type] = *filter;
2142 	} else /* reset the filter */
2143 		mon_pdev_be->filter_be[mode][srng_type] = *filter;
2144 }
2145 #else
2146 static void
2147 dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(struct dp_pdev_be *pdev,
2148 						struct dp_mon_filter_be *filter)
2149 {
2150 }
2151 #endif
2152 
2153 void dp_mon_filter_setup_rx_pkt_log_cbf_2_0(struct dp_pdev *pdev)
2154 {
2155 	struct dp_mon_filter_be filter = {0};
2156 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
2157 	enum dp_mon_filter_srng_type srng_type =
2158 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2159 	struct dp_mon_pdev *mon_pdev = NULL;
2160 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2161 	struct dp_pdev_be *pdev_be = NULL;
2162 
2163 	if (!pdev) {
2164 		dp_mon_filter_err("pdev Context is null");
2165 		return;
2166 	}
2167 
2168 	mon_pdev = pdev->monitor_pdev;
2169 	if (!mon_pdev) {
2170 		dp_mon_filter_err("Monitor pdev context is null");
2171 		return;
2172 	}
2173 
2174 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2175 
2176 	pdev_be = dp_get_be_pdev_from_dp_pdev(pdev);
2177 
2178 	/* Enabled the filter */
2179 	filter.rx_tlv_filter.valid = true;
2180 
2181 	dp_mon_filter_set_status_cbf(pdev, &filter.rx_tlv_filter);
2182 	dp_mon_filter_show_rx_filter_be(mode, &filter);
2183 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2184 
2185 	/* Clear the filter as the same filter will be used to set the
2186 	 * monitor status ring
2187 	 */
2188 	qdf_mem_zero(&filter, sizeof(struct dp_mon_filter_be));
2189 
2190 	filter.rx_tlv_filter.valid = true;
2191 	dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(pdev_be, &filter);
2192 }
2193 
2194 void dp_mon_filter_reset_rx_pktlog_cbf_2_0(struct dp_pdev *pdev)
2195 {
2196 	struct dp_mon_filter_be filter = {0};
2197 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
2198 	enum dp_mon_filter_srng_type srng_type =
2199 		DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF;
2200 	struct dp_mon_pdev *mon_pdev = NULL;
2201 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2202 	struct dp_pdev_be *pdev_be = NULL;
2203 
2204 	if (!pdev) {
2205 		QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR,
2206 			  FL("pdev Context is null"));
2207 		return;
2208 	}
2209 
2210 	mon_pdev = pdev->monitor_pdev;
2211 	if (!mon_pdev) {
2212 		dp_mon_filter_err("Monitor pdev context is null");
2213 		return;
2214 	}
2215 
2216 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2217 
2218 	pdev_be = dp_get_be_pdev_from_dp_pdev(pdev);
2219 
2220 	/* Enabled the filter */
2221 	filter.rx_tlv_filter.valid = true;
2222 
2223 	dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(pdev_be, &filter);
2224 
2225 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2226 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2227 }
2228 
2229 void dp_mon_filter_setup_pktlog_hybrid_2_0(struct dp_pdev *pdev)
2230 {
2231 	struct dp_mon_filter_be filter = {0};
2232 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_HYBRID_MODE;
2233 	enum dp_mon_filter_srng_type srng_type =
2234 		DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
2235 	struct htt_tx_ring_tlv_filter *tlv_filter = &filter.tx_tlv_filter;
2236 	struct dp_mon_pdev *mon_pdev = NULL;
2237 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2238 
2239 	if (!pdev) {
2240 		dp_mon_filter_err("pdev Context is null");
2241 		return;
2242 	}
2243 
2244 	mon_pdev = pdev->monitor_pdev;
2245 	if (!mon_pdev) {
2246 		dp_mon_filter_err("Monitor pdev context is null");
2247 		return;
2248 	}
2249 
2250 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2251 
2252 	/* Enabled the filter */
2253 	filter.tx_valid = true;
2254 
2255 	/* Setup the filter */
2256 	tlv_filter->utlvs.tx_fes_status_start = 1;
2257 	tlv_filter->utlvs.tx_fes_status_start_prot = 1;
2258 	tlv_filter->utlvs.tx_fes_status_prot = 1;
2259 	tlv_filter->utlvs.tx_fes_status_start_ppdu = 1;
2260 	tlv_filter->utlvs.tx_fes_status_user_ppdu = 1;
2261 	tlv_filter->utlvs.tx_fes_status_ack_or_ba = 1;
2262 	tlv_filter->utlvs.tx_fes_status_1k_ba = 1;
2263 	tlv_filter->utlvs.tx_fes_status_user_response = 1;
2264 	tlv_filter->utlvs.tx_fes_status_end = 1;
2265 	tlv_filter->utlvs.response_start_status = 1;
2266 	tlv_filter->utlvs.received_response_info = 1;
2267 	tlv_filter->utlvs.received_response_info_p2 = 1;
2268 	tlv_filter->utlvs.response_end_status = 1;
2269 
2270 	tlv_filter->mgmt_filter = 0x1;
2271 	tlv_filter->data_filter = 0x1;
2272 	tlv_filter->ctrl_filter = 0x1;
2273 
2274 	tlv_filter->mgmt_mpdu_end = 1;
2275 	tlv_filter->mgmt_msdu_end = 1;
2276 	tlv_filter->mgmt_msdu_start = 1;
2277 	tlv_filter->mgmt_mpdu_start = 1;
2278 	tlv_filter->ctrl_mpdu_end = 1;
2279 	tlv_filter->ctrl_msdu_end = 1;
2280 	tlv_filter->ctrl_msdu_start = 1;
2281 	tlv_filter->ctrl_mpdu_start = 1;
2282 	tlv_filter->data_mpdu_end = 1;
2283 	tlv_filter->data_msdu_end = 1;
2284 	tlv_filter->data_msdu_start = 1;
2285 	tlv_filter->data_mpdu_start = 1;
2286 	tlv_filter->mgmt_mpdu_log = 1;
2287 	tlv_filter->ctrl_mpdu_log = 1;
2288 	tlv_filter->data_mpdu_log = 1;
2289 
2290 	tlv_filter->mgmt_dma_length = mon_pdev_be->tx_mon_filter_length;
2291 	tlv_filter->ctrl_dma_length = mon_pdev_be->tx_mon_filter_length;
2292 	tlv_filter->data_dma_length = mon_pdev_be->tx_mon_filter_length;
2293 	dp_mon_filter_show_tx_filter_be(mode, &filter);
2294 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2295 }
2296 
2297 void dp_mon_filter_reset_pktlog_hybrid_2_0(struct dp_pdev *pdev)
2298 {
2299 	struct dp_mon_filter_be filter = {0};
2300 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_HYBRID_MODE;
2301 	enum dp_mon_filter_srng_type srng_type =
2302 		DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
2303 	struct dp_mon_pdev *mon_pdev = NULL;
2304 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
2305 
2306 	if (!pdev) {
2307 		dp_mon_filter_err("pdev Context is null");
2308 		return;
2309 	}
2310 
2311 	mon_pdev = pdev->monitor_pdev;
2312 	if (!mon_pdev) {
2313 		dp_mon_filter_err("Monitor pdev context is null");
2314 		return;
2315 	}
2316 
2317 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2318 
2319 	mon_pdev_be->filter_be[mode][srng_type] = filter;
2320 }
2321 #endif /* WDI_EVENT_ENABLE */
2322 
2323 /**
2324  * dp_rx_mon_filter_h2t_setup() - Setup the filter for the Target setup
2325  * @soc: DP soc handle
2326  * @pdev: DP pdev handle
2327  * @srng_type: The srng type for which filter will be set
2328  * @filter: tlv filter
2329  */
2330 static void
2331 dp_rx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
2332 			   enum dp_mon_filter_srng_type srng_type,
2333 			   struct dp_mon_filter *filter)
2334 {
2335 	int32_t current_mode = 0;
2336 	struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter;
2337 	struct htt_rx_ring_tlv_filter *src_tlv_filter;
2338 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
2339 	struct dp_mon_pdev_be *mon_pdev_be =
2340 		dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2341 	struct dp_mon_filter_be *mon_filter;
2342 	uint32_t src_filter = 0, dst_filter = 0;
2343 
2344 	/*
2345 	 * Loop through all the modes.
2346 	 */
2347 	for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
2348 	     current_mode++) {
2349 		mon_filter =
2350 			&mon_pdev_be->filter_be[current_mode][srng_type];
2351 		src_tlv_filter = &mon_filter->rx_tlv_filter.tlv_filter;
2352 
2353 		/*
2354 		 * Check if the correct mode is enabled or not.
2355 		 */
2356 		if (!mon_filter->rx_tlv_filter.valid)
2357 			continue;
2358 
2359 		filter->valid = true;
2360 
2361 		/*
2362 		 * Set the super bit fields
2363 		 */
2364 		src_filter =
2365 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2366 					  FILTER_TLV);
2367 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV);
2368 		dst_filter |= src_filter;
2369 		DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter);
2370 
2371 		/*
2372 		 * Set the filter management filter.
2373 		 */
2374 		src_filter =
2375 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2376 					  FILTER_FP_MGMT);
2377 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT);
2378 		dst_filter |= src_filter;
2379 		DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter);
2380 
2381 		/*
2382 		 * Set the monitor other management filter.
2383 		 */
2384 		src_filter =
2385 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2386 					  FILTER_MO_MGMT);
2387 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT);
2388 		dst_filter |= src_filter;
2389 		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter);
2390 
2391 		/*
2392 		 * Set the filter pass control filter.
2393 		 */
2394 		src_filter =
2395 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2396 					  FILTER_FP_CTRL);
2397 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL);
2398 		dst_filter |= src_filter;
2399 		DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter);
2400 
2401 		/*
2402 		 * Set the monitor other control filter.
2403 		 */
2404 		src_filter =
2405 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2406 					  FILTER_MO_CTRL);
2407 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL);
2408 		dst_filter |= src_filter;
2409 		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter);
2410 
2411 		/*
2412 		 * Set the filter pass data filter.
2413 		 */
2414 		src_filter =
2415 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2416 					  FILTER_FP_DATA);
2417 		dst_filter = DP_MON_FILTER_GET(tlv_filter,
2418 					       FILTER_FP_DATA);
2419 		dst_filter |= src_filter;
2420 		DP_MON_FILTER_SET(tlv_filter, FILTER_FP_DATA, dst_filter);
2421 
2422 		/*
2423 		 * Set the monitor other data filter.
2424 		 */
2425 		src_filter =
2426 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2427 					  FILTER_MO_DATA);
2428 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA);
2429 		dst_filter |= src_filter;
2430 		DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter);
2431 
2432 		/*
2433 		 * Set the monitor direct data filter.
2434 		 */
2435 		src_filter =
2436 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2437 					  FILTER_MD_DATA);
2438 		dst_filter = DP_MON_FILTER_GET(tlv_filter,
2439 					       FILTER_MD_DATA);
2440 		dst_filter |= src_filter;
2441 		DP_MON_FILTER_SET(tlv_filter,
2442 				  FILTER_MD_DATA, dst_filter);
2443 
2444 		/*
2445 		 * Set the monitor direct management filter.
2446 		 */
2447 		src_filter =
2448 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2449 					  FILTER_MD_MGMT);
2450 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT);
2451 		dst_filter |= src_filter;
2452 		DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter);
2453 
2454 		/*
2455 		 * Set the monitor direct management filter.
2456 		 */
2457 		src_filter =
2458 			DP_MON_FILTER_GET(&mon_filter->rx_tlv_filter.tlv_filter,
2459 					  FILTER_MD_CTRL);
2460 		dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL);
2461 		dst_filter |= src_filter;
2462 		DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter);
2463 
2464 		/*
2465 		 * set the dma length for type mgmt
2466 		 */
2467 		if (src_tlv_filter->mgmt_dma_length &&
2468 		    !tlv_filter->mgmt_dma_length)
2469 			tlv_filter->mgmt_dma_length =
2470 				src_tlv_filter->mgmt_dma_length;
2471 
2472 		/*
2473 		 * set the dma length for type ctrl
2474 		 */
2475 		if (src_tlv_filter->ctrl_dma_length &&
2476 		    !tlv_filter->ctrl_dma_length)
2477 			tlv_filter->ctrl_dma_length =
2478 				src_tlv_filter->ctrl_dma_length;
2479 
2480 		/*
2481 		 * set the dma length for type data
2482 		 */
2483 		if (src_tlv_filter->data_dma_length &&
2484 		    !tlv_filter->data_dma_length)
2485 			tlv_filter->data_dma_length =
2486 				src_tlv_filter->data_dma_length;
2487 
2488 		/*
2489 		 * set mpdu logging for type mgmt
2490 		 */
2491 		if (src_tlv_filter->mgmt_mpdu_log &&
2492 		    !tlv_filter->mgmt_mpdu_log)
2493 			tlv_filter->mgmt_mpdu_log =
2494 				src_tlv_filter->mgmt_mpdu_log;
2495 
2496 		/*
2497 		 * set mpdu logging for type ctrl
2498 		 */
2499 		if (src_tlv_filter->ctrl_mpdu_log &&
2500 		    !tlv_filter->ctrl_mpdu_log)
2501 			tlv_filter->ctrl_mpdu_log =
2502 				src_tlv_filter->ctrl_mpdu_log;
2503 
2504 		/*
2505 		 * set mpdu logging for type data
2506 		 */
2507 		if (src_tlv_filter->data_mpdu_log &&
2508 		    !tlv_filter->data_mpdu_log)
2509 			tlv_filter->data_mpdu_log =
2510 				src_tlv_filter->data_mpdu_log;
2511 
2512 		/*
2513 		 * set hdr tlv length
2514 		 */
2515 		if (src_tlv_filter->rx_hdr_length &&
2516 		    !tlv_filter->rx_hdr_length)
2517 			tlv_filter->rx_hdr_length =
2518 				src_tlv_filter->rx_hdr_length;
2519 
2520 		if (src_tlv_filter->rx_pkt_tlv_offset &&
2521 		    !tlv_filter->rx_pkt_tlv_offset)
2522 			tlv_filter->rx_pkt_tlv_offset =
2523 				src_tlv_filter->rx_pkt_tlv_offset;
2524 
2525 		/*
2526 		 * set fpmo filter settings
2527 		 */
2528 		if (src_tlv_filter->enable_fpmo &&
2529 		    !tlv_filter->enable_fpmo) {
2530 			tlv_filter->enable_fpmo =
2531 				src_tlv_filter->enable_fpmo;
2532 			tlv_filter->fpmo_data_filter =
2533 				src_tlv_filter->fpmo_data_filter;
2534 			tlv_filter->fpmo_mgmt_filter =
2535 				src_tlv_filter->fpmo_mgmt_filter;
2536 			tlv_filter->fpmo_ctrl_filter =
2537 				src_tlv_filter->fpmo_ctrl_filter;
2538 		}
2539 
2540 		dp_mon_filter_show_rx_filter_be(current_mode, mon_filter);
2541 	}
2542 }
2543 
2544 static
2545 void dp_tx_mon_downstream_tlv_set(struct htt_tx_ring_tlv_filter *dst_filter,
2546 				  struct htt_tx_ring_tlv_filter *src_filter)
2547 {
2548 	dst_filter->dtlvs.tx_fes_setup |=
2549 		src_filter->dtlvs.tx_fes_setup;
2550 	dst_filter->dtlvs.tx_peer_entry |=
2551 		src_filter->dtlvs.tx_peer_entry;
2552 	dst_filter->dtlvs.tx_queue_extension |=
2553 		src_filter->dtlvs.tx_queue_extension;
2554 	dst_filter->dtlvs.tx_last_mpdu_end |=
2555 		src_filter->dtlvs.tx_last_mpdu_end;
2556 	dst_filter->dtlvs.tx_last_mpdu_fetched |=
2557 		src_filter->dtlvs.tx_last_mpdu_fetched;
2558 	dst_filter->dtlvs.tx_data_sync |=
2559 		src_filter->dtlvs.tx_data_sync;
2560 	dst_filter->dtlvs.pcu_ppdu_setup_init |=
2561 		src_filter->dtlvs.pcu_ppdu_setup_init;
2562 	dst_filter->dtlvs.fw2s_mon |=
2563 		src_filter->dtlvs.fw2s_mon;
2564 	dst_filter->dtlvs.tx_loopback_setup |=
2565 		src_filter->dtlvs.tx_loopback_setup;
2566 	dst_filter->dtlvs.sch_critical_tlv_ref |=
2567 		src_filter->dtlvs.sch_critical_tlv_ref;
2568 	dst_filter->dtlvs.ndp_preamble_done |=
2569 		src_filter->dtlvs.ndp_preamble_done;
2570 	dst_filter->dtlvs.tx_raw_frame_setup |=
2571 		src_filter->dtlvs.tx_raw_frame_setup;
2572 	dst_filter->dtlvs.txpcu_user_setup |=
2573 		src_filter->dtlvs.txpcu_user_setup;
2574 	dst_filter->dtlvs.rxpcu_setup |=
2575 		src_filter->dtlvs.rxpcu_setup;
2576 	dst_filter->dtlvs.rxpcu_setup_complete |=
2577 		src_filter->dtlvs.rxpcu_setup_complete;
2578 	dst_filter->dtlvs.coex_tx_req |=
2579 		src_filter->dtlvs.coex_tx_req;
2580 	dst_filter->dtlvs.rxpcu_user_setup |=
2581 		src_filter->dtlvs.rxpcu_user_setup;
2582 	dst_filter->dtlvs.rxpcu_user_setup_ext |=
2583 		src_filter->dtlvs.rxpcu_user_setup_ext;
2584 	dst_filter->dtlvs.wur_data |= src_filter->dtlvs.wur_data;
2585 	dst_filter->dtlvs.tqm_mpdu_global_start |=
2586 		src_filter->dtlvs.tqm_mpdu_global_start;
2587 	dst_filter->dtlvs.tx_fes_setup_complete |=
2588 		src_filter->dtlvs.tx_fes_setup_complete;
2589 	dst_filter->dtlvs.scheduler_end |= src_filter->dtlvs.scheduler_end;
2590 	dst_filter->dtlvs.sch_wait_instr_tx_path |=
2591 		src_filter->dtlvs.sch_wait_instr_tx_path;
2592 }
2593 
2594 static
2595 void dp_tx_mon_upstream_tlv_set(struct htt_tx_ring_tlv_filter *dst_filter,
2596 				struct htt_tx_ring_tlv_filter *src_filter)
2597 {
2598 	dst_filter->utlvs.rx_response_required_info |=
2599 		src_filter->utlvs.rx_response_required_info;
2600 	dst_filter->utlvs.response_start_status |=
2601 		src_filter->utlvs.response_start_status;
2602 	dst_filter->utlvs.response_end_status |=
2603 		src_filter->utlvs.response_end_status;
2604 	dst_filter->utlvs.tx_fes_status_start |=
2605 		src_filter->utlvs.tx_fes_status_start;
2606 	dst_filter->utlvs.tx_fes_status_end |=
2607 		src_filter->utlvs.tx_fes_status_end;
2608 	dst_filter->utlvs.tx_fes_status_start_ppdu |=
2609 		src_filter->utlvs.tx_fes_status_start_ppdu;
2610 	dst_filter->utlvs.tx_fes_status_user_ppdu |=
2611 		src_filter->utlvs.tx_fes_status_user_ppdu;
2612 	dst_filter->utlvs.tx_fes_status_ack_or_ba |=
2613 		src_filter->utlvs.tx_fes_status_ack_or_ba;
2614 	dst_filter->utlvs.tx_fes_status_1k_ba |=
2615 		src_filter->utlvs.tx_fes_status_1k_ba;
2616 	dst_filter->utlvs.tx_fes_status_start_prot |=
2617 		src_filter->utlvs.tx_fes_status_start_prot;
2618 	dst_filter->utlvs.tx_fes_status_prot |=
2619 		src_filter->utlvs.tx_fes_status_prot;
2620 	dst_filter->utlvs.tx_fes_status_user_response |=
2621 		src_filter->utlvs.tx_fes_status_user_response;
2622 	dst_filter->utlvs.rx_frame_bitmap_ack |=
2623 		src_filter->utlvs.rx_frame_bitmap_ack;
2624 	dst_filter->utlvs.rx_frame_1k_bitmap_ack |=
2625 		src_filter->utlvs.rx_frame_1k_bitmap_ack;
2626 	dst_filter->utlvs.coex_tx_status |=
2627 		src_filter->utlvs.coex_tx_status;
2628 	dst_filter->utlvs.received_response_info |=
2629 		src_filter->utlvs.received_response_info;
2630 	dst_filter->utlvs.received_response_info_p2 |=
2631 		src_filter->utlvs.received_response_info_p2;
2632 	dst_filter->utlvs.ofdma_trigger_details |=
2633 		src_filter->utlvs.ofdma_trigger_details;
2634 	dst_filter->utlvs.received_trigger_info |=
2635 		src_filter->utlvs.received_trigger_info;
2636 	dst_filter->utlvs.pdg_tx_request |=
2637 		src_filter->utlvs.pdg_tx_request;
2638 	dst_filter->utlvs.pdg_response |=
2639 		src_filter->utlvs.pdg_response;
2640 	dst_filter->utlvs.pdg_trig_response |=
2641 		src_filter->utlvs.pdg_trig_response;
2642 	dst_filter->utlvs.trigger_response_tx_done |=
2643 		src_filter->utlvs.trigger_response_tx_done;
2644 	dst_filter->utlvs.prot_tx_end |=
2645 		src_filter->utlvs.prot_tx_end;
2646 	dst_filter->utlvs.ppdu_tx_end |=
2647 		src_filter->utlvs.ppdu_tx_end;
2648 	dst_filter->utlvs.r2r_status_end |=
2649 		src_filter->utlvs.r2r_status_end;
2650 	dst_filter->utlvs.flush_req |=
2651 		src_filter->utlvs.flush_req;
2652 	dst_filter->utlvs.mactx_phy_desc |=
2653 		src_filter->utlvs.mactx_phy_desc;
2654 	dst_filter->utlvs.mactx_user_desc_cmn |=
2655 		src_filter->utlvs.mactx_user_desc_cmn;
2656 	dst_filter->utlvs.mactx_user_desc_per_usr |=
2657 		src_filter->utlvs.mactx_user_desc_per_usr;
2658 
2659 	dst_filter->utlvs.tqm_acked_1k_mpdu |=
2660 		src_filter->utlvs.tqm_acked_1k_mpdu;
2661 	dst_filter->utlvs.tqm_acked_mpdu |=
2662 		src_filter->utlvs.tqm_acked_mpdu;
2663 	dst_filter->utlvs.tqm_update_tx_mpdu_count |=
2664 		src_filter->utlvs.tqm_update_tx_mpdu_count;
2665 	dst_filter->utlvs.phytx_ppdu_header_info_request |=
2666 		src_filter->utlvs.phytx_ppdu_header_info_request;
2667 	dst_filter->utlvs.u_sig_eht_su_mu |=
2668 		src_filter->utlvs.u_sig_eht_su_mu;
2669 	dst_filter->utlvs.u_sig_eht_su |=
2670 		src_filter->utlvs.u_sig_eht_su;
2671 	dst_filter->utlvs.u_sig_eht_tb |=
2672 		src_filter->utlvs.u_sig_eht_tb;
2673 	dst_filter->utlvs.eht_sig_usr_su |=
2674 		src_filter->utlvs.eht_sig_usr_su;
2675 	dst_filter->utlvs.eht_sig_usr_mu_mimo |=
2676 		src_filter->utlvs.eht_sig_usr_mu_mimo;
2677 	dst_filter->utlvs.eht_sig_usr_ofdma |=
2678 		src_filter->utlvs.eht_sig_usr_ofdma;
2679 	dst_filter->utlvs.he_sig_a_su |=
2680 		src_filter->utlvs.he_sig_a_su;
2681 	dst_filter->utlvs.he_sig_a_mu_dl |=
2682 		src_filter->utlvs.he_sig_a_mu_dl;
2683 	dst_filter->utlvs.he_sig_a_mu_ul |=
2684 		src_filter->utlvs.he_sig_a_mu_ul;
2685 	dst_filter->utlvs.he_sig_b1_mu |=
2686 		src_filter->utlvs.he_sig_b1_mu;
2687 	dst_filter->utlvs.he_sig_b2_mu |=
2688 		src_filter->utlvs.he_sig_b2_mu;
2689 	dst_filter->utlvs.he_sig_b2_ofdma |=
2690 		src_filter->utlvs.he_sig_b2_ofdma;
2691 	dst_filter->utlvs.vht_sig_b_mu160 |=
2692 		src_filter->utlvs.vht_sig_b_mu160;
2693 	dst_filter->utlvs.vht_sig_b_mu80 |=
2694 		src_filter->utlvs.vht_sig_b_mu80;
2695 	dst_filter->utlvs.vht_sig_b_mu40 |=
2696 		src_filter->utlvs.vht_sig_b_mu40;
2697 	dst_filter->utlvs.vht_sig_b_mu20 |=
2698 		src_filter->utlvs.vht_sig_b_mu20;
2699 	dst_filter->utlvs.vht_sig_b_su160 |=
2700 		src_filter->utlvs.vht_sig_b_su160;
2701 	dst_filter->utlvs.vht_sig_b_su80 |=
2702 		src_filter->utlvs.vht_sig_b_su80;
2703 	dst_filter->utlvs.vht_sig_b_su40 |=
2704 		src_filter->utlvs.vht_sig_b_su40;
2705 	dst_filter->utlvs.vht_sig_b_su20 |=
2706 		src_filter->utlvs.vht_sig_b_su20;
2707 	dst_filter->utlvs.vht_sig_a |=
2708 		src_filter->utlvs.vht_sig_a;
2709 	dst_filter->utlvs.ht_sig |=
2710 		src_filter->utlvs.ht_sig;
2711 	dst_filter->utlvs.l_sig_b |=
2712 		src_filter->utlvs.l_sig_b;
2713 	dst_filter->utlvs.l_sig_a |=
2714 		src_filter->utlvs.l_sig_a;
2715 	dst_filter->utlvs.tx_service |=
2716 		src_filter->utlvs.tx_service;
2717 
2718 	dst_filter->utlvs.txpcu_buf_status |=
2719 		src_filter->utlvs.txpcu_buf_status;
2720 	dst_filter->utlvs.txpcu_user_buf_status |=
2721 		src_filter->utlvs.txpcu_user_buf_status;
2722 	dst_filter->utlvs.txdma_stop_request |=
2723 		src_filter->utlvs.txdma_stop_request;
2724 	dst_filter->utlvs.expected_response |=
2725 		src_filter->utlvs.expected_response;
2726 	dst_filter->utlvs.tx_mpdu_count_transfer_end |=
2727 		src_filter->utlvs.tx_mpdu_count_transfer_end;
2728 	dst_filter->utlvs.rx_trig_info |=
2729 		src_filter->utlvs.rx_trig_info;
2730 	dst_filter->utlvs.rxpcu_tx_setup_clear |=
2731 		src_filter->utlvs.rxpcu_tx_setup_clear;
2732 	dst_filter->utlvs.rx_frame_bitmap_req |=
2733 		src_filter->utlvs.rx_frame_bitmap_req;
2734 	dst_filter->utlvs.rx_phy_sleep |=
2735 		src_filter->utlvs.rx_phy_sleep;
2736 	dst_filter->utlvs.txpcu_preamble_done |=
2737 		src_filter->utlvs.txpcu_preamble_done;
2738 	dst_filter->utlvs.txpcu_phytx_debug32 |=
2739 		src_filter->utlvs.txpcu_phytx_debug32;
2740 	dst_filter->utlvs.txpcu_phytx_other_transmit_info32 |=
2741 		src_filter->utlvs.txpcu_phytx_other_transmit_info32;
2742 	dst_filter->utlvs.rx_ppdu_noack_report |=
2743 		src_filter->utlvs.rx_ppdu_noack_report;
2744 	dst_filter->utlvs.rx_ppdu_ack_report |=
2745 		src_filter->utlvs.rx_ppdu_ack_report;
2746 	dst_filter->utlvs.coex_rx_status |=
2747 		src_filter->utlvs.coex_rx_status;
2748 	dst_filter->utlvs.rx_start_param |=
2749 		src_filter->utlvs.rx_start_param;
2750 	dst_filter->utlvs.tx_cbf_info |=
2751 		src_filter->utlvs.tx_cbf_info;
2752 	dst_filter->utlvs.rxpcu_early_rx_indication |=
2753 		src_filter->utlvs.rxpcu_early_rx_indication;
2754 	dst_filter->utlvs.received_response_user_7_0 |=
2755 		src_filter->utlvs.received_response_user_7_0;
2756 	dst_filter->utlvs.received_response_user_15_8 |=
2757 		src_filter->utlvs.received_response_user_15_8;
2758 	dst_filter->utlvs.received_response_user_23_16 |=
2759 		src_filter->utlvs.received_response_user_23_16;
2760 	dst_filter->utlvs.received_response_user_31_24 |=
2761 		src_filter->utlvs.received_response_user_31_24;
2762 	dst_filter->utlvs.received_response_user_36_32 |=
2763 		src_filter->utlvs.received_response_user_36_32;
2764 	dst_filter->utlvs.rx_pm_info |=
2765 		src_filter->utlvs.rx_pm_info;
2766 	dst_filter->utlvs.rx_preamble |=
2767 		src_filter->utlvs.rx_preamble;
2768 	dst_filter->utlvs.others |=
2769 		src_filter->utlvs.others;
2770 	dst_filter->utlvs.mactx_pre_phy_desc |=
2771 		src_filter->utlvs.mactx_pre_phy_desc;
2772 }
2773 
2774 static
2775 void dp_tx_mon_wordmask_config_set(struct htt_tx_ring_tlv_filter *dst_filter,
2776 				   struct htt_tx_ring_tlv_filter *src_filter)
2777 {
2778 	dst_filter->wmask.tx_fes_setup |=
2779 		src_filter->wmask.tx_fes_setup;
2780 	dst_filter->wmask.tx_peer_entry |=
2781 		src_filter->wmask.tx_peer_entry;
2782 	dst_filter->wmask.tx_queue_ext |=
2783 		src_filter->wmask.tx_queue_ext;
2784 	dst_filter->wmask.tx_msdu_start |=
2785 		src_filter->wmask.tx_msdu_start;
2786 	dst_filter->wmask.tx_mpdu_start |=
2787 		src_filter->wmask.tx_mpdu_start;
2788 	dst_filter->wmask.pcu_ppdu_setup_init |=
2789 		src_filter->wmask.pcu_ppdu_setup_init;
2790 	dst_filter->wmask.rxpcu_user_setup |=
2791 		src_filter->wmask.rxpcu_user_setup;
2792 }
2793 
2794 /**
2795  * dp_tx_mon_filter_h2t_setup() - Setup the filter
2796  * @soc: DP soc handle
2797  * @pdev: DP pdev handle
2798  * @srng_type: The srng type for which filter will be set
2799  * @filter: tlv filter
2800  */
2801 static
2802 void dp_tx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev,
2803 				enum dp_mon_filter_srng_type srng_type,
2804 				struct dp_mon_filter_be *filter)
2805 {
2806 	int32_t current_mode = 0;
2807 	struct htt_tx_ring_tlv_filter *dst_filter = &filter->tx_tlv_filter;
2808 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
2809 	struct dp_mon_pdev_be *mon_pdev_be =
2810 		dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
2811 
2812 	/*
2813 	 * Loop through all the modes.
2814 	 */
2815 	for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE;
2816 	     current_mode++) {
2817 		struct dp_mon_filter_be *mon_filter =
2818 			&mon_pdev_be->filter_be[current_mode][srng_type];
2819 		struct htt_tx_ring_tlv_filter *src_filter =
2820 			&mon_filter->tx_tlv_filter;
2821 
2822 		/*
2823 		 * Check if the correct mode is enabled or not.
2824 		 */
2825 		if (!mon_filter->tx_valid)
2826 			continue;
2827 
2828 		dst_filter->enable = 1;
2829 
2830 		dp_tx_mon_downstream_tlv_set(dst_filter, src_filter);
2831 		dp_tx_mon_upstream_tlv_set(dst_filter, src_filter);
2832 		dp_tx_mon_wordmask_config_set(dst_filter, src_filter);
2833 
2834 		dst_filter->mgmt_filter |= src_filter->mgmt_filter;
2835 		dst_filter->data_filter |= src_filter->data_filter;
2836 		dst_filter->ctrl_filter |= src_filter->ctrl_filter;
2837 		dst_filter->mgmt_dma_length |= src_filter->mgmt_dma_length;
2838 		dst_filter->ctrl_dma_length |= src_filter->ctrl_dma_length;
2839 		dst_filter->data_dma_length |= src_filter->data_dma_length;
2840 		dst_filter->mgmt_mpdu_end |= src_filter->mgmt_mpdu_end;
2841 		dst_filter->mgmt_msdu_end |= src_filter->mgmt_msdu_end;
2842 		dst_filter->mgmt_msdu_start |= src_filter->mgmt_msdu_start;
2843 		dst_filter->mgmt_mpdu_start |= src_filter->mgmt_mpdu_start;
2844 		dst_filter->ctrl_mpdu_end |= src_filter->mgmt_mpdu_end;
2845 		dst_filter->ctrl_msdu_end |= src_filter->mgmt_msdu_end;
2846 		dst_filter->ctrl_msdu_start |= src_filter->mgmt_msdu_start;
2847 		dst_filter->ctrl_mpdu_start |= src_filter->mgmt_mpdu_start;
2848 		dst_filter->data_mpdu_end |= src_filter->mgmt_mpdu_end;
2849 		dst_filter->data_msdu_end |= src_filter->mgmt_msdu_end;
2850 		dst_filter->data_msdu_start |= src_filter->mgmt_msdu_start;
2851 		dst_filter->data_mpdu_start |= src_filter->mgmt_mpdu_start;
2852 		dst_filter->mgmt_mpdu_log |= src_filter->mgmt_mpdu_log;
2853 		dst_filter->ctrl_mpdu_log |= src_filter->ctrl_mpdu_log;
2854 		dst_filter->data_mpdu_log |= src_filter->data_mpdu_log;
2855 	}
2856 	DP_MON_FILTER_PRINT("TXMON FINAL FILTER CONFIG:");
2857 	dp_tx_mon_filter_show_filter(filter);
2858 }
2859 
2860 static QDF_STATUS
2861 dp_tx_mon_ht2_ring_cfg(struct dp_soc *soc,
2862 		       struct dp_pdev *pdev,
2863 		       enum dp_mon_filter_srng_type srng_type,
2864 		       struct htt_tx_ring_tlv_filter *tlv_filter)
2865 {
2866 	int mac_id;
2867 	int max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx);
2868 	QDF_STATUS status = QDF_STATUS_SUCCESS;
2869 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2870 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
2871 
2872 	dp_mon_filter_info("%pK: srng type %d Max_mac_rings %d ",
2873 			   soc, srng_type, max_mac_rings);
2874 
2875 	for (mac_id = 0; mac_id < max_mac_rings; mac_id++) {
2876 		int mac_for_pdev =
2877 			dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id);
2878 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id);
2879 		int hal_ring_type, ring_buf_size;
2880 		hal_ring_handle_t hal_ring_hdl;
2881 
2882 		hal_ring_hdl =
2883 			mon_soc_be->tx_mon_dst_ring[lmac_id].hal_srng;
2884 		hal_ring_type = TX_MONITOR_DST;
2885 		ring_buf_size = 2048;
2886 
2887 		status = htt_h2t_tx_ring_cfg(soc->htt_handle, mac_for_pdev,
2888 					     hal_ring_hdl, hal_ring_type,
2889 					     ring_buf_size,
2890 					     tlv_filter);
2891 		if (status != QDF_STATUS_SUCCESS)
2892 			return status;
2893 	}
2894 
2895 	return status;
2896 }
2897 
2898 QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev)
2899 {
2900 	struct dp_soc *soc;
2901 	struct dp_mon_filter_be filter = {0};
2902 	enum dp_mon_filter_srng_type srng_type =
2903 				DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
2904 
2905 	if (!pdev) {
2906 		dp_mon_filter_err("pdev Context is null");
2907 		return QDF_STATUS_E_FAILURE;
2908 	}
2909 
2910 	soc = pdev->soc;
2911 	if (!soc) {
2912 		dp_mon_filter_err("soc Context is null");
2913 		return QDF_STATUS_E_FAILURE;
2914 	}
2915 
2916 	dp_tx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter);
2917 	dp_tx_mon_ht2_ring_cfg(soc, pdev, srng_type,
2918 			       &filter.tx_tlv_filter);
2919 
2920 	return QDF_STATUS_SUCCESS;
2921 }
2922 
2923 QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev)
2924 {
2925 	struct dp_soc *soc;
2926 	struct dp_mon_filter_be filter = {0};
2927 	struct htt_rx_ring_tlv_filter *rx_tlv_filter;
2928 	enum dp_mon_filter_srng_type srng_type =
2929 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2930 
2931 	if (!pdev) {
2932 		dp_mon_filter_err("pdev Context is null");
2933 		return QDF_STATUS_E_FAILURE;
2934 	}
2935 	soc = pdev->soc;
2936 
2937 	rx_tlv_filter = &filter.rx_tlv_filter.tlv_filter;
2938 	dp_rx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter);
2939 	if (filter.rx_tlv_filter.valid)
2940 		rx_tlv_filter->enable = 1;
2941 	else
2942 		rx_tlv_filter->enable = 0;
2943 
2944 	dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type,
2945 			       &filter.rx_tlv_filter.tlv_filter);
2946 	return QDF_STATUS_SUCCESS;
2947 }
2948 
2949 #ifdef QCA_SUPPORT_LITE_MONITOR
2950 void
2951 dp_mon_filter_reset_rx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
2952 {
2953 	struct dp_mon_filter_be filter = {0};
2954 	enum dp_mon_filter_mode filter_mode =
2955 				DP_MON_FILTER_LITE_MON_MODE;
2956 	enum dp_mon_filter_srng_type srng_type =
2957 				DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2958 	struct dp_lite_mon_rx_config *config = NULL;
2959 
2960 	be_mon_pdev->filter_be[filter_mode][srng_type] = filter;
2961 	config = be_mon_pdev->lite_mon_rx_config;
2962 	if (config)
2963 		config->fp_type_subtype_filter_all = false;
2964 }
2965 
2966 void
2967 dp_mon_filter_setup_rx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
2968 {
2969 	struct dp_mon_filter_be filter = {0};
2970 	struct dp_mon_filter *rx_tlv_filter;
2971 	enum dp_mon_filter_mode filter_mode =
2972 				DP_MON_FILTER_LITE_MON_MODE;
2973 	enum dp_mon_filter_srng_type srng_type =
2974 				DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
2975 	struct dp_lite_mon_rx_config *config = NULL;
2976 	uint16_t max_custom_len = 0;
2977 	uint16_t mgmt_len = 0;
2978 	uint16_t ctrl_len = 0;
2979 	uint16_t data_len = 0;
2980 
2981 	config = be_mon_pdev->lite_mon_rx_config;
2982 	if (!config)
2983 		return;
2984 
2985 	rx_tlv_filter = &filter.rx_tlv_filter;
2986 	rx_tlv_filter->valid = true;
2987 	/* configure fp filters if enabled */
2988 	if (config->rx_config.fp_enabled) {
2989 		rx_tlv_filter->tlv_filter.enable_fp = 1;
2990 		rx_tlv_filter->tlv_filter.fp_mgmt_filter =
2991 			config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP];
2992 		rx_tlv_filter->tlv_filter.fp_ctrl_filter =
2993 			config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP];
2994 		rx_tlv_filter->tlv_filter.fp_data_filter =
2995 			config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP];
2996 		if ((config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP] ==
2997 		     CDP_LITE_MON_FILTER_ALL) &&
2998 		    (config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP] ==
2999 		     CDP_LITE_MON_FILTER_ALL) &&
3000 		    (config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP] ==
3001 		     CDP_LITE_MON_FILTER_ALL))
3002 			config->fp_type_subtype_filter_all = true;
3003 	}
3004 
3005 	/* configure md filters if enabled */
3006 	if (config->rx_config.md_enabled) {
3007 		rx_tlv_filter->tlv_filter.enable_md = 1;
3008 		rx_tlv_filter->tlv_filter.md_mgmt_filter =
3009 			config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_MD];
3010 		rx_tlv_filter->tlv_filter.md_ctrl_filter =
3011 			config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_MD];
3012 		rx_tlv_filter->tlv_filter.md_data_filter =
3013 			config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_MD];
3014 	}
3015 
3016 	/* configure mo filters if enabled */
3017 	if (config->rx_config.mo_enabled) {
3018 		rx_tlv_filter->tlv_filter.enable_mo = 1;
3019 		rx_tlv_filter->tlv_filter.mo_mgmt_filter =
3020 			config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_MO];
3021 		rx_tlv_filter->tlv_filter.mo_ctrl_filter =
3022 			config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_MO];
3023 		rx_tlv_filter->tlv_filter.mo_data_filter =
3024 			config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_MO];
3025 	}
3026 
3027 	/* configure fpmo filters if enabled */
3028 	if (config->rx_config.fpmo_enabled) {
3029 		rx_tlv_filter->tlv_filter.enable_fpmo = 1;
3030 		rx_tlv_filter->tlv_filter.fpmo_mgmt_filter =
3031 			config->rx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP_MO];
3032 		rx_tlv_filter->tlv_filter.fpmo_ctrl_filter =
3033 			config->rx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP_MO];
3034 		rx_tlv_filter->tlv_filter.fpmo_data_filter =
3035 			config->rx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP_MO];
3036 	}
3037 
3038 	mgmt_len = config->rx_config.len[WLAN_FC0_TYPE_MGMT];
3039 	ctrl_len = config->rx_config.len[WLAN_FC0_TYPE_CTRL];
3040 	data_len = config->rx_config.len[WLAN_FC0_TYPE_DATA];
3041 	/* if full len is configured for any of the types, subscribe
3042 	 * for full dma length else set it to min dma length(fw sets
3043 	 * full length by default) to avoid unnecessary dma since we
3044 	 * do not have hw support to control rx pkt tlvs per type. To
3045 	 * get custom len pkt we make use of rx hdr tlv instead.
3046 	 */
3047 	if (dp_lite_mon_is_full_len_configured(mgmt_len,
3048 					       ctrl_len,
3049 					       data_len)) {
3050 		rx_tlv_filter->tlv_filter.packet = 1;
3051 		/* get offset size in QWORDS */
3052 		rx_tlv_filter->tlv_filter.rx_pkt_tlv_offset =
3053 				DP_GET_NUM_QWORDS(DP_RX_MON_PACKET_OFFSET);
3054 		if (mgmt_len == CDP_LITE_MON_LEN_FULL)
3055 			rx_tlv_filter->tlv_filter.mgmt_dma_length =
3056 							DEFAULT_DMA_LENGTH;
3057 		else
3058 			rx_tlv_filter->tlv_filter.mgmt_dma_length =
3059 							DMA_LENGTH_64B;
3060 
3061 		if (ctrl_len == CDP_LITE_MON_LEN_FULL)
3062 			rx_tlv_filter->tlv_filter.ctrl_dma_length =
3063 							DEFAULT_DMA_LENGTH;
3064 		else
3065 			rx_tlv_filter->tlv_filter.ctrl_dma_length =
3066 							DMA_LENGTH_64B;
3067 
3068 		if (data_len == CDP_LITE_MON_LEN_FULL)
3069 			rx_tlv_filter->tlv_filter.data_dma_length =
3070 							DEFAULT_DMA_LENGTH;
3071 		else
3072 			rx_tlv_filter->tlv_filter.data_dma_length =
3073 							DMA_LENGTH_64B;
3074 	} else  {
3075 		/* if full len not configured set to min len */
3076 		rx_tlv_filter->tlv_filter.mgmt_dma_length = DMA_LENGTH_64B;
3077 		rx_tlv_filter->tlv_filter.ctrl_dma_length = DMA_LENGTH_64B;
3078 		rx_tlv_filter->tlv_filter.data_dma_length = DMA_LENGTH_64B;
3079 	}
3080 
3081 	rx_tlv_filter->tlv_filter.packet_header = 1;
3082 	/* set rx hdr tlv len, default len is 128B */
3083 	max_custom_len = dp_lite_mon_get_max_custom_len(mgmt_len, ctrl_len,
3084 							data_len);
3085 	if (max_custom_len == CDP_LITE_MON_LEN_64B)
3086 		rx_tlv_filter->tlv_filter.rx_hdr_length =
3087 						RX_HDR_DMA_LENGTH_64B;
3088 	else if (max_custom_len == CDP_LITE_MON_LEN_128B)
3089 		rx_tlv_filter->tlv_filter.rx_hdr_length =
3090 						RX_HDR_DMA_LENGTH_128B;
3091 	else if (max_custom_len == CDP_LITE_MON_LEN_256B)
3092 		rx_tlv_filter->tlv_filter.rx_hdr_length =
3093 						RX_HDR_DMA_LENGTH_256B;
3094 
3095 	if ((config->rx_config.level == CDP_LITE_MON_LEVEL_MSDU) ||
3096 	    dp_lite_mon_is_full_len_configured(mgmt_len, ctrl_len, data_len)) {
3097 		rx_tlv_filter->tlv_filter.header_per_msdu = 1;
3098 		rx_tlv_filter->tlv_filter.msdu_end = 1;
3099 	}
3100 
3101 	rx_tlv_filter->tlv_filter.ppdu_start = 1;
3102 	rx_tlv_filter->tlv_filter.ppdu_end = 1;
3103 	rx_tlv_filter->tlv_filter.mpdu_start = 1;
3104 	rx_tlv_filter->tlv_filter.mpdu_end = 1;
3105 
3106 	rx_tlv_filter->tlv_filter.ppdu_end_user_stats = 1;
3107 	rx_tlv_filter->tlv_filter.ppdu_end_user_stats_ext = 1;
3108 	rx_tlv_filter->tlv_filter.ppdu_end_status_done = 1;
3109 	rx_tlv_filter->tlv_filter.ppdu_start_user_info = 1;
3110 
3111 	dp_mon_filter_show_rx_filter_be(filter_mode, &filter);
3112 	be_mon_pdev->filter_be[filter_mode][srng_type] = filter;
3113 }
3114 
3115 uint8_t tx_lite_mon_set_len(uint16_t len)
3116 {
3117 	switch (len) {
3118 	case CDP_LITE_MON_LEN_64B:
3119 		return DMA_LENGTH_64B;
3120 	case CDP_LITE_MON_LEN_128B:
3121 		return DMA_LENGTH_128B;
3122 	case CDP_LITE_MON_LEN_256B:
3123 		return DMA_LENGTH_256B;
3124 	case CDP_LITE_MON_LEN_FULL:
3125 		return DEFAULT_DMA_LENGTH;
3126 	default:
3127 		dp_mon_filter_err("Invalid length %d, Using minimal length of 64B",
3128 				  len);
3129 		return DMA_LENGTH_64B;
3130 	}
3131 }
3132 
3133 void
3134 dp_mon_filter_reset_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
3135 {
3136 	struct dp_mon_filter_be filter = {0};
3137 	enum dp_mon_filter_mode filter_mode =
3138 				DP_MON_FILTER_LITE_MON_MODE;
3139 	enum dp_mon_filter_srng_type srng_type =
3140 				DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
3141 	struct dp_lite_mon_tx_config *config = NULL;
3142 
3143 	be_mon_pdev->filter_be[filter_mode][srng_type] = filter;
3144 	config = be_mon_pdev->lite_mon_tx_config;
3145 	if (!config)
3146 		return;
3147 	config->subtype_filtering = false;
3148 	config->sw_peer_filtering = false;
3149 
3150 }
3151 
3152 void
3153 dp_mon_filter_setup_tx_lite_mon(struct dp_mon_pdev_be *be_mon_pdev)
3154 {
3155 	struct dp_mon_filter_be filter = {0};
3156 	enum dp_mon_filter_mode mode = DP_MON_FILTER_LITE_MON_MODE;
3157 	enum dp_mon_filter_srng_type srng_type =
3158 				DP_MON_FILTER_SRNG_TYPE_TXMON_DEST;
3159 	struct htt_tx_ring_tlv_filter *tx_tlv_filter = &filter.tx_tlv_filter;
3160 	struct dp_lite_mon_tx_config *config = NULL;
3161 
3162 	config = be_mon_pdev->lite_mon_tx_config;
3163 	if (!config)
3164 		return;
3165 
3166 	/* tx monitor supports only filter pass mode */
3167 	if (config->tx_config.md_enabled || config->tx_config.mo_enabled ||
3168 	    config->tx_config.fpmo_enabled) {
3169 		dp_mon_filter_err("md mo and fpmo are invalid filter configuration for Tx");
3170 		return;
3171 	}
3172 
3173 	/* Enable tx monitor filter */
3174 	filter.tx_valid = true;
3175 	tx_tlv_filter->enable = 1;
3176 
3177 	dp_tx_mon_filter_set_downstream_tlvs(tx_tlv_filter);
3178 	dp_tx_mon_filter_set_upstream_tlvs(tx_tlv_filter);
3179 	dp_tx_mon_filter_set_word_mask(tx_tlv_filter);
3180 
3181 	/* configure mgmt filters */
3182 	if (config->tx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP]) {
3183 		tx_tlv_filter->mgmt_filter = 1;
3184 		tx_tlv_filter->mgmt_dma_length =
3185 			tx_lite_mon_set_len(config->tx_config.len[WLAN_FC0_TYPE_MGMT]);
3186 		if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) ||
3187 		    (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU))
3188 			tx_tlv_filter->mgmt_mpdu_log = 1;
3189 		if (config->tx_config.mgmt_filter[DP_MON_FRM_FILTER_MODE_FP] !=
3190 		    CDP_LITE_MON_FILTER_ALL)
3191 			config->subtype_filtering = true;
3192 	}
3193 
3194 	/* configure ctrl filters */
3195 	if (config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP]) {
3196 		tx_tlv_filter->ctrl_filter = 1;
3197 		tx_tlv_filter->ctrl_dma_length =
3198 			tx_lite_mon_set_len(config->tx_config.len[WLAN_FC0_TYPE_CTRL]);
3199 		if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) ||
3200 		    (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU))
3201 			tx_tlv_filter->ctrl_mpdu_log = 1;
3202 	}
3203 	/* Since ctrl frames are generated in host, we need to do subtype
3204 	 * filtering even though ctrl filters are not enabled
3205 	 */
3206 	if (config->tx_config.ctrl_filter[DP_MON_FRM_FILTER_MODE_FP] !=
3207 	    CDP_LITE_MON_FILTER_ALL)
3208 		config->subtype_filtering = true;
3209 	/* configure data filters */
3210 	if (config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP]) {
3211 		tx_tlv_filter->data_filter = 1;
3212 		tx_tlv_filter->data_dma_length =
3213 			tx_lite_mon_set_len(config->tx_config.len[WLAN_FC0_TYPE_DATA]);
3214 		if ((config->tx_config.level == CDP_LITE_MON_LEVEL_MPDU) ||
3215 		    (config->tx_config.level == CDP_LITE_MON_LEVEL_PPDU))
3216 			tx_tlv_filter->data_mpdu_log = 1;
3217 		if (config->tx_config.data_filter[DP_MON_FRM_FILTER_MODE_FP] !=
3218 		    CDP_LITE_MON_FILTER_ALL)
3219 			config->subtype_filtering = true;
3220 	}
3221 
3222 	dp_mon_filter_show_tx_filter_be(mode, &filter);
3223 	be_mon_pdev->filter_be[mode][srng_type] = filter;
3224 }
3225 #endif /* QCA_SUPPORT_LITE_MONITOR */
3226 
3227 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
3228 /**
3229  * dp_cfr_filter_2_0() - Configure HOST monitor destination ring for CFR
3230  *
3231  * @soc_hdl: Datapath soc handle
3232  * @pdev_id: id of data path pdev handle
3233  * @enable: Enable/Disable CFR
3234  * @filter_val: Flag to select Filter for monitor mode
3235  * @cfr_enable_monitor_mode: Flag to be enabled when scan radio is brought up
3236  * in special vap mode
3237  *
3238  * Return: void
3239  */
3240 static void dp_cfr_filter_2_0(struct cdp_soc_t *soc_hdl,
3241 			      uint8_t pdev_id,
3242 			      bool enable,
3243 			      struct cdp_monitor_filter *filter_val,
3244 			      bool cfr_enable_monitor_mode)
3245 {
3246 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
3247 	struct dp_pdev *pdev = NULL;
3248 	struct htt_rx_ring_tlv_filter *htt_tlv_filter;
3249 	struct dp_mon_pdev *mon_pdev;
3250 	struct dp_mon_filter_be filter = {0};
3251 	enum dp_mon_filter_srng_type srng_type =
3252 		DP_MON_FILTER_SRNG_TYPE_RXMON_DEST;
3253 
3254 	pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
3255 	if (!pdev) {
3256 		dp_mon_err("pdev is NULL");
3257 		return;
3258 	}
3259 
3260 	mon_pdev = pdev->monitor_pdev;
3261 
3262 	if (mon_pdev->mvdev) {
3263 		if (enable && cfr_enable_monitor_mode)
3264 			pdev->cfr_rcc_mode = true;
3265 		else
3266 			pdev->cfr_rcc_mode = false;
3267 		return;
3268 	}
3269 
3270 	soc = pdev->soc;
3271 	pdev->cfr_rcc_mode = false;
3272 
3273 	/* Get default tlv settings */
3274 	htt_tlv_filter = &filter.rx_tlv_filter.tlv_filter;
3275 	dp_rx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter);
3276 
3277 	if (filter.rx_tlv_filter.valid)
3278 		htt_tlv_filter->enable = 1;
3279 	else
3280 		htt_tlv_filter->enable = 0;
3281 
3282 	dp_mon_info("enable : %d, mode: 0x%x", enable, filter_val->mode);
3283 
3284 	if (enable) {
3285 		pdev->cfr_rcc_mode = true;
3286 		htt_tlv_filter->ppdu_start = 1;
3287 		htt_tlv_filter->ppdu_end = 1;
3288 		htt_tlv_filter->ppdu_end_user_stats = 1;
3289 		htt_tlv_filter->ppdu_end_user_stats_ext = 1;
3290 		htt_tlv_filter->ppdu_end_status_done = 1;
3291 		htt_tlv_filter->mpdu_start = 1;
3292 		htt_tlv_filter->offset_valid = false;
3293 
3294 		htt_tlv_filter->enable_fp =
3295 			(filter_val->mode & MON_FILTER_PASS) ? 1 : 0;
3296 		htt_tlv_filter->enable_md = 0;
3297 		htt_tlv_filter->enable_mo =
3298 			(filter_val->mode & MON_FILTER_OTHER) ? 1 : 0;
3299 		htt_tlv_filter->fp_mgmt_filter = filter_val->fp_mgmt;
3300 		htt_tlv_filter->fp_ctrl_filter = filter_val->fp_ctrl;
3301 		htt_tlv_filter->fp_data_filter = filter_val->fp_data;
3302 		htt_tlv_filter->mo_mgmt_filter = filter_val->mo_mgmt;
3303 		htt_tlv_filter->mo_ctrl_filter = filter_val->mo_ctrl;
3304 		htt_tlv_filter->mo_data_filter = filter_val->mo_data;
3305 	}
3306 
3307 	dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type,
3308 			       &filter.rx_tlv_filter.tlv_filter);
3309 }
3310 
3311 void dp_cfr_filter_register_2_0(struct cdp_ops *ops)
3312 {
3313 	ops->cfr_ops->txrx_cfr_filter = dp_cfr_filter_2_0;
3314 }
3315 #endif
3316