1 /* 2 * Copyright (c) 2017-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: API for interacting with target interface. 22 * 23 */ 24 25 #include "target_if.h" 26 #include "target_type.h" 27 #ifdef WLAN_ATF_ENABLE 28 #include "target_if_atf.h" 29 #endif 30 #ifdef WLAN_SA_API_ENABLE 31 #include "target_if_sa_api.h" 32 #endif 33 #ifdef WLAN_CFR_ENABLE 34 #include "target_if_cfr.h" 35 #endif 36 #ifdef WLAN_CONV_SPECTRAL_ENABLE 37 #include "target_if_spectral.h" 38 #endif 39 40 #ifdef WLAN_IOT_SIM_SUPPORT 41 #include <target_if_iot_sim.h> 42 #endif 43 #include <target_if_reg.h> 44 #include <target_if_scan.h> 45 #include <target_if_ftm.h> 46 #ifdef DFS_COMPONENT_ENABLE 47 #include <target_if_dfs.h> 48 #endif 49 50 #ifdef CONVERGED_P2P_ENABLE 51 #include "target_if_p2p.h" 52 #endif 53 54 #ifdef WIFI_POS_CONVERGED 55 #include "target_if_wifi_pos.h" 56 #include "target_if_wifi_pos_rx_ops.h" 57 #include "target_if_wifi_pos_tx_ops.h" 58 #endif 59 60 #ifdef FEATURE_WLAN_TDLS 61 #include "target_if_tdls.h" 62 #endif 63 #if defined(QCA_SUPPORT_SON) || defined(WLAN_FEATURE_SON) 64 #include <target_if_son.h> 65 #endif 66 #if defined WLAN_FEATURE_11AX 67 #include <target_if_spatial_reuse.h> 68 #endif 69 #ifdef WLAN_OFFCHAN_TXRX_ENABLE 70 #include <target_if_offchan_txrx_api.h> 71 #endif 72 #ifdef WLAN_SUPPORT_GREEN_AP 73 #include <target_if_green_ap.h> 74 #endif 75 #include <init_deinit_lmac.h> 76 #include <service_ready_util.h> 77 78 #ifdef DIRECT_BUF_RX_ENABLE 79 #include <target_if_direct_buf_rx_api.h> 80 #endif 81 82 #ifdef WLAN_SUPPORT_FILS 83 #include <target_if_fd.h> 84 #endif 85 #include "qdf_module.h" 86 87 #include <target_if_cp_stats.h> 88 #ifdef CRYPTO_SET_KEY_CONVERGED 89 #include <target_if_crypto.h> 90 #endif 91 #include <target_if_vdev_mgr_tx_ops.h> 92 93 #ifdef FEATURE_COEX 94 #include <target_if_coex.h> 95 #endif 96 #include <wlan_utility.h> 97 98 #ifdef DCS_INTERFERENCE_DETECTION 99 #include <target_if_dcs.h> 100 #endif 101 102 #include <target_if_gpio.h> 103 #ifdef IPA_OFFLOAD 104 #include <target_if_ipa.h> 105 #endif 106 107 #ifdef WLAN_MGMT_RX_REO_SUPPORT 108 #include <target_if_mgmt_txrx.h> 109 #endif /* WLAN_MGMT_RX_REO_SUPPORT */ 110 111 #include "wmi_unified_api.h" 112 #include <target_if_twt.h> 113 114 #include <target_if_mlo_mgr.h> 115 116 #ifdef WLAN_FEATURE_COAP 117 #include <target_if_coap.h> 118 #endif 119 120 static struct target_if_ctx *g_target_if_ctx; 121 target_if_get_ctx(void)122 struct target_if_ctx *target_if_get_ctx(void) 123 { 124 return g_target_if_ctx; 125 } 126 target_if_get_psoc_from_scn_hdl(void * scn_handle)127 struct wlan_objmgr_psoc *target_if_get_psoc_from_scn_hdl(void *scn_handle) 128 { 129 struct wlan_objmgr_psoc *psoc; 130 131 qdf_spin_lock_bh(&g_target_if_ctx->lock); 132 if (scn_handle && g_target_if_ctx->get_psoc_hdl_cb) 133 psoc = g_target_if_ctx->get_psoc_hdl_cb(scn_handle); 134 else 135 psoc = NULL; 136 qdf_spin_unlock_bh(&g_target_if_ctx->lock); 137 138 return psoc; 139 } 140 target_if_get_pdev_from_scn_hdl(void * scn_handle)141 struct wlan_objmgr_pdev *target_if_get_pdev_from_scn_hdl(void *scn_handle) 142 { 143 struct wlan_objmgr_pdev *pdev; 144 145 qdf_spin_lock_bh(&g_target_if_ctx->lock); 146 if (scn_handle && g_target_if_ctx->get_pdev_hdl_cb) 147 pdev = g_target_if_ctx->get_pdev_hdl_cb(scn_handle); 148 else 149 pdev = NULL; 150 qdf_spin_unlock_bh(&g_target_if_ctx->lock); 151 152 return pdev; 153 } 154 155 #ifdef DIRECT_BUF_RX_ENABLE target_if_direct_buf_rx_init(void)156 static QDF_STATUS target_if_direct_buf_rx_init(void) 157 { 158 return direct_buf_rx_init(); 159 } 160 target_if_direct_buf_rx_deinit(void)161 static QDF_STATUS target_if_direct_buf_rx_deinit(void) 162 { 163 return direct_buf_rx_deinit(); 164 } 165 #else target_if_direct_buf_rx_init(void)166 static QDF_STATUS target_if_direct_buf_rx_init(void) 167 { 168 return QDF_STATUS_SUCCESS; 169 } 170 target_if_direct_buf_rx_deinit(void)171 static QDF_STATUS target_if_direct_buf_rx_deinit(void) 172 { 173 return QDF_STATUS_SUCCESS; 174 } 175 #endif /* DIRECT_BUF_RX_ENABLE */ 176 target_if_init(get_psoc_handle_callback psoc_hdl_cb)177 QDF_STATUS target_if_init(get_psoc_handle_callback psoc_hdl_cb) 178 { 179 g_target_if_ctx = qdf_mem_malloc(sizeof(*g_target_if_ctx)); 180 if (!g_target_if_ctx) { 181 QDF_ASSERT(0); 182 return QDF_STATUS_E_NOMEM; 183 } 184 185 qdf_spinlock_create(&g_target_if_ctx->lock); 186 187 qdf_spin_lock_bh(&g_target_if_ctx->lock); 188 g_target_if_ctx->magic = TGT_MAGIC; 189 g_target_if_ctx->get_psoc_hdl_cb = psoc_hdl_cb; 190 qdf_spin_unlock_bh(&g_target_if_ctx->lock); 191 192 target_if_direct_buf_rx_init(); 193 194 return QDF_STATUS_SUCCESS; 195 } 196 target_if_deinit(void)197 QDF_STATUS target_if_deinit(void) 198 { 199 if (!g_target_if_ctx) { 200 QDF_ASSERT(0); 201 target_if_err("target if ctx is null"); 202 return QDF_STATUS_E_INVAL; 203 } 204 205 qdf_spin_lock_bh(&g_target_if_ctx->lock); 206 g_target_if_ctx->magic = 0; 207 g_target_if_ctx->get_psoc_hdl_cb = NULL; 208 g_target_if_ctx->get_pdev_hdl_cb = NULL; 209 g_target_if_ctx->service_ready_cb = NULL; 210 qdf_spin_unlock_bh(&g_target_if_ctx->lock); 211 212 qdf_spinlock_destroy(&g_target_if_ctx->lock); 213 qdf_mem_free(g_target_if_ctx); 214 g_target_if_ctx = NULL; 215 216 target_if_direct_buf_rx_deinit(); 217 218 return QDF_STATUS_SUCCESS; 219 } 220 221 qdf_export_symbol(target_if_deinit); 222 target_if_store_pdev_target_if_ctx(get_pdev_handle_callback pdev_hdl_cb)223 QDF_STATUS target_if_store_pdev_target_if_ctx( 224 get_pdev_handle_callback pdev_hdl_cb) 225 { 226 if (!g_target_if_ctx) { 227 QDF_ASSERT(0); 228 target_if_err("target if ctx is null"); 229 return QDF_STATUS_E_INVAL; 230 } 231 232 qdf_spin_lock_bh(&g_target_if_ctx->lock); 233 g_target_if_ctx->get_pdev_hdl_cb = pdev_hdl_cb; 234 qdf_spin_unlock_bh(&g_target_if_ctx->lock); 235 236 return QDF_STATUS_SUCCESS; 237 } 238 239 #ifndef WLAN_OFFCHAN_TXRX_ENABLE target_if_offchan_txrx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)240 static void target_if_offchan_txrx_ops_register( 241 struct wlan_lmac_if_tx_ops *tx_ops) 242 { 243 } 244 #endif /* WLAN_OFFCHAN_TXRX_ENABLE */ 245 246 #ifndef WLAN_ATF_ENABLE target_if_atf_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)247 static void target_if_atf_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 248 { 249 } 250 #endif /* WLAN_ATF_ENABLE */ 251 252 #ifndef WLAN_SA_API_ENABLE target_if_sa_api_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)253 static void target_if_sa_api_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 254 { 255 } 256 #endif /* WLAN_SA_API_ENABLE */ 257 258 #ifndef WLAN_CFR_ENABLE target_if_cfr_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)259 static void target_if_cfr_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 260 { 261 } 262 #endif 263 264 #ifdef WLAN_SUPPORT_FILS target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)265 static void target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 266 { 267 target_if_fd_register_tx_ops(tx_ops); 268 } 269 #else target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)270 static void target_if_fd_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 271 { 272 } 273 #endif 274 275 #ifdef WIFI_POS_CONVERGED 276 static void target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)277 target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 278 { 279 target_if_wifi_pos_register_tx_ops(tx_ops); 280 } 281 #else 282 static void target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)283 target_if_wifi_pos_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 284 { 285 } 286 #endif 287 288 #if defined(QCA_SUPPORT_SON) || defined(WLAN_FEATURE_SON) target_if_son_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)289 static void target_if_son_tx_ops_register( 290 struct wlan_lmac_if_tx_ops *tx_ops) 291 { 292 target_if_son_register_tx_ops(tx_ops); 293 return; 294 } 295 #else target_if_son_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)296 static void target_if_son_tx_ops_register( 297 struct wlan_lmac_if_tx_ops *tx_ops) 298 { 299 return; 300 } 301 #endif 302 303 #if defined WLAN_FEATURE_SR target_if_spatial_reuse_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)304 static void target_if_spatial_reuse_tx_ops_register( 305 struct wlan_lmac_if_tx_ops *tx_ops) 306 { 307 target_if_spatial_reuse_register_tx_ops(tx_ops); 308 } 309 310 #else target_if_spatial_reuse_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)311 static void target_if_spatial_reuse_tx_ops_register( 312 struct wlan_lmac_if_tx_ops *tx_ops) 313 { 314 } 315 316 #endif 317 318 #ifdef FEATURE_WLAN_TDLS target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)319 static void target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 320 { 321 target_if_tdls_register_tx_ops(tx_ops); 322 } 323 #else target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)324 static void target_if_tdls_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 325 { 326 } 327 #endif /* FEATURE_WLAN_TDLS */ 328 329 #ifdef DFS_COMPONENT_ENABLE target_if_dfs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)330 static void target_if_dfs_tx_ops_register( 331 struct wlan_lmac_if_tx_ops *tx_ops) 332 { 333 target_if_register_dfs_tx_ops(tx_ops); 334 } 335 #else target_if_dfs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)336 static void target_if_dfs_tx_ops_register( 337 struct wlan_lmac_if_tx_ops *tx_ops) 338 { 339 } 340 #endif /* DFS_COMPONENT_ENABLE */ 341 342 #ifdef WLAN_CONV_SPECTRAL_ENABLE target_if_sptrl_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)343 static void target_if_sptrl_tx_ops_register( 344 struct wlan_lmac_if_tx_ops *tx_ops) 345 { 346 target_if_sptrl_register_tx_ops(tx_ops); 347 } 348 #else target_if_sptrl_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)349 static void target_if_sptrl_tx_ops_register( 350 struct wlan_lmac_if_tx_ops *tx_ops) 351 { 352 } 353 #endif /* WLAN_CONV_SPECTRAL_ENABLE */ 354 355 #ifdef WLAN_IOT_SIM_SUPPORT target_if_iot_sim_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)356 static void target_if_iot_sim_tx_ops_register( 357 struct wlan_lmac_if_tx_ops *tx_ops) 358 { 359 target_if_iot_sim_register_tx_ops(tx_ops); 360 } 361 #else target_if_iot_sim_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)362 static void target_if_iot_sim_tx_ops_register( 363 struct wlan_lmac_if_tx_ops *tx_ops) 364 { 365 } 366 #endif 367 368 #ifdef DIRECT_BUF_RX_ENABLE target_if_direct_buf_rx_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)369 static void target_if_direct_buf_rx_tx_ops_register( 370 struct wlan_lmac_if_tx_ops *tx_ops) 371 { 372 target_if_direct_buf_rx_register_tx_ops(tx_ops); 373 } 374 #else target_if_direct_buf_rx_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)375 static void target_if_direct_buf_rx_tx_ops_register( 376 struct wlan_lmac_if_tx_ops *tx_ops) 377 { 378 } 379 #endif /* DIRECT_BUF_RX_ENABLE */ 380 381 #ifdef WLAN_SUPPORT_GREEN_AP target_if_green_ap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)382 static QDF_STATUS target_if_green_ap_tx_ops_register( 383 struct wlan_lmac_if_tx_ops *tx_ops) 384 { 385 return target_if_register_green_ap_tx_ops(tx_ops); 386 } 387 #else target_if_green_ap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)388 static QDF_STATUS target_if_green_ap_tx_ops_register( 389 struct wlan_lmac_if_tx_ops *tx_ops) 390 { 391 return QDF_STATUS_SUCCESS; 392 } 393 #endif /* WLAN_SUPPORT_GREEN_AP */ 394 #if defined(CRYPTO_SET_KEY_CONVERGED) target_if_crypto_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)395 static void target_if_crypto_tx_ops_register( 396 struct wlan_lmac_if_tx_ops *tx_ops) 397 { 398 target_if_crypto_register_tx_ops(tx_ops); 399 } 400 #else target_if_crypto_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)401 static inline void target_if_crypto_tx_ops_register( 402 struct wlan_lmac_if_tx_ops *tx_ops) 403 { 404 } 405 #endif 406 407 #ifdef FEATURE_COEX 408 static QDF_STATUS target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)409 target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 410 { 411 return target_if_coex_register_tx_ops(tx_ops); 412 } 413 #else 414 static inline QDF_STATUS target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)415 target_if_coex_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 416 { 417 return QDF_STATUS_SUCCESS; 418 } 419 #endif 420 421 #ifdef WLAN_FEATURE_DBAM_CONFIG 422 static QDF_STATUS target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)423 target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 424 { 425 return target_if_dbam_register_tx_ops(tx_ops); 426 } 427 #else 428 static inline QDF_STATUS target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)429 target_if_dbam_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 430 { 431 return QDF_STATUS_SUCCESS; 432 } 433 #endif 434 435 #ifdef WLAN_FEATURE_COAP 436 static QDF_STATUS target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)437 target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 438 { 439 return target_if_coap_register_tx_ops(tx_ops); 440 } 441 #else 442 static inline QDF_STATUS target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)443 target_if_coap_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 444 { 445 return QDF_STATUS_SUCCESS; 446 } 447 #endif 448 target_if_target_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)449 static void target_if_target_tx_ops_register( 450 struct wlan_lmac_if_tx_ops *tx_ops) 451 { 452 struct wlan_lmac_if_target_tx_ops *target_tx_ops; 453 454 if (!tx_ops) { 455 target_if_err("invalid tx_ops"); 456 return; 457 } 458 459 target_tx_ops = &tx_ops->target_tx_ops; 460 461 target_tx_ops->tgt_is_tgt_type_ar900b = 462 target_is_tgt_type_ar900b; 463 464 target_tx_ops->tgt_is_tgt_type_qca9984 = 465 target_is_tgt_type_qca9984; 466 467 target_tx_ops->tgt_is_tgt_type_qca9888 = 468 target_is_tgt_type_qca9888; 469 470 target_tx_ops->tgt_is_tgt_type_adrastea = 471 target_is_tgt_type_adrastea; 472 473 target_tx_ops->tgt_is_tgt_type_qcn9000 = 474 target_is_tgt_type_qcn9000; 475 476 target_tx_ops->tgt_is_tgt_type_qcn6122 = 477 target_is_tgt_type_qcn6122; 478 479 target_tx_ops->tgt_is_tgt_type_qcn9160 = 480 target_is_tgt_type_qcn9160; 481 482 target_tx_ops->tgt_is_tgt_type_qcn6432 = 483 target_is_tgt_type_qcn6432; 484 485 target_tx_ops->tgt_is_tgt_type_qcn7605 = 486 target_is_tgt_type_qcn7605; 487 488 target_tx_ops->tgt_get_tgt_type = 489 lmac_get_tgt_type; 490 491 target_tx_ops->tgt_get_tgt_version = 492 lmac_get_tgt_version; 493 494 target_tx_ops->tgt_get_tgt_revision = 495 lmac_get_tgt_revision; 496 } 497 498 static QDF_STATUS target_if_cp_stats_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)499 target_if_cp_stats_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 500 { 501 return target_if_cp_stats_register_tx_ops(tx_ops); 502 } 503 504 #ifdef DCS_INTERFERENCE_DETECTION 505 static QDF_STATUS target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)506 target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 507 { 508 return target_if_dcs_register_tx_ops(tx_ops); 509 } 510 #else 511 static QDF_STATUS target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)512 target_if_dcs_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 513 { 514 return QDF_STATUS_SUCCESS; 515 } 516 #endif 517 518 static QDF_STATUS target_if_vdev_mgr_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)519 target_if_vdev_mgr_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 520 { 521 return target_if_vdev_mgr_register_tx_ops(tx_ops); 522 } 523 524 #ifdef QCA_WIFI_FTM 525 static target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)526 void target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 527 { 528 target_if_ftm_register_tx_ops(tx_ops); 529 } 530 #else 531 static target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)532 void target_if_ftm_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 533 { 534 } 535 #endif 536 537 #ifdef WLAN_FEATURE_GPIO_CFG 538 static target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)539 void target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 540 { 541 target_if_gpio_register_tx_ops(tx_ops); 542 } 543 #else 544 static target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)545 void target_if_gpio_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 546 { 547 } 548 #endif 549 550 #ifdef WLAN_MGMT_RX_REO_SUPPORT 551 static target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)552 void target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 553 { 554 target_if_mgmt_txrx_tx_ops_register(tx_ops); 555 } 556 #else 557 static target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)558 void target_if_mgmt_txrx_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 559 { 560 } 561 #endif /* WLAN_MGMT_RX_REO_SUPPORT */ 562 563 #ifdef WLAN_FEATURE_11BE_MLO 564 static QDF_STATUS target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)565 target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 566 { 567 return target_if_mlo_register_tx_ops(tx_ops); 568 } 569 #else 570 static QDF_STATUS target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)571 target_if_mlo_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 572 { 573 return QDF_STATUS_SUCCESS; 574 } 575 #endif 576 577 #ifdef IPA_OFFLOAD target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)578 static void target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 579 { 580 target_if_ipa_register_tx_ops(tx_ops); 581 } 582 #else target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)583 static void target_if_ipa_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 584 { } 585 #endif 586 587 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED) 588 static target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)589 void target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 590 { 591 target_if_twt_register_tx_ops(tx_ops); 592 } 593 #else 594 static target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops * tx_ops)595 void target_if_twt_tx_ops_register(struct wlan_lmac_if_tx_ops *tx_ops) 596 { 597 } 598 #endif /* WLAN_SUPPORT_TWT && WLAN_TWT_CONV_SUPPORTED */ 599 600 static target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)601 QDF_STATUS target_if_register_umac_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 602 { 603 /* call regulatory callback to register tx ops */ 604 target_if_register_regulatory_tx_ops(tx_ops); 605 606 /* call umac callback to register legacy tx ops */ 607 wlan_lmac_if_umac_tx_ops_register(tx_ops); 608 609 /* Register scan tx ops */ 610 target_if_scan_tx_ops_register(tx_ops); 611 612 target_if_atf_tx_ops_register(tx_ops); 613 614 target_if_sa_api_tx_ops_register(tx_ops); 615 616 target_if_cfr_tx_ops_register(tx_ops); 617 618 target_if_wifi_pos_tx_ops_register(tx_ops); 619 620 target_if_dfs_tx_ops_register(tx_ops); 621 622 target_if_son_tx_ops_register(tx_ops); 623 624 target_if_spatial_reuse_tx_ops_register(tx_ops); 625 626 target_if_tdls_tx_ops_register(tx_ops); 627 628 target_if_fd_tx_ops_register(tx_ops); 629 630 target_if_target_tx_ops_register(tx_ops); 631 632 target_if_offchan_txrx_ops_register(tx_ops); 633 634 target_if_green_ap_tx_ops_register(tx_ops); 635 636 target_if_ftm_tx_ops_register(tx_ops); 637 638 target_if_cp_stats_tx_ops_register(tx_ops); 639 640 target_if_dcs_tx_ops_register(tx_ops); 641 642 target_if_crypto_tx_ops_register(tx_ops); 643 644 target_if_vdev_mgr_tx_ops_register(tx_ops); 645 646 target_if_coex_tx_ops_register(tx_ops); 647 648 target_if_gpio_tx_ops_register(tx_ops); 649 650 target_if_mgmt_txrx_register_tx_ops(tx_ops); 651 652 target_if_mlo_tx_ops_register(tx_ops); 653 654 target_if_ipa_tx_ops_register(tx_ops); 655 656 target_if_twt_tx_ops_register(tx_ops); 657 658 target_if_dbam_tx_ops_register(tx_ops); 659 660 target_if_coap_tx_ops_register(tx_ops); 661 662 /* Converged UMAC components to register their TX-ops here */ 663 return QDF_STATUS_SUCCESS; 664 } 665 target_if_register_tx_ops(struct wlan_lmac_if_tx_ops * tx_ops)666 QDF_STATUS target_if_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 667 { 668 /* Converged UMAC components to register their TX-ops */ 669 target_if_register_umac_tx_ops(tx_ops); 670 671 /* Components parallel to UMAC to register their TX-ops here */ 672 target_if_sptrl_tx_ops_register(tx_ops); 673 674 target_if_iot_sim_tx_ops_register(tx_ops); 675 676 /* Register direct buffer rx component tx ops here */ 677 target_if_direct_buf_rx_tx_ops_register(tx_ops); 678 679 #ifdef CONVERGED_P2P_ENABLE 680 /* Converged UMAC components to register P2P TX-ops */ 681 target_if_p2p_register_tx_ops(tx_ops); 682 #endif 683 684 return QDF_STATUS_SUCCESS; 685 } 686 qdf_export_symbol(target_if_register_tx_ops); 687 688 wmi_legacy_service_ready_callback target_if_get_psoc_legacy_service_ready_cb(void)689 target_if_get_psoc_legacy_service_ready_cb(void) 690 { 691 wmi_legacy_service_ready_callback service_ready_cb; 692 693 qdf_spin_lock_bh(&g_target_if_ctx->lock); 694 if (g_target_if_ctx->service_ready_cb) 695 service_ready_cb = g_target_if_ctx->service_ready_cb; 696 else 697 service_ready_cb = NULL; 698 qdf_spin_unlock_bh(&g_target_if_ctx->lock); 699 700 return service_ready_cb; 701 } 702 qdf_export_symbol(target_if_get_psoc_legacy_service_ready_cb); 703 target_if_register_legacy_service_ready_cb(wmi_legacy_service_ready_callback service_ready_cb)704 QDF_STATUS target_if_register_legacy_service_ready_cb( 705 wmi_legacy_service_ready_callback service_ready_cb) 706 { 707 qdf_spin_lock_bh(&g_target_if_ctx->lock); 708 g_target_if_ctx->service_ready_cb = service_ready_cb; 709 qdf_spin_unlock_bh(&g_target_if_ctx->lock); 710 711 return QDF_STATUS_SUCCESS; 712 } 713 qdf_export_symbol(target_if_register_legacy_service_ready_cb); 714 target_if_alloc_pdev_tgt_info(struct wlan_objmgr_pdev * pdev)715 QDF_STATUS target_if_alloc_pdev_tgt_info(struct wlan_objmgr_pdev *pdev) 716 { 717 struct target_pdev_info *tgt_pdev_info; 718 719 if (!pdev) { 720 target_if_err("pdev is null"); 721 return QDF_STATUS_E_INVAL; 722 } 723 724 tgt_pdev_info = qdf_mem_malloc(sizeof(*tgt_pdev_info)); 725 726 if (!tgt_pdev_info) 727 return QDF_STATUS_E_NOMEM; 728 729 wlan_pdev_set_tgt_if_handle(pdev, tgt_pdev_info); 730 731 return QDF_STATUS_SUCCESS; 732 } 733 target_if_free_pdev_tgt_info(struct wlan_objmgr_pdev * pdev)734 QDF_STATUS target_if_free_pdev_tgt_info(struct wlan_objmgr_pdev *pdev) 735 { 736 struct target_pdev_info *tgt_pdev_info; 737 738 if (!pdev) { 739 target_if_err("pdev is null"); 740 return QDF_STATUS_E_INVAL; 741 } 742 743 tgt_pdev_info = wlan_pdev_get_tgt_if_handle(pdev); 744 745 wlan_pdev_set_tgt_if_handle(pdev, NULL); 746 747 qdf_mem_free(tgt_pdev_info); 748 749 return QDF_STATUS_SUCCESS; 750 } 751 target_if_alloc_psoc_tgt_info(struct wlan_objmgr_psoc * psoc)752 QDF_STATUS target_if_alloc_psoc_tgt_info(struct wlan_objmgr_psoc *psoc) 753 { 754 struct target_psoc_info *tgt_psoc_info; 755 756 if (!psoc) { 757 target_if_err("psoc is null"); 758 return QDF_STATUS_E_INVAL; 759 } 760 761 tgt_psoc_info = qdf_mem_malloc(sizeof(*tgt_psoc_info)); 762 763 if (!tgt_psoc_info) 764 return QDF_STATUS_E_NOMEM; 765 766 wlan_psoc_set_tgt_if_handle(psoc, tgt_psoc_info); 767 target_psoc_set_preferred_hw_mode(tgt_psoc_info, WMI_HOST_HW_MODE_MAX); 768 wlan_minidump_log(tgt_psoc_info, 769 sizeof(*tgt_psoc_info), psoc, 770 WLAN_MD_OBJMGR_PSOC_TGT_INFO, "target_psoc_info"); 771 772 qdf_event_create(&tgt_psoc_info->info.event); 773 774 return QDF_STATUS_SUCCESS; 775 } 776 target_if_psoc_tgt_info_mem_free(struct target_psoc_info * tgt_psoc_info)777 QDF_STATUS target_if_psoc_tgt_info_mem_free( 778 struct target_psoc_info *tgt_psoc_info) 779 { 780 struct wlan_psoc_host_service_ext_param *ext_param; 781 782 if (!tgt_psoc_info) { 783 target_if_err("tgt_psoc_info is NULL"); 784 return QDF_STATUS_E_INVAL; 785 } 786 787 /* reminder to move this into init_deinit_chainmask_table_free */ 788 ext_param = target_psoc_get_service_ext_param(tgt_psoc_info); 789 if (ext_param) 790 init_deinit_chainmask_table_free(ext_param); 791 792 init_deinit_dbr_ring_cap_free(tgt_psoc_info); 793 init_deinit_spectral_scaling_params_free(tgt_psoc_info); 794 init_deinit_scan_radio_cap_free(tgt_psoc_info); 795 init_deinit_msdu_idx_qtype_map_free(tgt_psoc_info); 796 init_deinit_aux_dev_cap_free(tgt_psoc_info); 797 init_deinit_rcc_aoa_cap_ext2_free(tgt_psoc_info); 798 799 return QDF_STATUS_SUCCESS; 800 } 801 target_if_free_psoc_tgt_info(struct wlan_objmgr_psoc * psoc)802 QDF_STATUS target_if_free_psoc_tgt_info(struct wlan_objmgr_psoc *psoc) 803 { 804 struct target_psoc_info *tgt_psoc_info; 805 806 if (!psoc) { 807 target_if_err("psoc is null"); 808 return QDF_STATUS_E_INVAL; 809 } 810 811 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc); 812 813 target_if_psoc_tgt_info_mem_free(tgt_psoc_info); 814 qdf_event_destroy(&tgt_psoc_info->info.event); 815 816 wlan_psoc_set_tgt_if_handle(psoc, NULL); 817 818 wlan_minidump_remove(tgt_psoc_info, 819 sizeof(*tgt_psoc_info), psoc, 820 WLAN_MD_OBJMGR_PSOC_TGT_INFO, "target_psoc_info"); 821 qdf_mem_free(tgt_psoc_info); 822 823 return QDF_STATUS_SUCCESS; 824 } 825 target_is_tgt_type_ar900b(uint32_t target_type)826 bool target_is_tgt_type_ar900b(uint32_t target_type) 827 { 828 return target_type == TARGET_TYPE_AR900B; 829 } 830 target_is_tgt_type_qca9984(uint32_t target_type)831 bool target_is_tgt_type_qca9984(uint32_t target_type) 832 { 833 return target_type == TARGET_TYPE_QCA9984; 834 } 835 target_is_tgt_type_qca9888(uint32_t target_type)836 bool target_is_tgt_type_qca9888(uint32_t target_type) 837 { 838 return target_type == TARGET_TYPE_QCA9888; 839 } 840 target_is_tgt_type_adrastea(uint32_t target_type)841 bool target_is_tgt_type_adrastea(uint32_t target_type) 842 { 843 return target_type == TARGET_TYPE_ADRASTEA; 844 } 845 target_is_tgt_type_qcn9000(uint32_t target_type)846 bool target_is_tgt_type_qcn9000(uint32_t target_type) 847 { 848 return target_type == TARGET_TYPE_QCN9000; 849 } 850 target_is_tgt_type_qcn6122(uint32_t target_type)851 bool target_is_tgt_type_qcn6122(uint32_t target_type) 852 { 853 return target_type == TARGET_TYPE_QCN6122; 854 } 855 target_is_tgt_type_qcn9160(uint32_t target_type)856 bool target_is_tgt_type_qcn9160(uint32_t target_type) 857 { 858 return target_type == TARGET_TYPE_QCN9160; 859 } 860 target_is_tgt_type_qcn6432(uint32_t target_type)861 bool target_is_tgt_type_qcn6432(uint32_t target_type) 862 { 863 return target_type == TARGET_TYPE_QCN6432; 864 } 865 target_is_tgt_type_qcn7605(uint32_t target_type)866 bool target_is_tgt_type_qcn7605(uint32_t target_type) 867 { 868 return target_type == TARGET_TYPE_QCN7605; 869 } 870 871 QDF_STATUS target_pdev_is_scan_radio_supported(struct wlan_objmgr_pdev * pdev,bool * is_scan_radio_supported)872 target_pdev_is_scan_radio_supported(struct wlan_objmgr_pdev *pdev, 873 bool *is_scan_radio_supported) 874 { 875 struct wlan_objmgr_psoc *psoc; 876 struct wlan_psoc_host_scan_radio_caps *scan_radio_caps; 877 uint8_t cap_idx; 878 uint32_t num_scan_radio_caps; 879 int32_t phy_id; 880 struct target_psoc_info *tgt_psoc_info; 881 struct target_pdev_info *tgt_pdev; 882 uint32_t target_type = TARGET_TYPE_UNKNOWN; 883 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops; 884 struct wlan_lmac_if_tx_ops *tx_ops; 885 886 if (!is_scan_radio_supported) { 887 target_if_err("input argument is null"); 888 return QDF_STATUS_E_INVAL; 889 } 890 *is_scan_radio_supported = false; 891 892 if (!pdev) { 893 target_if_err("pdev is null"); 894 return QDF_STATUS_E_INVAL; 895 } 896 897 psoc = wlan_pdev_get_psoc(pdev); 898 if (!psoc) { 899 target_if_err("psoc is null"); 900 return QDF_STATUS_E_INVAL; 901 } 902 903 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc); 904 if (!tgt_psoc_info) { 905 target_if_err("target_psoc_info is null"); 906 return QDF_STATUS_E_INVAL; 907 } 908 909 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 910 if (!tx_ops) { 911 target_if_err("tx_ops is null"); 912 return QDF_STATUS_E_NULL_VALUE; 913 } 914 915 target_type_tx_ops = &tx_ops->target_tx_ops; 916 if (target_type_tx_ops->tgt_get_tgt_type) 917 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc); 918 919 if (target_type == TARGET_TYPE_AR9888) { 920 *is_scan_radio_supported = true; 921 return QDF_STATUS_SUCCESS; 922 } 923 924 num_scan_radio_caps = 925 target_psoc_get_num_scan_radio_caps(tgt_psoc_info); 926 if (!num_scan_radio_caps) 927 return QDF_STATUS_SUCCESS; 928 929 scan_radio_caps = target_psoc_get_scan_radio_caps(tgt_psoc_info); 930 if (!scan_radio_caps) { 931 target_if_err("scan radio capabilities is null"); 932 return QDF_STATUS_E_INVAL; 933 } 934 935 tgt_pdev = (struct target_pdev_info *)wlan_pdev_get_tgt_if_handle(pdev); 936 if (!tgt_pdev) { 937 target_if_err("target_pdev_info is null"); 938 return QDF_STATUS_E_INVAL; 939 } 940 941 phy_id = target_pdev_get_phy_idx(tgt_pdev); 942 if (phy_id < 0) { 943 target_if_err("phy_id is invalid"); 944 return QDF_STATUS_E_INVAL; 945 } 946 947 for (cap_idx = 0; cap_idx < num_scan_radio_caps; cap_idx++) 948 if (scan_radio_caps[cap_idx].phy_id == phy_id) 949 *is_scan_radio_supported = 950 scan_radio_caps[cap_idx].scan_radio_supported; 951 952 return QDF_STATUS_SUCCESS; 953 } 954 955 QDF_STATUS target_pdev_scan_radio_is_dfs_enabled(struct wlan_objmgr_pdev * pdev,bool * is_dfs_en)956 target_pdev_scan_radio_is_dfs_enabled(struct wlan_objmgr_pdev *pdev, 957 bool *is_dfs_en) 958 { 959 struct wlan_objmgr_psoc *psoc; 960 struct wlan_psoc_host_scan_radio_caps *scan_radio_caps; 961 uint8_t cap_idx; 962 uint32_t num_scan_radio_caps, pdev_id; 963 int32_t phy_id; 964 struct target_psoc_info *tgt_psoc_info; 965 struct target_pdev_info *tgt_pdev; 966 uint32_t target_type = TARGET_TYPE_UNKNOWN; 967 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops; 968 struct wlan_lmac_if_tx_ops *tx_ops; 969 970 if (!is_dfs_en) { 971 target_if_err("input argument is null"); 972 return QDF_STATUS_E_INVAL; 973 } 974 *is_dfs_en = true; 975 976 if (!pdev) { 977 target_if_err("pdev is null"); 978 return QDF_STATUS_E_INVAL; 979 } 980 981 psoc = wlan_pdev_get_psoc(pdev); 982 if (!psoc) { 983 target_if_err("psoc is null"); 984 return QDF_STATUS_E_INVAL; 985 } 986 987 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc); 988 if (!tgt_psoc_info) { 989 target_if_err("target_psoc_info is null"); 990 return QDF_STATUS_E_INVAL; 991 } 992 993 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 994 if (!tx_ops) { 995 target_if_err("tx_ops is null"); 996 return QDF_STATUS_E_NULL_VALUE; 997 } 998 target_type_tx_ops = &tx_ops->target_tx_ops; 999 if (target_type_tx_ops->tgt_get_tgt_type) 1000 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc); 1001 1002 if (target_type == TARGET_TYPE_AR9888) { 1003 *is_dfs_en = false; 1004 return QDF_STATUS_SUCCESS; 1005 } 1006 1007 num_scan_radio_caps = 1008 target_psoc_get_num_scan_radio_caps(tgt_psoc_info); 1009 if (!num_scan_radio_caps) { 1010 target_if_err("scan radio not supported for psoc"); 1011 return QDF_STATUS_E_INVAL; 1012 } 1013 1014 scan_radio_caps = target_psoc_get_scan_radio_caps(tgt_psoc_info); 1015 if (!scan_radio_caps) { 1016 target_if_err("scan radio capabilities is null"); 1017 return QDF_STATUS_E_INVAL; 1018 } 1019 1020 tgt_pdev = (struct target_pdev_info *)wlan_pdev_get_tgt_if_handle(pdev); 1021 if (!tgt_pdev) { 1022 target_if_err("target_pdev_info is null"); 1023 return QDF_STATUS_E_INVAL; 1024 } 1025 1026 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 1027 phy_id = target_pdev_get_phy_idx(tgt_pdev); 1028 if (phy_id < 0) { 1029 target_if_err("phy_id is invalid"); 1030 return QDF_STATUS_E_INVAL; 1031 } 1032 1033 for (cap_idx = 0; cap_idx < num_scan_radio_caps; cap_idx++) 1034 if (scan_radio_caps[cap_idx].phy_id == phy_id) { 1035 *is_dfs_en = scan_radio_caps[cap_idx].dfs_en; 1036 return QDF_STATUS_SUCCESS; 1037 } 1038 1039 target_if_err("No scan radio cap found in pdev %d", pdev_id); 1040 1041 return QDF_STATUS_E_INVAL; 1042 } 1043 1044 QDF_STATUS target_is_scan_blanking_enabled(struct wlan_objmgr_pdev * pdev,bool * blanking_en)1045 target_is_scan_blanking_enabled(struct wlan_objmgr_pdev *pdev, 1046 bool *blanking_en) 1047 { 1048 struct wlan_objmgr_psoc *psoc; 1049 struct wlan_psoc_host_scan_radio_caps *scan_radio_caps; 1050 uint8_t cap_idx; 1051 uint32_t num_scan_radio_caps, pdev_id; 1052 int32_t phy_id; 1053 struct target_psoc_info *tgt_psoc_info; 1054 struct target_pdev_info *tgt_pdev; 1055 uint32_t target_type = TARGET_TYPE_UNKNOWN; 1056 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops; 1057 struct wlan_lmac_if_tx_ops *tx_ops; 1058 1059 1060 if (!blanking_en) { 1061 target_if_err("input argument is null"); 1062 return QDF_STATUS_E_NULL_VALUE; 1063 } 1064 *blanking_en = false; 1065 1066 if (!pdev) { 1067 target_if_err("pdev is null"); 1068 return QDF_STATUS_E_NULL_VALUE; 1069 } 1070 1071 psoc = wlan_pdev_get_psoc(pdev); 1072 if (!psoc) { 1073 target_if_err("psoc is null"); 1074 return QDF_STATUS_E_NULL_VALUE; 1075 } 1076 1077 tgt_psoc_info = wlan_psoc_get_tgt_if_handle(psoc); 1078 if (!tgt_psoc_info) { 1079 target_if_err("target_psoc_info is null"); 1080 return QDF_STATUS_E_NULL_VALUE; 1081 } 1082 1083 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 1084 if (!tx_ops) { 1085 target_if_err("tx_ops is null"); 1086 return QDF_STATUS_E_NULL_VALUE; 1087 } 1088 1089 target_type_tx_ops = &tx_ops->target_tx_ops; 1090 if (target_type_tx_ops->tgt_get_tgt_type) 1091 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc); 1092 1093 if (target_type == TARGET_TYPE_AR9888) { 1094 *blanking_en = false; 1095 return QDF_STATUS_SUCCESS; 1096 } 1097 1098 num_scan_radio_caps = 1099 target_psoc_get_num_scan_radio_caps(tgt_psoc_info); 1100 if (!num_scan_radio_caps) { 1101 target_if_err("scan radio not supported for psoc"); 1102 return QDF_STATUS_E_NULL_VALUE; 1103 } 1104 1105 scan_radio_caps = target_psoc_get_scan_radio_caps(tgt_psoc_info); 1106 if (!scan_radio_caps) { 1107 target_if_err("scan radio capabilities is null"); 1108 return QDF_STATUS_E_NULL_VALUE; 1109 } 1110 1111 tgt_pdev = (struct target_pdev_info *)wlan_pdev_get_tgt_if_handle(pdev); 1112 if (!tgt_pdev) { 1113 target_if_err("target_pdev_info is null"); 1114 return QDF_STATUS_E_NULL_VALUE; 1115 } 1116 1117 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 1118 phy_id = target_pdev_get_phy_idx(tgt_pdev); 1119 if (phy_id < 0) { 1120 target_if_err("phy_id is invalid"); 1121 return QDF_STATUS_E_INVAL; 1122 } 1123 1124 for (cap_idx = 0; cap_idx < num_scan_radio_caps; cap_idx++) 1125 if (scan_radio_caps[cap_idx].phy_id == phy_id) { 1126 *blanking_en = scan_radio_caps[cap_idx].blanking_en; 1127 return QDF_STATUS_SUCCESS; 1128 } 1129 1130 target_if_err("No scan radio cap found in pdev %d", pdev_id); 1131 1132 return QDF_STATUS_E_INVAL; 1133 } 1134 target_if_set_reg_cc_ext_supp(struct target_psoc_info * tgt_hdl,struct wlan_objmgr_psoc * psoc)1135 void target_if_set_reg_cc_ext_supp(struct target_psoc_info *tgt_hdl, 1136 struct wlan_objmgr_psoc *psoc) 1137 { 1138 struct tgt_info *info; 1139 1140 if (!tgt_hdl) 1141 return; 1142 1143 info = (&tgt_hdl->info); 1144 1145 info->wlan_res_cfg.is_reg_cc_ext_event_supported = 1146 target_if_reg_is_reg_cc_ext_event_host_supported(psoc); 1147 } 1148 1149 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) target_if_pdev_get_hw_link_id(struct wlan_objmgr_pdev * pdev)1150 uint16_t target_if_pdev_get_hw_link_id(struct wlan_objmgr_pdev *pdev) 1151 { 1152 struct target_pdev_info *tgt_pdev_info; 1153 1154 if (!pdev) 1155 return PDEV_INVALID_HW_LINK_ID; 1156 1157 tgt_pdev_info = wlan_pdev_get_tgt_if_handle(pdev); 1158 if (!tgt_pdev_info) 1159 return PDEV_INVALID_HW_LINK_ID; 1160 1161 return tgt_pdev_info->hw_link_id; 1162 } 1163 target_pdev_set_hw_link_id(struct wlan_objmgr_pdev * pdev,uint16_t hw_link_id)1164 void target_pdev_set_hw_link_id(struct wlan_objmgr_pdev *pdev, 1165 uint16_t hw_link_id) 1166 { 1167 struct target_pdev_info *tgt_pdev_info; 1168 1169 if (!pdev) 1170 return; 1171 1172 tgt_pdev_info = wlan_pdev_get_tgt_if_handle(pdev); 1173 if (!tgt_pdev_info) 1174 return; 1175 1176 tgt_pdev_info->hw_link_id = hw_link_id; 1177 } 1178 target_if_mlo_setup_send(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_pdev ** pdev_list,uint8_t num_links,uint8_t grp_id)1179 static QDF_STATUS target_if_mlo_setup_send(struct wlan_objmgr_pdev *pdev, 1180 struct wlan_objmgr_pdev **pdev_list, 1181 uint8_t num_links, uint8_t grp_id) 1182 { 1183 wmi_unified_t wmi_handle; 1184 struct wmi_mlo_setup_params params = {0}; 1185 uint8_t idx, num_valid_links = 0; 1186 1187 wmi_handle = lmac_get_pdev_wmi_handle(pdev); 1188 if (!wmi_handle) 1189 return QDF_STATUS_E_INVAL; 1190 1191 params.mld_grp_id = grp_id; 1192 params.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 1193 1194 for (idx = 0; idx < num_links; idx++) { 1195 if (pdev == pdev_list[idx]) 1196 continue; 1197 1198 params.partner_links[num_valid_links] = 1199 target_if_pdev_get_hw_link_id(pdev_list[idx]); 1200 num_valid_links++; 1201 } 1202 params.num_valid_hw_links = num_valid_links; 1203 1204 return wmi_mlo_setup_cmd_send(wmi_handle, ¶ms); 1205 } 1206 target_if_mlo_setup_req(struct wlan_objmgr_pdev ** pdev,uint8_t num_pdevs,uint8_t grp_id)1207 QDF_STATUS target_if_mlo_setup_req(struct wlan_objmgr_pdev **pdev, 1208 uint8_t num_pdevs, uint8_t grp_id) 1209 { 1210 uint8_t idx; 1211 1212 for (idx = 0; idx < num_pdevs; idx++) 1213 target_if_mlo_setup_send(pdev[idx], pdev, num_pdevs, grp_id); 1214 1215 return QDF_STATUS_SUCCESS; 1216 } 1217 target_if_mlo_ready_send(struct wlan_objmgr_pdev * pdev)1218 static QDF_STATUS target_if_mlo_ready_send(struct wlan_objmgr_pdev *pdev) 1219 { 1220 wmi_unified_t wmi_handle; 1221 struct wmi_mlo_ready_params params = {0}; 1222 1223 wmi_handle = lmac_get_pdev_wmi_handle(pdev); 1224 if (!wmi_handle) 1225 return QDF_STATUS_E_INVAL; 1226 1227 params.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 1228 1229 return wmi_mlo_ready_cmd_send(wmi_handle, ¶ms); 1230 } 1231 target_if_mlo_ready(struct wlan_objmgr_pdev ** pdev,uint8_t num_pdevs)1232 QDF_STATUS target_if_mlo_ready(struct wlan_objmgr_pdev **pdev, 1233 uint8_t num_pdevs) 1234 { 1235 uint8_t idx; 1236 1237 for (idx = 0; idx < num_pdevs; idx++) 1238 target_if_mlo_ready_send(pdev[idx]); 1239 1240 return QDF_STATUS_SUCCESS; 1241 } 1242 1243 QDF_STATUS target_if_mlo_teardown_req(struct wlan_objmgr_pdev * pdev,enum wmi_mlo_teardown_reason reason,bool reset,bool standby_active)1244 target_if_mlo_teardown_req(struct wlan_objmgr_pdev *pdev, 1245 enum wmi_mlo_teardown_reason reason, 1246 bool reset, bool standby_active) 1247 { 1248 wmi_unified_t wmi_handle; 1249 struct wmi_mlo_teardown_params params = {0}; 1250 1251 wmi_handle = lmac_get_pdev_wmi_handle(pdev); 1252 if (!wmi_handle) 1253 return QDF_STATUS_E_INVAL; 1254 1255 params.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 1256 params.reason = reason; 1257 params.umac_reset = reset; 1258 params.standby_active = standby_active; 1259 1260 return wmi_mlo_teardown_cmd_send(wmi_handle, ¶ms); 1261 } 1262 #endif /*WLAN_FEATURE_11BE_MLO && WLAN_MLO_MULTI_CHIP*/ 1263