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