1 /* 2 * Copyright (c) 2019-2020 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 enum wlan_op_mode cdp_txrx_opmode; 61 enum wlan_op_subtype cdp_txrx_subtype; 62 uint32_t vdev_id; 63 uint8_t *vdev_addr; 64 65 if (!param) { 66 mlme_err("Invalid input"); 67 return QDF_STATUS_E_INVAL; 68 } 69 70 vdev = mlme_obj->vdev; 71 vdev_id = wlan_vdev_get_id(vdev); 72 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 73 if (!txops || !txops->vdev_create_send) { 74 mlme_err("VDEV_%d No Tx Ops", vdev_id); 75 return QDF_STATUS_E_INVAL; 76 } 77 78 psoc = wlan_vdev_get_psoc(vdev); 79 if (!psoc) { 80 mlme_err("psoc object is NULL"); 81 return QDF_STATUS_E_INVAL; 82 } 83 84 status = txops->vdev_create_send(vdev, param); 85 if (QDF_IS_STATUS_ERROR(status)) { 86 mlme_err("VDEV_%d PSOC_%d Tx Ops Error : %d", vdev_id, 87 wlan_psoc_get_id(psoc), 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 pdev = wlan_vdev_get_pdev(vdev); 95 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 96 if (!soc_txrx_handle) 97 return QDF_STATUS_E_FAILURE; 98 99 return cdp_vdev_attach(soc_txrx_handle, 100 wlan_objmgr_pdev_get_pdev_id(pdev), 101 vdev_addr, vdev_id, 102 cdp_txrx_opmode, 103 cdp_txrx_subtype); 104 } 105 106 QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme) 107 { 108 struct wlan_objmgr_vdev *vdev; 109 struct vdev_set_params param = {0}; 110 struct wlan_lmac_if_mlme_tx_ops *txops; 111 struct vdev_mlme_inactivity_params *inactivity; 112 uint8_t vdev_id; 113 QDF_STATUS status = QDF_STATUS_SUCCESS; 114 115 vdev = vdev_mlme->vdev; 116 vdev_id = wlan_vdev_get_id(vdev); 117 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 118 if (!txops || !txops->vdev_set_param_send) { 119 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 120 return QDF_STATUS_E_INVAL; 121 } 122 123 inactivity = &vdev_mlme->mgmt.inactivity_params; 124 125 param.vdev_id = vdev_id; 126 127 param.param_value = 128 inactivity->keepalive_min_idle_inactive_time_secs; 129 param.param_id = WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME; 130 status = txops->vdev_set_param_send(vdev, ¶m); 131 if (QDF_IS_STATUS_ERROR(status)) 132 mlme_err("VDEV_%d: Failed to set min idle inactive time!", 133 vdev_id); 134 135 param.param_value = 136 inactivity->keepalive_max_idle_inactive_time_secs; 137 param.param_id = WLAN_MLME_CFG_MAX_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 max idle inactive time!", 141 vdev_id); 142 143 param.param_value = 144 inactivity->keepalive_max_unresponsive_time_secs; 145 param.param_id = WLAN_MLME_CFG_MAX_UNRESPONSIVE_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 unresponse inactive time!", 149 vdev_id); 150 151 return status; 152 } 153 154 QDF_STATUS tgt_vdev_mgr_start_send( 155 struct vdev_mlme_obj *mlme_obj, 156 struct vdev_start_params *param) 157 { 158 QDF_STATUS status; 159 struct wlan_lmac_if_mlme_tx_ops *txops; 160 struct wlan_objmgr_vdev *vdev; 161 uint8_t vdev_id; 162 163 if (!param) { 164 mlme_err("Invalid input"); 165 return QDF_STATUS_E_INVAL; 166 } 167 168 vdev = mlme_obj->vdev; 169 vdev_id = wlan_vdev_get_id(vdev); 170 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 171 if (!txops || !txops->vdev_start_send) { 172 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 173 return QDF_STATUS_E_INVAL; 174 } 175 176 status = txops->vdev_start_send(vdev, param); 177 if (QDF_IS_STATUS_ERROR(status)) 178 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 179 180 return status; 181 } 182 183 QDF_STATUS tgt_vdev_mgr_delete_send( 184 struct vdev_mlme_obj *mlme_obj, 185 struct vdev_delete_params *param) 186 { 187 QDF_STATUS status; 188 struct wlan_lmac_if_mlme_tx_ops *txops; 189 struct wlan_objmgr_vdev *vdev; 190 struct wlan_objmgr_psoc *psoc; 191 ol_txrx_soc_handle soc_txrx_handle; 192 uint8_t vdev_id; 193 194 if (!param) { 195 mlme_err("Invalid input"); 196 return QDF_STATUS_E_INVAL; 197 } 198 199 vdev = mlme_obj->vdev; 200 vdev_id = wlan_vdev_get_id(vdev); 201 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 202 if (!txops || !txops->vdev_delete_send) { 203 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 204 return QDF_STATUS_E_INVAL; 205 } 206 207 psoc = wlan_vdev_get_psoc(vdev); 208 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 209 if (soc_txrx_handle) 210 cdp_vdev_detach(soc_txrx_handle, wlan_vdev_get_id(vdev), 211 NULL, NULL); 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 wlan_objmgr_psoc *psoc; 296 struct wlan_objmgr_vdev *vdev; 297 uint8_t vdev_id; 298 299 if (!param) { 300 mlme_err("Invalid input"); 301 return QDF_STATUS_E_INVAL; 302 } 303 304 vdev = mlme_obj->vdev; 305 vdev_id = wlan_vdev_get_id(vdev); 306 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 307 if (!txops || !txops->vdev_up_send) { 308 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 309 return QDF_STATUS_E_INVAL; 310 } 311 312 /* cdp set rx and tx decap type */ 313 psoc = wlan_vdev_get_psoc(vdev); 314 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 315 if (!soc_txrx_handle || vdev_id == WLAN_INVALID_VDEV_ID) 316 return QDF_STATUS_E_INVAL; 317 318 status = txops->vdev_up_send(vdev, param); 319 if (QDF_IS_STATUS_ERROR(status)) 320 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 321 322 return status; 323 } 324 325 QDF_STATUS tgt_vdev_mgr_down_send( 326 struct vdev_mlme_obj *mlme_obj, 327 struct vdev_down_params *param) 328 { 329 QDF_STATUS status; 330 struct wlan_lmac_if_mlme_tx_ops *txops; 331 struct wlan_objmgr_pdev *pdev; 332 struct wlan_objmgr_vdev *vdev; 333 enum QDF_OPMODE opmode; 334 uint8_t vdev_id; 335 336 if (!param) { 337 mlme_err("Invalid input"); 338 return QDF_STATUS_E_INVAL; 339 } 340 341 vdev = mlme_obj->vdev; 342 vdev_id = wlan_vdev_get_id(vdev); 343 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 344 if (!txops || !txops->vdev_down_send) { 345 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 346 return QDF_STATUS_E_INVAL; 347 } 348 349 pdev = wlan_vdev_get_pdev(vdev); 350 if (!pdev) { 351 mlme_err("PDEV is NULL"); 352 return QDF_STATUS_E_INVAL; 353 } 354 355 opmode = wlan_vdev_mlme_get_opmode(vdev); 356 if (wlan_util_is_vdev_active(pdev, WLAN_VDEV_TARGET_IF_ID) == 357 QDF_STATUS_SUCCESS) { 358 359 if (opmode == QDF_SAP_MODE) 360 utils_dfs_cancel_precac_timer(pdev); 361 } 362 363 status = txops->vdev_down_send(vdev, param); 364 if (QDF_IS_STATUS_ERROR(status)) 365 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 366 367 return status; 368 } 369 370 QDF_STATUS tgt_vdev_mgr_set_neighbour_rx_cmd_send( 371 struct vdev_mlme_obj *mlme_obj, 372 struct set_neighbour_rx_params *param) 373 { 374 return QDF_STATUS_SUCCESS; 375 } 376 377 QDF_STATUS tgt_vdev_mgr_nac_rssi_send( 378 struct vdev_mlme_obj *mlme_obj, 379 struct vdev_scan_nac_rssi_params *param) 380 { 381 return QDF_STATUS_SUCCESS; 382 } 383 384 QDF_STATUS tgt_vdev_mgr_sifs_trigger_send( 385 struct vdev_mlme_obj *mlme_obj, 386 struct sifs_trigger_param *param) 387 { 388 QDF_STATUS status = QDF_STATUS_E_FAILURE; 389 struct wlan_lmac_if_mlme_tx_ops *txops; 390 struct wlan_objmgr_vdev *vdev; 391 uint8_t vdev_id; 392 393 if (!param) { 394 mlme_err("Invalid input"); 395 return QDF_STATUS_E_INVAL; 396 } 397 398 vdev = mlme_obj->vdev; 399 vdev_id = wlan_vdev_get_id(vdev); 400 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 401 if (!txops || !txops->vdev_sifs_trigger_send) { 402 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 403 return QDF_STATUS_E_INVAL; 404 } 405 406 status = txops->vdev_sifs_trigger_send(vdev, param); 407 if (QDF_IS_STATUS_ERROR(status)) 408 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 409 410 return status; 411 } 412 413 QDF_STATUS tgt_vdev_mgr_set_custom_aggr_size_send( 414 struct vdev_mlme_obj *mlme_obj, 415 struct set_custom_aggr_size_params *param) 416 { 417 QDF_STATUS status; 418 struct wlan_lmac_if_mlme_tx_ops *txops; 419 struct wlan_objmgr_vdev *vdev; 420 uint8_t vdev_id; 421 422 if (!param) { 423 mlme_err("Invalid input"); 424 return QDF_STATUS_E_INVAL; 425 } 426 427 vdev = mlme_obj->vdev; 428 vdev_id = wlan_vdev_get_id(vdev); 429 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 430 if (!txops || !txops->vdev_set_custom_aggr_size_cmd_send) { 431 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 432 return QDF_STATUS_E_INVAL; 433 } 434 435 status = txops->vdev_set_custom_aggr_size_cmd_send(vdev, param); 436 if (QDF_IS_STATUS_ERROR(status)) 437 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 438 439 return status; 440 } 441 442 QDF_STATUS tgt_vdev_mgr_config_ratemask_cmd_send( 443 struct vdev_mlme_obj *mlme_obj, 444 struct config_ratemask_params *param) 445 { 446 QDF_STATUS status; 447 struct wlan_lmac_if_mlme_tx_ops *txops; 448 struct wlan_objmgr_vdev *vdev; 449 uint8_t vdev_id; 450 451 vdev = mlme_obj->vdev; 452 vdev_id = wlan_vdev_get_id(vdev); 453 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 454 if (!txops || !txops->vdev_config_ratemask_cmd_send) { 455 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 456 return QDF_STATUS_E_INVAL; 457 } 458 459 status = txops->vdev_config_ratemask_cmd_send(vdev, param); 460 if (QDF_IS_STATUS_ERROR(status)) 461 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 462 463 return status; 464 } 465 466 QDF_STATUS tgt_vdev_mgr_beacon_cmd_send( 467 struct vdev_mlme_obj *mlme_obj, 468 struct beacon_params *param) 469 { 470 return QDF_STATUS_SUCCESS; 471 } 472 473 QDF_STATUS tgt_vdev_mgr_beacon_tmpl_send( 474 struct vdev_mlme_obj *mlme_obj, 475 struct beacon_tmpl_params *param) 476 { 477 return QDF_STATUS_SUCCESS; 478 } 479 480 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ) 481 QDF_STATUS tgt_vdev_mgr_fils_enable_send( 482 struct vdev_mlme_obj *mlme_obj, 483 struct config_fils_params *param) 484 { 485 QDF_STATUS status; 486 struct wlan_lmac_if_mlme_tx_ops *txops; 487 struct wlan_objmgr_vdev *vdev; 488 uint8_t vdev_id; 489 490 vdev = mlme_obj->vdev; 491 vdev_id = wlan_vdev_get_id(vdev); 492 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 493 if (!txops || !txops->vdev_fils_enable_send) { 494 mlme_err("VDEV_%d: No Tx Ops fils Enable", vdev_id); 495 return QDF_STATUS_E_INVAL; 496 } 497 498 status = txops->vdev_fils_enable_send(vdev, param); 499 if (QDF_IS_STATUS_ERROR(status)) 500 mlme_err("VDEV_%d: Tx Ops fils Enable Error : %d", 501 vdev_id, status); 502 503 return status; 504 } 505 #endif 506 507 QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send( 508 struct wlan_objmgr_pdev *pdev, 509 struct multiple_vdev_restart_params *param) 510 { 511 QDF_STATUS status = QDF_STATUS_SUCCESS; 512 struct wlan_lmac_if_mlme_tx_ops *txops; 513 struct wlan_objmgr_vdev *vdev; 514 515 if (!param) { 516 mlme_err("Invalid input"); 517 return QDF_STATUS_E_INVAL; 518 } 519 520 vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, 521 param->vdev_ids[0], 522 WLAN_VDEV_TARGET_IF_ID); 523 if (vdev) { 524 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 525 if (!txops || !txops->multiple_vdev_restart_req_cmd) { 526 mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev)); 527 wlan_objmgr_vdev_release_ref(vdev, 528 WLAN_VDEV_TARGET_IF_ID); 529 return QDF_STATUS_E_INVAL; 530 } 531 532 status = txops->multiple_vdev_restart_req_cmd(pdev, param); 533 if (QDF_IS_STATUS_ERROR(status)) 534 mlme_err("Tx Ops Error: %d", status); 535 536 wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); 537 } 538 539 return status; 540 } 541 542 QDF_STATUS tgt_vdev_mgr_set_tx_rx_decap_type(struct vdev_mlme_obj *mlme_obj, 543 enum wlan_mlme_cfg_id param_id, 544 uint32_t value) 545 { 546 QDF_STATUS status; 547 struct wlan_lmac_if_mlme_tx_ops *txops; 548 struct wlan_objmgr_vdev *vdev; 549 uint8_t vdev_id; 550 551 if (!mlme_obj) { 552 mlme_err("Invalid input"); 553 return QDF_STATUS_E_INVAL; 554 } 555 556 vdev = mlme_obj->vdev; 557 vdev_id = wlan_vdev_get_id(vdev); 558 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 559 if (!txops || !txops->vdev_set_tx_rx_decap_type) { 560 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 561 return QDF_STATUS_E_INVAL; 562 } 563 564 status = txops->vdev_set_tx_rx_decap_type(vdev, param_id, value); 565 if (QDF_IS_STATUS_ERROR(status)) 566 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 567 568 return status; 569 } 570 571 QDF_STATUS tgt_vdev_mgr_set_param_send( 572 struct vdev_mlme_obj *mlme_obj, 573 struct vdev_set_params *param) 574 { 575 QDF_STATUS status; 576 struct wlan_lmac_if_mlme_tx_ops *txops; 577 struct wlan_objmgr_vdev *vdev; 578 uint8_t vdev_id; 579 580 if (!param) { 581 mlme_err("Invalid input"); 582 return QDF_STATUS_E_INVAL; 583 } 584 585 vdev = mlme_obj->vdev; 586 vdev_id = wlan_vdev_get_id(vdev); 587 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 588 if (!txops || !txops->vdev_set_param_send) { 589 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 590 return QDF_STATUS_E_INVAL; 591 } 592 593 status = txops->vdev_set_param_send(vdev, param); 594 if (QDF_IS_STATUS_ERROR(status)) 595 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 596 597 return status; 598 } 599 600 QDF_STATUS tgt_vdev_mgr_sta_ps_param_send( 601 struct vdev_mlme_obj *mlme_obj, 602 struct sta_ps_params *param) 603 { 604 QDF_STATUS status; 605 struct wlan_lmac_if_mlme_tx_ops *txops; 606 struct wlan_objmgr_vdev *vdev; 607 uint8_t vdev_id; 608 609 if (!param) { 610 mlme_err("Invalid input"); 611 return QDF_STATUS_E_INVAL; 612 } 613 614 vdev = mlme_obj->vdev; 615 vdev_id = wlan_vdev_get_id(vdev); 616 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 617 if (!txops || !txops->vdev_sta_ps_param_send) { 618 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 619 return QDF_STATUS_E_INVAL; 620 } 621 622 status = txops->vdev_sta_ps_param_send(vdev, param); 623 if (QDF_IS_STATUS_ERROR(status)) 624 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 625 626 return status; 627 } 628 629 QDF_STATUS tgt_vdev_mgr_peer_delete_all_send( 630 struct vdev_mlme_obj *mlme_obj, 631 struct peer_delete_all_params *param) 632 { 633 QDF_STATUS status; 634 struct wlan_lmac_if_mlme_tx_ops *txops; 635 struct wlan_objmgr_vdev *vdev; 636 uint8_t vdev_id; 637 638 if (!param) { 639 mlme_err("Invalid input"); 640 return QDF_STATUS_E_INVAL; 641 } 642 643 vdev = mlme_obj->vdev; 644 vdev_id = wlan_vdev_get_id(vdev); 645 txops = wlan_vdev_mlme_get_lmac_txops(vdev); 646 if (!txops || !txops->peer_delete_all_send) { 647 mlme_err("VDEV_%d: No Tx Ops", vdev_id); 648 return QDF_STATUS_E_INVAL; 649 } 650 651 status = txops->peer_delete_all_send(vdev, param); 652 if (QDF_IS_STATUS_ERROR(status)) 653 mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); 654 655 return QDF_STATUS_SUCCESS; 656 } 657