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