1 /* 2 * Copyright (c) 2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /** 20 * DOC: wlan_vdev_mgr_tgt_if_tx_api.c 21 * 22 * This file provides definitions for mlme tgt_if APIs, which will 23 * further call target_if/mlme component using LMAC MLME txops 24 */ 25 #include <wlan_vdev_mgr_tgt_if_tx_api.h> 26 #include <target_if_vdev_mgr_tx_ops.h> 27 #include "include/wlan_vdev_mlme.h" 28 #include <wlan_mlme_dbg.h> 29 #include <cdp_txrx_cmn_struct.h> 30 #include <cdp_txrx_cmn.h> 31 #include <wlan_lmac_if_api.h> 32 #include <wlan_utility.h> 33 #include <cdp_txrx_ctrl.h> 34 #include <wlan_vdev_mlme_api.h> 35 #include <wlan_dfs_utils_api.h> 36 #include <wlan_vdev_mgr_utils_api.h> 37 #include <wlan_vdev_mgr_ucfg_api.h> 38 #include <wlan_vdev_mlme_main.h> 39 40 static inline struct wlan_lmac_if_mlme_tx_ops 41 *wlan_vdev_mlme_get_lmac_txops(struct wlan_objmgr_vdev *vdev) 42 { 43 struct wlan_objmgr_psoc *psoc; 44 45 psoc = wlan_vdev_get_psoc(vdev); 46 47 return target_if_vdev_mgr_get_tx_ops(psoc); 48 } 49 50 QDF_STATUS tgt_vdev_mgr_create_send( 51 struct vdev_mlme_obj *mlme_obj, 52 struct vdev_create_params *param) 53 { 54 QDF_STATUS status = QDF_STATUS_E_FAILURE; 55 struct wlan_lmac_if_mlme_tx_ops *txops; 56 struct wlan_objmgr_psoc *psoc; 57 struct wlan_objmgr_pdev *pdev; 58 struct wlan_objmgr_vdev *vdev; 59 ol_txrx_soc_handle soc_txrx_handle; 60 struct cdp_pdev *pdev_txrx_handle; 61 struct cdp_vdev *vdev_txrx_handle; 62 enum wlan_op_mode cdp_txrx_opmode; 63 enum wlan_op_subtype cdp_txrx_subtype; 64 uint32_t vdev_id; 65 uint8_t *vdev_addr; 66 struct vdev_response_timer *vdev_rsp; 67 68 if (!param) { 69 mlme_err("Invalid input"); 70 return QDF_STATUS_E_INVAL; 71 } 72 73 vdev = mlme_obj->vdev; 74 vdev_id = wlan_vdev_get_id(vdev); 75 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 76 if (!txops || !txops->vdev_create_send || 77 !txops->vdev_mgr_rsp_timer_init) { 78 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 79 return QDF_STATUS_E_INVAL; 80 } 81 82 status = txops->vdev_create_send(vdev, param); 83 if (QDF_IS_STATUS_SUCCESS(status)) { 84 vdev_rsp = &mlme_obj->vdev_rt; 85 txops->vdev_mgr_rsp_timer_init(vdev, &vdev_rsp->rsp_timer); 86 } else { 87 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 88 return status; 89 } 90 91 cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev); 92 cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev); 93 vdev_addr = wlan_vdev_mlme_get_macaddr(vdev); 94 psoc = wlan_vdev_get_psoc(vdev); 95 pdev = wlan_vdev_get_pdev(vdev); 96 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 97 pdev_txrx_handle = wlan_pdev_get_dp_handle(pdev); 98 if (!soc_txrx_handle || !pdev_txrx_handle) 99 return QDF_STATUS_E_FAILURE; 100 101 vdev_txrx_handle = cdp_vdev_attach(soc_txrx_handle, 102 pdev_txrx_handle, 103 vdev_addr, vdev_id, 104 cdp_txrx_opmode, 105 cdp_txrx_subtype); 106 if (!vdev_txrx_handle) 107 return QDF_STATUS_E_FAILURE; 108 109 wlan_vdev_set_dp_handle(vdev, vdev_txrx_handle); 110 111 return status; 112 } 113 114 QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme) 115 { 116 struct wlan_objmgr_vdev *vdev; 117 struct vdev_set_params param = {0}; 118 struct wlan_lmac_if_mlme_tx_ops *txops; 119 struct vdev_mlme_inactivity_params *inactivity; 120 uint8_t vdev_id; 121 QDF_STATUS status = QDF_STATUS_SUCCESS; 122 123 vdev = vdev_mlme->vdev; 124 vdev_id = wlan_vdev_get_id(vdev); 125 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 126 if (!txops || !txops->vdev_set_param_send) { 127 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 128 return QDF_STATUS_E_INVAL; 129 } 130 131 inactivity = &vdev_mlme->mgmt.inactivity_params; 132 133 param.vdev_id = vdev_id; 134 135 param.param_value = 136 inactivity->keepalive_min_idle_inactive_time_secs; 137 param.param_id = WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME; 138 status = txops->vdev_set_param_send(vdev, ¶m); 139 if (QDF_IS_STATUS_ERROR(status)) 140 mlme_err("VDEV_%d: Failed to set min idle inactive time!", 141 vdev_id); 142 143 param.param_value = 144 inactivity->keepalive_max_idle_inactive_time_secs; 145 param.param_id = WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME; 146 status = txops->vdev_set_param_send(vdev, ¶m); 147 if (QDF_IS_STATUS_ERROR(status)) 148 mlme_err("VDEV_%d: Failed to set max idle inactive time!", 149 vdev_id); 150 151 param.param_value = 152 inactivity->keepalive_max_unresponsive_time_secs; 153 param.param_id = WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME; 154 status = txops->vdev_set_param_send(vdev, ¶m); 155 if (QDF_IS_STATUS_ERROR(status)) 156 mlme_err("VDEV_%d: Failed to set max unresponse inactive time!", 157 vdev_id); 158 159 return status; 160 } 161 162 QDF_STATUS tgt_vdev_mgr_start_send( 163 struct vdev_mlme_obj *mlme_obj, 164 struct vdev_start_params *param) 165 { 166 QDF_STATUS status; 167 struct wlan_lmac_if_mlme_tx_ops *txops; 168 struct wlan_objmgr_vdev *vdev; 169 uint8_t vdev_id; 170 171 if (!param) { 172 mlme_err("Invalid input"); 173 return QDF_STATUS_E_INVAL; 174 } 175 176 vdev = mlme_obj->vdev; 177 vdev_id = wlan_vdev_get_id(vdev); 178 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 179 if (!txops || !txops->vdev_start_send) { 180 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 181 return QDF_STATUS_E_INVAL; 182 } 183 184 status = txops->vdev_start_send(vdev, param); 185 if (QDF_IS_STATUS_ERROR(status)) 186 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 187 188 return status; 189 } 190 191 QDF_STATUS tgt_vdev_mgr_delete_send( 192 struct vdev_mlme_obj *mlme_obj, 193 struct vdev_delete_params *param) 194 { 195 QDF_STATUS status; 196 struct wlan_lmac_if_mlme_tx_ops *txops; 197 struct wlan_objmgr_vdev *vdev; 198 uint8_t vdev_id; 199 200 if (!param) { 201 mlme_err("Invalid input"); 202 return QDF_STATUS_E_INVAL; 203 } 204 205 vdev = mlme_obj->vdev; 206 vdev_id = wlan_vdev_get_id(vdev); 207 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 208 if (!txops || !txops->vdev_delete_send) { 209 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 210 return QDF_STATUS_E_INVAL; 211 } 212 213 status = txops->vdev_delete_send(vdev, param); 214 if (QDF_IS_STATUS_ERROR(status)) 215 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 216 217 return status; 218 } 219 220 QDF_STATUS tgt_vdev_mgr_peer_flush_tids_send( 221 struct vdev_mlme_obj *mlme_obj, 222 struct peer_flush_params *param) 223 { 224 QDF_STATUS status; 225 struct wlan_lmac_if_mlme_tx_ops *txops; 226 struct wlan_objmgr_vdev *vdev; 227 uint8_t vdev_id; 228 229 if (!param) { 230 mlme_err("Invalid input"); 231 return QDF_STATUS_E_INVAL; 232 } 233 234 vdev = mlme_obj->vdev; 235 vdev_id = wlan_vdev_get_id(vdev); 236 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 237 if (!txops || !txops->peer_flush_tids_send) { 238 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 239 return QDF_STATUS_E_INVAL; 240 } 241 242 status = txops->peer_flush_tids_send(vdev, param); 243 if (QDF_IS_STATUS_ERROR(status)) 244 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 245 246 return QDF_STATUS_SUCCESS; 247 } 248 249 QDF_STATUS tgt_vdev_mgr_stop_send( 250 struct vdev_mlme_obj *mlme_obj, 251 struct vdev_stop_params *param) 252 { 253 QDF_STATUS status; 254 struct wlan_lmac_if_mlme_tx_ops *txops; 255 struct wlan_objmgr_vdev *vdev; 256 uint8_t vdev_id; 257 258 if (!param) { 259 mlme_err("Invalid input"); 260 return QDF_STATUS_E_INVAL; 261 } 262 263 vdev = mlme_obj->vdev; 264 vdev_id = wlan_vdev_get_id(vdev); 265 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 266 if (!txops || !txops->vdev_stop_send) { 267 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 268 return QDF_STATUS_E_INVAL; 269 } 270 271 status = txops->vdev_stop_send(vdev, param); 272 if (QDF_IS_STATUS_ERROR(status)) 273 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 274 275 return status; 276 } 277 278 QDF_STATUS tgt_vdev_mgr_beacon_stop(struct vdev_mlme_obj *mlme_obj) 279 { 280 return QDF_STATUS_SUCCESS; 281 } 282 283 QDF_STATUS tgt_vdev_mgr_beacon_free(struct vdev_mlme_obj *mlme_obj) 284 { 285 return QDF_STATUS_SUCCESS; 286 } 287 288 QDF_STATUS tgt_vdev_mgr_up_send( 289 struct vdev_mlme_obj *mlme_obj, 290 struct vdev_up_params *param) 291 { 292 QDF_STATUS status; 293 struct wlan_lmac_if_mlme_tx_ops *txops; 294 ol_txrx_soc_handle soc_txrx_handle; 295 struct cdp_vdev *vdev_txrx_handle; 296 struct wlan_objmgr_psoc *psoc; 297 struct wlan_objmgr_vdev *vdev; 298 uint8_t vdev_id; 299 300 if (!param) { 301 mlme_err("Invalid input"); 302 return QDF_STATUS_E_INVAL; 303 } 304 305 vdev = mlme_obj->vdev; 306 vdev_id = wlan_vdev_get_id(vdev); 307 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 308 if (!txops || !txops->vdev_up_send) { 309 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 310 return QDF_STATUS_E_INVAL; 311 } 312 313 /* cdp set rx and tx decap type */ 314 psoc = wlan_vdev_get_psoc(vdev); 315 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 316 vdev_txrx_handle = wlan_vdev_get_dp_handle(vdev); 317 if (!soc_txrx_handle || !vdev_txrx_handle) 318 return QDF_STATUS_E_INVAL; 319 320 status = txops->vdev_up_send(vdev, param); 321 if (QDF_IS_STATUS_ERROR(status)) 322 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 323 324 return status; 325 } 326 327 QDF_STATUS tgt_vdev_mgr_down_send( 328 struct vdev_mlme_obj *mlme_obj, 329 struct vdev_down_params *param) 330 { 331 QDF_STATUS status; 332 struct wlan_lmac_if_mlme_tx_ops *txops; 333 struct wlan_objmgr_pdev *pdev; 334 struct wlan_objmgr_vdev *vdev; 335 enum QDF_OPMODE opmode; 336 uint8_t vdev_id; 337 338 if (!param) { 339 mlme_err("Invalid input"); 340 return QDF_STATUS_E_INVAL; 341 } 342 343 vdev = mlme_obj->vdev; 344 vdev_id = wlan_vdev_get_id(vdev); 345 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 346 if (!txops || !txops->vdev_down_send) { 347 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 348 return QDF_STATUS_E_INVAL; 349 } 350 351 pdev = wlan_vdev_get_pdev(vdev); 352 if (!pdev) { 353 mlme_err("PDEV is NULL"); 354 return QDF_STATUS_E_INVAL; 355 } 356 357 opmode = wlan_vdev_mlme_get_opmode(vdev); 358 if (wlan_util_is_vdev_active(pdev, WLAN_VDEV_TARGET_IF_ID) == 359 QDF_STATUS_SUCCESS) { 360 361 if (opmode == QDF_SAP_MODE) 362 utils_dfs_cancel_precac_timer(pdev); 363 } 364 365 status = txops->vdev_down_send(vdev, param); 366 if (QDF_IS_STATUS_ERROR(status)) 367 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 368 369 return status; 370 } 371 372 QDF_STATUS tgt_vdev_mgr_set_neighbour_rx_cmd_send( 373 struct vdev_mlme_obj *mlme_obj, 374 struct set_neighbour_rx_params *param) 375 { 376 return QDF_STATUS_SUCCESS; 377 } 378 379 QDF_STATUS tgt_vdev_mgr_nac_rssi_send( 380 struct vdev_mlme_obj *mlme_obj, 381 struct vdev_scan_nac_rssi_params *param) 382 { 383 return QDF_STATUS_SUCCESS; 384 } 385 386 QDF_STATUS tgt_vdev_mgr_sifs_trigger_send( 387 struct vdev_mlme_obj *mlme_obj, 388 struct sifs_trigger_param *param) 389 { 390 QDF_STATUS status = QDF_STATUS_E_FAILURE; 391 struct wlan_lmac_if_mlme_tx_ops *txops; 392 struct wlan_objmgr_vdev *vdev; 393 uint8_t vdev_id; 394 395 if (!param) { 396 mlme_err("Invalid input"); 397 return QDF_STATUS_E_INVAL; 398 } 399 400 vdev = mlme_obj->vdev; 401 vdev_id = wlan_vdev_get_id(vdev); 402 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 403 if (!txops || !txops->vdev_sifs_trigger_send) { 404 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 405 return QDF_STATUS_E_INVAL; 406 } 407 408 status = txops->vdev_sifs_trigger_send(vdev, param); 409 if (QDF_IS_STATUS_ERROR(status)) 410 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 411 412 return status; 413 } 414 415 QDF_STATUS tgt_vdev_mgr_set_custom_aggr_size_send( 416 struct vdev_mlme_obj *mlme_obj, 417 struct set_custom_aggr_size_params *param) 418 { 419 QDF_STATUS status; 420 struct wlan_lmac_if_mlme_tx_ops *txops; 421 struct wlan_objmgr_vdev *vdev; 422 uint8_t vdev_id; 423 424 if (!param) { 425 mlme_err("Invalid input"); 426 return QDF_STATUS_E_INVAL; 427 } 428 429 vdev = mlme_obj->vdev; 430 vdev_id = wlan_vdev_get_id(vdev); 431 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 432 if (!txops || !txops->vdev_set_custom_aggr_size_cmd_send) { 433 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 434 return QDF_STATUS_E_INVAL; 435 } 436 437 status = txops->vdev_set_custom_aggr_size_cmd_send(vdev, param); 438 if (QDF_IS_STATUS_ERROR(status)) 439 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 440 441 return status; 442 } 443 444 QDF_STATUS tgt_vdev_mgr_config_ratemask_cmd_send( 445 struct vdev_mlme_obj *mlme_obj, 446 struct config_ratemask_params *param) 447 { 448 QDF_STATUS status; 449 struct wlan_lmac_if_mlme_tx_ops *txops; 450 struct wlan_objmgr_vdev *vdev; 451 uint8_t vdev_id; 452 453 vdev = mlme_obj->vdev; 454 vdev_id = wlan_vdev_get_id(vdev); 455 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 456 if (!txops || !txops->vdev_config_ratemask_cmd_send) { 457 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 458 return QDF_STATUS_E_INVAL; 459 } 460 461 status = txops->vdev_config_ratemask_cmd_send(vdev, param); 462 if (QDF_IS_STATUS_ERROR(status)) 463 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 464 465 return status; 466 } 467 468 QDF_STATUS tgt_vdev_mgr_beacon_cmd_send( 469 struct vdev_mlme_obj *mlme_obj, 470 struct beacon_params *param) 471 { 472 return QDF_STATUS_SUCCESS; 473 } 474 475 QDF_STATUS tgt_vdev_mgr_beacon_tmpl_send( 476 struct vdev_mlme_obj *mlme_obj, 477 struct beacon_tmpl_params *param) 478 { 479 return QDF_STATUS_SUCCESS; 480 } 481 482 QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send( 483 struct wlan_objmgr_pdev *pdev, 484 struct multiple_vdev_restart_params *param) 485 { 486 QDF_STATUS status = QDF_STATUS_SUCCESS; 487 struct wlan_lmac_if_mlme_tx_ops *txops; 488 struct wlan_objmgr_vdev *vdev; 489 490 if (!param) { 491 mlme_err("Invalid input"); 492 return QDF_STATUS_E_INVAL; 493 } 494 495 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, 496 param->vdev_ids[0], 497 WLAN_VDEV_TARGET_IF_ID); 498 if (vdev) { 499 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 500 if (!txops || !txops->multiple_vdev_restart_req_cmd) { 501 mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev)); 502 wlan_objmgr_vdev_release_ref(vdev, 503 WLAN_VDEV_TARGET_IF_ID); 504 return QDF_STATUS_E_INVAL; 505 } 506 507 status = txops->multiple_vdev_restart_req_cmd(pdev, param); 508 if (QDF_IS_STATUS_ERROR(status)) 509 mlme_err("Tx Ops Error: %d", status); 510 511 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 512 } 513 514 return status; 515 } 516 517 QDF_STATUS tgt_vdev_mgr_set_tx_rx_decap_type(struct vdev_mlme_obj *mlme_obj, 518 enum wlan_mlme_cfg_id param_id, 519 uint32_t value) 520 { 521 QDF_STATUS status; 522 struct wlan_lmac_if_mlme_tx_ops *txops; 523 struct wlan_objmgr_vdev *vdev; 524 uint8_t vdev_id; 525 526 if (!mlme_obj) { 527 mlme_err("Invalid input"); 528 return QDF_STATUS_E_INVAL; 529 } 530 531 vdev = mlme_obj->vdev; 532 vdev_id = wlan_vdev_get_id(vdev); 533 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 534 if (!txops || !txops->vdev_set_tx_rx_decap_type) { 535 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 536 return QDF_STATUS_E_INVAL; 537 } 538 539 status = txops->vdev_set_tx_rx_decap_type(vdev, param_id, value); 540 if (QDF_IS_STATUS_ERROR(status)) 541 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 542 543 return status; 544 } 545 546 QDF_STATUS tgt_vdev_mgr_set_param_send( 547 struct vdev_mlme_obj *mlme_obj, 548 struct vdev_set_params *param) 549 { 550 QDF_STATUS status; 551 struct wlan_lmac_if_mlme_tx_ops *txops; 552 struct wlan_objmgr_vdev *vdev; 553 uint8_t vdev_id; 554 555 if (!param) { 556 mlme_err("Invalid input"); 557 return QDF_STATUS_E_INVAL; 558 } 559 560 vdev = mlme_obj->vdev; 561 vdev_id = wlan_vdev_get_id(vdev); 562 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 563 if (!txops || !txops->vdev_set_param_send) { 564 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 565 return QDF_STATUS_E_INVAL; 566 } 567 568 status = txops->vdev_set_param_send(vdev, param); 569 if (QDF_IS_STATUS_ERROR(status)) 570 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 571 572 return status; 573 } 574 575 QDF_STATUS tgt_vdev_mgr_sta_ps_param_send( 576 struct vdev_mlme_obj *mlme_obj, 577 struct sta_ps_params *param) 578 { 579 QDF_STATUS status; 580 struct wlan_lmac_if_mlme_tx_ops *txops; 581 struct wlan_objmgr_vdev *vdev; 582 uint8_t vdev_id; 583 584 if (!param) { 585 mlme_err("Invalid input"); 586 return QDF_STATUS_E_INVAL; 587 } 588 589 vdev = mlme_obj->vdev; 590 vdev_id = wlan_vdev_get_id(vdev); 591 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 592 if (!txops || !txops->vdev_sta_ps_param_send) { 593 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 594 return QDF_STATUS_E_INVAL; 595 } 596 597 status = txops->vdev_sta_ps_param_send(vdev, param); 598 if (QDF_IS_STATUS_ERROR(status)) 599 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 600 601 return status; 602 } 603 604 QDF_STATUS tgt_vdev_mgr_peer_delete_all_send( 605 struct vdev_mlme_obj *mlme_obj, 606 struct peer_delete_all_params *param) 607 { 608 QDF_STATUS status; 609 struct wlan_lmac_if_mlme_tx_ops *txops; 610 struct wlan_objmgr_vdev *vdev; 611 uint8_t vdev_id; 612 613 if (!param) { 614 mlme_err("Invalid input"); 615 return QDF_STATUS_E_INVAL; 616 } 617 618 vdev = mlme_obj->vdev; 619 vdev_id = wlan_vdev_get_id(vdev); 620 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 621 if (!txops || !txops->peer_delete_all_send) { 622 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 623 return QDF_STATUS_E_INVAL; 624 } 625 626 status = txops->peer_delete_all_send(vdev, param); 627 if (QDF_IS_STATUS_ERROR(status)) 628 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 629 630 return QDF_STATUS_SUCCESS; 631 } 632