xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/monitor/dp_mon.h (revision 8c3c4172fbd442a68f7b879958acb6794236aee0)
1 /*
2  * Copyright (c) 2016-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 #ifndef _DP_MON_H_
19 #define _DP_MON_H_
20 
21 #include "qdf_trace.h"
22 #include "dp_internal.h"
23 #include "dp_types.h"
24 #include "dp_htt.h"
25 
26 #include <dp_mon_filter.h>
27 #ifdef WLAN_TX_PKT_CAPTURE_ENH
28 #include "dp_tx_capture.h"
29 #endif
30 
31 #define DP_INTR_POLL_TIMER_MS	5
32 
33 #define MON_VDEV_TIMER_INIT 0x1
34 #define MON_VDEV_TIMER_RUNNING 0x2
35 
36 /* Budget to reap monitor status ring */
37 #define DP_MON_REAP_BUDGET 1024
38 #define MON_BUF_MIN_ENTRIES 64
39 
40 #define RNG_ERR		"SRNG setup failed for"
41 #define dp_mon_info(params...) \
42 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_MON, ## params)
43 #define dp_mon_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_MON, params)
44 #define dp_mon_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_MON, params)
45 #define dp_mon_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_MON, params)
46 
47 #ifdef QCA_ENHANCED_STATS_SUPPORT
48 typedef struct dp_peer_extd_tx_stats dp_mon_peer_tx_stats;
49 typedef struct dp_peer_extd_rx_stats dp_mon_peer_rx_stats;
50 
51 #define DP_UPDATE_MON_STATS(_tgtobj, _srcobj) \
52 	DP_UPDATE_EXTD_STATS(_tgtobj, _srcobj)
53 #endif
54 
55 #ifndef WLAN_TX_PKT_CAPTURE_ENH
56 struct dp_pdev_tx_capture {
57 };
58 
59 struct dp_peer_tx_capture {
60 };
61 #endif
62 
63 #ifndef WLAN_TX_PKT_CAPTURE_ENH
64 static inline void
65 dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev,
66 					   void *data,
67 					   uint32_t ppdu_id,
68 					   uint32_t size)
69 {
70 }
71 #endif
72 
73 #ifdef DP_CON_MON_MSI_ENABLED
74 static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc)
75 {
76 	return false;
77 }
78 #else
79 static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc)
80 {
81 	return true;
82 }
83 #endif
84 
85 /*
86  * dp_mon_soc_attach() - DP monitor soc attach
87  * @soc: Datapath SOC handle
88  *
89  * Return: QDF_STATUS_SUCCESS: Success
90  *         QDF_STATUS_E_NOMEM: Error
91  */
92 QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc);
93 
94 /*
95  * dp_mon_soc_detach() - DP monitor soc detach
96  * @soc: Datapath SOC handle
97  *
98  * Return: QDF_STATUS_SUCCESS: Success
99  *         QDF_STATUS_E_FAILURE: Error
100  */
101 QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc);
102 
103 /*
104  * dp_mon_soc_cfg_init() - DP monitor soc config init
105  * @soc: Datapath SOC handle
106  *
107  * Return: QDF_STATUS_SUCCESS: Success
108  *         QDF_STATUS_E_FAILURE: Error
109  */
110 QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc);
111 
112 /*
113  * dp_mon_pdev_attach() - DP monitor pdev attach
114  * @pdev: Datapath pdev handle
115  *
116  * Return: QDF_STATUS_SUCCESS: Success
117  *         QDF_STATUS_E_NOMEM: Error
118  */
119 QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev);
120 
121 /*
122  * dp_mon_pdev_detach() - DP monitor pdev detach
123  * @pdev: Datapath pdev handle
124  *
125  * Return: QDF_STATUS_SUCCESS: Success
126  *         QDF_STATUS_E_FAILURE: Error
127  */
128 QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev);
129 
130 /*
131  * dp_mon_pdev_init() - DP monitor pdev init
132  * @pdev: Datapath pdev handle
133  *
134  * Return: QDF_STATUS_SUCCESS: Success
135  *         QDF_STATUS_E_FAILURE: Error
136  */
137 QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev);
138 
139 /*
140  * dp_mon_pdev_deinit() - DP monitor pdev deinit
141  * @pdev: Datapath pdev handle
142  *
143  * Return: QDF_STATUS_SUCCESS: Success
144  *         QDF_STATUS_E_FAILURE: Error
145  */
146 QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev);
147 
148 /*
149  * dp_mon_vdev_attach() - DP monitor vdev attach
150  * @vdev: Datapath vdev handle
151  *
152  * Return: QDF_STATUS_SUCCESS: Success
153  *         QDF_STATUS_E_NOMEM: Error
154  */
155 QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev);
156 
157 /*
158  * dp_mon_vdev_detach() - DP monitor vdev detach
159  * @vdev: Datapath vdev handle
160  *
161  * Return: QDF_STATUS_SUCCESS: Success
162  *         QDF_STATUS_E_FAILURE: Error
163  */
164 QDF_STATUS dp_mon_vdev_detach(struct dp_vdev *vdev);
165 
166 /*
167  * dp_mon_peer_attach() - DP monitor peer attach
168  * @peer: Datapath peer handle
169  *
170  * Return: QDF_STATUS_SUCCESS: Success
171  *         QDF_STATUS_E_NOMEM: Error
172  */
173 #if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(FEATURE_PERPKT_INFO)
174 QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer);
175 #else
176 static inline
177 QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer)
178 {
179 	return QDF_STATUS_SUCCESS;
180 }
181 #endif
182 
183 /*
184  * dp_mon_peer_detach() - DP monitor peer detach
185  * @peer: Datapath peer handle
186  *
187  * Return: QDF_STATUS_SUCCESS: Success
188  *         QDF_STATUS_E_FAILURE: Error
189  */
190 QDF_STATUS dp_mon_peer_detach(struct dp_peer *peer);
191 
192 /*
193  * dp_mon_peer_get_rdkstats_ctx() - Get rdk stats context from monitor peer
194  * @peer: Datapath peer handle
195  *
196  * Return: rdkstats_ctx
197  */
198 struct cdp_peer_rate_stats_ctx *dp_mon_peer_get_rdkstats_ctx(struct dp_peer *peer);
199 
200 #ifdef QCA_ENHANCED_STATS_SUPPORT
201 /*
202  * dp_mon_peer_reset_stats() - Reset monitor peer stats
203  * @peer: Datapath peer handle
204  *
205  * Return: none
206  */
207 void dp_mon_peer_reset_stats(struct dp_peer *peer);
208 
209 /*
210  * dp_mon_peer_get_stats() - Get monitor peer stats
211  *
212  * @peer: Datapath peer handle
213  * @arg: Pointer to stats struct
214  * @type: Update type
215  *
216  * Return: none
217  */
218 void dp_mon_peer_get_stats(struct dp_peer *peer, void *arg,
219 			   enum cdp_stat_update_type type);
220 
221 /*
222  * dp_mon_invalid_peer_update_pdev_stats() - Update pdev stats from
223  *					invalid monitor peer
224  * @pdev: Datapath pdev handle
225  *
226  * Return: none
227  */
228 void dp_mon_invalid_peer_update_pdev_stats(struct dp_pdev *pdev);
229 
230 /*
231  * dp_mon_peer_get_stats_param() - Get stats param value from monitor peer
232  * @peer: Datapath peer handle
233  * @type: Stats type requested
234  * @buf: Pointer to buffer for stats param
235  *
236  * Return: QDF_STATUS
237  */
238 QDF_STATUS dp_mon_peer_get_stats_param(struct dp_peer *peer,
239 				       enum cdp_peer_stats_type type,
240 				       cdp_peer_stats_param_t *buf);
241 #else
242 static inline void dp_mon_peer_reset_stats(struct dp_peer *peer)
243 {
244 }
245 
246 static inline
247 void dp_mon_peer_get_stats(struct dp_peer *peer, void *arg,
248 			   enum cdp_stat_update_type type)
249 {
250 }
251 
252 static inline void dp_mon_invalid_peer_update_pdev_stats(struct dp_pdev *pdev)
253 {
254 }
255 
256 static inline
257 QDF_STATUS dp_mon_peer_get_stats_param(struct dp_peer *peer,
258 				       enum cdp_peer_stats_type type,
259 				       cdp_peer_stats_param_t *buf)
260 {
261 	return QDF_STATUS_E_FAILURE;
262 }
263 #endif
264 
265 /*
266  * dp_mon_cdp_ops_register() - Register monitor cdp ops
267  * @soc: Datapath soc handle
268  *
269  */
270 void dp_mon_cdp_ops_register(struct dp_soc *soc);
271 
272 /*
273  * dp_mon_cdp_ops_deregister() - deregister monitor cdp ops
274  * @soc: Datapath soc handle
275  *
276  */
277 void dp_mon_cdp_ops_deregister(struct dp_soc *soc);
278 
279 /*
280  * dp_mon_intr_ops_deregister() - deregister monitor interrupt ops
281  * @soc: Datapath soc handle
282  *
283  */
284 void dp_mon_intr_ops_deregister(struct dp_soc *soc);
285 
286 /*
287  * dp_mon_feature_ops_deregister() - deregister monitor feature ops
288  * @soc: Datapath soc handle
289  *
290  */
291 void dp_mon_feature_ops_deregister(struct dp_soc *soc);
292 
293 /*
294  * dp_mon_ops_free() - free monitor ops
295  * @soc: Datapath soc handle
296  *
297  */
298 void dp_mon_ops_free(struct dp_soc *soc);
299 
300 /*
301  * dp_mon_ops_register() - Register monitor ops
302  * @soc: Datapath soc handle
303  *
304  */
305 void dp_mon_ops_register(struct dp_soc *soc);
306 
307 #ifndef DISABLE_MON_CONFIG
308 void dp_mon_register_intr_ops(struct dp_soc *soc);
309 #else
310 static inline void dp_mon_register_intr_ops(struct dp_soc *soc)
311 {}
312 #endif
313 
314 /*
315  * dp_mon_htt_srng_setup() - DP mon htt srng setup
316  * @soc: Datapath soc handle
317  * @pdev: Datapath pdev handle
318  * @mac_id: mac id
319  * @mac_for_pdev: mac id mapped pdev
320  *
321  * Return: QDF_STATUS_SUCCESS: Success
322  *         QDF_STATUS_E_FAILURE: Error
323  */
324 QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc,
325 				 struct dp_pdev *pdev,
326 				 int mac_id,
327 				 int mac_for_pdev);
328 
329 /*
330  * dp_config_debug_sniffer()- API to enable/disable debug sniffer
331  * @pdev: DP_PDEV handle
332  * @val: user provided value
333  *
334  * Return: 0 for success. nonzero for failure.
335  */
336 #if defined(QCA_MCOPY_SUPPORT) || defined(QCA_TX_CAPTURE_SUPPORT)
337 QDF_STATUS
338 dp_config_debug_sniffer(struct dp_pdev *pdev, int val);
339 #else
340 static inline QDF_STATUS
341 dp_config_debug_sniffer(struct dp_pdev *pdev, int val) {
342 	return QDF_STATUS_E_INVAL;
343 }
344 #endif /* QCA_MCOPY_SUPPORT || QCA_TX_CAPTURE_SUPPORT */
345 
346 /*
347  * dp_htt_ppdu_stats_attach() - attach resources for HTT PPDU stats processing
348  * @pdev: Datapath PDEV handle
349  *
350  * Return: QDF_STATUS_SUCCESS: Success
351  *         QDF_STATUS_E_NOMEM: Error
352  */
353 QDF_STATUS dp_htt_ppdu_stats_attach(struct dp_pdev *pdev);
354 
355 /*
356  * dp_htt_ppdu_stats_detach() - detach stats resources
357  * @pdev: Datapath PDEV handle
358  *
359  * Return: void
360  */
361 void dp_htt_ppdu_stats_detach(struct dp_pdev *pdev);
362 
363 /*
364  *dp_set_bpr_enable() - API to enable/disable bpr feature
365  *@pdev_handle: DP_PDEV handle.
366  *@val: Provided value.
367  *
368  *Return: 0 for success. nonzero for failure.
369  */
370 #ifdef QCA_SUPPORT_BPR
371 QDF_STATUS
372 dp_set_bpr_enable(struct dp_pdev *pdev, int val);
373 #endif
374 
375 #ifdef ATH_SUPPORT_NAC
376 int dp_set_filter_neigh_peers(struct dp_pdev *pdev,
377 				     bool val);
378 #endif /* ATH_SUPPORT_NAC */
379 
380 #ifdef WLAN_ATF_ENABLE
381 void dp_set_atf_stats_enable(struct dp_pdev *pdev, bool value);
382 #endif
383 
384 /**
385  * dp_set_bsscolor() - sets bsscolor for tx capture
386  * @pdev: Datapath PDEV handle
387  * @bsscolor: new bsscolor
388  */
389 void
390 dp_mon_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor);
391 
392 /**
393  * dp_pdev_get_filter_ucast_data() - get DP PDEV monitor ucast filter
394  * @soc : data path soc handle
395  * @pdev_id : pdev_id
396  * Return: true on ucast filter flag set
397  */
398 bool dp_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle);
399 
400 /**
401  * dp_pdev_get_filter_mcast_data() - get DP PDEV monitor mcast filter
402  * @pdev_handle: Datapath PDEV handle
403  * Return: true on mcast filter flag set
404  */
405 bool dp_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle);
406 
407 /**
408  * dp_pdev_get_filter_non_data() - get DP PDEV monitor non_data filter
409  * @pdev_handle: Datapath PDEV handle
410  * Return: true on non data filter flag set
411  */
412 bool dp_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle);
413 
414 /*
415  * dp_set_pktlog_wifi3() - attach txrx vdev
416  * @pdev: Datapath PDEV handle
417  * @event: which event's notifications are being subscribed to
418  * @enable: WDI event subscribe or not. (True or False)
419  *
420  * Return: Success, NULL on failure
421  */
422 #ifdef WDI_EVENT_ENABLE
423 int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
424 			bool enable);
425 #endif
426 
427 /* MCL specific functions */
428 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG)
429 /**
430  * dp_pktlogmod_exit() - API to cleanup pktlog info
431  * @pdev: Pdev handle
432  *
433  * Return: none
434  */
435 void dp_pktlogmod_exit(struct dp_pdev *pdev);
436 #else
437 static inline
438 void dp_pktlogmod_exit(struct dp_pdev *handle)
439 {
440 }
441 #endif
442 
443 #ifdef QCA_MONITOR_PKT_SUPPORT
444 /**
445  * dp_vdev_set_monitor_mode_buf_rings () - set monitor mode buf rings
446  *
447  * Allocate SW descriptor pool, buffers, link descriptor memory
448  * Initialize monitor related SRNGs
449  *
450  * @pdev: DP pdev object
451  *
452  * Return: void
453  */
454 void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev);
455 
456 /**
457  * dp_vdev_set_monitor_mode_rings () - set monitor mode rings
458  *
459  * Allocate SW descriptor pool, buffers, link descriptor memory
460  * Initialize monitor related SRNGs
461  *
462  * @pdev: DP pdev object
463  *
464  * Return: QDF_STATUS
465  */
466 QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev,
467 					  uint8_t delayed_replenish);
468 
469 #else
470 static inline void
471 dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev)
472 {
473 }
474 
475 static inline QDF_STATUS
476 dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev,
477 			       uint8_t delayed_replenish)
478 {
479 	return QDF_STATUS_SUCCESS;
480 }
481 #endif
482 
483 #if defined(WDI_EVENT_ENABLE) &&\
484 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
485 /*
486  * dp_ppdu_stats_ind_handler() - PPDU stats msg handler
487  * @htt_soc:	 HTT SOC handle
488  * @msg_word:    Pointer to payload
489  * @htt_t2h_msg: HTT msg nbuf
490  *
491  * Return: True if buffer should be freed by caller.
492  */
493 bool dp_ppdu_stats_ind_handler(struct htt_soc *soc,
494 			       uint32_t *msg_word,
495 			       qdf_nbuf_t htt_t2h_msg);
496 #endif
497 
498 struct dp_mon_ops {
499 	QDF_STATUS (*mon_soc_cfg_init)(struct dp_soc *soc);
500 	QDF_STATUS (*mon_soc_attach)(struct dp_soc *soc);
501 	QDF_STATUS (*mon_soc_detach)(struct dp_soc *soc);
502 	QDF_STATUS (*mon_pdev_alloc)(struct dp_pdev *pdev);
503 	QDF_STATUS (*mon_soc_init)(struct dp_soc *soc);
504 	void (*mon_soc_deinit)(struct dp_soc *soc);
505 	void (*mon_pdev_free)(struct dp_pdev *pdev);
506 	QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev);
507 	QDF_STATUS (*mon_pdev_detach)(struct dp_pdev *pdev);
508 	QDF_STATUS (*mon_pdev_init)(struct dp_pdev *pdev);
509 	QDF_STATUS (*mon_pdev_deinit)(struct dp_pdev *pdev);
510 	QDF_STATUS (*mon_vdev_attach)(struct dp_vdev *vdev);
511 	QDF_STATUS (*mon_vdev_detach)(struct dp_vdev *vdev);
512 	QDF_STATUS (*mon_peer_attach)(struct dp_peer *peer);
513 	QDF_STATUS (*mon_peer_detach)(struct dp_peer *peer);
514 	struct cdp_peer_rate_stats_ctx *(*mon_peer_get_rdkstats_ctx)(struct dp_peer *peer);
515 	void (*mon_peer_reset_stats)(struct dp_peer *peer);
516 	void (*mon_peer_get_stats)(struct dp_peer *peer, void *arg,
517 				   enum cdp_stat_update_type type);
518 	void (*mon_invalid_peer_update_pdev_stats)(struct dp_pdev *pdev);
519 	QDF_STATUS (*mon_peer_get_stats_param)(struct dp_peer *peer,
520 					       enum cdp_peer_stats_type type,
521 					       cdp_peer_stats_param_t *buf);
522 	QDF_STATUS (*mon_config_debug_sniffer)(struct dp_pdev *pdev, int val);
523 	void (*mon_flush_rings)(struct dp_soc *soc);
524 #if !defined(DISABLE_MON_CONFIG)
525 	QDF_STATUS (*mon_pdev_htt_srng_setup)(struct dp_soc *soc,
526 					      struct dp_pdev *pdev,
527 					      int mac_id,
528 					      int mac_for_pdev);
529 	QDF_STATUS (*mon_soc_htt_srng_setup)(struct dp_soc *soc);
530 #endif
531 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC)
532 	uint32_t (*mon_drop_packets_for_mac)(struct dp_pdev *pdev,
533 					     uint32_t mac_id,
534 					     uint32_t quota);
535 #endif
536 #if defined(DP_CON_MON)
537 	void (*mon_service_rings)(struct  dp_soc *soc, uint32_t quota);
538 #endif
539 #ifndef DISABLE_MON_CONFIG
540 	uint32_t (*mon_rx_process)(struct dp_soc *soc,
541 				   struct dp_intr *int_ctx,
542 				   uint32_t mac_id,
543 				   uint32_t quota);
544 	uint32_t (*mon_tx_process)(struct dp_soc *soc,
545 				   struct dp_intr *int_ctx,
546 				   uint32_t mac_id,
547 				   uint32_t quota);
548 #endif
549 	void (*mon_peer_tx_init)(struct dp_pdev *pdev, struct dp_peer *peer);
550 	void (*mon_peer_tx_cleanup)(struct dp_vdev *vdev,
551 				    struct dp_peer *peer);
552 #ifdef WIFI_MONITOR_SUPPORT
553 	void (*mon_peer_tid_peer_id_update)(struct dp_peer *peer,
554 					    uint16_t peer_id);
555 	void (*mon_tx_ppdu_stats_attach)(struct dp_pdev *pdev);
556 	void (*mon_tx_ppdu_stats_detach)(struct dp_pdev *pdev);
557 	QDF_STATUS (*mon_tx_capture_debugfs_init)(struct dp_pdev *pdev);
558 	void (*mon_peer_tx_capture_filter_check)(struct dp_pdev *pdev,
559 						 struct dp_peer *peer);
560 	QDF_STATUS (*mon_tx_add_to_comp_queue)(struct dp_soc *soc,
561 					       struct dp_tx_desc_s *desc,
562 					       struct hal_tx_completion_status *ts,
563 					       uint16_t peer_id);
564 	QDF_STATUS (*mon_update_msdu_to_list)(struct dp_soc *soc,
565 					      struct dp_pdev *pdev,
566 					      struct dp_peer *peer,
567 					      struct hal_tx_completion_status *ts,
568 					      qdf_nbuf_t netbuf);
569 	QDF_STATUS
570 	(*mon_peer_tx_capture_get_stats)(struct dp_peer *peer,
571 					 struct cdp_peer_tx_capture_stats *sts);
572 	QDF_STATUS
573 	(*mon_pdev_tx_capture_get_stats)(struct dp_pdev *pdev,
574 					 struct cdp_pdev_tx_capture_stats *sts);
575 #endif
576 #if defined(WDI_EVENT_ENABLE) &&\
577 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
578 	bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc,
579 					   uint32_t *msg_word,
580 					   qdf_nbuf_t htt_t2h_msg);
581 #endif
582 	QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev);
583 	void (*mon_htt_ppdu_stats_detach)(struct dp_pdev *pdev);
584 	void (*mon_print_pdev_rx_mon_stats)(struct dp_pdev *pdev);
585 
586 #ifdef WIFI_MONITOR_SUPPORT
587 	void (*mon_print_pdev_tx_capture_stats)(struct dp_pdev *pdev);
588 	QDF_STATUS (*mon_config_enh_tx_capture)(struct dp_pdev *pdev,
589 						uint8_t val);
590 	QDF_STATUS (*mon_tx_peer_filter)(struct dp_pdev *pdev_handle,
591 					 struct dp_peer *peer_handle,
592 					 uint8_t is_tx_pkt_cap_enable,
593 					 uint8_t *peer_mac);
594 #endif
595 #ifdef WLAN_RX_PKT_CAPTURE_ENH
596 	QDF_STATUS (*mon_config_enh_rx_capture)(struct dp_pdev *pdev,
597 						uint8_t val);
598 #endif
599 #ifdef QCA_SUPPORT_BPR
600 	QDF_STATUS (*mon_set_bpr_enable)(struct dp_pdev *pdev, int val);
601 #endif
602 #ifdef ATH_SUPPORT_NAC
603 	int (*mon_set_filter_neigh_peers)(struct dp_pdev *pdev, bool val);
604 #endif
605 #ifdef WLAN_ATF_ENABLE
606 	void (*mon_set_atf_stats_enable)(struct dp_pdev *pdev, bool value);
607 #endif
608 	void (*mon_set_bsscolor)(struct dp_pdev *pdev, uint8_t bsscolor);
609 	bool (*mon_pdev_get_filter_ucast_data)(struct cdp_pdev *pdev_handle);
610 	bool (*mon_pdev_get_filter_non_data)(struct cdp_pdev *pdev_handle);
611 	bool (*mon_pdev_get_filter_mcast_data)(struct cdp_pdev *pdev_handle);
612 #ifdef WDI_EVENT_ENABLE
613 	int (*mon_set_pktlog_wifi3)(struct dp_pdev *pdev, uint32_t event,
614 				    bool enable);
615 #endif
616 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG)
617 	void (*mon_pktlogmod_exit)(struct dp_pdev *pdev);
618 #endif
619 	void (*mon_vdev_set_monitor_mode_buf_rings)(struct dp_pdev *pdev);
620 	QDF_STATUS (*mon_vdev_set_monitor_mode_rings)(struct dp_pdev *pdev,
621 						      uint8_t delayed_replenish);
622 	void (*mon_neighbour_peers_detach)(struct dp_pdev *pdev);
623 #ifdef FEATURE_NAC_RSSI
624 	QDF_STATUS (*mon_filter_neighbour_peer)(struct dp_pdev *pdev,
625 						uint8_t *rx_pkt_hdr);
626 #endif
627 	void (*mon_vdev_timer_init)(struct dp_soc *soc);
628 	void (*mon_vdev_timer_start)(struct dp_soc *soc);
629 	bool (*mon_vdev_timer_stop)(struct dp_soc *soc);
630 	void (*mon_vdev_timer_deinit)(struct dp_soc *soc);
631 	void (*mon_reap_timer_init)(struct dp_soc *soc);
632 	void (*mon_reap_timer_start)(struct dp_soc *soc);
633 	bool (*mon_reap_timer_stop)(struct dp_soc *soc);
634 	void (*mon_reap_timer_deinit)(struct dp_soc *soc);
635 #ifdef QCA_MCOPY_SUPPORT
636 	QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_pdev *pdev,
637 					      uint16_t peer_id,
638 					      uint32_t ppdu_id,
639 					      uint8_t first_msdu);
640 #endif
641 	void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev,
642 					   struct dp_peer *ta_peer,
643 					   uint8_t *mac_addr,
644 					   qdf_nbuf_t nbuf,
645 					   uint32_t flags);
646 #ifdef QCA_ENHANCED_STATS_SUPPORT
647 	void (*mon_filter_setup_enhanced_stats)(struct dp_pdev *pdev);
648 	void (*mon_filter_reset_enhanced_stats)(struct dp_pdev *pdev);
649 	void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer,
650 				    struct cdp_tx_completion_ppdu_user *ppdu);
651 #endif
652 #ifdef QCA_MCOPY_SUPPORT
653 	void (*mon_filter_setup_mcopy_mode)(struct dp_pdev *pdev);
654 	void (*mon_filter_reset_mcopy_mode)(struct dp_pdev *pdev);
655 #endif
656 #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
657 	void (*mon_filter_setup_smart_monitor)(struct dp_pdev *pdev);
658 	void (*mon_filter_reset_smart_monitor)(struct dp_pdev *pdev);
659 #endif
660 #ifdef WLAN_RX_PKT_CAPTURE_ENH
661 	void (*mon_filter_setup_rx_enh_capture)(struct dp_pdev *pdev);
662 	void (*mon_filter_reset_rx_enh_capture)(struct dp_pdev *pdev);
663 #endif
664 	void (*mon_filter_setup_rx_mon_mode)(struct dp_pdev *pdev);
665 	void (*mon_filter_reset_rx_mon_mode)(struct dp_pdev *pdev);
666 	void (*mon_filter_setup_tx_mon_mode)(struct dp_pdev *pdev);
667 	void (*mon_filter_reset_tx_mon_mode)(struct dp_pdev *pdev);
668 #ifdef WDI_EVENT_ENABLE
669 	void (*mon_filter_setup_rx_pkt_log_full)(struct dp_pdev *pdev);
670 	void (*mon_filter_reset_rx_pkt_log_full)(struct dp_pdev *pdev);
671 	void (*mon_filter_setup_rx_pkt_log_lite)(struct dp_pdev *pdev);
672 	void (*mon_filter_reset_rx_pkt_log_lite)(struct dp_pdev *pdev);
673 	void (*mon_filter_setup_rx_pkt_log_cbf)(struct dp_pdev *pdev);
674 	void (*mon_filter_reset_rx_pkt_log_cbf)(struct dp_pdev *pdev);
675 #ifdef BE_PKTLOG_SUPPORT
676 	void (*mon_filter_setup_pktlog_hybrid)(struct dp_pdev *pdev);
677 	void (*mon_filter_reset_pktlog_hybrid)(struct dp_pdev *pdev);
678 #endif
679 #endif
680 	QDF_STATUS (*rx_mon_filter_update)(struct dp_pdev *pdev);
681 	QDF_STATUS (*tx_mon_filter_update)(struct dp_pdev *pdev);
682 
683 	QDF_STATUS (*tx_mon_filter_alloc)(struct dp_pdev *pdev);
684 	void (*tx_mon_filter_dealloc)(struct dp_pdev *pdev);
685 	QDF_STATUS (*mon_rings_alloc)(struct dp_pdev *pdev);
686 	void (*mon_rings_free)(struct dp_pdev *pdev);
687 	QDF_STATUS (*mon_rings_init)(struct dp_pdev *pdev);
688 	void (*mon_rings_deinit)(struct dp_pdev *pdev);
689 
690 	QDF_STATUS (*rx_mon_buffers_alloc)(struct dp_pdev *pdev);
691 	void (*rx_mon_buffers_free)(struct dp_pdev *pdev);
692 	void (*rx_mon_desc_pool_init)(struct dp_pdev *pdev);
693 	void (*rx_mon_desc_pool_deinit)(struct dp_pdev *pdev);
694 	QDF_STATUS (*rx_mon_desc_pool_alloc)(struct dp_pdev *pdev);
695 	void (*rx_mon_desc_pool_free)(struct dp_pdev *pdev);
696 	void (*tx_mon_desc_pool_init)(struct dp_pdev *pdev);
697 	void (*tx_mon_desc_pool_deinit)(struct dp_pdev *pdev);
698 	QDF_STATUS (*tx_mon_desc_pool_alloc)(struct dp_pdev *pdev);
699 	void (*tx_mon_desc_pool_free)(struct dp_pdev *pdev);
700 	void (*rx_packet_length_set)(uint32_t *msg_word,
701 				     struct htt_rx_ring_tlv_filter *tlv_filter);
702 	void (*rx_wmask_subscribe)(uint32_t *msg_word,
703 				   struct htt_rx_ring_tlv_filter *tlv_filter);
704 	void (*rx_enable_mpdu_logging)(uint32_t *msg_word,
705 				       struct htt_rx_ring_tlv_filter *tlv_filter);
706 #ifndef DISABLE_MON_CONFIG
707 	void (*mon_register_intr_ops)(struct dp_soc *soc);
708 #endif
709 	void (*mon_register_feature_ops)(struct dp_soc *soc);
710 #ifdef QCA_ENHANCED_STATS_SUPPORT
711 	void (*mon_rx_stats_update)(struct dp_mon_peer *mon_peer,
712 				    struct cdp_rx_indication_ppdu *ppdu,
713 				    struct cdp_rx_stats_ppdu_user *ppdu_user);
714 	void (*mon_rx_populate_ppdu_usr_info)(struct mon_rx_user_status *rx_user_status,
715 					      struct cdp_rx_stats_ppdu_user *ppdu_user);
716 	void (*mon_rx_populate_ppdu_info)(struct hal_rx_ppdu_info *hal_ppdu_info,
717 					  struct cdp_rx_indication_ppdu *ppdu);
718 #endif
719 	QDF_STATUS (*rx_mon_refill_buf_ring)(struct dp_intr *int_ctx);
720 	QDF_STATUS (*tx_mon_refill_buf_ring)(struct dp_intr *int_ctx);
721 
722 };
723 
724 struct dp_mon_soc {
725 	/* Holds all monitor related fields extracted from dp_soc */
726 	/* Holds pointer to monitor ops */
727 	/* monitor link descriptor pages */
728 	struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW];
729 
730 	/* total link descriptors for monitor mode for each radio */
731 	uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW];
732 
733 	 /* Monitor Link descriptor memory banks */
734 	struct link_desc_bank
735 		mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS];
736 	uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW];
737 	/* Smart monitor capability for HKv2 */
738 	uint8_t hw_nac_monitor_support;
739 
740 	/* Full monitor mode support */
741 	bool full_mon_mode;
742 
743 	/*interrupt timer*/
744 	qdf_timer_t mon_reap_timer;
745 	uint8_t reap_timer_init;
746 
747 	qdf_timer_t mon_vdev_timer;
748 	uint8_t mon_vdev_timer_state;
749 
750 	struct dp_mon_ops *mon_ops;
751 	bool monitor_mode_v2;
752 #ifndef DISABLE_MON_CONFIG
753 	uint32_t (*mon_rx_process)(struct dp_soc *soc,
754 				   struct dp_intr *int_ctx,
755 				   uint32_t mac_id,
756 				   uint32_t quota);
757 #endif
758 
759 #ifdef WLAN_TX_PKT_CAPTURE_ENH
760 	struct dp_soc_tx_capture dp_soc_tx_capt;
761 #endif
762 };
763 
764 /**
765  * struct dp_mon_peer_stats - Monitor peer stats
766  */
767 struct dp_mon_peer_stats {
768 #ifdef QCA_ENHANCED_STATS_SUPPORT
769 	dp_mon_peer_tx_stats tx;
770 	dp_mon_peer_rx_stats rx;
771 #endif
772 };
773 
774 struct dp_mon_peer {
775 #ifdef WLAN_TX_PKT_CAPTURE_ENH
776 	struct dp_peer_tx_capture tx_capture;
777 #endif
778 #ifdef FEATURE_PERPKT_INFO
779 	/* delayed ba ppdu stats handling */
780 	struct cdp_delayed_tx_completion_ppdu_user delayed_ba_ppdu_stats;
781 	/* delayed ba flag */
782 	bool last_delayed_ba;
783 	/* delayed ba ppdu id */
784 	uint32_t last_delayed_ba_ppduid;
785 #endif
786 	uint8_t tx_cap_enabled:1, /* Peer's tx-capture is enabled */
787 		rx_cap_enabled:1; /* Peer's rx-capture is enabled */
788 
789 	/* Peer level flag to check peer based pktlog enabled or
790 	 * disabled
791 	 */
792 	uint8_t peer_based_pktlog_filter;
793 
794 	/* Monitor peer stats */
795 	struct dp_mon_peer_stats stats;
796 
797 	/* rdk statistics context */
798 	struct cdp_peer_rate_stats_ctx *rdkstats_ctx;
799 };
800 
801 struct  dp_mon_pdev {
802 	/* monitor */
803 	bool monitor_configured;
804 
805 	struct dp_mon_filter **filter;	/* Monitor Filter pointer */
806 
807 	/* advance filter mode and type*/
808 	uint8_t mon_filter_mode;
809 	uint16_t fp_mgmt_filter;
810 	uint16_t fp_ctrl_filter;
811 	uint16_t fp_data_filter;
812 	uint16_t mo_mgmt_filter;
813 	uint16_t mo_ctrl_filter;
814 	uint16_t mo_data_filter;
815 	uint16_t md_data_filter;
816 
817 #ifdef WLAN_TX_PKT_CAPTURE_ENH
818 	struct dp_pdev_tx_capture tx_capture;
819 	bool stop_tx_capture_work_q_timer;
820 #endif
821 
822 	/* tx packet capture enhancement */
823 	enum cdp_tx_enh_capture_mode tx_capture_enabled;
824 	/* Stuck count on monitor destination ring MPDU process */
825 	uint32_t mon_dest_ring_stuck_cnt;
826 	/* monitor mode lock */
827 	qdf_spinlock_t mon_lock;
828 
829 	/* Monitor mode operation channel */
830 	int mon_chan_num;
831 
832 	/* Monitor mode operation frequency */
833 	qdf_freq_t mon_chan_freq;
834 
835 	/* Monitor mode band */
836 	enum reg_wifi_band mon_chan_band;
837 
838 	uint32_t mon_ppdu_status;
839 	/* monitor mode status/destination ring PPDU and MPDU count */
840 	struct cdp_pdev_mon_stats rx_mon_stats;
841 	/* Monitor mode interface and status storage */
842 	struct dp_vdev *mvdev;
843 	struct cdp_mon_status rx_mon_recv_status;
844 	/* to track duplicate link descriptor indications by HW for a WAR */
845 	uint64_t mon_last_linkdesc_paddr;
846 	/* to track duplicate buffer indications by HW for a WAR */
847 	uint32_t mon_last_buf_cookie;
848 
849 #ifdef QCA_SUPPORT_FULL_MON
850 	/* List to maintain all MPDUs for a PPDU in monitor mode */
851 	TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q;
852 
853 	/* TODO: define per-user mpdu list
854 	 * struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS];
855 	 */
856 	struct hal_rx_mon_desc_info *mon_desc;
857 #endif
858 	/* Flag to hold on to monitor destination ring */
859 	bool hold_mon_dest_ring;
860 
861 	/* Flag to inidicate monitor rings are initialized */
862 	uint8_t pdev_mon_init;
863 #ifndef REMOVE_PKT_LOG
864 	bool pkt_log_init;
865 	struct pktlog_dev_t *pl_dev; /* Pktlog pdev */
866 #endif /* #ifndef REMOVE_PKT_LOG */
867 
868 	/* Smart Mesh */
869 	bool filter_neighbour_peers;
870 
871 	/*flag to indicate neighbour_peers_list not empty */
872 	bool neighbour_peers_added;
873 	/* smart mesh mutex */
874 	qdf_spinlock_t neighbour_peer_mutex;
875 	/* Neighnour peer list */
876 	TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list;
877 	/* Enhanced Stats is enabled */
878 	bool enhanced_stats_en;
879 	qdf_nbuf_queue_t rx_status_q;
880 
881 	/* 128 bytes mpdu header queue per user for ppdu */
882 	qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS];
883 
884 	/* is this a mpdu header TLV and not msdu header TLV */
885 	bool is_mpdu_hdr[MAX_MU_USERS];
886 
887 	/* per user 128 bytes msdu header list for MPDU */
888 	struct msdu_list msdu_list[MAX_MU_USERS];
889 
890 	/* RX enhanced capture mode */
891 	uint8_t rx_enh_capture_mode;
892 	/* Rx per peer enhanced capture mode */
893 	bool rx_enh_capture_peer;
894 	struct dp_vdev *rx_enh_monitor_vdev;
895 	/* RX enhanced capture trailer enable/disable flag */
896 	bool is_rx_enh_capture_trailer_enabled;
897 #ifdef WLAN_RX_PKT_CAPTURE_ENH
898 	/* RX per MPDU/PPDU information */
899 	struct cdp_rx_indication_mpdu mpdu_ind;
900 #endif
901 
902 	/* Packet log mode */
903 	uint8_t rx_pktlog_mode;
904 	/* Enable pktlog logging cbf */
905 	bool rx_pktlog_cbf;
906 
907 #ifdef BE_PKTLOG_SUPPORT
908 	/* Enable pktlog logging hybrid */
909 	bool pktlog_hybrid_mode;
910 #endif
911 	bool tx_sniffer_enable;
912 	/* mirror copy mode */
913 	enum m_copy_mode mcopy_mode;
914 	bool enable_reap_timer_non_pkt;
915 	bool bpr_enable;
916 	/* Pdev level flag to check peer based pktlog enabled or
917 	 * disabled
918 	 */
919 	uint8_t dp_peer_based_pktlog;
920 
921 #ifdef WLAN_ATF_ENABLE
922 	/* ATF stats enable */
923 	bool dp_atf_stats_enable;
924 #endif
925 
926 	/* Maintains first status buffer's paddr of a PPDU */
927 	uint64_t status_buf_addr;
928 	struct hal_rx_ppdu_info ppdu_info;
929 
930 	/* ppdu_id of last received HTT TX stats */
931 	uint32_t last_ppdu_id;
932 	struct {
933 		uint8_t last_user;
934 		qdf_nbuf_t buf;
935 	} tx_ppdu_info;
936 
937 	struct {
938 		uint32_t tx_ppdu_id;
939 		uint16_t tx_peer_id;
940 		uint32_t rx_ppdu_id;
941 	} m_copy_id;
942 
943 	/* To check if PPDU Tx stats are enabled for Pktlog */
944 	bool pktlog_ppdu_stats;
945 
946 #ifdef ATH_SUPPORT_NAC_RSSI
947 	bool nac_rssi_filtering;
948 #endif
949 
950 	/* ppdu_stats lock for queue concurrency between cores*/
951 	qdf_spinlock_t ppdu_stats_lock;
952 
953 	/* list of ppdu tlvs */
954 	TAILQ_HEAD(, ppdu_info) ppdu_info_list;
955 	TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;
956 
957 	uint32_t sched_comp_list_depth;
958 	uint16_t delivered_sched_cmdid;
959 	uint16_t last_sched_cmdid;
960 	uint32_t tlv_count;
961 	uint32_t list_depth;
962 
963 	struct {
964 		qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */
965 		uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */
966 		uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */
967 		uint32_t ppdu_id;
968 	} mgmtctrl_frm_info;
969 	/* Context of cal client timer */
970 	struct cdp_cal_client *cal_client_ctx;
971 	uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/
972 
973 	qdf_nbuf_t mcopy_status_nbuf;
974 	bool is_dp_mon_pdev_initialized;
975 	/* indicates if spcl vap is configured */
976 	bool scan_spcl_vap_configured;
977 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
978 	/* enable spcl vap stats reset on ch change */
979 	bool reset_scan_spcl_vap_stats_enable;
980 #endif
981 	bool is_tlv_hdr_64_bit;
982 	enum dp_mon_filter_mode current_filter_mode;
983 
984 	/* Invalid monitor peer to account for stats in mcopy mode */
985 	struct dp_mon_peer *invalid_mon_peer;
986 };
987 
988 struct  dp_mon_vdev {
989 	/* callback to hand rx monitor 802.11 MPDU to the OS shim */
990 	ol_txrx_rx_mon_fp osif_rx_mon;
991 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
992 	struct cdp_scan_spcl_vap_stats *scan_spcl_vap_stats;
993 #endif
994 };
995 
996 #if defined(QCA_TX_CAPTURE_SUPPORT) || defined(QCA_ENHANCED_STATS_SUPPORT)
997 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
998 #else
999 static inline
1000 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
1001 {
1002 }
1003 #endif
1004 
1005 #if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\
1006 	defined(WLAN_SUPPORT_RX_FLOW_TAG)
1007 /**
1008  * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor
1009  *                                       mode and then tags appropriate packets
1010  * @soc: core txrx main context
1011  * @vdev: pdev on which packet is received
1012  * @msdu: QDF packet buffer on which the protocol tag should be set
1013  * @rx_desc: base address where the RX TLVs start
1014  * Return: void
1015  */
1016 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc,
1017 					struct dp_pdev *dp_pdev,
1018 					qdf_nbuf_t msdu, void *rx_desc);
1019 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */
1020 
1021 #if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
1022 	!defined(WLAN_SUPPORT_RX_FLOW_TAG)
1023 /**
1024  * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor
1025  *                                       mode and then tags appropriate packets
1026  * @soc: core txrx main context
1027  * @vdev: pdev on which packet is received
1028  * @msdu: QDF packet buffer on which the protocol tag should be set
1029  * @rx_desc: base address where the RX TLVs start
1030  * Return: void
1031  */
1032 static inline
1033 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc,
1034 					struct dp_pdev *dp_pdev,
1035 					qdf_nbuf_t msdu, void *rx_desc)
1036 {
1037 }
1038 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */
1039 
1040 #ifndef WLAN_TX_PKT_CAPTURE_ENH
1041 /**
1042  * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID
1043  * @peer: Datapath peer
1044  *
1045  */
1046 static inline void dp_peer_tid_queue_init(struct dp_peer *peer)
1047 {
1048 }
1049 
1050 /**
1051  * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID
1052  * @peer: Datapath peer
1053  *
1054  */
1055 static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer)
1056 {
1057 }
1058 
1059 /**
1060  * dp_peer_update_80211_hdr() – dp peer update 80211 hdr
1061  * @vdev: Datapath vdev
1062  * @peer: Datapath peer
1063  *
1064  */
1065 static inline void
1066 dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer)
1067 {
1068 }
1069 
1070 /**
1071  * dp_get_peer_tx_capture_stats: to get peer tx capture stats
1072  * @peer: DP PEER handle
1073  * @stats: pointor to peer tx capture stats
1074  *
1075  * return: QDF_STATUS
1076  */
1077 static inline QDF_STATUS
1078 dp_get_peer_tx_capture_stats(struct dp_peer *peer,
1079 			     struct cdp_peer_tx_capture_stats *stats)
1080 {
1081 	return QDF_STATUS_E_FAILURE;
1082 }
1083 
1084 /**
1085  * dp_get_pdev_tx_capture_stats: to get pdev tx capture stats
1086  * @pdev: DP PDEV handle
1087  * @stats: pointor to pdev tx capture stats
1088  *
1089  * return: QDF_STATUS
1090  */
1091 static inline QDF_STATUS
1092 dp_get_pdev_tx_capture_stats(struct dp_pdev *pdev,
1093 			     struct cdp_pdev_tx_capture_stats *stats)
1094 {
1095 	return QDF_STATUS_E_FAILURE;
1096 }
1097 #endif
1098 
1099 #ifdef WLAN_TX_PKT_CAPTURE_ENH
1100 extern uint8_t
1101 dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX];
1102 #endif
1103 
1104 int
1105 dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap);
1106 
1107 #ifdef WDI_EVENT_ENABLE
1108 void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn);
1109 #else
1110 static inline void
1111 dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn)
1112 {
1113 }
1114 #endif
1115 
1116 #if defined(WDI_EVENT_ENABLE) && defined(QCA_ENHANCED_STATS_SUPPORT)
1117 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer);
1118 #else
1119 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev,
1120 					      struct dp_peer *peer)
1121 {
1122 	return QDF_STATUS_SUCCESS;
1123 }
1124 #endif
1125 
1126 #if defined(FEATURE_PERPKT_INFO) && defined(WDI_EVENT_ENABLE)
1127 void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer,
1128 			 uint16_t peer_id);
1129 #else
1130 static inline
1131 void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer,
1132 			 uint16_t peer_id)
1133 {
1134 }
1135 #endif
1136 
1137 #ifndef WLAN_TX_PKT_CAPTURE_ENH
1138 /**
1139  * dp_tx_ppdu_stats_process - Deferred PPDU stats handler
1140  * @context: Opaque work context (PDEV)
1141  *
1142  * Return: none
1143  */
1144 static  inline void dp_tx_ppdu_stats_process(void *context)
1145 {
1146 }
1147 
1148 /*
1149  * dp_tx_capture_htt_frame_counter: increment counter for htt_frame_type
1150  * pdev: DP pdev handle
1151  * htt_frame_type: htt frame type received from fw
1152  *
1153  * return: void
1154  */
1155 static inline
1156 void dp_tx_capture_htt_frame_counter(struct dp_pdev *pdev,
1157 				     uint32_t htt_frame_type)
1158 {
1159 }
1160 
1161 #endif
1162 
1163 /**
1164  * dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of
1165  *				   the MSDU Link Descriptor
1166  * @pdev: core txrx pdev context
1167  * @buf_info: buf_info includes cookie that used to lookup virtual address of
1168  * link descriptor. Normally this is just an index into a per pdev array.
1169  *
1170  * This is the VA of the link descriptor in monitor mode destination ring,
1171  * that HAL layer later uses to retrieve the list of MSDU's for a given MPDU.
1172  *
1173  * Return: void *: Virtual Address of the Rx descriptor
1174  */
1175 static inline
1176 void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
1177 				      struct hal_buf_info *buf_info,
1178 				      int mac_id)
1179 {
1180 	void *link_desc_va;
1181 	struct qdf_mem_multi_page_t *pages;
1182 	uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie);
1183 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1184 
1185 	if (!mon_soc)
1186 		return NULL;
1187 
1188 	pages = &mon_soc->mon_link_desc_pages[mac_id];
1189 	if (!pages)
1190 		return NULL;
1191 
1192 	if (qdf_unlikely(page_id >= pages->num_pages))
1193 		return NULL;
1194 
1195 	link_desc_va = pages->dma_pages[page_id].page_v_addr_start +
1196 		(buf_info->paddr - pages->dma_pages[page_id].page_p_addr);
1197 
1198 	return link_desc_va;
1199 }
1200 
1201 /**
1202  * dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled
1203  * @soc: DP soc handle
1204  *
1205  * Return: Full monitor mode status
1206  */
1207 static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev)
1208 {
1209 	return (pdev->soc->monitor_soc->full_mon_mode &&
1210 		pdev->monitor_pdev->monitor_configured) ? true : false;
1211 }
1212 
1213 /*
1214  * dp_mon_is_enable_reap_timer_non_pkt() - check if mon reap timer is
1215  * enabled by non-pkt log or not
1216  * @pdev: point to dp pdev
1217  *
1218  * Return: true if mon reap timer is enabled by non-pkt log
1219  */
1220 static inline bool dp_mon_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev)
1221 {
1222 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1223 		return false;
1224 
1225 	return pdev->monitor_pdev->enable_reap_timer_non_pkt;
1226 }
1227 
1228 /*
1229  * dp_monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled
1230  * @pdev: point to dp pdev
1231  *
1232  * Return: true if mcopy mode is enabled
1233  */
1234 static inline bool dp_monitor_is_enable_mcopy_mode(struct dp_pdev *pdev)
1235 {
1236 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1237 		return false;
1238 
1239 	return pdev->monitor_pdev->mcopy_mode;
1240 }
1241 
1242 /*
1243  * dp_monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled
1244  * @pdev: point to dp pdev
1245  *
1246  * Return: true if tx sniffer is enabled
1247  */
1248 static inline bool dp_monitor_is_enable_tx_sniffer(struct dp_pdev *pdev)
1249 {
1250 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1251 		return false;
1252 
1253 	return pdev->monitor_pdev->tx_sniffer_enable;
1254 }
1255 
1256 /*
1257  * dp_monitor_is_set_monitor_configured() - check if monitor configured is set
1258  * @pdev: point to dp pdev
1259  *
1260  * Return: true if monitor configured is set
1261  */
1262 static inline bool dp_monitor_is_configured(struct dp_pdev *pdev)
1263 {
1264 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1265 		return false;
1266 
1267 	return pdev->monitor_pdev->monitor_configured;
1268 }
1269 
1270 /*
1271  * dp_monitor_check_com_info_ppdu_id() - check if msdu ppdu_id matches with
1272  * com info ppdu_id
1273  * @pdev: point to dp pdev
1274  * @rx_desc: point to rx_desc
1275  *
1276  * Return: success if ppdu_id matches
1277  */
1278 static inline QDF_STATUS dp_monitor_check_com_info_ppdu_id(struct dp_pdev *pdev,
1279 							   void *rx_desc)
1280 {
1281 	struct cdp_mon_status *rs;
1282 	struct dp_mon_pdev *mon_pdev;
1283 	uint32_t msdu_ppdu_id = 0;
1284 
1285 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1286 		return QDF_STATUS_E_FAILURE;
1287 
1288 	mon_pdev = pdev->monitor_pdev;
1289 	if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass))
1290 		return QDF_STATUS_E_FAILURE;
1291 
1292 	rs = &pdev->monitor_pdev->rx_mon_recv_status;
1293 	if (!rs || rs->cdp_rs_rxdma_err)
1294 		return QDF_STATUS_E_FAILURE;
1295 
1296 	msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc);
1297 	if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) {
1298 		QDF_TRACE(QDF_MODULE_ID_DP,
1299 			  QDF_TRACE_LEVEL_ERROR,
1300 			  "msdu_ppdu_id=%x,com_info.ppdu_id=%x",
1301 			  msdu_ppdu_id,
1302 			  mon_pdev->ppdu_info.com_info.ppdu_id);
1303 		return QDF_STATUS_E_FAILURE;
1304 	}
1305 
1306 	return QDF_STATUS_SUCCESS;
1307 }
1308 
1309 /*
1310  * dp_monitor_get_rx_status() - get rx status
1311  * @pdev: point to dp pdev
1312  *
1313  * Return: return rx status pointer
1314  */
1315 static inline struct mon_rx_status*
1316 dp_monitor_get_rx_status(struct dp_pdev *pdev)
1317 {
1318 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1319 		return NULL;
1320 
1321 	return &pdev->monitor_pdev->ppdu_info.rx_status;
1322 }
1323 
1324 /*
1325  * dp_monitor_is_chan_band_known() - check if monitor chan band known
1326  * @pdev: point to dp pdev
1327  *
1328  * Return: true if chan band known
1329  */
1330 static inline bool dp_monitor_is_chan_band_known(struct dp_pdev *pdev)
1331 {
1332 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1333 		return false;
1334 
1335 	if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN)
1336 		return true;
1337 
1338 	return false;
1339 }
1340 
1341 /*
1342  * dp_monitor_get_chan_band() - get chan band
1343  * @pdev: point to dp pdev
1344  *
1345  * Return: wifi channel band
1346  */
1347 static inline enum reg_wifi_band
1348 dp_monitor_get_chan_band(struct dp_pdev *pdev)
1349 {
1350 	return pdev->monitor_pdev->mon_chan_band;
1351 }
1352 
1353 /*
1354  * dp_monitor_print_tx_stats() - print tx stats from monitor pdev
1355  * @pdev: point to dp pdev
1356  *
1357  */
1358 static inline void dp_monitor_print_tx_stats(struct dp_pdev *pdev)
1359 {
1360 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1361 		return;
1362 
1363 	DP_PRINT_STATS("ppdu info schedule completion list depth: %d",
1364 		       pdev->monitor_pdev->sched_comp_list_depth);
1365 	DP_PRINT_STATS("delivered sched cmdid: %d",
1366 		       pdev->monitor_pdev->delivered_sched_cmdid);
1367 	DP_PRINT_STATS("cur sched cmdid: %d",
1368 		       pdev->monitor_pdev->last_sched_cmdid);
1369 	DP_PRINT_STATS("ppdu info list depth: %d",
1370 		       pdev->monitor_pdev->list_depth);
1371 }
1372 
1373 /*
1374  * dp_monitor_set_chan_num() - set channel number
1375  * @pdev: point to dp pdev
1376  * @chan_num: channel number
1377  *
1378  */
1379 static inline void dp_monitor_set_chan_num(struct dp_pdev *pdev, int chan_num)
1380 {
1381 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1382 		return;
1383 
1384 	pdev->monitor_pdev->mon_chan_num = chan_num;
1385 }
1386 
1387 /*
1388  * dp_monitor_set_chan_freq() - set channel frequency
1389  * @pdev: point to dp pdev
1390  * @chan_freq: channel frequency
1391  *
1392  */
1393 static inline void
1394 dp_monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq)
1395 {
1396 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1397 		return;
1398 
1399 	pdev->monitor_pdev->mon_chan_freq = chan_freq;
1400 }
1401 
1402 /*
1403  * dp_monitor_set_chan_band() - set channel band
1404  * @pdev: point to dp pdev
1405  * @chan_band: channel band
1406  *
1407  */
1408 static inline void
1409 dp_monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band)
1410 {
1411 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1412 		return;
1413 
1414 	pdev->monitor_pdev->mon_chan_band = chan_band;
1415 }
1416 
1417 /*
1418  * dp_monitor_get_mpdu_status() - get mpdu status
1419  * @pdev: point to dp pdev
1420  * @soc: point to dp soc
1421  * @rx_tlv_hdr: point to rx tlv header
1422  *
1423  */
1424 static inline void dp_monitor_get_mpdu_status(struct dp_pdev *pdev,
1425 					      struct dp_soc *soc,
1426 					      uint8_t *rx_tlv_hdr)
1427 {
1428 	struct dp_mon_pdev *mon_pdev;
1429 
1430 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
1431 		return;
1432 
1433 	mon_pdev = pdev->monitor_pdev;
1434 	hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr,
1435 					   &mon_pdev->ppdu_info.rx_status);
1436 }
1437 
1438 #ifdef FEATURE_NAC_RSSI
1439 /*
1440  * dp_monitor_drop_inv_peer_pkts() - drop invalid peer pkts
1441  * @vdev: point to dp vdev
1442  *
1443  * Return: success if sta mode and filter for neighbour peers enabled
1444  */
1445 static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev)
1446 {
1447 	struct dp_pdev *pdev = vdev->pdev;
1448 	struct dp_soc *soc = pdev->soc;
1449 
1450 	if (!soc->monitor_soc)
1451 		return QDF_STATUS_E_FAILURE;
1452 
1453 	if (!soc->monitor_soc->hw_nac_monitor_support &&
1454 	    pdev->monitor_pdev->filter_neighbour_peers &&
1455 	    vdev->opmode == wlan_op_mode_sta)
1456 		return QDF_STATUS_SUCCESS;
1457 
1458 	return QDF_STATUS_E_FAILURE;
1459 }
1460 #endif
1461 
1462 /*
1463  * dp_peer_ppdu_delayed_ba_init() - Initialize ppdu in peer
1464  * @peer: Datapath peer
1465  *
1466  * return: void
1467  */
1468 #ifdef FEATURE_PERPKT_INFO
1469 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer)
1470 {
1471 	struct dp_mon_peer *mon_peer = peer->monitor_peer;
1472 
1473 	if (!mon_peer)
1474 		return;
1475 
1476 	qdf_mem_zero(&mon_peer->delayed_ba_ppdu_stats,
1477 		     sizeof(struct cdp_delayed_tx_completion_ppdu_user));
1478 	mon_peer->last_delayed_ba = false;
1479 	mon_peer->last_delayed_ba_ppduid = 0;
1480 }
1481 #else
1482 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer)
1483 {
1484 }
1485 #endif
1486 
1487 /*
1488  * dp_monitor_vdev_register_osif() - Register osif rx mon
1489  * @vdev: point to vdev
1490  * @txrx_ops: point to ol txrx ops
1491  *
1492  * Return: void
1493  */
1494 static inline void dp_monitor_vdev_register_osif(struct dp_vdev *vdev,
1495 						 struct ol_txrx_ops *txrx_ops)
1496 {
1497 	if (!vdev->monitor_vdev)
1498 		return;
1499 
1500 	vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon;
1501 }
1502 
1503 /*
1504  * dp_monitor_get_monitor_vdev_from_pdev() - Get monitor vdev
1505  * @pdev: point to pdev
1506  *
1507  * Return: pointer to vdev
1508  */
1509 static inline struct dp_vdev*
1510 dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev)
1511 {
1512 	if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev)
1513 		return NULL;
1514 
1515 	return pdev->monitor_pdev->mvdev;
1516 }
1517 
1518 /*
1519  * dp_monitor_is_vdev_timer_running() - Get vdev timer status
1520  * @soc: point to soc
1521  *
1522  * Return: true if timer running
1523  */
1524 static inline bool dp_monitor_is_vdev_timer_running(struct dp_soc *soc)
1525 {
1526 	if (qdf_unlikely(!soc || !soc->monitor_soc))
1527 		return false;
1528 
1529 	return !!(soc->monitor_soc->mon_vdev_timer_state &
1530 		  MON_VDEV_TIMER_RUNNING);
1531 }
1532 
1533 /*
1534  * dp_monitor_get_link_desc_pages() - Get link desc pages
1535  * @soc: point to soc
1536  * @mac_id: mac id
1537  *
1538  * Return: return point to link desc pages
1539  */
1540 static inline struct qdf_mem_multi_page_t*
1541 dp_monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id)
1542 {
1543 	if (qdf_unlikely(!soc || !soc->monitor_soc))
1544 		return NULL;
1545 
1546 	return &soc->monitor_soc->mon_link_desc_pages[mac_id];
1547 }
1548 
1549 /*
1550  * dp_monitor_get_total_link_descs() - Get total link descs
1551  * @soc: point to soc
1552  * @mac_id: mac id
1553  *
1554  * Return: return point total link descs
1555  */
1556 static inline uint32_t *
1557 dp_monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id)
1558 {
1559 	return &soc->monitor_soc->total_mon_link_descs[mac_id];
1560 }
1561 
1562 /*
1563  * dp_monitor_pdev_attach() - Monitor pdev attach
1564  * @pdev: point to pdev
1565  *
1566  * Return: return QDF_STATUS
1567  */
1568 static inline QDF_STATUS dp_monitor_pdev_attach(struct dp_pdev *pdev)
1569 {
1570 	struct dp_mon_ops *monitor_ops;
1571 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1572 
1573 	/*
1574 	 * mon_soc uninitialized modular support enabled
1575 	 * monitor related attach/detach/init/deinit
1576 	 * will be done while monitor insmod
1577 	 */
1578 	if (!mon_soc)
1579 		return QDF_STATUS_SUCCESS;
1580 
1581 	monitor_ops = mon_soc->mon_ops;
1582 	if (!monitor_ops || !monitor_ops->mon_pdev_attach) {
1583 		dp_mon_debug("callback not registered");
1584 		return QDF_STATUS_E_FAILURE;
1585 	}
1586 
1587 	return monitor_ops->mon_pdev_attach(pdev);
1588 }
1589 
1590 /*
1591  * dp_monitor_pdev_detach() - Monitor pdev detach
1592  * @pdev: point to pdev
1593  *
1594  * Return: return QDF_STATUS
1595  */
1596 static inline QDF_STATUS dp_monitor_pdev_detach(struct dp_pdev *pdev)
1597 {
1598 	struct dp_mon_ops *monitor_ops;
1599 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1600 
1601 	/*
1602 	 * mon_soc uninitialized modular support enabled
1603 	 * monitor related attach/detach/init/deinit
1604 	 * will be done while monitor insmod
1605 	 */
1606 	if (!mon_soc)
1607 		return QDF_STATUS_SUCCESS;
1608 
1609 	monitor_ops = mon_soc->mon_ops;
1610 	if (!monitor_ops || !monitor_ops->mon_pdev_detach) {
1611 		dp_mon_debug("callback not registered");
1612 		return QDF_STATUS_E_FAILURE;
1613 	}
1614 
1615 	return monitor_ops->mon_pdev_detach(pdev);
1616 }
1617 
1618 /*
1619  * dp_monitor_vdev_attach() - Monitor vdev attach
1620  * @vdev: point to vdev
1621  *
1622  * Return: return QDF_STATUS
1623  */
1624 static inline QDF_STATUS dp_monitor_vdev_attach(struct dp_vdev *vdev)
1625 {
1626 	struct dp_mon_ops *monitor_ops;
1627 	struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc;
1628 
1629 	if (!mon_soc)
1630 		return QDF_STATUS_E_FAILURE;
1631 
1632 	monitor_ops = mon_soc->mon_ops;
1633 	if (!monitor_ops || !monitor_ops->mon_vdev_attach) {
1634 		dp_mon_debug("callback not registered");
1635 		return QDF_STATUS_E_FAILURE;
1636 	}
1637 
1638 	return monitor_ops->mon_vdev_attach(vdev);
1639 }
1640 
1641 /*
1642  * dp_monitor_vdev_detach() - Monitor vdev detach
1643  * @vdev: point to vdev
1644  *
1645  * Return: return QDF_STATUS
1646  */
1647 static inline QDF_STATUS dp_monitor_vdev_detach(struct dp_vdev *vdev)
1648 {
1649 	struct dp_mon_ops *monitor_ops;
1650 	struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc;
1651 
1652 	if (!mon_soc)
1653 		return QDF_STATUS_E_FAILURE;
1654 
1655 	monitor_ops = mon_soc->mon_ops;
1656 	if (!monitor_ops || !monitor_ops->mon_vdev_detach) {
1657 		dp_mon_debug("callback not registered");
1658 		return QDF_STATUS_E_FAILURE;
1659 	}
1660 
1661 	return monitor_ops->mon_vdev_detach(vdev);
1662 }
1663 
1664 /*
1665  * dp_monitor_peer_attach() - Monitor peer attach
1666  * @soc: point to soc
1667  * @peer: point to peer
1668  *
1669  * Return: return QDF_STATUS
1670  */
1671 static inline QDF_STATUS dp_monitor_peer_attach(struct dp_soc *soc,
1672 						struct dp_peer *peer)
1673 {
1674 	struct dp_mon_ops *monitor_ops;
1675 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1676 
1677 	if (!mon_soc)
1678 		return QDF_STATUS_E_FAILURE;
1679 
1680 	monitor_ops = mon_soc->mon_ops;
1681 	if (!monitor_ops || !monitor_ops->mon_peer_attach) {
1682 		dp_mon_debug("callback not registered");
1683 		return QDF_STATUS_E_FAILURE;
1684 	}
1685 
1686 	return monitor_ops->mon_peer_attach(peer);
1687 }
1688 
1689 /*
1690  * dp_monitor_peer_detach() - Monitor peer detach
1691  * @soc: point to soc
1692  * @peer: point to peer
1693  *
1694  * Return: return QDF_STATUS
1695  */
1696 static inline QDF_STATUS dp_monitor_peer_detach(struct dp_soc *soc,
1697 						struct dp_peer *peer)
1698 {
1699 	struct dp_mon_ops *monitor_ops;
1700 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1701 
1702 	if (!mon_soc)
1703 		return QDF_STATUS_E_FAILURE;
1704 
1705 	monitor_ops = mon_soc->mon_ops;
1706 	if (!monitor_ops || !monitor_ops->mon_peer_detach) {
1707 		dp_mon_debug("callback not registered");
1708 		return QDF_STATUS_E_FAILURE;
1709 	}
1710 
1711 	return monitor_ops->mon_peer_detach(peer);
1712 }
1713 
1714 /*
1715  * dp_monitor_peer_get_rdkstats_ctx() - Get RDK stats context from monitor peer
1716  * @soc: Datapath soc handle
1717  * @peer: Datapath peer handle
1718  *
1719  * Return: RDK stats context
1720  */
1721 static inline struct cdp_peer_rate_stats_ctx*
1722 dp_monitor_peer_get_rdkstats_ctx(struct dp_soc *soc, struct dp_peer *peer)
1723 {
1724 	struct dp_mon_ops *monitor_ops;
1725 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1726 
1727 	if (!mon_soc)
1728 		return NULL;
1729 
1730 	monitor_ops = mon_soc->mon_ops;
1731 	if (!monitor_ops || !monitor_ops->mon_peer_get_rdkstats_ctx) {
1732 		dp_mon_debug("callback not registered");
1733 		return NULL;
1734 	}
1735 
1736 	return monitor_ops->mon_peer_get_rdkstats_ctx(peer);
1737 }
1738 
1739 /*
1740  * dp_monitor_peer_reset_stats() - Reset monitor peer stats
1741  * @soc: Datapath soc handle
1742  * @peer: Datapath peer handle
1743  *
1744  * Return: none
1745  */
1746 static inline void dp_monitor_peer_reset_stats(struct dp_soc *soc,
1747 					       struct dp_peer *peer)
1748 {
1749 	struct dp_mon_ops *monitor_ops;
1750 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1751 
1752 	if (!mon_soc)
1753 		return;
1754 
1755 	monitor_ops = mon_soc->mon_ops;
1756 	if (!monitor_ops || !monitor_ops->mon_peer_reset_stats) {
1757 		dp_mon_debug("callback not registered");
1758 		return;
1759 	}
1760 
1761 	monitor_ops->mon_peer_reset_stats(peer);
1762 }
1763 
1764 /*
1765  * dp_monitor_peer_get_stats() - Get monitor peer stats
1766  * @soc: Datapath soc handle
1767  * @peer: Datapath peer handle
1768  * @arg: Pointer to stats struct
1769  * @type: Update type
1770  *
1771  * Return: none
1772  */
1773 static inline
1774 void dp_monitor_peer_get_stats(struct dp_soc *soc, struct dp_peer *peer,
1775 			       void *arg, enum cdp_stat_update_type type)
1776 {
1777 	struct dp_mon_ops *monitor_ops;
1778 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1779 
1780 	if (!mon_soc)
1781 		return;
1782 
1783 	monitor_ops = mon_soc->mon_ops;
1784 	if (!monitor_ops || !monitor_ops->mon_peer_get_stats) {
1785 		dp_mon_debug("callback not registered");
1786 		return;
1787 	}
1788 
1789 	monitor_ops->mon_peer_get_stats(peer, arg, type);
1790 }
1791 
1792 /*
1793  * dp_monitor_invalid_peer_update_pdev_stats() - Update pdev stats from
1794  *						invalid monitor peer
1795  * @soc: Datapath soc handle
1796  * @pdev: Datapath pdev handle
1797  *
1798  * Return: none
1799  */
1800 static inline
1801 void dp_monitor_invalid_peer_update_pdev_stats(struct dp_soc *soc,
1802 					       struct dp_pdev *pdev)
1803 {
1804 	struct dp_mon_ops *monitor_ops;
1805 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1806 
1807 	if (!mon_soc)
1808 		return;
1809 
1810 	monitor_ops = mon_soc->mon_ops;
1811 	if (!monitor_ops || !monitor_ops->mon_invalid_peer_update_pdev_stats) {
1812 		dp_mon_debug("callback not registered");
1813 		return;
1814 	}
1815 
1816 	monitor_ops->mon_invalid_peer_update_pdev_stats(pdev);
1817 }
1818 
1819 /*
1820  * dp_monitor_peer_get_stats_param() - Get stats param value from monitor peer
1821  * @soc: Datapath soc handle
1822  * @peer: Datapath peer handle
1823  * @type: Stats type requested
1824  * @buf: Pointer to buffer for stats param
1825  *
1826  * Return: QDF_STATUS
1827  */
1828 static inline QDF_STATUS
1829 dp_monitor_peer_get_stats_param(struct dp_soc *soc, struct dp_peer *peer,
1830 				enum cdp_peer_stats_type type,
1831 				cdp_peer_stats_param_t *buf)
1832 {
1833 	struct dp_mon_ops *monitor_ops;
1834 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1835 
1836 	if (!mon_soc)
1837 		return QDF_STATUS_E_FAILURE;
1838 
1839 	monitor_ops = mon_soc->mon_ops;
1840 	if (!monitor_ops || !monitor_ops->mon_peer_get_stats_param) {
1841 		dp_mon_debug("callback not registered");
1842 		return QDF_STATUS_E_FAILURE;
1843 	}
1844 
1845 	return monitor_ops->mon_peer_get_stats_param(peer, type, buf);
1846 }
1847 
1848 /*
1849  * dp_monitor_pdev_init() - Monitor pdev init
1850  * @pdev: point to pdev
1851  *
1852  * Return: return QDF_STATUS
1853  */
1854 static inline QDF_STATUS dp_monitor_pdev_init(struct dp_pdev *pdev)
1855 {
1856 	struct dp_mon_ops *monitor_ops;
1857 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1858 
1859 	/*
1860 	 * mon_soc uninitialized when modular support enabled
1861 	 * monitor related attach/detach/init/deinit
1862 	 * will be done while monitor insmod
1863 	 */
1864 	if (!mon_soc)
1865 		return QDF_STATUS_SUCCESS;
1866 
1867 	monitor_ops = mon_soc->mon_ops;
1868 	if (!monitor_ops || !monitor_ops->mon_pdev_init) {
1869 		dp_mon_debug("callback not registered");
1870 		return QDF_STATUS_E_FAILURE;
1871 	}
1872 
1873 	return monitor_ops->mon_pdev_init(pdev);
1874 }
1875 
1876 /*
1877  * dp_monitor_pdev_deinit() - Monitor pdev deinit
1878  * @pdev: point to pdev
1879  *
1880  * Return: return QDF_STATUS
1881  */
1882 static inline QDF_STATUS dp_monitor_pdev_deinit(struct dp_pdev *pdev)
1883 {
1884 	struct dp_mon_ops *monitor_ops;
1885 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1886 
1887 	/*
1888 	 * mon_soc uninitialized modular when support enabled
1889 	 * monitor related attach/detach/init/deinit
1890 	 * will be done while monitor insmod
1891 	 */
1892 	if (!mon_soc)
1893 		return QDF_STATUS_SUCCESS;
1894 
1895 	monitor_ops = mon_soc->mon_ops;
1896 	if (!monitor_ops || !monitor_ops->mon_pdev_deinit) {
1897 		dp_mon_debug("callback not registered");
1898 		return QDF_STATUS_E_FAILURE;
1899 	}
1900 
1901 	return monitor_ops->mon_pdev_deinit(pdev);
1902 }
1903 
1904 /*
1905  * dp_monitor_soc_cfg_init() - Monitor sco cfg init
1906  * @soc: point to soc
1907  *
1908  * Return: return QDF_STATUS
1909  */
1910 static inline QDF_STATUS dp_monitor_soc_cfg_init(struct dp_soc *soc)
1911 {
1912 	struct dp_mon_ops *monitor_ops;
1913 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1914 
1915 	/*
1916 	 * this API is getting call from dp_soc_init,
1917 	 * mon_soc will be uninitialized when monitor support enabled
1918 	 * So returning QDF_STATUS_SUCCESS.
1919 	 * soc cfg init will be done while monitor insmod.
1920 	 */
1921 	if (!mon_soc)
1922 		return QDF_STATUS_SUCCESS;
1923 
1924 	monitor_ops = mon_soc->mon_ops;
1925 	if (!monitor_ops || !monitor_ops->mon_soc_cfg_init) {
1926 		dp_mon_debug("callback not registered");
1927 		return QDF_STATUS_E_FAILURE;
1928 	}
1929 
1930 	return monitor_ops->mon_soc_cfg_init(soc);
1931 }
1932 
1933 /*
1934  * dp_monitor_config_debug_sniffer() - Monitor config debug sniffer
1935  * @pdev: point to pdev
1936  * @val: val
1937  *
1938  * Return: return QDF_STATUS
1939  */
1940 static inline QDF_STATUS dp_monitor_config_debug_sniffer(struct dp_pdev *pdev,
1941 							 int val)
1942 {
1943 	struct dp_mon_ops *monitor_ops;
1944 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1945 
1946 	if (!mon_soc)
1947 		return QDF_STATUS_E_FAILURE;
1948 
1949 	monitor_ops = mon_soc->mon_ops;
1950 	if (!monitor_ops || !monitor_ops->mon_config_debug_sniffer) {
1951 		dp_mon_debug("callback not registered");
1952 		return QDF_STATUS_E_FAILURE;
1953 	}
1954 
1955 	return monitor_ops->mon_config_debug_sniffer(pdev, val);
1956 }
1957 
1958 /*
1959  * dp_monitor_flush_rings() - Flush monitor rings
1960  * @soc: point to soc
1961  *
1962  * Return: None
1963  */
1964 static inline void dp_monitor_flush_rings(struct dp_soc *soc)
1965 {
1966 	struct dp_mon_ops *monitor_ops;
1967 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1968 
1969 	if (!mon_soc) {
1970 		dp_mon_debug("monitor soc is NULL");
1971 		return;
1972 	}
1973 
1974 	monitor_ops = mon_soc->mon_ops;
1975 	if (!monitor_ops || !monitor_ops->mon_flush_rings) {
1976 		dp_mon_debug("callback not registered");
1977 		return;
1978 	}
1979 
1980 	return monitor_ops->mon_flush_rings(soc);
1981 }
1982 
1983 /*
1984  * dp_monitor_htt_srng_setup() - Setup htt srng
1985  * @soc: point to soc
1986  * @pdev: point to pdev
1987  * @mac_id: lmac id
1988  * @mac for pdev: pdev id
1989  *
1990  * Return: QDF_STATUS
1991  */
1992 #if !defined(DISABLE_MON_CONFIG)
1993 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc,
1994 						   struct dp_pdev *pdev,
1995 						   int mac_id,
1996 						   int mac_for_pdev)
1997 {
1998 	struct dp_mon_ops *monitor_ops;
1999 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2000 
2001 	if (!mon_soc) {
2002 		dp_mon_debug("monitor soc is NULL");
2003 		return QDF_STATUS_SUCCESS;
2004 	}
2005 
2006 	monitor_ops = mon_soc->mon_ops;
2007 	if (!monitor_ops || !monitor_ops->mon_pdev_htt_srng_setup) {
2008 		dp_mon_debug("callback not registered");
2009 		return QDF_STATUS_E_FAILURE;
2010 	}
2011 
2012 	return monitor_ops->mon_pdev_htt_srng_setup(soc, pdev, mac_id,
2013 						    mac_for_pdev);
2014 }
2015 
2016 static inline QDF_STATUS dp_monitor_soc_htt_srng_setup(struct dp_soc *soc)
2017 {
2018 	struct dp_mon_ops *monitor_ops;
2019 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2020 
2021 	if (!mon_soc) {
2022 		dp_mon_debug("monitor soc is NULL");
2023 		return QDF_STATUS_SUCCESS;
2024 	}
2025 
2026 	monitor_ops = mon_soc->mon_ops;
2027 	if (!monitor_ops || !monitor_ops->mon_soc_htt_srng_setup) {
2028 		dp_mon_debug("callback not registered");
2029 		return QDF_STATUS_E_FAILURE;
2030 	}
2031 
2032 	return monitor_ops->mon_soc_htt_srng_setup(soc);
2033 }
2034 #else
2035 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc,
2036 						   struct dp_pdev *pdev,
2037 						   int mac_id,
2038 						   int mac_for_pdev)
2039 {
2040 	return QDF_STATUS_SUCCESS;
2041 }
2042 #endif
2043 
2044 /*
2045  * dp_monitor_service_mon_rings() - service monitor rings
2046  * @soc: point to soc
2047  * @quota: reap budget
2048  *
2049  * Return: None
2050  */
2051 #if defined(DP_CON_MON)
2052 static inline
2053 void dp_monitor_service_mon_rings(struct dp_soc *soc, uint32_t quota)
2054 {
2055 	struct dp_mon_ops *monitor_ops;
2056 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2057 
2058 	if (!mon_soc) {
2059 		dp_mon_debug("monitor soc is NULL");
2060 		return;
2061 	}
2062 
2063 	monitor_ops = mon_soc->mon_ops;
2064 	if (!monitor_ops || !monitor_ops->mon_service_rings) {
2065 		dp_mon_debug("callback not registered");
2066 		return;
2067 	}
2068 
2069 	return monitor_ops->mon_service_rings(soc, quota);
2070 }
2071 #endif
2072 
2073 /*
2074  * dp_rx_monitor_process() - Process monitor
2075  * @soc: point to soc
2076  * @int_ctx: interrupt ctx
2077  * @mac_id: lma
2078  * @quota:
2079  *
2080  * Return: None
2081  */
2082 #ifndef DISABLE_MON_CONFIG
2083 static inline
2084 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx,
2085 			       uint32_t mac_id, uint32_t quota)
2086 {
2087 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2088 
2089 	if (!mon_soc) {
2090 		dp_mon_debug("monitor soc is NULL");
2091 		return 0;
2092 	}
2093 
2094 	if (!mon_soc->mon_rx_process) {
2095 		dp_mon_debug("callback not registered");
2096 		return 0;
2097 	}
2098 
2099 	return mon_soc->mon_rx_process(soc, int_ctx, mac_id, quota);
2100 }
2101 
2102 static inline
2103 uint32_t dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
2104 			   uint32_t mac_id, uint32_t quota)
2105 {
2106 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2107 	struct dp_mon_ops *monitor_ops;
2108 
2109 	if (!mon_soc) {
2110 		dp_mon_debug("monitor soc is NULL");
2111 		return 0;
2112 	}
2113 
2114 	monitor_ops = mon_soc->mon_ops;
2115 	if (!monitor_ops || !monitor_ops->mon_tx_process) {
2116 		dp_mon_debug("callback not registered");
2117 		return 0;
2118 	}
2119 
2120 	return monitor_ops->mon_tx_process(soc, int_ctx, mac_id, quota);
2121 }
2122 
2123 static inline
2124 uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx)
2125 {
2126 	struct dp_soc *soc = int_ctx->soc;
2127 	struct dp_mon_ops *monitor_ops;
2128 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2129 
2130 	if (!mon_soc) {
2131 		dp_mon_debug("monitor soc is NULL");
2132 		return 0;
2133 	}
2134 
2135 	monitor_ops = mon_soc->mon_ops;
2136 	if (!monitor_ops || !monitor_ops->tx_mon_refill_buf_ring) {
2137 		dp_mon_debug("callback not registered");
2138 		return 0;
2139 	}
2140 
2141 	return monitor_ops->tx_mon_refill_buf_ring(int_ctx);
2142 }
2143 
2144 static inline
2145 uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx)
2146 {
2147 	struct dp_soc *soc = int_ctx->soc;
2148 	struct dp_mon_ops *monitor_ops;
2149 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2150 
2151 	if (!mon_soc) {
2152 		dp_mon_debug("monitor soc is NULL");
2153 		return 0;
2154 	}
2155 
2156 	monitor_ops = mon_soc->mon_ops;
2157 	if (!monitor_ops || !monitor_ops->rx_mon_refill_buf_ring) {
2158 		dp_mon_debug("callback not registered");
2159 		return 0;
2160 	}
2161 
2162 	return monitor_ops->rx_mon_refill_buf_ring(int_ctx);
2163 }
2164 #else
2165 static inline
2166 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx,
2167 			       uint32_t mac_id, uint32_t quota)
2168 {
2169 	return 0;
2170 }
2171 
2172 static inline uint32_t
2173 dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
2174 		  uint32_t mac_id, uint32_t quota)
2175 {
2176 	return 0;
2177 }
2178 
2179 static inline
2180 uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx)
2181 {
2182 }
2183 
2184 static inline
2185 uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx)
2186 {
2187 }
2188 #endif
2189 
2190 /*
2191  * dp_monitor_drop_packets_for_mac() - monitor_drop_packets_for_mac
2192  * @pdev: point to pdev
2193  * @mac_id:
2194  * @quota:
2195  *
2196  * Return:
2197  */
2198 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC)
2199 static inline
2200 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev,
2201 					 uint32_t mac_id, uint32_t quota)
2202 {
2203 	struct dp_mon_ops *monitor_ops;
2204 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2205 
2206 	if (!mon_soc) {
2207 		dp_mon_debug("monitor soc is NULL");
2208 		return 0;
2209 	}
2210 
2211 	monitor_ops = mon_soc->mon_ops;
2212 	if (!monitor_ops || !monitor_ops->mon_drop_packets_for_mac) {
2213 		dp_mon_debug("callback not registered");
2214 		return 0;
2215 	}
2216 
2217 	return monitor_ops->mon_drop_packets_for_mac(pdev,
2218 						     mac_id, quota);
2219 }
2220 #else
2221 static inline
2222 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev,
2223 					 uint32_t mac_id, uint32_t quota)
2224 {
2225 	return 0;
2226 }
2227 #endif
2228 
2229 /*
2230  * dp_monitor_peer_tx_init() - peer tx init
2231  * @pdev: point to pdev
2232  * @peer: point to peer
2233  *
2234  * Return: None
2235  */
2236 static inline void dp_monitor_peer_tx_init(struct dp_pdev *pdev,
2237 					   struct dp_peer *peer)
2238 {
2239 	struct dp_mon_ops *monitor_ops;
2240 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2241 
2242 	if (!mon_soc) {
2243 		dp_mon_debug("monitor soc is NULL");
2244 		return;
2245 	}
2246 
2247 	monitor_ops = mon_soc->mon_ops;
2248 	if (!monitor_ops || !monitor_ops->mon_peer_tx_init) {
2249 		dp_mon_debug("callback not registered");
2250 		return;
2251 	}
2252 
2253 	return monitor_ops->mon_peer_tx_init(pdev, peer);
2254 }
2255 
2256 /*
2257  * dp_monitor_peer_tx_cleanup() - peer tx cleanup
2258  * @vdev: point to vdev
2259  * @peer: point to peer
2260  *
2261  * Return: None
2262  */
2263 static inline void dp_monitor_peer_tx_cleanup(struct dp_vdev *vdev,
2264 					      struct dp_peer *peer)
2265 {
2266 	struct dp_mon_ops *monitor_ops;
2267 	struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc;
2268 
2269 	if (!mon_soc) {
2270 		dp_mon_debug("monitor soc is NULL");
2271 		return;
2272 	}
2273 
2274 	monitor_ops = mon_soc->mon_ops;
2275 	if (!monitor_ops || !monitor_ops->mon_peer_tx_cleanup) {
2276 		dp_mon_debug("callback not registered");
2277 		return;
2278 	}
2279 
2280 	return monitor_ops->mon_peer_tx_cleanup(vdev, peer);
2281 }
2282 
2283 #ifdef WIFI_MONITOR_SUPPORT
2284 /**
2285  * dp_monitor_peer_tid_peer_id_update() - peer tid update
2286  * @soc: point to soc
2287  * @peer: point to peer
2288  * @peer_id: peer id
2289  *
2290  * Return: None
2291  */
2292 static inline
2293 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc,
2294 					struct dp_peer *peer,
2295 					uint16_t peer_id)
2296 {
2297 	struct dp_mon_ops *monitor_ops;
2298 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2299 
2300 	if (!mon_soc) {
2301 		dp_mon_debug("monitor soc is NULL");
2302 		return;
2303 	}
2304 
2305 	monitor_ops = mon_soc->mon_ops;
2306 	if (!monitor_ops || !monitor_ops->mon_peer_tid_peer_id_update) {
2307 		dp_mon_debug("callback not registered");
2308 		return;
2309 	}
2310 
2311 	return monitor_ops->mon_peer_tid_peer_id_update(peer, peer_id);
2312 }
2313 
2314 /*
2315  * dp_monitor_tx_ppdu_stats_attach() - Attach tx ppdu stats
2316  * @pdev: point to pdev
2317  *
2318  * Return: None
2319  */
2320 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev)
2321 {
2322 	struct dp_mon_ops *monitor_ops;
2323 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2324 
2325 	if (!mon_soc) {
2326 		dp_mon_debug("monitor soc is NULL");
2327 		return;
2328 	}
2329 
2330 	monitor_ops = mon_soc->mon_ops;
2331 	if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_attach) {
2332 		dp_mon_debug("callback not registered");
2333 		return;
2334 	}
2335 
2336 	return monitor_ops->mon_tx_ppdu_stats_attach(pdev);
2337 }
2338 
2339 /*
2340  * dp_monitor_tx_ppdu_stats_detach() - Detach tx ppdu stats
2341  * @pdev: point to pdev
2342  *
2343  * Return: None
2344  */
2345 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev)
2346 {
2347 	struct dp_mon_ops *monitor_ops;
2348 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2349 
2350 	if (!mon_soc) {
2351 		dp_mon_debug("monitor soc is NULL");
2352 		return;
2353 	}
2354 
2355 	monitor_ops = mon_soc->mon_ops;
2356 	if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_detach) {
2357 		dp_mon_debug("callback not registered");
2358 		return;
2359 	}
2360 
2361 	return monitor_ops->mon_tx_ppdu_stats_detach(pdev);
2362 }
2363 
2364 /*
2365  * dp_monitor_tx_capture_debugfs_init() - Init tx capture debugfs
2366  * @pdev: point to pdev
2367  *
2368  * Return: QDF_STATUS_SUCCESS
2369  */
2370 static inline
2371 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev)
2372 {
2373 	struct dp_mon_ops *monitor_ops;
2374 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2375 
2376 	if (!mon_soc) {
2377 		dp_mon_debug("monitor soc is NULL");
2378 		return QDF_STATUS_E_FAILURE;
2379 	}
2380 
2381 	monitor_ops = mon_soc->mon_ops;
2382 	if (!monitor_ops || !monitor_ops->mon_tx_capture_debugfs_init) {
2383 		dp_mon_debug("callback not registered");
2384 		return QDF_STATUS_E_FAILURE;
2385 	}
2386 
2387 	return monitor_ops->mon_tx_capture_debugfs_init(pdev);
2388 }
2389 
2390 /*
2391  * dp_monitor_peer_tx_capture_filter_check() - Check tx capture filter
2392  * @pdev: point to pdev
2393  * @peer: point to peer
2394  *
2395  * Return: None
2396  */
2397 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev,
2398 							   struct dp_peer *peer)
2399 {
2400 	struct dp_mon_ops *monitor_ops;
2401 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2402 
2403 	if (!mon_soc) {
2404 		dp_mon_debug("monitor soc is NULL");
2405 		return;
2406 	}
2407 
2408 	monitor_ops = mon_soc->mon_ops;
2409 	if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_filter_check) {
2410 		dp_mon_debug("callback not registered");
2411 		return;
2412 	}
2413 
2414 	return monitor_ops->mon_peer_tx_capture_filter_check(pdev, peer);
2415 }
2416 
2417 /*
2418  * dp_monitor_tx_add_to_comp_queue() - add completion msdu to queue
2419  *
2420  * This API returns QDF_STATUS_SUCCESS in case where buffer is added
2421  * to txmonitor queue successfuly caller will not free the buffer in
2422  * this case. In other cases this API return QDF_STATUS_E_FAILURE and
2423  * caller frees the buffer
2424  *
2425  * @soc: point to soc
2426  * @desc: point to tx desc
2427  * @ts: Tx completion status from HAL/HTT descriptor
2428  * @peer id: DP peer id
2429  *
2430  * Return: QDF_STATUS
2431  *
2432  */
2433 static inline
2434 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc,
2435 					   struct dp_tx_desc_s *desc,
2436 					   struct hal_tx_completion_status *ts,
2437 					   uint16_t peer_id)
2438 {
2439 	struct dp_mon_ops *monitor_ops;
2440 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2441 
2442 	if (!mon_soc) {
2443 		dp_mon_debug("monitor soc is NULL");
2444 		return QDF_STATUS_E_FAILURE;
2445 	}
2446 
2447 	monitor_ops = mon_soc->mon_ops;
2448 	if (!monitor_ops || !monitor_ops->mon_tx_add_to_comp_queue) {
2449 		dp_mon_debug("callback not registered");
2450 		return QDF_STATUS_E_FAILURE;
2451 	}
2452 
2453 	return monitor_ops->mon_tx_add_to_comp_queue(soc, desc, ts, peer_id);
2454 }
2455 
2456 static inline
2457 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc,
2458 				       struct dp_pdev *pdev,
2459 				       struct dp_peer *peer,
2460 				       struct hal_tx_completion_status *ts,
2461 				       qdf_nbuf_t netbuf)
2462 {
2463 	struct dp_mon_ops *monitor_ops;
2464 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2465 
2466 	if (!mon_soc) {
2467 		dp_mon_debug("monitor soc is NULL");
2468 		return QDF_STATUS_SUCCESS;
2469 	}
2470 
2471 	monitor_ops = mon_soc->mon_ops;
2472 	if (!monitor_ops || !monitor_ops->mon_update_msdu_to_list) {
2473 		dp_mon_debug("callback not registered");
2474 		return QDF_STATUS_E_FAILURE;
2475 	}
2476 
2477 	return monitor_ops->mon_update_msdu_to_list(soc, pdev,
2478 						    peer, ts, netbuf);
2479 }
2480 
2481 /*
2482  * dp_monitor_peer_tx_capture_get_stats - to get Peer Tx Capture stats
2483  * @soc: DP SOC handle
2484  * @peer: DP PEER handle
2485  * @stats: Pointer Peer tx capture stats
2486  *
2487  * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS
2488  */
2489 static inline QDF_STATUS
2490 dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer,
2491 				     struct cdp_peer_tx_capture_stats *stats)
2492 {
2493 	struct dp_mon_ops *monitor_ops;
2494 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2495 
2496 	if (!mon_soc) {
2497 		dp_mon_debug("monitor soc is NULL");
2498 		return QDF_STATUS_E_FAILURE;
2499 	}
2500 
2501 	monitor_ops = mon_soc->mon_ops;
2502 	if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_get_stats) {
2503 		dp_mon_debug("callback not registered");
2504 		return QDF_STATUS_E_FAILURE;
2505 	}
2506 
2507 	return monitor_ops->mon_peer_tx_capture_get_stats(peer, stats);
2508 }
2509 
2510 /*
2511  * dp_monitor_pdev_tx_capture_get_stats - to get pdev tx capture stats
2512  * @soc: DP SOC handle
2513  * @pdev: DP PDEV handle
2514  * @stats: Pointer to pdev tx capture stats
2515  *
2516  * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS
2517  */
2518 static inline QDF_STATUS
2519 dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev,
2520 				     struct cdp_pdev_tx_capture_stats *stats)
2521 {
2522 	struct dp_mon_ops *monitor_ops;
2523 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2524 
2525 	if (!mon_soc) {
2526 		dp_mon_debug("monitor soc is NULL");
2527 		return QDF_STATUS_E_FAILURE;
2528 	}
2529 
2530 	monitor_ops = mon_soc->mon_ops;
2531 	if (!monitor_ops || !monitor_ops->mon_pdev_tx_capture_get_stats) {
2532 		dp_mon_debug("callback not registered");
2533 		return QDF_STATUS_E_FAILURE;
2534 	}
2535 
2536 	return monitor_ops->mon_pdev_tx_capture_get_stats(pdev, stats);
2537 }
2538 #else
2539 static inline
2540 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc,
2541 					struct dp_peer *peer,
2542 					uint16_t peer_id)
2543 {
2544 }
2545 
2546 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev)
2547 {
2548 }
2549 
2550 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev)
2551 {
2552 }
2553 
2554 static inline
2555 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev)
2556 {
2557 	return QDF_STATUS_E_FAILURE;
2558 }
2559 
2560 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev,
2561 							   struct dp_peer *peer)
2562 {
2563 }
2564 
2565 static inline
2566 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc,
2567 					   struct dp_tx_desc_s *desc,
2568 					   struct hal_tx_completion_status *ts,
2569 					   uint16_t peer_id)
2570 {
2571 	return QDF_STATUS_E_FAILURE;
2572 }
2573 
2574 static inline
2575 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc,
2576 				       struct dp_pdev *pdev,
2577 				       struct dp_peer *peer,
2578 				       struct hal_tx_completion_status *ts,
2579 				       qdf_nbuf_t netbuf)
2580 {
2581 	return QDF_STATUS_E_FAILURE;
2582 }
2583 
2584 static inline QDF_STATUS
2585 dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer,
2586 				     struct cdp_peer_tx_capture_stats *stats)
2587 {
2588 	return QDF_STATUS_E_FAILURE;
2589 }
2590 
2591 static inline QDF_STATUS
2592 dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev,
2593 				     struct cdp_pdev_tx_capture_stats *stats)
2594 {
2595 	return QDF_STATUS_E_FAILURE;
2596 }
2597 #endif
2598 
2599 /*
2600  * dp_monitor_ppdu_stats_ind_handler() - PPDU stats msg handler
2601  * @htt_soc:     HTT SOC handle
2602  * @msg_word:    Pointer to payload
2603  * @htt_t2h_msg: HTT msg nbuf
2604  *
2605  * Return: True if buffer should be freed by caller.
2606  */
2607 #if defined(WDI_EVENT_ENABLE) &&\
2608 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
2609 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc,
2610 						     uint32_t *msg_word,
2611 						     qdf_nbuf_t htt_t2h_msg)
2612 {
2613 	struct dp_mon_ops *monitor_ops;
2614 	struct dp_mon_soc *mon_soc = soc->dp_soc->monitor_soc;
2615 
2616 	if (!mon_soc) {
2617 		dp_mon_debug("monitor soc is NULL");
2618 		return true;
2619 	}
2620 
2621 	monitor_ops = mon_soc->mon_ops;
2622 	if (!monitor_ops || !monitor_ops->mon_ppdu_stats_ind_handler) {
2623 		dp_mon_debug("callback not registered");
2624 		return true;
2625 	}
2626 
2627 	return monitor_ops->mon_ppdu_stats_ind_handler(soc, msg_word,
2628 						       htt_t2h_msg);
2629 }
2630 #else
2631 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc,
2632 						     uint32_t *msg_word,
2633 						     qdf_nbuf_t htt_t2h_msg)
2634 {
2635 	return true;
2636 }
2637 #endif
2638 
2639 /*
2640  * dp_monitor_htt_ppdu_stats_attach() - attach resources for HTT PPDU
2641  * stats processing
2642  * @pdev: Datapath PDEV handle
2643  *
2644  * Return: QDF_STATUS
2645  */
2646 static inline QDF_STATUS dp_monitor_htt_ppdu_stats_attach(struct dp_pdev *pdev)
2647 {
2648 	struct dp_mon_ops *monitor_ops;
2649 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2650 
2651 	if (!mon_soc) {
2652 		dp_mon_debug("monitor soc is NULL");
2653 		return QDF_STATUS_SUCCESS;
2654 	}
2655 
2656 	monitor_ops = mon_soc->mon_ops;
2657 	if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_attach) {
2658 		dp_mon_debug("callback not registered");
2659 		return QDF_STATUS_E_FAILURE;
2660 	}
2661 
2662 	return monitor_ops->mon_htt_ppdu_stats_attach(pdev);
2663 }
2664 
2665 /*
2666  * dp_monitor_htt_ppdu_stats_detach() - detach stats resources
2667  * @pdev: Datapath PDEV handle
2668  *
2669  * Return: void
2670  */
2671 static inline void dp_monitor_htt_ppdu_stats_detach(struct dp_pdev *pdev)
2672 {
2673 	struct dp_mon_ops *monitor_ops;
2674 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2675 
2676 	if (!mon_soc) {
2677 		dp_mon_debug("monitor soc is NULL");
2678 		return;
2679 	}
2680 
2681 	monitor_ops = mon_soc->mon_ops;
2682 	if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_detach) {
2683 		dp_mon_debug("callback not registered");
2684 		return;
2685 	}
2686 
2687 	return monitor_ops->mon_htt_ppdu_stats_detach(pdev);
2688 }
2689 
2690 /*
2691  * dp_monitor_print_pdev_rx_mon_stats() - print rx mon stats
2692  * @pdev: Datapath PDEV handle
2693  *
2694  * Return: void
2695  */
2696 static inline void dp_monitor_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
2697 {
2698 	struct dp_mon_ops *monitor_ops;
2699 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2700 
2701 	if (!mon_soc) {
2702 		dp_mon_debug("monitor soc is NULL");
2703 		return;
2704 	}
2705 
2706 	monitor_ops = mon_soc->mon_ops;
2707 	if (!monitor_ops || !monitor_ops->mon_print_pdev_rx_mon_stats) {
2708 		dp_mon_debug("callback not registered");
2709 		return;
2710 	}
2711 
2712 	return monitor_ops->mon_print_pdev_rx_mon_stats(pdev);
2713 }
2714 
2715 #ifdef WIFI_MONITOR_SUPPORT
2716 /*
2717  * dp_monitor_print_pdev_tx_capture_stats() - print tx capture stats
2718  * @pdev: Datapath PDEV handle
2719  *
2720  * Return: void
2721  */
2722 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
2723 {
2724 	struct dp_mon_ops *monitor_ops;
2725 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2726 
2727 	if (!mon_soc) {
2728 		dp_mon_debug("monitor soc is NULL");
2729 		return;
2730 	}
2731 
2732 	monitor_ops = mon_soc->mon_ops;
2733 	if (!monitor_ops || !monitor_ops->mon_print_pdev_tx_capture_stats) {
2734 		dp_mon_debug("callback not registered");
2735 		return;
2736 	}
2737 
2738 	return monitor_ops->mon_print_pdev_tx_capture_stats(pdev);
2739 }
2740 
2741 /**
2742  * dp_monitor_config_enh_tx_capture() - configure tx capture
2743  * @pdev: Datapath PDEV handle
2744  * @val: mode
2745  *
2746  * Return: status
2747  */
2748 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev,
2749 							  uint32_t val)
2750 {
2751 	struct dp_mon_ops *monitor_ops;
2752 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2753 
2754 	if (!mon_soc) {
2755 		dp_mon_debug("monitor soc is NULL");
2756 		return QDF_STATUS_E_FAILURE;
2757 	}
2758 
2759 	monitor_ops = mon_soc->mon_ops;
2760 	if (!monitor_ops || !monitor_ops->mon_config_enh_tx_capture) {
2761 		dp_mon_debug("callback not registered");
2762 		return QDF_STATUS_E_FAILURE;
2763 	}
2764 
2765 	return monitor_ops->mon_config_enh_tx_capture(pdev, val);
2766 }
2767 
2768 /**
2769  * dp_monitor_tx_peer_filter() -  add tx monitor peer filter
2770  * @pdev: Datapath PDEV handle
2771  * @peer: Datapath PEER handle
2772  * @is_tx_pkt_cap_enable: flag for tx capture enable/disable
2773  * @peer_mac: peer mac address
2774  *
2775  * Return: status
2776  */
2777 static inline QDF_STATUS dp_monitor_tx_peer_filter(struct dp_pdev *pdev,
2778 						   struct dp_peer *peer,
2779 						   uint8_t is_tx_pkt_cap_enable,
2780 						   uint8_t *peer_mac)
2781 {
2782 	struct dp_mon_ops *monitor_ops;
2783 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2784 
2785 	if (!mon_soc) {
2786 		qdf_err("monitor soc is NULL");
2787 		return QDF_STATUS_E_FAILURE;
2788 	}
2789 
2790 	monitor_ops = mon_soc->mon_ops;
2791 	if (!monitor_ops || !monitor_ops->mon_tx_peer_filter) {
2792 		qdf_err("callback not registered");
2793 		return QDF_STATUS_E_FAILURE;
2794 	}
2795 
2796 	return monitor_ops->mon_tx_peer_filter(pdev, peer, is_tx_pkt_cap_enable,
2797 					       peer_mac);
2798 }
2799 #endif
2800 
2801 #ifdef WLAN_RX_PKT_CAPTURE_ENH
2802 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev,
2803 							  uint32_t val)
2804 {
2805 	struct dp_mon_ops *monitor_ops;
2806 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2807 
2808 	if (!mon_soc) {
2809 		dp_mon_debug("monitor soc is NULL");
2810 		return QDF_STATUS_E_FAILURE;
2811 	}
2812 
2813 	monitor_ops = mon_soc->mon_ops;
2814 	if (!monitor_ops || !monitor_ops->mon_config_enh_rx_capture) {
2815 		dp_mon_debug("callback not registered");
2816 		return QDF_STATUS_E_FAILURE;
2817 	}
2818 
2819 	return monitor_ops->mon_config_enh_rx_capture(pdev, val);
2820 }
2821 #else
2822 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev,
2823 							  uint32_t val)
2824 {
2825 	return QDF_STATUS_E_INVAL;
2826 }
2827 #endif
2828 
2829 #ifdef QCA_SUPPORT_BPR
2830 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev,
2831 						   uint32_t val)
2832 {
2833 	struct dp_mon_ops *monitor_ops;
2834 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2835 
2836 	if (!mon_soc) {
2837 		dp_mon_debug("monitor soc is NULL");
2838 		return QDF_STATUS_E_FAILURE;
2839 	}
2840 
2841 	monitor_ops = mon_soc->mon_ops;
2842 	if (!monitor_ops || !monitor_ops->mon_set_bpr_enable) {
2843 		dp_mon_debug("callback not registered");
2844 		return QDF_STATUS_E_FAILURE;
2845 	}
2846 
2847 	return monitor_ops->mon_set_bpr_enable(pdev, val);
2848 }
2849 #else
2850 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev,
2851 						   uint32_t val)
2852 {
2853 	return QDF_STATUS_E_FAILURE;
2854 }
2855 #endif
2856 
2857 #ifdef ATH_SUPPORT_NAC
2858 static inline
2859 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val)
2860 {
2861 	struct dp_mon_ops *monitor_ops;
2862 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2863 
2864 	if (!mon_soc) {
2865 		dp_mon_debug("monitor soc is NULL");
2866 		return 0;
2867 	}
2868 
2869 	monitor_ops = mon_soc->mon_ops;
2870 	if (!monitor_ops || !monitor_ops->mon_set_filter_neigh_peers) {
2871 		dp_mon_debug("callback not registered");
2872 		return 0;
2873 	}
2874 
2875 	return monitor_ops->mon_set_filter_neigh_peers(pdev, val);
2876 }
2877 #else
2878 static inline
2879 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val)
2880 {
2881 	return 0;
2882 }
2883 #endif
2884 
2885 #ifdef WLAN_ATF_ENABLE
2886 static inline
2887 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value)
2888 {
2889 	struct dp_mon_ops *monitor_ops;
2890 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2891 
2892 	if (!mon_soc) {
2893 		dp_mon_debug("monitor soc is NULL");
2894 		return;
2895 	}
2896 
2897 	monitor_ops = mon_soc->mon_ops;
2898 	if (!monitor_ops || !monitor_ops->mon_set_atf_stats_enable) {
2899 		dp_mon_debug("callback not registered");
2900 		return;
2901 	}
2902 
2903 	return monitor_ops->mon_set_atf_stats_enable(pdev, value);
2904 }
2905 #else
2906 static inline
2907 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value)
2908 {
2909 }
2910 #endif
2911 
2912 static inline
2913 void dp_monitor_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor)
2914 {
2915 	struct dp_mon_ops *monitor_ops;
2916 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2917 
2918 	if (!mon_soc) {
2919 		dp_mon_debug("monitor soc is NULL");
2920 		return;
2921 	}
2922 
2923 	monitor_ops = mon_soc->mon_ops;
2924 	if (!monitor_ops || !monitor_ops->mon_set_bsscolor) {
2925 		dp_mon_debug("callback not registered");
2926 		return;
2927 	}
2928 
2929 	return monitor_ops->mon_set_bsscolor(pdev, bsscolor);
2930 }
2931 
2932 static inline
2933 bool dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle)
2934 {
2935 	struct dp_mon_ops *monitor_ops;
2936 	struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
2937 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2938 
2939 	if (!mon_soc) {
2940 		dp_mon_debug("monitor soc is NULL");
2941 		return false;
2942 	}
2943 
2944 	monitor_ops = mon_soc->mon_ops;
2945 	if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_mcast_data) {
2946 		dp_mon_debug("callback not registered");
2947 		return false;
2948 	}
2949 
2950 	return monitor_ops->mon_pdev_get_filter_mcast_data(pdev_handle);
2951 }
2952 
2953 static inline
2954 bool dp_monitor_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle)
2955 {
2956 	struct dp_mon_ops *monitor_ops;
2957 	struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
2958 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2959 
2960 	if (!mon_soc) {
2961 		dp_mon_debug("monitor soc is NULL");
2962 		return false;
2963 	}
2964 
2965 	monitor_ops = mon_soc->mon_ops;
2966 	if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_non_data) {
2967 		dp_mon_debug("callback not registered");
2968 		return false;
2969 	}
2970 
2971 	return monitor_ops->mon_pdev_get_filter_non_data(pdev_handle);
2972 }
2973 
2974 static inline
2975 bool dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle)
2976 {
2977 	struct dp_mon_ops *monitor_ops;
2978 	struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
2979 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2980 
2981 	if (!mon_soc) {
2982 		dp_mon_debug("monitor soc is NULL");
2983 		return false;
2984 	}
2985 
2986 	monitor_ops = mon_soc->mon_ops;
2987 	if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_ucast_data) {
2988 		dp_mon_debug("callback not registered");
2989 		return false;
2990 	}
2991 
2992 	return monitor_ops->mon_pdev_get_filter_ucast_data(pdev_handle);
2993 }
2994 
2995 #ifdef WDI_EVENT_ENABLE
2996 static inline
2997 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
2998 				bool enable)
2999 {
3000 	struct dp_mon_ops *monitor_ops;
3001 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
3002 
3003 	if (!mon_soc) {
3004 		dp_mon_debug("monitor soc is NULL");
3005 		return 0;
3006 	}
3007 
3008 	monitor_ops = mon_soc->mon_ops;
3009 	if (!monitor_ops || !monitor_ops->mon_set_pktlog_wifi3) {
3010 		dp_mon_debug("callback not registered");
3011 		return 0;
3012 	}
3013 
3014 	return monitor_ops->mon_set_pktlog_wifi3(pdev, event, enable);
3015 }
3016 #else
3017 static inline
3018 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
3019 				bool enable)
3020 {
3021 	return 0;
3022 }
3023 #endif
3024 
3025 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG)
3026 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev)
3027 {
3028 	struct dp_mon_ops *monitor_ops;
3029 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
3030 
3031 	if (!mon_soc) {
3032 		dp_mon_debug("monitor soc is NULL");
3033 		return;
3034 	}
3035 
3036 	monitor_ops = mon_soc->mon_ops;
3037 	if (!monitor_ops || !monitor_ops->mon_pktlogmod_exit) {
3038 		dp_mon_debug("callback not registered");
3039 		return;
3040 	}
3041 
3042 	return monitor_ops->mon_pktlogmod_exit(pdev);
3043 }
3044 #else
3045 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) {}
3046 #endif
3047 
3048 static inline
3049 void dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev)
3050 {
3051 	struct dp_mon_ops *monitor_ops;
3052 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
3053 
3054 	if (!mon_soc) {
3055 		dp_mon_debug("monitor soc is NULL");
3056 		return;
3057 	}
3058 
3059 	monitor_ops = mon_soc->mon_ops;
3060 	if (!monitor_ops || !monitor_ops->mon_vdev_set_monitor_mode_buf_rings) {
3061 		dp_mon_debug("callback not registered");
3062 		return;
3063 	}
3064 
3065 	return monitor_ops->mon_vdev_set_monitor_mode_buf_rings(pdev);
3066 }
3067 
3068 static inline
3069 void dp_monitor_neighbour_peers_detach(struct dp_pdev *pdev)
3070 {
3071 	struct dp_mon_ops *monitor_ops;
3072 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
3073 
3074 	if (!mon_soc) {
3075 		dp_mon_debug("monitor soc is NULL");
3076 		return;
3077 	}
3078 
3079 	monitor_ops = mon_soc->mon_ops;
3080 	if (!monitor_ops || !monitor_ops->mon_neighbour_peers_detach) {
3081 		dp_mon_debug("callback not registered");
3082 		return;
3083 	}
3084 
3085 	return monitor_ops->mon_neighbour_peers_detach(pdev);
3086 }
3087 
3088 #ifdef FEATURE_NAC_RSSI
3089 static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev,
3090 							  uint8_t *rx_pkt_hdr)
3091 {
3092 	struct dp_mon_ops *monitor_ops;
3093 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
3094 
3095 	if (!mon_soc) {
3096 		dp_mon_debug("monitor soc is NULL");
3097 		return QDF_STATUS_E_FAILURE;
3098 	}
3099 
3100 	monitor_ops = mon_soc->mon_ops;
3101 	if (!monitor_ops || !monitor_ops->mon_filter_neighbour_peer) {
3102 		dp_mon_debug("callback not registered");
3103 		return QDF_STATUS_E_FAILURE;
3104 	}
3105 
3106 	return monitor_ops->mon_filter_neighbour_peer(pdev, rx_pkt_hdr);
3107 }
3108 #endif
3109 
3110 static inline
3111 void dp_monitor_reap_timer_init(struct dp_soc *soc)
3112 {
3113 	struct dp_mon_ops *monitor_ops;
3114 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3115 
3116 	if (!mon_soc) {
3117 		dp_mon_debug("monitor soc is NULL");
3118 		return;
3119 	}
3120 
3121 	monitor_ops = mon_soc->mon_ops;
3122 	if (!monitor_ops || !monitor_ops->mon_reap_timer_init) {
3123 		dp_mon_debug("callback not registered");
3124 		return;
3125 	}
3126 
3127 	monitor_ops->mon_reap_timer_init(soc);
3128 }
3129 
3130 static inline
3131 void dp_monitor_reap_timer_deinit(struct dp_soc *soc)
3132 {
3133 	struct dp_mon_ops *monitor_ops;
3134 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3135 
3136 	if (!mon_soc) {
3137 		dp_mon_debug("monitor soc is NULL");
3138 		return;
3139 	}
3140 
3141 	monitor_ops = mon_soc->mon_ops;
3142 	if (!monitor_ops || !monitor_ops->mon_reap_timer_deinit) {
3143 		dp_mon_debug("callback not registered");
3144 		return;
3145 	}
3146 
3147 	monitor_ops->mon_reap_timer_deinit(soc);
3148 }
3149 
3150 static inline
3151 void dp_monitor_reap_timer_start(struct dp_soc *soc)
3152 {
3153 	struct dp_mon_ops *monitor_ops;
3154 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3155 
3156 	if (!mon_soc) {
3157 		dp_mon_debug("monitor soc is NULL");
3158 		return;
3159 	}
3160 
3161 	monitor_ops = mon_soc->mon_ops;
3162 	if (!monitor_ops || !monitor_ops->mon_reap_timer_start) {
3163 		dp_mon_debug("callback not registered");
3164 		return;
3165 	}
3166 
3167 	monitor_ops->mon_reap_timer_start(soc);
3168 }
3169 
3170 static inline
3171 bool dp_monitor_reap_timer_stop(struct dp_soc *soc)
3172 {
3173 	struct dp_mon_ops *monitor_ops;
3174 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3175 
3176 	if (!mon_soc) {
3177 		dp_mon_debug("monitor soc is NULL");
3178 		return false;
3179 	}
3180 
3181 	monitor_ops = mon_soc->mon_ops;
3182 	if (!monitor_ops || !monitor_ops->mon_reap_timer_stop) {
3183 		dp_mon_debug("callback not registered");
3184 		return false;
3185 	}
3186 
3187 	return monitor_ops->mon_reap_timer_stop(soc);
3188 }
3189 
3190 static inline
3191 void dp_monitor_vdev_timer_init(struct dp_soc *soc)
3192 {
3193 	struct dp_mon_ops *monitor_ops;
3194 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3195 
3196 	if (!mon_soc) {
3197 		dp_mon_debug("monitor soc is NULL");
3198 		return;
3199 	}
3200 
3201 	monitor_ops = mon_soc->mon_ops;
3202 	if (!monitor_ops || !monitor_ops->mon_vdev_timer_init) {
3203 		dp_mon_debug("callback not registered");
3204 		return;
3205 	}
3206 
3207 	monitor_ops->mon_vdev_timer_init(soc);
3208 }
3209 
3210 static inline
3211 void dp_monitor_vdev_timer_deinit(struct dp_soc *soc)
3212 {
3213 	struct dp_mon_ops *monitor_ops;
3214 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3215 
3216 	if (!mon_soc) {
3217 		dp_mon_debug("monitor soc is NULL");
3218 		return;
3219 	}
3220 
3221 	monitor_ops = mon_soc->mon_ops;
3222 	if (!monitor_ops || !monitor_ops->mon_vdev_timer_deinit) {
3223 		dp_mon_debug("callback not registered");
3224 		return;
3225 	}
3226 
3227 	monitor_ops->mon_vdev_timer_deinit(soc);
3228 }
3229 
3230 static inline
3231 void dp_monitor_vdev_timer_start(struct dp_soc *soc)
3232 {
3233 	struct dp_mon_ops *monitor_ops;
3234 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3235 
3236 	if (!mon_soc) {
3237 		dp_mon_debug("monitor soc is NULL");
3238 		return;
3239 	}
3240 
3241 	monitor_ops = mon_soc->mon_ops;
3242 	if (!monitor_ops || !monitor_ops->mon_vdev_timer_start) {
3243 		dp_mon_debug("callback not registered");
3244 		return;
3245 	}
3246 
3247 	monitor_ops->mon_vdev_timer_start(soc);
3248 }
3249 
3250 static inline
3251 bool dp_monitor_vdev_timer_stop(struct dp_soc *soc)
3252 {
3253 	struct dp_mon_ops *monitor_ops;
3254 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3255 
3256 	if (!mon_soc) {
3257 		dp_mon_debug("monitor soc is NULL");
3258 		return false;
3259 	}
3260 
3261 	monitor_ops = mon_soc->mon_ops;
3262 	if (!monitor_ops || !monitor_ops->mon_vdev_timer_stop) {
3263 		dp_mon_debug("callback not registered");
3264 		return false;
3265 	}
3266 
3267 	return monitor_ops->mon_vdev_timer_stop(soc);
3268 }
3269 
3270 #ifdef QCA_MCOPY_SUPPORT
3271 static inline
3272 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev,
3273 					  uint16_t peer_id, uint32_t ppdu_id,
3274 					  uint8_t first_msdu)
3275 {
3276 	struct dp_mon_ops *monitor_ops;
3277 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
3278 
3279 	if (!mon_soc) {
3280 		dp_mon_debug("monitor soc is NULL");
3281 		return QDF_STATUS_E_FAILURE;
3282 	}
3283 
3284 	monitor_ops = mon_soc->mon_ops;
3285 	if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) {
3286 		dp_mon_debug("callback not registered");
3287 		return QDF_STATUS_E_FAILURE;
3288 	}
3289 
3290 	return monitor_ops->mon_mcopy_check_deliver(pdev, peer_id,
3291 						    ppdu_id, first_msdu);
3292 }
3293 #else
3294 static inline
3295 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev,
3296 					  uint16_t peer_id, uint32_t ppdu_id,
3297 					  uint8_t first_msdu)
3298 {
3299 	return QDF_STATUS_SUCCESS;
3300 }
3301 #endif
3302 
3303 /*
3304  * dp_monitor_neighbour_peer_add_ast() - Add ast entry
3305  * @pdev: point to dp pdev
3306  * @ta_peer: point to peer
3307  * @mac_addr: mac address
3308  * @nbuf: point to nbuf
3309  * @flags: flags
3310  *
3311  * Return: void
3312  */
3313 static inline void
3314 dp_monitor_neighbour_peer_add_ast(struct dp_pdev *pdev,
3315 				  struct dp_peer *ta_peer,
3316 				  uint8_t *mac_addr,
3317 				  qdf_nbuf_t nbuf,
3318 				  uint32_t flags)
3319 {
3320 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
3321 	struct dp_mon_ops *monitor_ops;
3322 
3323 	if (!mon_soc) {
3324 		dp_mon_debug("monitor soc is NULL");
3325 		return;
3326 	}
3327 
3328 	monitor_ops = mon_soc->mon_ops;
3329 	if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) {
3330 		dp_mon_debug("callback not registered");
3331 		return;
3332 	}
3333 
3334 	return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr,
3335 						       nbuf, flags);
3336 }
3337 
3338 /*
3339  * dp_monitor_vdev_delete() - delete monitor vdev
3340  * @soc: point to dp soc
3341  * @vdev: point to dp vdev
3342  *
3343  * Return: void
3344  */
3345 static inline void dp_monitor_vdev_delete(struct dp_soc *soc,
3346 					  struct dp_vdev *vdev)
3347 {
3348 	if (soc->intr_mode == DP_INTR_POLL) {
3349 		qdf_timer_sync_cancel(&soc->int_timer);
3350 		dp_monitor_flush_rings(soc);
3351 	} else if (soc->intr_mode == DP_INTR_MSI) {
3352 		if (dp_monitor_vdev_timer_stop(soc))
3353 			dp_monitor_flush_rings(soc);
3354 	}
3355 
3356 	dp_monitor_vdev_detach(vdev);
3357 }
3358 
3359 #ifdef DP_POWER_SAVE
3360 /*
3361  * dp_monitor_pktlog_reap_pending_frames() - reap pending frames
3362  * @pdev: point to dp pdev
3363  *
3364  * Return: void
3365  */
3366 static inline void dp_monitor_pktlog_reap_pending_frames(struct dp_pdev *pdev)
3367 {
3368 	struct dp_soc *soc;
3369 
3370 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
3371 		return;
3372 
3373 	soc = pdev->soc;
3374 
3375 	if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
3376 	     dp_mon_is_enable_reap_timer_non_pkt(pdev))) {
3377 		if (dp_monitor_reap_timer_stop(soc))
3378 			dp_monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
3379 	}
3380 }
3381 
3382 /*
3383  * dp_monitor_pktlog_start_reap_timer() - start reap timer
3384  * @pdev: point to dp pdev
3385  *
3386  * Return: void
3387  */
3388 static inline void dp_monitor_pktlog_start_reap_timer(struct dp_pdev *pdev)
3389 {
3390 	struct dp_soc *soc;
3391 
3392 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
3393 		return;
3394 
3395 	soc = pdev->soc;
3396 	if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
3397 	     dp_mon_is_enable_reap_timer_non_pkt(pdev)))
3398 		dp_monitor_reap_timer_start(soc);
3399 }
3400 #endif
3401 
3402 /*
3403  * dp_monitor_neighbour_peer_list_remove() - remove neighbour peer list
3404  * @pdev: point to dp pdev
3405  * @vdev: point to dp vdev
3406  * @peer: point to dp_neighbour_peer
3407  *
3408  * Return: void
3409  */
3410 static inline
3411 void dp_monitor_neighbour_peer_list_remove(struct dp_pdev *pdev,
3412 					   struct dp_vdev *vdev,
3413 					   struct dp_neighbour_peer *peer)
3414 {
3415 	struct dp_mon_pdev *mon_pdev;
3416 	struct dp_neighbour_peer *temp_peer = NULL;
3417 
3418 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
3419 		return;
3420 
3421 	mon_pdev = pdev->monitor_pdev;
3422 	qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
3423 	if (!pdev->soc->monitor_soc->hw_nac_monitor_support) {
3424 		TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
3425 			      neighbour_peer_list_elem) {
3426 				QDF_ASSERT(peer->vdev != vdev);
3427 			}
3428 	} else {
3429 		TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list,
3430 				   neighbour_peer_list_elem, temp_peer) {
3431 			if (peer->vdev == vdev) {
3432 				TAILQ_REMOVE(&mon_pdev->neighbour_peers_list,
3433 					     peer,
3434 					     neighbour_peer_list_elem);
3435 				qdf_mem_free(peer);
3436 			}
3437 		}
3438 	}
3439 	qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
3440 }
3441 
3442 static inline
3443 void dp_monitor_pdev_set_mon_vdev(struct dp_vdev *vdev)
3444 {
3445 	if (!vdev->pdev->monitor_pdev)
3446 		return;
3447 
3448 	vdev->pdev->monitor_pdev->mvdev = vdev;
3449 }
3450 
3451 static inline
3452 void dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev *pdev, bool val)
3453 {
3454 	if (!pdev || !pdev->monitor_pdev)
3455 		return;
3456 
3457 	pdev->monitor_pdev->scan_spcl_vap_configured = val;
3458 }
3459 
3460 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
3461 static inline
3462 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev,
3463 						      bool val)
3464 {
3465 	if (!pdev || !pdev->monitor_pdev)
3466 		return;
3467 
3468 	pdev->monitor_pdev->reset_scan_spcl_vap_stats_enable = val;
3469 }
3470 #else
3471 static inline
3472 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev,
3473 						      bool val)
3474 {
3475 }
3476 #endif
3477 
3478 static inline void
3479 dp_mon_rx_wmask_subscribe(struct dp_soc *soc, uint32_t *msg_word,
3480 			  struct htt_rx_ring_tlv_filter *tlv_filter)
3481 {
3482 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3483 	struct dp_mon_ops *monitor_ops;
3484 
3485 	if (!mon_soc) {
3486 		dp_mon_debug("mon soc is NULL");
3487 		return;
3488 
3489 	}
3490 
3491 	monitor_ops = mon_soc->mon_ops;
3492 	if (!monitor_ops || !monitor_ops->rx_wmask_subscribe) {
3493 		dp_mon_debug("callback not registered");
3494 		return;
3495 	}
3496 
3497 	monitor_ops->rx_wmask_subscribe(msg_word, tlv_filter);
3498 }
3499 
3500 static inline void
3501 dp_mon_rx_enable_mpdu_logging(struct dp_soc *soc, uint32_t *msg_word,
3502 			      struct htt_rx_ring_tlv_filter *tlv_filter)
3503 {
3504 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3505 	struct dp_mon_ops *monitor_ops;
3506 
3507 	if (!mon_soc) {
3508 		dp_mon_debug("mon soc is NULL");
3509 		return;
3510 
3511 	}
3512 
3513 	monitor_ops = mon_soc->mon_ops;
3514 	if (!monitor_ops || !monitor_ops->rx_enable_mpdu_logging) {
3515 		dp_mon_debug("callback not registered");
3516 		return;
3517 	}
3518 
3519 	monitor_ops->rx_enable_mpdu_logging(msg_word, tlv_filter);
3520 }
3521 
3522 static inline void
3523 dp_mon_rx_packet_length_set(struct dp_soc *soc, uint32_t *msg_word,
3524 			    struct htt_rx_ring_tlv_filter *tlv_filter)
3525 {
3526 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
3527 	struct dp_mon_ops *monitor_ops;
3528 
3529 	if (!mon_soc) {
3530 		dp_mon_debug("mon soc is NULL");
3531 		return;
3532 
3533 	}
3534 
3535 	monitor_ops = mon_soc->mon_ops;
3536 	if (!monitor_ops || !monitor_ops->rx_packet_length_set) {
3537 		dp_mon_debug("callback not registered");
3538 		return;
3539 	}
3540 
3541 	monitor_ops->rx_packet_length_set(msg_word, tlv_filter);
3542 }
3543 
3544 #ifdef QCA_ENHANCED_STATS_SUPPORT
3545 QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev,
3546 				    struct cdp_rx_stats_ppdu_user *ppdu_user);
3547 #endif
3548 
3549 /*
3550  * dp_print_pdev_rx_mon_stats() - print rx mon stats
3551  * @pdev: device object
3552  *
3553  * Return: void
3554  */
3555 void
3556 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev);
3557 
3558 /**
3559  * dp_mcopy_check_deliver() - mcopy check deliver
3560  * @pdev: DP pdev handle
3561  * @peer_id: peer id
3562  * @ppdu_id: ppdu
3563  * @first_msdu: flag to indicate first msdu of ppdu
3564  * Return: 0 on success, not 0 on failure
3565  */
3566 QDF_STATUS dp_mcopy_check_deliver(struct dp_pdev *pdev,
3567 				  uint16_t peer_id,
3568 				  uint32_t ppdu_id,
3569 				  uint8_t first_msdu);
3570 
3571 /**
3572  * dp_pdev_set_advance_monitor_filter() - Set DP PDEV monitor filter
3573  * @soc: soc handle
3574  * @pdev_id: id of Datapath PDEV handle
3575  * @filter_val: Flag to select Filter for monitor mode
3576  * Return: 0 on success, not 0 on failure
3577  */
3578 #ifdef QCA_ADVANCE_MON_FILTER_SUPPORT
3579 QDF_STATUS
3580 dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
3581 				   struct cdp_monitor_filter *filter_val);
3582 #else
3583 static inline QDF_STATUS
3584 dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
3585 				   struct cdp_monitor_filter *filter_val)
3586 {
3587 	return QDF_STATUS_E_INVAL;
3588 }
3589 #endif /* QCA_ADVANCE_MON_FILTER_SUPPORT */
3590 
3591 /**
3592  * dp_deliver_tx_mgmt() - Deliver mgmt frame for tx capture
3593  * @cdp_soc : data path soc handle
3594  * @pdev_id : pdev_id
3595  * @nbuf: Management frame buffer
3596  */
3597 QDF_STATUS
3598 dp_deliver_tx_mgmt(struct cdp_soc_t *cdp_soc, uint8_t pdev_id, qdf_nbuf_t nbuf);
3599 
3600 /**
3601  * dp_filter_neighbour_peer() - API to filter neighbour peer
3602  * @pdev : DP pdev handle
3603  * @rx_pkt_hdr : packet header
3604  *
3605  * return: QDF_STATUS_SUCCESS on success
3606  *	   QDF_STATUS_E_FAILURE on failure
3607  */
3608 #ifdef FEATURE_NAC_RSSI
3609 QDF_STATUS dp_filter_neighbour_peer(struct dp_pdev *pdev,
3610 				    uint8_t *rx_pkt_hdr);
3611 #else
3612 static inline
3613 QDF_STATUS dp_filter_neighbour_peer(struct dp_pdev *pdev,
3614 				    uint8_t *rx_pkt_hdr)
3615 {
3616 	return QDF_STATUS_SUCCESS;
3617 }
3618 #endif /* FEATURE_NAC_RSSI */
3619 
3620 /*
3621  * dp_neighbour_peers_detach() - Detach neighbour peers(nac clients)
3622  * @pdev: device object
3623  *
3624  * Return: void
3625  */
3626 void dp_neighbour_peers_detach(struct dp_pdev *pdev);
3627 
3628 /**
3629  * dp_reset_monitor_mode() - Disable monitor mode
3630  * @soc_hdl: Datapath soc handle
3631  * @pdev_id: id of datapath PDEV handle
3632  * @smart_monitor: smart monitor flag
3633  *
3634  * Return: QDF_STATUS
3635  */
3636 QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl,
3637 				 uint8_t pdev_id,
3638 				 uint8_t smart_monitor);
3639 
3640 static inline
3641 struct dp_mon_ops *dp_mon_ops_get(struct dp_soc *soc)
3642 {
3643 	if (soc && soc->monitor_soc)
3644 		return soc->monitor_soc->mon_ops;
3645 
3646 	return NULL;
3647 }
3648 
3649 static inline
3650 struct cdp_mon_ops *dp_mon_cdp_ops_get(struct dp_soc *soc)
3651 {
3652 	struct cdp_ops *ops = soc->cdp_soc.ops;
3653 
3654 	return ops->mon_ops;
3655 }
3656 
3657 /**
3658  * dp_ppdu_desc_user_stats_update(): Function to update TX user stats
3659  * @pdev: DP pdev handle
3660  * @ppdu_info: per PPDU TLV descriptor
3661  *
3662  * return: void
3663  */
3664 #ifdef QCA_ENHANCED_STATS_SUPPORT
3665 void
3666 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
3667 			       struct ppdu_info *ppdu_info);
3668 #else
3669 static inline void
3670 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
3671 			       struct ppdu_info *ppdu_info)
3672 {
3673 }
3674 #endif /* QCA_ENHANCED_STATS_SUPPORT */
3675 
3676 /**
3677  * dp_mon_ops_register_1_0(): register legacy monitor ops
3678  * @mon_soc: monitor soc handle
3679  *
3680  * return: void
3681  */
3682 void dp_mon_ops_register_1_0(struct dp_mon_soc *mon_soc);
3683 
3684 /**
3685  * dp_mon_cdp_ops_register_1_0(): register legacy monitor cdp ops
3686  * @ops: cdp ops handle
3687  *
3688  * return: void
3689  */
3690 void dp_mon_cdp_ops_register_1_0(struct cdp_ops *ops);
3691 
3692 #ifdef QCA_MONITOR_2_0_SUPPORT
3693 /**
3694  * dp_mon_ops_register_2_0(): register monitor ops
3695  * @mon_soc: monitor soc handle
3696  *
3697  * return: void
3698  */
3699 void dp_mon_ops_register_2_0(struct dp_mon_soc *mon_soc);
3700 
3701 /**
3702  * dp_mon_cdp_ops_register_2_0(): register monitor cdp ops
3703  * @ops: cdp ops handle
3704  *
3705  * return: void
3706  */
3707 void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops);
3708 #endif /* QCA_MONITOR_2_0_SUPPORT */
3709 
3710 /**
3711  * dp_mon_register_feature_ops(): Register mon feature ops
3712  * @soc: Datapath soc context
3713  *
3714  * return: void
3715  */
3716 static inline
3717 void dp_mon_register_feature_ops(struct dp_soc *soc)
3718 {
3719 	struct dp_mon_ops *mon_ops = NULL;
3720 
3721 	mon_ops = dp_mon_ops_get(soc);
3722 	if (!mon_ops) {
3723 		dp_mon_err("Monitor ops is NULL");
3724 		return;
3725 	}
3726 	if (mon_ops->mon_register_feature_ops)
3727 		mon_ops->mon_register_feature_ops(soc);
3728 }
3729 
3730 /**
3731  * dp_pdev_get_rx_mon_stats(): Get pdev Rx monitor stats
3732  * @soc_hdl: soc handle
3733  * @pdev_id: id of pdev handle
3734  * @stats: User allocated stats buffer
3735  *
3736  * return: status success/failure
3737  */
3738 QDF_STATUS dp_pdev_get_rx_mon_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
3739 				    struct cdp_pdev_mon_stats *stats);
3740 #endif /* _DP_MON_H_ */
3741