xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name #include <dp_types.h>
18*5113495bSYour Name #include "dp_rx.h"
19*5113495bSYour Name #include "dp_peer.h"
20*5113495bSYour Name #include <dp_htt.h>
21*5113495bSYour Name #include <dp_mon_filter.h>
22*5113495bSYour Name #include <dp_mon.h>
23*5113495bSYour Name #include <dp_rx_mon.h>
24*5113495bSYour Name #include <dp_rx_mon_1.0.h>
25*5113495bSYour Name #include <dp_mon_1.0.h>
26*5113495bSYour Name #include <dp_mon_filter_1.0.h>
27*5113495bSYour Name 
28*5113495bSYour Name #include "htt_ppdu_stats.h"
29*5113495bSYour Name #if defined(DP_CON_MON)
30*5113495bSYour Name #ifndef REMOVE_PKT_LOG
31*5113495bSYour Name #include <pktlog_ac_api.h>
32*5113495bSYour Name #include <pktlog_ac.h>
33*5113495bSYour Name #endif
34*5113495bSYour Name #endif
35*5113495bSYour Name #ifdef FEATURE_PERPKT_INFO
36*5113495bSYour Name #include "dp_ratetable.h"
37*5113495bSYour Name #endif
38*5113495bSYour Name 
39*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH
40*5113495bSYour Name #include "dp_tx_capture.h"
41*5113495bSYour Name #endif
42*5113495bSYour Name 
43*5113495bSYour Name extern QDF_STATUS dp_srng_alloc(struct dp_soc *soc, struct dp_srng *srng,
44*5113495bSYour Name 				int ring_type, uint32_t num_entries,
45*5113495bSYour Name 				bool cached);
46*5113495bSYour Name extern void dp_srng_free(struct dp_soc *soc, struct dp_srng *srng);
47*5113495bSYour Name extern QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng,
48*5113495bSYour Name 			       int ring_type, int ring_num, int mac_id);
49*5113495bSYour Name extern void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng,
50*5113495bSYour Name 			   int ring_type, int ring_num);
51*5113495bSYour Name 
52*5113495bSYour Name extern enum timer_yield_status
53*5113495bSYour Name dp_should_timer_irq_yield(struct dp_soc *soc, uint32_t work_done,
54*5113495bSYour Name 			  uint64_t start_time);
55*5113495bSYour Name 
56*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
57*5113495bSYour Name void
dp_mon_populate_ppdu_info_1_0(struct hal_rx_ppdu_info * hal_ppdu_info,struct cdp_rx_indication_ppdu * ppdu)58*5113495bSYour Name dp_mon_populate_ppdu_info_1_0(struct hal_rx_ppdu_info *hal_ppdu_info,
59*5113495bSYour Name 			      struct cdp_rx_indication_ppdu *ppdu)
60*5113495bSYour Name {
61*5113495bSYour Name 	ppdu->u.preamble = hal_ppdu_info->rx_status.preamble_type;
62*5113495bSYour Name 	ppdu->u.bw = hal_ppdu_info->rx_status.bw;
63*5113495bSYour Name 	ppdu->punc_bw = 0;
64*5113495bSYour Name }
65*5113495bSYour Name 
66*5113495bSYour Name /**
67*5113495bSYour Name  * is_ppdu_txrx_capture_enabled() - API to check both pktlog and debug_sniffer
68*5113495bSYour Name  *                              modes are enabled or not.
69*5113495bSYour Name  * @pdev: dp pdev handle.
70*5113495bSYour Name  *
71*5113495bSYour Name  * Return: bool
72*5113495bSYour Name  */
is_ppdu_txrx_capture_enabled(struct dp_pdev * pdev)73*5113495bSYour Name static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev)
74*5113495bSYour Name {
75*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
76*5113495bSYour Name 
77*5113495bSYour Name 	if (!mon_pdev->pktlog_ppdu_stats && !mon_pdev->tx_sniffer_enable &&
78*5113495bSYour Name 	    !mon_pdev->mcopy_mode)
79*5113495bSYour Name 		return true;
80*5113495bSYour Name 	else
81*5113495bSYour Name 		return false;
82*5113495bSYour Name }
83*5113495bSYour Name 
84*5113495bSYour Name /**
85*5113495bSYour Name  * dp_mon_tx_enable_enhanced_stats_1_0() - Send HTT cmd to FW to enable stats
86*5113495bSYour Name  * @pdev: Datapath pdev handle
87*5113495bSYour Name  *
88*5113495bSYour Name  * Return: none
89*5113495bSYour Name  */
dp_mon_tx_enable_enhanced_stats_1_0(struct dp_pdev * pdev)90*5113495bSYour Name static void dp_mon_tx_enable_enhanced_stats_1_0(struct dp_pdev *pdev)
91*5113495bSYour Name {
92*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
93*5113495bSYour Name 
94*5113495bSYour Name 	if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
95*5113495bSYour Name 		dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS,
96*5113495bSYour Name 					  pdev->pdev_id);
97*5113495bSYour Name 	} else if (is_ppdu_txrx_capture_enabled(pdev) &&
98*5113495bSYour Name 		   mon_pdev->bpr_enable) {
99*5113495bSYour Name 		dp_h2t_cfg_stats_msg_send(pdev,
100*5113495bSYour Name 					  DP_PPDU_STATS_CFG_BPR_ENH,
101*5113495bSYour Name 					  pdev->pdev_id);
102*5113495bSYour Name 	}
103*5113495bSYour Name }
104*5113495bSYour Name 
105*5113495bSYour Name /**
106*5113495bSYour Name  * dp_mon_tx_disable_enhanced_stats_1_0() - Send HTT cmd to FW to disable stats
107*5113495bSYour Name  * @pdev: Datapath pdev handle
108*5113495bSYour Name  *
109*5113495bSYour Name  * Return: none
110*5113495bSYour Name  */
dp_mon_tx_disable_enhanced_stats_1_0(struct dp_pdev * pdev)111*5113495bSYour Name static void dp_mon_tx_disable_enhanced_stats_1_0(struct dp_pdev *pdev)
112*5113495bSYour Name {
113*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
114*5113495bSYour Name 
115*5113495bSYour Name 	if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) {
116*5113495bSYour Name 		dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
117*5113495bSYour Name 	} else if (is_ppdu_txrx_capture_enabled(pdev) && mon_pdev->bpr_enable) {
118*5113495bSYour Name 		dp_h2t_cfg_stats_msg_send(pdev,
119*5113495bSYour Name 					  DP_PPDU_STATS_CFG_BPR,
120*5113495bSYour Name 					  pdev->pdev_id);
121*5113495bSYour Name 	}
122*5113495bSYour Name }
123*5113495bSYour Name #endif
124*5113495bSYour Name 
125*5113495bSYour Name #ifdef QCA_SUPPORT_FULL_MON
126*5113495bSYour Name static QDF_STATUS
dp_config_full_mon_mode(struct cdp_soc_t * soc_handle,uint8_t val)127*5113495bSYour Name dp_config_full_mon_mode(struct cdp_soc_t *soc_handle,
128*5113495bSYour Name 			uint8_t val)
129*5113495bSYour Name {
130*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_handle;
131*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
132*5113495bSYour Name 
133*5113495bSYour Name 	mon_soc->full_mon_mode = val;
134*5113495bSYour Name 	dp_cdp_err("Configure full monitor mode val: %d ", val);
135*5113495bSYour Name 
136*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
137*5113495bSYour Name }
138*5113495bSYour Name 
139*5113495bSYour Name static QDF_STATUS
dp_soc_config_full_mon_mode(struct cdp_pdev * cdp_pdev,uint8_t val)140*5113495bSYour Name dp_soc_config_full_mon_mode(struct cdp_pdev *cdp_pdev, uint8_t val)
141*5113495bSYour Name {
142*5113495bSYour Name 	struct dp_pdev *pdev = (struct dp_pdev *)cdp_pdev;
143*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
144*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
145*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
146*5113495bSYour Name 
147*5113495bSYour Name 	if (!mon_soc->full_mon_mode)
148*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
149*5113495bSYour Name 
150*5113495bSYour Name 	if ((htt_h2t_full_mon_cfg(soc->htt_handle,
151*5113495bSYour Name 				  pdev->pdev_id,
152*5113495bSYour Name 				  val)) != QDF_STATUS_SUCCESS) {
153*5113495bSYour Name 		status = QDF_STATUS_E_FAILURE;
154*5113495bSYour Name 	}
155*5113495bSYour Name 
156*5113495bSYour Name 	return status;
157*5113495bSYour Name }
158*5113495bSYour Name #else
159*5113495bSYour Name static inline QDF_STATUS
dp_config_full_mon_mode(struct cdp_soc_t * soc_handle,uint8_t val)160*5113495bSYour Name dp_config_full_mon_mode(struct cdp_soc_t *soc_handle,
161*5113495bSYour Name 			uint8_t val)
162*5113495bSYour Name {
163*5113495bSYour Name 	return 0;
164*5113495bSYour Name }
165*5113495bSYour Name 
166*5113495bSYour Name static inline QDF_STATUS
dp_soc_config_full_mon_mode(struct cdp_pdev * cdp_pdev,uint8_t val)167*5113495bSYour Name dp_soc_config_full_mon_mode(struct cdp_pdev *cdp_pdev,
168*5113495bSYour Name 			    uint8_t val)
169*5113495bSYour Name {
170*5113495bSYour Name 	return 0;
171*5113495bSYour Name }
172*5113495bSYour Name #endif
173*5113495bSYour Name 
174*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG)
dp_flush_monitor_rings(struct dp_soc * soc)175*5113495bSYour Name void dp_flush_monitor_rings(struct dp_soc *soc)
176*5113495bSYour Name {
177*5113495bSYour Name 	struct dp_pdev *pdev = soc->pdev_list[0];
178*5113495bSYour Name 	hal_soc_handle_t hal_soc = soc->hal_soc;
179*5113495bSYour Name 	uint32_t lmac_id;
180*5113495bSYour Name 	uint32_t hp, tp;
181*5113495bSYour Name 	int budget;
182*5113495bSYour Name 	void *mon_dst_srng;
183*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
184*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
185*5113495bSYour Name 
186*5113495bSYour Name 	if (qdf_unlikely(mon_soc->full_mon_mode))
187*5113495bSYour Name 		return;
188*5113495bSYour Name 
189*5113495bSYour Name 	/* Reset monitor filters before reaping the ring*/
190*5113495bSYour Name 	qdf_spin_lock_bh(&mon_pdev->mon_lock);
191*5113495bSYour Name 	dp_mon_filter_reset_mon_mode(pdev);
192*5113495bSYour Name 	if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS)
193*5113495bSYour Name 		dp_info("failed to reset monitor filters");
194*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_pdev->mon_lock);
195*5113495bSYour Name 
196*5113495bSYour Name 	if (qdf_unlikely(mon_pdev->mon_chan_band >= REG_BAND_UNKNOWN))
197*5113495bSYour Name 		return;
198*5113495bSYour Name 
199*5113495bSYour Name 	lmac_id = pdev->ch_band_lmac_id_mapping[mon_pdev->mon_chan_band];
200*5113495bSYour Name 	if (qdf_unlikely(lmac_id == DP_MON_INVALID_LMAC_ID))
201*5113495bSYour Name 		return;
202*5113495bSYour Name 
203*5113495bSYour Name 	mon_dst_srng = dp_rxdma_get_mon_dst_ring(pdev, lmac_id);
204*5113495bSYour Name 
205*5113495bSYour Name 	/* reap full ring */
206*5113495bSYour Name 	budget = wlan_cfg_get_dma_mon_stat_ring_size(pdev->wlan_cfg_ctx);
207*5113495bSYour Name 
208*5113495bSYour Name 	hal_get_sw_hptp(hal_soc, mon_dst_srng, &tp, &hp);
209*5113495bSYour Name 	dp_info("Before flush: Monitor DST ring HP %u TP %u", hp, tp);
210*5113495bSYour Name 
211*5113495bSYour Name 	dp_mon_drop_packets_for_mac(pdev, lmac_id, budget, true);
212*5113495bSYour Name 
213*5113495bSYour Name 	hal_get_sw_hptp(hal_soc, mon_dst_srng, &tp, &hp);
214*5113495bSYour Name 	dp_info("After flush: Monitor DST ring HP %u TP %u", hp, tp);
215*5113495bSYour Name }
216*5113495bSYour Name 
dp_mon_rings_deinit_1_0(struct dp_pdev * pdev)217*5113495bSYour Name void dp_mon_rings_deinit_1_0(struct dp_pdev *pdev)
218*5113495bSYour Name {
219*5113495bSYour Name 	int mac_id = 0;
220*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
221*5113495bSYour Name 
222*5113495bSYour Name 	for (mac_id = 0;
223*5113495bSYour Name 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
224*5113495bSYour Name 	     mac_id++) {
225*5113495bSYour Name 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
226*5113495bSYour Name 							 pdev->pdev_id);
227*5113495bSYour Name 
228*5113495bSYour Name 		dp_srng_deinit(soc, &soc->rxdma_mon_status_ring[lmac_id],
229*5113495bSYour Name 			       RXDMA_MONITOR_STATUS, 0);
230*5113495bSYour Name 		dp_srng_deinit(soc, &soc->sw2rxdma_link_ring[lmac_id],
231*5113495bSYour Name 			       SW2RXDMA_LINK_RELEASE, 0);
232*5113495bSYour Name 
233*5113495bSYour Name 		dp_mon_dest_rings_deinit(pdev, lmac_id);
234*5113495bSYour Name 	}
235*5113495bSYour Name }
236*5113495bSYour Name 
dp_mon_rings_free_1_0(struct dp_pdev * pdev)237*5113495bSYour Name void dp_mon_rings_free_1_0(struct dp_pdev *pdev)
238*5113495bSYour Name {
239*5113495bSYour Name 	int mac_id = 0;
240*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
241*5113495bSYour Name 
242*5113495bSYour Name 
243*5113495bSYour Name 	for (mac_id = 0;
244*5113495bSYour Name 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
245*5113495bSYour Name 	     mac_id++) {
246*5113495bSYour Name 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
247*5113495bSYour Name 							 pdev->pdev_id);
248*5113495bSYour Name 
249*5113495bSYour Name 		dp_srng_free(soc, &soc->rxdma_mon_status_ring[lmac_id]);
250*5113495bSYour Name 		dp_srng_free(soc, &soc->sw2rxdma_link_ring[lmac_id]);
251*5113495bSYour Name 
252*5113495bSYour Name 		dp_mon_dest_rings_free(pdev, lmac_id);
253*5113495bSYour Name 	}
254*5113495bSYour Name }
255*5113495bSYour Name 
256*5113495bSYour Name #ifdef WLAN_SOFTUMAC_SUPPORT
257*5113495bSYour Name static QDF_STATUS
dp_mon_sw2rxdma_link_ring_alloc(struct dp_pdev * pdev,int lmac_id)258*5113495bSYour Name dp_mon_sw2rxdma_link_ring_alloc(struct dp_pdev *pdev, int lmac_id)
259*5113495bSYour Name {
260*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
261*5113495bSYour Name 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx = pdev->wlan_cfg_ctx;
262*5113495bSYour Name 	int entries;
263*5113495bSYour Name 
264*5113495bSYour Name 	entries = wlan_cfg_get_dma_sw2rxdma_link_ring_size(pdev_cfg_ctx);
265*5113495bSYour Name 
266*5113495bSYour Name 	return dp_srng_alloc(soc, &soc->sw2rxdma_link_ring[lmac_id],
267*5113495bSYour Name 			     SW2RXDMA_LINK_RELEASE, entries, 0);
268*5113495bSYour Name }
269*5113495bSYour Name 
270*5113495bSYour Name static QDF_STATUS
dp_mon_sw2rxdma_link_ring_init(struct dp_soc * soc,int lmac_id)271*5113495bSYour Name dp_mon_sw2rxdma_link_ring_init(struct dp_soc *soc, int lmac_id)
272*5113495bSYour Name {
273*5113495bSYour Name 	return dp_srng_init(soc, &soc->sw2rxdma_link_ring[lmac_id],
274*5113495bSYour Name 			    SW2RXDMA_LINK_RELEASE, 0, lmac_id);
275*5113495bSYour Name }
276*5113495bSYour Name #else
277*5113495bSYour Name static QDF_STATUS
dp_mon_sw2rxdma_link_ring_alloc(struct dp_pdev * pdev,int lmac_id)278*5113495bSYour Name dp_mon_sw2rxdma_link_ring_alloc(struct dp_pdev *pdev, int lmac_id)
279*5113495bSYour Name {
280*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
281*5113495bSYour Name }
282*5113495bSYour Name 
283*5113495bSYour Name static QDF_STATUS
dp_mon_sw2rxdma_link_ring_init(struct dp_soc * soc,int lmac_id)284*5113495bSYour Name dp_mon_sw2rxdma_link_ring_init(struct dp_soc *soc, int lmac_id)
285*5113495bSYour Name {
286*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
287*5113495bSYour Name }
288*5113495bSYour Name #endif
289*5113495bSYour Name 
dp_mon_rings_init_1_0(struct dp_pdev * pdev)290*5113495bSYour Name QDF_STATUS dp_mon_rings_init_1_0(struct dp_pdev *pdev)
291*5113495bSYour Name {
292*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
293*5113495bSYour Name 	int mac_id = 0;
294*5113495bSYour Name 
295*5113495bSYour Name 	for (mac_id = 0;
296*5113495bSYour Name 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
297*5113495bSYour Name 	     mac_id++) {
298*5113495bSYour Name 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
299*5113495bSYour Name 							 pdev->pdev_id);
300*5113495bSYour Name 
301*5113495bSYour Name 		if (dp_srng_init(soc, &soc->rxdma_mon_status_ring[lmac_id],
302*5113495bSYour Name 				 RXDMA_MONITOR_STATUS, 0, lmac_id)) {
303*5113495bSYour Name 			dp_mon_err("%pK: " RNG_ERR "rxdma_mon_status_ring",
304*5113495bSYour Name 				   soc);
305*5113495bSYour Name 			goto fail1;
306*5113495bSYour Name 		}
307*5113495bSYour Name 
308*5113495bSYour Name 		if (dp_mon_sw2rxdma_link_ring_init(soc, lmac_id)) {
309*5113495bSYour Name 			dp_mon_err("%pK: " RNG_ERR "sw2rxdma_link_ring", soc);
310*5113495bSYour Name 			goto fail1;
311*5113495bSYour Name 		}
312*5113495bSYour Name 
313*5113495bSYour Name 		if (dp_mon_dest_rings_init(pdev, lmac_id))
314*5113495bSYour Name 			goto fail1;
315*5113495bSYour Name 	}
316*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
317*5113495bSYour Name 
318*5113495bSYour Name fail1:
319*5113495bSYour Name 	dp_mon_rings_deinit_1_0(pdev);
320*5113495bSYour Name 	return QDF_STATUS_E_NOMEM;
321*5113495bSYour Name }
322*5113495bSYour Name 
dp_mon_rings_alloc_1_0(struct dp_pdev * pdev)323*5113495bSYour Name QDF_STATUS dp_mon_rings_alloc_1_0(struct dp_pdev *pdev)
324*5113495bSYour Name {
325*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
326*5113495bSYour Name 	int mac_id = 0;
327*5113495bSYour Name 	int entries;
328*5113495bSYour Name 	struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
329*5113495bSYour Name 
330*5113495bSYour Name 	pdev_cfg_ctx = pdev->wlan_cfg_ctx;
331*5113495bSYour Name 
332*5113495bSYour Name 	for (mac_id = 0;
333*5113495bSYour Name 	     mac_id  < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
334*5113495bSYour Name 	     mac_id++) {
335*5113495bSYour Name 		int lmac_id =
336*5113495bSYour Name 		dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id);
337*5113495bSYour Name 		entries = wlan_cfg_get_dma_mon_stat_ring_size(pdev_cfg_ctx);
338*5113495bSYour Name 		if (dp_srng_alloc(soc, &soc->rxdma_mon_status_ring[lmac_id],
339*5113495bSYour Name 				  RXDMA_MONITOR_STATUS, entries, 0)) {
340*5113495bSYour Name 			dp_mon_err("%pK: " RNG_ERR "rxdma_mon_status_ring",
341*5113495bSYour Name 				   soc);
342*5113495bSYour Name 			goto fail1;
343*5113495bSYour Name 		}
344*5113495bSYour Name 
345*5113495bSYour Name 		if (dp_mon_sw2rxdma_link_ring_alloc(pdev, lmac_id)) {
346*5113495bSYour Name 			dp_mon_err("%pK: " RNG_ERR "sw2rxdma_link_ring", soc);
347*5113495bSYour Name 			goto fail1;
348*5113495bSYour Name 		}
349*5113495bSYour Name 
350*5113495bSYour Name 		if (dp_mon_dest_rings_alloc(pdev, lmac_id))
351*5113495bSYour Name 			goto fail1;
352*5113495bSYour Name 	}
353*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
354*5113495bSYour Name 
355*5113495bSYour Name fail1:
356*5113495bSYour Name 	dp_mon_rings_free_1_0(pdev);
357*5113495bSYour Name 	return QDF_STATUS_E_NOMEM;
358*5113495bSYour Name }
359*5113495bSYour Name #else
360*5113495bSYour Name inline
dp_flush_monitor_rings(struct dp_soc * soc)361*5113495bSYour Name void dp_flush_monitor_rings(struct dp_soc *soc)
362*5113495bSYour Name {
363*5113495bSYour Name }
364*5113495bSYour Name 
365*5113495bSYour Name #endif
366*5113495bSYour Name 
367*5113495bSYour Name #ifdef QCA_MONITOR_PKT_SUPPORT
dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev * pdev)368*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev)
369*5113495bSYour Name {
370*5113495bSYour Name 	uint32_t mac_id;
371*5113495bSYour Name 	uint32_t mac_for_pdev;
372*5113495bSYour Name 	struct dp_srng *mon_buf_ring;
373*5113495bSYour Name 	uint32_t num_entries;
374*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
375*5113495bSYour Name 
376*5113495bSYour Name 	/* If delay monitor replenish is disabled, allocate link descriptor
377*5113495bSYour Name 	 * monitor ring buffers of ring size.
378*5113495bSYour Name 	 */
379*5113495bSYour Name 	if (!wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) {
380*5113495bSYour Name 		dp_vdev_set_monitor_mode_rings(pdev, false);
381*5113495bSYour Name 	} else {
382*5113495bSYour Name 		for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
383*5113495bSYour Name 			mac_for_pdev =
384*5113495bSYour Name 				dp_get_lmac_id_for_pdev_id(pdev->soc,
385*5113495bSYour Name 							   mac_id,
386*5113495bSYour Name 							   pdev->pdev_id);
387*5113495bSYour Name 
388*5113495bSYour Name 			dp_rx_pdev_mon_buf_buffers_alloc(pdev, mac_for_pdev,
389*5113495bSYour Name 							 FALSE);
390*5113495bSYour Name 			mon_buf_ring =
391*5113495bSYour Name 				&pdev->soc->rxdma_mon_buf_ring[mac_for_pdev];
392*5113495bSYour Name 			/*
393*5113495bSYour Name 			 * Configure low interrupt threshld when monitor mode is
394*5113495bSYour Name 			 * configured.
395*5113495bSYour Name 			 */
396*5113495bSYour Name 			if (mon_buf_ring->hal_srng) {
397*5113495bSYour Name 				num_entries = mon_buf_ring->num_entries;
398*5113495bSYour Name 				hal_set_low_threshold(mon_buf_ring->hal_srng,
399*5113495bSYour Name 						      num_entries >> 3);
400*5113495bSYour Name 				htt_srng_setup(pdev->soc->htt_handle,
401*5113495bSYour Name 					       pdev->pdev_id,
402*5113495bSYour Name 					       mon_buf_ring->hal_srng,
403*5113495bSYour Name 					       RXDMA_MONITOR_BUF);
404*5113495bSYour Name 			}
405*5113495bSYour Name 		}
406*5113495bSYour Name 	}
407*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
408*5113495bSYour Name }
409*5113495bSYour Name #endif
410*5113495bSYour Name 
411*5113495bSYour Name #ifdef QCA_MONITOR_PKT_SUPPORT
dp_vdev_set_monitor_mode_rings(struct dp_pdev * pdev,uint8_t delayed_replenish)412*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev,
413*5113495bSYour Name 					  uint8_t delayed_replenish)
414*5113495bSYour Name {
415*5113495bSYour Name 	uint32_t mac_id;
416*5113495bSYour Name 	uint32_t mac_for_pdev;
417*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
418*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
419*5113495bSYour Name 	struct dp_srng *mon_buf_ring;
420*5113495bSYour Name 	uint32_t num_entries;
421*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
422*5113495bSYour Name 	uint32_t target_type = hal_get_target_type(soc->hal_soc);
423*5113495bSYour Name 
424*5113495bSYour Name 	/* If monitor rings are already initialized, return from here */
425*5113495bSYour Name 	if (mon_pdev->pdev_mon_init)
426*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
427*5113495bSYour Name 
428*5113495bSYour Name 	if (target_type == TARGET_TYPE_QCN9160) {
429*5113495bSYour Name 		dp_alert("Mon SOC:%pK config, skip desc pool alloc", soc);
430*5113495bSYour Name 		goto pass;
431*5113495bSYour Name 	}
432*5113495bSYour Name 
433*5113495bSYour Name 	for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) {
434*5113495bSYour Name 		mac_for_pdev = dp_get_lmac_id_for_pdev_id(pdev->soc, mac_id,
435*5113495bSYour Name 							  pdev->pdev_id);
436*5113495bSYour Name 
437*5113495bSYour Name 		/* Allocate sw rx descriptor pool for mon RxDMA buffer ring */
438*5113495bSYour Name 		status = dp_rx_pdev_mon_buf_desc_pool_alloc(pdev, mac_for_pdev);
439*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(status)) {
440*5113495bSYour Name 			dp_err("%s: dp_rx_pdev_mon_buf_desc_pool_alloc() failed",
441*5113495bSYour Name 			       __func__);
442*5113495bSYour Name 			goto fail0;
443*5113495bSYour Name 		}
444*5113495bSYour Name 
445*5113495bSYour Name 		dp_rx_pdev_mon_buf_desc_pool_init(pdev, mac_for_pdev);
446*5113495bSYour Name 
447*5113495bSYour Name 		/* If monitor buffers are already allocated,
448*5113495bSYour Name 		 * do not allocate.
449*5113495bSYour Name 		 */
450*5113495bSYour Name 		status = dp_rx_pdev_mon_buf_buffers_alloc(pdev, mac_for_pdev,
451*5113495bSYour Name 							  delayed_replenish);
452*5113495bSYour Name 
453*5113495bSYour Name 		mon_buf_ring = &pdev->soc->rxdma_mon_buf_ring[mac_for_pdev];
454*5113495bSYour Name 		/*
455*5113495bSYour Name 		 * Configure low interrupt threshld when monitor mode is
456*5113495bSYour Name 		 * configured.
457*5113495bSYour Name 		 */
458*5113495bSYour Name 		if (mon_buf_ring->hal_srng) {
459*5113495bSYour Name 			num_entries = mon_buf_ring->num_entries;
460*5113495bSYour Name 			hal_set_low_threshold(mon_buf_ring->hal_srng,
461*5113495bSYour Name 					      num_entries >> 3);
462*5113495bSYour Name 			htt_srng_setup(pdev->soc->htt_handle,
463*5113495bSYour Name 				       pdev->pdev_id,
464*5113495bSYour Name 				       mon_buf_ring->hal_srng,
465*5113495bSYour Name 				       RXDMA_MONITOR_BUF);
466*5113495bSYour Name 		}
467*5113495bSYour Name 
468*5113495bSYour Name 		/* Allocate link descriptors for the mon link descriptor ring */
469*5113495bSYour Name 		status = dp_hw_link_desc_pool_banks_alloc(soc, mac_for_pdev);
470*5113495bSYour Name 		if (!QDF_IS_STATUS_SUCCESS(status)) {
471*5113495bSYour Name 			dp_err("%s: dp_hw_link_desc_pool_banks_alloc() failed",
472*5113495bSYour Name 			       __func__);
473*5113495bSYour Name 			goto fail0;
474*5113495bSYour Name 		}
475*5113495bSYour Name 		dp_link_desc_ring_replenish(soc, mac_for_pdev);
476*5113495bSYour Name 
477*5113495bSYour Name 		htt_srng_setup(soc->htt_handle, pdev->pdev_id,
478*5113495bSYour Name 			       soc->rxdma_mon_desc_ring[mac_for_pdev].hal_srng,
479*5113495bSYour Name 			       RXDMA_MONITOR_DESC);
480*5113495bSYour Name 		htt_srng_setup(soc->htt_handle, pdev->pdev_id,
481*5113495bSYour Name 			       soc->rxdma_mon_dst_ring[mac_for_pdev].hal_srng,
482*5113495bSYour Name 			       RXDMA_MONITOR_DST);
483*5113495bSYour Name 	}
484*5113495bSYour Name pass:
485*5113495bSYour Name 	mon_pdev->pdev_mon_init = 1;
486*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
487*5113495bSYour Name 
488*5113495bSYour Name fail0:
489*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
490*5113495bSYour Name }
491*5113495bSYour Name #endif
492*5113495bSYour Name 
493*5113495bSYour Name /* dp_mon_vdev_timer()- timer poll for interrupts
494*5113495bSYour Name  *
495*5113495bSYour Name  * @arg: SoC Handle
496*5113495bSYour Name  *
497*5113495bSYour Name  * Return:
498*5113495bSYour Name  *
499*5113495bSYour Name  */
dp_mon_vdev_timer(void * arg)500*5113495bSYour Name static void dp_mon_vdev_timer(void *arg)
501*5113495bSYour Name {
502*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)arg;
503*5113495bSYour Name 	struct dp_pdev *pdev = soc->pdev_list[0];
504*5113495bSYour Name 	enum timer_yield_status yield = DP_TIMER_NO_YIELD;
505*5113495bSYour Name 	uint32_t work_done  = 0, total_work_done = 0;
506*5113495bSYour Name 	int budget = 0xffff;
507*5113495bSYour Name 	uint32_t remaining_quota = budget;
508*5113495bSYour Name 	uint64_t start_time;
509*5113495bSYour Name 	uint32_t lmac_id = DP_MON_INVALID_LMAC_ID;
510*5113495bSYour Name 	uint32_t lmac_iter;
511*5113495bSYour Name 	int max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx);
512*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
513*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
514*5113495bSYour Name 
515*5113495bSYour Name 	if (!qdf_atomic_read(&soc->cmn_init_done))
516*5113495bSYour Name 		return;
517*5113495bSYour Name 
518*5113495bSYour Name 	if (mon_pdev->mon_chan_band != REG_BAND_UNKNOWN)
519*5113495bSYour Name 		lmac_id = pdev->ch_band_lmac_id_mapping[mon_pdev->mon_chan_band];
520*5113495bSYour Name 
521*5113495bSYour Name 	start_time = qdf_get_log_timestamp();
522*5113495bSYour Name 	dp_update_num_mac_rings_for_dbs(soc, &max_mac_rings);
523*5113495bSYour Name 
524*5113495bSYour Name 	while (yield == DP_TIMER_NO_YIELD) {
525*5113495bSYour Name 		for (lmac_iter = 0; lmac_iter < max_mac_rings; lmac_iter++) {
526*5113495bSYour Name 			if (lmac_iter == lmac_id)
527*5113495bSYour Name 				work_done = dp_monitor_process(
528*5113495bSYour Name 						    soc, NULL,
529*5113495bSYour Name 						    lmac_iter, remaining_quota);
530*5113495bSYour Name 			else
531*5113495bSYour Name 				work_done =
532*5113495bSYour Name 					dp_monitor_drop_packets_for_mac(pdev,
533*5113495bSYour Name 								     lmac_iter,
534*5113495bSYour Name 								     remaining_quota);
535*5113495bSYour Name 			if (work_done) {
536*5113495bSYour Name 				budget -=  work_done;
537*5113495bSYour Name 				if (budget <= 0) {
538*5113495bSYour Name 					yield = DP_TIMER_WORK_EXHAUST;
539*5113495bSYour Name 					goto budget_done;
540*5113495bSYour Name 				}
541*5113495bSYour Name 				remaining_quota = budget;
542*5113495bSYour Name 				total_work_done += work_done;
543*5113495bSYour Name 			}
544*5113495bSYour Name 		}
545*5113495bSYour Name 
546*5113495bSYour Name 		yield = dp_should_timer_irq_yield(soc, total_work_done,
547*5113495bSYour Name 						  start_time);
548*5113495bSYour Name 		total_work_done = 0;
549*5113495bSYour Name 	}
550*5113495bSYour Name 
551*5113495bSYour Name budget_done:
552*5113495bSYour Name 	if (yield == DP_TIMER_WORK_EXHAUST ||
553*5113495bSYour Name 	    yield == DP_TIMER_TIME_EXHAUST)
554*5113495bSYour Name 		qdf_timer_mod(&mon_soc->mon_vdev_timer, 1);
555*5113495bSYour Name 	else
556*5113495bSYour Name 		qdf_timer_mod(&mon_soc->mon_vdev_timer, DP_INTR_POLL_TIMER_MS);
557*5113495bSYour Name }
558*5113495bSYour Name 
559*5113495bSYour Name /* MCL specific functions */
560*5113495bSYour Name #if defined(DP_CON_MON)
561*5113495bSYour Name /**
562*5113495bSYour Name  * dp_mon_reap_timer_handler()- timer to reap monitor rings
563*5113495bSYour Name  * reqd as we are not getting ppdu end interrupts
564*5113495bSYour Name  * @arg: SoC Handle
565*5113495bSYour Name  *
566*5113495bSYour Name  * Return:
567*5113495bSYour Name  *
568*5113495bSYour Name  */
dp_mon_reap_timer_handler(void * arg)569*5113495bSYour Name static void dp_mon_reap_timer_handler(void *arg)
570*5113495bSYour Name {
571*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)arg;
572*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
573*5113495bSYour Name 
574*5113495bSYour Name 	dp_service_mon_rings(soc, QCA_NAPI_BUDGET);
575*5113495bSYour Name 
576*5113495bSYour Name 	qdf_timer_mod(&mon_soc->mon_reap_timer, DP_INTR_POLL_TIMER_MS);
577*5113495bSYour Name }
578*5113495bSYour Name 
dp_mon_reap_timer_init(struct dp_soc * soc)579*5113495bSYour Name static void dp_mon_reap_timer_init(struct dp_soc *soc)
580*5113495bSYour Name {
581*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
582*5113495bSYour Name 
583*5113495bSYour Name 	qdf_spinlock_create(&mon_soc->reap_timer_lock);
584*5113495bSYour Name 	qdf_timer_init(soc->osdev, &mon_soc->mon_reap_timer,
585*5113495bSYour Name 		       dp_mon_reap_timer_handler, (void *)soc,
586*5113495bSYour Name 		       QDF_TIMER_TYPE_WAKE_APPS);
587*5113495bSYour Name 	qdf_mem_zero(mon_soc->mon_reap_src_bitmap,
588*5113495bSYour Name 		     sizeof(mon_soc->mon_reap_src_bitmap));
589*5113495bSYour Name 	mon_soc->reap_timer_init = 1;
590*5113495bSYour Name }
591*5113495bSYour Name #else
dp_mon_reap_timer_init(struct dp_soc * soc)592*5113495bSYour Name static void dp_mon_reap_timer_init(struct dp_soc *soc)
593*5113495bSYour Name {
594*5113495bSYour Name }
595*5113495bSYour Name #endif
596*5113495bSYour Name 
dp_mon_reap_timer_deinit(struct dp_soc * soc)597*5113495bSYour Name static void dp_mon_reap_timer_deinit(struct dp_soc *soc)
598*5113495bSYour Name {
599*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
600*5113495bSYour Name         if (mon_soc->reap_timer_init) {
601*5113495bSYour Name 		mon_soc->reap_timer_init = 0;
602*5113495bSYour Name 		qdf_timer_free(&mon_soc->mon_reap_timer);
603*5113495bSYour Name 		qdf_spinlock_destroy(&mon_soc->reap_timer_lock);
604*5113495bSYour Name         }
605*5113495bSYour Name }
606*5113495bSYour Name 
607*5113495bSYour Name /**
608*5113495bSYour Name  * dp_mon_is_irq_enabled() - check if DP monitor status srng irq enabled
609*5113495bSYour Name  * @soc: point to soc
610*5113495bSYour Name  *
611*5113495bSYour Name  * Return: true if irq enabled, false if not.
612*5113495bSYour Name  */
613*5113495bSYour Name static bool
dp_mon_is_irq_enabled(struct dp_soc * soc)614*5113495bSYour Name dp_mon_is_irq_enabled(struct dp_soc *soc)
615*5113495bSYour Name {
616*5113495bSYour Name 	void *mon_status_srng;
617*5113495bSYour Name 
618*5113495bSYour Name 	mon_status_srng = soc->rxdma_mon_status_ring[0].hal_srng;
619*5113495bSYour Name 
620*5113495bSYour Name 	if (!mon_status_srng)
621*5113495bSYour Name 		return false;
622*5113495bSYour Name 
623*5113495bSYour Name 	return hal_srng_batch_threshold_irq_enabled(mon_status_srng);
624*5113495bSYour Name }
625*5113495bSYour Name 
626*5113495bSYour Name /**
627*5113495bSYour Name  * dp_mon_reap_timer_start() - start reap timer of monitor status ring
628*5113495bSYour Name  * @soc: point to soc
629*5113495bSYour Name  * @source: trigger source
630*5113495bSYour Name  *
631*5113495bSYour Name  * If the source is CDP_MON_REAP_SOURCE_ANY, skip bit set, and start timer
632*5113495bSYour Name  * if any bit has been set in the bitmap; while for the other sources, set
633*5113495bSYour Name  * the bit and start timer if the bitmap is empty before that.
634*5113495bSYour Name  *
635*5113495bSYour Name  * Return: true if timer-start is performed, false otherwise.
636*5113495bSYour Name  */
637*5113495bSYour Name static bool
dp_mon_reap_timer_start(struct dp_soc * soc,enum cdp_mon_reap_source source)638*5113495bSYour Name dp_mon_reap_timer_start(struct dp_soc *soc, enum cdp_mon_reap_source source)
639*5113495bSYour Name {
640*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
641*5113495bSYour Name 	bool do_start;
642*5113495bSYour Name 
643*5113495bSYour Name 	/* if monitor status ring irq enabled, no need to start timer */
644*5113495bSYour Name 	if (!mon_soc->reap_timer_init || dp_mon_is_irq_enabled(soc))
645*5113495bSYour Name 		return false;
646*5113495bSYour Name 
647*5113495bSYour Name 	qdf_spin_lock_bh(&mon_soc->reap_timer_lock);
648*5113495bSYour Name 	do_start = qdf_bitmap_empty(mon_soc->mon_reap_src_bitmap,
649*5113495bSYour Name 				    CDP_MON_REAP_SOURCE_NUM);
650*5113495bSYour Name 	if (source == CDP_MON_REAP_SOURCE_ANY)
651*5113495bSYour Name 		do_start = !do_start;
652*5113495bSYour Name 	else
653*5113495bSYour Name 		qdf_set_bit(source, mon_soc->mon_reap_src_bitmap);
654*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_soc->reap_timer_lock);
655*5113495bSYour Name 
656*5113495bSYour Name 	if (do_start)
657*5113495bSYour Name 		qdf_timer_mod(&mon_soc->mon_reap_timer, DP_INTR_POLL_TIMER_MS);
658*5113495bSYour Name 
659*5113495bSYour Name 	return do_start;
660*5113495bSYour Name }
661*5113495bSYour Name 
662*5113495bSYour Name /**
663*5113495bSYour Name  * dp_mon_reap_timer_stop() - stop reap timer of monitor status ring
664*5113495bSYour Name  * @soc: point to soc
665*5113495bSYour Name  * @source: trigger source
666*5113495bSYour Name  *
667*5113495bSYour Name  * If the source is CDP_MON_REAP_SOURCE_ANY, skip bit clear, and stop timer
668*5113495bSYour Name  * if any bit has been set in the bitmap; while for the other sources, clear
669*5113495bSYour Name  * the bit and stop the timer if the bitmap is empty after that.
670*5113495bSYour Name  *
671*5113495bSYour Name  * Return: true if timer-stop is performed, false otherwise.
672*5113495bSYour Name  */
673*5113495bSYour Name static bool
dp_mon_reap_timer_stop(struct dp_soc * soc,enum cdp_mon_reap_source source)674*5113495bSYour Name dp_mon_reap_timer_stop(struct dp_soc *soc, enum cdp_mon_reap_source source)
675*5113495bSYour Name {
676*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
677*5113495bSYour Name 	bool do_stop;
678*5113495bSYour Name 
679*5113495bSYour Name 	if (!mon_soc->reap_timer_init || dp_mon_is_irq_enabled(soc))
680*5113495bSYour Name 		return false;
681*5113495bSYour Name 
682*5113495bSYour Name 	qdf_spin_lock_bh(&mon_soc->reap_timer_lock);
683*5113495bSYour Name 	if (source != CDP_MON_REAP_SOURCE_ANY)
684*5113495bSYour Name 		qdf_clear_bit(source, mon_soc->mon_reap_src_bitmap);
685*5113495bSYour Name 
686*5113495bSYour Name 	do_stop = qdf_bitmap_empty(mon_soc->mon_reap_src_bitmap,
687*5113495bSYour Name 				   CDP_MON_REAP_SOURCE_NUM);
688*5113495bSYour Name 	if (source == CDP_MON_REAP_SOURCE_ANY)
689*5113495bSYour Name 		do_stop = !do_stop;
690*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_soc->reap_timer_lock);
691*5113495bSYour Name 
692*5113495bSYour Name 	if (do_stop)
693*5113495bSYour Name 		qdf_timer_sync_cancel(&mon_soc->mon_reap_timer);
694*5113495bSYour Name 
695*5113495bSYour Name 	return do_stop;
696*5113495bSYour Name }
697*5113495bSYour Name 
dp_mon_vdev_timer_init(struct dp_soc * soc)698*5113495bSYour Name static void dp_mon_vdev_timer_init(struct dp_soc *soc)
699*5113495bSYour Name {
700*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
701*5113495bSYour Name 
702*5113495bSYour Name         qdf_timer_init(soc->osdev, &mon_soc->mon_vdev_timer,
703*5113495bSYour Name                        dp_mon_vdev_timer, (void *)soc,
704*5113495bSYour Name                        QDF_TIMER_TYPE_WAKE_APPS);
705*5113495bSYour Name         mon_soc->mon_vdev_timer_state |= MON_VDEV_TIMER_INIT;
706*5113495bSYour Name }
707*5113495bSYour Name 
dp_mon_vdev_timer_deinit(struct dp_soc * soc)708*5113495bSYour Name static void dp_mon_vdev_timer_deinit(struct dp_soc *soc)
709*5113495bSYour Name {
710*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
711*5113495bSYour Name         if (mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_INIT) {
712*5113495bSYour Name                 qdf_timer_free(&mon_soc->mon_vdev_timer);
713*5113495bSYour Name                 mon_soc->mon_vdev_timer_state = 0;
714*5113495bSYour Name         }
715*5113495bSYour Name }
716*5113495bSYour Name 
dp_mon_vdev_timer_start(struct dp_soc * soc)717*5113495bSYour Name static void dp_mon_vdev_timer_start(struct dp_soc *soc)
718*5113495bSYour Name {
719*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
720*5113495bSYour Name         if (mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_INIT) {
721*5113495bSYour Name                 qdf_timer_mod(&mon_soc->mon_vdev_timer, DP_INTR_POLL_TIMER_MS);
722*5113495bSYour Name                 mon_soc->mon_vdev_timer_state |= MON_VDEV_TIMER_RUNNING;
723*5113495bSYour Name         }
724*5113495bSYour Name }
725*5113495bSYour Name 
dp_mon_vdev_timer_stop(struct dp_soc * soc)726*5113495bSYour Name static bool dp_mon_vdev_timer_stop(struct dp_soc *soc)
727*5113495bSYour Name {
728*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
729*5113495bSYour Name         if (mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_RUNNING) {
730*5113495bSYour Name                 qdf_timer_sync_cancel(&mon_soc->mon_vdev_timer);
731*5113495bSYour Name                 mon_soc->mon_vdev_timer_state &= ~MON_VDEV_TIMER_RUNNING;
732*5113495bSYour Name 		return true;
733*5113495bSYour Name         }
734*5113495bSYour Name 
735*5113495bSYour Name 	return false;
736*5113495bSYour Name }
737*5113495bSYour Name 
dp_mon_neighbour_peer_add_ast(struct dp_pdev * pdev,struct dp_peer * ta_peer,uint8_t * mac_addr,qdf_nbuf_t nbuf,uint32_t flags)738*5113495bSYour Name static void dp_mon_neighbour_peer_add_ast(struct dp_pdev *pdev,
739*5113495bSYour Name 					  struct dp_peer *ta_peer,
740*5113495bSYour Name 					  uint8_t *mac_addr,
741*5113495bSYour Name 					  qdf_nbuf_t nbuf,
742*5113495bSYour Name 					  uint32_t flags)
743*5113495bSYour Name {
744*5113495bSYour Name 	struct dp_neighbour_peer *neighbour_peer = NULL;
745*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
746*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
747*5113495bSYour Name 
748*5113495bSYour Name 	if (mon_pdev->neighbour_peers_added) {
749*5113495bSYour Name 		qdf_mem_copy(mac_addr,
750*5113495bSYour Name 			     (qdf_nbuf_data(nbuf) +
751*5113495bSYour Name 			      QDF_MAC_ADDR_SIZE),
752*5113495bSYour Name 			      QDF_MAC_ADDR_SIZE);
753*5113495bSYour Name 
754*5113495bSYour Name 		qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
755*5113495bSYour Name 		TAILQ_FOREACH(neighbour_peer,
756*5113495bSYour Name 			      &mon_pdev->neighbour_peers_list,
757*5113495bSYour Name 			      neighbour_peer_list_elem) {
758*5113495bSYour Name 			if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr,
759*5113495bSYour Name 					 mac_addr,
760*5113495bSYour Name 					 QDF_MAC_ADDR_SIZE)) {
761*5113495bSYour Name 				dp_peer_add_ast(soc,
762*5113495bSYour Name 						ta_peer,
763*5113495bSYour Name 						mac_addr,
764*5113495bSYour Name 						CDP_TXRX_AST_TYPE_WDS,
765*5113495bSYour Name 						flags);
766*5113495bSYour Name 				QDF_TRACE(QDF_MODULE_ID_DP,
767*5113495bSYour Name 					  QDF_TRACE_LEVEL_INFO,
768*5113495bSYour Name 					  "sa valid and nac roamed to wds");
769*5113495bSYour Name 				break;
770*5113495bSYour Name 			}
771*5113495bSYour Name 		}
772*5113495bSYour Name 		qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
773*5113495bSYour Name 	}
774*5113495bSYour Name }
775*5113495bSYour Name 
776*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG)
777*5113495bSYour Name #if defined(DP_CON_MON)
dp_mon_htt_srng_setup_1_0(struct dp_soc * soc,struct dp_pdev * pdev,int mac_id,int mac_for_pdev)778*5113495bSYour Name QDF_STATUS dp_mon_htt_srng_setup_1_0(struct dp_soc *soc,
779*5113495bSYour Name 				     struct dp_pdev *pdev,
780*5113495bSYour Name 				     int mac_id,
781*5113495bSYour Name 				     int mac_for_pdev)
782*5113495bSYour Name {
783*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
784*5113495bSYour Name 
785*5113495bSYour Name 	status = dp_mon_htt_dest_srng_setup(soc, pdev, mac_id, mac_for_pdev);
786*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
787*5113495bSYour Name 		return status;
788*5113495bSYour Name 
789*5113495bSYour Name 	if (!soc->rxdma_mon_status_ring[mac_id].hal_srng)
790*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
791*5113495bSYour Name 
792*5113495bSYour Name 	status = htt_srng_setup(soc->htt_handle, mac_for_pdev,
793*5113495bSYour Name 				soc->rxdma_mon_status_ring[mac_id]
794*5113495bSYour Name 				.hal_srng,
795*5113495bSYour Name 				RXDMA_MONITOR_STATUS);
796*5113495bSYour Name 
797*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
798*5113495bSYour Name 		dp_mon_err("Failed to send htt srng setup message for Rxdma mon status ring");
799*5113495bSYour Name 		return status;
800*5113495bSYour Name 	}
801*5113495bSYour Name 
802*5113495bSYour Name 	if (!soc->sw2rxdma_link_ring[mac_id].hal_srng)
803*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
804*5113495bSYour Name 
805*5113495bSYour Name 	status = htt_srng_setup(soc->htt_handle, mac_for_pdev,
806*5113495bSYour Name 				soc->sw2rxdma_link_ring[mac_id].hal_srng,
807*5113495bSYour Name 				SW2RXDMA_LINK_RELEASE);
808*5113495bSYour Name 
809*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
810*5113495bSYour Name 		dp_mon_err("Failed to send htt srng setup message for sw2rxdma link ring");
811*5113495bSYour Name 		return status;
812*5113495bSYour Name 	}
813*5113495bSYour Name 
814*5113495bSYour Name 	return status;
815*5113495bSYour Name }
816*5113495bSYour Name #else
817*5113495bSYour Name /* This is only for WIN */
dp_mon_htt_srng_setup_1_0(struct dp_soc * soc,struct dp_pdev * pdev,int mac_id,int mac_for_pdev)818*5113495bSYour Name QDF_STATUS dp_mon_htt_srng_setup_1_0(struct dp_soc *soc,
819*5113495bSYour Name 				     struct dp_pdev *pdev,
820*5113495bSYour Name 				     int mac_id,
821*5113495bSYour Name 				     int mac_for_pdev)
822*5113495bSYour Name {
823*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
824*5113495bSYour Name 	struct dp_mon_soc *mon_soc;
825*5113495bSYour Name 
826*5113495bSYour Name 	mon_soc = soc->monitor_soc;
827*5113495bSYour Name 	if(!mon_soc) {
828*5113495bSYour Name 		dp_mon_err("%pK: monitor SOC not initialized", soc);
829*5113495bSYour Name 		return status;
830*5113495bSYour Name 	}
831*5113495bSYour Name 
832*5113495bSYour Name 	if (mon_soc->monitor_mode_v2)
833*5113495bSYour Name 		return status;
834*5113495bSYour Name 
835*5113495bSYour Name 	if (wlan_cfg_is_delay_mon_replenish(soc->wlan_cfg_ctx)) {
836*5113495bSYour Name 		status = dp_mon_htt_dest_srng_setup(soc, pdev,
837*5113495bSYour Name 						    mac_id, mac_for_pdev);
838*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS)
839*5113495bSYour Name 			return status;
840*5113495bSYour Name 	}
841*5113495bSYour Name 
842*5113495bSYour Name 	if (!soc->rxdma_mon_status_ring[mac_id].hal_srng)
843*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
844*5113495bSYour Name 
845*5113495bSYour Name 	status = htt_srng_setup(soc->htt_handle, mac_for_pdev,
846*5113495bSYour Name 				soc->rxdma_mon_status_ring[mac_id]
847*5113495bSYour Name 				.hal_srng,
848*5113495bSYour Name 				RXDMA_MONITOR_STATUS);
849*5113495bSYour Name 
850*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
851*5113495bSYour Name 		dp_mon_err("Failed to send htt srng setup msg for Rxdma mon status ring");
852*5113495bSYour Name 		return status;
853*5113495bSYour Name 	}
854*5113495bSYour Name 
855*5113495bSYour Name 	return status;
856*5113495bSYour Name }
857*5113495bSYour Name #endif
858*5113495bSYour Name #endif
859*5113495bSYour Name 
860*5113495bSYour Name /* MCL specific functions */
861*5113495bSYour Name #if defined(DP_CON_MON)
862*5113495bSYour Name 
863*5113495bSYour Name /**
864*5113495bSYour Name  * dp_service_mon_rings() - service monitor rings
865*5113495bSYour Name  * @soc: soc dp handle
866*5113495bSYour Name  * @quota: number of ring entry that can be serviced
867*5113495bSYour Name  *
868*5113495bSYour Name  * Return: None
869*5113495bSYour Name  *
870*5113495bSYour Name  */
dp_service_mon_rings(struct dp_soc * soc,uint32_t quota)871*5113495bSYour Name void dp_service_mon_rings(struct  dp_soc *soc, uint32_t quota)
872*5113495bSYour Name {
873*5113495bSYour Name 	int ring = 0, work_done;
874*5113495bSYour Name 	struct dp_pdev *pdev = NULL;
875*5113495bSYour Name 
876*5113495bSYour Name 	for (ring = 0 ; ring < MAX_NUM_LMAC_HW; ring++) {
877*5113495bSYour Name 		pdev = dp_get_pdev_for_lmac_id(soc, ring);
878*5113495bSYour Name 		if (!pdev)
879*5113495bSYour Name 			continue;
880*5113495bSYour Name 		work_done = dp_mon_process(soc, NULL, ring, quota);
881*5113495bSYour Name 
882*5113495bSYour Name 		dp_rx_mon_dest_debug("Reaped %d descs from Monitor rings",
883*5113495bSYour Name 				     work_done);
884*5113495bSYour Name 	}
885*5113495bSYour Name }
886*5113495bSYour Name #endif
887*5113495bSYour Name 
888*5113495bSYour Name /**
889*5113495bSYour Name  * dp_mon_peer_tx_init() - Initialize receive TID state in monitor peer
890*5113495bSYour Name  * @pdev: Datapath pdev
891*5113495bSYour Name  * @peer: Datapath peer
892*5113495bSYour Name  *
893*5113495bSYour Name  */
894*5113495bSYour Name static void
dp_mon_peer_tx_init(struct dp_pdev * pdev,struct dp_peer * peer)895*5113495bSYour Name dp_mon_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer)
896*5113495bSYour Name {
897*5113495bSYour Name 	if (!peer->monitor_peer)
898*5113495bSYour Name 		return;
899*5113495bSYour Name 
900*5113495bSYour Name 	dp_peer_tid_queue_init(peer);
901*5113495bSYour Name 	dp_peer_update_80211_hdr(peer->vdev, peer);
902*5113495bSYour Name }
903*5113495bSYour Name 
904*5113495bSYour Name /**
905*5113495bSYour Name  * dp_mon_peer_tx_cleanup() - Deinitialize receive TID state in monitor peer
906*5113495bSYour Name  * @vdev: Datapath vdev
907*5113495bSYour Name  * @peer: Datapath peer
908*5113495bSYour Name  *
909*5113495bSYour Name  */
910*5113495bSYour Name static void
dp_mon_peer_tx_cleanup(struct dp_vdev * vdev,struct dp_peer * peer)911*5113495bSYour Name dp_mon_peer_tx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer)
912*5113495bSYour Name {
913*5113495bSYour Name 	if (!peer->monitor_peer)
914*5113495bSYour Name 		return;
915*5113495bSYour Name 
916*5113495bSYour Name 	dp_peer_tid_queue_cleanup(peer);
917*5113495bSYour Name }
918*5113495bSYour Name 
919*5113495bSYour Name #ifdef QCA_SUPPORT_BPR
920*5113495bSYour Name static QDF_STATUS
dp_set_bpr_enable_1_0(struct dp_pdev * pdev,int val)921*5113495bSYour Name dp_set_bpr_enable_1_0(struct dp_pdev *pdev, int val)
922*5113495bSYour Name {
923*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
924*5113495bSYour Name 
925*5113495bSYour Name 	switch (val) {
926*5113495bSYour Name 	case CDP_BPR_DISABLE:
927*5113495bSYour Name 		mon_pdev->bpr_enable = CDP_BPR_DISABLE;
928*5113495bSYour Name 		if (!mon_pdev->pktlog_ppdu_stats &&
929*5113495bSYour Name 		    !mon_pdev->enhanced_stats_en &&
930*5113495bSYour Name 		    !mon_pdev->tx_sniffer_enable && !mon_pdev->mcopy_mode) {
931*5113495bSYour Name 			dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
932*5113495bSYour Name 		} else if (mon_pdev->enhanced_stats_en &&
933*5113495bSYour Name 			   !mon_pdev->tx_sniffer_enable &&
934*5113495bSYour Name 			   !mon_pdev->mcopy_mode &&
935*5113495bSYour Name 			   !mon_pdev->pktlog_ppdu_stats) {
936*5113495bSYour Name 			dp_h2t_cfg_stats_msg_send(pdev,
937*5113495bSYour Name 						  DP_PPDU_STATS_CFG_ENH_STATS,
938*5113495bSYour Name 						  pdev->pdev_id);
939*5113495bSYour Name 		}
940*5113495bSYour Name 		break;
941*5113495bSYour Name 	case CDP_BPR_ENABLE:
942*5113495bSYour Name 		mon_pdev->bpr_enable = CDP_BPR_ENABLE;
943*5113495bSYour Name 		if (!mon_pdev->enhanced_stats_en &&
944*5113495bSYour Name 		    !mon_pdev->tx_sniffer_enable &&
945*5113495bSYour Name 		    !mon_pdev->mcopy_mode && !mon_pdev->pktlog_ppdu_stats) {
946*5113495bSYour Name 			dp_h2t_cfg_stats_msg_send(pdev,
947*5113495bSYour Name 						  DP_PPDU_STATS_CFG_BPR,
948*5113495bSYour Name 						  pdev->pdev_id);
949*5113495bSYour Name 		} else if (mon_pdev->enhanced_stats_en &&
950*5113495bSYour Name 			   !mon_pdev->tx_sniffer_enable &&
951*5113495bSYour Name 			   !mon_pdev->mcopy_mode &&
952*5113495bSYour Name 			   !mon_pdev->pktlog_ppdu_stats) {
953*5113495bSYour Name 			dp_h2t_cfg_stats_msg_send(pdev,
954*5113495bSYour Name 						  DP_PPDU_STATS_CFG_BPR_ENH,
955*5113495bSYour Name 						  pdev->pdev_id);
956*5113495bSYour Name 		} else if (mon_pdev->pktlog_ppdu_stats) {
957*5113495bSYour Name 			dp_h2t_cfg_stats_msg_send(pdev,
958*5113495bSYour Name 						  DP_PPDU_STATS_CFG_BPR_PKTLOG,
959*5113495bSYour Name 						  pdev->pdev_id);
960*5113495bSYour Name 		}
961*5113495bSYour Name 		break;
962*5113495bSYour Name 	default:
963*5113495bSYour Name 		break;
964*5113495bSYour Name 	}
965*5113495bSYour Name 
966*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
967*5113495bSYour Name }
968*5113495bSYour Name #endif
969*5113495bSYour Name 
970*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
971*5113495bSYour Name #if defined(WDI_EVENT_ENABLE) && !defined(WLAN_TX_PKT_CAPTURE_ENH)
972*5113495bSYour Name /**
973*5113495bSYour Name  * dp_ppdu_desc_notify_1_0 - Notify upper layer for PPDU indication via WDI
974*5113495bSYour Name  *
975*5113495bSYour Name  * @pdev: Datapath pdev handle
976*5113495bSYour Name  * @nbuf: Buffer to be shipped
977*5113495bSYour Name  *
978*5113495bSYour Name  * Return: void
979*5113495bSYour Name  */
dp_ppdu_desc_notify_1_0(struct dp_pdev * pdev,qdf_nbuf_t nbuf)980*5113495bSYour Name static void dp_ppdu_desc_notify_1_0(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
981*5113495bSYour Name {
982*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
983*5113495bSYour Name 	struct cdp_tx_completion_ppdu *ppdu_desc = NULL;
984*5113495bSYour Name 
985*5113495bSYour Name 	ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(nbuf);
986*5113495bSYour Name 
987*5113495bSYour Name 	/*
988*5113495bSYour Name 	 * Deliver PPDU stats only for valid (acked) data
989*5113495bSYour Name 	 * frames if sniffer mode is not enabled.
990*5113495bSYour Name 	 * If sniffer mode is enabled, PPDU stats
991*5113495bSYour Name 	 * for all frames including mgmt/control
992*5113495bSYour Name 	 * frames should be delivered to upper layer
993*5113495bSYour Name 	 */
994*5113495bSYour Name 	if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode) {
995*5113495bSYour Name 		dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
996*5113495bSYour Name 				     pdev->soc,
997*5113495bSYour Name 				     nbuf, HTT_INVALID_PEER,
998*5113495bSYour Name 				     WDI_NO_VAL,
999*5113495bSYour Name 				     pdev->pdev_id);
1000*5113495bSYour Name 	} else {
1001*5113495bSYour Name 		if (ppdu_desc->num_mpdu != 0 &&
1002*5113495bSYour Name 		    ppdu_desc->num_users != 0 &&
1003*5113495bSYour Name 		    ppdu_desc->frame_ctrl &
1004*5113495bSYour Name 		    HTT_FRAMECTRL_DATATYPE) {
1005*5113495bSYour Name 			dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
1006*5113495bSYour Name 					     pdev->soc,
1007*5113495bSYour Name 					     nbuf, HTT_INVALID_PEER,
1008*5113495bSYour Name 					     WDI_NO_VAL,
1009*5113495bSYour Name 					     pdev->pdev_id);
1010*5113495bSYour Name 		} else {
1011*5113495bSYour Name 			qdf_nbuf_free(nbuf);
1012*5113495bSYour Name 		}
1013*5113495bSYour Name 	}
1014*5113495bSYour Name }
1015*5113495bSYour Name #endif
1016*5113495bSYour Name 
1017*5113495bSYour Name /**
1018*5113495bSYour Name  * dp_ppdu_stats_feat_enable_check_1_0() - Check if feature(s) is enabled to
1019*5113495bSYour Name  *				consume ppdu stats from FW
1020*5113495bSYour Name  *
1021*5113495bSYour Name  * @pdev: Datapath pdev handle
1022*5113495bSYour Name  *
1023*5113495bSYour Name  * Return: true if enabled, else return false
1024*5113495bSYour Name  */
dp_ppdu_stats_feat_enable_check_1_0(struct dp_pdev * pdev)1025*5113495bSYour Name static bool dp_ppdu_stats_feat_enable_check_1_0(struct dp_pdev *pdev)
1026*5113495bSYour Name {
1027*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
1028*5113495bSYour Name 
1029*5113495bSYour Name 	if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable &&
1030*5113495bSYour Name 	    !mon_pdev->mcopy_mode && !mon_pdev->bpr_enable)
1031*5113495bSYour Name 		return false;
1032*5113495bSYour Name 	else
1033*5113495bSYour Name 		return true;
1034*5113495bSYour Name }
1035*5113495bSYour Name 
1036*5113495bSYour Name /**
1037*5113495bSYour Name  * dp_mon_tx_stats_update_1_0() - Update Tx stats from HTT PPDU completion path
1038*5113495bSYour Name  *
1039*5113495bSYour Name  * @mon_peer: Monitor peer
1040*5113495bSYour Name  * @ppdu: Tx PPDU user completion info
1041*5113495bSYour Name  */
1042*5113495bSYour Name static void
dp_mon_tx_stats_update_1_0(struct dp_mon_peer * mon_peer,struct cdp_tx_completion_ppdu_user * ppdu)1043*5113495bSYour Name dp_mon_tx_stats_update_1_0(struct dp_mon_peer *mon_peer,
1044*5113495bSYour Name 			   struct cdp_tx_completion_ppdu_user *ppdu)
1045*5113495bSYour Name {
1046*5113495bSYour Name 	ppdu->punc_mode = NO_PUNCTURE;
1047*5113495bSYour Name }
1048*5113495bSYour Name #endif
1049*5113495bSYour Name 
1050*5113495bSYour Name #ifndef QCA_SUPPORT_FULL_MON
1051*5113495bSYour Name /**
1052*5113495bSYour Name  * dp_rx_mon_process() - Core brain processing for monitor mode
1053*5113495bSYour Name  *
1054*5113495bSYour Name  * This API processes monitor destination ring followed by monitor status ring
1055*5113495bSYour Name  * Called from bottom half (tasklet/NET_RX_SOFTIRQ)
1056*5113495bSYour Name  *
1057*5113495bSYour Name  * @soc: datapath soc context
1058*5113495bSYour Name  * @int_ctx: interrupt context
1059*5113495bSYour Name  * @mac_id: mac_id on which interrupt is received
1060*5113495bSYour Name  * @quota: Number of status ring entry that can be serviced in one shot.
1061*5113495bSYour Name  *
1062*5113495bSYour Name  * Return: Number of reaped status ring entries
1063*5113495bSYour Name  */
1064*5113495bSYour Name static inline uint32_t
dp_rx_mon_process(struct dp_soc * soc,struct dp_intr * int_ctx,uint32_t mac_id,uint32_t quota)1065*5113495bSYour Name dp_rx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
1066*5113495bSYour Name 		  uint32_t mac_id, uint32_t quota)
1067*5113495bSYour Name {
1068*5113495bSYour Name 	return quota;
1069*5113495bSYour Name }
1070*5113495bSYour Name #endif
1071*5113495bSYour Name 
1072*5113495bSYour Name #ifndef DISABLE_MON_CONFIG
1073*5113495bSYour Name static uint32_t
dp_rx_mon_process_1_0(struct dp_soc * soc,struct dp_intr * int_ctx,uint32_t mac_id,uint32_t quota)1074*5113495bSYour Name dp_rx_mon_process_1_0(struct dp_soc *soc, struct dp_intr *int_ctx,
1075*5113495bSYour Name 	              uint32_t mac_id, uint32_t quota)
1076*5113495bSYour Name {
1077*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1078*5113495bSYour Name 
1079*5113495bSYour Name 	if (qdf_unlikely(mon_soc->full_mon_mode))
1080*5113495bSYour Name 		return dp_rx_mon_process(soc, int_ctx, mac_id, quota);
1081*5113495bSYour Name 
1082*5113495bSYour Name 	return dp_rx_mon_status_process(soc, int_ctx, mac_id, quota);
1083*5113495bSYour Name }
1084*5113495bSYour Name 
1085*5113495bSYour Name #if defined(WDI_EVENT_ENABLE) &&\
1086*5113495bSYour Name 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG) ||\
1087*5113495bSYour Name 	 defined(WLAN_FEATURE_PKT_CAPTURE_V2))
1088*5113495bSYour Name static inline
dp_mon_ppdu_stats_handler_register(struct dp_mon_soc * mon_soc)1089*5113495bSYour Name void dp_mon_ppdu_stats_handler_register(struct dp_mon_soc *mon_soc)
1090*5113495bSYour Name {
1091*5113495bSYour Name 	mon_soc->mon_ops->mon_ppdu_stats_ind_handler =
1092*5113495bSYour Name 					dp_ppdu_stats_ind_handler;
1093*5113495bSYour Name }
1094*5113495bSYour Name #else
1095*5113495bSYour Name static inline
dp_mon_ppdu_stats_handler_register(struct dp_mon_soc * mon_soc)1096*5113495bSYour Name void dp_mon_ppdu_stats_handler_register(struct dp_mon_soc *mon_soc)
1097*5113495bSYour Name {
1098*5113495bSYour Name }
1099*5113495bSYour Name #endif
1100*5113495bSYour Name 
dp_mon_register_intr_ops_1_0(struct dp_soc * soc)1101*5113495bSYour Name static void dp_mon_register_intr_ops_1_0(struct dp_soc *soc)
1102*5113495bSYour Name {
1103*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1104*5113495bSYour Name 
1105*5113495bSYour Name 	mon_soc->mon_rx_process = dp_rx_mon_process_1_0;
1106*5113495bSYour Name 	dp_mon_ppdu_stats_handler_register(mon_soc);
1107*5113495bSYour Name }
1108*5113495bSYour Name #endif
1109*5113495bSYour Name 
1110*5113495bSYour Name #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
1111*5113495bSYour Name /*
1112*5113495bSYour Name  * dp_update_filter_neighbour_peers() - set neighbour peers(nac clients)
1113*5113495bSYour Name  * address for smart mesh filtering
1114*5113495bSYour Name  * @txrx_soc: cdp soc handle
1115*5113495bSYour Name  * @vdev_id: id of virtual device object
1116*5113495bSYour Name  * @cmd: Add/Del command
1117*5113495bSYour Name  * @macaddr: nac client mac address
1118*5113495bSYour Name  *
1119*5113495bSYour Name  * Return: success/failure
1120*5113495bSYour Name  */
dp_update_filter_neighbour_peers(struct cdp_soc_t * soc_hdl,uint8_t vdev_id,uint32_t cmd,uint8_t * macaddr)1121*5113495bSYour Name static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl,
1122*5113495bSYour Name 					    uint8_t vdev_id,
1123*5113495bSYour Name 					    uint32_t cmd, uint8_t *macaddr)
1124*5113495bSYour Name {
1125*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
1126*5113495bSYour Name 	struct dp_pdev *pdev;
1127*5113495bSYour Name 	struct dp_neighbour_peer *peer = NULL;
1128*5113495bSYour Name 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
1129*5113495bSYour Name 						     DP_MOD_ID_CDP);
1130*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev;
1131*5113495bSYour Name 
1132*5113495bSYour Name 	if (!vdev || !macaddr)
1133*5113495bSYour Name 		goto fail0;
1134*5113495bSYour Name 
1135*5113495bSYour Name 	pdev = vdev->pdev;
1136*5113495bSYour Name 
1137*5113495bSYour Name 	if (!pdev)
1138*5113495bSYour Name 		goto fail0;
1139*5113495bSYour Name 
1140*5113495bSYour Name 	mon_pdev = pdev->monitor_pdev;
1141*5113495bSYour Name 
1142*5113495bSYour Name 	/* Store address of NAC (neighbour peer) which will be checked
1143*5113495bSYour Name 	 * against TA of received packets.
1144*5113495bSYour Name 	 */
1145*5113495bSYour Name 	if (cmd == DP_NAC_PARAM_ADD) {
1146*5113495bSYour Name 		peer = (struct dp_neighbour_peer *)qdf_mem_malloc(
1147*5113495bSYour Name 				sizeof(*peer));
1148*5113495bSYour Name 
1149*5113495bSYour Name 		if (!peer) {
1150*5113495bSYour Name 			dp_cdp_err("%pK: DP neighbour peer node memory allocation failed"
1151*5113495bSYour Name 				   , soc);
1152*5113495bSYour Name 			goto fail0;
1153*5113495bSYour Name 		}
1154*5113495bSYour Name 
1155*5113495bSYour Name 		qdf_mem_copy(&peer->neighbour_peers_macaddr.raw[0],
1156*5113495bSYour Name 			     macaddr, QDF_MAC_ADDR_SIZE);
1157*5113495bSYour Name 		peer->vdev = vdev;
1158*5113495bSYour Name 
1159*5113495bSYour Name 		qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
1160*5113495bSYour Name 
1161*5113495bSYour Name 		/* add this neighbour peer into the list */
1162*5113495bSYour Name 		TAILQ_INSERT_TAIL(&mon_pdev->neighbour_peers_list, peer,
1163*5113495bSYour Name 				  neighbour_peer_list_elem);
1164*5113495bSYour Name 		qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
1165*5113495bSYour Name 
1166*5113495bSYour Name 		/* first neighbour */
1167*5113495bSYour Name 		if (!mon_pdev->neighbour_peers_added) {
1168*5113495bSYour Name 			QDF_STATUS status = QDF_STATUS_SUCCESS;
1169*5113495bSYour Name 
1170*5113495bSYour Name 			mon_pdev->neighbour_peers_added = true;
1171*5113495bSYour Name 			dp_mon_filter_setup_smart_monitor(pdev);
1172*5113495bSYour Name 			status = dp_mon_filter_update(pdev);
1173*5113495bSYour Name 			if (status != QDF_STATUS_SUCCESS) {
1174*5113495bSYour Name 				dp_cdp_err("%pK: smart mon filter setup failed",
1175*5113495bSYour Name 					   soc);
1176*5113495bSYour Name 				dp_mon_filter_reset_smart_monitor(pdev);
1177*5113495bSYour Name 				mon_pdev->neighbour_peers_added = false;
1178*5113495bSYour Name 			}
1179*5113495bSYour Name 		}
1180*5113495bSYour Name 
1181*5113495bSYour Name 	} else if (cmd == DP_NAC_PARAM_DEL) {
1182*5113495bSYour Name 		qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
1183*5113495bSYour Name 		TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
1184*5113495bSYour Name 			      neighbour_peer_list_elem) {
1185*5113495bSYour Name 			if (!qdf_mem_cmp(&peer->neighbour_peers_macaddr.raw[0],
1186*5113495bSYour Name 					 macaddr, QDF_MAC_ADDR_SIZE)) {
1187*5113495bSYour Name 				/* delete this peer from the list */
1188*5113495bSYour Name 				TAILQ_REMOVE(&mon_pdev->neighbour_peers_list,
1189*5113495bSYour Name 					     peer, neighbour_peer_list_elem);
1190*5113495bSYour Name 				qdf_mem_free(peer);
1191*5113495bSYour Name 				break;
1192*5113495bSYour Name 			}
1193*5113495bSYour Name 		}
1194*5113495bSYour Name 		/* last neighbour deleted */
1195*5113495bSYour Name 		if (TAILQ_EMPTY(&mon_pdev->neighbour_peers_list)) {
1196*5113495bSYour Name 			QDF_STATUS status = QDF_STATUS_SUCCESS;
1197*5113495bSYour Name 
1198*5113495bSYour Name 			dp_mon_filter_reset_smart_monitor(pdev);
1199*5113495bSYour Name 			status = dp_mon_filter_update(pdev);
1200*5113495bSYour Name 			if (status != QDF_STATUS_SUCCESS) {
1201*5113495bSYour Name 				dp_cdp_err("%pK: smart mon filter clear failed",
1202*5113495bSYour Name 					   soc);
1203*5113495bSYour Name 			}
1204*5113495bSYour Name 			mon_pdev->neighbour_peers_added = false;
1205*5113495bSYour Name 		}
1206*5113495bSYour Name 		qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
1207*5113495bSYour Name 	}
1208*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
1209*5113495bSYour Name 	return 1;
1210*5113495bSYour Name 
1211*5113495bSYour Name fail0:
1212*5113495bSYour Name 	if (vdev)
1213*5113495bSYour Name 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
1214*5113495bSYour Name 	return 0;
1215*5113495bSYour Name }
1216*5113495bSYour Name #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
1217*5113495bSYour Name 
1218*5113495bSYour Name #ifdef ATH_SUPPORT_NAC_RSSI
1219*5113495bSYour Name /**
1220*5113495bSYour Name  * dp_vdev_get_neighbour_rssi(): Store RSSI for configured NAC
1221*5113495bSYour Name  * @soc_hdl: DP soc handle
1222*5113495bSYour Name  * @vdev_id: id of DP vdev handle
1223*5113495bSYour Name  * @mac_addr: neighbour mac
1224*5113495bSYour Name  * @rssi: rssi value
1225*5113495bSYour Name  *
1226*5113495bSYour Name  * Return: 0 for success. nonzero for failure.
1227*5113495bSYour Name  */
dp_vdev_get_neighbour_rssi(struct cdp_soc_t * soc_hdl,uint8_t vdev_id,char * mac_addr,uint8_t * rssi)1228*5113495bSYour Name static QDF_STATUS  dp_vdev_get_neighbour_rssi(struct cdp_soc_t *soc_hdl,
1229*5113495bSYour Name 					      uint8_t vdev_id,
1230*5113495bSYour Name 					      char *mac_addr,
1231*5113495bSYour Name 					      uint8_t *rssi)
1232*5113495bSYour Name {
1233*5113495bSYour Name 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
1234*5113495bSYour Name 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
1235*5113495bSYour Name 						     DP_MOD_ID_CDP);
1236*5113495bSYour Name 	struct dp_pdev *pdev;
1237*5113495bSYour Name 	struct dp_neighbour_peer *peer = NULL;
1238*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
1239*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev;
1240*5113495bSYour Name 
1241*5113495bSYour Name 	if (!vdev)
1242*5113495bSYour Name 		return status;
1243*5113495bSYour Name 
1244*5113495bSYour Name 	pdev = vdev->pdev;
1245*5113495bSYour Name 	mon_pdev = pdev->monitor_pdev;
1246*5113495bSYour Name 
1247*5113495bSYour Name 	*rssi = 0;
1248*5113495bSYour Name 	qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex);
1249*5113495bSYour Name 	TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list,
1250*5113495bSYour Name 		      neighbour_peer_list_elem) {
1251*5113495bSYour Name 		if (qdf_mem_cmp(&peer->neighbour_peers_macaddr.raw[0],
1252*5113495bSYour Name 				mac_addr, QDF_MAC_ADDR_SIZE) == 0) {
1253*5113495bSYour Name 			*rssi = peer->rssi;
1254*5113495bSYour Name 			status = QDF_STATUS_SUCCESS;
1255*5113495bSYour Name 			break;
1256*5113495bSYour Name 		}
1257*5113495bSYour Name 	}
1258*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex);
1259*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
1260*5113495bSYour Name 	return status;
1261*5113495bSYour Name }
1262*5113495bSYour Name 
1263*5113495bSYour Name static QDF_STATUS
dp_config_for_nac_rssi(struct cdp_soc_t * cdp_soc,uint8_t vdev_id,enum cdp_nac_param_cmd cmd,char * bssid,char * client_macaddr,uint8_t chan_num)1264*5113495bSYour Name dp_config_for_nac_rssi(struct cdp_soc_t *cdp_soc,
1265*5113495bSYour Name 		       uint8_t vdev_id,
1266*5113495bSYour Name 		       enum cdp_nac_param_cmd cmd, char *bssid,
1267*5113495bSYour Name 		       char *client_macaddr,
1268*5113495bSYour Name 		       uint8_t chan_num)
1269*5113495bSYour Name {
1270*5113495bSYour Name 	struct dp_soc *soc = (struct dp_soc *)cdp_soc;
1271*5113495bSYour Name 	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
1272*5113495bSYour Name 						     DP_MOD_ID_CDP);
1273*5113495bSYour Name 	struct dp_pdev *pdev;
1274*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev;
1275*5113495bSYour Name 
1276*5113495bSYour Name 	if (!vdev)
1277*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1278*5113495bSYour Name 
1279*5113495bSYour Name 	pdev = (struct dp_pdev *)vdev->pdev;
1280*5113495bSYour Name 
1281*5113495bSYour Name 	mon_pdev = pdev->monitor_pdev;
1282*5113495bSYour Name 	mon_pdev->nac_rssi_filtering = 1;
1283*5113495bSYour Name 	/* Store address of NAC (neighbour peer) which will be checked
1284*5113495bSYour Name 	 * against TA of received packets.
1285*5113495bSYour Name 	 */
1286*5113495bSYour Name 
1287*5113495bSYour Name 	if (cmd == CDP_NAC_PARAM_ADD) {
1288*5113495bSYour Name 		dp_update_filter_neighbour_peers(cdp_soc, vdev->vdev_id,
1289*5113495bSYour Name 						 DP_NAC_PARAM_ADD,
1290*5113495bSYour Name 						 (uint8_t *)client_macaddr);
1291*5113495bSYour Name 	} else if (cmd == CDP_NAC_PARAM_DEL) {
1292*5113495bSYour Name 		dp_update_filter_neighbour_peers(cdp_soc, vdev->vdev_id,
1293*5113495bSYour Name 						 DP_NAC_PARAM_DEL,
1294*5113495bSYour Name 						 (uint8_t *)client_macaddr);
1295*5113495bSYour Name 	}
1296*5113495bSYour Name 
1297*5113495bSYour Name 	if (soc->cdp_soc.ol_ops->config_bssid_in_fw_for_nac_rssi)
1298*5113495bSYour Name 		soc->cdp_soc.ol_ops->config_bssid_in_fw_for_nac_rssi
1299*5113495bSYour Name 			(soc->ctrl_psoc, pdev->pdev_id,
1300*5113495bSYour Name 			 vdev->vdev_id, cmd, bssid, client_macaddr);
1301*5113495bSYour Name 
1302*5113495bSYour Name 	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
1303*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1304*5113495bSYour Name }
1305*5113495bSYour Name #endif
1306*5113495bSYour Name 
1307*5113495bSYour Name /**
1308*5113495bSYour Name  * dp_mon_register_feature_ops_1_0() - register feature ops
1309*5113495bSYour Name  *
1310*5113495bSYour Name  * @soc: dp soc context
1311*5113495bSYour Name  *
1312*5113495bSYour Name  * @return: void
1313*5113495bSYour Name  */
1314*5113495bSYour Name static void
dp_mon_register_feature_ops_1_0(struct dp_soc * soc)1315*5113495bSYour Name dp_mon_register_feature_ops_1_0(struct dp_soc *soc)
1316*5113495bSYour Name {
1317*5113495bSYour Name 	struct dp_mon_ops *mon_ops = dp_mon_ops_get(soc);
1318*5113495bSYour Name 
1319*5113495bSYour Name 	if (!mon_ops) {
1320*5113495bSYour Name 		dp_err("mon_ops is NULL, feature ops registration failed");
1321*5113495bSYour Name 		return;
1322*5113495bSYour Name 	}
1323*5113495bSYour Name 
1324*5113495bSYour Name 	mon_ops->mon_config_debug_sniffer = dp_config_debug_sniffer;
1325*5113495bSYour Name 	mon_ops->mon_peer_tx_init = dp_mon_peer_tx_init;
1326*5113495bSYour Name 	mon_ops->mon_peer_tx_cleanup = dp_mon_peer_tx_cleanup;
1327*5113495bSYour Name 	mon_ops->mon_htt_ppdu_stats_attach = dp_htt_ppdu_stats_attach;
1328*5113495bSYour Name 	mon_ops->mon_htt_ppdu_stats_detach = dp_htt_ppdu_stats_detach;
1329*5113495bSYour Name 	mon_ops->mon_print_pdev_rx_mon_stats = dp_print_pdev_rx_mon_stats;
1330*5113495bSYour Name 	mon_ops->mon_set_bsscolor = dp_mon_set_bsscolor;
1331*5113495bSYour Name 	mon_ops->mon_pdev_get_filter_ucast_data =
1332*5113495bSYour Name 				dp_pdev_get_filter_ucast_data;
1333*5113495bSYour Name 	mon_ops->mon_pdev_get_filter_mcast_data =
1334*5113495bSYour Name 				dp_pdev_get_filter_mcast_data;
1335*5113495bSYour Name 	mon_ops->mon_pdev_get_filter_non_data = dp_pdev_get_filter_non_data;
1336*5113495bSYour Name 	mon_ops->mon_neighbour_peer_add_ast = dp_mon_neighbour_peer_add_ast;
1337*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH
1338*5113495bSYour Name 	mon_ops->mon_peer_tid_peer_id_update = dp_peer_tid_peer_id_update_1_0;
1339*5113495bSYour Name 	mon_ops->mon_tx_capture_debugfs_init = dp_tx_capture_debugfs_init_1_0;
1340*5113495bSYour Name 	mon_ops->mon_tx_add_to_comp_queue = dp_tx_add_to_comp_queue_1_0;
1341*5113495bSYour Name 	mon_ops->mon_print_pdev_tx_capture_stats =
1342*5113495bSYour Name 				dp_print_pdev_tx_capture_stats_1_0;
1343*5113495bSYour Name 	mon_ops->mon_config_enh_tx_capture = dp_config_enh_tx_capture_1_0;
1344*5113495bSYour Name 	mon_ops->mon_tx_peer_filter = dp_peer_set_tx_capture_enabled_1_0;
1345*5113495bSYour Name 	mon_ops->mon_peer_tx_capture_get_stats = dp_get_peer_tx_capture_stats;
1346*5113495bSYour Name 	mon_ops->mon_pdev_tx_capture_get_stats = dp_get_pdev_tx_capture_stats;
1347*5113495bSYour Name #endif
1348*5113495bSYour Name #if (defined(WIFI_MONITOR_SUPPORT) && !defined(WLAN_TX_PKT_CAPTURE_ENH))
1349*5113495bSYour Name 	mon_ops->mon_peer_tid_peer_id_update = NULL;
1350*5113495bSYour Name 	mon_ops->mon_tx_capture_debugfs_init = NULL;
1351*5113495bSYour Name 	mon_ops->mon_tx_add_to_comp_queue = NULL;
1352*5113495bSYour Name 	mon_ops->mon_print_pdev_tx_capture_stats = NULL;
1353*5113495bSYour Name 	mon_ops->mon_config_enh_tx_capture = NULL;
1354*5113495bSYour Name 	mon_ops->mon_tx_peer_filter = NULL;
1355*5113495bSYour Name #endif
1356*5113495bSYour Name #ifdef WLAN_RX_PKT_CAPTURE_ENH
1357*5113495bSYour Name 	mon_ops->mon_config_enh_rx_capture = dp_config_enh_rx_capture;
1358*5113495bSYour Name #endif
1359*5113495bSYour Name #ifdef QCA_SUPPORT_BPR
1360*5113495bSYour Name 	mon_ops->mon_set_bpr_enable = dp_set_bpr_enable_1_0;
1361*5113495bSYour Name #endif
1362*5113495bSYour Name #ifdef ATH_SUPPORT_NAC
1363*5113495bSYour Name 	mon_ops->mon_set_filter_neigh_peers = dp_set_filter_neigh_peers;
1364*5113495bSYour Name #endif
1365*5113495bSYour Name #ifdef WLAN_ATF_ENABLE
1366*5113495bSYour Name 	mon_ops->mon_set_atf_stats_enable = dp_set_atf_stats_enable;
1367*5113495bSYour Name #endif
1368*5113495bSYour Name #ifdef FEATURE_NAC_RSSI
1369*5113495bSYour Name 	mon_ops->mon_filter_neighbour_peer = dp_filter_neighbour_peer;
1370*5113495bSYour Name #endif
1371*5113495bSYour Name #ifdef QCA_MCOPY_SUPPORT
1372*5113495bSYour Name 	mon_ops->mon_filter_setup_mcopy_mode =
1373*5113495bSYour Name 				dp_mon_filter_setup_mcopy_mode_1_0;
1374*5113495bSYour Name 	mon_ops->mon_filter_reset_mcopy_mode =
1375*5113495bSYour Name 				dp_mon_filter_reset_mcopy_mode_1_0;
1376*5113495bSYour Name 	mon_ops->mon_mcopy_check_deliver = dp_mcopy_check_deliver;
1377*5113495bSYour Name #endif
1378*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
1379*5113495bSYour Name 	mon_ops->mon_filter_setup_enhanced_stats =
1380*5113495bSYour Name 				dp_mon_filter_setup_enhanced_stats_1_0;
1381*5113495bSYour Name 	mon_ops->mon_filter_reset_enhanced_stats =
1382*5113495bSYour Name 				dp_mon_filter_reset_enhanced_stats_1_0;
1383*5113495bSYour Name 	mon_ops->mon_tx_enable_enhanced_stats =
1384*5113495bSYour Name 				dp_mon_tx_enable_enhanced_stats_1_0;
1385*5113495bSYour Name 	mon_ops->mon_tx_disable_enhanced_stats =
1386*5113495bSYour Name 				dp_mon_tx_disable_enhanced_stats_1_0;
1387*5113495bSYour Name 	mon_ops->mon_ppdu_stats_feat_enable_check =
1388*5113495bSYour Name 				dp_ppdu_stats_feat_enable_check_1_0;
1389*5113495bSYour Name #ifndef WLAN_TX_PKT_CAPTURE_ENH
1390*5113495bSYour Name 	mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver;
1391*5113495bSYour Name #ifdef WDI_EVENT_ENABLE
1392*5113495bSYour Name 	mon_ops->mon_ppdu_desc_notify = dp_ppdu_desc_notify_1_0;
1393*5113495bSYour Name #endif
1394*5113495bSYour Name #else
1395*5113495bSYour Name 	mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver_1_0;
1396*5113495bSYour Name #endif
1397*5113495bSYour Name 	mon_ops->mon_tx_stats_update = dp_mon_tx_stats_update_1_0;
1398*5113495bSYour Name #endif
1399*5113495bSYour Name #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
1400*5113495bSYour Name 	mon_ops->mon_filter_setup_smart_monitor =
1401*5113495bSYour Name 				dp_mon_filter_setup_smart_monitor_1_0;
1402*5113495bSYour Name 	mon_ops->mon_filter_reset_smart_monitor =
1403*5113495bSYour Name 				dp_mon_filter_reset_smart_monitor_1_0;
1404*5113495bSYour Name #endif
1405*5113495bSYour Name 	mon_ops->mon_filter_set_reset_mon_mac_filter =
1406*5113495bSYour Name 				dp_mon_set_reset_mon_mac_filter_1_0;
1407*5113495bSYour Name #ifdef WLAN_RX_PKT_CAPTURE_ENH
1408*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_enh_capture =
1409*5113495bSYour Name 				dp_mon_filter_setup_rx_enh_capture_1_0;
1410*5113495bSYour Name #endif
1411*5113495bSYour Name #ifdef WDI_EVENT_ENABLE
1412*5113495bSYour Name 	mon_ops->mon_set_pktlog_wifi3 = dp_set_pktlog_wifi3;
1413*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_pkt_log_full =
1414*5113495bSYour Name 				dp_mon_filter_setup_rx_pkt_log_full_1_0;
1415*5113495bSYour Name 	mon_ops->mon_filter_reset_rx_pkt_log_full =
1416*5113495bSYour Name 				dp_mon_filter_reset_rx_pkt_log_full_1_0;
1417*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_pkt_log_lite =
1418*5113495bSYour Name 				dp_mon_filter_setup_rx_pkt_log_lite_1_0;
1419*5113495bSYour Name 	mon_ops->mon_filter_reset_rx_pkt_log_lite =
1420*5113495bSYour Name 				dp_mon_filter_reset_rx_pkt_log_lite_1_0;
1421*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_pkt_log_cbf =
1422*5113495bSYour Name 				dp_mon_filter_setup_rx_pkt_log_cbf_1_0;
1423*5113495bSYour Name 	mon_ops->mon_filter_reset_rx_pkt_log_cbf =
1424*5113495bSYour Name 				dp_mon_filter_reset_rx_pktlog_cbf_1_0;
1425*5113495bSYour Name #ifdef BE_PKTLOG_SUPPORT
1426*5113495bSYour Name 	mon_ops->mon_filter_setup_pktlog_hybrid = NULL;
1427*5113495bSYour Name 	mon_ops->mon_filter_reset_pktlog_hybrid = NULL;
1428*5113495bSYour Name #endif
1429*5113495bSYour Name #endif
1430*5113495bSYour Name #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG)
1431*5113495bSYour Name 	mon_ops->mon_pktlogmod_exit = dp_pktlogmod_exit;
1432*5113495bSYour Name #endif
1433*5113495bSYour Name 	mon_ops->rx_packet_length_set = NULL;
1434*5113495bSYour Name 	mon_ops->rx_mon_enable = NULL;
1435*5113495bSYour Name 	mon_ops->rx_wmask_subscribe = NULL;
1436*5113495bSYour Name 	mon_ops->rx_pkt_tlv_offset = NULL;
1437*5113495bSYour Name 	mon_ops->rx_enable_mpdu_logging = NULL;
1438*5113495bSYour Name 	mon_ops->rx_enable_fpmo = NULL;
1439*5113495bSYour Name 	mon_ops->mon_neighbour_peers_detach = dp_neighbour_peers_detach;
1440*5113495bSYour Name 	mon_ops->mon_vdev_set_monitor_mode_buf_rings =
1441*5113495bSYour Name 				dp_vdev_set_monitor_mode_buf_rings;
1442*5113495bSYour Name 	mon_ops->mon_vdev_set_monitor_mode_rings =
1443*5113495bSYour Name 				dp_vdev_set_monitor_mode_rings;
1444*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
1445*5113495bSYour Name 	mon_ops->mon_rx_stats_update = NULL;
1446*5113495bSYour Name 	mon_ops->mon_rx_populate_ppdu_usr_info = NULL;
1447*5113495bSYour Name 	mon_ops->mon_rx_populate_ppdu_info = dp_mon_populate_ppdu_info_1_0;
1448*5113495bSYour Name #endif
1449*5113495bSYour Name #ifdef QCA_UNDECODED_METADATA_SUPPORT
1450*5113495bSYour Name 	mon_ops->mon_config_undecoded_metadata_capture =
1451*5113495bSYour Name 		dp_mon_config_undecoded_metadata_capture;
1452*5113495bSYour Name 	mon_ops->mon_filter_setup_undecoded_metadata_capture =
1453*5113495bSYour Name 		dp_mon_filter_setup_undecoded_metadata_capture_1_0;
1454*5113495bSYour Name 	mon_ops->mon_filter_reset_undecoded_metadata_capture =
1455*5113495bSYour Name 		dp_mon_filter_reset_undecoded_metadata_capture_1_0;
1456*5113495bSYour Name #endif
1457*5113495bSYour Name 	mon_ops->mon_rx_print_advanced_stats = NULL;
1458*5113495bSYour Name 	mon_ops->mon_mac_filter_set = dp_mon_mac_filter_set;
1459*5113495bSYour Name }
1460*5113495bSYour Name 
1461*5113495bSYour Name struct dp_mon_ops monitor_ops_1_0 = {
1462*5113495bSYour Name 	.mon_soc_cfg_init = dp_mon_soc_cfg_init,
1463*5113495bSYour Name 
1464*5113495bSYour Name 	.mon_pdev_alloc = NULL,
1465*5113495bSYour Name 	.mon_pdev_free = NULL,
1466*5113495bSYour Name 	.mon_pdev_attach = dp_mon_pdev_attach,
1467*5113495bSYour Name 	.mon_pdev_detach = dp_mon_pdev_detach,
1468*5113495bSYour Name 	.mon_pdev_init = dp_mon_pdev_init,
1469*5113495bSYour Name 	.mon_pdev_deinit = dp_mon_pdev_deinit,
1470*5113495bSYour Name 	.mon_vdev_attach = dp_mon_vdev_attach,
1471*5113495bSYour Name 	.mon_vdev_detach = dp_mon_vdev_detach,
1472*5113495bSYour Name 	.mon_peer_attach = dp_mon_peer_attach,
1473*5113495bSYour Name 	.mon_peer_detach = dp_mon_peer_detach,
1474*5113495bSYour Name 	.mon_peer_get_peerstats_ctx = dp_mon_peer_get_peerstats_ctx,
1475*5113495bSYour Name 	.mon_peer_reset_stats = dp_mon_peer_reset_stats,
1476*5113495bSYour Name 	.mon_peer_get_stats = dp_mon_peer_get_stats,
1477*5113495bSYour Name 	.mon_invalid_peer_update_pdev_stats =
1478*5113495bSYour Name 				dp_mon_invalid_peer_update_pdev_stats,
1479*5113495bSYour Name 	.mon_peer_get_stats_param = dp_mon_peer_get_stats_param,
1480*5113495bSYour Name 	.mon_flush_rings = dp_flush_monitor_rings,
1481*5113495bSYour Name #if defined(DP_CON_MON)
1482*5113495bSYour Name 	.mon_service_rings = dp_service_mon_rings,
1483*5113495bSYour Name #endif
1484*5113495bSYour Name #ifndef DISABLE_MON_CONFIG
1485*5113495bSYour Name 	.mon_rx_process = NULL,
1486*5113495bSYour Name #endif
1487*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC)
1488*5113495bSYour Name 	.mon_drop_packets_for_mac = dp_mon_drop_packets_for_mac,
1489*5113495bSYour Name #endif
1490*5113495bSYour Name 	.mon_vdev_timer_init = dp_mon_vdev_timer_init,
1491*5113495bSYour Name 	.mon_vdev_timer_start = dp_mon_vdev_timer_start,
1492*5113495bSYour Name 	.mon_vdev_timer_stop = dp_mon_vdev_timer_stop,
1493*5113495bSYour Name 	.mon_vdev_timer_deinit = dp_mon_vdev_timer_deinit,
1494*5113495bSYour Name 	.mon_reap_timer_init = dp_mon_reap_timer_init,
1495*5113495bSYour Name 	.mon_reap_timer_start = dp_mon_reap_timer_start,
1496*5113495bSYour Name 	.mon_reap_timer_stop = dp_mon_reap_timer_stop,
1497*5113495bSYour Name 	.mon_reap_timer_deinit = dp_mon_reap_timer_deinit,
1498*5113495bSYour Name 	.mon_filter_setup_rx_mon_mode = dp_mon_filter_setup_mon_mode_1_0,
1499*5113495bSYour Name 	.mon_filter_reset_rx_mon_mode = dp_mon_filter_reset_mon_mode_1_0,
1500*5113495bSYour Name 	.rx_mon_filter_update = dp_mon_filter_update_1_0,
1501*5113495bSYour Name 	.set_mon_mode_buf_rings_tx = NULL,
1502*5113495bSYour Name 	.rx_mon_desc_pool_init = dp_rx_pdev_mon_desc_pool_init,
1503*5113495bSYour Name 	.rx_mon_desc_pool_deinit = dp_rx_pdev_mon_desc_pool_deinit,
1504*5113495bSYour Name 	.rx_mon_desc_pool_alloc = dp_rx_pdev_mon_desc_pool_alloc,
1505*5113495bSYour Name 	.rx_mon_desc_pool_free = dp_rx_pdev_mon_desc_pool_free,
1506*5113495bSYour Name 	.rx_mon_buffers_alloc = dp_rx_pdev_mon_buffers_alloc,
1507*5113495bSYour Name 	.rx_mon_buffers_free = dp_rx_pdev_mon_buffers_free,
1508*5113495bSYour Name 	.tx_mon_desc_pool_init = NULL,
1509*5113495bSYour Name 	.tx_mon_desc_pool_deinit = NULL,
1510*5113495bSYour Name 	.tx_mon_desc_pool_alloc = NULL,
1511*5113495bSYour Name 	.tx_mon_desc_pool_free = NULL,
1512*5113495bSYour Name 	.tx_mon_filter_alloc = NULL,
1513*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG)
1514*5113495bSYour Name 	.mon_register_intr_ops = dp_mon_register_intr_ops_1_0,
1515*5113495bSYour Name #endif
1516*5113495bSYour Name 	.mon_register_feature_ops = dp_mon_register_feature_ops_1_0,
1517*5113495bSYour Name 	.mon_lite_mon_alloc = NULL,
1518*5113495bSYour Name 	.mon_lite_mon_dealloc = NULL,
1519*5113495bSYour Name 	.mon_lite_mon_vdev_delete = NULL,
1520*5113495bSYour Name 	.mon_lite_mon_disable_rx = NULL,
1521*5113495bSYour Name 	.mon_lite_mon_is_rx_adv_filter_enable = NULL,
1522*5113495bSYour Name };
1523*5113495bSYour Name 
1524*5113495bSYour Name struct cdp_mon_ops dp_ops_mon_1_0 = {
1525*5113495bSYour Name 	.txrx_reset_monitor_mode = dp_reset_monitor_mode,
1526*5113495bSYour Name 	/* Added support for HK advance filter */
1527*5113495bSYour Name 	.txrx_set_advance_monitor_filter = dp_pdev_set_advance_monitor_filter,
1528*5113495bSYour Name 	.txrx_deliver_tx_mgmt = dp_deliver_tx_mgmt,
1529*5113495bSYour Name 	.config_full_mon_mode = dp_config_full_mon_mode,
1530*5113495bSYour Name 	.soc_config_full_mon_mode = dp_soc_config_full_mon_mode,
1531*5113495bSYour Name 	.get_mon_pdev_rx_stats = dp_pdev_get_rx_mon_stats,
1532*5113495bSYour Name 	.txrx_enable_mon_reap_timer = dp_enable_mon_reap_timer,
1533*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
1534*5113495bSYour Name 	.txrx_enable_enhanced_stats = dp_enable_enhanced_stats,
1535*5113495bSYour Name 	.txrx_disable_enhanced_stats = dp_disable_enhanced_stats,
1536*5113495bSYour Name #endif /* QCA_ENHANCED_STATS_SUPPORT */
1537*5113495bSYour Name #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
1538*5113495bSYour Name 	.txrx_update_filter_neighbour_peers = dp_update_filter_neighbour_peers,
1539*5113495bSYour Name #endif
1540*5113495bSYour Name #ifdef ATH_SUPPORT_NAC_RSSI
1541*5113495bSYour Name 	.txrx_vdev_config_for_nac_rssi = dp_config_for_nac_rssi,
1542*5113495bSYour Name 	.txrx_vdev_get_neighbour_rssi = dp_vdev_get_neighbour_rssi,
1543*5113495bSYour Name #endif
1544*5113495bSYour Name #ifdef QCA_SUPPORT_LITE_MONITOR
1545*5113495bSYour Name 	.txrx_set_lite_mon_config = NULL,
1546*5113495bSYour Name 	.txrx_get_lite_mon_config = NULL,
1547*5113495bSYour Name 	.txrx_set_lite_mon_peer_config = NULL,
1548*5113495bSYour Name 	.txrx_get_lite_mon_peer_config = NULL,
1549*5113495bSYour Name 	.txrx_is_lite_mon_enabled = NULL,
1550*5113495bSYour Name 	.txrx_get_lite_mon_legacy_feature_enabled = NULL,
1551*5113495bSYour Name #endif
1552*5113495bSYour Name 	.txrx_set_mon_pdev_params_rssi_dbm_conv =
1553*5113495bSYour Name 				dp_mon_pdev_params_rssi_dbm_conv,
1554*5113495bSYour Name #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
1555*5113495bSYour Name 	.start_local_pkt_capture = dp_mon_start_local_pkt_capture,
1556*5113495bSYour Name 	.stop_local_pkt_capture = dp_mon_stop_local_pkt_capture,
1557*5113495bSYour Name 	.is_local_pkt_capture_running = dp_mon_get_is_local_pkt_capture_running,
1558*5113495bSYour Name #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */
1559*5113495bSYour Name };
1560*5113495bSYour Name 
1561*5113495bSYour Name #ifdef QCA_MONITOR_OPS_PER_SOC_SUPPORT
dp_mon_ops_register_1_0(struct dp_mon_soc * mon_soc)1562*5113495bSYour Name void dp_mon_ops_register_1_0(struct dp_mon_soc *mon_soc)
1563*5113495bSYour Name {
1564*5113495bSYour Name 	struct dp_mon_ops *mon_ops = NULL;
1565*5113495bSYour Name 
1566*5113495bSYour Name 	if (mon_soc->mon_ops) {
1567*5113495bSYour Name 		dp_mon_err("monitor ops is allocated");
1568*5113495bSYour Name 		return;
1569*5113495bSYour Name 	}
1570*5113495bSYour Name 
1571*5113495bSYour Name 	mon_ops = qdf_mem_malloc(sizeof(struct dp_mon_ops));
1572*5113495bSYour Name 	if (!mon_ops) {
1573*5113495bSYour Name 		dp_mon_err("Failed to allocate memory for mon ops");
1574*5113495bSYour Name 		return;
1575*5113495bSYour Name 	}
1576*5113495bSYour Name 
1577*5113495bSYour Name 	qdf_mem_copy(mon_ops, &monitor_ops_1_0, sizeof(struct dp_mon_ops));
1578*5113495bSYour Name 	mon_soc->mon_ops = mon_ops;
1579*5113495bSYour Name 	dp_mon_register_lpc_ops_1_0(mon_ops);
1580*5113495bSYour Name }
1581*5113495bSYour Name 
dp_mon_cdp_ops_register_1_0(struct cdp_ops * ops)1582*5113495bSYour Name void dp_mon_cdp_ops_register_1_0(struct cdp_ops *ops)
1583*5113495bSYour Name {
1584*5113495bSYour Name 	struct cdp_mon_ops *mon_ops = NULL;
1585*5113495bSYour Name 
1586*5113495bSYour Name 	if (ops->mon_ops) {
1587*5113495bSYour Name 		dp_mon_err("cdp monitor ops is allocated");
1588*5113495bSYour Name 		return;
1589*5113495bSYour Name 	}
1590*5113495bSYour Name 
1591*5113495bSYour Name 	mon_ops = qdf_mem_malloc(sizeof(struct cdp_mon_ops));
1592*5113495bSYour Name 	if (!mon_ops) {
1593*5113495bSYour Name 		dp_mon_err("Failed to allocate memory for cdp mon ops");
1594*5113495bSYour Name 		return;
1595*5113495bSYour Name 	}
1596*5113495bSYour Name 
1597*5113495bSYour Name 	qdf_mem_copy(mon_ops, &dp_ops_mon_1_0, sizeof(struct cdp_mon_ops));
1598*5113495bSYour Name 	ops->mon_ops = mon_ops;
1599*5113495bSYour Name }
1600*5113495bSYour Name #else
dp_mon_ops_register_1_0(struct dp_mon_soc * mon_soc)1601*5113495bSYour Name void dp_mon_ops_register_1_0(struct dp_mon_soc *mon_soc)
1602*5113495bSYour Name {
1603*5113495bSYour Name 	mon_soc->mon_ops = &monitor_ops_1_0;
1604*5113495bSYour Name 	dp_mon_register_lpc_ops_1_0(mon_soc->mon_ops);
1605*5113495bSYour Name }
1606*5113495bSYour Name 
dp_mon_cdp_ops_register_1_0(struct cdp_ops * ops)1607*5113495bSYour Name void dp_mon_cdp_ops_register_1_0(struct cdp_ops *ops)
1608*5113495bSYour Name {
1609*5113495bSYour Name 	ops->mon_ops = &dp_ops_mon_1_0;
1610*5113495bSYour Name }
1611*5113495bSYour Name #endif
1612