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