xref: /wlan-driver/qca-wifi-host-cmn/dp/inc/cdp_txrx_misc.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  * DOC: cdp_txrx_misc.h
22*5113495bSYour Name  * Define the host data path miscellaneous API functions
23*5113495bSYour Name  * called by the host control SW and the OS interface module
24*5113495bSYour Name  */
25*5113495bSYour Name #ifndef _CDP_TXRX_MISC_H_
26*5113495bSYour Name #define _CDP_TXRX_MISC_H_
27*5113495bSYour Name 
28*5113495bSYour Name #include "cdp_txrx_handle.h"
29*5113495bSYour Name #include <cdp_txrx_cmn.h>
30*5113495bSYour Name 
31*5113495bSYour Name /**
32*5113495bSYour Name  * cdp_tx_non_std() - Allow the control-path SW to send data frames
33*5113495bSYour Name  * @soc: data path soc handle
34*5113495bSYour Name  * @vdev_id: id of vdev
35*5113495bSYour Name  * @tx_spec: what non-standard handling to apply to the tx data frames
36*5113495bSYour Name  * @msdu_list: NULL-terminated list of tx MSDUs
37*5113495bSYour Name  *
38*5113495bSYour Name  * Generally, all tx data frames come from the OS shim into the txrx layer.
39*5113495bSYour Name  * However, there are rare cases such as TDLS messaging where the UMAC
40*5113495bSYour Name  * control-path SW creates tx data frames.
41*5113495bSYour Name  *  This UMAC SW can call this function to provide the tx data frames to
42*5113495bSYour Name  *  the txrx layer.
43*5113495bSYour Name  *  The UMAC SW can request a callback for these data frames after their
44*5113495bSYour Name  *  transmission completes, by using the ol_txrx_data_tx_cb_set function
45*5113495bSYour Name  *  to register a tx completion callback, and by specifying
46*5113495bSYour Name  *  ol_tx_spec_no_free as the tx_spec arg when giving the frames to
47*5113495bSYour Name  *  ol_tx_non_std.
48*5113495bSYour Name  *  The MSDUs need to have the appropriate L2 header type (802.3 vs. 802.11),
49*5113495bSYour Name  *  as specified by ol_cfg_frame_type().
50*5113495bSYour Name  *
51*5113495bSYour Name  *  Return: null - success, skb - failure
52*5113495bSYour Name  */
53*5113495bSYour Name static inline qdf_nbuf_t
cdp_tx_non_std(ol_txrx_soc_handle soc,uint8_t vdev_id,enum ol_tx_spec tx_spec,qdf_nbuf_t msdu_list)54*5113495bSYour Name cdp_tx_non_std(ol_txrx_soc_handle soc, uint8_t vdev_id,
55*5113495bSYour Name 	       enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list)
56*5113495bSYour Name {
57*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
58*5113495bSYour Name 		dp_cdp_debug("invalid instance");
59*5113495bSYour Name 		return NULL;
60*5113495bSYour Name 	}
61*5113495bSYour Name 
62*5113495bSYour Name 	if (soc->ops->misc_ops->tx_non_std)
63*5113495bSYour Name 		return soc->ops->misc_ops->tx_non_std(soc, vdev_id, tx_spec,
64*5113495bSYour Name 						      msdu_list);
65*5113495bSYour Name 	return NULL;
66*5113495bSYour Name }
67*5113495bSYour Name 
68*5113495bSYour Name /**
69*5113495bSYour Name  * cdp_set_ibss_vdev_heart_beat_timer() - Update ibss vdev heart
70*5113495bSYour Name  * beat timer
71*5113495bSYour Name  * @soc: data path soc handle
72*5113495bSYour Name  * @vdev_id: id of vdev
73*5113495bSYour Name  * @timer_value_sec: new heart beat timer value
74*5113495bSYour Name  *
75*5113495bSYour Name  * Return: Old timer value set in vdev.
76*5113495bSYour Name  */
77*5113495bSYour Name static inline uint16_t
cdp_set_ibss_vdev_heart_beat_timer(ol_txrx_soc_handle soc,uint8_t vdev_id,uint16_t timer_value_sec)78*5113495bSYour Name cdp_set_ibss_vdev_heart_beat_timer(ol_txrx_soc_handle soc,
79*5113495bSYour Name 				   uint8_t vdev_id, uint16_t timer_value_sec)
80*5113495bSYour Name {
81*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
82*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
83*5113495bSYour Name 			"%s invalid instance", __func__);
84*5113495bSYour Name 		return 0;
85*5113495bSYour Name 	}
86*5113495bSYour Name 
87*5113495bSYour Name 	if (soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer)
88*5113495bSYour Name 		return soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer(
89*5113495bSYour Name 			soc, vdev_id, timer_value_sec);
90*5113495bSYour Name 
91*5113495bSYour Name 	return 0;
92*5113495bSYour Name }
93*5113495bSYour Name 
94*5113495bSYour Name /**
95*5113495bSYour Name  * cdp_set_wisa_mode() - set wisa mode
96*5113495bSYour Name  * @soc: data path soc handle
97*5113495bSYour Name  * @vdev_id: vdev_id
98*5113495bSYour Name  * @enable: enable or disable
99*5113495bSYour Name  *
100*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS mode enable success
101*5113495bSYour Name  */
102*5113495bSYour Name static inline QDF_STATUS
cdp_set_wisa_mode(ol_txrx_soc_handle soc,uint8_t vdev_id,bool enable)103*5113495bSYour Name cdp_set_wisa_mode(ol_txrx_soc_handle soc, uint8_t vdev_id, bool enable)
104*5113495bSYour Name {
105*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
106*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
107*5113495bSYour Name 			"%s invalid instance", __func__);
108*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
109*5113495bSYour Name 	}
110*5113495bSYour Name 
111*5113495bSYour Name 	if (soc->ops->misc_ops->set_wisa_mode)
112*5113495bSYour Name 		return soc->ops->misc_ops->set_wisa_mode(soc, vdev_id, enable);
113*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
114*5113495bSYour Name }
115*5113495bSYour Name 
116*5113495bSYour Name /**
117*5113495bSYour Name  * cdp_data_stall_cb_register() - register data stall callback
118*5113495bSYour Name  * @soc: data path soc handle
119*5113495bSYour Name  * @pdev_id: id of data path pdev handle
120*5113495bSYour Name  * @cb: callback function
121*5113495bSYour Name  *
122*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS register success
123*5113495bSYour Name  */
cdp_data_stall_cb_register(ol_txrx_soc_handle soc,uint8_t pdev_id,data_stall_detect_cb cb)124*5113495bSYour Name static inline QDF_STATUS cdp_data_stall_cb_register(ol_txrx_soc_handle soc,
125*5113495bSYour Name 						    uint8_t pdev_id,
126*5113495bSYour Name 						    data_stall_detect_cb cb)
127*5113495bSYour Name {
128*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
129*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
130*5113495bSYour Name 			"%s invalid instance", __func__);
131*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
132*5113495bSYour Name 	}
133*5113495bSYour Name 
134*5113495bSYour Name 	if (soc->ops->misc_ops->txrx_data_stall_cb_register)
135*5113495bSYour Name 		return soc->ops->misc_ops->txrx_data_stall_cb_register(
136*5113495bSYour Name 							soc, pdev_id, cb);
137*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
138*5113495bSYour Name }
139*5113495bSYour Name 
140*5113495bSYour Name /**
141*5113495bSYour Name  * cdp_data_stall_cb_deregister() - de-register data stall callback
142*5113495bSYour Name  * @soc: data path soc handle
143*5113495bSYour Name  * @pdev_id: id of data path pdev handle
144*5113495bSYour Name  * @cb: callback function
145*5113495bSYour Name  *
146*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS de-register success
147*5113495bSYour Name  */
cdp_data_stall_cb_deregister(ol_txrx_soc_handle soc,uint8_t pdev_id,data_stall_detect_cb cb)148*5113495bSYour Name static inline QDF_STATUS cdp_data_stall_cb_deregister(ol_txrx_soc_handle soc,
149*5113495bSYour Name 						      uint8_t pdev_id,
150*5113495bSYour Name 						      data_stall_detect_cb cb)
151*5113495bSYour Name {
152*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
153*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
154*5113495bSYour Name 			"%s invalid instance", __func__);
155*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
156*5113495bSYour Name 	}
157*5113495bSYour Name 
158*5113495bSYour Name 	if (soc->ops->misc_ops->txrx_data_stall_cb_deregister)
159*5113495bSYour Name 		return soc->ops->misc_ops->txrx_data_stall_cb_deregister(
160*5113495bSYour Name 							soc, pdev_id, cb);
161*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
162*5113495bSYour Name }
163*5113495bSYour Name 
164*5113495bSYour Name /**
165*5113495bSYour Name  * cdp_post_data_stall_event() - post data stall event
166*5113495bSYour Name  * @soc: data path soc handle
167*5113495bSYour Name  * @indicator: Module triggering data stall
168*5113495bSYour Name  * @data_stall_type: data stall event type
169*5113495bSYour Name  * @pdev_id: pdev id
170*5113495bSYour Name  * @vdev_id_bitmap: vdev id bitmap
171*5113495bSYour Name  * @recovery_type: data stall recovery type
172*5113495bSYour Name  *
173*5113495bSYour Name  * Return: None
174*5113495bSYour Name  */
175*5113495bSYour Name static inline void
cdp_post_data_stall_event(ol_txrx_soc_handle soc,enum data_stall_log_event_indicator indicator,enum data_stall_log_event_type data_stall_type,uint32_t pdev_id,uint32_t vdev_id_bitmap,enum data_stall_log_recovery_type recovery_type)176*5113495bSYour Name cdp_post_data_stall_event(ol_txrx_soc_handle soc,
177*5113495bSYour Name 			  enum data_stall_log_event_indicator indicator,
178*5113495bSYour Name 			  enum data_stall_log_event_type data_stall_type,
179*5113495bSYour Name 			  uint32_t pdev_id, uint32_t vdev_id_bitmap,
180*5113495bSYour Name 			  enum data_stall_log_recovery_type recovery_type)
181*5113495bSYour Name {
182*5113495bSYour Name 	if (!soc || !soc->ops) {
183*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
184*5113495bSYour Name 			"%s invalid instance", __func__);
185*5113495bSYour Name 		QDF_BUG(0);
186*5113495bSYour Name 		return;
187*5113495bSYour Name 	}
188*5113495bSYour Name 
189*5113495bSYour Name 	if (!soc->ops->misc_ops ||
190*5113495bSYour Name 	    !soc->ops->misc_ops->txrx_post_data_stall_event)
191*5113495bSYour Name 		return;
192*5113495bSYour Name 
193*5113495bSYour Name 	soc->ops->misc_ops->txrx_post_data_stall_event(
194*5113495bSYour Name 				soc, indicator, data_stall_type, pdev_id,
195*5113495bSYour Name 				vdev_id_bitmap, recovery_type);
196*5113495bSYour Name }
197*5113495bSYour Name 
198*5113495bSYour Name /**
199*5113495bSYour Name  * cdp_set_wmm_param() - set wmm parameter
200*5113495bSYour Name  * @soc: data path soc handle
201*5113495bSYour Name  * @pdev_id: id of data path pdev handle
202*5113495bSYour Name  * @wmm_param: wmm parameter
203*5113495bSYour Name  *
204*5113495bSYour Name  * Return: none
205*5113495bSYour Name  */
206*5113495bSYour Name static inline void
cdp_set_wmm_param(ol_txrx_soc_handle soc,uint8_t pdev_id,struct ol_tx_wmm_param_t wmm_param)207*5113495bSYour Name cdp_set_wmm_param(ol_txrx_soc_handle soc, uint8_t pdev_id,
208*5113495bSYour Name 		  struct ol_tx_wmm_param_t wmm_param)
209*5113495bSYour Name {
210*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
211*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
212*5113495bSYour Name 			"%s invalid instance", __func__);
213*5113495bSYour Name 		return;
214*5113495bSYour Name 	}
215*5113495bSYour Name 
216*5113495bSYour Name 	if (soc->ops->misc_ops->set_wmm_param)
217*5113495bSYour Name 		return soc->ops->misc_ops->set_wmm_param(soc, pdev_id,
218*5113495bSYour Name 							 wmm_param);
219*5113495bSYour Name 
220*5113495bSYour Name 	return;
221*5113495bSYour Name }
222*5113495bSYour Name 
223*5113495bSYour Name /**
224*5113495bSYour Name  * cdp_runtime_suspend() - suspend
225*5113495bSYour Name  * @soc: data path soc handle
226*5113495bSYour Name  * @pdev_id: id of data path pdev handle
227*5113495bSYour Name  *
228*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS suspend success
229*5113495bSYour Name  */
cdp_runtime_suspend(ol_txrx_soc_handle soc,uint8_t pdev_id)230*5113495bSYour Name static inline QDF_STATUS cdp_runtime_suspend(ol_txrx_soc_handle soc,
231*5113495bSYour Name 					     uint8_t pdev_id)
232*5113495bSYour Name {
233*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
234*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
235*5113495bSYour Name 			"%s invalid instance", __func__);
236*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
237*5113495bSYour Name 	}
238*5113495bSYour Name 
239*5113495bSYour Name 	if (soc->ops->misc_ops->runtime_suspend)
240*5113495bSYour Name 		return soc->ops->misc_ops->runtime_suspend(soc, pdev_id);
241*5113495bSYour Name 
242*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
243*5113495bSYour Name }
244*5113495bSYour Name 
245*5113495bSYour Name /**
246*5113495bSYour Name  * cdp_runtime_resume() - resume
247*5113495bSYour Name  * @soc: data path soc handle
248*5113495bSYour Name  * @pdev_id: id of data path pdev handle
249*5113495bSYour Name  *
250*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS suspend success
251*5113495bSYour Name  */
cdp_runtime_resume(ol_txrx_soc_handle soc,uint8_t pdev_id)252*5113495bSYour Name static inline QDF_STATUS cdp_runtime_resume(ol_txrx_soc_handle soc,
253*5113495bSYour Name 					    uint8_t pdev_id)
254*5113495bSYour Name {
255*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
256*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
257*5113495bSYour Name 			"%s invalid instance", __func__);
258*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
259*5113495bSYour Name 	}
260*5113495bSYour Name 
261*5113495bSYour Name 	if (soc->ops->misc_ops->runtime_resume)
262*5113495bSYour Name 		return soc->ops->misc_ops->runtime_resume(soc, pdev_id);
263*5113495bSYour Name 
264*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
265*5113495bSYour Name }
266*5113495bSYour Name 
267*5113495bSYour Name /**
268*5113495bSYour Name  * cdp_hl_tdls_flag_reset() - tdls flag reset
269*5113495bSYour Name  * @soc: data path soc handle
270*5113495bSYour Name  * @vdev_id: id of vdev
271*5113495bSYour Name  * @flag: flag indicating to set/reset tdls
272*5113495bSYour Name  *
273*5113495bSYour Name  * Return: none
274*5113495bSYour Name  */
275*5113495bSYour Name static inline void
cdp_hl_tdls_flag_reset(ol_txrx_soc_handle soc,uint8_t vdev_id,bool flag)276*5113495bSYour Name cdp_hl_tdls_flag_reset(ol_txrx_soc_handle soc, uint8_t vdev_id, bool flag)
277*5113495bSYour Name {
278*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
279*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
280*5113495bSYour Name 			"%s invalid instance", __func__);
281*5113495bSYour Name 		return;
282*5113495bSYour Name 	}
283*5113495bSYour Name 
284*5113495bSYour Name 	if (soc->ops->misc_ops->hl_tdls_flag_reset)
285*5113495bSYour Name 		return soc->ops->misc_ops->hl_tdls_flag_reset(soc, vdev_id,
286*5113495bSYour Name 							      flag);
287*5113495bSYour Name 
288*5113495bSYour Name 	return;
289*5113495bSYour Name }
290*5113495bSYour Name 
291*5113495bSYour Name /**
292*5113495bSYour Name  * cdp_get_opmode() - get vdev operation mode
293*5113495bSYour Name  * @soc: data path soc handle
294*5113495bSYour Name  * @vdev_id: id of vdev
295*5113495bSYour Name  *
296*5113495bSYour Name  * Return: virtual device operational mode
297*5113495bSYour Name  *      op_mode_ap,
298*5113495bSYour Name  *      op_mode_ibss,
299*5113495bSYour Name  *      op_mode_sta,
300*5113495bSYour Name  *      op_mode_monitor,
301*5113495bSYour Name  *      op_mode_ocb,
302*5113495bSYour Name  *	etc.
303*5113495bSYour Name  */
304*5113495bSYour Name static inline int
cdp_get_opmode(ol_txrx_soc_handle soc,uint8_t vdev_id)305*5113495bSYour Name cdp_get_opmode(ol_txrx_soc_handle soc, uint8_t vdev_id)
306*5113495bSYour Name {
307*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
308*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
309*5113495bSYour Name 			"%s invalid instance", __func__);
310*5113495bSYour Name 		return 0;
311*5113495bSYour Name 	}
312*5113495bSYour Name 
313*5113495bSYour Name 	if (soc->ops->misc_ops->get_opmode)
314*5113495bSYour Name 		return soc->ops->misc_ops->get_opmode(soc, vdev_id);
315*5113495bSYour Name 
316*5113495bSYour Name 	return 0;
317*5113495bSYour Name }
318*5113495bSYour Name 
319*5113495bSYour Name /**
320*5113495bSYour Name  * cdp_get_vdev_id() - get vdev id
321*5113495bSYour Name  * @soc: data path soc handle
322*5113495bSYour Name  * @vdev: virtual interface instance
323*5113495bSYour Name  *
324*5113495bSYour Name  * get virtual interface id
325*5113495bSYour Name  *
326*5113495bSYour Name  * Return: interface id
327*5113495bSYour Name  *        0 unknown interface
328*5113495bSYour Name  */
329*5113495bSYour Name static inline uint16_t
cdp_get_vdev_id(ol_txrx_soc_handle soc,struct cdp_vdev * vdev)330*5113495bSYour Name cdp_get_vdev_id(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
331*5113495bSYour Name {
332*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
333*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
334*5113495bSYour Name 			"%s invalid instance", __func__);
335*5113495bSYour Name 		return 0;
336*5113495bSYour Name 	}
337*5113495bSYour Name 
338*5113495bSYour Name 	if (soc->ops->misc_ops->get_vdev_id)
339*5113495bSYour Name 		return soc->ops->misc_ops->get_vdev_id(vdev);
340*5113495bSYour Name 	return 0;
341*5113495bSYour Name }
342*5113495bSYour Name 
343*5113495bSYour Name /**
344*5113495bSYour Name  * cdp_get_tx_ack_stats() - get tx ack count for vdev
345*5113495bSYour Name  * @soc: data path soc handle
346*5113495bSYour Name  * @vdev_id: vdev id
347*5113495bSYour Name  *
348*5113495bSYour Name  * Return: tx ack count
349*5113495bSYour Name  *          0 invalid count
350*5113495bSYour Name  */
351*5113495bSYour Name static inline uint32_t
cdp_get_tx_ack_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)352*5113495bSYour Name cdp_get_tx_ack_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
353*5113495bSYour Name {
354*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
355*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
356*5113495bSYour Name 			"%s invalid instance", __func__);
357*5113495bSYour Name 		return 0;
358*5113495bSYour Name 	}
359*5113495bSYour Name 
360*5113495bSYour Name 	if (soc->ops->misc_ops->get_tx_ack_stats)
361*5113495bSYour Name 		return soc->ops->misc_ops->get_tx_ack_stats(soc, vdev_id);
362*5113495bSYour Name 
363*5113495bSYour Name 	return 0;
364*5113495bSYour Name }
365*5113495bSYour Name 
366*5113495bSYour Name /**
367*5113495bSYour Name  * cdp_bad_peer_txctl_set_setting() - Set peer timer balance parameters
368*5113495bSYour Name  * @soc: data path soc handle
369*5113495bSYour Name  * @pdev_id: id of datapath pdev handle
370*5113495bSYour Name  * @enable: enable/disable peer balance state
371*5113495bSYour Name  * @period: balance timer period for peer
372*5113495bSYour Name  * @txq_limit: txp limit for peer
373*5113495bSYour Name  *
374*5113495bSYour Name  * Return: none
375*5113495bSYour Name  */
376*5113495bSYour Name static inline void
cdp_bad_peer_txctl_set_setting(ol_txrx_soc_handle soc,uint8_t pdev_id,int enable,int period,int txq_limit)377*5113495bSYour Name cdp_bad_peer_txctl_set_setting(ol_txrx_soc_handle soc, uint8_t pdev_id,
378*5113495bSYour Name 			       int enable, int period, int txq_limit)
379*5113495bSYour Name {
380*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
381*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
382*5113495bSYour Name 			"%s invalid instance", __func__);
383*5113495bSYour Name 		return;
384*5113495bSYour Name 	}
385*5113495bSYour Name 
386*5113495bSYour Name 	if (soc->ops->misc_ops->bad_peer_txctl_set_setting)
387*5113495bSYour Name 		return soc->ops->misc_ops->bad_peer_txctl_set_setting(
388*5113495bSYour Name 					soc, pdev_id, enable, period,
389*5113495bSYour Name 					txq_limit);
390*5113495bSYour Name 	return;
391*5113495bSYour Name }
392*5113495bSYour Name 
393*5113495bSYour Name /**
394*5113495bSYour Name  * cdp_bad_peer_txctl_update_threshold() - TBD
395*5113495bSYour Name  * @soc: data path soc handle
396*5113495bSYour Name  * @pdev_id: id of data path pdev handle
397*5113495bSYour Name  * @level: index of the threshold configuration
398*5113495bSYour Name  * @tput_thresh: peer balance throughput threshold
399*5113495bSYour Name  * @tx_limit: peer balance tx limit threshold
400*5113495bSYour Name  *
401*5113495bSYour Name  * TBD
402*5113495bSYour Name  *
403*5113495bSYour Name  * Return: none
404*5113495bSYour Name  */
405*5113495bSYour Name static inline void
cdp_bad_peer_txctl_update_threshold(ol_txrx_soc_handle soc,uint8_t pdev_id,int level,int tput_thresh,int tx_limit)406*5113495bSYour Name cdp_bad_peer_txctl_update_threshold(ol_txrx_soc_handle soc,
407*5113495bSYour Name 				    uint8_t pdev_id, int level,
408*5113495bSYour Name 				    int tput_thresh, int tx_limit)
409*5113495bSYour Name {
410*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
411*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
412*5113495bSYour Name 			"%s invalid instance", __func__);
413*5113495bSYour Name 		return;
414*5113495bSYour Name 	}
415*5113495bSYour Name 
416*5113495bSYour Name 	if (soc->ops->misc_ops->bad_peer_txctl_update_threshold)
417*5113495bSYour Name 		return soc->ops->misc_ops->bad_peer_txctl_update_threshold(
418*5113495bSYour Name 			soc, pdev_id, level, tput_thresh, tx_limit);
419*5113495bSYour Name 	return;
420*5113495bSYour Name }
421*5113495bSYour Name 
422*5113495bSYour Name /**
423*5113495bSYour Name  * cdp_mark_first_wakeup_packet() - set flag to indicate that
424*5113495bSYour Name  *    fw is compatible for marking first packet after wow wakeup
425*5113495bSYour Name  * @soc: data path soc handle
426*5113495bSYour Name  * @pdev_id: id of data path pdev handle
427*5113495bSYour Name  * @value: 1 for enabled/ 0 for disabled
428*5113495bSYour Name  *
429*5113495bSYour Name  * Return: None
430*5113495bSYour Name  */
cdp_mark_first_wakeup_packet(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t value)431*5113495bSYour Name static inline void cdp_mark_first_wakeup_packet(ol_txrx_soc_handle soc,
432*5113495bSYour Name 						uint8_t pdev_id, uint8_t value)
433*5113495bSYour Name {
434*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
435*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
436*5113495bSYour Name 			"%s invalid instance", __func__);
437*5113495bSYour Name 		return;
438*5113495bSYour Name 	}
439*5113495bSYour Name 
440*5113495bSYour Name 	if (soc->ops->misc_ops->mark_first_wakeup_packet)
441*5113495bSYour Name 		return soc->ops->misc_ops->mark_first_wakeup_packet(
442*5113495bSYour Name 							soc, pdev_id, value);
443*5113495bSYour Name 	return;
444*5113495bSYour Name }
445*5113495bSYour Name 
446*5113495bSYour Name 
447*5113495bSYour Name /**
448*5113495bSYour Name  * cdp_update_mac_id() - update mac_id for vdev
449*5113495bSYour Name  * @psoc: data path soc handle
450*5113495bSYour Name  * @vdev_id: vdev id
451*5113495bSYour Name  * @mac_id: mac id
452*5113495bSYour Name  *
453*5113495bSYour Name  * Return: none
454*5113495bSYour Name  */
cdp_update_mac_id(void * psoc,uint8_t vdev_id,uint8_t mac_id)455*5113495bSYour Name static inline void cdp_update_mac_id(void *psoc, uint8_t vdev_id,
456*5113495bSYour Name 				     uint8_t mac_id)
457*5113495bSYour Name {
458*5113495bSYour Name 	ol_txrx_soc_handle soc = psoc;
459*5113495bSYour Name 
460*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
461*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
462*5113495bSYour Name 			"%s invalid instance", __func__);
463*5113495bSYour Name 		return;
464*5113495bSYour Name 	}
465*5113495bSYour Name 
466*5113495bSYour Name 	if (soc->ops->misc_ops->update_mac_id)
467*5113495bSYour Name 		return soc->ops->misc_ops->update_mac_id(soc, vdev_id, mac_id);
468*5113495bSYour Name 	return;
469*5113495bSYour Name }
470*5113495bSYour Name 
471*5113495bSYour Name /**
472*5113495bSYour Name  * cdp_flush_rx_frames() - flush cached rx frames
473*5113495bSYour Name  * @soc: data path soc handle
474*5113495bSYour Name  * @pdev_id: datapath pdev identifier
475*5113495bSYour Name  * @peer_mac: peer mac address
476*5113495bSYour Name  * @drop: set flag to drop frames
477*5113495bSYour Name  *
478*5113495bSYour Name  * Return: None
479*5113495bSYour Name  */
cdp_flush_rx_frames(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t * peer_mac,bool drop)480*5113495bSYour Name static inline void cdp_flush_rx_frames(ol_txrx_soc_handle soc, uint8_t pdev_id,
481*5113495bSYour Name 				       uint8_t *peer_mac, bool drop)
482*5113495bSYour Name {
483*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
484*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
485*5113495bSYour Name 			"%s invalid instance", __func__);
486*5113495bSYour Name 		return;
487*5113495bSYour Name 	}
488*5113495bSYour Name 
489*5113495bSYour Name 	if (soc->ops->misc_ops->flush_rx_frames)
490*5113495bSYour Name 		return soc->ops->misc_ops->flush_rx_frames(soc, pdev_id,
491*5113495bSYour Name 							   peer_mac, drop);
492*5113495bSYour Name 	return;
493*5113495bSYour Name }
494*5113495bSYour Name 
495*5113495bSYour Name /**
496*5113495bSYour Name  * cdp_get_intra_bss_fwd_pkts_count() - to get the total tx and rx packets
497*5113495bSYour Name  *   that has been forwarded from txrx layer without going to upper layers.
498*5113495bSYour Name  * @soc: Datapath soc handle
499*5113495bSYour Name  * @vdev_id: vdev id
500*5113495bSYour Name  * @fwd_tx_packets: pointer to forwarded tx packets count parameter
501*5113495bSYour Name  * @fwd_rx_packets: pointer to forwarded rx packets count parameter
502*5113495bSYour Name  *
503*5113495bSYour Name  * Return: status -> A_OK - success, A_ERROR - failure
504*5113495bSYour Name  */
cdp_get_intra_bss_fwd_pkts_count(ol_txrx_soc_handle soc,uint8_t vdev_id,uint64_t * fwd_tx_packets,uint64_t * fwd_rx_packets)505*5113495bSYour Name static inline A_STATUS cdp_get_intra_bss_fwd_pkts_count(
506*5113495bSYour Name 		ol_txrx_soc_handle soc, uint8_t vdev_id,
507*5113495bSYour Name 		uint64_t *fwd_tx_packets, uint64_t *fwd_rx_packets)
508*5113495bSYour Name {
509*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
510*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
511*5113495bSYour Name 			"%s invalid instance", __func__);
512*5113495bSYour Name 		return 0;
513*5113495bSYour Name 	}
514*5113495bSYour Name 
515*5113495bSYour Name 	if (soc->ops->misc_ops->get_intra_bss_fwd_pkts_count)
516*5113495bSYour Name 		return soc->ops->misc_ops->get_intra_bss_fwd_pkts_count(
517*5113495bSYour Name 			soc, vdev_id, fwd_tx_packets, fwd_rx_packets);
518*5113495bSYour Name 
519*5113495bSYour Name 	return 0;
520*5113495bSYour Name }
521*5113495bSYour Name 
522*5113495bSYour Name /**
523*5113495bSYour Name  * cdp_pkt_log_init() - API to initialize packet log
524*5113495bSYour Name  * @soc: data path soc handle
525*5113495bSYour Name  * @pdev_id: id of data path pdev handle
526*5113495bSYour Name  * @scn: HIF context
527*5113495bSYour Name  *
528*5113495bSYour Name  * Return: void
529*5113495bSYour Name  */
cdp_pkt_log_init(ol_txrx_soc_handle soc,uint8_t pdev_id,void * scn)530*5113495bSYour Name static inline void cdp_pkt_log_init(ol_txrx_soc_handle soc,
531*5113495bSYour Name 				    uint8_t pdev_id, void *scn)
532*5113495bSYour Name {
533*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
534*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
535*5113495bSYour Name 			"%s invalid instance", __func__);
536*5113495bSYour Name 		return;
537*5113495bSYour Name 	}
538*5113495bSYour Name 
539*5113495bSYour Name 	if (soc->ops->misc_ops->pkt_log_init)
540*5113495bSYour Name 		return soc->ops->misc_ops->pkt_log_init(soc, pdev_id, scn);
541*5113495bSYour Name 
542*5113495bSYour Name 	return;
543*5113495bSYour Name }
544*5113495bSYour Name 
545*5113495bSYour Name /**
546*5113495bSYour Name  * cdp_pkt_log_con_service() - API to connect packet log service
547*5113495bSYour Name  * @soc: data path soc handle
548*5113495bSYour Name  * @pdev_id: id of data path pdev handle
549*5113495bSYour Name  * @scn: HIF context
550*5113495bSYour Name  *
551*5113495bSYour Name  * Return: void
552*5113495bSYour Name  */
cdp_pkt_log_con_service(ol_txrx_soc_handle soc,uint8_t pdev_id,void * scn)553*5113495bSYour Name static inline void cdp_pkt_log_con_service(ol_txrx_soc_handle soc,
554*5113495bSYour Name 					   uint8_t pdev_id, void *scn)
555*5113495bSYour Name {
556*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
557*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
558*5113495bSYour Name 			"%s invalid instance", __func__);
559*5113495bSYour Name 		return;
560*5113495bSYour Name 	}
561*5113495bSYour Name 
562*5113495bSYour Name 	if (soc->ops->misc_ops->pkt_log_con_service)
563*5113495bSYour Name 		return soc->ops->misc_ops->pkt_log_con_service(
564*5113495bSYour Name 						soc, pdev_id, scn);
565*5113495bSYour Name 
566*5113495bSYour Name 	return;
567*5113495bSYour Name }
568*5113495bSYour Name 
569*5113495bSYour Name /**
570*5113495bSYour Name  * cdp_pkt_log_exit() - API to cleanup packet log info
571*5113495bSYour Name  * @soc: data path soc handle
572*5113495bSYour Name  * @pdev_id: id of data path pdev handle
573*5113495bSYour Name  *
574*5113495bSYour Name  * Return: void
575*5113495bSYour Name  */
cdp_pkt_log_exit(ol_txrx_soc_handle soc,uint8_t pdev_id)576*5113495bSYour Name static inline void cdp_pkt_log_exit(ol_txrx_soc_handle soc, uint8_t pdev_id)
577*5113495bSYour Name {
578*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
579*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
580*5113495bSYour Name 			"%s invalid instance", __func__);
581*5113495bSYour Name 		return;
582*5113495bSYour Name 	}
583*5113495bSYour Name 
584*5113495bSYour Name 	if (soc->ops->misc_ops->pkt_log_exit)
585*5113495bSYour Name 		return soc->ops->misc_ops->pkt_log_exit(soc, pdev_id);
586*5113495bSYour Name 
587*5113495bSYour Name 	return;
588*5113495bSYour Name }
589*5113495bSYour Name 
590*5113495bSYour Name /**
591*5113495bSYour Name  * cdp_get_num_rx_contexts() - API to get the number of RX contexts
592*5113495bSYour Name  * @soc: soc handle
593*5113495bSYour Name  *
594*5113495bSYour Name  * Return: number of RX contexts
595*5113495bSYour Name  */
cdp_get_num_rx_contexts(ol_txrx_soc_handle soc)596*5113495bSYour Name static inline int cdp_get_num_rx_contexts(ol_txrx_soc_handle soc)
597*5113495bSYour Name {
598*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
599*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
600*5113495bSYour Name 			  "%s invalid instance", __func__);
601*5113495bSYour Name 		return 0;
602*5113495bSYour Name 	}
603*5113495bSYour Name 
604*5113495bSYour Name 	if (soc->ops->misc_ops->get_num_rx_contexts)
605*5113495bSYour Name 		return soc->ops->misc_ops->get_num_rx_contexts(soc);
606*5113495bSYour Name 
607*5113495bSYour Name 	return 0;
608*5113495bSYour Name }
609*5113495bSYour Name 
610*5113495bSYour Name /**
611*5113495bSYour Name  * cdp_register_packetdump_cb() - API to register packetdump callback
612*5113495bSYour Name  *
613*5113495bSYour Name  * Register TX/RX callback for data packets, during connection. And per packet
614*5113495bSYour Name  * stats will be passed to user-space by @tx_cb/@rx_cb.
615*5113495bSYour Name  *
616*5113495bSYour Name  * @soc: soc handle
617*5113495bSYour Name  * @pdev_id: id of data path pdev handle
618*5113495bSYour Name  * @tx_cb: tx packet callback
619*5113495bSYour Name  * @rx_cb: rx packet callback
620*5113495bSYour Name  *
621*5113495bSYour Name  * Return: void
622*5113495bSYour Name  */
cdp_register_packetdump_cb(ol_txrx_soc_handle soc,uint8_t pdev_id,ol_txrx_pktdump_cb tx_cb,ol_txrx_pktdump_cb rx_cb)623*5113495bSYour Name static inline void cdp_register_packetdump_cb(ol_txrx_soc_handle soc,
624*5113495bSYour Name 					      uint8_t pdev_id,
625*5113495bSYour Name 					      ol_txrx_pktdump_cb tx_cb,
626*5113495bSYour Name 					      ol_txrx_pktdump_cb rx_cb)
627*5113495bSYour Name {
628*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
629*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
630*5113495bSYour Name 			  "%s invalid instance", __func__);
631*5113495bSYour Name 		return;
632*5113495bSYour Name 	}
633*5113495bSYour Name 
634*5113495bSYour Name 	if (soc->ops->misc_ops->register_pktdump_cb)
635*5113495bSYour Name 		return soc->ops->misc_ops->register_pktdump_cb(
636*5113495bSYour Name 						soc, pdev_id, tx_cb, rx_cb);
637*5113495bSYour Name }
638*5113495bSYour Name 
639*5113495bSYour Name /**
640*5113495bSYour Name  * cdp_deregister_packetdump_cb() - API to unregister packetdump callback
641*5113495bSYour Name  *
642*5113495bSYour Name  * Deregister callback for TX/RX data packets.
643*5113495bSYour Name  *
644*5113495bSYour Name  * @soc: soc handle
645*5113495bSYour Name  * @pdev_id: id of data path pdev handle
646*5113495bSYour Name  *
647*5113495bSYour Name  * Return: void
648*5113495bSYour Name  */
cdp_deregister_packetdump_cb(ol_txrx_soc_handle soc,uint8_t pdev_id)649*5113495bSYour Name static inline void cdp_deregister_packetdump_cb(ol_txrx_soc_handle soc,
650*5113495bSYour Name 						uint8_t pdev_id)
651*5113495bSYour Name {
652*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
653*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
654*5113495bSYour Name 			  "%s invalid instance", __func__);
655*5113495bSYour Name 		return;
656*5113495bSYour Name 	}
657*5113495bSYour Name 
658*5113495bSYour Name 	if (soc->ops->misc_ops->unregister_pktdump_cb)
659*5113495bSYour Name 		return soc->ops->misc_ops->unregister_pktdump_cb(soc, pdev_id);
660*5113495bSYour Name }
661*5113495bSYour Name 
662*5113495bSYour Name typedef void (*rx_mic_error_callback)(struct cdp_ctrl_objmgr_psoc *psoc,
663*5113495bSYour Name 				uint8_t pdev_id,
664*5113495bSYour Name 				struct cdp_rx_mic_err_info *info);
665*5113495bSYour Name 
666*5113495bSYour Name /**
667*5113495bSYour Name  * cdp_register_rx_mic_error_ind_handler() - API to register mic error
668*5113495bSYour Name  *                                           indication handler
669*5113495bSYour Name  *
670*5113495bSYour Name  * @soc: soc handle
671*5113495bSYour Name  * @rx_mic_cb: rx mic error indication callback
672*5113495bSYour Name  *
673*5113495bSYour Name  * Return: void
674*5113495bSYour Name  */
675*5113495bSYour Name static inline void
cdp_register_rx_mic_error_ind_handler(ol_txrx_soc_handle soc,rx_mic_error_callback rx_mic_cb)676*5113495bSYour Name cdp_register_rx_mic_error_ind_handler(ol_txrx_soc_handle soc,
677*5113495bSYour Name 				      rx_mic_error_callback rx_mic_cb)
678*5113495bSYour Name {
679*5113495bSYour Name 	if (!soc || !soc->ol_ops) {
680*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
681*5113495bSYour Name 			  "%s invalid instance", __func__);
682*5113495bSYour Name 		return;
683*5113495bSYour Name 	}
684*5113495bSYour Name 
685*5113495bSYour Name 	soc->ol_ops->rx_mic_error = rx_mic_cb;
686*5113495bSYour Name }
687*5113495bSYour Name 
688*5113495bSYour Name typedef void (*rx_refill_thread_sched_cb)(ol_txrx_soc_handle soc);
689*5113495bSYour Name 
690*5113495bSYour Name /**
691*5113495bSYour Name  * cdp_register_rx_refill_thread_sched_handler() - API to register RX refill
692*5113495bSYour Name  *                                                 thread schedule handler
693*5113495bSYour Name  * @soc: soc handle
694*5113495bSYour Name  * @rx_sched_cb: Rx refill thread scheduler callback function
695*5113495bSYour Name  *
696*5113495bSYour Name  * Return: void
697*5113495bSYour Name  */
698*5113495bSYour Name static inline void
cdp_register_rx_refill_thread_sched_handler(ol_txrx_soc_handle soc,rx_refill_thread_sched_cb rx_sched_cb)699*5113495bSYour Name cdp_register_rx_refill_thread_sched_handler(ol_txrx_soc_handle soc,
700*5113495bSYour Name 					    rx_refill_thread_sched_cb rx_sched_cb)
701*5113495bSYour Name {
702*5113495bSYour Name 	if (!soc || !soc->ol_ops) {
703*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
704*5113495bSYour Name 			  "%s invalid instance", __func__);
705*5113495bSYour Name 		return;
706*5113495bSYour Name 	}
707*5113495bSYour Name 
708*5113495bSYour Name 	soc->ol_ops->dp_rx_sched_refill_thread = rx_sched_cb;
709*5113495bSYour Name }
710*5113495bSYour Name 
711*5113495bSYour Name /**
712*5113495bSYour Name  * cdp_pdev_reset_driver_del_ack() - reset driver TCP delayed ack flag
713*5113495bSYour Name  * @psoc: data path soc handle
714*5113495bSYour Name  * @pdev_id: pdev id
715*5113495bSYour Name  *
716*5113495bSYour Name  * Return: none
717*5113495bSYour Name  */
cdp_pdev_reset_driver_del_ack(void * psoc,uint8_t pdev_id)718*5113495bSYour Name static inline void cdp_pdev_reset_driver_del_ack(void *psoc,
719*5113495bSYour Name 						 uint8_t pdev_id)
720*5113495bSYour Name {
721*5113495bSYour Name 	ol_txrx_soc_handle soc = psoc;
722*5113495bSYour Name 
723*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
724*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
725*5113495bSYour Name 			  "%s invalid instance", __func__);
726*5113495bSYour Name 		return;
727*5113495bSYour Name 	}
728*5113495bSYour Name 
729*5113495bSYour Name 	if (soc->ops->misc_ops->pdev_reset_driver_del_ack)
730*5113495bSYour Name 		return soc->ops->misc_ops->pdev_reset_driver_del_ack(soc,
731*5113495bSYour Name 								     pdev_id);
732*5113495bSYour Name }
733*5113495bSYour Name 
734*5113495bSYour Name /**
735*5113495bSYour Name  * cdp_vdev_set_driver_del_ack_enable() - set driver delayed ack enabled flag
736*5113495bSYour Name  * @soc: data path soc handle
737*5113495bSYour Name  * @vdev_id: vdev id
738*5113495bSYour Name  * @rx_packets: number of rx packets
739*5113495bSYour Name  * @time_in_ms: time in ms
740*5113495bSYour Name  * @high_th: high threshold
741*5113495bSYour Name  * @low_th: low threshold
742*5113495bSYour Name  *
743*5113495bSYour Name  * Return: none
744*5113495bSYour Name  */
cdp_vdev_set_driver_del_ack_enable(ol_txrx_soc_handle soc,uint8_t vdev_id,unsigned long rx_packets,uint32_t time_in_ms,uint32_t high_th,uint32_t low_th)745*5113495bSYour Name static inline void cdp_vdev_set_driver_del_ack_enable(ol_txrx_soc_handle soc,
746*5113495bSYour Name 						      uint8_t vdev_id,
747*5113495bSYour Name 						      unsigned long rx_packets,
748*5113495bSYour Name 						      uint32_t time_in_ms,
749*5113495bSYour Name 						      uint32_t high_th,
750*5113495bSYour Name 						      uint32_t low_th)
751*5113495bSYour Name {
752*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
753*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
754*5113495bSYour Name 			  "%s invalid instance", __func__);
755*5113495bSYour Name 		return;
756*5113495bSYour Name 	}
757*5113495bSYour Name 
758*5113495bSYour Name 	if (soc->ops->misc_ops->vdev_set_driver_del_ack_enable)
759*5113495bSYour Name 		return soc->ops->misc_ops->vdev_set_driver_del_ack_enable(
760*5113495bSYour Name 			soc, vdev_id, rx_packets, time_in_ms, high_th, low_th);
761*5113495bSYour Name }
762*5113495bSYour Name 
cdp_vdev_set_bundle_require_flag(ol_txrx_soc_handle soc,uint8_t vdev_id,unsigned long tx_bytes,uint32_t time_in_ms,uint32_t high_th,uint32_t low_th)763*5113495bSYour Name static inline void cdp_vdev_set_bundle_require_flag(ol_txrx_soc_handle soc,
764*5113495bSYour Name 						    uint8_t vdev_id,
765*5113495bSYour Name 						    unsigned long tx_bytes,
766*5113495bSYour Name 						    uint32_t time_in_ms,
767*5113495bSYour Name 						    uint32_t high_th,
768*5113495bSYour Name 						    uint32_t low_th)
769*5113495bSYour Name {
770*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
771*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
772*5113495bSYour Name 			  "%s invalid instance", __func__);
773*5113495bSYour Name 		return;
774*5113495bSYour Name 	}
775*5113495bSYour Name 
776*5113495bSYour Name 	if (soc->ops->misc_ops->vdev_set_bundle_require_flag)
777*5113495bSYour Name 		return soc->ops->misc_ops->vdev_set_bundle_require_flag(
778*5113495bSYour Name 			vdev_id, tx_bytes, time_in_ms, high_th, low_th);
779*5113495bSYour Name }
780*5113495bSYour Name 
cdp_pdev_reset_bundle_require_flag(ol_txrx_soc_handle soc,uint8_t pdev_id)781*5113495bSYour Name static inline void cdp_pdev_reset_bundle_require_flag(ol_txrx_soc_handle soc,
782*5113495bSYour Name 						      uint8_t pdev_id)
783*5113495bSYour Name {
784*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
785*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
786*5113495bSYour Name 			  "%s invalid instance", __func__);
787*5113495bSYour Name 		return;
788*5113495bSYour Name 	}
789*5113495bSYour Name 
790*5113495bSYour Name 	if (soc->ops->misc_ops->pdev_reset_bundle_require_flag)
791*5113495bSYour Name 		return soc->ops->misc_ops->pdev_reset_bundle_require_flag(
792*5113495bSYour Name 								soc, pdev_id);
793*5113495bSYour Name }
794*5113495bSYour Name 
795*5113495bSYour Name /**
796*5113495bSYour Name  * cdp_txrx_ext_stats_request() - request dp tx and rx extended stats
797*5113495bSYour Name  * @soc: soc handle
798*5113495bSYour Name  * @pdev_id: pdev id
799*5113495bSYour Name  * @req: stats request structure to fill
800*5113495bSYour Name  *
801*5113495bSYour Name  * Return: QDF_STATUS
802*5113495bSYour Name  */
803*5113495bSYour Name static inline QDF_STATUS
cdp_txrx_ext_stats_request(ol_txrx_soc_handle soc,uint8_t pdev_id,struct cdp_txrx_ext_stats * req)804*5113495bSYour Name cdp_txrx_ext_stats_request(ol_txrx_soc_handle soc, uint8_t pdev_id,
805*5113495bSYour Name 			   struct cdp_txrx_ext_stats *req)
806*5113495bSYour Name {
807*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops || !req) {
808*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
809*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
810*5113495bSYour Name 	}
811*5113495bSYour Name 
812*5113495bSYour Name 	if (soc->ops->misc_ops->txrx_ext_stats_request)
813*5113495bSYour Name 		return soc->ops->misc_ops->txrx_ext_stats_request(soc, pdev_id,
814*5113495bSYour Name 								  req);
815*5113495bSYour Name 
816*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
817*5113495bSYour Name }
818*5113495bSYour Name 
819*5113495bSYour Name /**
820*5113495bSYour Name  * cdp_request_rx_hw_stats() - request rx hw stats
821*5113495bSYour Name  * @soc: soc handle
822*5113495bSYour Name  * @vdev_id: vdev id
823*5113495bSYour Name  *
824*5113495bSYour Name  * Return: QDF_STATUS
825*5113495bSYour Name  */
826*5113495bSYour Name static inline QDF_STATUS
cdp_request_rx_hw_stats(ol_txrx_soc_handle soc,uint8_t vdev_id)827*5113495bSYour Name cdp_request_rx_hw_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
828*5113495bSYour Name {
829*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
830*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
831*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
832*5113495bSYour Name 	}
833*5113495bSYour Name 
834*5113495bSYour Name 	if (soc->ops->misc_ops->request_rx_hw_stats)
835*5113495bSYour Name 		return soc->ops->misc_ops->request_rx_hw_stats(soc, vdev_id);
836*5113495bSYour Name 
837*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
838*5113495bSYour Name }
839*5113495bSYour Name 
840*5113495bSYour Name /**
841*5113495bSYour Name  * cdp_reset_rx_hw_ext_stats() - reset rx hw ext stats
842*5113495bSYour Name  * @soc: soc handle
843*5113495bSYour Name  *
844*5113495bSYour Name  * Return: none
845*5113495bSYour Name  */
846*5113495bSYour Name static inline void
cdp_reset_rx_hw_ext_stats(ol_txrx_soc_handle soc)847*5113495bSYour Name cdp_reset_rx_hw_ext_stats(ol_txrx_soc_handle soc)
848*5113495bSYour Name {
849*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
850*5113495bSYour Name 		dp_cdp_debug("Invalid Instance");
851*5113495bSYour Name 		return;
852*5113495bSYour Name 	}
853*5113495bSYour Name 
854*5113495bSYour Name 	if (soc->ops->misc_ops->reset_rx_hw_ext_stats)
855*5113495bSYour Name 		soc->ops->misc_ops->reset_rx_hw_ext_stats(soc);
856*5113495bSYour Name }
857*5113495bSYour Name 
858*5113495bSYour Name /**
859*5113495bSYour Name  * cdp_vdev_inform_ll_conn() - Inform DP about the low latency connection
860*5113495bSYour Name  * @soc: soc handle
861*5113495bSYour Name  * @vdev_id: vdev id
862*5113495bSYour Name  * @action: Action to be performed (Add/Delete)
863*5113495bSYour Name  *
864*5113495bSYour Name  * Return: QDF_STATUS
865*5113495bSYour Name  */
866*5113495bSYour Name static inline QDF_STATUS
cdp_vdev_inform_ll_conn(ol_txrx_soc_handle soc,uint8_t vdev_id,enum vdev_ll_conn_actions action)867*5113495bSYour Name cdp_vdev_inform_ll_conn(ol_txrx_soc_handle soc, uint8_t vdev_id,
868*5113495bSYour Name 			enum vdev_ll_conn_actions action)
869*5113495bSYour Name {
870*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
871*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
872*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
873*5113495bSYour Name 	}
874*5113495bSYour Name 
875*5113495bSYour Name 	if (soc->ops->misc_ops->vdev_inform_ll_conn)
876*5113495bSYour Name 		return soc->ops->misc_ops->vdev_inform_ll_conn(soc, vdev_id,
877*5113495bSYour Name 							       action);
878*5113495bSYour Name 
879*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
880*5113495bSYour Name }
881*5113495bSYour Name 
882*5113495bSYour Name /**
883*5113495bSYour Name  * cdp_soc_set_swlm_enable() - Enable or disable software latency manager
884*5113495bSYour Name  * @soc: soc handle
885*5113495bSYour Name  * @value: value (enable/disable)
886*5113495bSYour Name  *
887*5113495bSYour Name  * Return: QDF_STATUS
888*5113495bSYour Name  */
889*5113495bSYour Name static inline QDF_STATUS
cdp_soc_set_swlm_enable(ol_txrx_soc_handle soc,uint8_t value)890*5113495bSYour Name cdp_soc_set_swlm_enable(ol_txrx_soc_handle soc, uint8_t value)
891*5113495bSYour Name {
892*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
893*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
894*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
895*5113495bSYour Name 	}
896*5113495bSYour Name 
897*5113495bSYour Name 	if (soc->ops->misc_ops->set_swlm_enable)
898*5113495bSYour Name 		return soc->ops->misc_ops->set_swlm_enable(soc, value);
899*5113495bSYour Name 
900*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
901*5113495bSYour Name }
902*5113495bSYour Name 
903*5113495bSYour Name /**
904*5113495bSYour Name  * cdp_soc_is_swlm_enabled() - Check if the software latency manager is
905*5113495bSYour Name  *			       enabled or not
906*5113495bSYour Name  * @soc: soc handle
907*5113495bSYour Name  *
908*5113495bSYour Name  * Return: 1 if enabled, 0 if disabled
909*5113495bSYour Name  */
910*5113495bSYour Name static inline uint8_t
cdp_soc_is_swlm_enabled(ol_txrx_soc_handle soc)911*5113495bSYour Name cdp_soc_is_swlm_enabled(ol_txrx_soc_handle soc)
912*5113495bSYour Name {
913*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
914*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
915*5113495bSYour Name 		return 0;
916*5113495bSYour Name 	}
917*5113495bSYour Name 
918*5113495bSYour Name 	if (soc->ops->misc_ops->is_swlm_enabled)
919*5113495bSYour Name 		return soc->ops->misc_ops->is_swlm_enabled(soc);
920*5113495bSYour Name 
921*5113495bSYour Name 	return 0;
922*5113495bSYour Name }
923*5113495bSYour Name 
924*5113495bSYour Name /**
925*5113495bSYour Name  * cdp_display_txrx_hw_info() - Dump the DP rings info
926*5113495bSYour Name  * @soc: soc handle
927*5113495bSYour Name  *
928*5113495bSYour Name  * Return: rings are empty
929*5113495bSYour Name  */
930*5113495bSYour Name static inline bool
cdp_display_txrx_hw_info(ol_txrx_soc_handle soc)931*5113495bSYour Name cdp_display_txrx_hw_info(ol_txrx_soc_handle soc)
932*5113495bSYour Name {
933*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
934*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
935*5113495bSYour Name 		return true;
936*5113495bSYour Name 	}
937*5113495bSYour Name 
938*5113495bSYour Name 	if (soc->ops->misc_ops->display_txrx_hw_info)
939*5113495bSYour Name 		return soc->ops->misc_ops->display_txrx_hw_info(soc);
940*5113495bSYour Name 
941*5113495bSYour Name 	return true;
942*5113495bSYour Name }
943*5113495bSYour Name 
944*5113495bSYour Name /**
945*5113495bSYour Name  * cdp_get_tx_rings_grp_bitmap() - Get tx rings grp bitmap
946*5113495bSYour Name  * @soc: soc handle
947*5113495bSYour Name  *
948*5113495bSYour Name  * Return: tx rings bitmap
949*5113495bSYour Name  */
950*5113495bSYour Name static inline uint32_t
cdp_get_tx_rings_grp_bitmap(ol_txrx_soc_handle soc)951*5113495bSYour Name cdp_get_tx_rings_grp_bitmap(ol_txrx_soc_handle soc)
952*5113495bSYour Name {
953*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
954*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
955*5113495bSYour Name 		return 0;
956*5113495bSYour Name 	}
957*5113495bSYour Name 
958*5113495bSYour Name 	if (soc->ops->misc_ops->get_tx_rings_grp_bitmap)
959*5113495bSYour Name 		return soc->ops->misc_ops->get_tx_rings_grp_bitmap(soc);
960*5113495bSYour Name 
961*5113495bSYour Name 	return 0;
962*5113495bSYour Name }
963*5113495bSYour Name 
964*5113495bSYour Name #ifdef WLAN_FEATURE_PEER_TXQ_FLUSH_CONF
965*5113495bSYour Name /**
966*5113495bSYour Name  * cdp_set_peer_txq_flush_config() - Set the peer txq flush configuration
967*5113495bSYour Name  * @soc: Opaque handle to the DP soc object
968*5113495bSYour Name  * @vdev_id: VDEV identifier
969*5113495bSYour Name  * @mac: MAC address of the peer
970*5113495bSYour Name  * @ac: access category mask
971*5113495bSYour Name  * @tid: TID mask
972*5113495bSYour Name  * @policy: Flush policy
973*5113495bSYour Name  *
974*5113495bSYour Name  * Return: 0 on success, errno on failure
975*5113495bSYour Name  */
976*5113495bSYour Name static inline int
cdp_set_peer_txq_flush_config(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * mac,uint8_t ac,uint32_t tid,enum cdp_peer_txq_flush_policy policy)977*5113495bSYour Name cdp_set_peer_txq_flush_config(ol_txrx_soc_handle soc, uint8_t vdev_id,
978*5113495bSYour Name 			      uint8_t *mac, uint8_t ac, uint32_t tid,
979*5113495bSYour Name 			      enum cdp_peer_txq_flush_policy policy)
980*5113495bSYour Name {
981*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops || !mac) {
982*5113495bSYour Name 		dp_cdp_debug("Invalid parameters");
983*5113495bSYour Name 		return 0;
984*5113495bSYour Name 	}
985*5113495bSYour Name 
986*5113495bSYour Name 	if (soc->ops->misc_ops->set_peer_txq_flush_config) {
987*5113495bSYour Name 		return soc->ops->misc_ops->set_peer_txq_flush_config(soc,
988*5113495bSYour Name 								     vdev_id,
989*5113495bSYour Name 								     mac, ac,
990*5113495bSYour Name 								     tid,
991*5113495bSYour Name 								     policy);
992*5113495bSYour Name 	}
993*5113495bSYour Name 
994*5113495bSYour Name 	return 0;
995*5113495bSYour Name }
996*5113495bSYour Name #endif /* WLAN_FEATURE_PEER_TXQ_FLUSH_CONF */
997*5113495bSYour Name #ifdef FEATURE_RX_LINKSPEED_ROAM_TRIGGER
998*5113495bSYour Name /**
999*5113495bSYour Name  * cdp_set_bus_vote_lvl_high() - have a vote on bus bandwidth lvl
1000*5113495bSYour Name  * @soc: datapath soc handle
1001*5113495bSYour Name  * @high: whether TPUT level is high or not
1002*5113495bSYour Name  *
1003*5113495bSYour Name  * Return: void
1004*5113495bSYour Name  */
1005*5113495bSYour Name static inline void
cdp_set_bus_vote_lvl_high(ol_txrx_soc_handle soc,bool high)1006*5113495bSYour Name cdp_set_bus_vote_lvl_high(ol_txrx_soc_handle soc, bool high)
1007*5113495bSYour Name {
1008*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops ||
1009*5113495bSYour Name 	    !soc->ops->misc_ops->set_bus_vote_lvl_high) {
1010*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
1011*5113495bSYour Name 		return;
1012*5113495bSYour Name 	}
1013*5113495bSYour Name 
1014*5113495bSYour Name 	soc->ops->misc_ops->set_bus_vote_lvl_high(soc, high);
1015*5113495bSYour Name }
1016*5113495bSYour Name 
1017*5113495bSYour Name /**
1018*5113495bSYour Name  * cdp_get_bus_lvl_high() - get high bus bandwidth lvl from dp
1019*5113495bSYour Name  * @soc: datapath soc handle
1020*5113495bSYour Name  *
1021*5113495bSYour Name  * Return: bool, whether TPUT level is high or not
1022*5113495bSYour Name  */
1023*5113495bSYour Name static inline bool
cdp_get_bus_lvl_high(ol_txrx_soc_handle soc)1024*5113495bSYour Name cdp_get_bus_lvl_high(ol_txrx_soc_handle soc)
1025*5113495bSYour Name {
1026*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops ||
1027*5113495bSYour Name 	    !soc->ops->misc_ops->get_bus_vote_lvl_high) {
1028*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
1029*5113495bSYour Name 		return false;
1030*5113495bSYour Name 	}
1031*5113495bSYour Name 
1032*5113495bSYour Name 	return soc->ops->misc_ops->get_bus_vote_lvl_high(soc);
1033*5113495bSYour Name }
1034*5113495bSYour Name #else
1035*5113495bSYour Name static inline void
cdp_set_bus_vote_lvl_high(ol_txrx_soc_handle soc,bool high)1036*5113495bSYour Name cdp_set_bus_vote_lvl_high(ol_txrx_soc_handle soc, bool high)
1037*5113495bSYour Name {
1038*5113495bSYour Name }
1039*5113495bSYour Name 
1040*5113495bSYour Name static inline bool
cdp_get_bus_lvl_high(ol_txrx_soc_handle soc)1041*5113495bSYour Name cdp_get_bus_lvl_high(ol_txrx_soc_handle soc)
1042*5113495bSYour Name {
1043*5113495bSYour Name 	/*
1044*5113495bSYour Name 	 * default bus lvl is high to
1045*5113495bSYour Name 	 * make sure not affect tput
1046*5113495bSYour Name 	 */
1047*5113495bSYour Name 	return true;
1048*5113495bSYour Name }
1049*5113495bSYour Name #endif
1050*5113495bSYour Name 
1051*5113495bSYour Name #ifdef DP_TX_PACKET_INSPECT_FOR_ILP
1052*5113495bSYour Name /**
1053*5113495bSYour Name  * cdp_evaluate_update_tx_ilp_cfg() - Evaluate and update DP TX
1054*5113495bSYour Name  *                                    ILP configuration
1055*5113495bSYour Name  * @soc: DP SOC handle
1056*5113495bSYour Name  * @num_msdu_idx_map: Number of HTT msdu index to qtype map in array
1057*5113495bSYour Name  * @msdu_idx_map_arr: Pointer to HTT msdu index to qtype map array
1058*5113495bSYour Name  *
1059*5113495bSYour Name  * Return: Final updated TX ILP enable result, true - enabled, false - not
1060*5113495bSYour Name  */
1061*5113495bSYour Name static inline bool
cdp_evaluate_update_tx_ilp_cfg(ol_txrx_soc_handle soc,uint8_t num_msdu_idx_map,uint8_t * msdu_idx_map_arr)1062*5113495bSYour Name cdp_evaluate_update_tx_ilp_cfg(ol_txrx_soc_handle soc,
1063*5113495bSYour Name 			       uint8_t num_msdu_idx_map,
1064*5113495bSYour Name 			       uint8_t *msdu_idx_map_arr)
1065*5113495bSYour Name {
1066*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->misc_ops ||
1067*5113495bSYour Name 	    !soc->ops->misc_ops->evaluate_update_tx_ilp_cfg) {
1068*5113495bSYour Name 		dp_cdp_debug("Invalid Instance:");
1069*5113495bSYour Name 		return false;
1070*5113495bSYour Name 	}
1071*5113495bSYour Name 
1072*5113495bSYour Name 	return soc->ops->misc_ops->evaluate_update_tx_ilp_cfg(
1073*5113495bSYour Name 						soc, num_msdu_idx_map,
1074*5113495bSYour Name 						msdu_idx_map_arr);
1075*5113495bSYour Name }
1076*5113495bSYour Name #endif /* DP_TX_PACKET_INSPECT_FOR_ILP */
1077*5113495bSYour Name #endif /* _CDP_TXRX_MISC_H_ */
1078