1 /* 2 * Copyright (c) 2019-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 /** 21 * DOC: wlan_vdev_mgr_tgt_if_tx_api.c 22 * 23 * This file provides definitions for mlme tgt_if APIs, which will 24 * further call target_if/mlme component using LMAC MLME txops 25 */ 26 #include <wlan_vdev_mgr_tgt_if_tx_api.h> 27 #include <target_if_vdev_mgr_tx_ops.h> 28 #include "include/wlan_vdev_mlme.h" 29 #include <wlan_mlme_dbg.h> 30 #include <cdp_txrx_cmn_struct.h> 31 #include <cdp_txrx_cmn.h> 32 #include <wlan_lmac_if_api.h> 33 #include <wlan_utility.h> 34 #include <cdp_txrx_ctrl.h> 35 #include <wlan_vdev_mlme_api.h> 36 #include <wlan_dfs_utils_api.h> 37 #include <wlan_vdev_mgr_utils_api.h> 38 #include <wlan_vdev_mgr_ucfg_api.h> 39 #include <wlan_vdev_mlme_main.h> 40 41 static inline struct wlan_lmac_if_mlme_tx_ops 42 *wlan_vdev_mlme_get_lmac_txops(struct wlan_objmgr_vdev *vdev) 43 { 44 struct wlan_objmgr_psoc *psoc; 45 46 psoc = wlan_vdev_get_psoc(vdev); 47 48 return target_if_vdev_mgr_get_tx_ops(psoc); 49 } 50 51 #ifdef WLAN_FEATURE_11BE_MLO 52 static inline void 53 wlan_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info, 54 struct vdev_create_params *param) 55 { 56 vdev_info->mld_mac_addr = param->mlo_mac; 57 } 58 #else 59 static inline void 60 wlan_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info, 61 struct vdev_create_params *param) 62 { 63 } 64 #endif 65 66 QDF_STATUS tgt_vdev_mgr_create_send( 67 struct vdev_mlme_obj *mlme_obj, 68 struct vdev_create_params *param) 69 { 70 QDF_STATUS status = QDF_STATUS_E_FAILURE; 71 struct wlan_lmac_if_mlme_tx_ops *txops; 72 struct wlan_objmgr_psoc *psoc; 73 struct wlan_objmgr_pdev *pdev; 74 struct wlan_objmgr_vdev *vdev; 75 ol_txrx_soc_handle soc_txrx_handle; 76 uint32_t vdev_id; 77 struct cdp_vdev_info vdev_info = { 0 }; 78 79 if (!param) { 80 mlme_err("Invalid input"); 81 return QDF_STATUS_E_INVAL; 82 } 83 84 vdev = mlme_obj->vdev; 85 vdev_id = wlan_vdev_get_id(vdev); 86 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 87 if (!txops || !txops->vdev_create_send) { 88 mlme_err("VDEV_%d No Tx Ops", vdev_id); 89 return QDF_STATUS_E_INVAL; 90 } 91 92 psoc = wlan_vdev_get_psoc(vdev); 93 if (!psoc) { 94 mlme_err("psoc object is NULL"); 95 return QDF_STATUS_E_INVAL; 96 } 97 98 status = txops->vdev_create_send(vdev, param); 99 if (QDF_IS_STATUS_ERROR(status)) { 100 mlme_err("VDEV_%d PSOC_%d Tx Ops Error : %d", vdev_id, 101 wlan_psoc_get_id(psoc), status); 102 return status; 103 } 104 105 vdev_info.vdev_mac_addr = wlan_vdev_mlme_get_macaddr(vdev); 106 vdev_info.vdev_id = vdev_id; 107 vdev_info.vdev_stats_id = param->vdev_stats_id; 108 vdev_info.op_mode = wlan_util_vdev_get_cdp_txrx_opmode(vdev); 109 vdev_info.subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev); 110 wlan_vdev_mgr_fill_mlo_params(&vdev_info, param); 111 pdev = wlan_vdev_get_pdev(vdev); 112 113 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 114 if (!soc_txrx_handle) 115 return QDF_STATUS_E_FAILURE; 116 117 118 return cdp_vdev_attach(soc_txrx_handle, 119 wlan_objmgr_pdev_get_pdev_id(pdev), 120 &vdev_info); 121 } 122 123 QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme) 124 { 125 struct wlan_objmgr_vdev *vdev; 126 struct vdev_set_params param = {0}; 127 struct wlan_lmac_if_mlme_tx_ops *txops; 128 struct vdev_mlme_inactivity_params *inactivity; 129 uint8_t vdev_id; 130 QDF_STATUS status = QDF_STATUS_SUCCESS; 131 132 vdev = vdev_mlme->vdev; 133 vdev_id = wlan_vdev_get_id(vdev); 134 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 135 if (!txops || !txops->vdev_set_param_send) { 136 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 137 return QDF_STATUS_E_INVAL; 138 } 139 140 inactivity = &vdev_mlme->mgmt.inactivity_params; 141 142 param.vdev_id = vdev_id; 143 144 param.param_value = 145 inactivity->keepalive_min_idle_inactive_time_secs; 146 param.param_id = WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME; 147 status = txops->vdev_set_param_send(vdev, ¶m); 148 if (QDF_IS_STATUS_ERROR(status)) 149 mlme_err("VDEV_%d: Failed to set min idle inactive time!", 150 vdev_id); 151 152 param.param_value = 153 inactivity->keepalive_max_idle_inactive_time_secs; 154 param.param_id = WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME; 155 status = txops->vdev_set_param_send(vdev, ¶m); 156 if (QDF_IS_STATUS_ERROR(status)) 157 mlme_err("VDEV_%d: Failed to set max idle inactive time!", 158 vdev_id); 159 160 param.param_value = 161 inactivity->keepalive_max_unresponsive_time_secs; 162 param.param_id = WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME; 163 status = txops->vdev_set_param_send(vdev, ¶m); 164 if (QDF_IS_STATUS_ERROR(status)) 165 mlme_err("VDEV_%d: Failed to set max unresponse inactive time!", 166 vdev_id); 167 168 return status; 169 } 170 171 QDF_STATUS tgt_vdev_mgr_start_send( 172 struct vdev_mlme_obj *mlme_obj, 173 struct vdev_start_params *param) 174 { 175 QDF_STATUS status; 176 struct wlan_lmac_if_mlme_tx_ops *txops; 177 struct wlan_objmgr_vdev *vdev; 178 uint8_t vdev_id; 179 180 if (!param) { 181 mlme_err("Invalid input"); 182 return QDF_STATUS_E_INVAL; 183 } 184 185 vdev = mlme_obj->vdev; 186 vdev_id = wlan_vdev_get_id(vdev); 187 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 188 if (!txops || !txops->vdev_start_send) { 189 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 190 return QDF_STATUS_E_INVAL; 191 } 192 193 status = txops->vdev_start_send(vdev, param); 194 if (QDF_IS_STATUS_ERROR(status)) 195 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 196 197 return status; 198 } 199 200 QDF_STATUS tgt_vdev_mgr_delete_send( 201 struct vdev_mlme_obj *mlme_obj, 202 struct vdev_delete_params *param) 203 { 204 QDF_STATUS status; 205 struct wlan_lmac_if_mlme_tx_ops *txops; 206 struct wlan_objmgr_vdev *vdev; 207 struct wlan_objmgr_psoc *psoc; 208 ol_txrx_soc_handle soc_txrx_handle; 209 uint8_t vdev_id; 210 211 if (!param) { 212 mlme_err("Invalid input"); 213 return QDF_STATUS_E_INVAL; 214 } 215 216 vdev = mlme_obj->vdev; 217 vdev_id = wlan_vdev_get_id(vdev); 218 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 219 if (!txops || !txops->vdev_delete_send) { 220 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 221 return QDF_STATUS_E_INVAL; 222 } 223 224 psoc = wlan_vdev_get_psoc(vdev); 225 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 226 if (soc_txrx_handle) 227 cdp_vdev_detach(soc_txrx_handle, wlan_vdev_get_id(vdev), 228 NULL, NULL); 229 230 status = txops->vdev_delete_send(vdev, param); 231 if (QDF_IS_STATUS_ERROR(status)) 232 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 233 234 return status; 235 } 236 237 QDF_STATUS tgt_vdev_mgr_peer_flush_tids_send( 238 struct vdev_mlme_obj *mlme_obj, 239 struct peer_flush_params *param) 240 { 241 QDF_STATUS status; 242 struct wlan_lmac_if_mlme_tx_ops *txops; 243 struct wlan_objmgr_vdev *vdev; 244 uint8_t vdev_id; 245 246 if (!param) { 247 mlme_err("Invalid input"); 248 return QDF_STATUS_E_INVAL; 249 } 250 251 vdev = mlme_obj->vdev; 252 vdev_id = wlan_vdev_get_id(vdev); 253 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 254 if (!txops || !txops->peer_flush_tids_send) { 255 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 256 return QDF_STATUS_E_INVAL; 257 } 258 259 status = txops->peer_flush_tids_send(vdev, param); 260 if (QDF_IS_STATUS_ERROR(status)) 261 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 262 263 return QDF_STATUS_SUCCESS; 264 } 265 266 QDF_STATUS tgt_vdev_mgr_stop_send( 267 struct vdev_mlme_obj *mlme_obj, 268 struct vdev_stop_params *param) 269 { 270 QDF_STATUS status; 271 struct wlan_lmac_if_mlme_tx_ops *txops; 272 struct wlan_objmgr_vdev *vdev; 273 uint8_t vdev_id; 274 275 if (!param) { 276 mlme_err("Invalid input"); 277 return QDF_STATUS_E_INVAL; 278 } 279 280 vdev = mlme_obj->vdev; 281 vdev_id = wlan_vdev_get_id(vdev); 282 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 283 if (!txops || !txops->vdev_stop_send) { 284 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 285 return QDF_STATUS_E_INVAL; 286 } 287 288 status = txops->vdev_stop_send(vdev, param); 289 if (QDF_IS_STATUS_ERROR(status)) 290 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 291 292 return status; 293 } 294 295 QDF_STATUS tgt_vdev_mgr_beacon_stop(struct vdev_mlme_obj *mlme_obj) 296 { 297 return QDF_STATUS_SUCCESS; 298 } 299 300 QDF_STATUS tgt_vdev_mgr_beacon_free(struct vdev_mlme_obj *mlme_obj) 301 { 302 return QDF_STATUS_SUCCESS; 303 } 304 305 QDF_STATUS tgt_vdev_mgr_up_send( 306 struct vdev_mlme_obj *mlme_obj, 307 struct vdev_up_params *param) 308 { 309 QDF_STATUS status; 310 struct wlan_lmac_if_mlme_tx_ops *txops; 311 ol_txrx_soc_handle soc_txrx_handle; 312 struct wlan_objmgr_psoc *psoc; 313 struct wlan_objmgr_vdev *vdev; 314 uint8_t vdev_id; 315 316 if (!param) { 317 mlme_err("Invalid input"); 318 return QDF_STATUS_E_INVAL; 319 } 320 321 vdev = mlme_obj->vdev; 322 vdev_id = wlan_vdev_get_id(vdev); 323 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 324 if (!txops || !txops->vdev_up_send) { 325 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 326 return QDF_STATUS_E_INVAL; 327 } 328 329 /* cdp set rx and tx decap type */ 330 psoc = wlan_vdev_get_psoc(vdev); 331 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 332 if (!soc_txrx_handle || vdev_id == WLAN_INVALID_VDEV_ID) 333 return QDF_STATUS_E_INVAL; 334 335 status = txops->vdev_up_send(vdev, param); 336 if (QDF_IS_STATUS_ERROR(status)) 337 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 338 339 return status; 340 } 341 342 QDF_STATUS tgt_vdev_mgr_down_send( 343 struct vdev_mlme_obj *mlme_obj, 344 struct vdev_down_params *param) 345 { 346 QDF_STATUS status; 347 struct wlan_lmac_if_mlme_tx_ops *txops; 348 struct wlan_objmgr_pdev *pdev; 349 struct wlan_objmgr_vdev *vdev; 350 enum QDF_OPMODE opmode; 351 uint8_t vdev_id; 352 353 if (!param) { 354 mlme_err("Invalid input"); 355 return QDF_STATUS_E_INVAL; 356 } 357 358 vdev = mlme_obj->vdev; 359 vdev_id = wlan_vdev_get_id(vdev); 360 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 361 if (!txops || !txops->vdev_down_send) { 362 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 363 return QDF_STATUS_E_INVAL; 364 } 365 366 pdev = wlan_vdev_get_pdev(vdev); 367 if (!pdev) { 368 mlme_err("PDEV is NULL"); 369 return QDF_STATUS_E_INVAL; 370 } 371 372 opmode = wlan_vdev_mlme_get_opmode(vdev); 373 if (wlan_util_is_vdev_active(pdev, WLAN_VDEV_TARGET_IF_ID) == 374 QDF_STATUS_SUCCESS) { 375 376 if (opmode == QDF_SAP_MODE) 377 utils_dfs_cancel_precac_timer(pdev); 378 } 379 380 status = txops->vdev_down_send(vdev, param); 381 if (QDF_IS_STATUS_ERROR(status)) 382 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 383 384 return status; 385 } 386 387 QDF_STATUS tgt_vdev_mgr_set_neighbour_rx_cmd_send( 388 struct vdev_mlme_obj *mlme_obj, 389 struct set_neighbour_rx_params *param) 390 { 391 return QDF_STATUS_SUCCESS; 392 } 393 394 QDF_STATUS tgt_vdev_mgr_nac_rssi_send( 395 struct vdev_mlme_obj *mlme_obj, 396 struct vdev_scan_nac_rssi_params *param) 397 { 398 return QDF_STATUS_SUCCESS; 399 } 400 401 QDF_STATUS tgt_vdev_mgr_sifs_trigger_send( 402 struct vdev_mlme_obj *mlme_obj, 403 struct sifs_trigger_param *param) 404 { 405 QDF_STATUS status = QDF_STATUS_E_FAILURE; 406 struct wlan_lmac_if_mlme_tx_ops *txops; 407 struct wlan_objmgr_vdev *vdev; 408 uint8_t vdev_id; 409 410 if (!param) { 411 mlme_err("Invalid input"); 412 return QDF_STATUS_E_INVAL; 413 } 414 415 vdev = mlme_obj->vdev; 416 vdev_id = wlan_vdev_get_id(vdev); 417 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 418 if (!txops || !txops->vdev_sifs_trigger_send) { 419 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 420 return QDF_STATUS_E_INVAL; 421 } 422 423 status = txops->vdev_sifs_trigger_send(vdev, param); 424 if (QDF_IS_STATUS_ERROR(status)) 425 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 426 427 return status; 428 } 429 430 QDF_STATUS tgt_vdev_mgr_set_custom_aggr_size_send( 431 struct vdev_mlme_obj *mlme_obj, 432 struct set_custom_aggr_size_params *param) 433 { 434 QDF_STATUS status; 435 struct wlan_lmac_if_mlme_tx_ops *txops; 436 struct wlan_objmgr_vdev *vdev; 437 uint8_t vdev_id; 438 439 if (!param) { 440 mlme_err("Invalid input"); 441 return QDF_STATUS_E_INVAL; 442 } 443 444 vdev = mlme_obj->vdev; 445 vdev_id = wlan_vdev_get_id(vdev); 446 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 447 if (!txops || !txops->vdev_set_custom_aggr_size_cmd_send) { 448 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 449 return QDF_STATUS_E_INVAL; 450 } 451 452 status = txops->vdev_set_custom_aggr_size_cmd_send(vdev, param); 453 if (QDF_IS_STATUS_ERROR(status)) 454 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 455 456 return status; 457 } 458 459 QDF_STATUS tgt_vdev_mgr_config_ratemask_cmd_send( 460 struct vdev_mlme_obj *mlme_obj, 461 struct config_ratemask_params *param) 462 { 463 QDF_STATUS status; 464 struct wlan_lmac_if_mlme_tx_ops *txops; 465 struct wlan_objmgr_vdev *vdev; 466 uint8_t vdev_id; 467 468 vdev = mlme_obj->vdev; 469 vdev_id = wlan_vdev_get_id(vdev); 470 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 471 if (!txops || !txops->vdev_config_ratemask_cmd_send) { 472 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 473 return QDF_STATUS_E_INVAL; 474 } 475 476 status = txops->vdev_config_ratemask_cmd_send(vdev, param); 477 if (QDF_IS_STATUS_ERROR(status)) 478 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 479 480 return status; 481 } 482 483 QDF_STATUS tgt_vdev_mgr_beacon_cmd_send( 484 struct vdev_mlme_obj *mlme_obj, 485 struct beacon_params *param) 486 { 487 return QDF_STATUS_SUCCESS; 488 } 489 490 QDF_STATUS tgt_vdev_mgr_beacon_tmpl_send( 491 struct vdev_mlme_obj *mlme_obj, 492 struct beacon_tmpl_params *param) 493 { 494 return QDF_STATUS_SUCCESS; 495 } 496 497 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ) 498 QDF_STATUS tgt_vdev_mgr_fils_enable_send( 499 struct vdev_mlme_obj *mlme_obj, 500 struct config_fils_params *param) 501 { 502 QDF_STATUS status; 503 struct wlan_lmac_if_mlme_tx_ops *txops; 504 struct wlan_objmgr_vdev *vdev; 505 uint8_t vdev_id; 506 507 vdev = mlme_obj->vdev; 508 vdev_id = wlan_vdev_get_id(vdev); 509 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 510 if (!txops || !txops->vdev_fils_enable_send) { 511 mlme_err("VDEV_%d: No Tx Ops fils Enable", vdev_id); 512 return QDF_STATUS_E_INVAL; 513 } 514 515 status = txops->vdev_fils_enable_send(vdev, param); 516 if (QDF_IS_STATUS_ERROR(status)) 517 mlme_err("VDEV_%d: Tx Ops fils Enable Error : %d", 518 vdev_id, status); 519 520 return status; 521 } 522 #endif 523 524 QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send( 525 struct wlan_objmgr_pdev *pdev, 526 struct multiple_vdev_restart_params *param) 527 { 528 QDF_STATUS status = QDF_STATUS_SUCCESS; 529 struct wlan_lmac_if_mlme_tx_ops *txops; 530 struct wlan_objmgr_vdev *vdev; 531 532 if (!param) { 533 mlme_err("Invalid input"); 534 return QDF_STATUS_E_INVAL; 535 } 536 537 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, 538 param->vdev_ids[0], 539 WLAN_VDEV_TARGET_IF_ID); 540 if (vdev) { 541 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 542 if (!txops || !txops->multiple_vdev_restart_req_cmd) { 543 mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev)); 544 wlan_objmgr_vdev_release_ref(vdev, 545 WLAN_VDEV_TARGET_IF_ID); 546 return QDF_STATUS_E_INVAL; 547 } 548 549 status = txops->multiple_vdev_restart_req_cmd(pdev, param); 550 if (QDF_IS_STATUS_ERROR(status)) 551 mlme_err("Tx Ops Error: %d", status); 552 553 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 554 } 555 556 return status; 557 } 558 559 QDF_STATUS tgt_vdev_mgr_multiple_vdev_set_param( 560 struct wlan_objmgr_pdev *pdev, 561 struct multiple_vdev_set_param *param) 562 { 563 QDF_STATUS status = QDF_STATUS_SUCCESS; 564 struct wlan_lmac_if_mlme_tx_ops *txops; 565 struct wlan_objmgr_vdev *vdev; 566 567 if (!param) { 568 mlme_err("Invalid input"); 569 return QDF_STATUS_E_INVAL; 570 } 571 572 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, 573 param->vdev_ids[0], 574 WLAN_VDEV_TARGET_IF_ID); 575 if (vdev) { 576 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 577 if (!txops || !txops->multiple_vdev_set_param_cmd) { 578 mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev)); 579 wlan_objmgr_vdev_release_ref(vdev, 580 WLAN_VDEV_TARGET_IF_ID); 581 return QDF_STATUS_E_INVAL; 582 } 583 584 status = txops->multiple_vdev_set_param_cmd(pdev, param); 585 if (QDF_IS_STATUS_ERROR(status)) 586 mlme_err("Tx Ops Error: %d", status); 587 588 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 589 } 590 591 return status; 592 } 593 594 QDF_STATUS tgt_vdev_mgr_set_tx_rx_decap_type(struct vdev_mlme_obj *mlme_obj, 595 enum wlan_mlme_cfg_id param_id, 596 uint32_t value) 597 { 598 QDF_STATUS status; 599 struct wlan_lmac_if_mlme_tx_ops *txops; 600 struct wlan_objmgr_vdev *vdev; 601 uint8_t vdev_id; 602 603 if (!mlme_obj) { 604 mlme_err("Invalid input"); 605 return QDF_STATUS_E_INVAL; 606 } 607 608 vdev = mlme_obj->vdev; 609 vdev_id = wlan_vdev_get_id(vdev); 610 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 611 if (!txops || !txops->vdev_set_tx_rx_decap_type) { 612 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 613 return QDF_STATUS_E_INVAL; 614 } 615 616 status = txops->vdev_set_tx_rx_decap_type(vdev, param_id, value); 617 if (QDF_IS_STATUS_ERROR(status)) 618 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 619 620 return status; 621 } 622 623 QDF_STATUS tgt_vdev_mgr_set_param_send( 624 struct vdev_mlme_obj *mlme_obj, 625 struct vdev_set_params *param) 626 { 627 QDF_STATUS status; 628 struct wlan_lmac_if_mlme_tx_ops *txops; 629 struct wlan_objmgr_vdev *vdev; 630 uint8_t vdev_id; 631 632 if (!param) { 633 mlme_err("Invalid input"); 634 return QDF_STATUS_E_INVAL; 635 } 636 637 vdev = mlme_obj->vdev; 638 vdev_id = wlan_vdev_get_id(vdev); 639 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 640 if (!txops || !txops->vdev_set_param_send) { 641 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 642 return QDF_STATUS_E_INVAL; 643 } 644 645 status = txops->vdev_set_param_send(vdev, param); 646 if (QDF_IS_STATUS_ERROR(status)) 647 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 648 649 return status; 650 } 651 652 QDF_STATUS tgt_vdev_mgr_sta_ps_param_send( 653 struct vdev_mlme_obj *mlme_obj, 654 struct sta_ps_params *param) 655 { 656 QDF_STATUS status; 657 struct wlan_lmac_if_mlme_tx_ops *txops; 658 struct wlan_objmgr_vdev *vdev; 659 uint8_t vdev_id; 660 661 if (!param) { 662 mlme_err("Invalid input"); 663 return QDF_STATUS_E_INVAL; 664 } 665 666 vdev = mlme_obj->vdev; 667 vdev_id = wlan_vdev_get_id(vdev); 668 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 669 if (!txops || !txops->vdev_sta_ps_param_send) { 670 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 671 return QDF_STATUS_E_INVAL; 672 } 673 674 status = txops->vdev_sta_ps_param_send(vdev, param); 675 if (QDF_IS_STATUS_ERROR(status)) 676 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 677 678 return status; 679 } 680 681 QDF_STATUS tgt_vdev_mgr_peer_delete_all_send( 682 struct vdev_mlme_obj *mlme_obj, 683 struct peer_delete_all_params *param) 684 { 685 QDF_STATUS status; 686 struct wlan_lmac_if_mlme_tx_ops *txops; 687 struct wlan_objmgr_vdev *vdev; 688 uint8_t vdev_id; 689 690 if (!param) { 691 mlme_err("Invalid input"); 692 return QDF_STATUS_E_INVAL; 693 } 694 695 vdev = mlme_obj->vdev; 696 vdev_id = wlan_vdev_get_id(vdev); 697 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 698 if (!txops || !txops->peer_delete_all_send) { 699 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 700 return QDF_STATUS_E_INVAL; 701 } 702 703 status = txops->peer_delete_all_send(vdev, param); 704 if (QDF_IS_STATUS_ERROR(status)) 705 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 706 707 return status; 708 } 709 710 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE 711 #ifdef WLAN_FEATURE_11BE_MLO 712 static inline void 713 tgt_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info, 714 struct wlan_objmgr_vdev *vdev) 715 { 716 vdev_info->mld_mac_addr = wlan_vdev_mlme_get_mldaddr(vdev); 717 } 718 #else 719 static inline void 720 tgt_vdev_mgr_fill_mlo_params(struct cdp_vdev_info *vdev_info, 721 struct wlan_objmgr_vdev *vdev) 722 { 723 } 724 #endif 725 726 QDF_STATUS tgt_vdev_mgr_cdp_vdev_attach(struct vdev_mlme_obj *mlme_obj) 727 { 728 struct wlan_objmgr_psoc *psoc; 729 struct wlan_objmgr_pdev *pdev; 730 struct wlan_objmgr_vdev *vdev; 731 ol_txrx_soc_handle soc_txrx_handle; 732 struct cdp_vdev_info vdev_info = { 0 }; 733 734 vdev = mlme_obj->vdev; 735 736 psoc = wlan_vdev_get_psoc(vdev); 737 if (!psoc) { 738 mlme_err("psoc object is NULL"); 739 return QDF_STATUS_E_INVAL; 740 } 741 742 pdev = wlan_vdev_get_pdev(vdev); 743 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 744 if (!soc_txrx_handle) 745 return QDF_STATUS_E_FAILURE; 746 747 vdev_info.vdev_mac_addr = wlan_vdev_mlme_get_macaddr(vdev); 748 vdev_info.vdev_id = wlan_vdev_get_id(vdev); 749 vdev_info.op_mode = wlan_util_vdev_get_cdp_txrx_opmode(vdev); 750 vdev_info.subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev); 751 tgt_vdev_mgr_fill_mlo_params(&vdev_info, vdev); 752 return cdp_vdev_attach(soc_txrx_handle, 753 wlan_objmgr_pdev_get_pdev_id(pdev), 754 &vdev_info); 755 } 756 757 QDF_STATUS tgt_vdev_mgr_cdp_vdev_detach(struct vdev_mlme_obj *mlme_obj) 758 { 759 struct wlan_objmgr_vdev *vdev; 760 struct wlan_objmgr_psoc *psoc; 761 ol_txrx_soc_handle soc_txrx_handle; 762 763 vdev = mlme_obj->vdev; 764 psoc = wlan_vdev_get_psoc(vdev); 765 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 766 if (soc_txrx_handle) 767 return cdp_vdev_detach(soc_txrx_handle, wlan_vdev_get_id(vdev), 768 NULL, NULL); 769 770 return QDF_STATUS_E_INVAL; 771 } 772 773 QDF_STATUS tgt_vdev_mgr_send_set_mac_addr(struct qdf_mac_addr mac_addr, 774 struct qdf_mac_addr mld_addr, 775 struct wlan_objmgr_vdev *vdev) 776 { 777 struct wlan_lmac_if_mlme_tx_ops *txops; 778 uint8_t vdev_id; 779 QDF_STATUS status; 780 781 vdev_id = wlan_vdev_get_id(vdev); 782 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 783 if (!txops || !txops->vdev_send_set_mac_addr) { 784 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 785 return QDF_STATUS_E_INVAL; 786 } 787 788 status = txops->vdev_send_set_mac_addr(mac_addr, mld_addr, vdev); 789 if (QDF_IS_STATUS_ERROR(status)) 790 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 791 792 return status; 793 } 794 #endif 795 796 QDF_STATUS tgt_vdev_peer_set_param_send(struct wlan_objmgr_vdev *vdev, 797 uint8_t *peer_mac_addr, 798 uint32_t param_id, 799 uint32_t param_value) 800 { 801 struct wlan_lmac_if_mlme_tx_ops *txops; 802 uint8_t vdev_id; 803 QDF_STATUS status; 804 805 vdev_id = wlan_vdev_get_id(vdev); 806 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 807 if (!txops || !txops->vdev_peer_set_param_send) { 808 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 809 return QDF_STATUS_E_INVAL; 810 } 811 812 status = txops->vdev_peer_set_param_send(vdev, peer_mac_addr, 813 param_id, param_value); 814 if (QDF_IS_STATUS_ERROR(status)) 815 mlme_err("VDEV_%d: peer " QDF_MAC_ADDR_FMT " param_id %d param_value %d Error %d", 816 vdev_id, QDF_MAC_ADDR_REF(peer_mac_addr), param_id, 817 param_value, status); 818 819 return status; 820 } 821