xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <hal_api.h>
19 #include <wlan_cfg.h>
20 #include "dp_types.h"
21 #include "dp_internal.h"
22 #include "dp_htt.h"
23 #include "dp_mon.h"
24 #include "dp_mon_filter.h"
25 
26 #include <dp_mon_1.0.h>
27 #include <dp_rx_mon_1.0.h>
28 #include <dp_mon_filter_1.0.h>
29 
30 #if defined(QCA_MCOPY_SUPPORT) || defined(ATH_SUPPORT_NAC_RSSI) \
31 	|| defined(ATH_SUPPORT_NAC) || defined(WLAN_RX_PKT_CAPTURE_ENH)
32 /**
33  * dp_mon_filter_check_co_exist() - Check the co-existing of the
34  * enabled modes.
35  * @pdev: DP pdev handle
36  *
37  * Return: QDF_STATUS
38  */
dp_mon_filter_check_co_exist(struct dp_pdev * pdev)39 static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
40 {
41 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
42 	/*
43 	 * Check if the Rx Enhanced capture mode, monitor mode,
44 	 * smart_monitor_mode and mcopy mode can co-exist together.
45 	 */
46 	if ((mon_pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) &&
47 	    ((mon_pdev->neighbour_peers_added && mon_pdev->mvdev) ||
48 		 mon_pdev->mcopy_mode)) {
49 		dp_mon_filter_err("%pK:Rx Capture mode can't exist with modes:\n"
50 				  "Smart Monitor Mode:%d\n"
51 				  "M_Copy Mode:%d", pdev->soc,
52 				  mon_pdev->neighbour_peers_added,
53 				  mon_pdev->mcopy_mode);
54 		return QDF_STATUS_E_FAILURE;
55 	}
56 
57 	/*
58 	 * Check if the monitor mode cannot co-exist with any other mode.
59 	 */
60 	if ((mon_pdev->mvdev && mon_pdev->monitor_configured) &&
61 	    (mon_pdev->mcopy_mode || mon_pdev->neighbour_peers_added)) {
62 		dp_mon_filter_err("%pK: Monitor mode can't exist with modes\n"
63 				  "M_Copy Mode:%d\n"
64 				  "Smart Monitor Mode:%d",
65 				  pdev->soc, mon_pdev->mcopy_mode,
66 				  mon_pdev->neighbour_peers_added);
67 		return QDF_STATUS_E_FAILURE;
68 	}
69 
70 	/*
71 	 * Check if the smart monitor mode can co-exist with any other mode
72 	 */
73 	if (mon_pdev->neighbour_peers_added &&
74 	    ((mon_pdev->mcopy_mode) || mon_pdev->monitor_configured)) {
75 		dp_mon_filter_err("%pk: Smart Monitor mode can't exist with modes\n"
76 				  "M_Copy Mode:%d\n"
77 				  "Monitor Mode:%d",
78 				  pdev->soc, mon_pdev->mcopy_mode,
79 			      mon_pdev->monitor_configured);
80 		return QDF_STATUS_E_FAILURE;
81 	}
82 
83 	/*
84 	 * Check if the m_copy, monitor mode and the smart_monitor_mode
85 	 * can co-exist together.
86 	 */
87 	if (mon_pdev->mcopy_mode &&
88 	    (mon_pdev->mvdev || mon_pdev->neighbour_peers_added)) {
89 		dp_mon_filter_err("%pK: mcopy mode can't exist with modes\n"
90 				  "Monitor Mode:%pK\n"
91 				  "Smart Monitor Mode:%d",
92 				  pdev->soc, mon_pdev->mvdev,
93 				  mon_pdev->neighbour_peers_added);
94 		return QDF_STATUS_E_FAILURE;
95 	}
96 
97 	/*
98 	 * Check if the Rx packet log lite or full can co-exist with
99 	 * the enable modes.
100 	 */
101 	if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
102 	    !mon_pdev->rx_pktlog_cbf &&
103 	    (mon_pdev->mvdev || mon_pdev->monitor_configured)) {
104 		dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n"
105 				  "Monitor Mode:%d", pdev->soc,
106 				  mon_pdev->monitor_configured);
107 		return QDF_STATUS_E_FAILURE;
108 	}
109 	return QDF_STATUS_SUCCESS;
110 }
111 #else
dp_mon_filter_check_co_exist(struct dp_pdev * pdev)112 static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev)
113 {
114 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
115 	/*
116 	 * Check if the Rx packet log lite or full can co-exist with
117 	 * the enable modes.
118 	 */
119 	if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) &&
120 	    (mon_pdev->mvdev || mon_pdev->monitor_configured)) {
121 		 dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n"
122 				   "Monitor Mode:%d", pdev->soc,
123 				   mon_pdev->monitor_configured);
124 		return QDF_STATUS_E_FAILURE;
125 	}
126 
127 	return QDF_STATUS_SUCCESS;
128 }
129 #endif
130 
131 #ifdef QCA_ENHANCED_STATS_SUPPORT
dp_mon_filter_setup_enhanced_stats_1_0(struct dp_pdev * pdev)132 void dp_mon_filter_setup_enhanced_stats_1_0(struct dp_pdev *pdev)
133 {
134 	struct dp_mon_filter filter = {0};
135 	enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
136 	enum dp_mon_filter_srng_type srng_type =
137 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
138 	struct dp_mon_pdev *mon_pdev;
139 
140 	if (!pdev) {
141 		dp_mon_filter_err("pdev Context is null");
142 		return;
143 	}
144 
145 	/* Enabled the filter */
146 	filter.valid = true;
147 
148 	mon_pdev = pdev->monitor_pdev;
149 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
150 
151 	filter.tlv_filter.enable_mo = 0;
152 	filter.tlv_filter.mo_mgmt_filter = 0;
153 	filter.tlv_filter.mo_ctrl_filter = 0;
154 	filter.tlv_filter.mo_data_filter = 0;
155 
156 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
157 	mon_pdev->filter[mode][srng_type] = filter;
158 }
159 
dp_mon_filter_reset_enhanced_stats_1_0(struct dp_pdev * pdev)160 void dp_mon_filter_reset_enhanced_stats_1_0(struct dp_pdev *pdev)
161 {
162 	struct dp_mon_filter filter = {0};
163 	enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE;
164 	enum dp_mon_filter_srng_type srng_type =
165 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
166 	struct dp_mon_pdev *mon_pdev;
167 
168 	if (!pdev) {
169 		dp_mon_filter_err("pdev Context is null");
170 		return;
171 	}
172 
173 	mon_pdev = pdev->monitor_pdev;
174 	mon_pdev->filter[mode][srng_type] = filter;
175 }
176 #endif /* QCA_ENHANCED_STATS_SUPPORT */
177 
178 #ifdef QCA_UNDECODED_METADATA_SUPPORT
dp_mon_filter_setup_undecoded_metadata_capture_1_0(struct dp_pdev * pdev)179 void dp_mon_filter_setup_undecoded_metadata_capture_1_0(struct dp_pdev *pdev)
180 {
181 	struct dp_mon_filter filter = {0};
182 	enum dp_mon_filter_mode mode =
183 				DP_MON_FILTER_UNDECODED_METADATA_CAPTURE_MODE;
184 	enum dp_mon_filter_srng_type srng_type =
185 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
186 	struct dp_mon_pdev *mon_pdev;
187 
188 	if (!pdev) {
189 		dp_mon_filter_err("pdev Context is null");
190 		return;
191 	}
192 
193 	/* Enabled the filter */
194 	mon_pdev = pdev->monitor_pdev;
195 	if (mon_pdev->monitor_configured ||
196 	    mon_pdev->scan_spcl_vap_configured) {
197 		filter = mon_pdev->filter[DP_MON_FILTER_MONITOR_MODE][srng_type];
198 	} else if (mon_pdev->neighbour_peers_added) {
199 		filter = mon_pdev->filter[DP_MON_FILTER_SMART_MONITOR_MODE][srng_type];
200 	} else {
201 		dp_mon_filter_set_status_cmn(mon_pdev, &filter);
202 		filter.valid = true;
203 	}
204 
205 	/* Setup the filter to subscribe to FP PHY status tlv */
206 	filter.tlv_filter.fp_phy_err = 1;
207 	filter.tlv_filter.fp_phy_err_buf_src = SW2RXDMA_BUF_SOURCE_RING;
208 	filter.tlv_filter.fp_phy_err_buf_dest = RXDMA2SW_RING;
209 	filter.tlv_filter.phy_err_mask = mon_pdev->phyrx_error_mask;
210 	filter.tlv_filter.phy_err_mask_cont = mon_pdev->phyrx_error_mask_cont;
211 
212 	filter.tlv_filter.phy_err_filter_valid = 1;
213 
214 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
215 	mon_pdev->filter[mode][srng_type] = filter;
216 }
217 
dp_mon_filter_reset_undecoded_metadata_capture_1_0(struct dp_pdev * pdev)218 void dp_mon_filter_reset_undecoded_metadata_capture_1_0(struct dp_pdev *pdev)
219 {
220 	struct dp_mon_filter filter = {0};
221 	enum dp_mon_filter_mode mode =
222 				DP_MON_FILTER_UNDECODED_METADATA_CAPTURE_MODE;
223 	enum dp_mon_filter_srng_type srng_type =
224 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
225 	struct dp_mon_pdev *mon_pdev;
226 
227 	if (!pdev) {
228 		dp_mon_filter_err("pdev Context is null");
229 		return;
230 	}
231 	mon_pdev = pdev->monitor_pdev;
232 
233 	filter = mon_pdev->filter[mode][srng_type];
234 
235 	/* Reset the phy error and phy error mask */
236 	filter.tlv_filter.fp_phy_err = 0;
237 	filter.tlv_filter.fp_phy_err_buf_src = NO_BUFFER_RING;
238 	filter.tlv_filter.fp_phy_err_buf_dest = RXDMA_RELEASING_RING;
239 
240 	filter.tlv_filter.phy_err_mask = 0;
241 	filter.tlv_filter.phy_err_mask_cont = 0;
242 	mon_pdev->phyrx_error_mask = 0;
243 	mon_pdev->phyrx_error_mask_cont = 0;
244 
245 	filter.tlv_filter.phy_err_filter_valid = 1;
246 
247 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
248 	mon_pdev->filter[mode][srng_type] = filter;
249 }
250 #endif /* QCA_UNDECODED_METADATA_SUPPORT */
251 
252 #ifdef QCA_MCOPY_SUPPORT
253 #ifdef QCA_MONITOR_PKT_SUPPORT
dp_mon_filter_set_reset_mcopy_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)254 static void dp_mon_filter_set_reset_mcopy_dest(struct dp_pdev *pdev,
255 					       struct dp_mon_filter *pfilter)
256 {
257 	struct dp_soc *soc = pdev->soc;
258 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
259 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE;
260 	enum dp_mon_filter_srng_type srng_type;
261 
262 	srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
263 			DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
264 			DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
265 
266 	/* Set the filter */
267 	if (pfilter->valid) {
268 		dp_mon_filter_set_mon_cmn(pdev, pfilter);
269 
270 		pfilter->tlv_filter.fp_data_filter = 0;
271 		pfilter->tlv_filter.mo_data_filter = 0;
272 
273 		dp_mon_filter_show_filter(mon_pdev, mode, pfilter);
274 		mon_pdev->filter[mode][srng_type] = *pfilter;
275 	} else /* Reset the filter */
276 		mon_pdev->filter[mode][srng_type] = *pfilter;
277 }
278 #else
dp_mon_filter_set_reset_mcopy_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)279 static void dp_mon_filter_set_reset_mcopy_dest(struct dp_pdev *pdev,
280 					       struct dp_mon_filter *pfilter)
281 {
282 }
283 #endif
284 
dp_mon_filter_setup_mcopy_mode_1_0(struct dp_pdev * pdev)285 void dp_mon_filter_setup_mcopy_mode_1_0(struct dp_pdev *pdev)
286 {
287 	struct dp_mon_filter filter = {0};
288 	struct dp_soc *soc = NULL;
289 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE;
290 	enum dp_mon_filter_srng_type srng_type =
291 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
292 	struct dp_mon_pdev *mon_pdev;
293 
294 	if (!pdev) {
295 		dp_mon_filter_err("pdev Context is null");
296 		return;
297 	}
298 
299 	soc = pdev->soc;
300 	if (!soc) {
301 		dp_mon_filter_err("Soc Context is null");
302 		return;
303 	}
304 
305 	mon_pdev = pdev->monitor_pdev;
306 	if (!mon_pdev) {
307 		dp_mon_filter_err("monitor pdev Context is null");
308 		return;
309 	}
310 	/* Enabled the filter */
311 	filter.valid = true;
312 	dp_mon_filter_set_reset_mcopy_dest(pdev, &filter);
313 
314 	/* Clear the filter as the same filter will be used to set the
315 	 * monitor status ring
316 	 */
317 	qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
318 
319 	/* Enabled the filter */
320 	filter.valid = true;
321 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
322 
323 	/* Setup the filter */
324 	filter.tlv_filter.enable_mo = 1;
325 	filter.tlv_filter.packet_header = 1;
326 	filter.tlv_filter.mpdu_end = 1;
327 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
328 
329 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
330 	mon_pdev->filter[mode][srng_type] = filter;
331 }
332 
dp_mon_filter_reset_mcopy_mode_1_0(struct dp_pdev * pdev)333 void dp_mon_filter_reset_mcopy_mode_1_0(struct dp_pdev *pdev)
334 {
335 	struct dp_mon_filter filter = {0};
336 	struct dp_soc *soc = NULL;
337 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE;
338 	enum dp_mon_filter_srng_type srng_type =
339 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
340 	struct dp_mon_pdev *mon_pdev;
341 
342 	if (!pdev) {
343 		dp_mon_filter_err("pdev Context is null");
344 		return;
345 	}
346 
347 	soc = pdev->soc;
348 	if (!soc) {
349 		dp_mon_filter_err("Soc Context is null");
350 		return;
351 	}
352 
353 	mon_pdev = pdev->monitor_pdev;
354 	dp_mon_filter_set_reset_mcopy_dest(pdev, &filter);
355 
356 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
357 	mon_pdev->filter[mode][srng_type] = filter;
358 }
359 #endif
360 
361 #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
dp_mon_filter_setup_smart_monitor_1_0(struct dp_pdev * pdev)362 void dp_mon_filter_setup_smart_monitor_1_0(struct dp_pdev *pdev)
363 {
364 	struct dp_mon_filter filter = {0};
365 	struct dp_soc *soc = NULL;
366 	struct dp_mon_soc *mon_soc;
367 
368 	enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE;
369 	enum dp_mon_filter_srng_type srng_type =
370 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
371 	struct dp_mon_pdev *mon_pdev;
372 
373 	if (!pdev) {
374 		dp_mon_filter_err("pdev Context is null");
375 		return;
376 	}
377 
378 	soc = pdev->soc;
379 	if (!soc) {
380 		dp_mon_filter_err("Soc Context is null");
381 		return;
382 	}
383 
384 	mon_soc = soc->monitor_soc;
385 	mon_pdev = pdev->monitor_pdev;
386 
387 	/* Enabled the filter */
388 	filter.valid = true;
389 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
390 
391 	filter.tlv_filter.enable_mo = 0;
392 	filter.tlv_filter.mo_mgmt_filter = 0;
393 	filter.tlv_filter.mo_ctrl_filter = 0;
394 	filter.tlv_filter.mo_data_filter = 0;
395 
396 	if (mon_soc->hw_nac_monitor_support) {
397 		filter.tlv_filter.enable_md = 1;
398 		filter.tlv_filter.packet_header = 1;
399 		filter.tlv_filter.md_data_filter = FILTER_DATA_ALL;
400 	}
401 
402 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
403 	mon_pdev->filter[mode][srng_type] = filter;
404 }
405 
dp_mon_filter_reset_smart_monitor_1_0(struct dp_pdev * pdev)406 void dp_mon_filter_reset_smart_monitor_1_0(struct dp_pdev *pdev)
407 {
408 	struct dp_mon_filter filter = {0};
409 	enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE;
410 	enum dp_mon_filter_srng_type srng_type =
411 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
412 	struct dp_mon_pdev *mon_pdev;
413 
414 	if (!pdev) {
415 		dp_mon_filter_err("pdev Context is null");
416 		return;
417 	}
418 
419 	mon_pdev = pdev->monitor_pdev;
420 	mon_pdev->filter[mode][srng_type] = filter;
421 }
422 #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
423 
424 #ifdef WLAN_RX_PKT_CAPTURE_ENH
425 #ifdef QCA_MONITOR_PKT_SUPPORT
426 static
dp_mon_filter_set_reset_rx_enh_capture_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)427 void dp_mon_filter_set_reset_rx_enh_capture_dest(struct dp_pdev *pdev,
428 						 struct dp_mon_filter *pfilter)
429 {
430 	struct dp_soc *soc = pdev->soc;
431 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
432 	enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE;
433 	enum dp_mon_filter_srng_type srng_type;
434 
435 	srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
436 			DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
437 			DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
438 
439 	/* Set the filter */
440 	if (pfilter->valid) {
441 		dp_mon_filter_set_mon_cmn(pdev, pfilter);
442 
443 		pfilter->tlv_filter.fp_mgmt_filter = 0;
444 		pfilter->tlv_filter.fp_ctrl_filter = 0;
445 		pfilter->tlv_filter.fp_data_filter = 0;
446 		pfilter->tlv_filter.mo_mgmt_filter = 0;
447 		pfilter->tlv_filter.mo_ctrl_filter = 0;
448 		pfilter->tlv_filter.mo_data_filter = 0;
449 
450 		dp_mon_filter_show_filter(mon_pdev, mode, pfilter);
451 		pdev->monitor_pdev->filter[mode][srng_type] = *pfilter;
452 	} else /* Reset the filter */
453 		pdev->monitor_pdev->filter[mode][srng_type] = *pfilter;
454 }
455 #else
456 static
dp_mon_filter_set_reset_rx_enh_capture_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)457 void dp_mon_filter_set_reset_rx_enh_capture_dest(struct dp_pdev *pdev,
458 						 struct dp_mon_filter *pfilter)
459 {
460 }
461 #endif
462 
dp_mon_filter_setup_rx_enh_capture_1_0(struct dp_pdev * pdev)463 void dp_mon_filter_setup_rx_enh_capture_1_0(struct dp_pdev *pdev)
464 {
465 	struct dp_mon_filter filter = {0};
466 	struct dp_soc *soc = NULL;
467 	enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE;
468 	enum dp_mon_filter_srng_type srng_type =
469 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
470 	struct dp_mon_pdev *mon_pdev;
471 
472 	if (!pdev) {
473 		dp_mon_filter_err("pdev Context is null");
474 		return;
475 	}
476 
477 	soc = pdev->soc;
478 	if (!soc) {
479 		dp_mon_filter_err("Soc Context is null");
480 		return;
481 	}
482 
483 	mon_pdev = pdev->monitor_pdev;
484 
485 	/* Enabled the filter */
486 	filter.valid = true;
487 	dp_mon_filter_set_reset_rx_enh_capture_dest(pdev, &filter);
488 
489 	/* Clear the filter as the same filter will be used to set the
490 	 * monitor status ring
491 	 */
492 	qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
493 
494 	/* Enabled the filter */
495 	filter.valid = true;
496 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
497 
498 	/* Setup the filter */
499 	filter.tlv_filter.mpdu_end = 1;
500 	filter.tlv_filter.enable_mo = 1;
501 	filter.tlv_filter.packet_header = 1;
502 
503 	if (mon_pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU) {
504 		filter.tlv_filter.header_per_msdu = 0;
505 		filter.tlv_filter.enable_mo = 0;
506 	} else if (mon_pdev->rx_enh_capture_mode ==
507 			CDP_RX_ENH_CAPTURE_MPDU_MSDU) {
508 		bool is_rx_mon_proto_flow_tag_enabled =
509 		wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(soc->wlan_cfg_ctx);
510 		filter.tlv_filter.header_per_msdu = 1;
511 		filter.tlv_filter.enable_mo = 0;
512 		if (mon_pdev->is_rx_enh_capture_trailer_enabled ||
513 		    is_rx_mon_proto_flow_tag_enabled)
514 			filter.tlv_filter.msdu_end = 1;
515 	}
516 
517 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
518 
519 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
520 	mon_pdev->filter[mode][srng_type] = filter;
521 }
522 
dp_mon_filter_reset_rx_enh_capture_1_0(struct dp_pdev * pdev)523 void dp_mon_filter_reset_rx_enh_capture_1_0(struct dp_pdev *pdev)
524 {
525 	struct dp_mon_filter filter = {0};
526 	struct dp_soc *soc = NULL;
527 	enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE;
528 	enum dp_mon_filter_srng_type srng_type =
529 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
530 	struct dp_mon_pdev *mon_pdev;
531 
532 	if (!pdev) {
533 		dp_mon_filter_err("pdev Context is null");
534 		return;
535 	}
536 
537 	soc = pdev->soc;
538 	if (!soc) {
539 		dp_mon_filter_err("Soc Context is null");
540 		return;
541 	}
542 
543 	mon_pdev = pdev->monitor_pdev;
544 	dp_mon_filter_set_reset_rx_enh_capture_dest(pdev, &filter);
545 
546 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
547 	mon_pdev->filter[mode][srng_type] = filter;
548 }
549 #endif /* WLAN_RX_PKT_CAPTURE_ENH */
550 
551 #ifdef QCA_MONITOR_PKT_SUPPORT
dp_mon_filter_set_reset_mon_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)552 static void dp_mon_filter_set_reset_mon_dest(struct dp_pdev *pdev,
553 					     struct dp_mon_filter *pfilter)
554 {
555 	struct dp_soc *soc = pdev->soc;
556 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
557 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
558 	enum dp_mon_filter_srng_type srng_type;
559 
560 	srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
561 			DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
562 			DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
563 
564 	/* set the filter */
565 	if (pfilter->valid) {
566 		dp_mon_filter_set_mon_cmn(pdev, pfilter);
567 
568 		dp_mon_filter_show_filter(mon_pdev, mode, pfilter);
569 		mon_pdev->filter[mode][srng_type] = *pfilter;
570 	} else /* reset the filter */
571 		mon_pdev->filter[mode][srng_type] = *pfilter;
572 }
573 #else
dp_mon_filter_set_reset_mon_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)574 static void dp_mon_filter_set_reset_mon_dest(struct dp_pdev *pdev,
575 					     struct dp_mon_filter *pfilter)
576 {
577 }
578 #endif
579 
dp_mon_filter_setup_mon_mode_1_0(struct dp_pdev * pdev)580 void dp_mon_filter_setup_mon_mode_1_0(struct dp_pdev *pdev)
581 {
582 	struct dp_mon_filter filter = {0};
583 	struct dp_soc *soc = NULL;
584 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
585 	enum dp_mon_filter_srng_type srng_type =
586 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
587 	struct dp_mon_pdev *mon_pdev;
588 
589 	if (!pdev) {
590 		dp_mon_filter_err("pdev Context is null");
591 		return;
592 	}
593 
594 	soc = pdev->soc;
595 	if (!soc) {
596 		dp_mon_filter_err("Soc Context is null");
597 		return;
598 	}
599 
600 	mon_pdev = pdev->monitor_pdev;
601 	filter.valid = true;
602 	dp_mon_filter_set_reset_mon_dest(pdev, &filter);
603 
604 	/* Clear the filter as the same filter will be used to set the
605 	 * monitor status ring
606 	 */
607 	qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
608 
609 	/* Enabled the filter */
610 	filter.valid = true;
611 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
612 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
613 
614 	/* Store the above filter */
615 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
616 	mon_pdev->filter[mode][srng_type] = filter;
617 }
618 
dp_mon_filter_reset_mon_mode_1_0(struct dp_pdev * pdev)619 void dp_mon_filter_reset_mon_mode_1_0(struct dp_pdev *pdev)
620 {
621 	struct dp_mon_filter filter = {0};
622 	struct dp_soc *soc = NULL;
623 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
624 	enum dp_mon_filter_srng_type srng_type =
625 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
626 	struct dp_mon_pdev *mon_pdev;
627 
628 	if (!pdev) {
629 		dp_mon_filter_err("pdev Context is null");
630 		return;
631 	}
632 
633 	soc = pdev->soc;
634 	if (!soc) {
635 		dp_mon_filter_err("Soc Context is null");
636 		return;
637 	}
638 
639 	mon_pdev = pdev->monitor_pdev;
640 	dp_mon_filter_set_reset_mon_dest(pdev, &filter);
641 
642 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
643 	mon_pdev->filter[mode][srng_type] = filter;
644 }
645 
dp_mon_set_reset_mon_filter(struct dp_mon_filter * filter,bool val)646 static void dp_mon_set_reset_mon_filter(struct dp_mon_filter *filter, bool val)
647 {
648 	if (val) {
649 		dp_mon_filter_debug("Set monitor filter settings");
650 		filter->tlv_filter.enable_mon_mac_filter = 1;
651 		filter->tlv_filter.enable_md = 1;
652 		filter->tlv_filter.md_mgmt_filter = FILTER_MGMT_ALL;
653 		filter->tlv_filter.md_ctrl_filter = FILTER_CTRL_ALL;
654 		filter->tlv_filter.md_data_filter = 0;
655 	} else {
656 		dp_mon_filter_debug("Reset monitor filter settings");
657 		filter->tlv_filter.enable_mon_mac_filter = 0;
658 		filter->tlv_filter.enable_md = 0;
659 		filter->tlv_filter.md_mgmt_filter = 0;
660 		filter->tlv_filter.md_ctrl_filter = 0;
661 		filter->tlv_filter.md_data_filter = 0;
662 	}
663 }
664 
dp_mon_set_reset_mon_mac_filter_1_0(struct dp_pdev * pdev,bool val)665 void dp_mon_set_reset_mon_mac_filter_1_0(struct dp_pdev *pdev, bool val)
666 {
667 	struct dp_mon_filter filter = {0};
668 	enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE;
669 	enum dp_mon_filter_srng_type srng_type =
670 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
671 	struct dp_mon_pdev *mon_pdev;
672 
673 	if (!pdev) {
674 		dp_mon_filter_err("pdev Context is null");
675 		return;
676 	}
677 
678 	mon_pdev = pdev->monitor_pdev;
679 
680 	/* Set monitor buffer filter */
681 	dp_mon_filter_debug("Updating monitor buffer filter");
682 	filter.valid = true;
683 	dp_mon_set_reset_mon_filter(&filter, val);
684 	dp_mon_filter_set_reset_mon_dest(pdev, &filter);
685 
686 	/* Set status cmn filter */
687 	dp_mon_filter_debug("Updating monitor status cmn filter");
688 	qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
689 	filter.valid = true;
690 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
691 	dp_mon_set_reset_mon_filter(&filter, val);
692 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
693 
694 	/* Store the above filter */
695 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
696 	mon_pdev->filter[mode][srng_type] = filter;
697 }
698 
699 #ifdef WDI_EVENT_ENABLE
dp_mon_filter_setup_rx_pkt_log_full_1_0(struct dp_pdev * pdev)700 void dp_mon_filter_setup_rx_pkt_log_full_1_0(struct dp_pdev *pdev)
701 {
702 	struct dp_mon_filter filter = {0};
703 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
704 	enum dp_mon_filter_srng_type srng_type =
705 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
706 	struct dp_mon_pdev *mon_pdev;
707 
708 	if (!pdev) {
709 		dp_mon_filter_err("pdev Context is null");
710 		return;
711 	}
712 
713 	mon_pdev = pdev->monitor_pdev;
714 	/* Enabled the filter */
715 	filter.valid = true;
716 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
717 
718 	/* Setup the filter */
719 	filter.tlv_filter.packet_header = 1;
720 	filter.tlv_filter.msdu_start = 1;
721 	filter.tlv_filter.msdu_end = 1;
722 	filter.tlv_filter.mpdu_end = 1;
723 	filter.tlv_filter.attention = 1;
724 
725 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
726 	mon_pdev->filter[mode][srng_type] = filter;
727 }
728 
dp_mon_filter_reset_rx_pkt_log_full_1_0(struct dp_pdev * pdev)729 void dp_mon_filter_reset_rx_pkt_log_full_1_0(struct dp_pdev *pdev)
730 {
731 	struct dp_mon_filter filter = {0};
732 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE;
733 	enum dp_mon_filter_srng_type srng_type =
734 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
735 	struct dp_mon_pdev *mon_pdev;
736 
737 	if (!pdev) {
738 		dp_mon_filter_err("pdev Context is null");
739 		return;
740 	}
741 
742 	mon_pdev = pdev->monitor_pdev;
743 	mon_pdev->filter[mode][srng_type] = filter;
744 }
745 
dp_mon_filter_setup_rx_pkt_log_lite_1_0(struct dp_pdev * pdev)746 void dp_mon_filter_setup_rx_pkt_log_lite_1_0(struct dp_pdev *pdev)
747 {
748 	struct dp_mon_filter filter = {0};
749 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
750 	enum dp_mon_filter_srng_type srng_type =
751 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
752 	struct dp_mon_pdev *mon_pdev;
753 
754 	if (!pdev) {
755 		dp_mon_filter_err("pdev Context is null");
756 		return;
757 	}
758 
759 	mon_pdev = pdev->monitor_pdev;
760 	/* Enabled the filter */
761 	filter.valid = true;
762 	dp_mon_filter_set_status_cmn(mon_pdev, &filter);
763 
764 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
765 	mon_pdev->filter[mode][srng_type] = filter;
766 }
767 
dp_mon_filter_reset_rx_pkt_log_lite_1_0(struct dp_pdev * pdev)768 void dp_mon_filter_reset_rx_pkt_log_lite_1_0(struct dp_pdev *pdev)
769 {
770 	struct dp_mon_filter filter = {0};
771 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE;
772 	enum dp_mon_filter_srng_type srng_type =
773 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
774 	struct dp_mon_pdev *mon_pdev;
775 
776 	if (!pdev) {
777 		dp_mon_filter_err("pdev Context is null");
778 		return;
779 	}
780 
781 	mon_pdev = pdev->monitor_pdev;
782 
783 	mon_pdev->filter[mode][srng_type] = filter;
784 }
785 
786 #ifdef QCA_MONITOR_PKT_SUPPORT
787 static
dp_mon_filter_set_reset_rx_pkt_log_cbf_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)788 void dp_mon_filter_set_reset_rx_pkt_log_cbf_dest(struct dp_pdev *pdev,
789 						 struct dp_mon_filter *pfilter)
790 {
791 	struct dp_soc *soc = pdev->soc;
792 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
793 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
794 	enum dp_mon_filter_srng_type srng_type;
795 
796 	srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
797 			DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
798 			DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
799 
800 	/*set the filter */
801 	if (pfilter->valid) {
802 		dp_mon_filter_set_cbf_cmn(pdev, pfilter);
803 
804 		dp_mon_filter_show_filter(mon_pdev, mode, pfilter);
805 		mon_pdev->filter[mode][srng_type] = *pfilter;
806 	} else /* reset the filter */
807 		mon_pdev->filter[mode][srng_type] = *pfilter;
808 }
809 #else
810 static
dp_mon_filter_set_reset_rx_pkt_log_cbf_dest(struct dp_pdev * pdev,struct dp_mon_filter * pfilter)811 void dp_mon_filter_set_reset_rx_pkt_log_cbf_dest(struct dp_pdev *pdev,
812 						 struct dp_mon_filter *pfilter)
813 {
814 }
815 #endif
816 
dp_mon_filter_setup_rx_pkt_log_cbf_1_0(struct dp_pdev * pdev)817 void dp_mon_filter_setup_rx_pkt_log_cbf_1_0(struct dp_pdev *pdev)
818 {
819 	struct dp_mon_filter filter = {0};
820 	struct dp_soc *soc = NULL;
821 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
822 	enum dp_mon_filter_srng_type srng_type =
823 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
824 	struct dp_mon_pdev *mon_pdev = NULL;
825 
826 	if (!pdev) {
827 		dp_mon_filter_err("pdev Context is null");
828 		return;
829 	}
830 
831 	mon_pdev = pdev->monitor_pdev;
832 	soc = pdev->soc;
833 	if (!soc) {
834 		dp_mon_filter_err("Soc Context is null");
835 		return;
836 	}
837 
838 	/* Enabled the filter */
839 	filter.valid = true;
840 	dp_mon_filter_set_status_cbf(pdev, &filter);
841 	dp_mon_filter_show_filter(mon_pdev, mode, &filter);
842 	mon_pdev->filter[mode][srng_type] = filter;
843 
844 	/* Clear the filter as the same filter will be used to set the
845 	 * monitor status ring
846 	 */
847 	qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter));
848 
849 	filter.valid = true;
850 	dp_mon_filter_set_reset_rx_pkt_log_cbf_dest(pdev, &filter);
851 }
852 
dp_mon_filter_reset_rx_pktlog_cbf_1_0(struct dp_pdev * pdev)853 void dp_mon_filter_reset_rx_pktlog_cbf_1_0(struct dp_pdev *pdev)
854 {
855 	struct dp_mon_filter filter = {0};
856 	struct dp_soc *soc = NULL;
857 	enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE;
858 	enum dp_mon_filter_srng_type srng_type =
859 				DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF;
860 	struct dp_mon_pdev *mon_pdev = NULL;
861 
862 	if (!pdev) {
863 		QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR,
864 			  FL("pdev Context is null"));
865 		return;
866 	}
867 
868 	mon_pdev = pdev->monitor_pdev;
869 	soc = pdev->soc;
870 	if (!soc) {
871 		QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR,
872 			  FL("Soc Context is null"));
873 		return;
874 	}
875 
876 	dp_mon_filter_set_reset_rx_pkt_log_cbf_dest(pdev, &filter);
877 
878 	srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS;
879 	mon_pdev->filter[mode][srng_type] = filter;
880 }
881 #endif /* WDI_EVENT_ENABLE */
882 
883 #ifdef WLAN_DP_RESET_MON_BUF_RING_FILTER
884 /**
885  * dp_mon_should_reset_buf_ring_filter() - Reset the monitor buf ring filter
886  * @pdev: DP PDEV handle
887  *
888  * WIN has targets which does not support monitor mode, but still do the
889  * monitor mode init/deinit, only the rxdma1_enable flag will be set to 0.
890  * MCL need to do the monitor buffer ring filter reset always, but this is
891  * not needed for WIN targets where rxdma1 is not enabled (the indicator
892  * that monitor mode is not enabled.
893  * This function is used as WAR till WIN cleans up the monitor mode
894  * function for targets where monitor mode is not enabled.
895  *
896  * Return: true
897  */
dp_mon_should_reset_buf_ring_filter(struct dp_pdev * pdev)898 static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev)
899 {
900 	return (pdev->monitor_pdev->mvdev) ? true : false;
901 }
902 #else
dp_mon_should_reset_buf_ring_filter(struct dp_pdev * pdev)903 static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev)
904 {
905 	return false;
906 }
907 #endif
908 
909 #ifdef QCA_MONITOR_PKT_SUPPORT
dp_mon_filter_dest_update(struct dp_pdev * pdev,struct dp_mon_filter * pfilter,bool * pmon_mode_set)910 static QDF_STATUS dp_mon_filter_dest_update(struct dp_pdev *pdev,
911 					    struct dp_mon_filter *pfilter,
912 					    bool *pmon_mode_set)
913 {
914 	struct dp_soc *soc = pdev->soc;
915 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
916 	enum dp_mon_filter_srng_type srng_type;
917 	QDF_STATUS status = QDF_STATUS_SUCCESS;
918 	uint32_t target_type = hal_get_target_type(soc->hal_soc);
919 
920 	srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
921 			DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
922 			DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
923 
924 	dp_mon_filter_h2t_setup(soc, pdev, srng_type, pfilter);
925 
926 	*pmon_mode_set = pfilter->valid;
927 	if (dp_mon_should_reset_buf_ring_filter(pdev) || *pmon_mode_set) {
928 		status = dp_mon_ht2_rx_ring_cfg(soc, pdev,
929 						srng_type,
930 						&pfilter->tlv_filter);
931 	} else {
932 		/*
933 		 * For WIN case the monitor buffer ring is used and it does need
934 		 * reset when monitor mode gets enabled/disabled.
935 		 */
936 		if (soc->wlan_cfg_ctx->rxdma1_enable ||
937 		    target_type == TARGET_TYPE_QCN9160) {
938 			if (mon_pdev->monitor_configured || *pmon_mode_set) {
939 				status = dp_mon_ht2_rx_ring_cfg(soc, pdev,
940 								srng_type,
941 								&pfilter->tlv_filter);
942 			}
943 		}
944 	}
945 
946 	return status;
947 }
948 
dp_mon_filter_dest_reset(struct dp_pdev * pdev)949 static void dp_mon_filter_dest_reset(struct dp_pdev *pdev)
950 {
951 	struct dp_soc *soc = pdev->soc;
952 	enum dp_mon_filter_srng_type srng_type;
953 
954 	srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ?
955 			DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF :
956 			DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF);
957 
958 	dp_mon_filter_reset_mon_srng(soc, pdev, srng_type);
959 }
960 #else
dp_mon_filter_dest_update(struct dp_pdev * pdev,struct dp_mon_filter * pfilter,bool * pmon_mode_set)961 static QDF_STATUS dp_mon_filter_dest_update(struct dp_pdev *pdev,
962 					    struct dp_mon_filter *pfilter,
963 					    bool *pmon_mode_set)
964 {
965 	return QDF_STATUS_SUCCESS;
966 }
967 
dp_mon_filter_dest_reset(struct dp_pdev * pdev)968 static void dp_mon_filter_dest_reset(struct dp_pdev *pdev)
969 {
970 }
971 #endif
972 
dp_mon_filter_update_1_0(struct dp_pdev * pdev)973 QDF_STATUS dp_mon_filter_update_1_0(struct dp_pdev *pdev)
974 {
975 	struct dp_soc *soc;
976 	bool mon_mode_set = false;
977 	struct dp_mon_filter filter = {0};
978 	QDF_STATUS status = QDF_STATUS_SUCCESS;
979 
980 	if (!pdev) {
981 		dp_mon_filter_err("pdev Context is null");
982 		return QDF_STATUS_E_FAILURE;
983 	}
984 
985 	soc = pdev->soc;
986 	if (!soc) {
987 		dp_mon_filter_err("Soc Context is null");
988 		return QDF_STATUS_E_FAILURE;
989 	}
990 
991 	status = dp_mon_filter_check_co_exist(pdev);
992 	if (status != QDF_STATUS_SUCCESS)
993 		return status;
994 
995 	/*
996 	 * Setup the filters for the monitor destination ring.
997 	 */
998 	status = dp_mon_filter_dest_update(pdev, &filter,
999 					   &mon_mode_set);
1000 
1001 	if (status != QDF_STATUS_SUCCESS) {
1002 		dp_mon_filter_err("%pK: Monitor destination ring filter setting failed",
1003 				  soc);
1004 		return QDF_STATUS_E_FAILURE;
1005 	}
1006 
1007 	/*
1008 	 * Setup the filters for the status ring.
1009 	 */
1010 	qdf_mem_zero(&(filter), sizeof(filter));
1011 	dp_mon_filter_h2t_setup(soc, pdev,
1012 				DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS,
1013 				&filter);
1014 
1015 	/*
1016 	 * Reset the monitor filters if the all the modes for the status rings
1017 	 * are disabled. This is done to prevent the HW backpressure from the
1018 	 * monitor destination ring in case the status ring filters
1019 	 * are not enabled.
1020 	 */
1021 	if (!filter.valid && mon_mode_set)
1022 		dp_mon_filter_dest_reset(pdev);
1023 
1024 	if (dp_mon_ht2_rx_ring_cfg(soc, pdev,
1025 				   DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS,
1026 				   &filter.tlv_filter) != QDF_STATUS_SUCCESS) {
1027 		dp_mon_filter_err("%pK: Monitor status ring filter setting failed",
1028 				  soc);
1029 		dp_mon_filter_dest_reset(pdev);
1030 		return QDF_STATUS_E_FAILURE;
1031 	}
1032 
1033 	return status;
1034 }
1035 
1036 #ifdef QCA_MAC_FILTER_FW_SUPPORT
dp_mon_mac_filter_set(uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)1037 void dp_mon_mac_filter_set(uint32_t *msg_word,
1038 			   struct htt_rx_ring_tlv_filter *tlv_filter)
1039 {
1040 	if (!msg_word || !tlv_filter)
1041 		return;
1042 
1043 	if (tlv_filter->enable_mon_mac_filter > 0)
1044 		HTT_RX_RING_SELECTION_CFG_RXPCU_FILTER_SET(*msg_word, 1);
1045 	else
1046 		HTT_RX_RING_SELECTION_CFG_RXPCU_FILTER_SET(*msg_word, 0);
1047 }
1048 #endif
1049 
1050 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
1051 /*
1052  * dp_cfr_filter_1_0() -  Configure HOST RX monitor status ring for CFR
1053  *
1054  * @soc_hdl: Datapath soc handle
1055  * @pdev_id: id of data path pdev handle
1056  * @enable: Enable/Disable CFR
1057  * @filter_val: Flag to select Filter for monitor mode
1058  * @cfr_enable_monitor_mode: Flag to be enabled when scan radio is brought up
1059  * in special vap mode
1060  *
1061  * Return: void
1062  */
dp_cfr_filter_1_0(struct cdp_soc_t * soc_hdl,uint8_t pdev_id,bool enable,struct cdp_monitor_filter * filter_val,bool cfr_enable_monitor_mode)1063 static void dp_cfr_filter_1_0(struct cdp_soc_t *soc_hdl,
1064 			      uint8_t pdev_id,
1065 			      bool enable,
1066 			      struct cdp_monitor_filter *filter_val,
1067 			      bool cfr_enable_monitor_mode)
1068 {
1069 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
1070 	struct dp_pdev *pdev = NULL;
1071 	struct htt_rx_ring_tlv_filter htt_tlv_filter = {0};
1072 	int max_mac_rings;
1073 	uint8_t mac_id = 0;
1074 	struct dp_mon_pdev *mon_pdev;
1075 
1076 	pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
1077 	if (!pdev) {
1078 		dp_mon_err("pdev is NULL");
1079 		return;
1080 	}
1081 
1082 	mon_pdev = pdev->monitor_pdev;
1083 
1084 	if (mon_pdev->mvdev) {
1085 		if (enable && cfr_enable_monitor_mode)
1086 			pdev->cfr_rcc_mode = true;
1087 		else
1088 			pdev->cfr_rcc_mode = false;
1089 		return;
1090 	}
1091 
1092 	soc = pdev->soc;
1093 	pdev->cfr_rcc_mode = false;
1094 	max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx);
1095 	dp_update_num_mac_rings_for_dbs(soc, &max_mac_rings);
1096 
1097 	dp_mon_debug("Max_mac_rings %d", max_mac_rings);
1098 	dp_mon_info("enable : %d, mode: 0x%x", enable, filter_val->mode);
1099 
1100 	if (enable) {
1101 		pdev->cfr_rcc_mode = true;
1102 
1103 		htt_tlv_filter.ppdu_start = 1;
1104 		htt_tlv_filter.ppdu_end = 1;
1105 		htt_tlv_filter.ppdu_end_user_stats = 1;
1106 		htt_tlv_filter.ppdu_end_user_stats_ext = 1;
1107 		htt_tlv_filter.ppdu_end_status_done = 1;
1108 		htt_tlv_filter.mpdu_start = 1;
1109 		htt_tlv_filter.offset_valid = false;
1110 
1111 		htt_tlv_filter.enable_fp =
1112 			(filter_val->mode & MON_FILTER_PASS) ? 1 : 0;
1113 		htt_tlv_filter.enable_md = 0;
1114 		htt_tlv_filter.enable_mo =
1115 			(filter_val->mode & MON_FILTER_OTHER) ? 1 : 0;
1116 		htt_tlv_filter.fp_mgmt_filter = filter_val->fp_mgmt;
1117 		htt_tlv_filter.fp_ctrl_filter = filter_val->fp_ctrl;
1118 		htt_tlv_filter.fp_data_filter = filter_val->fp_data;
1119 		htt_tlv_filter.mo_mgmt_filter = filter_val->mo_mgmt;
1120 		htt_tlv_filter.mo_ctrl_filter = filter_val->mo_ctrl;
1121 		htt_tlv_filter.mo_data_filter = filter_val->mo_data;
1122 	}
1123 
1124 	for (mac_id = 0;
1125 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
1126 	     mac_id++) {
1127 		int mac_for_pdev =
1128 			dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id);
1129 
1130 		htt_h2t_rx_ring_cfg(soc->htt_handle,
1131 				    mac_for_pdev,
1132 				    soc->rxdma_mon_status_ring[mac_id].hal_srng,
1133 				    RXDMA_MONITOR_STATUS,
1134 				    RX_MON_STATUS_BUF_SIZE,
1135 				    &htt_tlv_filter);
1136 	}
1137 }
1138 
dp_cfr_filter_register_1_0(struct cdp_ops * ops)1139 void dp_cfr_filter_register_1_0(struct cdp_ops *ops)
1140 {
1141 	ops->mon_ops->txrx_cfr_filter = dp_cfr_filter_1_0;
1142 }
1143 #endif
1144