xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/monitor/2.0/dp_mon_2.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 
18*5113495bSYour Name #include <dp_types.h>
19*5113495bSYour Name #include "dp_rx.h"
20*5113495bSYour Name #include "dp_peer.h"
21*5113495bSYour Name #include <dp_htt.h>
22*5113495bSYour Name #include <dp_mon_filter.h>
23*5113495bSYour Name #include <dp_mon.h>
24*5113495bSYour Name #include <dp_rx_mon.h>
25*5113495bSYour Name #include <dp_rx_mon_2.0.h>
26*5113495bSYour Name #include <dp_mon_2.0.h>
27*5113495bSYour Name #include <dp_mon_filter_2.0.h>
28*5113495bSYour Name #include <dp_tx_mon_2.0.h>
29*5113495bSYour Name #include <hal_be_api_mon.h>
30*5113495bSYour Name #include <dp_be.h>
31*5113495bSYour Name #include <htt_ppdu_stats.h>
32*5113495bSYour Name #ifdef QCA_SUPPORT_LITE_MONITOR
33*5113495bSYour Name #include "dp_lite_mon.h"
34*5113495bSYour Name #endif
35*5113495bSYour Name 
36*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG)
37*5113495bSYour Name /*
38*5113495bSYour Name  * dp_mon_add_desc_list_to_free_list() - append unused desc_list back to
39*5113495bSYour Name  *					freelist.
40*5113495bSYour Name  *
41*5113495bSYour Name  * @soc: core txrx main context
42*5113495bSYour Name  * @local_desc_list: local desc list provided by the caller
43*5113495bSYour Name  * @tail: attach the point to last desc of local desc list
44*5113495bSYour Name  * @mon_desc_pool: monitor descriptor pool pointer
45*5113495bSYour Name  */
46*5113495bSYour Name void
dp_mon_add_desc_list_to_free_list(struct dp_soc * soc,union dp_mon_desc_list_elem_t ** local_desc_list,union dp_mon_desc_list_elem_t ** tail,struct dp_mon_desc_pool * mon_desc_pool)47*5113495bSYour Name dp_mon_add_desc_list_to_free_list(struct dp_soc *soc,
48*5113495bSYour Name 				  union dp_mon_desc_list_elem_t **local_desc_list,
49*5113495bSYour Name 				  union dp_mon_desc_list_elem_t **tail,
50*5113495bSYour Name 				  struct dp_mon_desc_pool *mon_desc_pool)
51*5113495bSYour Name {
52*5113495bSYour Name 	union dp_mon_desc_list_elem_t *temp_list = NULL;
53*5113495bSYour Name 
54*5113495bSYour Name 	qdf_spin_lock_bh(&mon_desc_pool->lock);
55*5113495bSYour Name 
56*5113495bSYour Name 	temp_list = mon_desc_pool->freelist;
57*5113495bSYour Name 	mon_desc_pool->freelist = *local_desc_list;
58*5113495bSYour Name 	(*tail)->next = temp_list;
59*5113495bSYour Name 	*tail = NULL;
60*5113495bSYour Name 	*local_desc_list = NULL;
61*5113495bSYour Name 
62*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_desc_pool->lock);
63*5113495bSYour Name }
64*5113495bSYour Name 
65*5113495bSYour Name /*
66*5113495bSYour Name  * dp_mon_get_free_desc_list() - provide a list of descriptors from
67*5113495bSYour Name  *				the free mon desc pool.
68*5113495bSYour Name  *
69*5113495bSYour Name  * @soc: core txrx main context
70*5113495bSYour Name  * @mon_desc_pool: monitor descriptor pool pointer
71*5113495bSYour Name  * @num_descs: number of descs requested from freelist
72*5113495bSYour Name  * @desc_list: attach the descs to this list (output parameter)
73*5113495bSYour Name  * @tail: attach the point to last desc of free list (output parameter)
74*5113495bSYour Name  *
75*5113495bSYour Name  * Return: number of descs allocated from free list.
76*5113495bSYour Name  */
77*5113495bSYour Name static uint16_t
dp_mon_get_free_desc_list(struct dp_soc * soc,struct dp_mon_desc_pool * mon_desc_pool,uint16_t num_descs,union dp_mon_desc_list_elem_t ** desc_list,union dp_mon_desc_list_elem_t ** tail)78*5113495bSYour Name dp_mon_get_free_desc_list(struct dp_soc *soc,
79*5113495bSYour Name 			  struct dp_mon_desc_pool *mon_desc_pool,
80*5113495bSYour Name 			  uint16_t num_descs,
81*5113495bSYour Name 			  union dp_mon_desc_list_elem_t **desc_list,
82*5113495bSYour Name 			  union dp_mon_desc_list_elem_t **tail)
83*5113495bSYour Name {
84*5113495bSYour Name 	uint16_t count;
85*5113495bSYour Name 
86*5113495bSYour Name 	qdf_spin_lock_bh(&mon_desc_pool->lock);
87*5113495bSYour Name 
88*5113495bSYour Name 	*desc_list = *tail = mon_desc_pool->freelist;
89*5113495bSYour Name 
90*5113495bSYour Name 	for (count = 0; count < num_descs; count++) {
91*5113495bSYour Name 		if (qdf_unlikely(!mon_desc_pool->freelist)) {
92*5113495bSYour Name 			qdf_spin_unlock_bh(&mon_desc_pool->lock);
93*5113495bSYour Name 			return count;
94*5113495bSYour Name 		}
95*5113495bSYour Name 		*tail = mon_desc_pool->freelist;
96*5113495bSYour Name 		mon_desc_pool->freelist = mon_desc_pool->freelist->next;
97*5113495bSYour Name 	}
98*5113495bSYour Name 	(*tail)->next = NULL;
99*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_desc_pool->lock);
100*5113495bSYour Name 	return count;
101*5113495bSYour Name }
102*5113495bSYour Name 
103*5113495bSYour Name static inline QDF_STATUS
dp_mon_frag_alloc_and_map(struct dp_soc * dp_soc,struct dp_mon_desc * mon_desc,struct dp_mon_desc_pool * mon_desc_pool)104*5113495bSYour Name dp_mon_frag_alloc_and_map(struct dp_soc *dp_soc,
105*5113495bSYour Name 			  struct dp_mon_desc *mon_desc,
106*5113495bSYour Name 			  struct dp_mon_desc_pool *mon_desc_pool)
107*5113495bSYour Name {
108*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
109*5113495bSYour Name 
110*5113495bSYour Name 	mon_desc->buf_addr = qdf_frag_alloc(&mon_desc_pool->pf_cache,
111*5113495bSYour Name 					    mon_desc_pool->buf_size);
112*5113495bSYour Name 
113*5113495bSYour Name 	if (!mon_desc->buf_addr) {
114*5113495bSYour Name 		dp_mon_err("Frag alloc failed");
115*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
116*5113495bSYour Name 	}
117*5113495bSYour Name 
118*5113495bSYour Name 	ret = qdf_mem_map_page(dp_soc->osdev,
119*5113495bSYour Name 			       mon_desc->buf_addr,
120*5113495bSYour Name 			       QDF_DMA_FROM_DEVICE,
121*5113495bSYour Name 			       mon_desc_pool->buf_size,
122*5113495bSYour Name 			       &mon_desc->paddr);
123*5113495bSYour Name 
124*5113495bSYour Name 	if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) {
125*5113495bSYour Name 		qdf_frag_free(mon_desc->buf_addr);
126*5113495bSYour Name 		dp_mon_err("Frag map failed");
127*5113495bSYour Name 		return QDF_STATUS_E_FAULT;
128*5113495bSYour Name 	}
129*5113495bSYour Name 
130*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
131*5113495bSYour Name }
132*5113495bSYour Name 
133*5113495bSYour Name QDF_STATUS
dp_mon_desc_pool_init(struct dp_mon_desc_pool * mon_desc_pool,uint32_t pool_size)134*5113495bSYour Name dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool,
135*5113495bSYour Name 		      uint32_t pool_size)
136*5113495bSYour Name {
137*5113495bSYour Name 	int desc_id;
138*5113495bSYour Name 	/* Initialize monitor desc lock */
139*5113495bSYour Name 	qdf_spinlock_create(&mon_desc_pool->lock);
140*5113495bSYour Name 
141*5113495bSYour Name 	qdf_spin_lock_bh(&mon_desc_pool->lock);
142*5113495bSYour Name 
143*5113495bSYour Name 	mon_desc_pool->buf_size = DP_MON_DATA_BUFFER_SIZE;
144*5113495bSYour Name 	/* link SW descs into a freelist */
145*5113495bSYour Name 	mon_desc_pool->freelist = &mon_desc_pool->array[0];
146*5113495bSYour Name 	mon_desc_pool->pool_size = pool_size - 1;
147*5113495bSYour Name 	qdf_mem_zero(mon_desc_pool->freelist,
148*5113495bSYour Name 		     mon_desc_pool->pool_size *
149*5113495bSYour Name 		     sizeof(union dp_mon_desc_list_elem_t));
150*5113495bSYour Name 
151*5113495bSYour Name 	for (desc_id = 0; desc_id < mon_desc_pool->pool_size; desc_id++) {
152*5113495bSYour Name 		if (desc_id == mon_desc_pool->pool_size - 1)
153*5113495bSYour Name 			mon_desc_pool->array[desc_id].next = NULL;
154*5113495bSYour Name 		else
155*5113495bSYour Name 			mon_desc_pool->array[desc_id].next =
156*5113495bSYour Name 				&mon_desc_pool->array[desc_id + 1];
157*5113495bSYour Name 		mon_desc_pool->array[desc_id].mon_desc.in_use = 0;
158*5113495bSYour Name 		mon_desc_pool->array[desc_id].mon_desc.cookie = desc_id;
159*5113495bSYour Name 	}
160*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_desc_pool->lock);
161*5113495bSYour Name 
162*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
163*5113495bSYour Name }
164*5113495bSYour Name 
dp_mon_desc_pool_deinit(struct dp_mon_desc_pool * mon_desc_pool)165*5113495bSYour Name void dp_mon_desc_pool_deinit(struct dp_mon_desc_pool *mon_desc_pool)
166*5113495bSYour Name {
167*5113495bSYour Name 	qdf_spin_lock_bh(&mon_desc_pool->lock);
168*5113495bSYour Name 
169*5113495bSYour Name 	mon_desc_pool->freelist = NULL;
170*5113495bSYour Name 	mon_desc_pool->pool_size = 0;
171*5113495bSYour Name 
172*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_desc_pool->lock);
173*5113495bSYour Name 	qdf_spinlock_destroy(&mon_desc_pool->lock);
174*5113495bSYour Name }
175*5113495bSYour Name 
dp_mon_desc_pool_free(struct dp_soc * soc,struct dp_mon_desc_pool * mon_desc_pool,enum dp_ctxt_type ctx_type)176*5113495bSYour Name void dp_mon_desc_pool_free(struct dp_soc *soc,
177*5113495bSYour Name 			   struct dp_mon_desc_pool *mon_desc_pool,
178*5113495bSYour Name 			   enum dp_ctxt_type ctx_type)
179*5113495bSYour Name {
180*5113495bSYour Name 	dp_context_free_mem(soc, ctx_type, mon_desc_pool->array);
181*5113495bSYour Name }
182*5113495bSYour Name 
dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev * pdev)183*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev)
184*5113495bSYour Name {
185*5113495bSYour Name 	int rx_mon_max_entries;
186*5113495bSYour Name 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
187*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
188*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
189*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
190*5113495bSYour Name 	QDF_STATUS status;
191*5113495bSYour Name 
192*5113495bSYour Name 	if (!mon_soc_be) {
193*5113495bSYour Name 		dp_mon_err("DP MON SOC is NULL");
194*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
195*5113495bSYour Name 	}
196*5113495bSYour Name 
197*5113495bSYour Name 	soc_cfg_ctx = soc->wlan_cfg_ctx;
198*5113495bSYour Name 	rx_mon_max_entries = wlan_cfg_get_dp_soc_rx_mon_buf_ring_size(soc_cfg_ctx);
199*5113495bSYour Name 
200*5113495bSYour Name 	hal_set_low_threshold(soc->rxdma_mon_buf_ring[0].hal_srng,
201*5113495bSYour Name 			      MON_BUF_MIN_ENTRIES << 2);
202*5113495bSYour Name 	status = htt_srng_setup(soc->htt_handle, 0,
203*5113495bSYour Name 				soc->rxdma_mon_buf_ring[0].hal_srng,
204*5113495bSYour Name 				RXDMA_MONITOR_BUF);
205*5113495bSYour Name 
206*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
207*5113495bSYour Name 		dp_mon_err("Failed to send htt srng setup message for Rx mon buf ring");
208*5113495bSYour Name 		return status;
209*5113495bSYour Name 	}
210*5113495bSYour Name 
211*5113495bSYour Name 	if (mon_soc_be->rx_mon_ring_fill_level < rx_mon_max_entries) {
212*5113495bSYour Name 		status = dp_rx_mon_buffers_alloc(soc,
213*5113495bSYour Name 						 (rx_mon_max_entries -
214*5113495bSYour Name 						 mon_soc_be->rx_mon_ring_fill_level));
215*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS) {
216*5113495bSYour Name 			dp_mon_err("%pK: Rx mon buffers allocation failed", soc);
217*5113495bSYour Name 			return status;
218*5113495bSYour Name 		}
219*5113495bSYour Name 		mon_soc_be->rx_mon_ring_fill_level +=
220*5113495bSYour Name 				(rx_mon_max_entries -
221*5113495bSYour Name 				mon_soc_be->rx_mon_ring_fill_level);
222*5113495bSYour Name 	}
223*5113495bSYour Name 
224*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
225*5113495bSYour Name }
226*5113495bSYour Name 
227*5113495bSYour Name static
dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev * pdev)228*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev)
229*5113495bSYour Name {
230*5113495bSYour Name 	int status;
231*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
232*5113495bSYour Name 
233*5113495bSYour Name 	status = dp_vdev_set_monitor_mode_buf_rings_rx_2_0(pdev);
234*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
235*5113495bSYour Name 		dp_mon_err("%pK: Rx monitor extra buffer allocation failed",
236*5113495bSYour Name 			   soc);
237*5113495bSYour Name 		return status;
238*5113495bSYour Name 	}
239*5113495bSYour Name 
240*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
241*5113495bSYour Name }
242*5113495bSYour Name 
243*5113495bSYour Name static
dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev * pdev,uint8_t delayed_replenish)244*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
245*5113495bSYour Name 					      uint8_t delayed_replenish)
246*5113495bSYour Name {
247*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
248*5113495bSYour Name }
249*5113495bSYour Name 
250*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
251*5113495bSYour Name /**
252*5113495bSYour Name  * dp_mon_tx_enable_enhanced_stats_2_0() - Send HTT cmd to FW to enable stats
253*5113495bSYour Name  * @pdev: Datapath pdev handle
254*5113495bSYour Name  *
255*5113495bSYour Name  * Return: none
256*5113495bSYour Name  */
dp_mon_tx_enable_enhanced_stats_2_0(struct dp_pdev * pdev)257*5113495bSYour Name static void dp_mon_tx_enable_enhanced_stats_2_0(struct dp_pdev *pdev)
258*5113495bSYour Name {
259*5113495bSYour Name 	dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS,
260*5113495bSYour Name 				  pdev->pdev_id);
261*5113495bSYour Name }
262*5113495bSYour Name 
263*5113495bSYour Name /**
264*5113495bSYour Name  * dp_mon_tx_disable_enhanced_stats_2_0() - Send HTT cmd to FW to disable stats
265*5113495bSYour Name  * @pdev: Datapath pdev handle
266*5113495bSYour Name  *
267*5113495bSYour Name  * Return: none
268*5113495bSYour Name  */
dp_mon_tx_disable_enhanced_stats_2_0(struct dp_pdev * pdev)269*5113495bSYour Name static void dp_mon_tx_disable_enhanced_stats_2_0(struct dp_pdev *pdev)
270*5113495bSYour Name {
271*5113495bSYour Name 	dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id);
272*5113495bSYour Name }
273*5113495bSYour Name #endif
274*5113495bSYour Name 
275*5113495bSYour Name #if defined(QCA_ENHANCED_STATS_SUPPORT) && defined(WLAN_FEATURE_11BE)
276*5113495bSYour Name void
dp_mon_tx_stats_update_2_0(struct dp_mon_peer * mon_peer,struct cdp_tx_completion_ppdu_user * ppdu)277*5113495bSYour Name dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer,
278*5113495bSYour Name 			   struct cdp_tx_completion_ppdu_user *ppdu)
279*5113495bSYour Name {
280*5113495bSYour Name 	uint8_t preamble, mcs, punc_mode, res_mcs;
281*5113495bSYour Name 
282*5113495bSYour Name 	preamble = ppdu->preamble;
283*5113495bSYour Name 	mcs = ppdu->mcs;
284*5113495bSYour Name 
285*5113495bSYour Name 	punc_mode = dp_mon_get_puncture_type(ppdu->punc_pattern_bitmap,
286*5113495bSYour Name 					     ppdu->bw);
287*5113495bSYour Name 	ppdu->punc_mode = punc_mode;
288*5113495bSYour Name 
289*5113495bSYour Name 	DP_STATS_INC(mon_peer, tx.punc_bw[punc_mode], ppdu->num_msdu);
290*5113495bSYour Name 
291*5113495bSYour Name 	if (preamble == DOT11_BE) {
292*5113495bSYour Name 		res_mcs = (mcs < MAX_MCS_11BE) ? mcs : (MAX_MCS - 1);
293*5113495bSYour Name 
294*5113495bSYour Name 		DP_STATS_INC(mon_peer,
295*5113495bSYour Name 			     tx.pkt_type[preamble].mcs_count[res_mcs],
296*5113495bSYour Name 			     ppdu->num_msdu);
297*5113495bSYour Name 		DP_STATS_INCC(mon_peer,
298*5113495bSYour Name 			      tx.su_be_ppdu_cnt.mcs_count[res_mcs], 1,
299*5113495bSYour Name 			      (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU));
300*5113495bSYour Name 		DP_STATS_INCC(mon_peer,
301*5113495bSYour Name 			      tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[res_mcs],
302*5113495bSYour Name 			      1, (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA));
303*5113495bSYour Name 		DP_STATS_INCC(mon_peer,
304*5113495bSYour Name 			      tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[res_mcs],
305*5113495bSYour Name 			      1, (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO));
306*5113495bSYour Name 	}
307*5113495bSYour Name }
308*5113495bSYour Name 
309*5113495bSYour Name enum cdp_punctured_modes
dp_mon_get_puncture_type(uint16_t puncture_pattern,uint8_t bw)310*5113495bSYour Name dp_mon_get_puncture_type(uint16_t puncture_pattern, uint8_t bw)
311*5113495bSYour Name {
312*5113495bSYour Name 	uint16_t mask;
313*5113495bSYour Name 	uint8_t punctured_bits;
314*5113495bSYour Name 
315*5113495bSYour Name 	if (!puncture_pattern)
316*5113495bSYour Name 		return NO_PUNCTURE;
317*5113495bSYour Name 
318*5113495bSYour Name 	switch (bw) {
319*5113495bSYour Name 	case CMN_BW_80MHZ:
320*5113495bSYour Name 		mask = PUNCTURE_80MHZ_MASK;
321*5113495bSYour Name 		break;
322*5113495bSYour Name 	case CMN_BW_160MHZ:
323*5113495bSYour Name 		mask = PUNCTURE_160MHZ_MASK;
324*5113495bSYour Name 		break;
325*5113495bSYour Name 	case CMN_BW_320MHZ:
326*5113495bSYour Name 		mask = PUNCTURE_320MHZ_MASK;
327*5113495bSYour Name 		break;
328*5113495bSYour Name 	default:
329*5113495bSYour Name 		return NO_PUNCTURE;
330*5113495bSYour Name 	}
331*5113495bSYour Name 
332*5113495bSYour Name 	/* 0s in puncture pattern received in TLV indicates punctured 20Mhz,
333*5113495bSYour Name 	 * after complement, 1s will indicate punctured 20Mhz
334*5113495bSYour Name 	 */
335*5113495bSYour Name 	puncture_pattern = ~puncture_pattern;
336*5113495bSYour Name 	puncture_pattern &= mask;
337*5113495bSYour Name 
338*5113495bSYour Name 	if (puncture_pattern) {
339*5113495bSYour Name 		punctured_bits = 0;
340*5113495bSYour Name 		while (puncture_pattern != 0) {
341*5113495bSYour Name 			punctured_bits++;
342*5113495bSYour Name 			puncture_pattern &= (puncture_pattern - 1);
343*5113495bSYour Name 		}
344*5113495bSYour Name 
345*5113495bSYour Name 		if (bw == CMN_BW_80MHZ) {
346*5113495bSYour Name 			if (punctured_bits == IEEE80211_PUNC_MINUS20MHZ)
347*5113495bSYour Name 				return PUNCTURED_20MHZ;
348*5113495bSYour Name 			else
349*5113495bSYour Name 				return NO_PUNCTURE;
350*5113495bSYour Name 		} else if (bw == CMN_BW_160MHZ) {
351*5113495bSYour Name 			if (punctured_bits == IEEE80211_PUNC_MINUS20MHZ)
352*5113495bSYour Name 				return PUNCTURED_20MHZ;
353*5113495bSYour Name 			else if (punctured_bits == IEEE80211_PUNC_MINUS40MHZ)
354*5113495bSYour Name 				return PUNCTURED_40MHZ;
355*5113495bSYour Name 			else
356*5113495bSYour Name 				return NO_PUNCTURE;
357*5113495bSYour Name 		} else if (bw == CMN_BW_320MHZ) {
358*5113495bSYour Name 			if (punctured_bits == IEEE80211_PUNC_MINUS40MHZ)
359*5113495bSYour Name 				return PUNCTURED_40MHZ;
360*5113495bSYour Name 			else if (punctured_bits == IEEE80211_PUNC_MINUS80MHZ)
361*5113495bSYour Name 				return PUNCTURED_80MHZ;
362*5113495bSYour Name 			else if (punctured_bits == IEEE80211_PUNC_MINUS120MHZ)
363*5113495bSYour Name 				return PUNCTURED_120MHZ;
364*5113495bSYour Name 			else
365*5113495bSYour Name 				return NO_PUNCTURE;
366*5113495bSYour Name 		}
367*5113495bSYour Name 	}
368*5113495bSYour Name 	return NO_PUNCTURE;
369*5113495bSYour Name }
370*5113495bSYour Name #endif
371*5113495bSYour Name 
372*5113495bSYour Name #if defined(QCA_ENHANCED_STATS_SUPPORT) && !defined(WLAN_FEATURE_11BE)
373*5113495bSYour Name void
dp_mon_tx_stats_update_2_0(struct dp_mon_peer * mon_peer,struct cdp_tx_completion_ppdu_user * ppdu)374*5113495bSYour Name dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer,
375*5113495bSYour Name 			   struct cdp_tx_completion_ppdu_user *ppdu)
376*5113495bSYour Name {
377*5113495bSYour Name 	ppdu->punc_mode = NO_PUNCTURE;
378*5113495bSYour Name }
379*5113495bSYour Name 
380*5113495bSYour Name enum cdp_punctured_modes
dp_mon_get_puncture_type(uint16_t puncture_pattern,uint8_t bw)381*5113495bSYour Name dp_mon_get_puncture_type(uint16_t puncture_pattern, uint8_t bw)
382*5113495bSYour Name {
383*5113495bSYour Name 	return NO_PUNCTURE;
384*5113495bSYour Name }
385*5113495bSYour Name #endif /* QCA_ENHANCED_STATS_SUPPORT && WLAN_FEATURE_11BE */
386*5113495bSYour Name 
387*5113495bSYour Name #ifdef QCA_SUPPORT_BPR
388*5113495bSYour Name static QDF_STATUS
dp_set_bpr_enable_2_0(struct dp_pdev * pdev,int val)389*5113495bSYour Name dp_set_bpr_enable_2_0(struct dp_pdev *pdev, int val)
390*5113495bSYour Name {
391*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
392*5113495bSYour Name }
393*5113495bSYour Name #endif /* QCA_SUPPORT_BPR */
394*5113495bSYour Name 
395*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
396*5113495bSYour Name #ifdef WDI_EVENT_ENABLE
397*5113495bSYour Name /**
398*5113495bSYour Name  * dp_ppdu_desc_notify_2_0 - Notify upper layer for PPDU indication via WDI
399*5113495bSYour Name  *
400*5113495bSYour Name  * @pdev: Datapath pdev handle
401*5113495bSYour Name  * @nbuf: Buffer to be shipped
402*5113495bSYour Name  *
403*5113495bSYour Name  * Return: void
404*5113495bSYour Name  */
dp_ppdu_desc_notify_2_0(struct dp_pdev * pdev,qdf_nbuf_t nbuf)405*5113495bSYour Name static void dp_ppdu_desc_notify_2_0(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
406*5113495bSYour Name {
407*5113495bSYour Name 	struct cdp_tx_completion_ppdu *ppdu_desc = NULL;
408*5113495bSYour Name 
409*5113495bSYour Name 	ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(nbuf);
410*5113495bSYour Name 
411*5113495bSYour Name 	if (ppdu_desc->num_mpdu != 0 && ppdu_desc->num_users != 0 &&
412*5113495bSYour Name 	    ppdu_desc->frame_ctrl & HTT_FRAMECTRL_DATATYPE) {
413*5113495bSYour Name 		dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC,
414*5113495bSYour Name 				     pdev->soc,
415*5113495bSYour Name 				     nbuf, HTT_INVALID_PEER,
416*5113495bSYour Name 				     WDI_NO_VAL,
417*5113495bSYour Name 				     pdev->pdev_id);
418*5113495bSYour Name 	} else {
419*5113495bSYour Name 		qdf_nbuf_free(nbuf);
420*5113495bSYour Name 	}
421*5113495bSYour Name }
422*5113495bSYour Name #endif
423*5113495bSYour Name 
424*5113495bSYour Name /**
425*5113495bSYour Name  * dp_ppdu_stats_feat_enable_check_2_0 - Check if feature(s) is enabled to
426*5113495bSYour Name  *				consume ppdu stats from FW
427*5113495bSYour Name  *
428*5113495bSYour Name  * @pdev: Datapath pdev handle
429*5113495bSYour Name  *
430*5113495bSYour Name  * Return: true if enabled, else return false
431*5113495bSYour Name  */
dp_ppdu_stats_feat_enable_check_2_0(struct dp_pdev * pdev)432*5113495bSYour Name static bool dp_ppdu_stats_feat_enable_check_2_0(struct dp_pdev *pdev)
433*5113495bSYour Name {
434*5113495bSYour Name 	return pdev->monitor_pdev->enhanced_stats_en;
435*5113495bSYour Name }
436*5113495bSYour Name #endif
437*5113495bSYour Name 
dp_mon_soc_htt_srng_setup_2_0(struct dp_soc * soc)438*5113495bSYour Name QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc)
439*5113495bSYour Name {
440*5113495bSYour Name 	QDF_STATUS status;
441*5113495bSYour Name 
442*5113495bSYour Name 	status = dp_rx_mon_soc_htt_srng_setup_2_0(soc, 0);
443*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
444*5113495bSYour Name 		dp_err("Failed to send htt srng setup message for Rx mon buf ring");
445*5113495bSYour Name 		return status;
446*5113495bSYour Name 	}
447*5113495bSYour Name 
448*5113495bSYour Name 	status = dp_tx_mon_soc_htt_srng_setup_2_0(soc, 0);
449*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
450*5113495bSYour Name 		dp_err("Failed to send htt srng setup message for Tx mon buf ring");
451*5113495bSYour Name 		return status;
452*5113495bSYour Name 	}
453*5113495bSYour Name 
454*5113495bSYour Name 	return status;
455*5113495bSYour Name }
456*5113495bSYour Name 
457*5113495bSYour Name #if defined(DP_CON_MON)
dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc * soc,struct dp_pdev * pdev,int mac_id,int mac_for_pdev)458*5113495bSYour Name QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
459*5113495bSYour Name 					  struct dp_pdev *pdev,
460*5113495bSYour Name 					  int mac_id,
461*5113495bSYour Name 					  int mac_for_pdev)
462*5113495bSYour Name {
463*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
464*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
465*5113495bSYour Name 	QDF_STATUS status;
466*5113495bSYour Name 
467*5113495bSYour Name 	if (!mon_soc_be->tx_mon_dst_ring[mac_id].hal_srng)
468*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
469*5113495bSYour Name 
470*5113495bSYour Name 	status = dp_tx_mon_pdev_htt_srng_setup_2_0(soc, pdev, mac_id,
471*5113495bSYour Name 						   mac_for_pdev);
472*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
473*5113495bSYour Name 		dp_mon_err("Failed to send htt srng message for Tx mon dst ring");
474*5113495bSYour Name 		return status;
475*5113495bSYour Name 	}
476*5113495bSYour Name 
477*5113495bSYour Name 	return status;
478*5113495bSYour Name }
479*5113495bSYour Name #else
480*5113495bSYour Name /* This is for WIN case */
dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc * soc,struct dp_pdev * pdev,int mac_id,int mac_for_pdev)481*5113495bSYour Name QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc,
482*5113495bSYour Name 					  struct dp_pdev *pdev,
483*5113495bSYour Name 					  int mac_id,
484*5113495bSYour Name 					  int mac_for_pdev)
485*5113495bSYour Name {
486*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
487*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
488*5113495bSYour Name 	QDF_STATUS status;
489*5113495bSYour Name 
490*5113495bSYour Name 	if (!soc->rxdma_mon_dst_ring[mac_id].hal_srng)
491*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
492*5113495bSYour Name 
493*5113495bSYour Name 	status = dp_rx_mon_pdev_htt_srng_setup_2_0(soc, pdev, mac_id,
494*5113495bSYour Name 						   mac_for_pdev);
495*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
496*5113495bSYour Name 		dp_mon_err("Failed to send htt srng setup message for Rxdma dst ring");
497*5113495bSYour Name 		return status;
498*5113495bSYour Name 	}
499*5113495bSYour Name 
500*5113495bSYour Name 	if (!mon_soc_be->tx_mon_dst_ring[mac_id].hal_srng)
501*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
502*5113495bSYour Name 
503*5113495bSYour Name 	status = dp_tx_mon_pdev_htt_srng_setup_2_0(soc, pdev, mac_id,
504*5113495bSYour Name 						   mac_for_pdev);
505*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
506*5113495bSYour Name 		dp_mon_err("Failed to send htt srng message for Tx mon dst ring");
507*5113495bSYour Name 		return status;
508*5113495bSYour Name 	}
509*5113495bSYour Name 
510*5113495bSYour Name 	return status;
511*5113495bSYour Name }
512*5113495bSYour Name #endif
513*5113495bSYour Name 
514*5113495bSYour Name static
dp_rx_mon_refill_buf_ring_2_0(struct dp_intr * int_ctx)515*5113495bSYour Name QDF_STATUS dp_rx_mon_refill_buf_ring_2_0(struct dp_intr *int_ctx)
516*5113495bSYour Name {
517*5113495bSYour Name 	struct dp_soc *soc  = int_ctx->soc;
518*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
519*5113495bSYour Name 	union dp_mon_desc_list_elem_t *desc_list = NULL;
520*5113495bSYour Name 	union dp_mon_desc_list_elem_t *tail = NULL;
521*5113495bSYour Name 	struct dp_srng *rx_mon_buf_ring;
522*5113495bSYour Name 	struct dp_intr_stats *intr_stats = &int_ctx->intr_stats;
523*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
524*5113495bSYour Name 	uint32_t num_entries_avail, num_entries, num_entries_in_ring;
525*5113495bSYour Name 	int sync_hw_ptr = 1, hp = 0, tp = 0;
526*5113495bSYour Name 	void *hal_srng;
527*5113495bSYour Name 
528*5113495bSYour Name 	rx_mon_buf_ring = &soc->rxdma_mon_buf_ring[0];
529*5113495bSYour Name 	hal_srng = rx_mon_buf_ring->hal_srng;
530*5113495bSYour Name 
531*5113495bSYour Name 	intr_stats->num_host2rxdma_ring_masks++;
532*5113495bSYour Name 	mon_soc_be->rx_low_thresh_intrs++;
533*5113495bSYour Name 	hal_srng_access_start(soc->hal_soc, hal_srng);
534*5113495bSYour Name 	num_entries_avail = hal_srng_src_num_avail(soc->hal_soc,
535*5113495bSYour Name 						   hal_srng,
536*5113495bSYour Name 						   sync_hw_ptr);
537*5113495bSYour Name 	num_entries_in_ring = rx_mon_buf_ring->num_entries - num_entries_avail;
538*5113495bSYour Name 	hal_get_sw_hptp(soc->hal_soc, (hal_ring_handle_t)hal_srng, &tp, &hp);
539*5113495bSYour Name 	hal_srng_access_end(soc->hal_soc, hal_srng);
540*5113495bSYour Name 
541*5113495bSYour Name 	if (num_entries_avail) {
542*5113495bSYour Name 		if (num_entries_in_ring < mon_soc_be->rx_mon_ring_fill_level)
543*5113495bSYour Name 			num_entries = mon_soc_be->rx_mon_ring_fill_level
544*5113495bSYour Name 				      - num_entries_in_ring;
545*5113495bSYour Name 		else
546*5113495bSYour Name 			return QDF_STATUS_SUCCESS;
547*5113495bSYour Name 
548*5113495bSYour Name 		dp_mon_buffers_replenish(soc, rx_mon_buf_ring,
549*5113495bSYour Name 					 &mon_soc_be->rx_desc_mon,
550*5113495bSYour Name 					 num_entries, &desc_list, &tail,
551*5113495bSYour Name 					 NULL);
552*5113495bSYour Name 	}
553*5113495bSYour Name 
554*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
555*5113495bSYour Name }
556*5113495bSYour Name 
dp_mon_soc_detach_2_0(struct dp_soc * soc)557*5113495bSYour Name QDF_STATUS dp_mon_soc_detach_2_0(struct dp_soc *soc)
558*5113495bSYour Name {
559*5113495bSYour Name 	dp_rx_mon_soc_detach_2_0(soc, 0);
560*5113495bSYour Name 	dp_tx_mon_soc_detach_2_0(soc, 0);
561*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
562*5113495bSYour Name }
563*5113495bSYour Name 
dp_mon_soc_deinit_2_0(struct dp_soc * soc)564*5113495bSYour Name void dp_mon_soc_deinit_2_0(struct dp_soc *soc)
565*5113495bSYour Name {
566*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
567*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be =
568*5113495bSYour Name 		dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
569*5113495bSYour Name 
570*5113495bSYour Name 	if (!mon_soc_be->is_dp_mon_soc_initialized)
571*5113495bSYour Name 		return;
572*5113495bSYour Name 
573*5113495bSYour Name 	dp_rx_mon_soc_deinit_2_0(soc, 0);
574*5113495bSYour Name 	dp_tx_mon_soc_deinit_2_0(soc, 0);
575*5113495bSYour Name 
576*5113495bSYour Name 	mon_soc_be->is_dp_mon_soc_initialized = false;
577*5113495bSYour Name }
578*5113495bSYour Name 
dp_mon_soc_init_2_0(struct dp_soc * soc)579*5113495bSYour Name QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc)
580*5113495bSYour Name {
581*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
582*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be =
583*5113495bSYour Name 		dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
584*5113495bSYour Name 
585*5113495bSYour Name 	if (soc->rxdma_mon_buf_ring[0].hal_srng) {
586*5113495bSYour Name 		dp_mon_info("%pK: mon soc init is done", soc);
587*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
588*5113495bSYour Name 	}
589*5113495bSYour Name 
590*5113495bSYour Name 	if (dp_rx_mon_soc_init_2_0(soc)) {
591*5113495bSYour Name 		dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc);
592*5113495bSYour Name 		goto fail;
593*5113495bSYour Name 	}
594*5113495bSYour Name 
595*5113495bSYour Name 	if (dp_tx_mon_soc_init_2_0(soc)) {
596*5113495bSYour Name 		dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc);
597*5113495bSYour Name 		goto fail;
598*5113495bSYour Name 	}
599*5113495bSYour Name 
600*5113495bSYour Name 	mon_soc_be->tx_mon_ring_fill_level = 0;
601*5113495bSYour Name 	if (soc->rxdma_mon_buf_ring[0].num_entries < DP_MON_RING_FILL_LEVEL_DEFAULT)
602*5113495bSYour Name 		mon_soc_be->rx_mon_ring_fill_level = soc->rxdma_mon_buf_ring[0].num_entries;
603*5113495bSYour Name 	else
604*5113495bSYour Name 		mon_soc_be->rx_mon_ring_fill_level = DP_MON_RING_FILL_LEVEL_DEFAULT;
605*5113495bSYour Name 
606*5113495bSYour Name 	mon_soc_be->is_dp_mon_soc_initialized = true;
607*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
608*5113495bSYour Name fail:
609*5113495bSYour Name 	dp_mon_soc_deinit_2_0(soc);
610*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
611*5113495bSYour Name }
612*5113495bSYour Name 
dp_mon_soc_attach_2_0(struct dp_soc * soc)613*5113495bSYour Name QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc)
614*5113495bSYour Name {
615*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
616*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be =
617*5113495bSYour Name 		dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
618*5113495bSYour Name 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
619*5113495bSYour Name 
620*5113495bSYour Name 	soc_cfg_ctx = soc->wlan_cfg_ctx;
621*5113495bSYour Name 	if (!mon_soc_be) {
622*5113495bSYour Name 		dp_mon_err("DP MON SOC is NULL");
623*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
624*5113495bSYour Name 	}
625*5113495bSYour Name 
626*5113495bSYour Name 	if (dp_rx_mon_soc_attach_2_0(soc, 0)) {
627*5113495bSYour Name 		dp_mon_err("%pK: " RNG_ERR "rx_mon_buf_ring", soc);
628*5113495bSYour Name 		goto fail;
629*5113495bSYour Name 	}
630*5113495bSYour Name 
631*5113495bSYour Name 	if (dp_tx_mon_soc_attach_2_0(soc, 0)) {
632*5113495bSYour Name 		dp_mon_err("%pK: " RNG_ERR "tx_mon_buf_ring", soc);
633*5113495bSYour Name 		goto fail;
634*5113495bSYour Name 	}
635*5113495bSYour Name 
636*5113495bSYour Name 	/* allocate sw desc pool */
637*5113495bSYour Name 	if (dp_rx_mon_buf_desc_pool_alloc(soc)) {
638*5113495bSYour Name 		dp_mon_err("%pK: Rx mon desc pool allocation failed", soc);
639*5113495bSYour Name 		goto fail;
640*5113495bSYour Name 	}
641*5113495bSYour Name 
642*5113495bSYour Name 	if (dp_tx_mon_buf_desc_pool_alloc(soc)) {
643*5113495bSYour Name 		dp_mon_err("%pK: Tx mon desc pool allocation failed", soc);
644*5113495bSYour Name 		goto fail;
645*5113495bSYour Name 	}
646*5113495bSYour Name 
647*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
648*5113495bSYour Name fail:
649*5113495bSYour Name 	dp_mon_soc_detach_2_0(soc);
650*5113495bSYour Name 	return QDF_STATUS_E_NOMEM;
651*5113495bSYour Name }
652*5113495bSYour Name 
653*5113495bSYour Name static
dp_mon_pdev_free_2_0(struct dp_pdev * pdev)654*5113495bSYour Name void dp_mon_pdev_free_2_0(struct dp_pdev *pdev)
655*5113495bSYour Name {
656*5113495bSYour Name }
657*5113495bSYour Name 
658*5113495bSYour Name static
dp_mon_pdev_alloc_2_0(struct dp_pdev * pdev)659*5113495bSYour Name QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev)
660*5113495bSYour Name {
661*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
662*5113495bSYour Name 	struct dp_mon_pdev_be *mon_pdev_be =
663*5113495bSYour Name 			dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
664*5113495bSYour Name 
665*5113495bSYour Name 	if (!mon_pdev_be) {
666*5113495bSYour Name 		dp_mon_err("DP MON PDEV is NULL");
667*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
668*5113495bSYour Name 	}
669*5113495bSYour Name 
670*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
671*5113495bSYour Name }
672*5113495bSYour Name 
673*5113495bSYour Name #else
674*5113495bSYour Name static inline
dp_mon_htt_srng_setup_2_0(struct dp_soc * soc,struct dp_pdev * pdev,int mac_id,int mac_for_pdev)675*5113495bSYour Name QDF_STATUS dp_mon_htt_srng_setup_2_0(struct dp_soc *soc,
676*5113495bSYour Name 				     struct dp_pdev *pdev,
677*5113495bSYour Name 				     int mac_id,
678*5113495bSYour Name 				     int mac_for_pdev)
679*5113495bSYour Name {
680*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
681*5113495bSYour Name }
682*5113495bSYour Name 
683*5113495bSYour Name static uint32_t
dp_tx_mon_process_2_0(struct dp_soc * soc,struct dp_intr * int_ctx,uint32_t mac_id,uint32_t quota)684*5113495bSYour Name dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
685*5113495bSYour Name 		      uint32_t mac_id, uint32_t quota)
686*5113495bSYour Name {
687*5113495bSYour Name 	return 0;
688*5113495bSYour Name }
689*5113495bSYour Name 
690*5113495bSYour Name static inline
dp_mon_soc_attach_2_0(struct dp_soc * soc)691*5113495bSYour Name QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc)
692*5113495bSYour Name {
693*5113495bSYour Name 	return status;
694*5113495bSYour Name }
695*5113495bSYour Name 
696*5113495bSYour Name static inline
dp_mon_soc_detach_2_0(struct dp_soc * soc)697*5113495bSYour Name QDF_STATUS dp_mon_soc_detach_2_0(struct dp_soc *soc)
698*5113495bSYour Name {
699*5113495bSYour Name 	return status;
700*5113495bSYour Name }
701*5113495bSYour Name 
702*5113495bSYour Name static inline
dp_pdev_mon_rings_deinit_2_0(struct dp_pdev * pdev)703*5113495bSYour Name void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev)
704*5113495bSYour Name {
705*5113495bSYour Name }
706*5113495bSYour Name 
707*5113495bSYour Name static inline
dp_pdev_mon_rings_init_2_0(struct dp_soc * soc,struct dp_pdev * pdev)708*5113495bSYour Name QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_soc *soc, struct dp_pdev *pdev)
709*5113495bSYour Name {
710*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
711*5113495bSYour Name }
712*5113495bSYour Name 
713*5113495bSYour Name static inline
dp_pdev_mon_rings_free_2_0(struct dp_pdev * pdev)714*5113495bSYour Name void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev)
715*5113495bSYour Name {
716*5113495bSYour Name }
717*5113495bSYour Name 
718*5113495bSYour Name static inline
dp_pdev_mon_rings_alloc_2_0(struct dp_soc * soc,struct dp_pdev * pdev)719*5113495bSYour Name QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_soc *soc, struct dp_pdev *pdev)
720*5113495bSYour Name {
721*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
722*5113495bSYour Name }
723*5113495bSYour Name 
724*5113495bSYour Name static inline
dp_mon_pdev_free_2_0(struct dp_pdev * pdev)725*5113495bSYour Name void dp_mon_pdev_free_2_0(struct dp_pdev *pdev)
726*5113495bSYour Name {
727*5113495bSYour Name }
728*5113495bSYour Name 
729*5113495bSYour Name static inline
dp_mon_pdev_alloc_2_0(struct dp_pdev * pdev)730*5113495bSYour Name QDF_STATUS dp_mon_pdev_alloc_2_0(struct dp_pdev *pdev)
731*5113495bSYour Name {
732*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
733*5113495bSYour Name }
734*5113495bSYour Name 
735*5113495bSYour Name static inline
dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev * pdev)736*5113495bSYour Name void dp_vdev_set_monitor_mode_buf_rings_2_0(struct dp_pdev *pdev)
737*5113495bSYour Name {
738*5113495bSYour Name }
739*5113495bSYour Name 
740*5113495bSYour Name static inline
dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev * pdev,uint8_t delayed_replenish)741*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev,
742*5113495bSYour Name 					      uint8_t delayed_replenish)
743*5113495bSYour Name {
744*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
745*5113495bSYour Name }
746*5113495bSYour Name #endif
747*5113495bSYour Name 
dp_pdev_mon_rings_deinit_2_0(struct dp_pdev * pdev)748*5113495bSYour Name void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev)
749*5113495bSYour Name {
750*5113495bSYour Name 	int mac_id = 0;
751*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
752*5113495bSYour Name 
753*5113495bSYour Name 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
754*5113495bSYour Name 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
755*5113495bSYour Name 							 pdev->pdev_id);
756*5113495bSYour Name 
757*5113495bSYour Name 		dp_rx_mon_pdev_rings_deinit_2_0(pdev, lmac_id);
758*5113495bSYour Name 		dp_tx_mon_pdev_rings_deinit_2_0(pdev, lmac_id);
759*5113495bSYour Name 	}
760*5113495bSYour Name }
761*5113495bSYour Name 
dp_pdev_mon_rings_init_2_0(struct dp_pdev * pdev)762*5113495bSYour Name QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_pdev *pdev)
763*5113495bSYour Name {
764*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
765*5113495bSYour Name 	int mac_id = 0;
766*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
767*5113495bSYour Name 
768*5113495bSYour Name 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
769*5113495bSYour Name 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
770*5113495bSYour Name 							 pdev->pdev_id);
771*5113495bSYour Name 
772*5113495bSYour Name 		status = dp_rx_mon_pdev_rings_init_2_0(pdev, lmac_id);
773*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
774*5113495bSYour Name 			dp_mon_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", soc);
775*5113495bSYour Name 			goto fail;
776*5113495bSYour Name 		}
777*5113495bSYour Name 
778*5113495bSYour Name 		status = dp_tx_mon_pdev_rings_init_2_0(pdev, lmac_id);
779*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
780*5113495bSYour Name 			dp_mon_err("%pK: " RNG_ERR "tx_mon_dst_ring", soc);
781*5113495bSYour Name 			goto fail;
782*5113495bSYour Name 		}
783*5113495bSYour Name 	}
784*5113495bSYour Name 	return status;
785*5113495bSYour Name 
786*5113495bSYour Name fail:
787*5113495bSYour Name 	dp_pdev_mon_rings_deinit_2_0(pdev);
788*5113495bSYour Name 	return status;
789*5113495bSYour Name }
790*5113495bSYour Name 
dp_pdev_mon_rings_free_2_0(struct dp_pdev * pdev)791*5113495bSYour Name void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev)
792*5113495bSYour Name {
793*5113495bSYour Name 	int mac_id = 0;
794*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
795*5113495bSYour Name 
796*5113495bSYour Name 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
797*5113495bSYour Name 		int lmac_id = dp_get_lmac_id_for_pdev_id(soc, mac_id,
798*5113495bSYour Name 							 pdev->pdev_id);
799*5113495bSYour Name 
800*5113495bSYour Name 		dp_rx_mon_pdev_rings_free_2_0(pdev, lmac_id);
801*5113495bSYour Name 		dp_tx_mon_pdev_rings_free_2_0(pdev, lmac_id);
802*5113495bSYour Name 	}
803*5113495bSYour Name }
804*5113495bSYour Name 
dp_pdev_mon_rings_alloc_2_0(struct dp_pdev * pdev)805*5113495bSYour Name QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_pdev *pdev)
806*5113495bSYour Name {
807*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
808*5113495bSYour Name 	int mac_id = 0;
809*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
810*5113495bSYour Name 
811*5113495bSYour Name 	for (mac_id = 0; mac_id < DP_NUM_MACS_PER_PDEV; mac_id++) {
812*5113495bSYour Name 		int lmac_id =
813*5113495bSYour Name 		dp_get_lmac_id_for_pdev_id(soc, mac_id, pdev->pdev_id);
814*5113495bSYour Name 
815*5113495bSYour Name 		status = dp_rx_mon_pdev_rings_alloc_2_0(pdev, lmac_id);
816*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
817*5113495bSYour Name 			dp_err("%pK: " RNG_ERR "rxdma_mon_dst_ring", pdev);
818*5113495bSYour Name 			goto fail;
819*5113495bSYour Name 		}
820*5113495bSYour Name 
821*5113495bSYour Name 		status = dp_tx_mon_pdev_rings_alloc_2_0(pdev, lmac_id);
822*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
823*5113495bSYour Name 			dp_err("%pK: " RNG_ERR "tx_mon_dst_ring", pdev);
824*5113495bSYour Name 			goto fail;
825*5113495bSYour Name 		}
826*5113495bSYour Name 	}
827*5113495bSYour Name 	return status;
828*5113495bSYour Name 
829*5113495bSYour Name fail:
830*5113495bSYour Name 	dp_pdev_mon_rings_free_2_0(pdev);
831*5113495bSYour Name 	return status;
832*5113495bSYour Name }
833*5113495bSYour Name 
dp_mon_pool_frag_unmap_and_free(struct dp_soc * soc,struct dp_mon_desc_pool * mon_desc_pool)834*5113495bSYour Name void dp_mon_pool_frag_unmap_and_free(struct dp_soc *soc,
835*5113495bSYour Name 				     struct dp_mon_desc_pool *mon_desc_pool)
836*5113495bSYour Name {
837*5113495bSYour Name 	int desc_id;
838*5113495bSYour Name 	qdf_frag_t vaddr;
839*5113495bSYour Name 	qdf_dma_addr_t paddr;
840*5113495bSYour Name 
841*5113495bSYour Name 	qdf_spin_lock_bh(&mon_desc_pool->lock);
842*5113495bSYour Name 	for (desc_id = 0; desc_id < mon_desc_pool->pool_size; desc_id++) {
843*5113495bSYour Name 		if (mon_desc_pool->array[desc_id].mon_desc.in_use) {
844*5113495bSYour Name 			vaddr = mon_desc_pool->array[desc_id].mon_desc.buf_addr;
845*5113495bSYour Name 			paddr = mon_desc_pool->array[desc_id].mon_desc.paddr;
846*5113495bSYour Name 
847*5113495bSYour Name 			if (!(mon_desc_pool->array[desc_id].mon_desc.unmapped)) {
848*5113495bSYour Name 				qdf_mem_unmap_page(soc->osdev, paddr,
849*5113495bSYour Name 						   mon_desc_pool->buf_size,
850*5113495bSYour Name 						   QDF_DMA_FROM_DEVICE);
851*5113495bSYour Name 				mon_desc_pool->array[desc_id].mon_desc.unmapped = 1;
852*5113495bSYour Name 				mon_desc_pool->array[desc_id].mon_desc.cookie = desc_id;
853*5113495bSYour Name 			}
854*5113495bSYour Name 			qdf_frag_free(vaddr);
855*5113495bSYour Name 		}
856*5113495bSYour Name 	}
857*5113495bSYour Name 	qdf_spin_unlock_bh(&mon_desc_pool->lock);
858*5113495bSYour Name }
859*5113495bSYour Name 
860*5113495bSYour Name QDF_STATUS
dp_mon_buffers_replenish(struct dp_soc * dp_soc,struct dp_srng * dp_mon_srng,struct dp_mon_desc_pool * mon_desc_pool,uint32_t num_req_buffers,union dp_mon_desc_list_elem_t ** desc_list,union dp_mon_desc_list_elem_t ** tail,uint32_t * replenish_cnt_ref)861*5113495bSYour Name dp_mon_buffers_replenish(struct dp_soc *dp_soc,
862*5113495bSYour Name 			 struct dp_srng *dp_mon_srng,
863*5113495bSYour Name 			 struct dp_mon_desc_pool *mon_desc_pool,
864*5113495bSYour Name 			 uint32_t num_req_buffers,
865*5113495bSYour Name 			 union dp_mon_desc_list_elem_t **desc_list,
866*5113495bSYour Name 			 union dp_mon_desc_list_elem_t **tail,
867*5113495bSYour Name 			 uint32_t *replenish_cnt_ref)
868*5113495bSYour Name {
869*5113495bSYour Name 	uint32_t num_alloc_desc;
870*5113495bSYour Name 	uint32_t num_entries_avail;
871*5113495bSYour Name 	uint32_t count = 0;
872*5113495bSYour Name 	int sync_hw_ptr = 1;
873*5113495bSYour Name 	struct dp_mon_desc mon_desc = {0};
874*5113495bSYour Name 	void *mon_ring_entry;
875*5113495bSYour Name 	union dp_mon_desc_list_elem_t *next;
876*5113495bSYour Name 	void *mon_srng;
877*5113495bSYour Name 	unsigned long long desc;
878*5113495bSYour Name 	QDF_STATUS ret = QDF_STATUS_E_FAILURE;
879*5113495bSYour Name 	struct dp_mon_soc *mon_soc = dp_soc->monitor_soc;
880*5113495bSYour Name 
881*5113495bSYour Name 	if (!num_req_buffers) {
882*5113495bSYour Name 		dp_mon_debug("%pK: Received request for 0 buffers replenish",
883*5113495bSYour Name 			     dp_soc);
884*5113495bSYour Name 		ret = QDF_STATUS_E_INVAL;
885*5113495bSYour Name 		goto free_desc;
886*5113495bSYour Name 	}
887*5113495bSYour Name 
888*5113495bSYour Name 	mon_srng = dp_mon_srng->hal_srng;
889*5113495bSYour Name 
890*5113495bSYour Name 	hal_srng_access_start(dp_soc->hal_soc, mon_srng);
891*5113495bSYour Name 
892*5113495bSYour Name 	num_entries_avail = hal_srng_src_num_avail(dp_soc->hal_soc,
893*5113495bSYour Name 						   mon_srng, sync_hw_ptr);
894*5113495bSYour Name 
895*5113495bSYour Name 	if (!num_entries_avail) {
896*5113495bSYour Name 		hal_srng_access_end(dp_soc->hal_soc, mon_srng);
897*5113495bSYour Name 		goto free_desc;
898*5113495bSYour Name 	}
899*5113495bSYour Name 	if (num_entries_avail < num_req_buffers)
900*5113495bSYour Name 		num_req_buffers = num_entries_avail;
901*5113495bSYour Name 
902*5113495bSYour Name 	/*
903*5113495bSYour Name 	 * if desc_list is NULL, allocate the descs from freelist
904*5113495bSYour Name 	 */
905*5113495bSYour Name 	if (!(*desc_list)) {
906*5113495bSYour Name 		num_alloc_desc = dp_mon_get_free_desc_list(dp_soc,
907*5113495bSYour Name 							   mon_desc_pool,
908*5113495bSYour Name 							   num_req_buffers,
909*5113495bSYour Name 							   desc_list,
910*5113495bSYour Name 							   tail);
911*5113495bSYour Name 
912*5113495bSYour Name 		if (!num_alloc_desc) {
913*5113495bSYour Name 			dp_mon_debug("%pK: no free rx_descs in freelist", dp_soc);
914*5113495bSYour Name 			hal_srng_access_end(dp_soc->hal_soc, mon_srng);
915*5113495bSYour Name 			return QDF_STATUS_E_NOMEM;
916*5113495bSYour Name 		}
917*5113495bSYour Name 
918*5113495bSYour Name 		dp_mon_info("%pK: %d rx desc allocated",
919*5113495bSYour Name 			    dp_soc, num_alloc_desc);
920*5113495bSYour Name 
921*5113495bSYour Name 		num_req_buffers = num_alloc_desc;
922*5113495bSYour Name 	}
923*5113495bSYour Name 
924*5113495bSYour Name 	while (count <= num_req_buffers - 1) {
925*5113495bSYour Name 		ret = dp_mon_frag_alloc_and_map(dp_soc,
926*5113495bSYour Name 						&mon_desc,
927*5113495bSYour Name 						mon_desc_pool);
928*5113495bSYour Name 
929*5113495bSYour Name 		if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) {
930*5113495bSYour Name 			if (qdf_unlikely(ret  == QDF_STATUS_E_FAULT))
931*5113495bSYour Name 				continue;
932*5113495bSYour Name 			break;
933*5113495bSYour Name 		}
934*5113495bSYour Name 
935*5113495bSYour Name 		count++;
936*5113495bSYour Name 		next = (*desc_list)->next;
937*5113495bSYour Name 		mon_ring_entry = hal_srng_src_get_next(
938*5113495bSYour Name 						dp_soc->hal_soc,
939*5113495bSYour Name 						mon_srng);
940*5113495bSYour Name 
941*5113495bSYour Name 		if (!mon_ring_entry)
942*5113495bSYour Name 			break;
943*5113495bSYour Name 
944*5113495bSYour Name 		qdf_assert_always((*desc_list)->mon_desc.in_use == 0);
945*5113495bSYour Name 
946*5113495bSYour Name 		(*desc_list)->mon_desc.in_use = 1;
947*5113495bSYour Name 		(*desc_list)->mon_desc.unmapped = 0;
948*5113495bSYour Name 		(*desc_list)->mon_desc.buf_addr = mon_desc.buf_addr;
949*5113495bSYour Name 		(*desc_list)->mon_desc.paddr = mon_desc.paddr;
950*5113495bSYour Name 		(*desc_list)->mon_desc.magic = DP_MON_DESC_MAGIC;
951*5113495bSYour Name 		(*desc_list)->mon_desc.cookie_2++;
952*5113495bSYour Name 
953*5113495bSYour Name 		mon_soc->stats.frag_alloc++;
954*5113495bSYour Name 
955*5113495bSYour Name 		/* populate lower 40 bit mon_desc address in desc
956*5113495bSYour Name 		 * and cookie_2 in upper 24 bits
957*5113495bSYour Name 		 */
958*5113495bSYour Name 		desc = dp_mon_get_debug_desc_addr(desc_list);
959*5113495bSYour Name 		hal_mon_buff_addr_info_set(dp_soc->hal_soc,
960*5113495bSYour Name 					   mon_ring_entry,
961*5113495bSYour Name 					   desc,
962*5113495bSYour Name 					   mon_desc.paddr);
963*5113495bSYour Name 
964*5113495bSYour Name 		*desc_list = next;
965*5113495bSYour Name 	}
966*5113495bSYour Name 
967*5113495bSYour Name 	hal_srng_access_end(dp_soc->hal_soc, mon_srng);
968*5113495bSYour Name 	if (replenish_cnt_ref)
969*5113495bSYour Name 		*replenish_cnt_ref += count;
970*5113495bSYour Name 
971*5113495bSYour Name free_desc:
972*5113495bSYour Name 	/*
973*5113495bSYour Name 	 * add any available free desc back to the free list
974*5113495bSYour Name 	 */
975*5113495bSYour Name 	if (*desc_list) {
976*5113495bSYour Name 		dp_mon_add_desc_list_to_free_list(dp_soc, desc_list, tail,
977*5113495bSYour Name 						  mon_desc_pool);
978*5113495bSYour Name 	}
979*5113495bSYour Name 
980*5113495bSYour Name 	return ret;
981*5113495bSYour Name }
982*5113495bSYour Name 
dp_mon_desc_pool_alloc(struct dp_soc * soc,enum dp_ctxt_type ctx_type,uint32_t pool_size,struct dp_mon_desc_pool * mon_desc_pool)983*5113495bSYour Name QDF_STATUS dp_mon_desc_pool_alloc(struct dp_soc *soc,
984*5113495bSYour Name 				  enum dp_ctxt_type ctx_type,
985*5113495bSYour Name 				  uint32_t pool_size,
986*5113495bSYour Name 				  struct dp_mon_desc_pool *mon_desc_pool)
987*5113495bSYour Name {
988*5113495bSYour Name 	size_t mem_size;
989*5113495bSYour Name 
990*5113495bSYour Name 	mon_desc_pool->pool_size = pool_size - 1;
991*5113495bSYour Name 	mem_size = mon_desc_pool->pool_size *
992*5113495bSYour Name 			sizeof(union dp_mon_desc_list_elem_t);
993*5113495bSYour Name 	mon_desc_pool->array = dp_context_alloc_mem(soc, ctx_type, mem_size);
994*5113495bSYour Name 
995*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
996*5113495bSYour Name }
997*5113495bSYour Name 
dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev * pdev,uint16_t num_of_buffers)998*5113495bSYour Name QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev,
999*5113495bSYour Name 						     uint16_t num_of_buffers)
1000*5113495bSYour Name {
1001*5113495bSYour Name 	int tx_mon_max_entries;
1002*5113495bSYour Name 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
1003*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
1004*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1005*5113495bSYour Name 	struct dp_mon_soc_be *mon_soc_be =
1006*5113495bSYour Name 		dp_get_be_mon_soc_from_dp_mon_soc(mon_soc);
1007*5113495bSYour Name 	QDF_STATUS status;
1008*5113495bSYour Name 
1009*5113495bSYour Name 	if (!mon_soc_be) {
1010*5113495bSYour Name 		dp_mon_err("DP MON SOC is NULL");
1011*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1012*5113495bSYour Name 	}
1013*5113495bSYour Name 
1014*5113495bSYour Name 	soc_cfg_ctx = soc->wlan_cfg_ctx;
1015*5113495bSYour Name 	tx_mon_max_entries =
1016*5113495bSYour Name 		wlan_cfg_get_dp_soc_tx_mon_buf_ring_size(soc_cfg_ctx);
1017*5113495bSYour Name 
1018*5113495bSYour Name 	hal_set_low_threshold(mon_soc_be->tx_mon_buf_ring.hal_srng,
1019*5113495bSYour Name 			      tx_mon_max_entries >> 2);
1020*5113495bSYour Name 	status = htt_srng_setup(soc->htt_handle, 0,
1021*5113495bSYour Name 				mon_soc_be->tx_mon_buf_ring.hal_srng,
1022*5113495bSYour Name 				TX_MONITOR_BUF);
1023*5113495bSYour Name 
1024*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
1025*5113495bSYour Name 		dp_mon_err("Failed to send htt srng setup message for Tx mon buf ring");
1026*5113495bSYour Name 		return status;
1027*5113495bSYour Name 	}
1028*5113495bSYour Name 
1029*5113495bSYour Name 	if (mon_soc_be->tx_mon_ring_fill_level < num_of_buffers) {
1030*5113495bSYour Name 		if (dp_tx_mon_buffers_alloc(soc,
1031*5113495bSYour Name 					    (num_of_buffers -
1032*5113495bSYour Name 					     mon_soc_be->tx_mon_ring_fill_level))) {
1033*5113495bSYour Name 			dp_mon_err("%pK: Tx mon buffers allocation failed",
1034*5113495bSYour Name 				   soc);
1035*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
1036*5113495bSYour Name 		}
1037*5113495bSYour Name 		mon_soc_be->tx_mon_ring_fill_level +=
1038*5113495bSYour Name 					(num_of_buffers -
1039*5113495bSYour Name 					mon_soc_be->tx_mon_ring_fill_level);
1040*5113495bSYour Name 	}
1041*5113495bSYour Name 
1042*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1043*5113495bSYour Name }
1044*5113495bSYour Name 
1045*5113495bSYour Name #if defined(WDI_EVENT_ENABLE) &&\
1046*5113495bSYour Name 	(defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG) ||\
1047*5113495bSYour Name 	 defined(WLAN_FEATURE_PKT_CAPTURE_V2))
1048*5113495bSYour Name static inline
dp_mon_ppdu_stats_handler_register(struct dp_mon_soc * mon_soc)1049*5113495bSYour Name void dp_mon_ppdu_stats_handler_register(struct dp_mon_soc *mon_soc)
1050*5113495bSYour Name {
1051*5113495bSYour Name 	mon_soc->mon_ops->mon_ppdu_stats_ind_handler =
1052*5113495bSYour Name 					dp_ppdu_stats_ind_handler;
1053*5113495bSYour Name }
1054*5113495bSYour Name #else
1055*5113495bSYour Name static inline
dp_mon_ppdu_stats_handler_register(struct dp_mon_soc * mon_soc)1056*5113495bSYour Name void dp_mon_ppdu_stats_handler_register(struct dp_mon_soc *mon_soc)
1057*5113495bSYour Name {
1058*5113495bSYour Name }
1059*5113495bSYour Name #endif
1060*5113495bSYour Name 
dp_mon_register_intr_ops_2_0(struct dp_soc * soc)1061*5113495bSYour Name static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc)
1062*5113495bSYour Name {
1063*5113495bSYour Name 	struct dp_mon_soc *mon_soc = soc->monitor_soc;
1064*5113495bSYour Name 
1065*5113495bSYour Name 	mon_soc->mon_ops->rx_mon_refill_buf_ring =
1066*5113495bSYour Name 			dp_rx_mon_refill_buf_ring_2_0,
1067*5113495bSYour Name 	mon_soc->mon_ops->tx_mon_refill_buf_ring =
1068*5113495bSYour Name 			NULL,
1069*5113495bSYour Name 	mon_soc->mon_rx_process = dp_rx_mon_process_2_0;
1070*5113495bSYour Name 	dp_mon_ppdu_stats_handler_register(mon_soc);
1071*5113495bSYour Name }
1072*5113495bSYour Name 
1073*5113495bSYour Name #ifdef MONITOR_TLV_RECORDING_ENABLE
1074*5113495bSYour Name /**
1075*5113495bSYour Name  * dp_mon_pdev_initialize_tlv_logger() - initialize dp_mon_tlv_logger for
1076*5113495bSYour Name  *					Rx and Tx
1077*5113495bSYour Name  *
1078*5113495bSYour Name  * @tlv_logger : double pointer to dp_mon_tlv_logger
1079*5113495bSYour Name  * @direction: Rx/Tx
1080*5113495bSYour Name  * Return: QDF_STATUS
1081*5113495bSYour Name  */
1082*5113495bSYour Name static QDF_STATUS
dp_mon_pdev_initialize_tlv_logger(struct dp_mon_tlv_logger ** tlv_logger,uint8_t direction)1083*5113495bSYour Name dp_mon_pdev_initialize_tlv_logger(struct dp_mon_tlv_logger **tlv_logger,
1084*5113495bSYour Name 				  uint8_t direction)
1085*5113495bSYour Name {
1086*5113495bSYour Name 	struct dp_mon_tlv_logger *tlv_log = NULL;
1087*5113495bSYour Name 
1088*5113495bSYour Name 	tlv_log = qdf_mem_malloc(sizeof(struct dp_mon_tlv_logger));
1089*5113495bSYour Name 	if (!tlv_log) {
1090*5113495bSYour Name 		dp_mon_err("Memory allocation failed");
1091*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1092*5113495bSYour Name 	}
1093*5113495bSYour Name 
1094*5113495bSYour Name 	if (direction == MONITOR_TLV_RECORDING_RX)
1095*5113495bSYour Name 		tlv_log->buff = qdf_mem_malloc(MAX_TLV_LOGGING_SIZE *
1096*5113495bSYour Name 					sizeof(struct dp_mon_tlv_info));
1097*5113495bSYour Name 	else if (direction == MONITOR_TLV_RECORDING_TX)
1098*5113495bSYour Name 		tlv_log->buff = qdf_mem_malloc(MAX_TLV_LOGGING_SIZE *
1099*5113495bSYour Name 					sizeof(struct dp_tx_mon_tlv_info));
1100*5113495bSYour Name 
1101*5113495bSYour Name 	if (!tlv_log->buff) {
1102*5113495bSYour Name 		dp_mon_err("Memory allocation failed");
1103*5113495bSYour Name 		qdf_mem_free(tlv_log);
1104*5113495bSYour Name 		tlv_log = NULL;
1105*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1106*5113495bSYour Name 	}
1107*5113495bSYour Name 
1108*5113495bSYour Name 	tlv_log->curr_ppdu_pos = 0;
1109*5113495bSYour Name 	tlv_log->wrap_flag = 0;
1110*5113495bSYour Name 	tlv_log->ppdu_start_idx = 0;
1111*5113495bSYour Name 	tlv_log->mpdu_idx = MAX_PPDU_START_TLV_NUM;
1112*5113495bSYour Name 	tlv_log->ppdu_end_idx = MAX_PPDU_START_TLV_NUM + MAX_MPDU_TLV_NUM;
1113*5113495bSYour Name 	tlv_log->max_ppdu_start_idx = MAX_PPDU_START_TLV_NUM - 1;
1114*5113495bSYour Name 	tlv_log->max_mpdu_idx = MAX_PPDU_START_TLV_NUM + MAX_MPDU_TLV_NUM - 1;
1115*5113495bSYour Name 	tlv_log->max_ppdu_end_idx = MAX_TLVS_PER_PPDU - 1;
1116*5113495bSYour Name 
1117*5113495bSYour Name 	tlv_log->tlv_logging_enable = 1;
1118*5113495bSYour Name 	*tlv_logger = tlv_log;
1119*5113495bSYour Name 
1120*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1121*5113495bSYour Name }
1122*5113495bSYour Name 
1123*5113495bSYour Name /*
1124*5113495bSYour Name  * dp_mon_pdev_tlv_logger_init() - initializes struct dp_mon_tlv_logger
1125*5113495bSYour Name  *
1126*5113495bSYour Name  * @pdev: pointer to dp_pdev
1127*5113495bSYour Name  *
1128*5113495bSYour Name  * Return: QDF_STATUS
1129*5113495bSYour Name  */
1130*5113495bSYour Name static
dp_mon_pdev_tlv_logger_init(struct dp_pdev * pdev)1131*5113495bSYour Name QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev)
1132*5113495bSYour Name {
1133*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = NULL;
1134*5113495bSYour Name 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
1135*5113495bSYour Name 	struct dp_soc *soc = NULL;
1136*5113495bSYour Name 
1137*5113495bSYour Name 	if (!pdev)
1138*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1139*5113495bSYour Name 
1140*5113495bSYour Name 	soc = pdev->soc;
1141*5113495bSYour Name 	mon_pdev = pdev->monitor_pdev;
1142*5113495bSYour Name 	if (!mon_pdev)
1143*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1144*5113495bSYour Name 
1145*5113495bSYour Name 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1146*5113495bSYour Name 
1147*5113495bSYour Name 	if (dp_mon_pdev_initialize_tlv_logger(&mon_pdev_be->rx_tlv_log,
1148*5113495bSYour Name 					      MONITOR_TLV_RECORDING_RX))
1149*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1150*5113495bSYour Name 
1151*5113495bSYour Name 	if (dp_mon_pdev_initialize_tlv_logger(&mon_pdev_be->tx_tlv_log,
1152*5113495bSYour Name 					      MONITOR_TLV_RECORDING_TX))
1153*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1154*5113495bSYour Name 
1155*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1156*5113495bSYour Name }
1157*5113495bSYour Name 
1158*5113495bSYour Name /**
1159*5113495bSYour Name  * dp_mon_pdev_deinitialize_tlv_logger() - deinitialize dp_mon_tlv_logger for
1160*5113495bSYour Name  *					Rx and Tx
1161*5113495bSYour Name  *
1162*5113495bSYour Name  * @tlv_logger : double pointer to dp_mon_tlv_logger
1163*5113495bSYour Name  *
1164*5113495bSYour Name  * Return: QDF_STATUS
1165*5113495bSYour Name  */
1166*5113495bSYour Name static QDF_STATUS
dp_mon_pdev_deinitialize_tlv_logger(struct dp_mon_tlv_logger ** tlv_logger)1167*5113495bSYour Name dp_mon_pdev_deinitialize_tlv_logger(struct dp_mon_tlv_logger **tlv_logger)
1168*5113495bSYour Name {
1169*5113495bSYour Name 	struct dp_mon_tlv_logger *tlv_log = *tlv_logger;
1170*5113495bSYour Name 
1171*5113495bSYour Name 	if (!tlv_log)
1172*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1173*5113495bSYour Name 	if (!(tlv_log->buff))
1174*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1175*5113495bSYour Name 
1176*5113495bSYour Name 	tlv_log->tlv_logging_enable = 0;
1177*5113495bSYour Name 	qdf_mem_free(tlv_log->buff);
1178*5113495bSYour Name 	tlv_log->buff = NULL;
1179*5113495bSYour Name 	qdf_mem_free(tlv_log);
1180*5113495bSYour Name 	tlv_log = NULL;
1181*5113495bSYour Name 	*tlv_logger = NULL;
1182*5113495bSYour Name 
1183*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1184*5113495bSYour Name }
1185*5113495bSYour Name 
1186*5113495bSYour Name /*
1187*5113495bSYour Name  * dp_mon_pdev_tlv_logger_deinit() - deinitializes struct dp_mon_tlv_logger
1188*5113495bSYour Name  *
1189*5113495bSYour Name  * @pdev: pointer to dp_pdev
1190*5113495bSYour Name  *
1191*5113495bSYour Name  * Return: QDF_STATUS
1192*5113495bSYour Name  */
1193*5113495bSYour Name static
dp_mon_pdev_tlv_logger_deinit(struct dp_pdev * pdev)1194*5113495bSYour Name QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev)
1195*5113495bSYour Name {
1196*5113495bSYour Name 	struct dp_mon_pdev *mon_pdev = NULL;
1197*5113495bSYour Name 	struct dp_mon_pdev_be *mon_pdev_be = NULL;
1198*5113495bSYour Name 
1199*5113495bSYour Name 	if (!pdev)
1200*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1201*5113495bSYour Name 
1202*5113495bSYour Name 	mon_pdev = pdev->monitor_pdev;
1203*5113495bSYour Name 	if (!mon_pdev)
1204*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1205*5113495bSYour Name 
1206*5113495bSYour Name 	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
1207*5113495bSYour Name 
1208*5113495bSYour Name 	if (dp_mon_pdev_deinitialize_tlv_logger(&mon_pdev_be->rx_tlv_log))
1209*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1210*5113495bSYour Name 	if (dp_mon_pdev_deinitialize_tlv_logger(&mon_pdev_be->tx_tlv_log))
1211*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1212*5113495bSYour Name 
1213*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1214*5113495bSYour Name }
1215*5113495bSYour Name 
1216*5113495bSYour Name #else
1217*5113495bSYour Name 
1218*5113495bSYour Name static inline
dp_mon_pdev_tlv_logger_init(struct dp_pdev * pdev)1219*5113495bSYour Name QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev)
1220*5113495bSYour Name {
1221*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1222*5113495bSYour Name }
1223*5113495bSYour Name 
1224*5113495bSYour Name static inline
dp_mon_pdev_tlv_logger_deinit(struct dp_pdev * pdev)1225*5113495bSYour Name QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev)
1226*5113495bSYour Name {
1227*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1228*5113495bSYour Name }
1229*5113495bSYour Name 
1230*5113495bSYour Name #endif
1231*5113495bSYour Name 
1232*5113495bSYour Name /**
1233*5113495bSYour Name  * dp_mon_register_feature_ops_2_0() - register feature ops
1234*5113495bSYour Name  *
1235*5113495bSYour Name  * @soc: dp soc context
1236*5113495bSYour Name  *
1237*5113495bSYour Name  * @return: void
1238*5113495bSYour Name  */
1239*5113495bSYour Name static void
dp_mon_register_feature_ops_2_0(struct dp_soc * soc)1240*5113495bSYour Name dp_mon_register_feature_ops_2_0(struct dp_soc *soc)
1241*5113495bSYour Name {
1242*5113495bSYour Name 	struct dp_mon_ops *mon_ops = dp_mon_ops_get(soc);
1243*5113495bSYour Name 
1244*5113495bSYour Name 	if (!mon_ops) {
1245*5113495bSYour Name 		dp_err("mon_ops is NULL, feature ops registration failed");
1246*5113495bSYour Name 		return;
1247*5113495bSYour Name 	}
1248*5113495bSYour Name 
1249*5113495bSYour Name 	mon_ops->mon_config_debug_sniffer = dp_config_debug_sniffer;
1250*5113495bSYour Name 	mon_ops->mon_peer_tx_init = NULL;
1251*5113495bSYour Name 	mon_ops->mon_peer_tx_cleanup = NULL;
1252*5113495bSYour Name 	mon_ops->mon_htt_ppdu_stats_attach = dp_htt_ppdu_stats_attach;
1253*5113495bSYour Name 	mon_ops->mon_htt_ppdu_stats_detach = dp_htt_ppdu_stats_detach;
1254*5113495bSYour Name 	mon_ops->mon_print_pdev_rx_mon_stats = dp_print_pdev_rx_mon_stats;
1255*5113495bSYour Name 	mon_ops->mon_set_bsscolor = dp_mon_set_bsscolor;
1256*5113495bSYour Name 	mon_ops->mon_pdev_get_filter_ucast_data =
1257*5113495bSYour Name 					dp_lite_mon_get_filter_ucast_data;
1258*5113495bSYour Name 	mon_ops->mon_pdev_get_filter_mcast_data =
1259*5113495bSYour Name 					dp_lite_mon_get_filter_mcast_data;
1260*5113495bSYour Name 	mon_ops->mon_pdev_get_filter_non_data =
1261*5113495bSYour Name 					dp_lite_mon_get_filter_non_data;
1262*5113495bSYour Name 	mon_ops->mon_neighbour_peer_add_ast = NULL;
1263*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH_BE
1264*5113495bSYour Name 	mon_ops->mon_peer_tid_peer_id_update = NULL;
1265*5113495bSYour Name 	mon_ops->mon_tx_capture_debugfs_init = NULL;
1266*5113495bSYour Name 	mon_ops->mon_tx_add_to_comp_queue = NULL;
1267*5113495bSYour Name 	mon_ops->mon_print_pdev_tx_capture_stats =
1268*5113495bSYour Name 					dp_print_pdev_tx_monitor_stats_2_0;
1269*5113495bSYour Name 	mon_ops->mon_config_enh_tx_capture = dp_config_enh_tx_monitor_2_0;
1270*5113495bSYour Name 	mon_ops->mon_tx_peer_filter = dp_peer_set_tx_capture_enabled_2_0;
1271*5113495bSYour Name #endif
1272*5113495bSYour Name #if (defined(WIFI_MONITOR_SUPPORT) && defined(WLAN_TX_MON_CORE_DEBUG))
1273*5113495bSYour Name 	mon_ops->mon_peer_tid_peer_id_update = NULL;
1274*5113495bSYour Name 	mon_ops->mon_tx_capture_debugfs_init = NULL;
1275*5113495bSYour Name 	mon_ops->mon_tx_add_to_comp_queue = NULL;
1276*5113495bSYour Name 	mon_ops->mon_print_pdev_tx_capture_stats = NULL;
1277*5113495bSYour Name 	mon_ops->mon_config_enh_tx_capture = dp_config_enh_tx_core_monitor_2_0;
1278*5113495bSYour Name 	mon_ops->mon_tx_peer_filter = NULL;
1279*5113495bSYour Name #endif
1280*5113495bSYour Name #ifdef WLAN_RX_PKT_CAPTURE_ENH
1281*5113495bSYour Name 	mon_ops->mon_config_enh_rx_capture = NULL;
1282*5113495bSYour Name #endif
1283*5113495bSYour Name #ifdef QCA_SUPPORT_BPR
1284*5113495bSYour Name 	mon_ops->mon_set_bpr_enable = dp_set_bpr_enable_2_0;
1285*5113495bSYour Name #endif
1286*5113495bSYour Name #ifdef ATH_SUPPORT_NAC
1287*5113495bSYour Name 	mon_ops->mon_set_filter_neigh_peers = NULL;
1288*5113495bSYour Name #endif
1289*5113495bSYour Name #ifdef WLAN_ATF_ENABLE
1290*5113495bSYour Name 	mon_ops->mon_set_atf_stats_enable = dp_set_atf_stats_enable;
1291*5113495bSYour Name #endif
1292*5113495bSYour Name #ifdef FEATURE_NAC_RSSI
1293*5113495bSYour Name 	mon_ops->mon_filter_neighbour_peer = NULL;
1294*5113495bSYour Name #endif
1295*5113495bSYour Name #ifdef QCA_MCOPY_SUPPORT
1296*5113495bSYour Name 	mon_ops->mon_filter_setup_mcopy_mode = NULL;
1297*5113495bSYour Name 	mon_ops->mon_filter_reset_mcopy_mode = NULL;
1298*5113495bSYour Name 	mon_ops->mon_mcopy_check_deliver = NULL;
1299*5113495bSYour Name #endif
1300*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
1301*5113495bSYour Name 	mon_ops->mon_filter_setup_enhanced_stats =
1302*5113495bSYour Name 				dp_mon_filter_setup_enhanced_stats_2_0;
1303*5113495bSYour Name 	mon_ops->mon_filter_reset_enhanced_stats =
1304*5113495bSYour Name 				dp_mon_filter_reset_enhanced_stats_2_0;
1305*5113495bSYour Name 	mon_ops->mon_tx_enable_enhanced_stats =
1306*5113495bSYour Name 				dp_mon_tx_enable_enhanced_stats_2_0;
1307*5113495bSYour Name 	mon_ops->mon_tx_disable_enhanced_stats =
1308*5113495bSYour Name 				dp_mon_tx_disable_enhanced_stats_2_0;
1309*5113495bSYour Name 	mon_ops->mon_ppdu_stats_feat_enable_check =
1310*5113495bSYour Name 				dp_ppdu_stats_feat_enable_check_2_0;
1311*5113495bSYour Name 	mon_ops->mon_tx_stats_update = dp_mon_tx_stats_update_2_0;
1312*5113495bSYour Name 	mon_ops->mon_ppdu_desc_deliver = dp_ppdu_desc_deliver;
1313*5113495bSYour Name #ifdef WDI_EVENT_ENABLE
1314*5113495bSYour Name 	mon_ops->mon_ppdu_desc_notify = dp_ppdu_desc_notify_2_0;
1315*5113495bSYour Name #endif
1316*5113495bSYour Name #endif
1317*5113495bSYour Name #ifdef WLAN_RX_PKT_CAPTURE_ENH
1318*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_enh_capture = NULL;
1319*5113495bSYour Name #endif
1320*5113495bSYour Name #ifdef WDI_EVENT_ENABLE
1321*5113495bSYour Name 	mon_ops->mon_set_pktlog_wifi3 = dp_set_pktlog_wifi3;
1322*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_pkt_log_full =
1323*5113495bSYour Name 				dp_mon_filter_setup_rx_pkt_log_full_2_0;
1324*5113495bSYour Name 	mon_ops->mon_filter_reset_rx_pkt_log_full =
1325*5113495bSYour Name 				dp_mon_filter_reset_rx_pkt_log_full_2_0;
1326*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_pkt_log_lite =
1327*5113495bSYour Name 				dp_mon_filter_setup_rx_pkt_log_lite_2_0;
1328*5113495bSYour Name 	mon_ops->mon_filter_reset_rx_pkt_log_lite =
1329*5113495bSYour Name 				dp_mon_filter_reset_rx_pkt_log_lite_2_0;
1330*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_pkt_log_cbf =
1331*5113495bSYour Name 				dp_mon_filter_setup_rx_pkt_log_cbf_2_0;
1332*5113495bSYour Name 	mon_ops->mon_filter_reset_rx_pkt_log_cbf =
1333*5113495bSYour Name 				dp_mon_filter_reset_rx_pktlog_cbf_2_0;
1334*5113495bSYour Name #if defined(BE_PKTLOG_SUPPORT) && defined(WLAN_PKT_CAPTURE_TX_2_0)
1335*5113495bSYour Name 	mon_ops->mon_filter_setup_pktlog_hybrid =
1336*5113495bSYour Name 				dp_mon_filter_setup_pktlog_hybrid_2_0;
1337*5113495bSYour Name 	mon_ops->mon_filter_reset_pktlog_hybrid =
1338*5113495bSYour Name 				dp_mon_filter_reset_pktlog_hybrid_2_0;
1339*5113495bSYour Name #endif
1340*5113495bSYour Name #endif
1341*5113495bSYour Name #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG)
1342*5113495bSYour Name 	mon_ops->mon_pktlogmod_exit = dp_pktlogmod_exit;
1343*5113495bSYour Name #endif
1344*5113495bSYour Name 	mon_ops->rx_hdr_length_set = dp_rx_mon_hdr_length_set;
1345*5113495bSYour Name 	mon_ops->rx_packet_length_set = dp_rx_mon_packet_length_set;
1346*5113495bSYour Name 	mon_ops->rx_mon_enable = dp_rx_mon_enable_set;
1347*5113495bSYour Name 	mon_ops->rx_wmask_subscribe = dp_rx_mon_word_mask_subscribe;
1348*5113495bSYour Name 	mon_ops->rx_pkt_tlv_offset = dp_rx_mon_pkt_tlv_offset_subscribe;
1349*5113495bSYour Name 	mon_ops->rx_enable_mpdu_logging = dp_rx_mon_enable_mpdu_logging;
1350*5113495bSYour Name 	mon_ops->mon_neighbour_peers_detach = NULL;
1351*5113495bSYour Name 	mon_ops->mon_vdev_set_monitor_mode_buf_rings =
1352*5113495bSYour Name 				dp_vdev_set_monitor_mode_buf_rings_2_0;
1353*5113495bSYour Name 	mon_ops->mon_vdev_set_monitor_mode_rings =
1354*5113495bSYour Name 				dp_vdev_set_monitor_mode_rings_2_0;
1355*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
1356*5113495bSYour Name 	mon_ops->mon_rx_stats_update = dp_rx_mon_stats_update_2_0;
1357*5113495bSYour Name 	mon_ops->mon_rx_populate_ppdu_usr_info =
1358*5113495bSYour Name 			dp_rx_mon_populate_ppdu_usr_info_2_0;
1359*5113495bSYour Name 	mon_ops->mon_rx_populate_ppdu_info = dp_rx_mon_populate_ppdu_info_2_0;
1360*5113495bSYour Name #endif
1361*5113495bSYour Name #ifdef QCA_UNDECODED_METADATA_SUPPORT
1362*5113495bSYour Name 	mon_ops->mon_config_undecoded_metadata_capture =
1363*5113495bSYour Name 		dp_mon_config_undecoded_metadata_capture;
1364*5113495bSYour Name 	mon_ops->mon_filter_setup_undecoded_metadata_capture =
1365*5113495bSYour Name 		dp_mon_filter_setup_undecoded_metadata_capture_2_0;
1366*5113495bSYour Name 	mon_ops->mon_filter_reset_undecoded_metadata_capture =
1367*5113495bSYour Name 		dp_mon_filter_reset_undecoded_metadata_capture_2_0;
1368*5113495bSYour Name #endif
1369*5113495bSYour Name 	mon_ops->rx_enable_fpmo = dp_rx_mon_enable_fpmo;
1370*5113495bSYour Name 	mon_ops->mon_rx_print_advanced_stats =
1371*5113495bSYour Name 		dp_mon_rx_print_advanced_stats_2_0;
1372*5113495bSYour Name 	mon_ops->mon_mac_filter_set = NULL;
1373*5113495bSYour Name }
1374*5113495bSYour Name 
1375*5113495bSYour Name struct dp_mon_ops monitor_ops_2_0 = {
1376*5113495bSYour Name 	.mon_soc_cfg_init = dp_mon_soc_cfg_init,
1377*5113495bSYour Name 	.mon_soc_attach[0] = NULL,
1378*5113495bSYour Name 	.mon_soc_attach[1] = dp_mon_soc_attach_2_0,
1379*5113495bSYour Name 	.mon_soc_detach[0] = NULL,
1380*5113495bSYour Name 	.mon_soc_detach[1] = dp_mon_soc_detach_2_0,
1381*5113495bSYour Name 	.mon_soc_init[0] = NULL,
1382*5113495bSYour Name 	.mon_soc_init[1] = dp_mon_soc_init_2_0,
1383*5113495bSYour Name 	.mon_soc_deinit[0] = NULL,
1384*5113495bSYour Name 	.mon_soc_deinit[1] = dp_mon_soc_deinit_2_0,
1385*5113495bSYour Name 	.mon_pdev_alloc = dp_mon_pdev_alloc_2_0,
1386*5113495bSYour Name 	.mon_pdev_free = dp_mon_pdev_free_2_0,
1387*5113495bSYour Name 	.mon_pdev_attach = dp_mon_pdev_attach,
1388*5113495bSYour Name 	.mon_pdev_detach = dp_mon_pdev_detach,
1389*5113495bSYour Name 	.mon_pdev_init = dp_mon_pdev_init,
1390*5113495bSYour Name 	.mon_pdev_deinit = dp_mon_pdev_deinit,
1391*5113495bSYour Name 	.mon_vdev_attach = dp_mon_vdev_attach,
1392*5113495bSYour Name 	.mon_vdev_detach = dp_mon_vdev_detach,
1393*5113495bSYour Name 	.mon_peer_attach = dp_mon_peer_attach,
1394*5113495bSYour Name 	.mon_peer_detach = dp_mon_peer_detach,
1395*5113495bSYour Name 	.mon_peer_get_peerstats_ctx = dp_mon_peer_get_peerstats_ctx,
1396*5113495bSYour Name 	.mon_peer_reset_stats = dp_mon_peer_reset_stats,
1397*5113495bSYour Name 	.mon_peer_get_stats = dp_mon_peer_get_stats,
1398*5113495bSYour Name 	.mon_invalid_peer_update_pdev_stats =
1399*5113495bSYour Name 				dp_mon_invalid_peer_update_pdev_stats,
1400*5113495bSYour Name 	.mon_peer_get_stats_param = dp_mon_peer_get_stats_param,
1401*5113495bSYour Name 	.mon_flush_rings = NULL,
1402*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG)
1403*5113495bSYour Name 	.mon_pdev_htt_srng_setup[0] = NULL,
1404*5113495bSYour Name 	.mon_pdev_htt_srng_setup[1] = dp_mon_pdev_htt_srng_setup_2_0,
1405*5113495bSYour Name 	.mon_soc_htt_srng_setup = dp_mon_soc_htt_srng_setup_2_0,
1406*5113495bSYour Name #endif
1407*5113495bSYour Name #if defined(DP_CON_MON)
1408*5113495bSYour Name 	.mon_service_rings = NULL,
1409*5113495bSYour Name #endif
1410*5113495bSYour Name #ifndef DISABLE_MON_CONFIG
1411*5113495bSYour Name 	.mon_rx_process = NULL,
1412*5113495bSYour Name #endif
1413*5113495bSYour Name #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC)
1414*5113495bSYour Name 	.mon_drop_packets_for_mac = NULL,
1415*5113495bSYour Name #endif
1416*5113495bSYour Name 	.mon_vdev_timer_init = NULL,
1417*5113495bSYour Name 	.mon_vdev_timer_start = NULL,
1418*5113495bSYour Name 	.mon_vdev_timer_stop = NULL,
1419*5113495bSYour Name 	.mon_vdev_timer_deinit = NULL,
1420*5113495bSYour Name 	.mon_reap_timer_init = NULL,
1421*5113495bSYour Name 	.mon_reap_timer_start = NULL,
1422*5113495bSYour Name 	.mon_reap_timer_stop = NULL,
1423*5113495bSYour Name 	.mon_reap_timer_deinit = NULL,
1424*5113495bSYour Name 	.mon_filter_setup_tx_mon_mode = dp_mon_filter_setup_tx_mon_mode_2_0,
1425*5113495bSYour Name 	.mon_filter_reset_tx_mon_mode = dp_mon_filter_reset_tx_mon_mode_2_0,
1426*5113495bSYour Name 	.mon_rings_alloc[0] = NULL,
1427*5113495bSYour Name 	.mon_rings_free[0] = NULL,
1428*5113495bSYour Name 	.mon_rings_init[0] = NULL,
1429*5113495bSYour Name 	.mon_rings_deinit[0] = NULL,
1430*5113495bSYour Name 	.mon_rings_alloc[1] = dp_pdev_mon_rings_alloc_2_0,
1431*5113495bSYour Name 	.mon_rings_free[1] = dp_pdev_mon_rings_free_2_0,
1432*5113495bSYour Name 	.mon_rings_init[1] = dp_pdev_mon_rings_init_2_0,
1433*5113495bSYour Name 	.mon_rings_deinit[1] = dp_pdev_mon_rings_deinit_2_0,
1434*5113495bSYour Name 	.rx_mon_desc_pool_init = NULL,
1435*5113495bSYour Name 	.rx_mon_desc_pool_deinit = NULL,
1436*5113495bSYour Name 	.rx_mon_desc_pool_alloc = NULL,
1437*5113495bSYour Name 	.rx_mon_desc_pool_free = NULL,
1438*5113495bSYour Name 	.rx_mon_buffers_alloc = NULL,
1439*5113495bSYour Name 	.rx_mon_buffers_free = NULL,
1440*5113495bSYour Name 	.tx_mon_desc_pool_init = NULL,
1441*5113495bSYour Name 	.tx_mon_desc_pool_deinit = NULL,
1442*5113495bSYour Name 	.tx_mon_desc_pool_alloc = NULL,
1443*5113495bSYour Name 	.tx_mon_desc_pool_free = NULL,
1444*5113495bSYour Name #ifndef DISABLE_MON_CONFIG
1445*5113495bSYour Name 	.mon_register_intr_ops = dp_mon_register_intr_ops_2_0,
1446*5113495bSYour Name #endif
1447*5113495bSYour Name 	.mon_register_feature_ops = dp_mon_register_feature_ops_2_0,
1448*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH_BE
1449*5113495bSYour Name 	.mon_tx_ppdu_stats_attach = dp_tx_ppdu_stats_attach_2_0,
1450*5113495bSYour Name 	.mon_tx_ppdu_stats_detach = dp_tx_ppdu_stats_detach_2_0,
1451*5113495bSYour Name 	.mon_peer_tx_capture_filter_check = NULL,
1452*5113495bSYour Name #endif
1453*5113495bSYour Name #if (defined(WIFI_MONITOR_SUPPORT) && defined(WLAN_TX_MON_CORE_DEBUG))
1454*5113495bSYour Name 	.mon_tx_ppdu_stats_attach = NULL,
1455*5113495bSYour Name 	.mon_tx_ppdu_stats_detach = NULL,
1456*5113495bSYour Name 	.mon_peer_tx_capture_filter_check = NULL,
1457*5113495bSYour Name #endif
1458*5113495bSYour Name 	.mon_pdev_ext_init = dp_mon_pdev_ext_init_2_0,
1459*5113495bSYour Name 	.mon_pdev_ext_deinit = dp_mon_pdev_ext_deinit_2_0,
1460*5113495bSYour Name 	.mon_lite_mon_alloc = dp_lite_mon_alloc,
1461*5113495bSYour Name 	.mon_lite_mon_dealloc = dp_lite_mon_dealloc,
1462*5113495bSYour Name 	.mon_lite_mon_vdev_delete = dp_lite_mon_vdev_delete,
1463*5113495bSYour Name 	.mon_lite_mon_disable_rx = dp_lite_mon_disable_rx,
1464*5113495bSYour Name 	.mon_lite_mon_is_rx_adv_filter_enable = dp_lite_mon_is_rx_adv_filter_enable,
1465*5113495bSYour Name #ifdef QCA_KMEM_CACHE_SUPPORT
1466*5113495bSYour Name 	.mon_rx_ppdu_info_cache_create = dp_rx_mon_ppdu_info_cache_create,
1467*5113495bSYour Name 	.mon_rx_ppdu_info_cache_destroy = dp_rx_mon_ppdu_info_cache_destroy,
1468*5113495bSYour Name #endif
1469*5113495bSYour Name 	.mon_rx_pdev_tlv_logger_init = dp_mon_pdev_tlv_logger_init,
1470*5113495bSYour Name 	.mon_rx_pdev_tlv_logger_deinit = dp_mon_pdev_tlv_logger_deinit,
1471*5113495bSYour Name };
1472*5113495bSYour Name 
1473*5113495bSYour Name struct cdp_mon_ops dp_ops_mon_2_0 = {
1474*5113495bSYour Name 	.txrx_reset_monitor_mode = dp_reset_monitor_mode,
1475*5113495bSYour Name 	/* Added support for HK advance filter */
1476*5113495bSYour Name 	.txrx_set_advance_monitor_filter = NULL,
1477*5113495bSYour Name 	.txrx_deliver_tx_mgmt = dp_deliver_tx_mgmt,
1478*5113495bSYour Name 	.config_full_mon_mode = NULL,
1479*5113495bSYour Name 	.soc_config_full_mon_mode = NULL,
1480*5113495bSYour Name 	.get_mon_pdev_rx_stats = dp_pdev_get_rx_mon_stats,
1481*5113495bSYour Name 	.txrx_enable_mon_reap_timer = NULL,
1482*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
1483*5113495bSYour Name 	.txrx_enable_enhanced_stats = dp_enable_enhanced_stats,
1484*5113495bSYour Name 	.txrx_disable_enhanced_stats = dp_disable_enhanced_stats,
1485*5113495bSYour Name #endif /* QCA_ENHANCED_STATS_SUPPORT */
1486*5113495bSYour Name #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC)
1487*5113495bSYour Name 	.txrx_update_filter_neighbour_peers = dp_lite_mon_config_nac_peer,
1488*5113495bSYour Name #endif
1489*5113495bSYour Name #ifdef ATH_SUPPORT_NAC_RSSI
1490*5113495bSYour Name 	.txrx_vdev_config_for_nac_rssi = dp_lite_mon_config_nac_rssi_peer,
1491*5113495bSYour Name 	.txrx_vdev_get_neighbour_rssi = dp_lite_mon_get_nac_peer_rssi,
1492*5113495bSYour Name #endif
1493*5113495bSYour Name #ifdef QCA_SUPPORT_LITE_MONITOR
1494*5113495bSYour Name 	.txrx_set_lite_mon_config = dp_lite_mon_set_config,
1495*5113495bSYour Name 	.txrx_get_lite_mon_config = dp_lite_mon_get_config,
1496*5113495bSYour Name 	.txrx_set_lite_mon_peer_config = dp_lite_mon_set_peer_config,
1497*5113495bSYour Name 	.txrx_get_lite_mon_peer_config = dp_lite_mon_get_peer_config,
1498*5113495bSYour Name 	.txrx_is_lite_mon_enabled = dp_lite_mon_is_enabled,
1499*5113495bSYour Name 	.txrx_get_lite_mon_legacy_feature_enabled =
1500*5113495bSYour Name 				dp_lite_mon_get_legacy_feature_enabled,
1501*5113495bSYour Name #endif
1502*5113495bSYour Name 	.txrx_set_mon_pdev_params_rssi_dbm_conv =
1503*5113495bSYour Name 				dp_mon_pdev_params_rssi_dbm_conv,
1504*5113495bSYour Name #ifdef WLAN_CONFIG_TELEMETRY_AGENT
1505*5113495bSYour Name 	.txrx_update_pdev_mon_telemetry_airtime_stats =
1506*5113495bSYour Name 			dp_pdev_update_telemetry_airtime_stats,
1507*5113495bSYour Name #endif
1508*5113495bSYour Name 	.txrx_update_mon_mac_filter = NULL,
1509*5113495bSYour Name #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
1510*5113495bSYour Name 	.start_local_pkt_capture = NULL,
1511*5113495bSYour Name 	.stop_local_pkt_capture = NULL,
1512*5113495bSYour Name 	.is_local_pkt_capture_running = NULL,
1513*5113495bSYour Name #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */
1514*5113495bSYour Name };
1515*5113495bSYour Name 
1516*5113495bSYour Name #if defined(WLAN_PKT_CAPTURE_TX_2_0) || \
1517*5113495bSYour Name defined(WLAN_PKT_CAPTURE_RX_2_0)
dp_mon_ops_register_cmn_2_0(struct dp_mon_soc * mon_soc)1518*5113495bSYour Name void dp_mon_ops_register_cmn_2_0(struct dp_mon_soc *mon_soc)
1519*5113495bSYour Name {
1520*5113495bSYour Name 	struct dp_mon_ops *mon_ops = mon_soc->mon_ops;
1521*5113495bSYour Name 
1522*5113495bSYour Name 	if (!mon_ops) {
1523*5113495bSYour Name 		dp_err("tx 2.0 ops registration failed");
1524*5113495bSYour Name 		return;
1525*5113495bSYour Name 	}
1526*5113495bSYour Name 	mon_ops->tx_mon_filter_alloc = dp_mon_filter_alloc_2_0;
1527*5113495bSYour Name 	mon_ops->tx_mon_filter_dealloc = dp_mon_filter_dealloc_2_0;
1528*5113495bSYour Name }
1529*5113495bSYour Name #endif
1530*5113495bSYour Name 
1531*5113495bSYour Name #ifdef WLAN_PKT_CAPTURE_TX_2_0
dp_mon_ops_register_tx_2_0(struct dp_mon_soc * mon_soc)1532*5113495bSYour Name void dp_mon_ops_register_tx_2_0(struct dp_mon_soc *mon_soc)
1533*5113495bSYour Name {
1534*5113495bSYour Name 	struct dp_mon_ops *mon_ops = mon_soc->mon_ops;
1535*5113495bSYour Name 
1536*5113495bSYour Name 	if (!mon_ops) {
1537*5113495bSYour Name 		dp_err("tx 2.0 ops registration failed");
1538*5113495bSYour Name 		return;
1539*5113495bSYour Name 	}
1540*5113495bSYour Name 	mon_ops->tx_mon_filter_update = dp_tx_mon_filter_update_2_0;
1541*5113495bSYour Name #ifndef DISABLE_MON_CONFIG
1542*5113495bSYour Name 	mon_ops->mon_tx_process = dp_tx_mon_process_2_0;
1543*5113495bSYour Name 	mon_ops->print_txmon_ring_stat = dp_tx_mon_print_ring_stat_2_0;
1544*5113495bSYour Name #endif
1545*5113495bSYour Name }
1546*5113495bSYour Name #endif
1547*5113495bSYour Name 
1548*5113495bSYour Name #ifdef WLAN_PKT_CAPTURE_RX_2_0
dp_mon_ops_register_rx_2_0(struct dp_mon_soc * mon_soc)1549*5113495bSYour Name void dp_mon_ops_register_rx_2_0(struct dp_mon_soc *mon_soc)
1550*5113495bSYour Name {
1551*5113495bSYour Name 	struct dp_mon_ops *mon_ops = mon_soc->mon_ops;
1552*5113495bSYour Name 
1553*5113495bSYour Name 	if (!mon_ops) {
1554*5113495bSYour Name 		dp_err("rx 2.0 ops registration failed");
1555*5113495bSYour Name 		return;
1556*5113495bSYour Name 	}
1557*5113495bSYour Name 	mon_ops->mon_filter_setup_rx_mon_mode =
1558*5113495bSYour Name 				dp_mon_filter_setup_rx_mon_mode_2_0;
1559*5113495bSYour Name 	mon_ops->mon_filter_reset_rx_mon_mode =
1560*5113495bSYour Name 				dp_mon_filter_reset_rx_mon_mode_2_0;
1561*5113495bSYour Name 	mon_ops->rx_mon_filter_update = dp_rx_mon_filter_update_2_0;
1562*5113495bSYour Name }
1563*5113495bSYour Name #endif
1564*5113495bSYour Name 
1565*5113495bSYour Name #ifdef QCA_MONITOR_OPS_PER_SOC_SUPPORT
dp_mon_ops_register_2_0(struct dp_mon_soc * mon_soc)1566*5113495bSYour Name void dp_mon_ops_register_2_0(struct dp_mon_soc *mon_soc)
1567*5113495bSYour Name {
1568*5113495bSYour Name 	struct dp_mon_ops *mon_ops = NULL;
1569*5113495bSYour Name 
1570*5113495bSYour Name 	if (mon_soc->mon_ops) {
1571*5113495bSYour Name 		dp_mon_err("monitor ops is allocated");
1572*5113495bSYour Name 		return;
1573*5113495bSYour Name 	}
1574*5113495bSYour Name 
1575*5113495bSYour Name 	mon_ops = qdf_mem_malloc(sizeof(struct dp_mon_ops));
1576*5113495bSYour Name 	if (!mon_ops) {
1577*5113495bSYour Name 		dp_mon_err("Failed to allocate memory for mon ops");
1578*5113495bSYour Name 		return;
1579*5113495bSYour Name 	}
1580*5113495bSYour Name 
1581*5113495bSYour Name 	qdf_mem_copy(mon_ops, &monitor_ops_2_0, sizeof(struct dp_mon_ops));
1582*5113495bSYour Name 	mon_soc->mon_ops = mon_ops;
1583*5113495bSYour Name 	dp_mon_ops_register_tx_2_0(mon_soc);
1584*5113495bSYour Name 	dp_mon_ops_register_rx_2_0(mon_soc);
1585*5113495bSYour Name 	dp_mon_ops_register_cmn_2_0(mon_soc);
1586*5113495bSYour Name }
1587*5113495bSYour Name 
dp_mon_cdp_ops_register_2_0(struct cdp_ops * ops)1588*5113495bSYour Name void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops)
1589*5113495bSYour Name {
1590*5113495bSYour Name 	struct cdp_mon_ops *mon_ops = NULL;
1591*5113495bSYour Name 
1592*5113495bSYour Name 	if (ops->mon_ops) {
1593*5113495bSYour Name 		dp_mon_err("cdp monitor ops is allocated");
1594*5113495bSYour Name 		return;
1595*5113495bSYour Name 	}
1596*5113495bSYour Name 
1597*5113495bSYour Name 	mon_ops = qdf_mem_malloc(sizeof(struct cdp_mon_ops));
1598*5113495bSYour Name 	if (!mon_ops) {
1599*5113495bSYour Name 		dp_mon_err("Failed to allocate memory for mon ops");
1600*5113495bSYour Name 		return;
1601*5113495bSYour Name 	}
1602*5113495bSYour Name 
1603*5113495bSYour Name 	qdf_mem_copy(mon_ops, &dp_ops_mon_2_0, sizeof(struct cdp_mon_ops));
1604*5113495bSYour Name 	ops->mon_ops = mon_ops;
1605*5113495bSYour Name }
1606*5113495bSYour Name #else
dp_mon_ops_register_2_0(struct dp_mon_soc * mon_soc)1607*5113495bSYour Name void dp_mon_ops_register_2_0(struct dp_mon_soc *mon_soc)
1608*5113495bSYour Name {
1609*5113495bSYour Name 	mon_soc->mon_ops = &monitor_ops_2_0;
1610*5113495bSYour Name }
1611*5113495bSYour Name 
dp_mon_cdp_ops_register_2_0(struct cdp_ops * ops)1612*5113495bSYour Name void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops)
1613*5113495bSYour Name {
1614*5113495bSYour Name 	ops->mon_ops = &dp_ops_mon_2_0;
1615*5113495bSYour Name }
1616*5113495bSYour Name #endif
1617*5113495bSYour Name 
1618*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
1619*5113495bSYour Name static void
dp_enable_enhanced_stats_for_each_pdev(struct dp_soc * soc,void * arg,int chip_id)1620*5113495bSYour Name dp_enable_enhanced_stats_for_each_pdev(struct dp_soc *soc, void *arg,
1621*5113495bSYour Name 				       int chip_id) {
1622*5113495bSYour Name 	uint8_t i = 0;
1623*5113495bSYour Name 
1624*5113495bSYour Name 	for (i = 0; i < MAX_PDEV_CNT; i++)
1625*5113495bSYour Name 		dp_enable_enhanced_stats(dp_soc_to_cdp_soc_t(soc), i);
1626*5113495bSYour Name }
1627*5113495bSYour Name 
1628*5113495bSYour Name QDF_STATUS
dp_enable_enhanced_stats_2_0(struct cdp_soc_t * soc,uint8_t pdev_id)1629*5113495bSYour Name dp_enable_enhanced_stats_2_0(struct cdp_soc_t *soc, uint8_t pdev_id)
1630*5113495bSYour Name {
1631*5113495bSYour Name 	struct dp_soc *dp_soc = cdp_soc_t_to_dp_soc(soc);
1632*5113495bSYour Name 	struct dp_soc_be *be_soc = NULL;
1633*5113495bSYour Name 
1634*5113495bSYour Name 	be_soc = dp_get_be_soc_from_dp_soc(dp_soc);
1635*5113495bSYour Name 
1636*5113495bSYour Name 	/* enable only on one soc if MLD is disabled */
1637*5113495bSYour Name 	if (!be_soc->mlo_enabled || !be_soc->ml_ctxt) {
1638*5113495bSYour Name 		dp_enable_enhanced_stats(soc, pdev_id);
1639*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1640*5113495bSYour Name 	}
1641*5113495bSYour Name 
1642*5113495bSYour Name 	dp_mlo_iter_ptnr_soc(be_soc,
1643*5113495bSYour Name 			     dp_enable_enhanced_stats_for_each_pdev,
1644*5113495bSYour Name 			     NULL);
1645*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1646*5113495bSYour Name }
1647*5113495bSYour Name 
1648*5113495bSYour Name static void
dp_disable_enhanced_stats_for_each_pdev(struct dp_soc * soc,void * arg,int chip_id)1649*5113495bSYour Name dp_disable_enhanced_stats_for_each_pdev(struct dp_soc *soc, void *arg,
1650*5113495bSYour Name 					int chip_id) {
1651*5113495bSYour Name 	uint8_t i = 0;
1652*5113495bSYour Name 
1653*5113495bSYour Name 	for (i = 0; i < MAX_PDEV_CNT; i++)
1654*5113495bSYour Name 		dp_disable_enhanced_stats(dp_soc_to_cdp_soc_t(soc), i);
1655*5113495bSYour Name }
1656*5113495bSYour Name 
1657*5113495bSYour Name QDF_STATUS
dp_disable_enhanced_stats_2_0(struct cdp_soc_t * soc,uint8_t pdev_id)1658*5113495bSYour Name dp_disable_enhanced_stats_2_0(struct cdp_soc_t *soc, uint8_t pdev_id)
1659*5113495bSYour Name {
1660*5113495bSYour Name 	struct dp_soc *dp_soc = cdp_soc_t_to_dp_soc(soc);
1661*5113495bSYour Name 	struct dp_soc_be *be_soc = NULL;
1662*5113495bSYour Name 
1663*5113495bSYour Name 	be_soc = dp_get_be_soc_from_dp_soc(dp_soc);
1664*5113495bSYour Name 
1665*5113495bSYour Name 	/* enable only on one soc if MLD is disabled */
1666*5113495bSYour Name 	if (!be_soc->mlo_enabled || !be_soc->ml_ctxt) {
1667*5113495bSYour Name 		dp_disable_enhanced_stats(soc, pdev_id);
1668*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1669*5113495bSYour Name 	}
1670*5113495bSYour Name 
1671*5113495bSYour Name 	dp_mlo_iter_ptnr_soc(be_soc,
1672*5113495bSYour Name 			     dp_disable_enhanced_stats_for_each_pdev,
1673*5113495bSYour Name 			     NULL);
1674*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1675*5113495bSYour Name }
1676*5113495bSYour Name #endif
1677*5113495bSYour Name 
1678*5113495bSYour Name #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE
dp_local_pkt_capture_tx_config(struct dp_pdev * pdev)1679*5113495bSYour Name QDF_STATUS dp_local_pkt_capture_tx_config(struct dp_pdev *pdev)
1680*5113495bSYour Name {
1681*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
1682*5113495bSYour Name 	struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
1683*5113495bSYour Name 	uint16_t num_buffers;
1684*5113495bSYour Name 	QDF_STATUS status;
1685*5113495bSYour Name 
1686*5113495bSYour Name 	soc_cfg_ctx = soc->wlan_cfg_ctx;
1687*5113495bSYour Name 	num_buffers = wlan_cfg_get_dp_soc_tx_mon_buf_ring_size(soc_cfg_ctx);
1688*5113495bSYour Name 
1689*5113495bSYour Name 	status = dp_vdev_set_monitor_mode_buf_rings_tx_2_0(pdev, num_buffers);
1690*5113495bSYour Name 
1691*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
1692*5113495bSYour Name 		dp_mon_err("Tx monitor buffer allocation failed");
1693*5113495bSYour Name 
1694*5113495bSYour Name 	return status;
1695*5113495bSYour Name }
1696*5113495bSYour Name #endif
1697