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