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