1 /* 2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2024 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: contains ipa component main function definitions 22 */ 23 24 #include "wlan_ipa_main.h" 25 #include "wlan_ipa_core.h" 26 #include "wlan_ipa_tgt_api.h" 27 #include "cfg_ucfg_api.h" 28 #include "wlan_ipa_obj_mgmt_api.h" 29 30 static struct wlan_ipa_config *g_ipa_config; 31 static bool g_ipa_hw_support; 32 static bool g_ipa_pld_enable = true; 33 static bool g_ipa_cap_offload = true; 34 ipa_set_cap_offload(bool flag)35 void ipa_set_cap_offload(bool flag) 36 { 37 g_ipa_cap_offload = flag; 38 } 39 ipa_set_pld_enable(bool flag)40 void ipa_set_pld_enable(bool flag) 41 { 42 g_ipa_pld_enable = flag; 43 } 44 ipa_get_pld_enable(void)45 bool ipa_get_pld_enable(void) 46 { 47 return (g_ipa_pld_enable && g_ipa_cap_offload); 48 } 49 ipa_check_hw_present(void)50 bool ipa_check_hw_present(void) 51 { 52 /* Check if ipa hw is enabled */ 53 if (qdf_ipa_uc_reg_rdyCB(NULL) != -EPERM) { 54 g_ipa_hw_support = true; 55 return true; 56 } else { 57 return false; 58 } 59 } 60 ipa_config_mem_alloc(void)61 QDF_STATUS ipa_config_mem_alloc(void) 62 { 63 struct wlan_ipa_config *ipa_cfg; 64 65 if (g_ipa_config) 66 return QDF_STATUS_SUCCESS; 67 68 ipa_cfg = qdf_mem_malloc(sizeof(*ipa_cfg)); 69 if (!ipa_cfg) 70 return QDF_STATUS_E_NOMEM; 71 72 g_ipa_config = ipa_cfg; 73 74 return QDF_STATUS_SUCCESS; 75 } 76 ipa_config_mem_free(void)77 void ipa_config_mem_free(void) 78 { 79 if (!g_instances_added) { 80 if (!g_ipa_config) { 81 ipa_err("IPA config already freed"); 82 return; 83 } 84 85 qdf_mem_free(g_ipa_config); 86 g_ipa_config = NULL; 87 } 88 } 89 ipa_is_hw_support(void)90 bool ipa_is_hw_support(void) 91 { 92 return g_ipa_hw_support; 93 } 94 ipa_config_is_enabled(void)95 bool ipa_config_is_enabled(void) 96 { 97 return g_ipa_config ? wlan_ipa_is_enabled(g_ipa_config) : 0; 98 } 99 ipa_config_is_uc_enabled(void)100 bool ipa_config_is_uc_enabled(void) 101 { 102 return g_ipa_config ? wlan_ipa_uc_is_enabled(g_ipa_config) : 0; 103 } 104 ipa_config_is_opt_wifi_dp_enabled(void)105 bool ipa_config_is_opt_wifi_dp_enabled(void) 106 { 107 return g_ipa_config ? wlan_ipa_is_opt_wifi_dp_enabled(g_ipa_config) : 0; 108 } 109 ipa_config_is_vlan_enabled(void)110 bool ipa_config_is_vlan_enabled(void) 111 { 112 if (!ipa_config_is_enabled()) 113 return false; 114 115 return g_ipa_config ? g_ipa_config->ipa_vlan_support : 0; 116 } 117 ipa_obj_setup(struct wlan_ipa_priv * ipa_ctx)118 QDF_STATUS ipa_obj_setup(struct wlan_ipa_priv *ipa_ctx) 119 { 120 return wlan_ipa_setup(ipa_ctx, g_ipa_config); 121 } 122 ipa_obj_cleanup(struct wlan_ipa_priv * ipa_ctx)123 QDF_STATUS ipa_obj_cleanup(struct wlan_ipa_priv *ipa_ctx) 124 { 125 return wlan_ipa_cleanup(ipa_ctx); 126 } 127 ipa_send_uc_offload_enable_disable(struct wlan_objmgr_pdev * pdev,struct ipa_uc_offload_control_params * req)128 QDF_STATUS ipa_send_uc_offload_enable_disable(struct wlan_objmgr_pdev *pdev, 129 struct ipa_uc_offload_control_params *req) 130 { 131 return tgt_ipa_uc_offload_enable_disable(pdev, req); 132 } 133 134 QDF_STATUS ipa_send_intrabss_enable_disable(struct wlan_objmgr_pdev * pdev,struct ipa_intrabss_control_params * req)135 ipa_send_intrabss_enable_disable(struct wlan_objmgr_pdev *pdev, 136 struct ipa_intrabss_control_params *req) 137 { 138 return tgt_ipa_intrabss_enable_disable(pdev, req); 139 } 140 ipa_set_dp_handle(struct wlan_objmgr_psoc * psoc,void * dp_soc)141 void ipa_set_dp_handle(struct wlan_objmgr_psoc *psoc, void *dp_soc) 142 { 143 struct wlan_objmgr_pdev *pdev; 144 struct wlan_ipa_priv *ipa_obj; 145 146 if (!ipa_config_is_enabled()) { 147 ipa_debug("ipa is disabled"); 148 return; 149 } 150 151 pdev = wlan_objmgr_get_pdev_by_id(psoc, 0, 152 WLAN_IPA_ID); 153 154 if (!pdev) { 155 ipa_err("Failed to get pdev handle"); 156 return; 157 } 158 159 ipa_obj = ipa_pdev_get_priv_obj(pdev); 160 if (!ipa_obj) { 161 ipa_err("IPA object is NULL"); 162 wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); 163 return; 164 } 165 166 ipa_obj->dp_soc = dp_soc; 167 wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); 168 } 169 ipa_set_pdev_id(struct wlan_objmgr_psoc * psoc,uint8_t pdev_id)170 void ipa_set_pdev_id(struct wlan_objmgr_psoc *psoc, uint8_t pdev_id) 171 { 172 struct wlan_objmgr_pdev *pdev; 173 struct wlan_ipa_priv *ipa_obj; 174 175 if (!ipa_config_is_enabled()) { 176 ipa_debug("ipa is disabled"); 177 return; 178 } 179 180 pdev = wlan_objmgr_get_pdev_by_id(psoc, 0, 181 WLAN_IPA_ID); 182 183 if (!pdev) { 184 ipa_err("Failed to get pdev handle"); 185 return; 186 } 187 188 ipa_obj = ipa_pdev_get_priv_obj(pdev); 189 if (!ipa_obj) { 190 ipa_err("IPA object is NULL"); 191 wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); 192 return; 193 } 194 195 ipa_obj->dp_pdev_id = pdev_id; 196 wlan_objmgr_pdev_release_ref(pdev, WLAN_IPA_ID); 197 } 198 ipa_rm_set_perf_level(struct wlan_objmgr_pdev * pdev,uint64_t tx_packets,uint64_t rx_packets)199 QDF_STATUS ipa_rm_set_perf_level(struct wlan_objmgr_pdev *pdev, 200 uint64_t tx_packets, uint64_t rx_packets) 201 { 202 struct wlan_ipa_priv *ipa_obj; 203 204 if (!ipa_config_is_enabled()) { 205 ipa_debug("ipa is disabled"); 206 return QDF_STATUS_SUCCESS; 207 } 208 209 if (!ipa_cb_is_ready()) 210 return QDF_STATUS_SUCCESS; 211 212 ipa_obj = ipa_pdev_get_priv_obj(pdev); 213 if (!ipa_obj) { 214 ipa_err("IPA object is NULL"); 215 return QDF_STATUS_E_FAILURE; 216 } 217 218 return wlan_ipa_set_perf_level(ipa_obj, tx_packets, rx_packets); 219 } 220 ipa_uc_info(struct wlan_objmgr_pdev * pdev)221 void ipa_uc_info(struct wlan_objmgr_pdev *pdev) 222 { 223 struct wlan_ipa_priv *ipa_obj; 224 225 if (!ipa_config_is_enabled()) { 226 ipa_debug("ipa is disabled"); 227 return; 228 } 229 230 if (!ipa_cb_is_ready()) 231 return; 232 233 ipa_obj = ipa_pdev_get_priv_obj(pdev); 234 if (!ipa_obj) { 235 ipa_err("IPA object is NULL"); 236 return; 237 } 238 239 return wlan_ipa_uc_info(ipa_obj); 240 } 241 ipa_uc_stat(struct wlan_objmgr_pdev * pdev)242 void ipa_uc_stat(struct wlan_objmgr_pdev *pdev) 243 { 244 struct wlan_ipa_priv *ipa_obj; 245 246 if (!ipa_config_is_enabled()) { 247 ipa_debug("ipa is disabled"); 248 return; 249 } 250 251 if (!ipa_cb_is_ready()) 252 return; 253 254 ipa_obj = ipa_pdev_get_priv_obj(pdev); 255 if (!ipa_obj) { 256 ipa_err("IPA object is NULL"); 257 return; 258 } 259 260 return wlan_ipa_uc_stat(ipa_obj); 261 } 262 ipa_uc_rt_debug_host_dump(struct wlan_objmgr_pdev * pdev)263 void ipa_uc_rt_debug_host_dump(struct wlan_objmgr_pdev *pdev) 264 { 265 struct wlan_ipa_priv *ipa_obj; 266 267 if (!ipa_config_is_enabled()) { 268 ipa_debug("ipa is disabled"); 269 return; 270 } 271 272 if (!ipa_cb_is_ready()) 273 return; 274 275 ipa_obj = ipa_pdev_get_priv_obj(pdev); 276 if (!ipa_obj) { 277 ipa_err("IPA object is NULL"); 278 return; 279 } 280 281 return wlan_ipa_uc_rt_debug_host_dump(ipa_obj); 282 } 283 ipa_dump_info(struct wlan_objmgr_pdev * pdev)284 void ipa_dump_info(struct wlan_objmgr_pdev *pdev) 285 { 286 struct wlan_ipa_priv *ipa_obj; 287 288 if (!ipa_config_is_enabled()) { 289 ipa_debug("ipa is disabled"); 290 return; 291 } 292 293 if (!ipa_cb_is_ready()) 294 return; 295 296 ipa_obj = ipa_pdev_get_priv_obj(pdev); 297 if (!ipa_obj) { 298 ipa_err("IPA object is NULL"); 299 return; 300 } 301 302 return wlan_ipa_dump_info(ipa_obj); 303 } 304 ipa_uc_stat_request(struct wlan_objmgr_pdev * pdev,uint8_t reason)305 void ipa_uc_stat_request(struct wlan_objmgr_pdev *pdev, uint8_t reason) 306 { 307 struct wlan_ipa_priv *ipa_obj; 308 309 if (!ipa_config_is_enabled()) { 310 ipa_debug("ipa is disabled"); 311 return; 312 } 313 314 if (!ipa_cb_is_ready()) 315 return; 316 317 ipa_obj = ipa_pdev_get_priv_obj(pdev); 318 if (!ipa_obj) { 319 ipa_err("IPA object is NULL"); 320 return; 321 } 322 323 return wlan_ipa_uc_stat_request(ipa_obj, reason); 324 } 325 ipa_uc_stat_query(struct wlan_objmgr_pdev * pdev,uint32_t * ipa_tx_diff,uint32_t * ipa_rx_diff)326 void ipa_uc_stat_query(struct wlan_objmgr_pdev *pdev, 327 uint32_t *ipa_tx_diff, uint32_t *ipa_rx_diff) 328 { 329 struct wlan_ipa_priv *ipa_obj; 330 331 if (!ipa_config_is_enabled()) { 332 ipa_debug("ipa is disabled"); 333 return; 334 } 335 336 if (!ipa_cb_is_ready()) 337 return; 338 339 ipa_obj = ipa_pdev_get_priv_obj(pdev); 340 if (!ipa_obj) { 341 ipa_err("IPA object is NULL"); 342 return; 343 } 344 345 return wlan_ipa_uc_stat_query(ipa_obj, ipa_tx_diff, ipa_rx_diff); 346 } 347 ipa_reg_sap_xmit_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_softap_xmit cb)348 void ipa_reg_sap_xmit_cb(struct wlan_objmgr_pdev *pdev, wlan_ipa_softap_xmit cb) 349 { 350 struct wlan_ipa_priv *ipa_obj; 351 352 if (!ipa_config_is_enabled()) { 353 ipa_debug("ipa is disabled"); 354 return; 355 } 356 357 if (!ipa_cb_is_ready()) 358 return; 359 360 ipa_obj = ipa_pdev_get_priv_obj(pdev); 361 if (!ipa_obj) { 362 ipa_err("IPA object is NULL"); 363 return; 364 } 365 366 return wlan_ipa_reg_sap_xmit_cb(ipa_obj, cb); 367 } 368 ipa_reg_send_to_nw_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_send_to_nw cb)369 void ipa_reg_send_to_nw_cb(struct wlan_objmgr_pdev *pdev, 370 wlan_ipa_send_to_nw cb) 371 { 372 struct wlan_ipa_priv *ipa_obj; 373 374 if (!ipa_config_is_enabled()) { 375 ipa_debug("ipa is disabled"); 376 return; 377 } 378 379 if (!ipa_cb_is_ready()) 380 return; 381 382 ipa_obj = ipa_pdev_get_priv_obj(pdev); 383 if (!ipa_obj) { 384 ipa_err("IPA object is NULL"); 385 return; 386 } 387 388 return wlan_ipa_reg_send_to_nw_cb(ipa_obj, cb); 389 } 390 391 #if defined(QCA_CONFIG_RPS) && !defined(MDM_PLATFORM) ipa_reg_rps_enable_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_rps_enable cb)392 void ipa_reg_rps_enable_cb(struct wlan_objmgr_pdev *pdev, 393 wlan_ipa_rps_enable cb) 394 { 395 struct wlan_ipa_priv *ipa_obj; 396 397 if (!ipa_config_is_enabled()) { 398 ipa_debug("ipa is disabled"); 399 return; 400 } 401 402 if (!ipa_cb_is_ready()) 403 return; 404 405 ipa_obj = ipa_pdev_get_priv_obj(pdev); 406 if (!ipa_obj) { 407 ipa_err("IPA object is NULL"); 408 return; 409 } 410 411 return wlan_ipa_reg_rps_enable_cb(ipa_obj, cb); 412 } 413 #endif 414 ipa_reg_is_driver_unloading_cb(struct wlan_objmgr_pdev * pdev,wlan_ipa_driver_unloading cb)415 void ipa_reg_is_driver_unloading_cb(struct wlan_objmgr_pdev *pdev, 416 wlan_ipa_driver_unloading cb) 417 { 418 struct wlan_ipa_priv *ipa_obj; 419 420 if (!ipa_config_is_enabled()) { 421 ipa_debug("ipa is disabled"); 422 return; 423 } 424 425 if (!ipa_cb_is_ready()) 426 return; 427 428 ipa_obj = ipa_pdev_get_priv_obj(pdev); 429 if (!ipa_obj) { 430 ipa_err("IPA object is NULL"); 431 return; 432 } 433 434 return wlan_ipa_reg_is_driver_unloading_cb(ipa_obj, cb); 435 } 436 ipa_set_mcc_mode(struct wlan_objmgr_pdev * pdev,bool mcc_mode)437 void ipa_set_mcc_mode(struct wlan_objmgr_pdev *pdev, bool mcc_mode) 438 { 439 struct wlan_ipa_priv *ipa_obj; 440 441 if (!ipa_config_is_enabled()) { 442 ipa_debug("ipa is disabled"); 443 return; 444 } 445 446 if (!ipa_cb_is_ready()) 447 return; 448 449 ipa_obj = ipa_pdev_get_priv_obj(pdev); 450 if (!ipa_obj) { 451 ipa_err("IPA object is NULL"); 452 return; 453 } 454 455 return wlan_ipa_set_mcc_mode(ipa_obj, mcc_mode); 456 } 457 ipa_set_dfs_cac_tx(struct wlan_objmgr_pdev * pdev,bool tx_block)458 void ipa_set_dfs_cac_tx(struct wlan_objmgr_pdev *pdev, bool tx_block) 459 { 460 struct wlan_ipa_priv *ipa_obj; 461 462 if (!ipa_config_is_enabled()) { 463 ipa_debug("ipa is disabled"); 464 return; 465 } 466 467 if (!ipa_cb_is_ready()) 468 return; 469 470 ipa_obj = ipa_pdev_get_priv_obj(pdev); 471 if (!ipa_obj) { 472 ipa_err("IPA object is NULL"); 473 return; 474 } 475 476 return wlan_ipa_set_dfs_cac_tx(ipa_obj, tx_block); 477 } 478 ipa_set_ap_ibss_fwd(struct wlan_objmgr_pdev * pdev,uint8_t session_id,bool intra_bss)479 void ipa_set_ap_ibss_fwd(struct wlan_objmgr_pdev *pdev, uint8_t session_id, 480 bool intra_bss) 481 { 482 struct wlan_ipa_priv *ipa_obj; 483 484 if (!ipa_config_is_enabled()) { 485 ipa_debug("ipa is disabled"); 486 return; 487 } 488 489 if (!ipa_cb_is_ready()) 490 return; 491 492 ipa_obj = ipa_pdev_get_priv_obj(pdev); 493 if (!ipa_obj) { 494 ipa_err("IPA object is NULL"); 495 return; 496 } 497 498 return wlan_ipa_set_ap_ibss_fwd(ipa_obj, session_id, intra_bss); 499 } 500 ipa_uc_force_pipe_shutdown(struct wlan_objmgr_pdev * pdev)501 void ipa_uc_force_pipe_shutdown(struct wlan_objmgr_pdev *pdev) 502 { 503 struct wlan_ipa_priv *ipa_obj; 504 505 if (!pdev) { 506 ipa_debug("objmgr pdev is null!"); 507 return; 508 } 509 510 if (!ipa_config_is_enabled()) { 511 ipa_debug("ipa is disabled"); 512 return; 513 } 514 515 if (!ipa_cb_is_ready()) 516 return; 517 518 ipa_obj = ipa_pdev_get_priv_obj(pdev); 519 if (!ipa_obj) { 520 ipa_err("IPA object is NULL"); 521 return; 522 } 523 524 wlan_ipa_uc_disable_pipes(ipa_obj, true); 525 } 526 ipa_flush(struct wlan_objmgr_pdev * pdev)527 void ipa_flush(struct wlan_objmgr_pdev *pdev) 528 { 529 struct wlan_ipa_priv *ipa_obj; 530 531 if (!ipa_config_is_enabled()) { 532 ipa_debug("ipa is disabled"); 533 return; 534 } 535 536 if (!ipa_cb_is_ready()) 537 return; 538 539 ipa_obj = ipa_pdev_get_priv_obj(pdev); 540 if (!ipa_obj) { 541 ipa_err("IPA object is NULL"); 542 return; 543 } 544 545 return wlan_ipa_flush(ipa_obj); 546 } 547 ipa_suspend(struct wlan_objmgr_pdev * pdev)548 QDF_STATUS ipa_suspend(struct wlan_objmgr_pdev *pdev) 549 { 550 struct wlan_ipa_priv *ipa_obj; 551 552 if (!ipa_config_is_enabled()) { 553 ipa_debug("ipa is disabled"); 554 return QDF_STATUS_SUCCESS; 555 } 556 557 if (!ipa_cb_is_ready()) 558 return QDF_STATUS_SUCCESS; 559 560 ipa_obj = ipa_pdev_get_priv_obj(pdev); 561 if (!ipa_obj) { 562 ipa_err("IPA object is NULL"); 563 return QDF_STATUS_E_FAILURE; 564 } 565 566 return wlan_ipa_suspend(ipa_obj); 567 } 568 ipa_resume(struct wlan_objmgr_pdev * pdev)569 QDF_STATUS ipa_resume(struct wlan_objmgr_pdev *pdev) 570 { 571 struct wlan_ipa_priv *ipa_obj; 572 573 if (!ipa_config_is_enabled()) { 574 ipa_debug("ipa is disabled"); 575 return QDF_STATUS_SUCCESS; 576 } 577 578 if (!ipa_cb_is_ready()) 579 return QDF_STATUS_SUCCESS; 580 581 ipa_obj = ipa_pdev_get_priv_obj(pdev); 582 if (!ipa_obj) { 583 ipa_err("IPA object is NULL"); 584 return QDF_STATUS_E_FAILURE; 585 } 586 587 return wlan_ipa_resume(ipa_obj); 588 } 589 ipa_uc_ol_init(struct wlan_objmgr_pdev * pdev,qdf_device_t osdev)590 QDF_STATUS ipa_uc_ol_init(struct wlan_objmgr_pdev *pdev, 591 qdf_device_t osdev) 592 { 593 struct wlan_ipa_priv *ipa_obj; 594 595 if (!ipa_config_is_enabled()) { 596 ipa_debug("ipa is disabled"); 597 return QDF_STATUS_SUCCESS; 598 } 599 600 if (!ipa_cb_is_ready()) 601 return QDF_STATUS_SUCCESS; 602 603 ipa_obj = ipa_pdev_get_priv_obj(pdev); 604 if (!ipa_obj) { 605 ipa_err("IPA object is NULL"); 606 return QDF_STATUS_E_FAILURE; 607 } 608 609 return wlan_ipa_uc_ol_init(ipa_obj, osdev); 610 } 611 ipa_is_tx_pending(struct wlan_objmgr_pdev * pdev)612 bool ipa_is_tx_pending(struct wlan_objmgr_pdev *pdev) 613 { 614 struct wlan_ipa_priv *ipa_obj; 615 616 if (!ipa_config_is_enabled()) { 617 ipa_debug("ipa is disabled"); 618 return QDF_STATUS_SUCCESS; 619 } 620 621 if (!ipa_cb_is_ready()) 622 return QDF_STATUS_SUCCESS; 623 624 ipa_obj = ipa_pdev_get_priv_obj(pdev); 625 626 return wlan_ipa_is_tx_pending(ipa_obj); 627 } 628 ipa_uc_ol_deinit(struct wlan_objmgr_pdev * pdev)629 QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev) 630 { 631 struct wlan_ipa_priv *ipa_obj; 632 QDF_STATUS status; 633 634 if (!ipa_config_is_enabled()) { 635 ipa_debug("ipa is disabled"); 636 return QDF_STATUS_SUCCESS; 637 } 638 639 ipa_init_deinit_lock(); 640 641 if (!ipa_cb_is_ready()) { 642 ipa_debug("ipa is not ready"); 643 status = QDF_STATUS_SUCCESS; 644 goto out; 645 } 646 647 ipa_obj = ipa_pdev_get_priv_obj(pdev); 648 if (!ipa_obj) { 649 ipa_err("IPA object is NULL"); 650 status = QDF_STATUS_E_FAILURE; 651 goto out; 652 } 653 654 if (!(ipa_obj->handle_initialized)) { 655 ipa_debug("IPA is already deinit for hdl:%d", ipa_obj->hdl); 656 status = QDF_STATUS_SUCCESS; 657 goto out; 658 } 659 660 status = wlan_ipa_uc_ol_deinit(ipa_obj); 661 ipa_obj_cleanup(ipa_obj); 662 663 out: 664 if (g_instances_added) 665 g_instances_added--; 666 667 if (!g_instances_added) 668 ipa_disable_register_cb(); 669 670 ipa_init_deinit_unlock(); 671 return status; 672 } 673 ipa_send_mcc_scc_msg(struct wlan_objmgr_pdev * pdev,bool mcc_mode)674 QDF_STATUS ipa_send_mcc_scc_msg(struct wlan_objmgr_pdev *pdev, 675 bool mcc_mode) 676 { 677 struct wlan_ipa_priv *ipa_obj; 678 679 if (!ipa_config_is_enabled()) { 680 ipa_debug("ipa is disabled"); 681 return QDF_STATUS_SUCCESS; 682 } 683 684 if (!ipa_cb_is_ready()) 685 return QDF_STATUS_SUCCESS; 686 687 ipa_obj = ipa_pdev_get_priv_obj(pdev); 688 if (!ipa_obj) { 689 ipa_err("IPA object is NULL"); 690 return QDF_STATUS_E_FAILURE; 691 } 692 693 return wlan_ipa_send_mcc_scc_msg(ipa_obj, mcc_mode); 694 } 695 ipa_wlan_evt(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev,uint8_t device_mode,uint8_t session_id,enum wlan_ipa_wlan_event ipa_event_type,const uint8_t * mac_addr,bool is_2g_iface)696 QDF_STATUS ipa_wlan_evt(struct wlan_objmgr_pdev *pdev, qdf_netdev_t net_dev, 697 uint8_t device_mode, uint8_t session_id, 698 enum wlan_ipa_wlan_event ipa_event_type, 699 const uint8_t *mac_addr, bool is_2g_iface) 700 { 701 struct wlan_ipa_priv *ipa_obj; 702 703 if (!ipa_cb_is_ready()) 704 return QDF_STATUS_SUCCESS; 705 706 ipa_obj = ipa_pdev_get_priv_obj(pdev); 707 if (!ipa_obj) { 708 ipa_err("IPA object is NULL"); 709 return QDF_STATUS_E_FAILURE; 710 } 711 712 return wlan_ipa_wlan_evt(net_dev, device_mode, session_id, 713 ipa_event_type, mac_addr, is_2g_iface, 714 ipa_obj); 715 } 716 ipa_uc_smmu_map(bool map,uint32_t num_buf,qdf_mem_info_t * buf_arr)717 int ipa_uc_smmu_map(bool map, uint32_t num_buf, qdf_mem_info_t *buf_arr) 718 { 719 return wlan_ipa_uc_smmu_map(map, num_buf, buf_arr); 720 } 721 ipa_is_fw_wdi_activated(struct wlan_objmgr_pdev * pdev)722 bool ipa_is_fw_wdi_activated(struct wlan_objmgr_pdev *pdev) 723 { 724 struct wlan_ipa_priv *ipa_obj; 725 726 if (!ipa_config_is_enabled()) { 727 ipa_debug_rl("ipa is disabled"); 728 return false; 729 } 730 731 if (!ipa_cb_is_ready()) { 732 ipa_debug("ipa is not ready"); 733 return false; 734 } 735 736 ipa_obj = ipa_pdev_get_priv_obj(pdev); 737 if (!ipa_obj) { 738 ipa_err_rl("IPA object is NULL"); 739 return false; 740 } 741 742 return wlan_ipa_is_fw_wdi_activated(ipa_obj); 743 } 744 ipa_uc_cleanup_sta(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev,uint8_t session_id)745 void ipa_uc_cleanup_sta(struct wlan_objmgr_pdev *pdev, 746 qdf_netdev_t net_dev, uint8_t session_id) 747 { 748 struct wlan_ipa_priv *ipa_obj; 749 750 if (!ipa_cb_is_ready()) { 751 ipa_debug("ipa is not ready"); 752 return; 753 } 754 755 ipa_obj = ipa_pdev_get_priv_obj(pdev); 756 if (!ipa_obj) { 757 ipa_err("IPA object is NULL"); 758 return; 759 } 760 761 return wlan_ipa_uc_cleanup_sta(ipa_obj, net_dev, session_id); 762 } 763 ipa_uc_disconnect_ap(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev)764 QDF_STATUS ipa_uc_disconnect_ap(struct wlan_objmgr_pdev *pdev, 765 qdf_netdev_t net_dev) 766 { 767 struct wlan_ipa_priv *ipa_obj; 768 769 if (!ipa_cb_is_ready()) 770 return QDF_STATUS_SUCCESS; 771 772 ipa_obj = ipa_pdev_get_priv_obj(pdev); 773 if (!ipa_obj) { 774 ipa_err("IPA object is NULL"); 775 return QDF_STATUS_E_FAILURE; 776 } 777 778 return wlan_ipa_uc_disconnect_ap(ipa_obj, net_dev); 779 } 780 ipa_cleanup_dev_iface(struct wlan_objmgr_pdev * pdev,qdf_netdev_t net_dev,uint8_t session_id)781 void ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev, 782 qdf_netdev_t net_dev, uint8_t session_id) 783 { 784 struct wlan_ipa_priv *ipa_obj; 785 786 if (!ipa_cb_is_ready()) 787 return; 788 789 ipa_obj = ipa_pdev_get_priv_obj(pdev); 790 if (!ipa_obj) { 791 ipa_err("IPA object is NULL"); 792 return; 793 } 794 795 return wlan_ipa_cleanup_dev_iface(ipa_obj, net_dev, session_id); 796 } 797 ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev * pdev)798 void ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev) 799 { 800 struct wlan_ipa_priv *ipa_obj; 801 802 if (!ipa_cb_is_ready()) 803 return; 804 805 ipa_obj = ipa_pdev_get_priv_obj(pdev); 806 if (!ipa_obj) { 807 ipa_err("IPA object is NULL"); 808 return; 809 } 810 811 return wlan_ipa_uc_ssr_cleanup(ipa_obj); 812 } 813 ipa_fw_rejuvenate_send_msg(struct wlan_objmgr_pdev * pdev)814 void ipa_fw_rejuvenate_send_msg(struct wlan_objmgr_pdev *pdev) 815 { 816 struct wlan_ipa_priv *ipa_obj; 817 818 if (!pdev) { 819 ipa_debug("objmgr pdev is null!"); 820 return; 821 } 822 823 ipa_obj = ipa_pdev_get_priv_obj(pdev); 824 if (!ipa_obj) { 825 ipa_err("IPA object is NULL"); 826 return; 827 } 828 829 return wlan_ipa_fw_rejuvenate_send_msg(ipa_obj); 830 } 831 832 #ifdef IPA_OPT_WIFI_DP get_ipa_config(struct wlan_objmgr_psoc * psoc)833 uint32_t get_ipa_config(struct wlan_objmgr_psoc *psoc) 834 { 835 uint32_t val = cfg_get(psoc, CFG_DP_IPA_OFFLOAD_CONFIG); 836 837 if (val == INTRL_MODE_DISABLE) { 838 val = 0; 839 } else { 840 if (val == IPA_OFFLOAD_CFG) 841 ipa_err("Invalid IPA Config 0x%x", val); 842 val = INTRL_MODE_ENABLE; 843 } 844 return val; 845 } 846 #else get_ipa_config(struct wlan_objmgr_psoc * psoc)847 uint32_t get_ipa_config(struct wlan_objmgr_psoc *psoc) 848 { 849 uint32_t val = cfg_get(psoc, CFG_DP_IPA_OFFLOAD_CONFIG); 850 851 if (val & WLAN_IPA_OPT_WIFI_DP) { 852 val &= ~WLAN_IPA_OPT_WIFI_DP; 853 ipa_info("Resetting IPAConfig val to 0x%x", val); 854 } 855 return val; 856 } 857 #endif 858 ipa_component_config_update(struct wlan_objmgr_psoc * psoc)859 void ipa_component_config_update(struct wlan_objmgr_psoc *psoc) 860 { 861 QDF_STATUS status; 862 863 status = ipa_config_mem_alloc(); 864 if (QDF_IS_STATUS_ERROR(status)) { 865 ipa_err("Failed to alloc g_ipa_config"); 866 return; 867 } 868 869 if (g_ipa_pld_enable && g_ipa_cap_offload) { 870 g_ipa_config->ipa_config = get_ipa_config(psoc); 871 ipa_debug("IPA ini configuration: 0x%x", 872 g_ipa_config->ipa_config); 873 } else { 874 g_ipa_config->ipa_config = 0; 875 ipa_info("IPA disabled from platform driver"); 876 } 877 878 g_ipa_config->desc_size = 879 cfg_get(psoc, CFG_DP_IPA_DESC_SIZE); 880 g_ipa_config->txbuf_count = 881 qdf_rounddown_pow_of_two(cfg_get(psoc, 882 CFG_DP_IPA_UC_TX_BUF_COUNT)); 883 g_ipa_config->ipa_bw_high = 884 cfg_get(psoc, CFG_DP_IPA_HIGH_BANDWIDTH_MBPS); 885 g_ipa_config->ipa_bw_medium = 886 cfg_get(psoc, CFG_DP_IPA_MEDIUM_BANDWIDTH_MBPS); 887 g_ipa_config->ipa_bw_low = 888 cfg_get(psoc, CFG_DP_IPA_LOW_BANDWIDTH_MBPS); 889 g_ipa_config->bus_bw_high = 890 cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_HIGH_THRESHOLD); 891 g_ipa_config->bus_bw_medium = 892 cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_MEDIUM_THRESHOLD); 893 g_ipa_config->bus_bw_low = 894 cfg_get(psoc, CFG_DP_BUS_BANDWIDTH_LOW_THRESHOLD); 895 g_ipa_config->ipa_force_voting = 896 cfg_get(psoc, CFG_DP_IPA_ENABLE_FORCE_VOTING); 897 g_ipa_config->ipa_wds = 898 cfg_get(psoc, CFG_DP_IPA_WDS_STATUS); 899 g_ipa_config->ipa_vlan_support = 900 cfg_get(psoc, CFG_DP_IPA_ENABLE_VLAN_SUPPORT); 901 } 902 ipa_component_config_free(void)903 void ipa_component_config_free(void) 904 { 905 ipa_info("Free the IPA config memory"); 906 ipa_config_mem_free(); 907 } 908 ipa_get_tx_buf_count(void)909 uint32_t ipa_get_tx_buf_count(void) 910 { 911 return g_ipa_config ? g_ipa_config->txbuf_count : 0; 912 } 913 ipa_update_tx_stats(struct wlan_objmgr_pdev * pdev,uint64_t sta_tx,uint64_t ap_tx)914 void ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, 915 uint64_t ap_tx) 916 { 917 struct wlan_ipa_priv *ipa_obj; 918 919 if (!ipa_config_is_enabled()) 920 return; 921 922 ipa_obj = ipa_pdev_get_priv_obj(pdev); 923 if (!ipa_obj) { 924 ipa_err("IPA object is NULL"); 925 return; 926 } 927 928 wlan_ipa_update_tx_stats(ipa_obj, sta_tx, ap_tx); 929 } 930 ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id)931 void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, 932 uint8_t vdev_id) 933 { 934 struct wlan_ipa_priv *ipa_obj; 935 936 if (!ipa_config_is_enabled()) 937 return; 938 939 if (!ipa_cb_is_ready()) 940 return; 941 942 ipa_obj = ipa_pdev_get_priv_obj(pdev); 943 if (!ipa_obj) { 944 ipa_err("IPA object is NULL"); 945 return; 946 } 947 948 wlan_ipa_flush_pending_vdev_events(ipa_obj, vdev_id); 949 } 950 ipa_is_wds_enabled(void)951 bool ipa_is_wds_enabled(void) 952 { 953 return g_ipa_config ? g_ipa_config->ipa_wds : 0; 954 } 955 ipa_get_alt_pipe(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,bool * alt_pipe)956 QDF_STATUS ipa_get_alt_pipe(struct wlan_objmgr_pdev *pdev, 957 uint8_t vdev_id, 958 bool *alt_pipe) 959 { 960 struct wlan_ipa_priv *ipa_obj; 961 962 if (!ipa_config_is_enabled()) 963 return QDF_STATUS_E_INVAL; 964 965 if (!ipa_cb_is_ready()) 966 return QDF_STATUS_E_INVAL; 967 968 ipa_obj = ipa_pdev_get_priv_obj(pdev); 969 if (!ipa_obj) { 970 ipa_err("IPA object is NULL"); 971 return QDF_STATUS_E_INVAL; 972 } 973 974 return wlan_ipa_get_alt_pipe(ipa_obj, vdev_id, alt_pipe); 975 } 976 ipa_set_perf_level_bw_enabled(struct wlan_objmgr_pdev * pdev)977 bool ipa_set_perf_level_bw_enabled(struct wlan_objmgr_pdev *pdev) 978 { 979 struct wlan_ipa_priv *ipa_obj; 980 981 if (!ipa_config_is_enabled()) 982 return false; 983 984 if (!ipa_cb_is_ready()) 985 return false; 986 987 ipa_obj = ipa_pdev_get_priv_obj(pdev); 988 if (!ipa_obj) { 989 ipa_err("IPA object is NULL"); 990 return false; 991 } 992 993 return wlan_ipa_set_perf_level_bw_enabled(ipa_obj); 994 } 995 ipa_set_perf_level_bw(struct wlan_objmgr_pdev * pdev,enum wlan_ipa_bw_level lvl)996 void ipa_set_perf_level_bw(struct wlan_objmgr_pdev *pdev, 997 enum wlan_ipa_bw_level lvl) 998 { 999 struct wlan_ipa_priv *ipa_obj; 1000 1001 if (!ipa_config_is_enabled()) 1002 return; 1003 1004 if (!ipa_cb_is_ready()) 1005 return; 1006 1007 ipa_obj = ipa_pdev_get_priv_obj(pdev); 1008 if (!ipa_obj) { 1009 ipa_err("IPA object is NULL"); 1010 return; 1011 } 1012 1013 wlan_ipa_set_perf_level_bw(ipa_obj, lvl); 1014 } 1015 1016