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