xref: /wlan-driver/qca-wifi-host-cmn/dp/inc/cdp_txrx_ipa.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-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
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_ipa.h
22*5113495bSYour Name  *      Define the host data path IP Acceleraor API functions
23*5113495bSYour Name  */
24*5113495bSYour Name #ifndef _CDP_TXRX_IPA_H_
25*5113495bSYour Name #define _CDP_TXRX_IPA_H_
26*5113495bSYour Name 
27*5113495bSYour Name #ifdef IPA_OFFLOAD
28*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \
29*5113495bSYour Name 	defined(CONFIG_IPA_WDI_UNIFIED_API)
30*5113495bSYour Name #include <qdf_ipa_wdi3.h>
31*5113495bSYour Name #else
32*5113495bSYour Name #include <qdf_ipa.h>
33*5113495bSYour Name #endif
34*5113495bSYour Name #include <cdp_txrx_cmn.h>
35*5113495bSYour Name #include "cdp_txrx_handle.h"
36*5113495bSYour Name #ifdef IPA_OPT_WIFI_DP
37*5113495bSYour Name #include <target_if.h>
38*5113495bSYour Name #endif
39*5113495bSYour Name 
40*5113495bSYour Name /**
41*5113495bSYour Name  * cdp_ipa_get_resource() - Get allocated WLAN resources for IPA data path
42*5113495bSYour Name  * @soc: data path soc handle
43*5113495bSYour Name  * @pdev_id: device instance id
44*5113495bSYour Name  *
45*5113495bSYour Name  * Get allocated WLAN resources for IPA data path
46*5113495bSYour Name  *
47*5113495bSYour Name  * return QDF_STATUS_SUCCESS
48*5113495bSYour Name  */
49*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_get_resource(ol_txrx_soc_handle soc,uint8_t pdev_id)50*5113495bSYour Name cdp_ipa_get_resource(ol_txrx_soc_handle soc, uint8_t pdev_id)
51*5113495bSYour Name {
52*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
53*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
54*5113495bSYour Name 			"%s invalid instance", __func__);
55*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
56*5113495bSYour Name 	}
57*5113495bSYour Name 
58*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_get_resource)
59*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_get_resource(soc, pdev_id);
60*5113495bSYour Name 
61*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
62*5113495bSYour Name }
63*5113495bSYour Name 
64*5113495bSYour Name /**
65*5113495bSYour Name  * cdp_ipa_set_doorbell_paddr() - give IPA db paddr to FW
66*5113495bSYour Name  * @soc: data path soc handle
67*5113495bSYour Name  * @pdev_id: device instance id
68*5113495bSYour Name  *
69*5113495bSYour Name  * give IPA db paddr to FW
70*5113495bSYour Name  *
71*5113495bSYour Name  * return QDF_STATUS_SUCCESS
72*5113495bSYour Name  */
73*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_set_doorbell_paddr(ol_txrx_soc_handle soc,uint8_t pdev_id)74*5113495bSYour Name cdp_ipa_set_doorbell_paddr(ol_txrx_soc_handle soc, uint8_t pdev_id)
75*5113495bSYour Name {
76*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
77*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
78*5113495bSYour Name 			"%s invalid instance", __func__);
79*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
80*5113495bSYour Name 	}
81*5113495bSYour Name 
82*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_set_doorbell_paddr)
83*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_set_doorbell_paddr(soc, pdev_id);
84*5113495bSYour Name 
85*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
86*5113495bSYour Name }
87*5113495bSYour Name 
88*5113495bSYour Name /**
89*5113495bSYour Name  * cdp_ipa_iounmap_doorbell_vaddr() - unmap IPA RX db vaddr
90*5113495bSYour Name  * @soc: data path soc handle
91*5113495bSYour Name  * @pdev_id: device instance id
92*5113495bSYour Name  *
93*5113495bSYour Name  * Unmap IPA RX db vaddr
94*5113495bSYour Name  *
95*5113495bSYour Name  * return QDF_STATUS_SUCCESS
96*5113495bSYour Name  */
97*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_iounmap_doorbell_vaddr(ol_txrx_soc_handle soc,uint8_t pdev_id)98*5113495bSYour Name cdp_ipa_iounmap_doorbell_vaddr(ol_txrx_soc_handle soc, uint8_t pdev_id)
99*5113495bSYour Name {
100*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
101*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
102*5113495bSYour Name 			 "%s invalid instance", __func__);
103*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
104*5113495bSYour Name 	}
105*5113495bSYour Name 
106*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_iounmap_doorbell_vaddr)
107*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_iounmap_doorbell_vaddr(
108*5113495bSYour Name 					soc, pdev_id);
109*5113495bSYour Name 
110*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
111*5113495bSYour Name }
112*5113495bSYour Name 
113*5113495bSYour Name /**
114*5113495bSYour Name  * cdp_ipa_set_active() - activate/de-ctivate IPA offload path
115*5113495bSYour Name  * @soc: data path soc handle
116*5113495bSYour Name  * @pdev_id: device instance id
117*5113495bSYour Name  * @uc_active: activate or de-activate
118*5113495bSYour Name  * @is_tx: toggle tx or rx data path
119*5113495bSYour Name  *
120*5113495bSYour Name  * activate/de-ctivate IPA offload path
121*5113495bSYour Name  *
122*5113495bSYour Name  * return QDF_STATUS_SUCCESS
123*5113495bSYour Name  */
124*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_set_active(ol_txrx_soc_handle soc,uint8_t pdev_id,bool uc_active,bool is_tx)125*5113495bSYour Name cdp_ipa_set_active(ol_txrx_soc_handle soc, uint8_t pdev_id, bool uc_active,
126*5113495bSYour Name 		   bool is_tx)
127*5113495bSYour Name {
128*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_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_FAILURE;
132*5113495bSYour Name 	}
133*5113495bSYour Name 
134*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_set_active)
135*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_set_active(soc, pdev_id,
136*5113495bSYour Name 				uc_active, is_tx);
137*5113495bSYour Name 
138*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
139*5113495bSYour Name }
140*5113495bSYour Name 
141*5113495bSYour Name /**
142*5113495bSYour Name  * cdp_ipa_op_response() - event handler from FW
143*5113495bSYour Name  * @soc: data path soc handle
144*5113495bSYour Name  * @pdev_id: device instance id
145*5113495bSYour Name  * @op_msg: event contents from firmware
146*5113495bSYour Name  *
147*5113495bSYour Name  * event handler from FW
148*5113495bSYour Name  *
149*5113495bSYour Name  * return QDF_STATUS_SUCCESS
150*5113495bSYour Name  */
151*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_op_response(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t * op_msg)152*5113495bSYour Name cdp_ipa_op_response(ol_txrx_soc_handle soc, uint8_t pdev_id, uint8_t *op_msg)
153*5113495bSYour Name {
154*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
155*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
156*5113495bSYour Name 			"%s invalid instance", __func__);
157*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
158*5113495bSYour Name 	}
159*5113495bSYour Name 
160*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_op_response)
161*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_op_response(soc, pdev_id, op_msg);
162*5113495bSYour Name 
163*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
164*5113495bSYour Name }
165*5113495bSYour Name 
166*5113495bSYour Name /**
167*5113495bSYour Name  * cdp_ipa_register_op_cb() - register event handler function pointer
168*5113495bSYour Name  * @soc: data path soc handle
169*5113495bSYour Name  * @pdev_id: device instance id
170*5113495bSYour Name  * @op_cb: event handler callback function pointer
171*5113495bSYour Name  * @usr_ctxt: user context to registered
172*5113495bSYour Name  *
173*5113495bSYour Name  * register event handler function pointer
174*5113495bSYour Name  *
175*5113495bSYour Name  * return QDF_STATUS_SUCCESS
176*5113495bSYour Name  */
177*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_register_op_cb(ol_txrx_soc_handle soc,uint8_t pdev_id,ipa_uc_op_cb_type op_cb,void * usr_ctxt)178*5113495bSYour Name cdp_ipa_register_op_cb(ol_txrx_soc_handle soc, uint8_t pdev_id,
179*5113495bSYour Name 		       ipa_uc_op_cb_type op_cb, void *usr_ctxt)
180*5113495bSYour Name {
181*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
182*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
183*5113495bSYour Name 			"%s invalid instance", __func__);
184*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
185*5113495bSYour Name 	}
186*5113495bSYour Name 
187*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_register_op_cb)
188*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_register_op_cb(soc, pdev_id,
189*5113495bSYour Name 							     op_cb, usr_ctxt);
190*5113495bSYour Name 
191*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
192*5113495bSYour Name }
193*5113495bSYour Name 
194*5113495bSYour Name /**
195*5113495bSYour Name  * cdp_ipa_deregister_op_cb() - deregister event handler function pointer
196*5113495bSYour Name  * @soc: data path soc handle
197*5113495bSYour Name  * @pdev_id: device instance id
198*5113495bSYour Name  *
199*5113495bSYour Name  * Deregister event handler function pointer from pdev
200*5113495bSYour Name  *
201*5113495bSYour Name  * return QDF_STATUS_SUCCESS
202*5113495bSYour Name  */
203*5113495bSYour Name static inline
cdp_ipa_deregister_op_cb(ol_txrx_soc_handle soc,uint8_t pdev_id)204*5113495bSYour Name void cdp_ipa_deregister_op_cb(ol_txrx_soc_handle soc, uint8_t pdev_id)
205*5113495bSYour Name {
206*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
207*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
208*5113495bSYour Name 			  "%s invalid instance", __func__);
209*5113495bSYour Name 		return;
210*5113495bSYour Name 	}
211*5113495bSYour Name 
212*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_deregister_op_cb)
213*5113495bSYour Name 		soc->ops->ipa_ops->ipa_deregister_op_cb(soc, pdev_id);
214*5113495bSYour Name }
215*5113495bSYour Name 
216*5113495bSYour Name /**
217*5113495bSYour Name  * cdp_ipa_get_stat() - get IPA data path stats from FW
218*5113495bSYour Name  * @soc: data path soc handle
219*5113495bSYour Name  * @pdev_id: device instance id
220*5113495bSYour Name  *
221*5113495bSYour Name  * get IPA data path stats from FW async
222*5113495bSYour Name  *
223*5113495bSYour Name  * return QDF_STATUS_SUCCESS
224*5113495bSYour Name  */
225*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_get_stat(ol_txrx_soc_handle soc,uint8_t pdev_id)226*5113495bSYour Name cdp_ipa_get_stat(ol_txrx_soc_handle soc, uint8_t pdev_id)
227*5113495bSYour Name {
228*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
229*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
230*5113495bSYour Name 			"%s invalid instance", __func__);
231*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
232*5113495bSYour Name 	}
233*5113495bSYour Name 
234*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_get_stat)
235*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_get_stat(soc, pdev_id);
236*5113495bSYour Name 
237*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
238*5113495bSYour Name }
239*5113495bSYour Name 
240*5113495bSYour Name /**
241*5113495bSYour Name  * cdp_ipa_tx_send_data_frame() - send IPA data frame
242*5113495bSYour Name  * @soc: data path soc handle
243*5113495bSYour Name  * @vdev_id: vdev id
244*5113495bSYour Name  * @skb: skb
245*5113495bSYour Name  *
246*5113495bSYour Name  * Return: skb/ NULL is for success
247*5113495bSYour Name  */
cdp_ipa_tx_send_data_frame(ol_txrx_soc_handle soc,uint8_t vdev_id,qdf_nbuf_t skb)248*5113495bSYour Name static inline qdf_nbuf_t cdp_ipa_tx_send_data_frame(ol_txrx_soc_handle soc,
249*5113495bSYour Name 						    uint8_t vdev_id,
250*5113495bSYour Name 						    qdf_nbuf_t skb)
251*5113495bSYour Name {
252*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
253*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
254*5113495bSYour Name 			"%s invalid instance", __func__);
255*5113495bSYour Name 		return skb;
256*5113495bSYour Name 	}
257*5113495bSYour Name 
258*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_tx_data_frame)
259*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_tx_data_frame(soc, vdev_id, skb);
260*5113495bSYour Name 
261*5113495bSYour Name 	return skb;
262*5113495bSYour Name }
263*5113495bSYour Name 
264*5113495bSYour Name /**
265*5113495bSYour Name  * cdp_ipa_set_uc_tx_partition_base() - set tx packet partition base
266*5113495bSYour Name  * @soc: data path soc handle
267*5113495bSYour Name  * @cfg_pdev: physical device instance config
268*5113495bSYour Name  * @value: partition base value
269*5113495bSYour Name  *
270*5113495bSYour Name  * Return: QDF_STATUS
271*5113495bSYour Name  */
272*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_set_uc_tx_partition_base(ol_txrx_soc_handle soc,struct cdp_cfg * cfg_pdev,uint32_t value)273*5113495bSYour Name cdp_ipa_set_uc_tx_partition_base(ol_txrx_soc_handle soc,
274*5113495bSYour Name 				struct cdp_cfg *cfg_pdev, uint32_t value)
275*5113495bSYour Name {
276*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops || !cfg_pdev) {
277*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
278*5113495bSYour Name 			"%s invalid instance", __func__);
279*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
280*5113495bSYour Name 	}
281*5113495bSYour Name 
282*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_set_uc_tx_partition_base)
283*5113495bSYour Name 		soc->ops->ipa_ops->ipa_set_uc_tx_partition_base(cfg_pdev,
284*5113495bSYour Name 								value);
285*5113495bSYour Name 
286*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
287*5113495bSYour Name }
288*5113495bSYour Name 
289*5113495bSYour Name #ifdef FEATURE_METERING
290*5113495bSYour Name /**
291*5113495bSYour Name  * cdp_ipa_uc_get_share_stats() - get Tx/Rx byte stats from FW
292*5113495bSYour Name  * @soc: data path soc handle
293*5113495bSYour Name  * @pdev_id: physical device instance number
294*5113495bSYour Name  * @value: reset stats
295*5113495bSYour Name  *
296*5113495bSYour Name  * Return: QDF_STATUS
297*5113495bSYour Name  */
298*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_uc_get_share_stats(ol_txrx_soc_handle soc,uint8_t pdev_id,uint8_t value)299*5113495bSYour Name cdp_ipa_uc_get_share_stats(ol_txrx_soc_handle soc, uint8_t pdev_id,
300*5113495bSYour Name 			   uint8_t value)
301*5113495bSYour Name {
302*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
303*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
304*5113495bSYour Name 			"%s invalid instance", __func__);
305*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
306*5113495bSYour Name 	}
307*5113495bSYour Name 
308*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_uc_get_share_stats)
309*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_uc_get_share_stats(soc, pdev_id,
310*5113495bSYour Name 								 value);
311*5113495bSYour Name 
312*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
313*5113495bSYour Name }
314*5113495bSYour Name 
315*5113495bSYour Name /**
316*5113495bSYour Name  * cdp_ipa_uc_set_quota() - set quota limit to FW
317*5113495bSYour Name  * @soc: data path soc handle
318*5113495bSYour Name  * @pdev_id: physical device instance number
319*5113495bSYour Name  * @value: quota limit bytes
320*5113495bSYour Name  *
321*5113495bSYour Name  * Return: QDF_STATUS
322*5113495bSYour Name  */
323*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_uc_set_quota(ol_txrx_soc_handle soc,uint8_t pdev_id,uint64_t value)324*5113495bSYour Name cdp_ipa_uc_set_quota(ol_txrx_soc_handle soc, uint8_t pdev_id, uint64_t value)
325*5113495bSYour Name {
326*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
327*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
328*5113495bSYour Name 			"%s invalid instance", __func__);
329*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
330*5113495bSYour Name 	}
331*5113495bSYour Name 
332*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_uc_set_quota)
333*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_uc_set_quota(soc, pdev_id, value);
334*5113495bSYour Name 
335*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
336*5113495bSYour Name }
337*5113495bSYour Name #endif
338*5113495bSYour Name 
339*5113495bSYour Name /**
340*5113495bSYour Name  * cdp_ipa_enable_autonomy() - Enable autonomy RX data path
341*5113495bSYour Name  * @soc: data path soc handle
342*5113495bSYour Name  * @pdev_id: physical device instance number
343*5113495bSYour Name  *
344*5113495bSYour Name  * IPA Data path is enabled and resumed.
345*5113495bSYour Name  * All autonomy data path elements are ready to deliver packet
346*5113495bSYour Name  * All RX packet should routed to IPA_REO ring, then IPA can receive packet
347*5113495bSYour Name  * from WLAN
348*5113495bSYour Name  *
349*5113495bSYour Name  * Return: QDF_STATUS
350*5113495bSYour Name  */
351*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_enable_autonomy(ol_txrx_soc_handle soc,uint8_t pdev_id)352*5113495bSYour Name cdp_ipa_enable_autonomy(ol_txrx_soc_handle soc, uint8_t pdev_id)
353*5113495bSYour Name {
354*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_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 QDF_STATUS_E_FAILURE;
358*5113495bSYour Name 	}
359*5113495bSYour Name 
360*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_enable_autonomy)
361*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_enable_autonomy(soc, pdev_id);
362*5113495bSYour Name 
363*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
364*5113495bSYour Name }
365*5113495bSYour Name 
366*5113495bSYour Name /**
367*5113495bSYour Name  * cdp_ipa_disable_autonomy() - Disable autonomy RX data path
368*5113495bSYour Name  * @soc: data path soc handle
369*5113495bSYour Name  * @pdev_id: physical device instance number
370*5113495bSYour Name  *
371*5113495bSYour Name  * IPA Data path is enabled and resumed.
372*5113495bSYour Name  * All autonomy datapath elements are ready to deliver packet
373*5113495bSYour Name  * All RX packet should routed to IPA_REO ring, then IPA can receive packet
374*5113495bSYour Name  * from WLAN
375*5113495bSYour Name  *
376*5113495bSYour Name  * Return: QDF_STATUS
377*5113495bSYour Name  */
378*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_disable_autonomy(ol_txrx_soc_handle soc,uint8_t pdev_id)379*5113495bSYour Name cdp_ipa_disable_autonomy(ol_txrx_soc_handle soc, uint8_t pdev_id)
380*5113495bSYour Name {
381*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
382*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
383*5113495bSYour Name 			"%s invalid instance", __func__);
384*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
385*5113495bSYour Name 	}
386*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_disable_autonomy)
387*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_disable_autonomy(soc, pdev_id);
388*5113495bSYour Name 
389*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
390*5113495bSYour Name }
391*5113495bSYour Name 
392*5113495bSYour Name #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \
393*5113495bSYour Name 	defined(CONFIG_IPA_WDI_UNIFIED_API)
394*5113495bSYour Name 
395*5113495bSYour Name /**
396*5113495bSYour Name  * cdp_ipa_setup() - Setup and connect IPA pipes
397*5113495bSYour Name  * @soc: data path soc handle
398*5113495bSYour Name  * @pdev_id: handle to the device instance number
399*5113495bSYour Name  * @ipa_i2w_cb: IPA to WLAN callback
400*5113495bSYour Name  * @ipa_w2i_cb: WLAN to IPA callback
401*5113495bSYour Name  * @ipa_wdi_meter_notifier_cb: IPA WDI metering callback
402*5113495bSYour Name  * @ipa_desc_size: IPA descriptor size
403*5113495bSYour Name  * @ipa_priv: handle to the HTT instance
404*5113495bSYour Name  * @is_rm_enabled: Is IPA RM enabled or not
405*5113495bSYour Name  * @tx_pipe_handle: pointer to Tx pipe handle
406*5113495bSYour Name  * @rx_pipe_handle: pointer to Rx pipe handle
407*5113495bSYour Name  * @is_smmu_enabled: Is SMMU enabled or not
408*5113495bSYour Name  * @sys_in: parameters to setup sys pipe in mcc mode
409*5113495bSYour Name  * @over_gsi: Is IPA using GSI
410*5113495bSYour Name  * @hdl: IPA handle
411*5113495bSYour Name  * @id: IPA instance id
412*5113495bSYour Name  * @ipa_ast_notify_cb: IPA to WLAN callback for ast create
413*5113495bSYour Name  *
414*5113495bSYour Name  * Return: QDF_STATUS
415*5113495bSYour Name  */
416*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_setup(ol_txrx_soc_handle soc,uint8_t pdev_id,void * ipa_i2w_cb,void * ipa_w2i_cb,void * ipa_wdi_meter_notifier_cb,uint32_t ipa_desc_size,void * ipa_priv,bool is_rm_enabled,uint32_t * tx_pipe_handle,uint32_t * rx_pipe_handle,bool is_smmu_enabled,qdf_ipa_sys_connect_params_t * sys_in,bool over_gsi,qdf_ipa_wdi_hdl_t hdl,qdf_ipa_wdi_hdl_t id,void * ipa_ast_notify_cb)417*5113495bSYour Name cdp_ipa_setup(ol_txrx_soc_handle soc, uint8_t pdev_id, void *ipa_i2w_cb,
418*5113495bSYour Name 	      void *ipa_w2i_cb, void *ipa_wdi_meter_notifier_cb,
419*5113495bSYour Name 	      uint32_t ipa_desc_size, void *ipa_priv, bool is_rm_enabled,
420*5113495bSYour Name 	      uint32_t *tx_pipe_handle, uint32_t *rx_pipe_handle,
421*5113495bSYour Name 	      bool is_smmu_enabled, qdf_ipa_sys_connect_params_t *sys_in,
422*5113495bSYour Name 	      bool over_gsi, qdf_ipa_wdi_hdl_t hdl, qdf_ipa_wdi_hdl_t id,
423*5113495bSYour Name 	      void *ipa_ast_notify_cb)
424*5113495bSYour Name {
425*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
426*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
427*5113495bSYour Name 			"%s invalid instance", __func__);
428*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
429*5113495bSYour Name 	}
430*5113495bSYour Name 
431*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_setup)
432*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_setup(soc, pdev_id, ipa_i2w_cb,
433*5113495bSYour Name 						    ipa_w2i_cb,
434*5113495bSYour Name 						    ipa_wdi_meter_notifier_cb,
435*5113495bSYour Name 						    ipa_desc_size, ipa_priv,
436*5113495bSYour Name 						    is_rm_enabled,
437*5113495bSYour Name 						    tx_pipe_handle,
438*5113495bSYour Name 						    rx_pipe_handle,
439*5113495bSYour Name 						    is_smmu_enabled,
440*5113495bSYour Name 						    sys_in, over_gsi, hdl, id,
441*5113495bSYour Name 						    ipa_ast_notify_cb);
442*5113495bSYour Name 
443*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
444*5113495bSYour Name }
445*5113495bSYour Name #else /* CONFIG_IPA_WDI_UNIFIED_API */
446*5113495bSYour Name /**
447*5113495bSYour Name  * cdp_ipa_setup() - Setup and connect IPA pipes
448*5113495bSYour Name  * @soc: data path soc handle
449*5113495bSYour Name  * @pdev_id: handle to the device instance number
450*5113495bSYour Name  * @ipa_i2w_cb: IPA to WLAN callback
451*5113495bSYour Name  * @ipa_w2i_cb: WLAN to IPA callback
452*5113495bSYour Name  * @ipa_wdi_meter_notifier_cb: IPA WDI metering callback
453*5113495bSYour Name  * @ipa_desc_size: IPA descriptor size
454*5113495bSYour Name  * @ipa_priv: handle to the HTT instance
455*5113495bSYour Name  * @is_rm_enabled: Is IPA RM enabled or not
456*5113495bSYour Name  * @tx_pipe_handle: pointer to Tx pipe handle
457*5113495bSYour Name  * @rx_pipe_handle: pointer to Rx pipe handle
458*5113495bSYour Name  *
459*5113495bSYour Name  * Return: QDF_STATUS
460*5113495bSYour Name  */
461*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_setup(ol_txrx_soc_handle soc,uint8_t pdev_id,void * ipa_i2w_cb,void * ipa_w2i_cb,void * ipa_wdi_meter_notifier_cb,uint32_t ipa_desc_size,void * ipa_priv,bool is_rm_enabled,uint32_t * tx_pipe_handle,uint32_t * rx_pipe_handle)462*5113495bSYour Name cdp_ipa_setup(ol_txrx_soc_handle soc, uint8_t pdev_id, void *ipa_i2w_cb,
463*5113495bSYour Name 	      void *ipa_w2i_cb, void *ipa_wdi_meter_notifier_cb,
464*5113495bSYour Name 	      uint32_t ipa_desc_size, void *ipa_priv, bool is_rm_enabled,
465*5113495bSYour Name 	      uint32_t *tx_pipe_handle, uint32_t *rx_pipe_handle)
466*5113495bSYour Name {
467*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
468*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
469*5113495bSYour Name 			"%s invalid instance", __func__);
470*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
471*5113495bSYour Name 	}
472*5113495bSYour Name 
473*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_setup)
474*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_setup(soc, pdev_id, ipa_i2w_cb,
475*5113495bSYour Name 						    ipa_w2i_cb,
476*5113495bSYour Name 						    ipa_wdi_meter_notifier_cb,
477*5113495bSYour Name 						    ipa_desc_size, ipa_priv,
478*5113495bSYour Name 						    is_rm_enabled,
479*5113495bSYour Name 						    tx_pipe_handle,
480*5113495bSYour Name 						    rx_pipe_handle);
481*5113495bSYour Name 
482*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
483*5113495bSYour Name }
484*5113495bSYour Name #endif /* CONFIG_IPA_WDI_UNIFIED_API */
485*5113495bSYour Name 
486*5113495bSYour Name /**
487*5113495bSYour Name  * cdp_ipa_cleanup() - Disconnect IPA pipes
488*5113495bSYour Name  * @soc: data path soc handle
489*5113495bSYour Name  * @pdev_id: handle to the device instance number
490*5113495bSYour Name  * @tx_pipe_handle: Tx pipe handle
491*5113495bSYour Name  * @rx_pipe_handle: Rx pipe handle
492*5113495bSYour Name  * @hdl: IPA handle
493*5113495bSYour Name  *
494*5113495bSYour Name  * Return: QDF_STATUS
495*5113495bSYour Name  */
496*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_cleanup(ol_txrx_soc_handle soc,uint8_t pdev_id,uint32_t tx_pipe_handle,uint32_t rx_pipe_handle,qdf_ipa_wdi_hdl_t hdl)497*5113495bSYour Name cdp_ipa_cleanup(ol_txrx_soc_handle soc, uint8_t pdev_id,
498*5113495bSYour Name 		uint32_t tx_pipe_handle, uint32_t rx_pipe_handle,
499*5113495bSYour Name 		qdf_ipa_wdi_hdl_t hdl)
500*5113495bSYour Name {
501*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
502*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
503*5113495bSYour Name 			"%s invalid instance", __func__);
504*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
505*5113495bSYour Name 	}
506*5113495bSYour Name 
507*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_cleanup)
508*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_cleanup(soc, pdev_id,
509*5113495bSYour Name 						      tx_pipe_handle,
510*5113495bSYour Name 						      rx_pipe_handle, hdl);
511*5113495bSYour Name 
512*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
513*5113495bSYour Name }
514*5113495bSYour Name 
515*5113495bSYour Name /**
516*5113495bSYour Name  * cdp_ipa_setup_iface() - Setup IPA header and register interface
517*5113495bSYour Name  * @soc: data path soc handle
518*5113495bSYour Name  * @ifname: Interface name
519*5113495bSYour Name  * @mac_addr: Interface MAC address
520*5113495bSYour Name  * @prod_client: IPA prod client type
521*5113495bSYour Name  * @cons_client: IPA cons client type
522*5113495bSYour Name  * @session_id: Session ID
523*5113495bSYour Name  * @is_ipv6_enabled: Is IPV6 enabled or not
524*5113495bSYour Name  * @hdl: IPA handle
525*5113495bSYour Name  *
526*5113495bSYour Name  * Return: QDF_STATUS
527*5113495bSYour Name  */
528*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_setup_iface(ol_txrx_soc_handle soc,char * ifname,uint8_t * mac_addr,qdf_ipa_client_type_t prod_client,qdf_ipa_client_type_t cons_client,uint8_t session_id,bool is_ipv6_enabled,qdf_ipa_wdi_hdl_t hdl)529*5113495bSYour Name cdp_ipa_setup_iface(ol_txrx_soc_handle soc, char *ifname, uint8_t *mac_addr,
530*5113495bSYour Name 		    qdf_ipa_client_type_t prod_client,
531*5113495bSYour Name 		    qdf_ipa_client_type_t cons_client,
532*5113495bSYour Name 		    uint8_t session_id, bool is_ipv6_enabled,
533*5113495bSYour Name 		    qdf_ipa_wdi_hdl_t hdl)
534*5113495bSYour Name {
535*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
536*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
537*5113495bSYour Name 			"%s invalid instance", __func__);
538*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
539*5113495bSYour Name 	}
540*5113495bSYour Name 
541*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_setup_iface)
542*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_setup_iface(ifname, mac_addr,
543*5113495bSYour Name 							  prod_client,
544*5113495bSYour Name 							  cons_client,
545*5113495bSYour Name 							  session_id,
546*5113495bSYour Name 							  is_ipv6_enabled,
547*5113495bSYour Name 							  hdl);
548*5113495bSYour Name 
549*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
550*5113495bSYour Name }
551*5113495bSYour Name 
552*5113495bSYour Name /**
553*5113495bSYour Name  * cdp_ipa_cleanup_iface() - Cleanup IPA header and deregister interface
554*5113495bSYour Name  * @soc: data path soc handle
555*5113495bSYour Name  * @ifname: Interface name
556*5113495bSYour Name  * @is_ipv6_enabled: Is IPV6 enabled or not
557*5113495bSYour Name  * @hdl: IPA handle
558*5113495bSYour Name  *
559*5113495bSYour Name  * Return: QDF_STATUS
560*5113495bSYour Name  */
561*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_cleanup_iface(ol_txrx_soc_handle soc,char * ifname,bool is_ipv6_enabled,qdf_ipa_wdi_hdl_t hdl)562*5113495bSYour Name cdp_ipa_cleanup_iface(ol_txrx_soc_handle soc, char *ifname,
563*5113495bSYour Name 		      bool is_ipv6_enabled, qdf_ipa_wdi_hdl_t hdl)
564*5113495bSYour Name {
565*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
566*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
567*5113495bSYour Name 			"%s invalid instance", __func__);
568*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
569*5113495bSYour Name 	}
570*5113495bSYour Name 
571*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_cleanup_iface)
572*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_cleanup_iface(ifname,
573*5113495bSYour Name 							    is_ipv6_enabled,
574*5113495bSYour Name 							    hdl);
575*5113495bSYour Name 
576*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
577*5113495bSYour Name }
578*5113495bSYour Name 
579*5113495bSYour Name  /**
580*5113495bSYour Name  * cdp_ipa_uc_enable_pipes() - Enable and resume traffic on Tx/Rx pipes
581*5113495bSYour Name  * @soc: data path soc handle
582*5113495bSYour Name  * @pdev_id: device instance id
583*5113495bSYour Name  * @hdl: IPA handle
584*5113495bSYour Name  *
585*5113495bSYour Name  * Return: QDF_STATUS
586*5113495bSYour Name  */
587*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_enable_pipes(ol_txrx_soc_handle soc,uint8_t pdev_id,qdf_ipa_wdi_hdl_t hdl)588*5113495bSYour Name cdp_ipa_enable_pipes(ol_txrx_soc_handle soc, uint8_t pdev_id,
589*5113495bSYour Name 		     qdf_ipa_wdi_hdl_t hdl)
590*5113495bSYour Name {
591*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
592*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
593*5113495bSYour Name 			"%s invalid instance", __func__);
594*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
595*5113495bSYour Name 	}
596*5113495bSYour Name 
597*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_enable_pipes)
598*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_enable_pipes(soc, pdev_id, hdl);
599*5113495bSYour Name 
600*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
601*5113495bSYour Name }
602*5113495bSYour Name 
603*5113495bSYour Name /**
604*5113495bSYour Name  * cdp_ipa_disable_pipes() - Suspend traffic and disable Tx/Rx pipes
605*5113495bSYour Name  * @soc: data path soc handle
606*5113495bSYour Name  * @pdev_id: device instance id
607*5113495bSYour Name  * @hdl: IPA handle
608*5113495bSYour Name  *
609*5113495bSYour Name  * Return: QDF_STATUS
610*5113495bSYour Name  */
611*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_disable_pipes(ol_txrx_soc_handle soc,uint8_t pdev_id,qdf_ipa_wdi_hdl_t hdl)612*5113495bSYour Name cdp_ipa_disable_pipes(ol_txrx_soc_handle soc, uint8_t pdev_id,
613*5113495bSYour Name 		      qdf_ipa_wdi_hdl_t hdl)
614*5113495bSYour Name {
615*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
616*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
617*5113495bSYour Name 			"%s invalid instance", __func__);
618*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
619*5113495bSYour Name 	}
620*5113495bSYour Name 
621*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_disable_pipes)
622*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_disable_pipes(soc, pdev_id, hdl);
623*5113495bSYour Name 
624*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
625*5113495bSYour Name }
626*5113495bSYour Name 
627*5113495bSYour Name /**
628*5113495bSYour Name  * cdp_ipa_set_perf_level() - Set IPA clock bandwidth based on data rates
629*5113495bSYour Name  * @soc: data path soc handle
630*5113495bSYour Name  * @client: WLAN Client ID
631*5113495bSYour Name  * @max_supported_bw_mbps: Maximum bandwidth needed (in Mbps)
632*5113495bSYour Name  * @hdl: IPA handle
633*5113495bSYour Name  *
634*5113495bSYour Name  * Return: 0 on success, negative errno on error
635*5113495bSYour Name  */
636*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_set_perf_level(ol_txrx_soc_handle soc,int client,uint32_t max_supported_bw_mbps,qdf_ipa_wdi_hdl_t hdl)637*5113495bSYour Name cdp_ipa_set_perf_level(ol_txrx_soc_handle soc, int client,
638*5113495bSYour Name 		       uint32_t max_supported_bw_mbps, qdf_ipa_wdi_hdl_t hdl)
639*5113495bSYour Name {
640*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
641*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
642*5113495bSYour Name 			"%s invalid instance", __func__);
643*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
644*5113495bSYour Name 	}
645*5113495bSYour Name 
646*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_set_perf_level)
647*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_set_perf_level(client,
648*5113495bSYour Name 				max_supported_bw_mbps, hdl);
649*5113495bSYour Name 
650*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
651*5113495bSYour Name }
652*5113495bSYour Name 
653*5113495bSYour Name #ifdef QCA_SUPPORT_WDS_EXTENDED
654*5113495bSYour Name /**
655*5113495bSYour Name  * cdp_ipa_rx_wdsext_iface() - Forward RX exception packets to wdsext interface
656*5113495bSYour Name  * @soc: data path soc handle
657*5113495bSYour Name  * @peer_id: Peer id to get respective peer
658*5113495bSYour Name  * @skb: socket buffer
659*5113495bSYour Name  *
660*5113495bSYour Name  * Return: true if packets sent to wds ext interface, else false.
661*5113495bSYour Name  */
662*5113495bSYour Name static inline bool
cdp_ipa_rx_wdsext_iface(ol_txrx_soc_handle soc,uint8_t peer_id,qdf_nbuf_t skb)663*5113495bSYour Name cdp_ipa_rx_wdsext_iface(ol_txrx_soc_handle soc, uint8_t peer_id,
664*5113495bSYour Name 			qdf_nbuf_t skb)
665*5113495bSYour Name {
666*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
667*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
668*5113495bSYour Name 			  "%s invalid instance", __func__);
669*5113495bSYour Name 		return false;
670*5113495bSYour Name 	}
671*5113495bSYour Name 
672*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_rx_wdsext_iface)
673*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_rx_wdsext_iface(soc, peer_id,
674*5113495bSYour Name 							      skb);
675*5113495bSYour Name 
676*5113495bSYour Name 	return false;
677*5113495bSYour Name }
678*5113495bSYour Name #endif
679*5113495bSYour Name 
680*5113495bSYour Name /**
681*5113495bSYour Name  * cdp_ipa_rx_intrabss_fwd() - Perform intra-bss fwd for IPA RX path
682*5113495bSYour Name  *
683*5113495bSYour Name  * @soc: data path soc handle
684*5113495bSYour Name  * @vdev_id: vdev id
685*5113495bSYour Name  * @nbuf: pointer to skb of ethernet packet received from IPA RX path
686*5113495bSYour Name  * @fwd_success: pointer to indicate if skb succeeded in intra-bss TX
687*5113495bSYour Name  *
688*5113495bSYour Name  * This function performs intra-bss forwarding for WDI 3.0 IPA RX path.
689*5113495bSYour Name  *
690*5113495bSYour Name  * Return: true if packet is intra-bss fwd-ed and no need to pass to
691*5113495bSYour Name  *	   network stack. false if packet needs to be passed to network stack.
692*5113495bSYour Name  */
693*5113495bSYour Name static inline bool
cdp_ipa_rx_intrabss_fwd(ol_txrx_soc_handle soc,uint8_t vdev_id,qdf_nbuf_t nbuf,bool * fwd_success)694*5113495bSYour Name cdp_ipa_rx_intrabss_fwd(ol_txrx_soc_handle soc, uint8_t vdev_id,
695*5113495bSYour Name 			qdf_nbuf_t nbuf, bool *fwd_success)
696*5113495bSYour Name {
697*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops || !fwd_success) {
698*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
699*5113495bSYour Name 			  "%s invalid instance", __func__);
700*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
701*5113495bSYour Name 	}
702*5113495bSYour Name 
703*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_rx_intrabss_fwd)
704*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_rx_intrabss_fwd(soc, vdev_id,
705*5113495bSYour Name 							      nbuf,
706*5113495bSYour Name 							      fwd_success);
707*5113495bSYour Name 
708*5113495bSYour Name 	/* Fall back to pass up to stack */
709*5113495bSYour Name 	return false;
710*5113495bSYour Name }
711*5113495bSYour Name 
712*5113495bSYour Name /**
713*5113495bSYour Name  * cdp_ipa_tx_buf_smmu_mapping() - Create SMMU mappings for Tx
714*5113495bSYour Name  *				   buffers allocated to IPA
715*5113495bSYour Name  * @soc: data path soc handle
716*5113495bSYour Name  * @pdev_id: device instance id
717*5113495bSYour Name  * @line: line number
718*5113495bSYour Name  * @func: function name
719*5113495bSYour Name  *
720*5113495bSYour Name  * Create SMMU mappings for Tx buffers allocated to IPA
721*5113495bSYour Name  *
722*5113495bSYour Name  * return QDF_STATUS_SUCCESS
723*5113495bSYour Name  */
724*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_tx_buf_smmu_mapping(ol_txrx_soc_handle soc,uint8_t pdev_id,const char * func,uint32_t line)725*5113495bSYour Name cdp_ipa_tx_buf_smmu_mapping(ol_txrx_soc_handle soc, uint8_t pdev_id,
726*5113495bSYour Name 			    const char *func, uint32_t line)
727*5113495bSYour Name {
728*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
729*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
730*5113495bSYour Name 			  "%s invalid instance", __func__);
731*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
732*5113495bSYour Name 	}
733*5113495bSYour Name 
734*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_tx_buf_smmu_mapping)
735*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_tx_buf_smmu_mapping(soc, pdev_id,
736*5113495bSYour Name 								  func,
737*5113495bSYour Name 								  line);
738*5113495bSYour Name 
739*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
740*5113495bSYour Name }
741*5113495bSYour Name 
742*5113495bSYour Name /**
743*5113495bSYour Name  * cdp_ipa_tx_buf_smmu_unmapping() - Release SMMU mappings for Tx
744*5113495bSYour Name  *				     buffers allocated to IPA
745*5113495bSYour Name  * @soc: data path soc handle
746*5113495bSYour Name  * @pdev_id: device instance id
747*5113495bSYour Name  * @line: line number
748*5113495bSYour Name  * @func: function name
749*5113495bSYour Name  *
750*5113495bSYour Name  * Release SMMU mappings for Tx buffers allocated to IPA
751*5113495bSYour Name  *
752*5113495bSYour Name  * return QDF_STATUS_SUCCESS
753*5113495bSYour Name  */
754*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_tx_buf_smmu_unmapping(ol_txrx_soc_handle soc,uint8_t pdev_id,const char * func,uint32_t line)755*5113495bSYour Name cdp_ipa_tx_buf_smmu_unmapping(ol_txrx_soc_handle soc, uint8_t pdev_id,
756*5113495bSYour Name 			      const char *func, uint32_t line)
757*5113495bSYour Name {
758*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
759*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
760*5113495bSYour Name 			  "%s invalid instance", __func__);
761*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
762*5113495bSYour Name 	}
763*5113495bSYour Name 
764*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_tx_buf_smmu_unmapping)
765*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_tx_buf_smmu_unmapping(soc,
766*5113495bSYour Name 								    pdev_id,
767*5113495bSYour Name 								    func,
768*5113495bSYour Name 								    line);
769*5113495bSYour Name 
770*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
771*5113495bSYour Name }
772*5113495bSYour Name 
773*5113495bSYour Name /**
774*5113495bSYour Name  * cdp_ipa_rx_buf_smmu_pool_mapping() - Create SMMU mappings for Rx pool
775*5113495bSYour Name  * @soc: data path soc handle
776*5113495bSYour Name  * @pdev_id: pdev id
777*5113495bSYour Name  * @create: Map/unmap
778*5113495bSYour Name  * @line: line number
779*5113495bSYour Name  * @func: function name
780*5113495bSYour Name  *
781*5113495bSYour Name  * Create SMMU map/unmap for Rx buffers allocated to IPA
782*5113495bSYour Name  *
783*5113495bSYour Name  * return QDF_STATUS_SUCCESS
784*5113495bSYour Name  */
785*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_rx_buf_smmu_pool_mapping(ol_txrx_soc_handle soc,uint8_t pdev_id,bool create,const char * func,uint32_t line)786*5113495bSYour Name cdp_ipa_rx_buf_smmu_pool_mapping(ol_txrx_soc_handle soc, uint8_t pdev_id,
787*5113495bSYour Name 				 bool create, const char *func, uint32_t line)
788*5113495bSYour Name {
789*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
790*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
791*5113495bSYour Name 			  "%s invalid instance", __func__);
792*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
793*5113495bSYour Name 	}
794*5113495bSYour Name 
795*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_rx_buf_smmu_pool_mapping)
796*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_rx_buf_smmu_pool_mapping(soc,
797*5113495bSYour Name 						pdev_id, create, func, line);
798*5113495bSYour Name 
799*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
800*5113495bSYour Name }
801*5113495bSYour Name 
cdp_ipa_set_smmu_mapped(ol_txrx_soc_handle soc,int val)802*5113495bSYour Name static inline QDF_STATUS cdp_ipa_set_smmu_mapped(ol_txrx_soc_handle soc,
803*5113495bSYour Name 						 int val)
804*5113495bSYour Name {
805*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
806*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
807*5113495bSYour Name 			  "%s invalid instance", __func__);
808*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
809*5113495bSYour Name 	}
810*5113495bSYour Name 
811*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_set_smmu_mapped)
812*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_set_smmu_mapped(soc, val);
813*5113495bSYour Name 
814*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
815*5113495bSYour Name }
816*5113495bSYour Name 
cdp_ipa_get_smmu_mapped(ol_txrx_soc_handle soc)817*5113495bSYour Name static inline int cdp_ipa_get_smmu_mapped(ol_txrx_soc_handle soc)
818*5113495bSYour Name {
819*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
820*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
821*5113495bSYour Name 			  "%s invalid instance", __func__);
822*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
823*5113495bSYour Name 	}
824*5113495bSYour Name 
825*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_get_smmu_mapped)
826*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_get_smmu_mapped(soc);
827*5113495bSYour Name 
828*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
829*5113495bSYour Name }
830*5113495bSYour Name 
831*5113495bSYour Name #ifdef IPA_WDS_EASYMESH_FEATURE
832*5113495bSYour Name /**
833*5113495bSYour Name  * cdp_ipa_ast_create() - Create/update AST entry in AST table
834*5113495bSYour Name  *			  for learning/roaming packets from IPA
835*5113495bSYour Name  * @soc: data path soc handle
836*5113495bSYour Name  * @data: Structure used for updating the AST table
837*5113495bSYour Name  *
838*5113495bSYour Name  * Create/update AST entry in AST table for learning/roaming packets from IPA
839*5113495bSYour Name  *
840*5113495bSYour Name  * Return: QDF_STATUS
841*5113495bSYour Name  */
842*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_ast_create(ol_txrx_soc_handle soc,qdf_ipa_ast_info_type_t * data)843*5113495bSYour Name cdp_ipa_ast_create(ol_txrx_soc_handle soc, qdf_ipa_ast_info_type_t *data)
844*5113495bSYour Name {
845*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
846*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
847*5113495bSYour Name 			  "%s invalid instance", __func__);
848*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
849*5113495bSYour Name 	}
850*5113495bSYour Name 
851*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_ast_create)
852*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_ast_create(soc, data);
853*5113495bSYour Name 
854*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
855*5113495bSYour Name }
856*5113495bSYour Name #endif
857*5113495bSYour Name 
858*5113495bSYour Name #ifdef IPA_OPT_WIFI_DP
859*5113495bSYour Name /*
860*5113495bSYour Name  * cdp_ipa_pcie_link_up() - Send request to hold PCIe link in L0
861*5113495bSYour Name  * @soc - cdp soc handle
862*5113495bSYour Name  *
863*5113495bSYour Name  * Return: 0 for success, negative for failure
864*5113495bSYour Name  */
865*5113495bSYour Name static inline int
cdp_ipa_pcie_link_up(ol_txrx_soc_handle soc)866*5113495bSYour Name cdp_ipa_pcie_link_up(ol_txrx_soc_handle soc)
867*5113495bSYour Name {
868*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
869*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
870*5113495bSYour Name 			  "%s invalid instance", __func__);
871*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
872*5113495bSYour Name 	}
873*5113495bSYour Name 
874*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_pcie_link_up)
875*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_pcie_link_up(soc);
876*5113495bSYour Name 
877*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
878*5113495bSYour Name }
879*5113495bSYour Name 
880*5113495bSYour Name /*
881*5113495bSYour Name  * cdp_ipa_pcie_link_down() - Release request to hold PCIe link in L0
882*5113495bSYour Name  * @soc - cdp soc handle
883*5113495bSYour Name  *
884*5113495bSYour Name  * Return: 0 for success, negative for failure
885*5113495bSYour Name  */
886*5113495bSYour Name static inline int
cdp_ipa_pcie_link_down(ol_txrx_soc_handle soc)887*5113495bSYour Name cdp_ipa_pcie_link_down(ol_txrx_soc_handle soc)
888*5113495bSYour Name {
889*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
890*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
891*5113495bSYour Name 			  "%s invalid instance", __func__);
892*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
893*5113495bSYour Name 	}
894*5113495bSYour Name 
895*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_pcie_link_down)
896*5113495bSYour Name 		soc->ops->ipa_ops->ipa_pcie_link_down(soc);
897*5113495bSYour Name 
898*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
899*5113495bSYour Name }
900*5113495bSYour Name #endif
901*5113495bSYour Name 
902*5113495bSYour Name /**
903*5113495bSYour Name  * cdp_ipa_update_peer_rx_stats() - update peer rx stats
904*5113495bSYour Name  * @soc: data path soc handle
905*5113495bSYour Name  * @vdev_id: vdev id
906*5113495bSYour Name  * @peer_mac: Peer Mac Address
907*5113495bSYour Name  * @nbuf: pointer to data packet
908*5113495bSYour Name  *
909*5113495bSYour Name  * Return: QDF_STATUS
910*5113495bSYour Name  */
911*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_update_peer_rx_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,uint8_t * peer_mac,qdf_nbuf_t nbuf)912*5113495bSYour Name cdp_ipa_update_peer_rx_stats(ol_txrx_soc_handle soc, uint8_t vdev_id,
913*5113495bSYour Name 			     uint8_t *peer_mac, qdf_nbuf_t nbuf)
914*5113495bSYour Name {
915*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
916*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
917*5113495bSYour Name 			  "%s invalid instance", __func__);
918*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
919*5113495bSYour Name 	}
920*5113495bSYour Name 
921*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_update_peer_rx_stats)
922*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_update_peer_rx_stats(soc,
923*5113495bSYour Name 								   vdev_id,
924*5113495bSYour Name 								   peer_mac,
925*5113495bSYour Name 								   nbuf);
926*5113495bSYour Name 
927*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
928*5113495bSYour Name }
929*5113495bSYour Name 
930*5113495bSYour Name #ifdef IPA_OPT_WIFI_DP
931*5113495bSYour Name #define RX_CCE_SUPER_RULE_SETUP_NUM 2
932*5113495bSYour Name struct addr_params {
933*5113495bSYour Name 	uint8_t valid;
934*5113495bSYour Name 	uint8_t src_ipv4_addr[4];
935*5113495bSYour Name 	uint8_t dst_ipv4_addr[4];
936*5113495bSYour Name 	uint8_t src_ipv6_addr[16];
937*5113495bSYour Name 	uint8_t dst_ipv6_addr[16];
938*5113495bSYour Name 	uint8_t l4_type;
939*5113495bSYour Name 	uint16_t l3_type;
940*5113495bSYour Name 	uint16_t src_port;
941*5113495bSYour Name 	uint16_t dst_port;
942*5113495bSYour Name 	uint32_t flt_hdl;
943*5113495bSYour Name 	uint8_t ipa_flt_evnt_required;
944*5113495bSYour Name 	bool ipa_flt_in_use;
945*5113495bSYour Name };
946*5113495bSYour Name 
947*5113495bSYour Name struct wifi_dp_flt_setup {
948*5113495bSYour Name 	uint8_t pdev_id;
949*5113495bSYour Name 	uint8_t op;
950*5113495bSYour Name 	uint8_t num_filters;
951*5113495bSYour Name 	uint32_t ipa_flt_evnt_response;
952*5113495bSYour Name 	struct addr_params flt_addr_params[RX_CCE_SUPER_RULE_SETUP_NUM];
953*5113495bSYour Name };
954*5113495bSYour Name 
955*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_rx_cce_super_rule_setup(ol_txrx_soc_handle soc,void * flt_params)956*5113495bSYour Name cdp_ipa_rx_cce_super_rule_setup(ol_txrx_soc_handle soc,
957*5113495bSYour Name 				void *flt_params)
958*5113495bSYour Name {
959*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
960*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
961*5113495bSYour Name 			  "%s invalid instance", __func__);
962*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
963*5113495bSYour Name 	}
964*5113495bSYour Name 
965*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_rx_super_rule_setup)
966*5113495bSYour Name 		return soc->ops->ipa_ops->ipa_rx_super_rule_setup(soc,
967*5113495bSYour Name 								  flt_params);
968*5113495bSYour Name 
969*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
970*5113495bSYour Name }
971*5113495bSYour Name 
972*5113495bSYour Name static inline QDF_STATUS
cdp_ipa_opt_dp_enable_disable_low_power_mode(struct wlan_objmgr_pdev * pdev,uint32_t pdev_id,int param_val)973*5113495bSYour Name cdp_ipa_opt_dp_enable_disable_low_power_mode(struct wlan_objmgr_pdev *pdev,
974*5113495bSYour Name 					     uint32_t pdev_id, int param_val)
975*5113495bSYour Name {
976*5113495bSYour Name 	wmi_unified_t wmi_handle;
977*5113495bSYour Name 	struct wmi_unified *pdev_wmi_handle = NULL;
978*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
979*5113495bSYour Name 	struct pdev_params pparam;
980*5113495bSYour Name 	uint32_t vdev_id, val;
981*5113495bSYour Name 	QDF_STATUS status;
982*5113495bSYour Name 
983*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
984*5113495bSYour Name 	wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
985*5113495bSYour Name 	if (!wmi_handle) {
986*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
987*5113495bSYour Name 			  "Unable to get wmi handle");
988*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
989*5113495bSYour Name 	}
990*5113495bSYour Name 
991*5113495bSYour Name 	pdev_wmi_handle = pdev->tgt_if_handle->wmi_handle;
992*5113495bSYour Name 	qdf_mem_set(&pparam, sizeof(pparam), 0);
993*5113495bSYour Name 	pparam.is_host_pdev_id = false;
994*5113495bSYour Name 
995*5113495bSYour Name 	/* Enable-disable IMPS */
996*5113495bSYour Name 	pparam.param_id = WMI_PDEV_PARAM_IDLE_PS_CONFIG;
997*5113495bSYour Name 	pparam.param_value = param_val;
998*5113495bSYour Name 	status =  wmi_unified_pdev_param_send(wmi_handle,
999*5113495bSYour Name 					      &pparam, pdev_id);
1000*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
1001*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1002*5113495bSYour Name 			  "%s Unable to enable/disable:(%d) IMPS", __func__,
1003*5113495bSYour Name 			  param_val);
1004*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1005*5113495bSYour Name 	}
1006*5113495bSYour Name 
1007*5113495bSYour Name 	/* Enable-disable ILP */
1008*5113495bSYour Name 	pparam.param_id = WMI_PDEV_PARAM_PCIE_HW_ILP;
1009*5113495bSYour Name 	pparam.param_value = param_val;
1010*5113495bSYour Name 	status =  wmi_unified_pdev_param_send(pdev_wmi_handle,
1011*5113495bSYour Name 					      &pparam, pdev_id);
1012*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
1013*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1014*5113495bSYour Name 			  "%s Unable to enable/disable:(%d) ILP", __func__,
1015*5113495bSYour Name 			  param_val);
1016*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1017*5113495bSYour Name 	}
1018*5113495bSYour Name 
1019*5113495bSYour Name 	/* Enable-disable BMPS */
1020*5113495bSYour Name 	val = param_val;
1021*5113495bSYour Name 	vdev_id = 0; //TODO fix vdev_id
1022*5113495bSYour Name 	status = wmi_unified_set_sta_ps_mode(wmi_handle, vdev_id, val);
1023*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS) {
1024*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1025*5113495bSYour Name 			  "%s Unable to enable/disable:(%d) BMPS", __func__,
1026*5113495bSYour Name 			  param_val);
1027*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1028*5113495bSYour Name 	}
1029*5113495bSYour Name 
1030*5113495bSYour Name 	return status;
1031*5113495bSYour Name }
1032*5113495bSYour Name #endif /* IPA_OPT_WIFI_DP */
1033*5113495bSYour Name 
1034*5113495bSYour Name /**
1035*5113495bSYour Name  * cdp_ipa_get_wdi_version - Get WDI version
1036*5113495bSYour Name  * @soc: data path soc handle
1037*5113495bSYour Name  * @wdi_ver: Out param for wdi version
1038*5113495bSYour Name  *
1039*5113495bSYour Name  * Return: None
1040*5113495bSYour Name  */
1041*5113495bSYour Name static inline void
cdp_ipa_get_wdi_version(ol_txrx_soc_handle soc,uint8_t * wdi_ver)1042*5113495bSYour Name cdp_ipa_get_wdi_version(ol_txrx_soc_handle soc, uint8_t *wdi_ver)
1043*5113495bSYour Name {
1044*5113495bSYour Name 	if (!soc || !soc->ops || !soc->ops->ipa_ops) {
1045*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
1046*5113495bSYour Name 			  "%s invalid instance", __func__);
1047*5113495bSYour Name 		return;
1048*5113495bSYour Name 	}
1049*5113495bSYour Name 
1050*5113495bSYour Name 	if (soc->ops->ipa_ops->ipa_get_wdi_version)
1051*5113495bSYour Name 		soc->ops->ipa_ops->ipa_get_wdi_version(soc, wdi_ver);
1052*5113495bSYour Name }
1053*5113495bSYour Name #endif /* IPA_OFFLOAD */
1054*5113495bSYour Name #endif /* _CDP_TXRX_IPA_H_ */
1055