xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/monitor/dp_mon.h (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
3 
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7 
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef _DP_MON_H_
18 #define _DP_MON_H_
19 
20 #include "qdf_trace.h"
21 #include "dp_internal.h"
22 #include "dp_types.h"
23 #include "dp_htt.h"
24 
25 #ifdef WLAN_TX_PKT_CAPTURE_ENH
26 #include "dp_tx_capture.h"
27 #endif
28 
29 #define DP_INTR_POLL_TIMER_MS	5
30 
31 #define MON_VDEV_TIMER_INIT 0x1
32 #define MON_VDEV_TIMER_RUNNING 0x2
33 
34 /* Budget to reap monitor status ring */
35 #define DP_MON_REAP_BUDGET 1024
36 #define MON_BUF_MIN_ENTRIES 64
37 
38 #define RNG_ERR		"SRNG setup failed for"
39 #define dp_mon_info(params...) \
40 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_MON, ## params)
41 #define dp_mon_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_MON, params)
42 #define dp_mon_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_MON, params)
43 #define dp_mon_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_MON, params)
44 
45 struct dp_mon_ops {
46 	QDF_STATUS (*mon_soc_cfg_init)(struct dp_soc *soc);
47 	QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev);
48 	QDF_STATUS (*mon_pdev_detach)(struct dp_pdev *pdev);
49 	QDF_STATUS (*mon_pdev_init)(struct dp_pdev *pdev);
50 	QDF_STATUS (*mon_pdev_deinit)(struct dp_pdev *pdev);
51 	QDF_STATUS (*mon_vdev_attach)(struct dp_vdev *vdev);
52 	QDF_STATUS (*mon_vdev_detach)(struct dp_vdev *vdev);
53 	QDF_STATUS (*mon_peer_attach)(struct dp_peer *peer);
54 	QDF_STATUS (*mon_peer_detach)(struct dp_peer *peer);
55 	QDF_STATUS (*mon_config_debug_sniffer)(struct dp_pdev *pdev, int val);
56 	void (*mon_flush_rings)(struct dp_soc *soc);
57 #if !defined(DISABLE_MON_CONFIG)
58 	QDF_STATUS (*mon_htt_srng_setup)(struct dp_soc *soc,
59 					 struct dp_pdev *pdev,
60 					 int mac_id,
61 					 int mac_for_pdev);
62 #endif
63 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC)
64 	uint32_t (*mon_drop_packets_for_mac)(struct dp_pdev *pdev,
65 					     uint32_t mac_id,
66 					     uint32_t quota);
67 #endif
68 #if defined(DP_CON_MON)
69 	void (*mon_service_rings)(struct  dp_soc *soc, uint32_t quota);
70 #endif
71 #ifndef DISABLE_MON_CONFIG
72 	uint32_t (*mon_process)(struct dp_soc *soc,
73 				struct dp_intr *int_ctx,
74 				uint32_t mac_id,
75 				uint32_t quota);
76 #endif
77 	void (*mon_peer_tx_init)(struct dp_pdev *pdev, struct dp_peer *peer);
78 	void (*mon_peer_tx_cleanup)(struct dp_vdev *vdev,
79 				    struct dp_peer *peer);
80 #ifdef WLAN_TX_PKT_CAPTURE_ENH
81 	void (*mon_peer_tid_peer_id_update)(struct dp_peer *peer,
82 					    uint16_t peer_id);
83 	void (*mon_tx_ppdu_stats_attach)(struct dp_pdev *pdev);
84 	void (*mon_tx_ppdu_stats_detach)(struct dp_pdev *pdev);
85 	QDF_STATUS (*mon_tx_capture_debugfs_init)(struct dp_pdev *pdev);
86 	void (*mon_peer_tx_capture_filter_check)(struct dp_pdev *pdev,
87 						 struct dp_peer *peer);
88 	QDF_STATUS (*mon_tx_add_to_comp_queue)(struct dp_soc *soc,
89 					       struct dp_tx_desc_s *desc,
90 					       struct hal_tx_completion_status *ts,
91 					       struct dp_peer *peer);
92 	QDF_STATUS (*mon_update_msdu_to_list)(struct dp_soc *soc,
93 					      struct dp_pdev *pdev,
94 					      struct dp_peer *peer,
95 					      struct hal_tx_completion_status *ts,
96 					      qdf_nbuf_t netbuf);
97 #endif
98 #if defined(WDI_EVENT_ENABLE) &&\
99 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
100 	bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc,
101 					   uint32_t *msg_word,
102 					   qdf_nbuf_t htt_t2h_msg);
103 #endif
104 	QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev);
105 	void (*mon_htt_ppdu_stats_detach)(struct dp_pdev *pdev);
106 	void (*mon_print_pdev_rx_mon_stats)(struct dp_pdev *pdev);
107 
108 #ifdef WLAN_TX_PKT_CAPTURE_ENH
109 	void (*mon_print_pdev_tx_capture_stats)(struct dp_pdev *pdev);
110 	QDF_STATUS (*mon_config_enh_tx_capture)(struct dp_pdev *pdev,
111 						uint8_t val);
112 #endif
113 #ifdef WLAN_RX_PKT_CAPTURE_ENH
114 	QDF_STATUS (*mon_config_enh_rx_capture)(struct dp_pdev *pdev,
115 						uint8_t val);
116 #endif
117 #ifdef QCA_SUPPORT_BPR
118 	QDF_STATUS (*mon_set_bpr_enable)(struct dp_pdev *pdev, int val);
119 #endif
120 #ifdef ATH_SUPPORT_NAC
121 	int (*mon_set_filter_neigh_peers)(struct dp_pdev *pdev, bool val);
122 #endif
123 #ifdef WLAN_ATF_ENABLE
124 	void (*mon_set_atf_stats_enable)(struct dp_pdev *pdev, bool value);
125 #endif
126 	void (*mon_set_bsscolor)(struct dp_pdev *pdev, uint8_t bsscolor);
127 	bool (*mon_pdev_get_filter_ucast_data)(struct cdp_pdev *pdev_handle);
128 	bool (*mon_pdev_get_filter_non_data)(struct cdp_pdev *pdev_handle);
129 	bool (*mon_pdev_get_filter_mcast_data)(struct cdp_pdev *pdev_handle);
130 #ifdef WDI_EVENT_ENABLE
131 	int (*mon_set_pktlog_wifi3)(struct dp_pdev *pdev, uint32_t event,
132 				    bool enable);
133 #endif
134 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG)
135 	void (*mon_pktlogmod_exit)(struct dp_pdev *pdev);
136 #endif
137 	void (*mon_vdev_set_monitor_mode_buf_rings)(struct dp_pdev *pdev);
138 	void (*mon_neighbour_peers_detach)(struct dp_pdev *pdev);
139 #ifdef FEATURE_NAC_RSSI
140 	QDF_STATUS (*mon_filter_neighbour_peer)(struct dp_pdev *pdev,
141 						uint8_t *rx_pkt_hdr);
142 #endif
143 	void (*mon_vdev_timer_init)(struct dp_soc *soc);
144 	void (*mon_vdev_timer_start)(struct dp_soc *soc);
145 	bool (*mon_vdev_timer_stop)(struct dp_soc *soc);
146 	void (*mon_vdev_timer_deinit)(struct dp_soc *soc);
147 	void (*mon_reap_timer_init)(struct dp_soc *soc);
148 	void (*mon_reap_timer_start)(struct dp_soc *soc);
149 	bool (*mon_reap_timer_stop)(struct dp_soc *soc);
150 	void (*mon_reap_timer_deinit)(struct dp_soc *soc);
151 #ifdef QCA_MCOPY_SUPPORT
152 	QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_pdev *pdev,
153 					      uint16_t peer_id,
154 					      uint32_t ppdu_id,
155 					      uint8_t first_msdu);
156 #endif
157 	void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev,
158 					   struct dp_peer *ta_peer,
159 					   uint8_t *mac_addr,
160 					   qdf_nbuf_t nbuf,
161 					   uint32_t flags);
162 };
163 
164 struct dp_mon_soc {
165 	/* Holds all monitor related fields extracted from dp_soc */
166 	/* Holds pointer to monitor ops */
167 	/* monitor link descriptor pages */
168 	struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW];
169 
170 	/* total link descriptors for monitor mode for each radio */
171 	uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW];
172 
173 	 /* Monitor Link descriptor memory banks */
174 	struct link_desc_bank
175 		mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS];
176 	uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW];
177 	/* Smart monitor capability for HKv2 */
178 	uint8_t hw_nac_monitor_support;
179 
180 	/* Full monitor mode support */
181 	bool full_mon_mode;
182 
183 	/*interrupt timer*/
184 	qdf_timer_t mon_reap_timer;
185 	uint8_t reap_timer_init;
186 
187 	qdf_timer_t mon_vdev_timer;
188 	uint8_t mon_vdev_timer_state;
189 
190 	struct dp_mon_ops *mon_ops;
191 	bool monitor_mode_v2;
192 };
193 
194 struct  dp_mon_pdev {
195 	/* monitor */
196 	bool monitor_configured;
197 
198 	struct dp_mon_filter **filter;	/* Monitor Filter pointer */
199 
200 	/* advance filter mode and type*/
201 	uint8_t mon_filter_mode;
202 	uint16_t fp_mgmt_filter;
203 	uint16_t fp_ctrl_filter;
204 	uint16_t fp_data_filter;
205 	uint16_t mo_mgmt_filter;
206 	uint16_t mo_ctrl_filter;
207 	uint16_t mo_data_filter;
208 	uint16_t md_data_filter;
209 
210 #ifdef WLAN_TX_PKT_CAPTURE_ENH
211 	struct dp_pdev_tx_capture tx_capture;
212 #endif
213 
214 	/* tx packet capture enhancement */
215 	enum cdp_tx_enh_capture_mode tx_capture_enabled;
216 	/* Stuck count on monitor destination ring MPDU process */
217 	uint32_t mon_dest_ring_stuck_cnt;
218 	/* monitor mode lock */
219 	qdf_spinlock_t mon_lock;
220 
221 	/* Monitor mode operation channel */
222 	int mon_chan_num;
223 
224 	/* Monitor mode operation frequency */
225 	qdf_freq_t mon_chan_freq;
226 
227 	/* Monitor mode band */
228 	enum reg_wifi_band mon_chan_band;
229 
230 	uint32_t mon_ppdu_status;
231 	/* monitor mode status/destination ring PPDU and MPDU count */
232 	struct cdp_pdev_mon_stats rx_mon_stats;
233 	/* Monitor mode interface and status storage */
234 	struct dp_vdev *mvdev;
235 	struct cdp_mon_status rx_mon_recv_status;
236 	/* to track duplicate link descriptor indications by HW for a WAR */
237 	uint64_t mon_last_linkdesc_paddr;
238 	/* to track duplicate buffer indications by HW for a WAR */
239 	uint32_t mon_last_buf_cookie;
240 
241 #ifdef QCA_SUPPORT_FULL_MON
242 	/* List to maintain all MPDUs for a PPDU in monitor mode */
243 	TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q;
244 
245 	/* TODO: define per-user mpdu list
246 	 * struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS];
247 	 */
248 	struct hal_rx_mon_desc_info *mon_desc;
249 #endif
250 	/* Flag to hold on to monitor destination ring */
251 	bool hold_mon_dest_ring;
252 
253 	/* Flag to inidicate monitor rings are initialized */
254 	uint8_t pdev_mon_init;
255 #ifndef REMOVE_PKT_LOG
256 	bool pkt_log_init;
257 	struct pktlog_dev_t *pl_dev; /* Pktlog pdev */
258 #endif /* #ifndef REMOVE_PKT_LOG */
259 
260 	/* Smart Mesh */
261 	bool filter_neighbour_peers;
262 
263 	/*flag to indicate neighbour_peers_list not empty */
264 	bool neighbour_peers_added;
265 	/* smart mesh mutex */
266 	qdf_spinlock_t neighbour_peer_mutex;
267 	/* Neighnour peer list */
268 	TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list;
269 	/* Enhanced Stats is enabled */
270 	bool enhanced_stats_en;
271 	qdf_nbuf_queue_t rx_status_q;
272 
273 	/* 128 bytes mpdu header queue per user for ppdu */
274 	qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS];
275 
276 	/* is this a mpdu header TLV and not msdu header TLV */
277 	bool is_mpdu_hdr[MAX_MU_USERS];
278 
279 	/* per user 128 bytes msdu header list for MPDU */
280 	struct msdu_list msdu_list[MAX_MU_USERS];
281 
282 	/* RX enhanced capture mode */
283 	uint8_t rx_enh_capture_mode;
284 	/* Rx per peer enhanced capture mode */
285 	bool rx_enh_capture_peer;
286 	struct dp_vdev *rx_enh_monitor_vdev;
287 	/* RX enhanced capture trailer enable/disable flag */
288 	bool is_rx_enh_capture_trailer_enabled;
289 #ifdef WLAN_RX_PKT_CAPTURE_ENH
290 	/* RX per MPDU/PPDU information */
291 	struct cdp_rx_indication_mpdu mpdu_ind;
292 #endif
293 
294 	/* Packet log mode */
295 	uint8_t rx_pktlog_mode;
296 	/* Enable pktlog logging cbf */
297 	bool rx_pktlog_cbf;
298 
299 	bool tx_sniffer_enable;
300 	/* mirror copy mode */
301 	enum m_copy_mode mcopy_mode;
302 	bool enable_reap_timer_non_pkt;
303 	bool bpr_enable;
304 	/* Pdev level flag to check peer based pktlog enabled or
305 	 * disabled
306 	 */
307 	uint8_t dp_peer_based_pktlog;
308 
309 #ifdef WLAN_ATF_ENABLE
310 	/* ATF stats enable */
311 	bool dp_atf_stats_enable;
312 #endif
313 
314 	/* Maintains first status buffer's paddr of a PPDU */
315 	uint64_t status_buf_addr;
316 	struct hal_rx_ppdu_info ppdu_info;
317 
318 	/* ppdu_id of last received HTT TX stats */
319 	uint32_t last_ppdu_id;
320 	struct {
321 		uint8_t last_user;
322 		qdf_nbuf_t buf;
323 	} tx_ppdu_info;
324 
325 	struct {
326 		uint32_t tx_ppdu_id;
327 		uint16_t tx_peer_id;
328 		uint32_t rx_ppdu_id;
329 	} m_copy_id;
330 
331 	/* To check if PPDU Tx stats are enabled for Pktlog */
332 	bool pktlog_ppdu_stats;
333 
334 #ifdef ATH_SUPPORT_NAC_RSSI
335 	bool nac_rssi_filtering;
336 #endif
337 
338 	/* ppdu_stats lock for queue concurrency between cores*/
339 	qdf_spinlock_t ppdu_stats_lock;
340 
341 	/* list of ppdu tlvs */
342 	TAILQ_HEAD(, ppdu_info) ppdu_info_list;
343 	TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list;
344 
345 	uint32_t sched_comp_list_depth;
346 	uint16_t delivered_sched_cmdid;
347 	uint16_t last_sched_cmdid;
348 	uint32_t tlv_count;
349 	uint32_t list_depth;
350 
351 	struct {
352 		qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */
353 		uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */
354 		uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */
355 		uint32_t ppdu_id;
356 	} mgmtctrl_frm_info;
357 	/* Context of cal client timer */
358 	struct cdp_cal_client *cal_client_ctx;
359 	uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/
360 
361 	qdf_nbuf_t mcopy_status_nbuf;
362 	bool is_dp_mon_pdev_initialized;
363 	/* indicates if spcl vap is configured */
364 	bool scan_spcl_vap_configured;
365 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
366 	/* enable spcl vap stats reset on ch change */
367 	bool reset_scan_spcl_vap_stats_enable;
368 #endif
369 };
370 
371 struct  dp_mon_vdev {
372 	/* callback to hand rx monitor 802.11 MPDU to the OS shim */
373 	ol_txrx_rx_mon_fp osif_rx_mon;
374 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
375 	struct cdp_scan_spcl_vap_stats *scan_spcl_vap_stats;
376 #endif
377 };
378 
379 struct dp_mon_peer {
380 #ifdef WLAN_TX_PKT_CAPTURE_ENH
381 	struct dp_peer_tx_capture tx_capture;
382 #endif
383 #ifdef FEATURE_PERPKT_INFO
384 	/* delayed ba ppdu stats handling */
385 	struct cdp_delayed_tx_completion_ppdu_user delayed_ba_ppdu_stats;
386 	/* delayed ba flag */
387 	bool last_delayed_ba;
388 	/* delayed ba ppdu id */
389 	uint32_t last_delayed_ba_ppduid;
390 #endif
391 };
392 
393 #if defined(QCA_TX_CAPTURE_SUPPORT) || defined(QCA_ENHANCED_STATS_SUPPORT)
394 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
395 #else
396 static inline
397 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
398 {
399 }
400 #endif
401 
402 #if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\
403 	defined(WLAN_SUPPORT_RX_FLOW_TAG)
404 /**
405  * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor
406  *                                       mode and then tags appropriate packets
407  * @soc: core txrx main context
408  * @vdev: pdev on which packet is received
409  * @msdu: QDF packet buffer on which the protocol tag should be set
410  * @rx_desc: base address where the RX TLVs start
411  * Return: void
412  */
413 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc,
414 					struct dp_pdev *dp_pdev,
415 					qdf_nbuf_t msdu, void *rx_desc);
416 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */
417 
418 #if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\
419 	!defined(WLAN_SUPPORT_RX_FLOW_TAG)
420 /**
421  * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor
422  *                                       mode and then tags appropriate packets
423  * @soc: core txrx main context
424  * @vdev: pdev on which packet is received
425  * @msdu: QDF packet buffer on which the protocol tag should be set
426  * @rx_desc: base address where the RX TLVs start
427  * Return: void
428  */
429 static inline
430 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc,
431 					struct dp_pdev *dp_pdev,
432 					qdf_nbuf_t msdu, void *rx_desc)
433 {
434 }
435 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */
436 
437 #ifndef WLAN_TX_PKT_CAPTURE_ENH
438 static inline
439 QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev,
440 					  struct dp_peer *peer_handle,
441 					  uint8_t value, uint8_t *peer_mac)
442 {
443 	return QDF_STATUS_SUCCESS;
444 }
445 
446 /**
447  * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID
448  * @peer: Datapath peer
449  *
450  */
451 static inline void dp_peer_tid_queue_init(struct dp_peer *peer)
452 {
453 }
454 
455 /**
456  * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID
457  * @peer: Datapath peer
458  *
459  */
460 static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer)
461 {
462 }
463 
464 /**
465  * dp_peer_update_80211_hdr() – dp peer update 80211 hdr
466  * @vdev: Datapath vdev
467  * @peer: Datapath peer
468  *
469  */
470 static inline void
471 dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer)
472 {
473 }
474 
475 /**
476  * dp_tx_ppdu_stats_attach - Initialize Tx PPDU stats and enhanced capture
477  * @pdev: DP PDEV
478  *
479  * Return: none
480  */
481 static inline void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev)
482 {
483 }
484 
485 /**
486  * dp_tx_ppdu_stats_detach - Cleanup Tx PPDU stats and enhanced capture
487  * @pdev: DP PDEV
488  *
489  * Return: none
490  */
491 static inline void dp_tx_ppdu_stats_detach(struct dp_pdev *pdev)
492 {
493 }
494 
495 /**
496  * dp_tx_add_to_comp_queue() - add completion msdu to queue
497  * @soc: DP Soc handle
498  * @tx_desc: software Tx descriptor
499  * @ts : Tx completion status from HAL/HTT descriptor
500  * @peer: DP peer
501  *
502  * Return: none
503  */
504 static inline
505 QDF_STATUS dp_tx_add_to_comp_queue(struct dp_soc *soc,
506 				   struct dp_tx_desc_s *desc,
507 				   struct hal_tx_completion_status *ts,
508 				   struct dp_peer *peer)
509 {
510 	return QDF_STATUS_E_FAILURE;
511 }
512 
513 /**
514  * dp_update_msdu_to_list(): Function to queue msdu from wbm
515  * @pdev: dp_pdev
516  * @peer: dp_peer
517  * @ts: hal tx completion status
518  * @netbuf: msdu
519  *
520  * return: status
521  */
522 static inline
523 QDF_STATUS dp_update_msdu_to_list(struct dp_soc *soc,
524 				  struct dp_pdev *pdev,
525 				  struct dp_peer *peer,
526 				  struct hal_tx_completion_status *ts,
527 				  qdf_nbuf_t netbuf)
528 {
529 	return QDF_STATUS_E_FAILURE;
530 }
531 
532 /*
533  * dp_peer_tx_capture_filter_check: check filter is enable for the filter
534  * and update tx_cap_enabled flag
535  * @pdev: DP PDEV handle
536  * @peer: DP PEER handle
537  *
538  * return: void
539  */
540 static inline
541 void dp_peer_tx_capture_filter_check(struct dp_pdev *pdev,
542 				     struct dp_peer *peer)
543 {
544 }
545 
546 /*
547  * dp_tx_capture_debugfs_init: tx capture debugfs init
548  * @pdev: DP PDEV handle
549  *
550  * return: QDF_STATUS
551  */
552 static inline
553 QDF_STATUS dp_tx_capture_debugfs_init(struct dp_pdev *pdev)
554 {
555 	return QDF_STATUS_E_FAILURE;
556 }
557 #endif
558 
559 #ifdef WLAN_TX_PKT_CAPTURE_ENH
560 extern uint8_t
561 dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX];
562 #endif
563 
564 int
565 dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap);
566 /**
567  * dp_ppdu_desc_user_stats_update(): Function to update TX user stats
568  * @pdev: DP pdev handle
569  * @ppdu_info: per PPDU TLV descriptor
570  *
571  * return: void
572  */
573 void
574 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
575 			       struct ppdu_info *ppdu_info);
576 
577 #ifdef WDI_EVENT_ENABLE
578 void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn);
579 #else
580 static inline void
581 dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn)
582 {
583 }
584 #endif
585 
586 #ifdef WDI_EVENT_ENABLE
587 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer);
588 #else
589 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev,
590 					      struct dp_peer *peer)
591 {
592 	return QDF_STATUS_SUCCESS;
593 }
594 #endif
595 
596 #ifndef WLAN_TX_PKT_CAPTURE_ENH
597 /**
598  * dp_tx_ppdu_stats_process - Deferred PPDU stats handler
599  * @context: Opaque work context (PDEV)
600  *
601  * Return: none
602  */
603 static  inline void dp_tx_ppdu_stats_process(void *context)
604 {
605 }
606 
607 /*
608  * dp_tx_capture_htt_frame_counter: increment counter for htt_frame_type
609  * pdev: DP pdev handle
610  * htt_frame_type: htt frame type received from fw
611  *
612  * return: void
613  */
614 static inline
615 void dp_tx_capture_htt_frame_counter(struct dp_pdev *pdev,
616 				     uint32_t htt_frame_type)
617 {
618 }
619 
620 /*
621  * dp_tx_cature_stats: print tx capture stats
622  * @pdev: DP PDEV handle
623  *
624  * return: void
625  */
626 static inline
627 void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
628 {
629 }
630 #endif
631 
632 /**
633  * dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of
634  *				   the MSDU Link Descriptor
635  * @pdev: core txrx pdev context
636  * @buf_info: buf_info includes cookie that used to lookup virtual address of
637  * link descriptor. Normally this is just an index into a per pdev array.
638  *
639  * This is the VA of the link descriptor in monitor mode destination ring,
640  * that HAL layer later uses to retrieve the list of MSDU's for a given MPDU.
641  *
642  * Return: void *: Virtual Address of the Rx descriptor
643  */
644 static inline
645 void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev,
646 				      struct hal_buf_info *buf_info,
647 				      int mac_id)
648 {
649 	void *link_desc_va;
650 	struct qdf_mem_multi_page_t *pages;
651 	uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie);
652 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
653 
654 	if (!mon_soc)
655 		return NULL;
656 
657 	pages = &mon_soc->mon_link_desc_pages[mac_id];
658 	if (!pages)
659 		return NULL;
660 
661 	if (qdf_unlikely(page_id >= pages->num_pages))
662 		return NULL;
663 
664 	link_desc_va = pages->dma_pages[page_id].page_v_addr_start +
665 		(buf_info->paddr - pages->dma_pages[page_id].page_p_addr);
666 
667 	return link_desc_va;
668 }
669 
670 /**
671  * dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled
672  * @soc: DP soc handle
673  *
674  * Return: Full monitor mode status
675  */
676 static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev)
677 {
678 	return (pdev->soc->monitor_soc->full_mon_mode &&
679 		pdev->monitor_pdev->monitor_configured) ? true : false;
680 }
681 
682 /*
683  * dp_mon_is_enable_reap_timer_non_pkt() - check if mon reap timer is
684  * enabled by non-pkt log or not
685  * @pdev: point to dp pdev
686  *
687  * Return: true if mon reap timer is enabled by non-pkt log
688  */
689 static inline bool dp_mon_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev)
690 {
691 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
692 		return false;
693 
694 	return pdev->monitor_pdev->enable_reap_timer_non_pkt;
695 }
696 
697 /*
698  * dp_monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled
699  * @pdev: point to dp pdev
700  *
701  * Return: true if mcopy mode is enabled
702  */
703 static inline bool dp_monitor_is_enable_mcopy_mode(struct dp_pdev *pdev)
704 {
705 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
706 		return false;
707 
708 	return pdev->monitor_pdev->mcopy_mode;
709 }
710 
711 /*
712  * dp_monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled
713  * @pdev: point to dp pdev
714  *
715  * Return: true if tx sniffer is enabled
716  */
717 static inline bool dp_monitor_is_enable_tx_sniffer(struct dp_pdev *pdev)
718 {
719 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
720 		return false;
721 
722 	return pdev->monitor_pdev->tx_sniffer_enable;
723 }
724 
725 /*
726  * dp_monitor_is_set_monitor_configured() - check if monitor configured is set
727  * @pdev: point to dp pdev
728  *
729  * Return: true if monitor configured is set
730  */
731 static inline bool dp_monitor_is_configured(struct dp_pdev *pdev)
732 {
733 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
734 		return false;
735 
736 	return pdev->monitor_pdev->monitor_configured;
737 }
738 
739 /*
740  * dp_monitor_check_com_info_ppdu_id() - check if msdu ppdu_id matches with
741  * com info ppdu_id
742  * @pdev: point to dp pdev
743  * @rx_desc: point to rx_desc
744  *
745  * Return: success if ppdu_id matches
746  */
747 static inline QDF_STATUS dp_monitor_check_com_info_ppdu_id(struct dp_pdev *pdev,
748 							   void *rx_desc)
749 {
750 	struct cdp_mon_status *rs;
751 	struct dp_mon_pdev *mon_pdev;
752 	uint32_t msdu_ppdu_id = 0;
753 
754 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
755 		return QDF_STATUS_E_FAILURE;
756 
757 	mon_pdev = pdev->monitor_pdev;
758 	if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass))
759 		return QDF_STATUS_E_FAILURE;
760 
761 	rs = &pdev->monitor_pdev->rx_mon_recv_status;
762 	if (!rs || rs->cdp_rs_rxdma_err)
763 		return QDF_STATUS_E_FAILURE;
764 
765 	msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc);
766 	if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) {
767 		QDF_TRACE(QDF_MODULE_ID_DP,
768 			  QDF_TRACE_LEVEL_ERROR,
769 			  "msdu_ppdu_id=%x,com_info.ppdu_id=%x",
770 			  msdu_ppdu_id,
771 			  mon_pdev->ppdu_info.com_info.ppdu_id);
772 		return QDF_STATUS_E_FAILURE;
773 	}
774 
775 	return QDF_STATUS_SUCCESS;
776 }
777 
778 /*
779  * dp_monitor_get_rx_status() - get rx status
780  * @pdev: point to dp pdev
781  *
782  * Return: return rx status pointer
783  */
784 static inline struct mon_rx_status*
785 dp_monitor_get_rx_status(struct dp_pdev *pdev)
786 {
787 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
788 		return NULL;
789 
790 	return &pdev->monitor_pdev->ppdu_info.rx_status;
791 }
792 
793 /*
794  * dp_monitor_is_chan_band_known() - check if monitor chan band known
795  * @pdev: point to dp pdev
796  *
797  * Return: true if chan band known
798  */
799 static inline bool dp_monitor_is_chan_band_known(struct dp_pdev *pdev)
800 {
801 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
802 		return false;
803 
804 	if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN)
805 		return true;
806 
807 	return false;
808 }
809 
810 /*
811  * dp_monitor_get_chan_band() - get chan band
812  * @pdev: point to dp pdev
813  *
814  * Return: wifi channel band
815  */
816 static inline enum reg_wifi_band
817 dp_monitor_get_chan_band(struct dp_pdev *pdev)
818 {
819 	return pdev->monitor_pdev->mon_chan_band;
820 }
821 
822 /*
823  * dp_monitor_print_tx_stats() - print tx stats from monitor pdev
824  * @pdev: point to dp pdev
825  *
826  */
827 static inline void dp_monitor_print_tx_stats(struct dp_pdev *pdev)
828 {
829 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
830 		return;
831 
832 	DP_PRINT_STATS("ppdu info schedule completion list depth: %d",
833 		       pdev->monitor_pdev->sched_comp_list_depth);
834 	DP_PRINT_STATS("delivered sched cmdid: %d",
835 		       pdev->monitor_pdev->delivered_sched_cmdid);
836 	DP_PRINT_STATS("cur sched cmdid: %d",
837 		       pdev->monitor_pdev->last_sched_cmdid);
838 	DP_PRINT_STATS("ppdu info list depth: %d",
839 		       pdev->monitor_pdev->list_depth);
840 }
841 
842 /*
843  * dp_monitor_set_chan_num() - set channel number
844  * @pdev: point to dp pdev
845  * @chan_num: channel number
846  *
847  */
848 static inline void dp_monitor_set_chan_num(struct dp_pdev *pdev, int chan_num)
849 {
850 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
851 		return;
852 
853 	pdev->monitor_pdev->mon_chan_num = chan_num;
854 }
855 
856 /*
857  * dp_monitor_set_chan_freq() - set channel frequency
858  * @pdev: point to dp pdev
859  * @chan_freq: channel frequency
860  *
861  */
862 static inline void
863 dp_monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq)
864 {
865 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
866 		return;
867 
868 	pdev->monitor_pdev->mon_chan_freq = chan_freq;
869 }
870 
871 /*
872  * dp_monitor_set_chan_band() - set channel band
873  * @pdev: point to dp pdev
874  * @chan_band: channel band
875  *
876  */
877 static inline void
878 dp_monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band)
879 {
880 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
881 		return;
882 
883 	pdev->monitor_pdev->mon_chan_band = chan_band;
884 }
885 
886 /*
887  * dp_monitor_get_mpdu_status() - get mpdu status
888  * @pdev: point to dp pdev
889  * @soc: point to dp soc
890  * @rx_tlv_hdr: point to rx tlv header
891  *
892  */
893 static inline void dp_monitor_get_mpdu_status(struct dp_pdev *pdev,
894 					      struct dp_soc *soc,
895 					      uint8_t *rx_tlv_hdr)
896 {
897 	struct dp_mon_pdev *mon_pdev;
898 
899 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
900 		return;
901 
902 	mon_pdev = pdev->monitor_pdev;
903 	hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr,
904 					   &mon_pdev->ppdu_info.rx_status);
905 }
906 
907 #ifdef FEATURE_NAC_RSSI
908 /*
909  * dp_monitor_drop_inv_peer_pkts() - drop invalid peer pkts
910  * @vdev: point to dp vdev
911  *
912  * Return: success if sta mode and filter for neighbour peers enabled
913  */
914 static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev)
915 {
916 	struct dp_pdev *pdev = vdev->pdev;
917 	struct dp_soc *soc = pdev->soc;
918 
919 	if (!soc->monitor_soc)
920 		return QDF_STATUS_E_FAILURE;
921 
922 	if (!soc->monitor_soc->hw_nac_monitor_support &&
923 	    pdev->monitor_pdev->filter_neighbour_peers &&
924 	    vdev->opmode == wlan_op_mode_sta)
925 		return QDF_STATUS_SUCCESS;
926 
927 	return QDF_STATUS_E_FAILURE;
928 }
929 #endif
930 
931 /*
932  * dp_peer_ppdu_delayed_ba_init() - Initialize ppdu in peer
933  * @peer: Datapath peer
934  *
935  * return: void
936  */
937 #ifdef FEATURE_PERPKT_INFO
938 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer)
939 {
940 	struct dp_mon_peer *mon_peer = peer->monitor_peer;
941 
942 	if (!mon_peer)
943 		return;
944 
945 	qdf_mem_zero(&mon_peer->delayed_ba_ppdu_stats,
946 		     sizeof(struct cdp_delayed_tx_completion_ppdu_user));
947 	mon_peer->last_delayed_ba = false;
948 	mon_peer->last_delayed_ba_ppduid = 0;
949 }
950 #else
951 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer)
952 {
953 }
954 #endif
955 
956 /*
957  * dp_monitor_vdev_register_osif() - Register osif rx mon
958  * @vdev: point to vdev
959  * @txrx_ops: point to ol txrx ops
960  *
961  * Return: void
962  */
963 static inline void dp_monitor_vdev_register_osif(struct dp_vdev *vdev,
964 						 struct ol_txrx_ops *txrx_ops)
965 {
966 	if (!vdev->monitor_vdev)
967 		return;
968 
969 	vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon;
970 }
971 
972 /*
973  * dp_monitor_get_monitor_vdev_from_pdev() - Get monitor vdev
974  * @pdev: point to pdev
975  *
976  * Return: pointer to vdev
977  */
978 static inline struct dp_vdev*
979 dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev)
980 {
981 	if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev)
982 		return NULL;
983 
984 	return pdev->monitor_pdev->mvdev;
985 }
986 
987 /*
988  * dp_monitor_is_vdev_timer_running() - Get vdev timer status
989  * @soc: point to soc
990  *
991  * Return: true if timer running
992  */
993 static inline bool dp_monitor_is_vdev_timer_running(struct dp_soc *soc)
994 {
995 	if (qdf_unlikely(!soc || !soc->monitor_soc))
996 		return false;
997 
998 	return !!(soc->monitor_soc->mon_vdev_timer_state &
999 		  MON_VDEV_TIMER_RUNNING);
1000 }
1001 
1002 /*
1003  * dp_monitor_get_link_desc_pages() - Get link desc pages
1004  * @soc: point to soc
1005  * @mac_id: mac id
1006  *
1007  * Return: return point to link desc pages
1008  */
1009 static inline struct qdf_mem_multi_page_t*
1010 dp_monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id)
1011 {
1012 	if (qdf_unlikely(!soc || !soc->monitor_soc))
1013 		return NULL;
1014 
1015 	return &soc->monitor_soc->mon_link_desc_pages[mac_id];
1016 }
1017 
1018 /*
1019  * dp_monitor_get_total_link_descs() - Get total link descs
1020  * @soc: point to soc
1021  * @mac_id: mac id
1022  *
1023  * Return: return point total link descs
1024  */
1025 static inline uint32_t *
1026 dp_monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id)
1027 {
1028 	return &soc->monitor_soc->total_mon_link_descs[mac_id];
1029 }
1030 
1031 /*
1032  * dp_monitor_pdev_attach() - Monitor pdev attach
1033  * @pdev: point to pdev
1034  *
1035  * Return: return QDF_STATUS
1036  */
1037 static inline QDF_STATUS dp_monitor_pdev_attach(struct dp_pdev *pdev)
1038 {
1039 	struct dp_mon_ops *monitor_ops;
1040 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1041 
1042 	/*
1043 	 * mon_soc uninitialized modular support enabled
1044 	 * monitor related attach/detach/init/deinit
1045 	 * will be done while monitor insmod
1046 	 */
1047 	if (!mon_soc)
1048 		return QDF_STATUS_SUCCESS;
1049 
1050 	monitor_ops = mon_soc->mon_ops;
1051 	if (!monitor_ops || !monitor_ops->mon_pdev_attach) {
1052 		dp_mon_debug("callback not registered");
1053 		return QDF_STATUS_E_FAILURE;
1054 	}
1055 
1056 	return monitor_ops->mon_pdev_attach(pdev);
1057 }
1058 
1059 /*
1060  * dp_monitor_pdev_detach() - Monitor pdev detach
1061  * @pdev: point to pdev
1062  *
1063  * Return: return QDF_STATUS
1064  */
1065 static inline QDF_STATUS dp_monitor_pdev_detach(struct dp_pdev *pdev)
1066 {
1067 	struct dp_mon_ops *monitor_ops;
1068 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1069 
1070 	/*
1071 	 * mon_soc uninitialized modular support enabled
1072 	 * monitor related attach/detach/init/deinit
1073 	 * will be done while monitor insmod
1074 	 */
1075 	if (!mon_soc)
1076 		return QDF_STATUS_SUCCESS;
1077 
1078 	monitor_ops = mon_soc->mon_ops;
1079 	if (!monitor_ops || !monitor_ops->mon_pdev_detach) {
1080 		dp_mon_debug("callback not registered");
1081 		return QDF_STATUS_E_FAILURE;
1082 	}
1083 
1084 	return monitor_ops->mon_pdev_detach(pdev);
1085 }
1086 
1087 /*
1088  * dp_monitor_vdev_attach() - Monitor vdev attach
1089  * @vdev: point to vdev
1090  *
1091  * Return: return QDF_STATUS
1092  */
1093 static inline QDF_STATUS dp_monitor_vdev_attach(struct dp_vdev *vdev)
1094 {
1095 	struct dp_mon_ops *monitor_ops;
1096 	struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc;
1097 
1098 	if (!mon_soc)
1099 		return QDF_STATUS_E_FAILURE;
1100 
1101 	monitor_ops = mon_soc->mon_ops;
1102 	if (!monitor_ops || !monitor_ops->mon_vdev_attach) {
1103 		dp_mon_debug("callback not registered");
1104 		return QDF_STATUS_E_FAILURE;
1105 	}
1106 
1107 	return monitor_ops->mon_vdev_attach(vdev);
1108 }
1109 
1110 /*
1111  * dp_monitor_vdev_detach() - Monitor vdev detach
1112  * @vdev: point to vdev
1113  *
1114  * Return: return QDF_STATUS
1115  */
1116 static inline QDF_STATUS dp_monitor_vdev_detach(struct dp_vdev *vdev)
1117 {
1118 	struct dp_mon_ops *monitor_ops;
1119 	struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc;
1120 
1121 	if (!mon_soc)
1122 		return QDF_STATUS_E_FAILURE;
1123 
1124 	monitor_ops = mon_soc->mon_ops;
1125 	if (!monitor_ops || !monitor_ops->mon_vdev_detach) {
1126 		dp_mon_debug("callback not registered");
1127 		return QDF_STATUS_E_FAILURE;
1128 	}
1129 
1130 	return monitor_ops->mon_vdev_detach(vdev);
1131 }
1132 
1133 /*
1134  * dp_monitor_peer_attach() - Monitor peer attach
1135  * @soc: point to soc
1136  * @peer: point to peer
1137  *
1138  * Return: return QDF_STATUS
1139  */
1140 static inline QDF_STATUS dp_monitor_peer_attach(struct dp_soc *soc,
1141 						struct dp_peer *peer)
1142 {
1143 	struct dp_mon_ops *monitor_ops;
1144 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1145 
1146 	if (!mon_soc)
1147 		return QDF_STATUS_E_FAILURE;
1148 
1149 	monitor_ops = mon_soc->mon_ops;
1150 	if (!monitor_ops || !monitor_ops->mon_peer_attach) {
1151 		dp_mon_debug("callback not registered");
1152 		return QDF_STATUS_E_FAILURE;
1153 	}
1154 
1155 	return monitor_ops->mon_peer_attach(peer);
1156 }
1157 
1158 /*
1159  * dp_monitor_peer_detach() - Monitor peer detach
1160  * @soc: point to soc
1161  * @peer: point to peer
1162  *
1163  * Return: return QDF_STATUS
1164  */
1165 static inline QDF_STATUS dp_monitor_peer_detach(struct dp_soc *soc,
1166 						struct dp_peer *peer)
1167 {
1168 	struct dp_mon_ops *monitor_ops;
1169 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1170 
1171 	if (!mon_soc)
1172 		return QDF_STATUS_E_FAILURE;
1173 
1174 	monitor_ops = mon_soc->mon_ops;
1175 	if (!monitor_ops || !monitor_ops->mon_peer_detach) {
1176 		dp_mon_debug("callback not registered");
1177 		return QDF_STATUS_E_FAILURE;
1178 	}
1179 
1180 	return monitor_ops->mon_peer_detach(peer);
1181 }
1182 
1183 /*
1184  * dp_monitor_pdev_init() - Monitor pdev init
1185  * @pdev: point to pdev
1186  *
1187  * Return: return QDF_STATUS
1188  */
1189 static inline QDF_STATUS dp_monitor_pdev_init(struct dp_pdev *pdev)
1190 {
1191 	struct dp_mon_ops *monitor_ops;
1192 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1193 
1194 	/*
1195 	 * mon_soc uninitialized when modular support enabled
1196 	 * monitor related attach/detach/init/deinit
1197 	 * will be done while monitor insmod
1198 	 */
1199 	if (!mon_soc)
1200 		return QDF_STATUS_SUCCESS;
1201 
1202 	monitor_ops = mon_soc->mon_ops;
1203 	if (!monitor_ops || !monitor_ops->mon_pdev_init) {
1204 		dp_mon_debug("callback not registered");
1205 		return QDF_STATUS_E_FAILURE;
1206 	}
1207 
1208 	return monitor_ops->mon_pdev_init(pdev);
1209 }
1210 
1211 /*
1212  * dp_monitor_pdev_deinit() - Monitor pdev deinit
1213  * @pdev: point to pdev
1214  *
1215  * Return: return QDF_STATUS
1216  */
1217 static inline QDF_STATUS dp_monitor_pdev_deinit(struct dp_pdev *pdev)
1218 {
1219 	struct dp_mon_ops *monitor_ops;
1220 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1221 
1222 	/*
1223 	 * mon_soc uninitialized modular when support enabled
1224 	 * monitor related attach/detach/init/deinit
1225 	 * will be done while monitor insmod
1226 	 */
1227 	if (!mon_soc)
1228 		return QDF_STATUS_SUCCESS;
1229 
1230 	monitor_ops = mon_soc->mon_ops;
1231 	if (!monitor_ops || !monitor_ops->mon_pdev_deinit) {
1232 		dp_mon_debug("callback not registered");
1233 		return QDF_STATUS_E_FAILURE;
1234 	}
1235 
1236 	return monitor_ops->mon_pdev_deinit(pdev);
1237 }
1238 
1239 /*
1240  * dp_monitor_soc_cfg_init() - Monitor sco cfg init
1241  * @soc: point to soc
1242  *
1243  * Return: return QDF_STATUS
1244  */
1245 static inline QDF_STATUS dp_monitor_soc_cfg_init(struct dp_soc *soc)
1246 {
1247 	struct dp_mon_ops *monitor_ops;
1248 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1249 
1250 	/*
1251 	 * this API is getting call from dp_soc_init,
1252 	 * mon_soc will be uninitialized when monitor support enabled
1253 	 * So returning QDF_STATUS_SUCCESS.
1254 	 * soc cfg init will be done while monitor insmod.
1255 	 */
1256 	if (!mon_soc)
1257 		return QDF_STATUS_SUCCESS;
1258 
1259 	monitor_ops = mon_soc->mon_ops;
1260 	if (!monitor_ops || !monitor_ops->mon_soc_cfg_init) {
1261 		dp_mon_debug("callback not registered");
1262 		return QDF_STATUS_E_FAILURE;
1263 	}
1264 
1265 	return monitor_ops->mon_soc_cfg_init(soc);
1266 }
1267 
1268 /*
1269  * dp_monitor_config_debug_sniffer() - Monitor config debug sniffer
1270  * @pdev: point to pdev
1271  * @val: val
1272  *
1273  * Return: return QDF_STATUS
1274  */
1275 static inline QDF_STATUS dp_monitor_config_debug_sniffer(struct dp_pdev *pdev,
1276 							 int val)
1277 {
1278 	struct dp_mon_ops *monitor_ops;
1279 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1280 
1281 	if (!mon_soc)
1282 		return QDF_STATUS_E_FAILURE;
1283 
1284 	monitor_ops = mon_soc->mon_ops;
1285 	if (!monitor_ops || !monitor_ops->mon_config_debug_sniffer) {
1286 		dp_mon_debug("callback not registered");
1287 		return QDF_STATUS_E_FAILURE;
1288 	}
1289 
1290 	return monitor_ops->mon_config_debug_sniffer(pdev, val);
1291 }
1292 
1293 /*
1294  * dp_monitor_flush_rings() - Flush monitor rings
1295  * @soc: point to soc
1296  *
1297  * Return: None
1298  */
1299 static inline void dp_monitor_flush_rings(struct dp_soc *soc)
1300 {
1301 	struct dp_mon_ops *monitor_ops;
1302 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1303 
1304 	if (!mon_soc) {
1305 		dp_mon_debug("monitor soc is NULL");
1306 		return;
1307 	}
1308 
1309 	monitor_ops = mon_soc->mon_ops;
1310 	if (!monitor_ops || !monitor_ops->mon_flush_rings) {
1311 		dp_mon_debug("callback not registered");
1312 		return;
1313 	}
1314 
1315 	return monitor_ops->mon_flush_rings(soc);
1316 }
1317 
1318 /*
1319  * dp_monitor_htt_srng_setup() - Setup htt srng
1320  * @soc: point to soc
1321  * @pdev: point to pdev
1322  * @mac_id: lmac id
1323  * @mac for pdev: pdev id
1324  *
1325  * Return: QDF_STATUS
1326  */
1327 #if !defined(DISABLE_MON_CONFIG)
1328 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc,
1329 						   struct dp_pdev *pdev,
1330 						   int mac_id,
1331 						   int mac_for_pdev)
1332 {
1333 	struct dp_mon_ops *monitor_ops;
1334 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1335 
1336 	if (!mon_soc) {
1337 		dp_mon_debug("monitor soc is NULL");
1338 		return QDF_STATUS_SUCCESS;
1339 	}
1340 
1341 	monitor_ops = mon_soc->mon_ops;
1342 	if (!monitor_ops || !monitor_ops->mon_htt_srng_setup) {
1343 		dp_mon_debug("callback not registered");
1344 		return QDF_STATUS_E_FAILURE;
1345 	}
1346 
1347 	return monitor_ops->mon_htt_srng_setup(soc, pdev, mac_id,
1348 					       mac_for_pdev);
1349 }
1350 #else
1351 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc,
1352 						   struct dp_pdev *pdev,
1353 						   int mac_id,
1354 						   int mac_for_pdev)
1355 {
1356 	return QDF_STATUS_SUCCESS;
1357 }
1358 #endif
1359 
1360 /*
1361  * dp_monitor_service_mon_rings() - service monitor rings
1362  * @soc: point to soc
1363  * @quota: reap budget
1364  *
1365  * Return: None
1366  */
1367 #if defined(DP_CON_MON)
1368 static inline
1369 void dp_monitor_service_mon_rings(struct dp_soc *soc, uint32_t quota)
1370 {
1371 	struct dp_mon_ops *monitor_ops;
1372 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1373 
1374 	if (!mon_soc) {
1375 		dp_mon_debug("monitor soc is NULL");
1376 		return;
1377 	}
1378 
1379 	monitor_ops = mon_soc->mon_ops;
1380 	if (!monitor_ops || !monitor_ops->mon_service_rings) {
1381 		dp_mon_debug("callback not registered");
1382 		return;
1383 	}
1384 
1385 	return monitor_ops->mon_service_rings(soc, quota);
1386 }
1387 #endif
1388 
1389 /*
1390  * dp_monitor_process() - Process monitor
1391  * @soc: point to soc
1392  * @int_ctx: interrupt ctx
1393  * @mac_id: lma
1394  * @quota:
1395  *
1396  * Return: None
1397  */
1398 #ifndef DISABLE_MON_CONFIG
1399 static inline
1400 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx,
1401 			    uint32_t mac_id, uint32_t quota)
1402 {
1403 	struct dp_mon_ops *monitor_ops;
1404 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1405 
1406 	if (!mon_soc) {
1407 		dp_mon_debug("monitor soc is NULL");
1408 		return 0;
1409 	}
1410 
1411 	monitor_ops = mon_soc->mon_ops;
1412 	if (!monitor_ops || !monitor_ops->mon_process) {
1413 		dp_mon_debug("callback not registered");
1414 		return 0;
1415 	}
1416 
1417 	return monitor_ops->mon_process(soc, int_ctx, mac_id, quota);
1418 }
1419 #else
1420 static inline
1421 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx,
1422 			    uint32_t mac_id, uint32_t quota)
1423 {
1424 	return 0;
1425 }
1426 #endif
1427 
1428 /*
1429  * dp_monitor_drop_packets_for_mac() - monitor_drop_packets_for_mac
1430  * @pdev: point to pdev
1431  * @mac_id:
1432  * @quota:
1433  *
1434  * Return:
1435  */
1436 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC)
1437 static inline
1438 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev,
1439 					 uint32_t mac_id, uint32_t quota)
1440 {
1441 	struct dp_mon_ops *monitor_ops;
1442 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1443 
1444 	if (!mon_soc) {
1445 		dp_mon_debug("monitor soc is NULL");
1446 		return 0;
1447 	}
1448 
1449 	monitor_ops = mon_soc->mon_ops;
1450 	if (!monitor_ops || !monitor_ops->mon_drop_packets_for_mac) {
1451 		dp_mon_debug("callback not registered");
1452 		return 0;
1453 	}
1454 
1455 	return monitor_ops->mon_drop_packets_for_mac(pdev,
1456 						     mac_id, quota);
1457 }
1458 #else
1459 static inline
1460 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev,
1461 					 uint32_t mac_id, uint32_t quota)
1462 {
1463 	return 0;
1464 }
1465 #endif
1466 
1467 /*
1468  * dp_monitor_peer_tx_init() - peer tx init
1469  * @pdev: point to pdev
1470  * @peer: point to peer
1471  *
1472  * Return: None
1473  */
1474 static inline void dp_monitor_peer_tx_init(struct dp_pdev *pdev,
1475 					   struct dp_peer *peer)
1476 {
1477 	struct dp_mon_ops *monitor_ops;
1478 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1479 
1480 	if (!mon_soc) {
1481 		dp_mon_debug("monitor soc is NULL");
1482 		return;
1483 	}
1484 
1485 	monitor_ops = mon_soc->mon_ops;
1486 	if (!monitor_ops || !monitor_ops->mon_peer_tx_init) {
1487 		dp_mon_debug("callback not registered");
1488 		return;
1489 	}
1490 
1491 	return monitor_ops->mon_peer_tx_init(pdev, peer);
1492 }
1493 
1494 /*
1495  * dp_monitor_peer_tx_cleanup() - peer tx cleanup
1496  * @vdev: point to vdev
1497  * @peer: point to peer
1498  *
1499  * Return: None
1500  */
1501 static inline void dp_monitor_peer_tx_cleanup(struct dp_vdev *vdev,
1502 					      struct dp_peer *peer)
1503 {
1504 	struct dp_mon_ops *monitor_ops;
1505 	struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc;
1506 
1507 	if (!mon_soc) {
1508 		dp_mon_debug("monitor soc is NULL");
1509 		return;
1510 	}
1511 
1512 	monitor_ops = mon_soc->mon_ops;
1513 	if (!monitor_ops || !monitor_ops->mon_peer_tx_cleanup) {
1514 		dp_mon_debug("callback not registered");
1515 		return;
1516 	}
1517 
1518 	return monitor_ops->mon_peer_tx_cleanup(vdev, peer);
1519 }
1520 
1521 #ifdef WLAN_TX_PKT_CAPTURE_ENH
1522 /*
1523  * dp_monitor_peer_tid_peer_id_update() - peer tid update
1524  * @soc: point to soc
1525  * @peer: point to peer
1526  * @peer_id: peer id
1527  *
1528  * Return: None
1529  */
1530 static inline
1531 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc,
1532 					struct dp_peer *peer,
1533 					uint16_t peer_id)
1534 {
1535 	struct dp_mon_ops *monitor_ops;
1536 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1537 
1538 	if (!mon_soc) {
1539 		dp_mon_debug("monitor soc is NULL");
1540 		return;
1541 	}
1542 
1543 	monitor_ops = mon_soc->mon_ops;
1544 	if (!monitor_ops || !monitor_ops->mon_peer_tid_peer_id_update) {
1545 		dp_mon_debug("callback not registered");
1546 		return;
1547 	}
1548 
1549 	return monitor_ops->mon_peer_tid_peer_id_update(peer, peer_id);
1550 }
1551 
1552 /*
1553  * dp_monitor_tx_ppdu_stats_attach() - Attach tx ppdu stats
1554  * @pdev: point to pdev
1555  *
1556  * Return: None
1557  */
1558 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev)
1559 {
1560 	struct dp_mon_ops *monitor_ops;
1561 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1562 
1563 	if (!mon_soc) {
1564 		dp_mon_debug("monitor soc is NULL");
1565 		return;
1566 	}
1567 
1568 	monitor_ops = mon_soc->mon_ops;
1569 	if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_attach) {
1570 		dp_mon_debug("callback not registered");
1571 		return;
1572 	}
1573 
1574 	return monitor_ops->mon_tx_ppdu_stats_attach(pdev);
1575 }
1576 
1577 /*
1578  * dp_monitor_tx_ppdu_stats_detach() - Detach tx ppdu stats
1579  * @pdev: point to pdev
1580  *
1581  * Return: None
1582  */
1583 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev)
1584 {
1585 	struct dp_mon_ops *monitor_ops;
1586 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1587 
1588 	if (!mon_soc) {
1589 		dp_mon_debug("monitor soc is NULL");
1590 		return;
1591 	}
1592 
1593 	monitor_ops = mon_soc->mon_ops;
1594 	if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_detach) {
1595 		dp_mon_debug("callback not registered");
1596 		return;
1597 	}
1598 
1599 	return monitor_ops->mon_tx_ppdu_stats_detach(pdev);
1600 }
1601 
1602 /*
1603  * dp_monitor_tx_capture_debugfs_init() - Init tx capture debugfs
1604  * @pdev: point to pdev
1605  *
1606  * Return: QDF_STATUS_SUCCESS
1607  */
1608 static inline
1609 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev)
1610 {
1611 	struct dp_mon_ops *monitor_ops;
1612 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1613 
1614 	if (!mon_soc) {
1615 		dp_mon_debug("monitor soc is NULL");
1616 		return QDF_STATUS_E_FAILURE;
1617 	}
1618 
1619 	monitor_ops = mon_soc->mon_ops;
1620 	if (!monitor_ops || !monitor_ops->mon_tx_capture_debugfs_init) {
1621 		dp_mon_debug("callback not registered");
1622 		return QDF_STATUS_E_FAILURE;
1623 	}
1624 
1625 	return monitor_ops->mon_tx_capture_debugfs_init(pdev);
1626 }
1627 
1628 /*
1629  * dp_monitor_peer_tx_capture_filter_check() - Check tx capture filter
1630  * @pdev: point to pdev
1631  * @peer: point to peer
1632  *
1633  * Return: None
1634  */
1635 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev,
1636 							   struct dp_peer *peer)
1637 {
1638 	struct dp_mon_ops *monitor_ops;
1639 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1640 
1641 	if (!mon_soc) {
1642 		dp_mon_debug("monitor soc is NULL");
1643 		return;
1644 	}
1645 
1646 	monitor_ops = mon_soc->mon_ops;
1647 	if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_filter_check) {
1648 		dp_mon_debug("callback not registered");
1649 		return;
1650 	}
1651 
1652 	return monitor_ops->mon_peer_tx_capture_filter_check(pdev, peer);
1653 }
1654 
1655 /*
1656  * dp_monitor_tx_add_to_comp_queue() - add completion msdu to queue
1657  * @soc: point to soc
1658  * @desc: point to tx desc
1659  * @ts: Tx completion status from HAL/HTT descriptor
1660  * @peer: DP peer
1661  *
1662  * Return: None
1663  */
1664 static inline
1665 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc,
1666 					   struct dp_tx_desc_s *desc,
1667 					   struct hal_tx_completion_status *ts,
1668 					   struct dp_peer *peer)
1669 {
1670 	struct dp_mon_ops *monitor_ops;
1671 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1672 
1673 	if (!mon_soc) {
1674 		dp_mon_debug("monitor soc is NULL");
1675 		return QDF_STATUS_SUCCESS;
1676 	}
1677 
1678 	monitor_ops = mon_soc->mon_ops;
1679 	if (!monitor_ops || !monitor_ops->mon_tx_add_to_comp_queue) {
1680 		dp_mon_debug("callback not registered");
1681 		return QDF_STATUS_E_FAILURE;
1682 	}
1683 
1684 	return monitor_ops->mon_tx_add_to_comp_queue(soc, desc, ts, peer);
1685 }
1686 
1687 static inline
1688 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc,
1689 				       struct dp_pdev *pdev,
1690 				       struct dp_peer *peer,
1691 				       struct hal_tx_completion_status *ts,
1692 				       qdf_nbuf_t netbuf)
1693 {
1694 	struct dp_mon_ops *monitor_ops;
1695 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1696 
1697 	if (!mon_soc) {
1698 		dp_mon_debug("monitor soc is NULL");
1699 		return QDF_STATUS_SUCCESS;
1700 	}
1701 
1702 	monitor_ops = mon_soc->mon_ops;
1703 	if (!monitor_ops || !monitor_ops->mon_update_msdu_to_list) {
1704 		dp_mon_debug("callback not registered");
1705 		return QDF_STATUS_E_FAILURE;
1706 	}
1707 
1708 	return monitor_ops->mon_update_msdu_to_list(soc, pdev,
1709 						    peer, ts, netbuf);
1710 }
1711 
1712 #else
1713 static inline
1714 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc,
1715 					struct dp_peer *peer,
1716 					uint16_t peer_id)
1717 {
1718 }
1719 
1720 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev)
1721 {
1722 }
1723 
1724 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev)
1725 {
1726 }
1727 
1728 static inline
1729 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev)
1730 {
1731 	return QDF_STATUS_E_FAILURE;
1732 }
1733 
1734 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev,
1735 							   struct dp_peer *peer)
1736 {
1737 }
1738 
1739 static inline
1740 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc,
1741 					   struct dp_tx_desc_s *desc,
1742 					   struct hal_tx_completion_status *ts,
1743 					   struct dp_peer *peer)
1744 {
1745 	return QDF_STATUS_E_FAILURE;
1746 }
1747 
1748 static inline
1749 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc,
1750 				       struct dp_pdev *pdev,
1751 				       struct dp_peer *peer,
1752 				       struct hal_tx_completion_status *ts,
1753 				       qdf_nbuf_t netbuf)
1754 {
1755 	return QDF_STATUS_E_FAILURE;
1756 }
1757 #endif
1758 
1759 /*
1760  * dp_monitor_ppdu_stats_ind_handler() - PPDU stats msg handler
1761  * @htt_soc:     HTT SOC handle
1762  * @msg_word:    Pointer to payload
1763  * @htt_t2h_msg: HTT msg nbuf
1764  *
1765  * Return: True if buffer should be freed by caller.
1766  */
1767 #if defined(WDI_EVENT_ENABLE) &&\
1768 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG))
1769 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc,
1770 						     uint32_t *msg_word,
1771 						     qdf_nbuf_t htt_t2h_msg)
1772 {
1773 	struct dp_mon_ops *monitor_ops;
1774 	struct dp_mon_soc *mon_soc = soc->dp_soc->monitor_soc;
1775 
1776 	if (!mon_soc) {
1777 		dp_mon_debug("monitor soc is NULL");
1778 		return true;
1779 	}
1780 
1781 	monitor_ops = mon_soc->mon_ops;
1782 	if (!monitor_ops || !monitor_ops->mon_ppdu_stats_ind_handler) {
1783 		dp_mon_debug("callback not registered");
1784 		return true;
1785 	}
1786 
1787 	return monitor_ops->mon_ppdu_stats_ind_handler(soc, msg_word,
1788 						       htt_t2h_msg);
1789 }
1790 #else
1791 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc,
1792 						     uint32_t *msg_word,
1793 						     qdf_nbuf_t htt_t2h_msg)
1794 {
1795 	return true;
1796 }
1797 #endif
1798 
1799 /*
1800  * dp_monitor_htt_ppdu_stats_attach() - attach resources for HTT PPDU
1801  * stats processing
1802  * @pdev: Datapath PDEV handle
1803  *
1804  * Return: QDF_STATUS
1805  */
1806 static inline QDF_STATUS dp_monitor_htt_ppdu_stats_attach(struct dp_pdev *pdev)
1807 {
1808 	struct dp_mon_ops *monitor_ops;
1809 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1810 
1811 	if (!mon_soc) {
1812 		dp_mon_debug("monitor soc is NULL");
1813 		return QDF_STATUS_SUCCESS;
1814 	}
1815 
1816 	monitor_ops = mon_soc->mon_ops;
1817 	if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_attach) {
1818 		dp_mon_debug("callback not registered");
1819 		return QDF_STATUS_E_FAILURE;
1820 	}
1821 
1822 	return monitor_ops->mon_htt_ppdu_stats_attach(pdev);
1823 }
1824 
1825 /*
1826  * dp_monitor_htt_ppdu_stats_detach() - detach stats resources
1827  * @pdev: Datapath PDEV handle
1828  *
1829  * Return: void
1830  */
1831 static inline void dp_monitor_htt_ppdu_stats_detach(struct dp_pdev *pdev)
1832 {
1833 	struct dp_mon_ops *monitor_ops;
1834 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1835 
1836 	if (!mon_soc) {
1837 		dp_mon_debug("monitor soc is NULL");
1838 		return;
1839 	}
1840 
1841 	monitor_ops = mon_soc->mon_ops;
1842 	if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_detach) {
1843 		dp_mon_debug("callback not registered");
1844 		return;
1845 	}
1846 
1847 	return monitor_ops->mon_htt_ppdu_stats_detach(pdev);
1848 }
1849 
1850 /*
1851  * dp_monitor_print_pdev_rx_mon_stats() - print rx mon stats
1852  * @pdev: Datapath PDEV handle
1853  *
1854  * Return: void
1855  */
1856 static inline void dp_monitor_print_pdev_rx_mon_stats(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 	if (!mon_soc) {
1862 		dp_mon_debug("monitor soc is NULL");
1863 		return;
1864 	}
1865 
1866 	monitor_ops = mon_soc->mon_ops;
1867 	if (!monitor_ops || !monitor_ops->mon_print_pdev_rx_mon_stats) {
1868 		dp_mon_debug("callback not registered");
1869 		return;
1870 	}
1871 
1872 	return monitor_ops->mon_print_pdev_rx_mon_stats(pdev);
1873 }
1874 
1875 /*
1876  * dp_monitor_print_pdev_tx_capture_stats() - print tx capture stats
1877  * @pdev: Datapath PDEV handle
1878  *
1879  * Return: void
1880  */
1881 #ifdef WLAN_TX_PKT_CAPTURE_ENH
1882 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
1883 {
1884 	struct dp_mon_ops *monitor_ops;
1885 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1886 
1887 	if (!mon_soc) {
1888 		dp_mon_debug("monitor soc is NULL");
1889 		return;
1890 	}
1891 
1892 	monitor_ops = mon_soc->mon_ops;
1893 	if (!monitor_ops || !monitor_ops->mon_print_pdev_tx_capture_stats) {
1894 		dp_mon_debug("callback not registered");
1895 		return;
1896 	}
1897 
1898 	return monitor_ops->mon_print_pdev_tx_capture_stats(pdev);
1899 }
1900 
1901 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev,
1902 							  uint32_t val)
1903 {
1904 	struct dp_mon_ops *monitor_ops;
1905 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1906 
1907 	if (!mon_soc) {
1908 		dp_mon_debug("monitor soc is NULL");
1909 		return QDF_STATUS_E_FAILURE;
1910 	}
1911 
1912 	monitor_ops = mon_soc->mon_ops;
1913 	if (!monitor_ops || !monitor_ops->mon_config_enh_tx_capture) {
1914 		dp_mon_debug("callback not registered");
1915 		return QDF_STATUS_E_FAILURE;
1916 	}
1917 
1918 	return monitor_ops->mon_config_enh_tx_capture(pdev, val);
1919 }
1920 #else
1921 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
1922 {
1923 }
1924 
1925 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev,
1926 							  uint32_t val)
1927 {
1928 	return QDF_STATUS_E_INVAL;
1929 }
1930 #endif
1931 
1932 #ifdef WLAN_RX_PKT_CAPTURE_ENH
1933 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev,
1934 							  uint32_t val)
1935 {
1936 	struct dp_mon_ops *monitor_ops;
1937 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1938 
1939 	if (!mon_soc) {
1940 		dp_mon_debug("monitor soc is NULL");
1941 		return QDF_STATUS_E_FAILURE;
1942 	}
1943 
1944 	monitor_ops = mon_soc->mon_ops;
1945 	if (!monitor_ops || !monitor_ops->mon_config_enh_rx_capture) {
1946 		dp_mon_debug("callback not registered");
1947 		return QDF_STATUS_E_FAILURE;
1948 	}
1949 
1950 	return monitor_ops->mon_config_enh_rx_capture(pdev, val);
1951 }
1952 #else
1953 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev,
1954 							  uint32_t val)
1955 {
1956 	return QDF_STATUS_E_INVAL;
1957 }
1958 #endif
1959 
1960 #ifdef QCA_SUPPORT_BPR
1961 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev,
1962 						   uint32_t val)
1963 {
1964 	struct dp_mon_ops *monitor_ops;
1965 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1966 
1967 	if (!mon_soc) {
1968 		dp_mon_debug("monitor soc is NULL");
1969 		return QDF_STATUS_E_FAILURE;
1970 	}
1971 
1972 	monitor_ops = mon_soc->mon_ops;
1973 	if (!monitor_ops || !monitor_ops->mon_set_bpr_enable) {
1974 		dp_mon_debug("callback not registered");
1975 		return QDF_STATUS_E_FAILURE;
1976 	}
1977 
1978 	return monitor_ops->mon_set_bpr_enable(pdev, val);
1979 }
1980 #else
1981 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev,
1982 						   uint32_t val)
1983 {
1984 	return QDF_STATUS_E_FAILURE;
1985 }
1986 #endif
1987 
1988 #ifdef ATH_SUPPORT_NAC
1989 static inline
1990 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val)
1991 {
1992 	struct dp_mon_ops *monitor_ops;
1993 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
1994 
1995 	if (!mon_soc) {
1996 		dp_mon_debug("monitor soc is NULL");
1997 		return 0;
1998 	}
1999 
2000 	monitor_ops = mon_soc->mon_ops;
2001 	if (!monitor_ops || !monitor_ops->mon_set_filter_neigh_peers) {
2002 		dp_mon_debug("callback not registered");
2003 		return 0;
2004 	}
2005 
2006 	return monitor_ops->mon_set_filter_neigh_peers(pdev, val);
2007 }
2008 #else
2009 static inline
2010 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val)
2011 {
2012 	return 0;
2013 }
2014 #endif
2015 
2016 #ifdef WLAN_ATF_ENABLE
2017 static inline
2018 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value)
2019 {
2020 	struct dp_mon_ops *monitor_ops;
2021 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2022 
2023 	if (!mon_soc) {
2024 		dp_mon_debug("monitor soc is NULL");
2025 		return;
2026 	}
2027 
2028 	monitor_ops = mon_soc->mon_ops;
2029 	if (!monitor_ops || !monitor_ops->mon_set_atf_stats_enable) {
2030 		dp_mon_debug("callback not registered");
2031 		return;
2032 	}
2033 
2034 	return monitor_ops->mon_set_atf_stats_enable(pdev, value);
2035 }
2036 #else
2037 static inline
2038 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value)
2039 {
2040 }
2041 #endif
2042 
2043 static inline
2044 void dp_monitor_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor)
2045 {
2046 	struct dp_mon_ops *monitor_ops;
2047 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2048 
2049 	if (!mon_soc) {
2050 		dp_mon_debug("monitor soc is NULL");
2051 		return;
2052 	}
2053 
2054 	monitor_ops = mon_soc->mon_ops;
2055 	if (!monitor_ops || !monitor_ops->mon_set_bsscolor) {
2056 		dp_mon_debug("callback not registered");
2057 		return;
2058 	}
2059 
2060 	return monitor_ops->mon_set_bsscolor(pdev, bsscolor);
2061 }
2062 
2063 static inline
2064 bool dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle)
2065 {
2066 	struct dp_mon_ops *monitor_ops;
2067 	struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
2068 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2069 
2070 	if (!mon_soc) {
2071 		dp_mon_debug("monitor soc is NULL");
2072 		return false;
2073 	}
2074 
2075 	monitor_ops = mon_soc->mon_ops;
2076 	if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_mcast_data) {
2077 		dp_mon_debug("callback not registered");
2078 		return false;
2079 	}
2080 
2081 	return monitor_ops->mon_pdev_get_filter_mcast_data(pdev_handle);
2082 }
2083 
2084 static inline
2085 bool dp_monitor_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle)
2086 {
2087 	struct dp_mon_ops *monitor_ops;
2088 	struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
2089 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2090 
2091 	if (!mon_soc) {
2092 		dp_mon_debug("monitor soc is NULL");
2093 		return false;
2094 	}
2095 
2096 	monitor_ops = mon_soc->mon_ops;
2097 	if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_non_data) {
2098 		dp_mon_debug("callback not registered");
2099 		return false;
2100 	}
2101 
2102 	return monitor_ops->mon_pdev_get_filter_non_data(pdev_handle);
2103 }
2104 
2105 static inline
2106 bool dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle)
2107 {
2108 	struct dp_mon_ops *monitor_ops;
2109 	struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle;
2110 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2111 
2112 	if (!mon_soc) {
2113 		dp_mon_debug("monitor soc is NULL");
2114 		return false;
2115 	}
2116 
2117 	monitor_ops = mon_soc->mon_ops;
2118 	if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_ucast_data) {
2119 		dp_mon_debug("callback not registered");
2120 		return false;
2121 	}
2122 
2123 	return monitor_ops->mon_pdev_get_filter_ucast_data(pdev_handle);
2124 }
2125 
2126 #ifdef WDI_EVENT_ENABLE
2127 static inline
2128 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
2129 				bool enable)
2130 {
2131 	struct dp_mon_ops *monitor_ops;
2132 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2133 
2134 	if (!mon_soc) {
2135 		dp_mon_debug("monitor soc is NULL");
2136 		return 0;
2137 	}
2138 
2139 	monitor_ops = mon_soc->mon_ops;
2140 	if (!monitor_ops || !monitor_ops->mon_set_pktlog_wifi3) {
2141 		dp_mon_debug("callback not registered");
2142 		return 0;
2143 	}
2144 
2145 	return monitor_ops->mon_set_pktlog_wifi3(pdev, event, enable);
2146 }
2147 #else
2148 static inline
2149 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
2150 				bool enable)
2151 {
2152 	return 0;
2153 }
2154 #endif
2155 
2156 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG)
2157 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev)
2158 {
2159 	struct dp_mon_ops *monitor_ops;
2160 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2161 
2162 	if (!mon_soc) {
2163 		dp_mon_debug("monitor soc is NULL");
2164 		return;
2165 	}
2166 
2167 	monitor_ops = mon_soc->mon_ops;
2168 	if (!monitor_ops || !monitor_ops->mon_pktlogmod_exit) {
2169 		dp_mon_debug("callback not registered");
2170 		return;
2171 	}
2172 
2173 	return monitor_ops->mon_pktlogmod_exit(pdev);
2174 }
2175 #else
2176 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) {}
2177 #endif
2178 
2179 static inline
2180 void dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev)
2181 {
2182 	struct dp_mon_ops *monitor_ops;
2183 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2184 
2185 	if (!mon_soc) {
2186 		dp_mon_debug("monitor soc is NULL");
2187 		return;
2188 	}
2189 
2190 	monitor_ops = mon_soc->mon_ops;
2191 	if (!monitor_ops || !monitor_ops->mon_vdev_set_monitor_mode_buf_rings) {
2192 		dp_mon_debug("callback not registered");
2193 		return;
2194 	}
2195 
2196 	return monitor_ops->mon_vdev_set_monitor_mode_buf_rings(pdev);
2197 }
2198 
2199 static inline
2200 void dp_monitor_neighbour_peers_detach(struct dp_pdev *pdev)
2201 {
2202 	struct dp_mon_ops *monitor_ops;
2203 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2204 
2205 	if (!mon_soc) {
2206 		dp_mon_debug("monitor soc is NULL");
2207 		return;
2208 	}
2209 
2210 	monitor_ops = mon_soc->mon_ops;
2211 	if (!monitor_ops || !monitor_ops->mon_neighbour_peers_detach) {
2212 		dp_mon_debug("callback not registered");
2213 		return;
2214 	}
2215 
2216 	return monitor_ops->mon_neighbour_peers_detach(pdev);
2217 }
2218 
2219 #ifdef FEATURE_NAC_RSSI
2220 static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev,
2221 							  uint8_t *rx_pkt_hdr)
2222 {
2223 	struct dp_mon_ops *monitor_ops;
2224 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2225 
2226 	if (!mon_soc) {
2227 		dp_mon_debug("monitor soc is NULL");
2228 		return QDF_STATUS_E_FAILURE;
2229 	}
2230 
2231 	monitor_ops = mon_soc->mon_ops;
2232 	if (!monitor_ops || !monitor_ops->mon_filter_neighbour_peer) {
2233 		dp_mon_debug("callback not registered");
2234 		return QDF_STATUS_E_FAILURE;
2235 	}
2236 
2237 	return monitor_ops->mon_filter_neighbour_peer(pdev, rx_pkt_hdr);
2238 }
2239 #endif
2240 
2241 static inline
2242 void dp_monitor_reap_timer_init(struct dp_soc *soc)
2243 {
2244 	struct dp_mon_ops *monitor_ops;
2245 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2246 
2247 	if (!mon_soc) {
2248 		dp_mon_debug("monitor soc is NULL");
2249 		return;
2250 	}
2251 
2252 	monitor_ops = mon_soc->mon_ops;
2253 	if (!monitor_ops || !monitor_ops->mon_reap_timer_init) {
2254 		dp_mon_debug("callback not registered");
2255 		return;
2256 	}
2257 
2258 	monitor_ops->mon_reap_timer_init(soc);
2259 }
2260 
2261 static inline
2262 void dp_monitor_reap_timer_deinit(struct dp_soc *soc)
2263 {
2264 	struct dp_mon_ops *monitor_ops;
2265 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2266 
2267 	if (!mon_soc) {
2268 		dp_mon_debug("monitor soc is NULL");
2269 		return;
2270 	}
2271 
2272 	monitor_ops = mon_soc->mon_ops;
2273 	if (!monitor_ops || !monitor_ops->mon_reap_timer_deinit) {
2274 		dp_mon_debug("callback not registered");
2275 		return;
2276 	}
2277 
2278 	monitor_ops->mon_reap_timer_deinit(soc);
2279 }
2280 
2281 static inline
2282 void dp_monitor_reap_timer_start(struct dp_soc *soc)
2283 {
2284 	struct dp_mon_ops *monitor_ops;
2285 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2286 
2287 	if (!mon_soc) {
2288 		dp_mon_debug("monitor soc is NULL");
2289 		return;
2290 	}
2291 
2292 	monitor_ops = mon_soc->mon_ops;
2293 	if (!monitor_ops || !monitor_ops->mon_reap_timer_start) {
2294 		dp_mon_debug("callback not registered");
2295 		return;
2296 	}
2297 
2298 	monitor_ops->mon_reap_timer_start(soc);
2299 }
2300 
2301 static inline
2302 bool dp_monitor_reap_timer_stop(struct dp_soc *soc)
2303 {
2304 	struct dp_mon_ops *monitor_ops;
2305 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2306 
2307 	if (!mon_soc) {
2308 		dp_mon_debug("monitor soc is NULL");
2309 		return false;
2310 	}
2311 
2312 	monitor_ops = mon_soc->mon_ops;
2313 	if (!monitor_ops || !monitor_ops->mon_reap_timer_stop) {
2314 		dp_mon_debug("callback not registered");
2315 		return false;
2316 	}
2317 
2318 	return monitor_ops->mon_reap_timer_stop(soc);
2319 }
2320 
2321 static inline
2322 void dp_monitor_vdev_timer_init(struct dp_soc *soc)
2323 {
2324 	struct dp_mon_ops *monitor_ops;
2325 	struct dp_mon_soc *mon_soc = 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_vdev_timer_init) {
2334 		dp_mon_debug("callback not registered");
2335 		return;
2336 	}
2337 
2338 	monitor_ops->mon_vdev_timer_init(soc);
2339 }
2340 
2341 static inline
2342 void dp_monitor_vdev_timer_deinit(struct dp_soc *soc)
2343 {
2344 	struct dp_mon_ops *monitor_ops;
2345 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2346 
2347 	if (!mon_soc) {
2348 		dp_mon_debug("monitor soc is NULL");
2349 		return;
2350 	}
2351 
2352 	monitor_ops = mon_soc->mon_ops;
2353 	if (!monitor_ops || !monitor_ops->mon_vdev_timer_deinit) {
2354 		dp_mon_debug("callback not registered");
2355 		return;
2356 	}
2357 
2358 	monitor_ops->mon_vdev_timer_deinit(soc);
2359 }
2360 
2361 static inline
2362 void dp_monitor_vdev_timer_start(struct dp_soc *soc)
2363 {
2364 	struct dp_mon_ops *monitor_ops;
2365 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2366 
2367 	if (!mon_soc) {
2368 		dp_mon_debug("monitor soc is NULL");
2369 		return;
2370 	}
2371 
2372 	monitor_ops = mon_soc->mon_ops;
2373 	if (!monitor_ops || !monitor_ops->mon_vdev_timer_start) {
2374 		dp_mon_debug("callback not registered");
2375 		return;
2376 	}
2377 
2378 	monitor_ops->mon_vdev_timer_start(soc);
2379 }
2380 
2381 static inline
2382 bool dp_monitor_vdev_timer_stop(struct dp_soc *soc)
2383 {
2384 	struct dp_mon_ops *monitor_ops;
2385 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
2386 
2387 	if (!mon_soc) {
2388 		dp_mon_debug("monitor soc is NULL");
2389 		return false;
2390 	}
2391 
2392 	monitor_ops = mon_soc->mon_ops;
2393 	if (!monitor_ops || !monitor_ops->mon_vdev_timer_stop) {
2394 		dp_mon_debug("callback not registered");
2395 		return false;
2396 	}
2397 
2398 	return monitor_ops->mon_vdev_timer_stop(soc);
2399 }
2400 
2401 #ifdef QCA_MCOPY_SUPPORT
2402 static inline
2403 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev,
2404 					  uint16_t peer_id, uint32_t ppdu_id,
2405 					  uint8_t first_msdu)
2406 {
2407 	struct dp_mon_ops *monitor_ops;
2408 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2409 
2410 	if (!mon_soc) {
2411 		dp_mon_debug("monitor soc is NULL");
2412 		return QDF_STATUS_E_FAILURE;
2413 	}
2414 
2415 	monitor_ops = mon_soc->mon_ops;
2416 	if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) {
2417 		dp_mon_debug("callback not registered");
2418 		return QDF_STATUS_E_FAILURE;
2419 	}
2420 
2421 	return monitor_ops->mon_mcopy_check_deliver(pdev, peer_id,
2422 						    ppdu_id, first_msdu);
2423 }
2424 #else
2425 static inline
2426 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev,
2427 					  uint16_t peer_id, uint32_t ppdu_id,
2428 					  uint8_t first_msdu)
2429 {
2430 	return QDF_STATUS_SUCCESS;
2431 }
2432 #endif
2433 
2434 /*
2435  * dp_monitor_neighbour_peer_add_ast() - Add ast entry
2436  * @pdev: point to dp pdev
2437  * @ta_peer: point to peer
2438  * @mac_addr: mac address
2439  * @nbuf: point to nbuf
2440  * @flags: flags
2441  *
2442  * Return: void
2443  */
2444 static inline void
2445 dp_monitor_neighbour_peer_add_ast(struct dp_pdev *pdev,
2446 				  struct dp_peer *ta_peer,
2447 				  uint8_t *mac_addr,
2448 				  qdf_nbuf_t nbuf,
2449 				  uint32_t flags)
2450 {
2451 	struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc;
2452 	struct dp_mon_ops *monitor_ops;
2453 
2454 	if (!mon_soc) {
2455 		dp_mon_debug("monitor soc is NULL");
2456 		return;
2457 	}
2458 
2459 	monitor_ops = mon_soc->mon_ops;
2460 	if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) {
2461 		dp_mon_debug("callback not registered");
2462 		return;
2463 	}
2464 
2465 	return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr,
2466 						       nbuf, flags);
2467 }
2468 
2469 /*
2470  * dp_monitor_vdev_delete() - delete monitor vdev
2471  * @soc: point to dp soc
2472  * @vdev: point to dp vdev
2473  *
2474  * Return: void
2475  */
2476 static inline void dp_monitor_vdev_delete(struct dp_soc *soc,
2477 					  struct dp_vdev *vdev)
2478 {
2479 	if (soc->intr_mode == DP_INTR_POLL) {
2480 		qdf_timer_sync_cancel(&soc->int_timer);
2481 		dp_monitor_flush_rings(soc);
2482 	} else if (soc->intr_mode == DP_INTR_MSI) {
2483 		if (dp_monitor_vdev_timer_stop(soc))
2484 			dp_monitor_flush_rings(soc);
2485 	}
2486 
2487 	dp_monitor_vdev_detach(vdev);
2488 }
2489 
2490 #ifdef DP_POWER_SAVE
2491 /*
2492  * dp_monitor_pktlog_reap_pending_frames() - reap pending frames
2493  * @pdev: point to dp pdev
2494  *
2495  * Return: void
2496  */
2497 static inline void dp_monitor_pktlog_reap_pending_frames(struct dp_pdev *pdev)
2498 {
2499 	struct dp_soc *soc;
2500 
2501 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
2502 		return;
2503 
2504 	soc = pdev->soc;
2505 
2506 	if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
2507 	     dp_mon_is_enable_reap_timer_non_pkt(pdev))) {
2508 		if (dp_monitor_reap_timer_stop(soc))
2509 			dp_monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET);
2510 	}
2511 }
2512 
2513 /*
2514  * dp_monitor_pktlog_start_reap_timer() - start reap timer
2515  * @pdev: point to dp pdev
2516  *
2517  * Return: void
2518  */
2519 static inline void dp_monitor_pktlog_start_reap_timer(struct dp_pdev *pdev)
2520 {
2521 	struct dp_soc *soc;
2522 
2523 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
2524 		return;
2525 
2526 	soc = pdev->soc;
2527 	if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) ||
2528 	     dp_mon_is_enable_reap_timer_non_pkt(pdev)))
2529 		dp_monitor_reap_timer_start(soc);
2530 }
2531 #endif
2532 
2533 /*
2534  * dp_monitor_neighbour_peer_list_remove() - remove neighbour peer list
2535  * @pdev: point to dp pdev
2536  * @vdev: point to dp vdev
2537  * @peer: point to dp_neighbour_peer
2538  *
2539  * Return: void
2540  */
2541 static inline
2542 void dp_monitor_neighbour_peer_list_remove(struct dp_pdev *pdev,
2543 					   struct dp_vdev *vdev,
2544 					   struct dp_neighbour_peer *peer)
2545 {
2546 	struct dp_mon_pdev *mon_pdev;
2547 	struct dp_neighbour_peer *temp_peer = NULL;
2548 
2549 	if (qdf_unlikely(!pdev || !pdev->monitor_pdev))
2550 		return;
2551 
2552 	mon_pdev = pdev->monitor_pdev;
2553 	qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
2554 	if (!pdev->soc->monitor_soc->hw_nac_monitor_support) {
2555 		TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
2556 			      neighbour_peer_list_elem) {
2557 				QDF_ASSERT(peer->vdev != vdev);
2558 			}
2559 	} else {
2560 		TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list,
2561 				   neighbour_peer_list_elem, temp_peer) {
2562 			if (peer->vdev == vdev) {
2563 				TAILQ_REMOVE(&mon_pdev->neighbour_peers_list,
2564 					     peer,
2565 					     neighbour_peer_list_elem);
2566 				qdf_mem_free(peer);
2567 			}
2568 		}
2569 	}
2570 	qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
2571 }
2572 
2573 static inline
2574 void dp_monitor_pdev_set_mon_vdev(struct dp_vdev *vdev)
2575 {
2576 	if (!vdev->pdev->monitor_pdev)
2577 		return;
2578 
2579 	vdev->pdev->monitor_pdev->mvdev = vdev;
2580 }
2581 
2582 static inline
2583 void dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev *pdev, bool val)
2584 {
2585 	if (!pdev || !pdev->monitor_pdev)
2586 		return;
2587 
2588 	pdev->monitor_pdev->scan_spcl_vap_configured = val;
2589 }
2590 
2591 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
2592 static inline
2593 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev,
2594 						      bool val)
2595 {
2596 	if (!pdev || !pdev->monitor_pdev)
2597 		return;
2598 
2599 	pdev->monitor_pdev->reset_scan_spcl_vap_stats_enable = val;
2600 }
2601 #else
2602 static inline
2603 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev,
2604 						      bool val)
2605 {
2606 }
2607 #endif
2608 
2609 QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc);
2610 QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc);
2611 QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev);
2612 QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev);
2613 QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev);
2614 QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev);
2615 QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc);
2616 void dp_mon_cdp_ops_register(struct dp_soc *soc);
2617 void dp_mon_cdp_ops_deregister(struct dp_soc *soc);
2618 void dp_mon_ops_register(struct dp_mon_soc *mon_soc);
2619 QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc,
2620 				 struct dp_pdev *pdev,
2621 				 int mac_id,
2622 				 int mac_for_pdev);
2623 #ifdef QCA_ENHANCED_STATS_SUPPORT
2624 QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev,
2625 				    struct cdp_rx_stats_ppdu_user *ppdu_user);
2626 #endif
2627 
2628 #endif /* _DP_MON_H_ */
2629