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