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