1 /* 2 * Copyright (c) 2018-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 * DOC: declare various api which shall be used by 21 * IPA user configuration and target interface 22 */ 23 24 #ifndef _WLAN_IPA_MAIN_H_ 25 #define _WLAN_IPA_MAIN_H_ 26 27 #ifdef IPA_OFFLOAD 28 29 #include <wlan_objmgr_psoc_obj.h> 30 #include <wlan_objmgr_pdev_obj.h> 31 #include <wlan_ipa_public_struct.h> 32 #include <wlan_ipa_priv.h> 33 #include "cfg_ucfg_api.h" 34 35 /* Declare a variable for IPA instancess added based on pdev */ 36 extern uint8_t g_instances_added; 37 #define IPA_INVALID_HDL 0xFF 38 #define IPA_OFFLOAD_CFG 0x7D 39 40 #define INTRL_MODE_DISABLE 0xEEEEEEEE 41 #define INTRL_MODE_ENABLE 0x27D 42 43 #define ipa_fatal(params...) \ 44 QDF_TRACE_FATAL(QDF_MODULE_ID_IPA, params) 45 #define ipa_err(params...) \ 46 QDF_TRACE_ERROR(QDF_MODULE_ID_IPA, params) 47 #define ipa_warn(params...) \ 48 QDF_TRACE_WARN(QDF_MODULE_ID_IPA, params) 49 #define ipa_info(params...) \ 50 QDF_TRACE_INFO(QDF_MODULE_ID_IPA, params) 51 #define ipa_debug(params...) \ 52 QDF_TRACE_DEBUG(QDF_MODULE_ID_IPA, params) 53 54 #define ipa_nofl_fatal(params...) \ 55 QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_IPA, params) 56 #define ipa_nofl_err(params...) \ 57 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_IPA, params) 58 #define ipa_nofl_warn(params...) \ 59 QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_IPA, params) 60 #define ipa_nofl_info(params...) \ 61 QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_IPA, params) 62 #define ipa_nofl_debug(params...) \ 63 QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_IPA, params) 64 65 #define ipa_fatal_rl(params...) QDF_TRACE_FATAL_RL(QDF_MODULE_ID_IPA, params) 66 #define ipa_err_rl(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_IPA, params) 67 #define ipa_warn_rl(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_IPA, params) 68 #define ipa_info_rl(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_IPA, params) 69 #define ipa_debug_rl(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_IPA, params) 70 71 #define IPA_ENTER() \ 72 QDF_TRACE_ENTER(QDF_MODULE_ID_IPA, "enter") 73 #define IPA_EXIT() \ 74 QDF_TRACE_EXIT(QDF_MODULE_ID_IPA, "exit") 75 76 /** 77 * ipa_set_pld_enable() - set g_ipa_pld_enable 78 * @flag: flag to set g_ipa_pld_enable 79 * 80 * Return: None 81 */ 82 void ipa_set_pld_enable(bool flag); 83 84 /** 85 * ipa_get_pld_enable() - check if IPA is disabled in pld 86 * 87 * Return: g_ipa_pld_enable 88 */ 89 bool ipa_get_pld_enable(void); 90 91 /** 92 * ipa_check_hw_present() - get IPA hw status 93 * 94 * ipa_uc_reg_rdyCB is not directly designed to check 95 * ipa hw status. This is an undocumented function which 96 * has confirmed with IPA team. 97 * 98 * Return: true - ipa hw present 99 * false - ipa hw not present 100 */ 101 bool ipa_check_hw_present(void); 102 103 /** 104 * ipa_pdev_get_priv_obj() - private API to get ipa pdev object 105 * @pdev: pdev object 106 * 107 * Return: ipa object 108 */ 109 static inline struct wlan_ipa_priv * 110 ipa_pdev_get_priv_obj(struct wlan_objmgr_pdev *pdev) 111 { 112 struct wlan_ipa_priv *pdev_obj; 113 114 pdev_obj = (struct wlan_ipa_priv *) 115 wlan_objmgr_pdev_get_comp_private_obj(pdev, 116 WLAN_UMAC_COMP_IPA); 117 118 return pdev_obj; 119 } 120 121 /** 122 * get_ipa_config() - API to get IPAConfig INI 123 * @psoc : psoc handle 124 * 125 * Return: IPA config value 126 */ 127 uint32_t get_ipa_config(struct wlan_objmgr_psoc *psoc); 128 129 /** 130 * ipa_priv_obj_get_pdev() - API to get pdev from IPA object 131 * @ipa_obj: IPA object 132 * 133 * Return: pdev object 134 */ 135 static inline struct wlan_objmgr_pdev * 136 ipa_priv_obj_get_pdev(struct wlan_ipa_priv *ipa_obj) 137 { 138 return ipa_obj->pdev; 139 } 140 141 /** 142 * ipa_is_hw_support() - Is IPA HW support? 143 * 144 * Return: true if IPA HW is present or false otherwise 145 */ 146 bool ipa_is_hw_support(void); 147 148 /** 149 * ipa_config_mem_alloc() - IPA config allocation 150 * 151 * Return: QDF_STATUS_SUCCESS on success 152 */ 153 QDF_STATUS ipa_config_mem_alloc(void); 154 155 /** 156 * ipa_config_mem_free() - IPA config mem free 157 * 158 * Return: None 159 */ 160 void ipa_config_mem_free(void); 161 162 /** 163 * ipa_config_is_enabled() - Is IPA config enabled? 164 * 165 * Return: true if IPA is enabled in IPA config 166 */ 167 bool ipa_config_is_enabled(void); 168 169 /** 170 * ipa_config_is_uc_enabled() - Is IPA uC config enabled? 171 * 172 * Return: true if IPA uC is enabled in IPA config 173 */ 174 bool ipa_config_is_uc_enabled(void); 175 176 /** 177 * ipa_config_is_opt_wifi_dp_enabled() - Is IPA optional wifi dp enabled? 178 * 179 * Return: true if IPA opt wifi dp is enabled in IPA config 180 */ 181 bool ipa_config_is_opt_wifi_dp_enabled(void); 182 183 /** 184 * ipa_config_is_vlan_enabled() - Is IPA vlan config enabled? 185 * 186 * Return: true if IPA clan support is enabled in IPA config 187 */ 188 bool ipa_config_is_vlan_enabled(void); 189 190 /** 191 * ipa_obj_setup() - IPA obj initialization and setup 192 * @ipa_ctx: IPA obj context 193 * 194 * Return: QDF_STATUS_SUCCESS on success 195 */ 196 QDF_STATUS ipa_obj_setup(struct wlan_ipa_priv *ipa_ctx); 197 198 /** 199 * ipa_obj_cleanup() - IPA obj cleanup 200 * @ipa_ctx: IPA obj context 201 * 202 * Return: QDF_STATUS_SUCCESS on success 203 */ 204 QDF_STATUS ipa_obj_cleanup(struct wlan_ipa_priv *ipa_ctx); 205 206 /** 207 * ipa_send_uc_offload_enable_disable() - wdi enable/disable notify to fw 208 * @pdev: objmgr pdev object 209 * @req: ipa offload control request 210 * 211 * Return: QDF status success or failure 212 */ 213 QDF_STATUS ipa_send_uc_offload_enable_disable(struct wlan_objmgr_pdev *pdev, 214 struct ipa_uc_offload_control_params *req); 215 216 /** 217 * ipa_send_intrabss_enable_disable() - wdi intrabss enable/disable notify to fw 218 * @pdev: objmgr pdev object 219 * @req: ipa intrabss control request 220 * 221 * Return: QDF status success or failure 222 */ 223 QDF_STATUS 224 ipa_send_intrabss_enable_disable(struct wlan_objmgr_pdev *pdev, 225 struct ipa_intrabss_control_params *req); 226 227 /** 228 * ipa_set_dp_handle() - set dp soc handle 229 * @psoc: psoc handle 230 * @dp_soc: dp soc handle 231 * 232 * Return: None 233 */ 234 void ipa_set_dp_handle(struct wlan_objmgr_psoc *psoc, void *dp_soc); 235 236 /** 237 * ipa_set_pdev_id() - set dp pdev id 238 * @psoc: psoc handle 239 * @pdev_id: dp txrx physical device id 240 * 241 * Return: None 242 */ 243 void ipa_set_pdev_id(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id); 244 245 /** 246 * ipa_rm_set_perf_level() - set ipa rm perf level 247 * @pdev: pdev handle 248 * @tx_packets: packets transmitted in the last sample period 249 * @rx_packets: packets received in the last sample period 250 * 251 * Return: QDF_STATUS 252 */ 253 QDF_STATUS ipa_rm_set_perf_level(struct wlan_objmgr_pdev *pdev, 254 uint64_t tx_packets, uint64_t rx_packets); 255 256 /** 257 * ipa_uc_info() - Print IPA uC resource and session information 258 * @pdev: pdev obj 259 * 260 * Return: None 261 */ 262 void ipa_uc_info(struct wlan_objmgr_pdev *pdev); 263 264 /** 265 * ipa_uc_stat() - Print IPA uC stats 266 * @pdev: pdev obj 267 * 268 * Return: None 269 */ 270 void ipa_uc_stat(struct wlan_objmgr_pdev *pdev); 271 272 /** 273 * ipa_uc_rt_debug_host_dump() - IPA rt debug host dump 274 * @pdev: pdev obj 275 * 276 * Return: None 277 */ 278 void ipa_uc_rt_debug_host_dump(struct wlan_objmgr_pdev *pdev); 279 280 /** 281 * ipa_dump_info() - Dump IPA context information 282 * @pdev: pdev obj 283 * 284 * Return: None 285 */ 286 void ipa_dump_info(struct wlan_objmgr_pdev *pdev); 287 288 /** 289 * ipa_uc_stat_request() - Get IPA stats from IPA. 290 * @pdev: pdev obj 291 * @reason: STAT REQ Reason 292 * 293 * Return: None 294 */ 295 void ipa_uc_stat_request(struct wlan_objmgr_pdev *pdev, 296 uint8_t reason); 297 298 /** 299 * ipa_uc_stat_query() - Query the IPA stats 300 * @pdev: pdev obj 301 * @ipa_tx_diff: tx packet count diff from previous tx packet count 302 * @ipa_rx_diff: rx packet count diff from previous rx packet count 303 * 304 * Return: None 305 */ 306 void ipa_uc_stat_query(struct wlan_objmgr_pdev *pdev, 307 uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff); 308 309 /** 310 * ipa_reg_sap_xmit_cb() - Register upper layer SAP cb to transmit 311 * @pdev: pdev obj 312 * @cb: callback 313 * 314 * Return: None 315 */ 316 void ipa_reg_sap_xmit_cb(struct wlan_objmgr_pdev *pdev, 317 wlan_ipa_softap_xmit cb); 318 319 /** 320 * ipa_reg_send_to_nw_cb() - Register cb to send IPA Rx packet to network 321 * @pdev: pdev obj 322 * @cb: callback 323 * 324 * Return: None 325 */ 326 void ipa_reg_send_to_nw_cb(struct wlan_objmgr_pdev *pdev, 327 wlan_ipa_send_to_nw cb); 328 329 #if defined(QCA_CONFIG_RPS) && !defined(MDM_PLATFORM) 330 /** 331 * ipa_reg_rps_enable_cb() - Register cb to enable RPS 332 * @pdev: pdev obj 333 * @cb: callback 334 * 335 * Return: None 336 */ 337 void ipa_reg_rps_enable_cb(struct wlan_objmgr_pdev *pdev, 338 wlan_ipa_rps_enable cb); 339 #endif 340 341 /** 342 * ipa_reg_is_driver_unloading_cb() - Register cb to check if driver is 343 * unloading 344 * @pdev: pdev obj 345 * @cb: callback 346 * 347 * Return: None 348 */ 349 void ipa_reg_is_driver_unloading_cb(struct wlan_objmgr_pdev *pdev, 350 wlan_ipa_driver_unloading cb); 351 /** 352 * ipa_set_mcc_mode() - Set MCC mode 353 * @pdev: pdev obj 354 * @mcc_mode: 0=MCC/1=SCC 355 * 356 * Return: void 357 */ 358 void ipa_set_mcc_mode(struct wlan_objmgr_pdev *pdev, bool mcc_mode); 359 360 /** 361 * ipa_set_dfs_cac_tx() - Set DFS cac tx block 362 * @pdev: pdev obj 363 * @tx_block: dfs cac tx block 364 * 365 * Return: void 366 */ 367 void ipa_set_dfs_cac_tx(struct wlan_objmgr_pdev *pdev, bool tx_block); 368 369 /** 370 * ipa_set_ap_ibss_fwd() - Set AP intra bss forward 371 * @pdev: pdev obj 372 * @session_id: vdev id 373 * @intra_bss: enable or disable ap intra bss forward 374 * 375 * Return: void 376 */ 377 void ipa_set_ap_ibss_fwd(struct wlan_objmgr_pdev *pdev, uint8_t session_id, 378 bool intra_bss); 379 380 /** 381 * ipa_uc_force_pipe_shutdown() - Force IPA pipe shutdown 382 * @pdev: pdev obj 383 * 384 * Return: void 385 */ 386 void ipa_uc_force_pipe_shutdown(struct wlan_objmgr_pdev *pdev); 387 388 /** 389 * ipa_flush() - flush IPA exception path SKB's 390 * @pdev: pdev obj 391 * 392 * Return: None 393 */ 394 void ipa_flush(struct wlan_objmgr_pdev *pdev); 395 396 /** 397 * ipa_suspend() - Suspend IPA 398 * @pdev: pdev obj 399 * 400 * Return: QDF STATUS 401 */ 402 QDF_STATUS ipa_suspend(struct wlan_objmgr_pdev *pdev); 403 404 /** 405 * ipa_resume() - Resume IPA 406 * @pdev: pdev obj 407 * 408 * Return: None 409 */ 410 QDF_STATUS ipa_resume(struct wlan_objmgr_pdev *pdev); 411 412 /** 413 * ipa_uc_ol_init() - Initialize IPA uC offload 414 * @pdev: pdev obj 415 * @osdev: OS dev 416 * 417 * Return: QDF STATUS 418 */ 419 QDF_STATUS ipa_uc_ol_init(struct wlan_objmgr_pdev *pdev, 420 qdf_device_t osdev); 421 422 /** 423 * ipa_uc_ol_deinit() - Deinitialize IPA uC offload 424 * @pdev: pdev obj 425 * 426 * Return: QDF STATUS 427 */ 428 QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev); 429 430 /** 431 * ipa_is_tx_pending() - Check if IPA WLAN TX completions are pending 432 * @pdev: pdev obj 433 * 434 * Return: bool if pending TX for IPA. 435 */ 436 bool ipa_is_tx_pending(struct wlan_objmgr_pdev *pdev); 437 438 /** 439 * ipa_send_mcc_scc_msg() - Send IPA WLAN_SWITCH_TO_MCC/SCC message 440 * @pdev: pdev obj 441 * @mcc_mode: 0=MCC/1=SCC 442 * 443 * Return: QDF STATUS 444 */ 445 QDF_STATUS ipa_send_mcc_scc_msg(struct wlan_objmgr_pdev *pdev, 446 bool mcc_mode); 447 448 /** 449 * ipa_wlan_evt() - IPA event handler 450 * @pdev: pdev obj 451 * @net_dev: Interface net device 452 * @device_mode: Net interface device mode 453 * @session_id: session id for the event 454 * @ipa_event_type: event enum of type ipa_wlan_event 455 * @mac_addr: MAC address associated with the event 456 * @is_2g_iface: true if interface is operating on 2G band, otherwise false 457 * 458 * Return: QDF_STATUS 459 */ 460 QDF_STATUS ipa_wlan_evt(struct wlan_objmgr_pdev *pdev, qdf_netdev_t net_dev, 461 uint8_t device_mode, uint8_t session_id, 462 enum wlan_ipa_wlan_event ipa_event_type, 463 const uint8_t *mac_addr, bool is_2g_iface); 464 465 /** 466 * ipa_uc_smmu_map() - Map / Unmap DMA buffer to IPA UC 467 * @map: Map / unmap operation 468 * @num_buf: Number of buffers in array 469 * @buf_arr: Buffer array of DMA mem mapping info 470 * 471 * Return: Status of map operation 472 */ 473 int ipa_uc_smmu_map(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr); 474 475 /** 476 * ipa_is_fw_wdi_activated - Is FW WDI activated? 477 * @pdev: pdev obj 478 * 479 * Return: true if FW WDI activated, false otherwise 480 */ 481 bool ipa_is_fw_wdi_activated(struct wlan_objmgr_pdev *pdev); 482 483 /** 484 * ipa_uc_cleanup_sta() - disconnect and cleanup sta iface 485 * @pdev: pdev obj 486 * @net_dev: Interface net device 487 * @session_id: vdev id 488 * 489 * Send disconnect sta event to IPA driver and cleanup IPA iface, 490 * if not yet done 491 * 492 * Return: void 493 */ 494 void ipa_uc_cleanup_sta(struct wlan_objmgr_pdev *pdev, 495 qdf_netdev_t net_dev, uint8_t session_id); 496 497 /** 498 * ipa_uc_disconnect_ap() - send ap disconnect event 499 * @pdev: pdev obj 500 * @net_dev: Interface net device 501 * 502 * Send disconnect ap event to IPA driver 503 * 504 * Return: QDF_STATUS 505 */ 506 QDF_STATUS ipa_uc_disconnect_ap(struct wlan_objmgr_pdev *pdev, 507 qdf_netdev_t net_dev); 508 509 /** 510 * ipa_cleanup_dev_iface() - Clean up net dev IPA interface 511 * @pdev: pdev obj 512 * @net_dev: Interface net device 513 * @session_id: vdev_id 514 * 515 * Return: None 516 */ 517 void ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev, 518 qdf_netdev_t net_dev, uint8_t session_id); 519 520 /** 521 * ipa_uc_ssr_cleanup() - handle IPA UC cleanup during SSR 522 * @pdev: pdev obj 523 * 524 * Return: None 525 */ 526 void ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev); 527 528 /** 529 * ipa_fw_rejuvenate_send_msg() - send fw rejuvenate message to IPA driver 530 * @pdev: pdev obj 531 * 532 * Return: None 533 */ 534 void ipa_fw_rejuvenate_send_msg(struct wlan_objmgr_pdev *pdev); 535 536 /** 537 * ipa_component_config_update() - update ipa config from psoc 538 * @psoc: psoc obj 539 * 540 * Return: None 541 */ 542 void ipa_component_config_update(struct wlan_objmgr_psoc *psoc); 543 544 /** 545 * ipa_component_config_free() - Free ipa config 546 * 547 * Return: None 548 */ 549 void ipa_component_config_free(void); 550 551 /** 552 * ipa_get_tx_buf_count() - get IPA config tx buffer count 553 * 554 * Return: IPA config tx buffer count 555 */ 556 uint32_t ipa_get_tx_buf_count(void); 557 558 /** 559 * ipa_update_tx_stats() - Update embedded tx traffic in bytes to IPA 560 * @pdev: pdev obj 561 * @sta_tx: tx in bytes on sta vdev 562 * @ap_tx: tx in bytes on sap vdev 563 * 564 * Return: None 565 */ 566 void ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, 567 uint64_t ap_tx); 568 569 /** 570 * ipa_flush_pending_vdev_events() - flush pending vdev wlan ipa events 571 * @pdev: pdev obj 572 * @vdev_id: vdev id 573 * 574 * Return: None 575 */ 576 void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, 577 uint8_t vdev_id); 578 579 /** 580 * ipa_cb_is_ready() - Is IPA register callback is invoked 581 * 582 * Return: true if IPA register callback is invoked or false 583 * otherwise 584 */ 585 bool ipa_cb_is_ready(void); 586 587 /** 588 * ipa_init_deinit_lock() - lock ipa init deinit lock 589 * 590 * Return: None 591 */ 592 void ipa_init_deinit_lock(void); 593 594 /** 595 * ipa_init_deinit_unlock() - unlock ipa init deinit lock 596 * 597 * Return: None 598 */ 599 void ipa_init_deinit_unlock(void); 600 601 /** 602 * ipa_is_wds_enabled() - IPA wds status 603 * 604 * Return: true if WDS is enabled otherwise false 605 */ 606 bool ipa_is_wds_enabled(void); 607 608 #else /* Not IPA_OFFLOAD */ 609 typedef QDF_STATUS (*wlan_ipa_softap_xmit)(qdf_nbuf_t nbuf, qdf_netdev_t dev); 610 typedef void (*wlan_ipa_send_to_nw)(qdf_nbuf_t nbuf, qdf_netdev_t dev); 611 typedef void (*wlan_ipa_rps_enable)(uint8_t vdev_id, bool enable); 612 typedef bool (*wlan_ipa_driver_unloading)(void); 613 614 #endif /* IPA_OFFLOAD */ 615 #endif /* end of _WLAN_IPA_MAIN_H_ */ 616