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