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