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: vdev_mgr_ops.c 21 * 22 * This file provide API definitions for filling data structures 23 * and sending vdev mgmt commands to target_if/mlme 24 */ 25 #include "vdev_mgr_ops.h" 26 #include <wlan_objmgr_vdev_obj.h> 27 #include <wlan_vdev_mlme_api.h> 28 #include <wlan_mlme_dbg.h> 29 #include <wlan_vdev_mgr_tgt_if_tx_api.h> 30 #include <target_if.h> 31 #include <init_deinit_lmac.h> 32 #include <wlan_lmac_if_api.h> 33 #include <wlan_reg_services_api.h> 34 #include <wlan_dfs_tgt_api.h> 35 #include <wlan_dfs_utils_api.h> 36 #include <wlan_vdev_mgr_ucfg_api.h> 37 #include <qdf_module.h> 38 39 static QDF_STATUS vdev_mgr_create_param_update( 40 struct vdev_mlme_obj *mlme_obj, 41 struct vdev_create_params *param) 42 { 43 struct wlan_objmgr_pdev *pdev; 44 struct wlan_objmgr_vdev *vdev; 45 struct vdev_mlme_mbss_11ax *mbss; 46 47 vdev = mlme_obj->vdev; 48 if (!vdev) { 49 mlme_err("VDEV is NULL"); 50 return QDF_STATUS_E_INVAL; 51 } 52 53 pdev = wlan_vdev_get_pdev(vdev); 54 if (!pdev) { 55 mlme_err("PDEV is NULL"); 56 return QDF_STATUS_E_INVAL; 57 } 58 59 mbss = &mlme_obj->mgmt.mbss_11ax; 60 param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 61 param->vdev_id = wlan_vdev_get_id(vdev); 62 param->nss_2g = mlme_obj->proto.generic.nss_2g; 63 param->nss_5g = mlme_obj->proto.generic.nss_5g; 64 param->type = mlme_obj->mgmt.generic.type; 65 param->subtype = mlme_obj->mgmt.generic.subtype; 66 param->mbssid_flags = mbss->mbssid_flags; 67 param->vdevid_trans = mbss->vdevid_trans; 68 69 return QDF_STATUS_SUCCESS; 70 } 71 72 QDF_STATUS vdev_mgr_create_send(struct vdev_mlme_obj *mlme_obj) 73 { 74 QDF_STATUS status; 75 struct vdev_create_params param = {0}; 76 77 if (!mlme_obj) { 78 mlme_err("VDEV_MLME is NULL"); 79 return QDF_STATUS_E_INVAL; 80 } 81 82 status = vdev_mgr_create_param_update(mlme_obj, ¶m); 83 if (QDF_IS_STATUS_ERROR(status)) { 84 mlme_err("Param Update Error: %d", status); 85 return status; 86 } 87 88 status = tgt_vdev_mgr_create_send(mlme_obj, ¶m); 89 90 return status; 91 } 92 93 #ifdef QCA_MCL_DFS_SUPPORT 94 static bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode) 95 { 96 return (op_mode == QDF_SAP_MODE || op_mode == QDF_P2P_GO_MODE); 97 } 98 99 static bool vdev_mgr_is_49G_5G_6G_chan_freq(uint16_t chan_freq) 100 { 101 return WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq) || 102 WLAN_REG_IS_49GHZ_FREQ(chan_freq) || 103 WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq); 104 } 105 #else 106 static inline bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode) 107 { 108 return true; 109 } 110 111 static inline bool vdev_mgr_is_49G_5G_6G_chan_freq(uint16_t chan_freq) 112 { 113 return true; 114 } 115 #endif 116 117 static QDF_STATUS vdev_mgr_start_param_update( 118 struct vdev_mlme_obj *mlme_obj, 119 struct vdev_start_params *param) 120 { 121 struct wlan_channel *des_chan; 122 uint32_t dfs_reg; 123 bool set_agile = false, dfs_set_cfreq2 = false; 124 struct wlan_objmgr_vdev *vdev; 125 struct wlan_objmgr_pdev *pdev; 126 enum QDF_OPMODE op_mode; 127 bool is_dfs_chan_updated = false; 128 129 vdev = mlme_obj->vdev; 130 if (!vdev) { 131 mlme_err("VDEV is NULL"); 132 return QDF_STATUS_E_INVAL; 133 } 134 135 pdev = wlan_vdev_get_pdev(vdev); 136 if (!pdev) { 137 mlme_err("PDEV is NULL"); 138 return QDF_STATUS_E_INVAL; 139 } 140 141 if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_MLME_SB_ID) != 142 QDF_STATUS_SUCCESS) { 143 mlme_err("Failed to get pdev reference"); 144 return QDF_STATUS_E_FAILURE; 145 } 146 147 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 148 param->vdev_id = wlan_vdev_get_id(vdev); 149 150 op_mode = wlan_vdev_mlme_get_opmode(vdev); 151 if (vdev_mgr_is_opmode_sap_or_p2p_go(op_mode) && 152 vdev_mgr_is_49G_5G_6G_chan_freq(des_chan->ch_freq)) 153 tgt_dfs_set_current_channel_for_freq(pdev, des_chan->ch_freq, 154 des_chan->ch_flags, 155 des_chan->ch_flagext, 156 des_chan->ch_ieee, 157 des_chan->ch_freq_seg1, 158 des_chan->ch_freq_seg2, 159 des_chan->ch_cfreq1, 160 des_chan->ch_cfreq2, 161 &is_dfs_chan_updated); 162 163 /* The RCAC state machine should be stopped only once for the channel 164 * change. If the same channel is being sent to the FW then do 165 * not send unnecessary STOP to the state machine. 166 */ 167 if (is_dfs_chan_updated) 168 utils_dfs_rcac_sm_deliver_evt(pdev, 169 DFS_RCAC_SM_EV_RCAC_STOP); 170 171 param->beacon_interval = mlme_obj->proto.generic.beacon_interval; 172 param->dtim_period = mlme_obj->proto.generic.dtim_period; 173 param->disable_hw_ack = mlme_obj->mgmt.generic.disable_hw_ack; 174 param->preferred_rx_streams = 175 mlme_obj->mgmt.chainmask_info.num_rx_chain; 176 param->preferred_tx_streams = 177 mlme_obj->mgmt.chainmask_info.num_tx_chain; 178 179 wlan_reg_get_dfs_region(pdev, &dfs_reg); 180 param->regdomain = dfs_reg; 181 param->he_ops = mlme_obj->proto.he_ops_info.he_ops; 182 183 param->channel.chan_id = des_chan->ch_ieee; 184 param->channel.pwr = mlme_obj->mgmt.generic.tx_power; 185 param->channel.mhz = des_chan->ch_freq; 186 param->channel.half_rate = mlme_obj->mgmt.rate_info.half_rate; 187 param->channel.quarter_rate = mlme_obj->mgmt.rate_info.quarter_rate; 188 param->channel.dfs_set = wlan_reg_is_dfs_for_freq(pdev, 189 des_chan->ch_freq); 190 param->channel.dfs_set_cfreq2 = utils_is_dfs_cfreq2_ch(pdev); 191 param->channel.is_chan_passive = 192 utils_is_dfs_chan_for_freq(pdev, param->channel.mhz); 193 param->channel.allow_ht = mlme_obj->proto.ht_info.allow_ht; 194 param->channel.allow_vht = mlme_obj->proto.vht_info.allow_vht; 195 param->channel.phy_mode = mlme_obj->mgmt.generic.phy_mode; 196 param->channel.cfreq1 = des_chan->ch_cfreq1; 197 param->channel.cfreq2 = des_chan->ch_cfreq2; 198 param->channel.maxpower = mlme_obj->mgmt.generic.maxpower; 199 param->channel.minpower = mlme_obj->mgmt.generic.minpower; 200 param->channel.maxregpower = mlme_obj->mgmt.generic.maxregpower; 201 param->channel.antennamax = mlme_obj->mgmt.generic.antennamax; 202 param->channel.reg_class_id = mlme_obj->mgmt.generic.reg_class_id; 203 param->bcn_tx_rate_code = vdev_mgr_fetch_ratecode(mlme_obj); 204 param->ldpc_rx_enabled = mlme_obj->proto.generic.ldpc; 205 if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) { 206 param->hidden_ssid = mlme_obj->mgmt.ap.hidden_ssid; 207 param->cac_duration_ms = mlme_obj->mgmt.ap.cac_duration_ms; 208 } 209 wlan_vdev_mlme_get_ssid(vdev, param->ssid.mac_ssid, 210 ¶m->ssid.length); 211 212 if (des_chan->ch_phymode == WLAN_PHYMODE_11AC_VHT80 || 213 des_chan->ch_phymode == WLAN_PHYMODE_11AXA_HE80) { 214 tgt_dfs_find_vht80_precac_chan_freq(pdev, 215 des_chan->ch_phymode, 216 des_chan->ch_freq_seg1, 217 ¶m->channel.cfreq1, 218 ¶m->channel.cfreq2, 219 ¶m->channel.phy_mode, 220 &dfs_set_cfreq2, 221 &set_agile); 222 param->channel.dfs_set_cfreq2 = dfs_set_cfreq2; 223 param->channel.set_agile = set_agile; 224 } 225 226 wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_SB_ID); 227 return QDF_STATUS_SUCCESS; 228 } 229 230 QDF_STATUS vdev_mgr_start_send( 231 struct vdev_mlme_obj *mlme_obj, 232 bool restart) 233 { 234 QDF_STATUS status; 235 struct vdev_start_params param = {0}; 236 237 if (!mlme_obj) { 238 mlme_err("VDEV_MLME is NULL"); 239 return QDF_STATUS_E_INVAL; 240 } 241 242 status = vdev_mgr_start_param_update(mlme_obj, ¶m); 243 if (QDF_IS_STATUS_ERROR(status)) { 244 mlme_err("Param Update Error: %d", status); 245 return status; 246 } 247 248 param.is_restart = restart; 249 status = tgt_vdev_mgr_start_send(mlme_obj, ¶m); 250 251 return status; 252 } 253 254 static QDF_STATUS vdev_mgr_delete_param_update( 255 struct vdev_mlme_obj *mlme_obj, 256 struct vdev_delete_params *param) 257 { 258 struct wlan_objmgr_vdev *vdev; 259 260 vdev = mlme_obj->vdev; 261 if (!vdev) { 262 mlme_err("VDEV is NULL"); 263 return QDF_STATUS_E_INVAL; 264 } 265 266 param->vdev_id = wlan_vdev_get_id(vdev); 267 return QDF_STATUS_SUCCESS; 268 } 269 270 QDF_STATUS vdev_mgr_delete_send(struct vdev_mlme_obj *mlme_obj) 271 { 272 QDF_STATUS status; 273 struct vdev_delete_params param; 274 275 if (!mlme_obj) { 276 mlme_err("VDEV_MLME is NULL"); 277 return QDF_STATUS_E_INVAL; 278 } 279 280 status = vdev_mgr_delete_param_update(mlme_obj, ¶m); 281 if (QDF_IS_STATUS_ERROR(status)) { 282 mlme_err("Param Update Error: %d", status); 283 return status; 284 } 285 286 status = tgt_vdev_mgr_delete_send(mlme_obj, ¶m); 287 288 return status; 289 } 290 291 static QDF_STATUS vdev_mgr_stop_param_update( 292 struct vdev_mlme_obj *mlme_obj, 293 struct vdev_stop_params *param) 294 { 295 struct wlan_objmgr_vdev *vdev; 296 297 vdev = mlme_obj->vdev; 298 if (!vdev) { 299 mlme_err("VDEV is NULL"); 300 return QDF_STATUS_E_INVAL; 301 } 302 303 param->vdev_id = wlan_vdev_get_id(vdev); 304 305 return QDF_STATUS_SUCCESS; 306 } 307 308 QDF_STATUS vdev_mgr_stop_send(struct vdev_mlme_obj *mlme_obj) 309 { 310 QDF_STATUS status; 311 struct vdev_stop_params param = {0}; 312 313 if (!mlme_obj) { 314 mlme_err("VDEV_MLME is NULL"); 315 return QDF_STATUS_E_INVAL; 316 } 317 318 status = vdev_mgr_stop_param_update(mlme_obj, ¶m); 319 if (QDF_IS_STATUS_ERROR(status)) { 320 mlme_err("Param Update Error: %d", status); 321 return status; 322 } 323 324 status = tgt_vdev_mgr_stop_send(mlme_obj, ¶m); 325 326 return status; 327 } 328 329 static QDF_STATUS vdev_mgr_bcn_tmpl_param_update( 330 struct vdev_mlme_obj *mlme_obj, 331 struct beacon_tmpl_params *param) 332 { 333 return QDF_STATUS_SUCCESS; 334 } 335 336 static QDF_STATUS vdev_mgr_sta_ps_param_update( 337 struct vdev_mlme_obj *mlme_obj, 338 struct sta_ps_params *param) 339 { 340 struct wlan_objmgr_vdev *vdev; 341 342 vdev = mlme_obj->vdev; 343 param->vdev_id = wlan_vdev_get_id(vdev); 344 param->param_id = WLAN_MLME_CFG_UAPSD; 345 param->value = mlme_obj->proto.sta.uapsd_cfg; 346 return QDF_STATUS_SUCCESS; 347 } 348 349 static QDF_STATUS vdev_mgr_up_param_update( 350 struct vdev_mlme_obj *mlme_obj, 351 struct vdev_up_params *param) 352 { 353 struct vdev_mlme_mbss_11ax *mbss; 354 struct wlan_objmgr_vdev *vdev; 355 356 vdev = mlme_obj->vdev; 357 param->vdev_id = wlan_vdev_get_id(vdev); 358 param->assoc_id = mlme_obj->proto.sta.assoc_id; 359 mbss = &mlme_obj->mgmt.mbss_11ax; 360 if (mbss->profile_idx) { 361 param->profile_idx = mbss->profile_idx; 362 param->profile_num = mbss->profile_num; 363 qdf_mem_copy(param->trans_bssid, mbss->trans_bssid, 364 QDF_MAC_ADDR_SIZE); 365 } 366 367 return QDF_STATUS_SUCCESS; 368 } 369 370 QDF_STATUS vdev_mgr_up_send(struct vdev_mlme_obj *mlme_obj) 371 { 372 QDF_STATUS status; 373 struct vdev_up_params param = {0}; 374 struct sta_ps_params ps_param = {0}; 375 struct beacon_tmpl_params bcn_tmpl_param = {0}; 376 enum QDF_OPMODE opmode; 377 struct wlan_objmgr_vdev *vdev; 378 struct config_fils_params fils_param = {0}; 379 uint8_t is_6g_sap_fd_enabled; 380 381 if (!mlme_obj) { 382 mlme_err("VDEV_MLME is NULL"); 383 return QDF_STATUS_E_INVAL; 384 } 385 386 vdev = mlme_obj->vdev; 387 if (!vdev) { 388 mlme_err("VDEV is NULL"); 389 return QDF_STATUS_E_INVAL; 390 } 391 392 vdev_mgr_up_param_update(mlme_obj, ¶m); 393 vdev_mgr_bcn_tmpl_param_update(mlme_obj, &bcn_tmpl_param); 394 395 opmode = wlan_vdev_mlme_get_opmode(vdev); 396 if (opmode == QDF_STA_MODE) { 397 vdev_mgr_sta_ps_param_update(mlme_obj, &ps_param); 398 status = tgt_vdev_mgr_sta_ps_param_send(mlme_obj, &ps_param); 399 400 } 401 402 status = tgt_vdev_mgr_beacon_tmpl_send(mlme_obj, &bcn_tmpl_param); 403 if (QDF_IS_STATUS_ERROR(status)) 404 return status; 405 406 status = tgt_vdev_mgr_up_send(mlme_obj, ¶m); 407 if (QDF_IS_STATUS_ERROR(status)) 408 return status; 409 410 is_6g_sap_fd_enabled = wlan_vdev_mlme_feat_ext_cap_get(vdev, 411 WLAN_VDEV_FEXT_FILS_DISC_6G_SAP); 412 mlme_debug("SAP FD enabled %d", is_6g_sap_fd_enabled); 413 if (opmode == QDF_SAP_MODE && mlme_obj->vdev->vdev_mlme.des_chan && 414 WLAN_REG_IS_6GHZ_CHAN_FREQ( 415 mlme_obj->vdev->vdev_mlme.des_chan->ch_freq)) { 416 fils_param.vdev_id = wlan_vdev_get_id(mlme_obj->vdev); 417 if (is_6g_sap_fd_enabled) { 418 fils_param.fd_period = DEFAULT_FILS_DISCOVERY_PERIOD; 419 } else { 420 fils_param.send_prb_rsp_frame = true; 421 fils_param.fd_period = DEFAULT_PROBE_RESP_PERIOD; 422 } 423 status = tgt_vdev_mgr_fils_enable_send(mlme_obj, 424 &fils_param); 425 } 426 427 return status; 428 } 429 430 static QDF_STATUS vdev_mgr_down_param_update( 431 struct vdev_mlme_obj *mlme_obj, 432 struct vdev_down_params *param) 433 { 434 struct wlan_objmgr_vdev *vdev; 435 436 vdev = mlme_obj->vdev; 437 if (!vdev) { 438 mlme_err("VDEV is NULL"); 439 return QDF_STATUS_E_INVAL; 440 } 441 442 param->vdev_id = wlan_vdev_get_id(vdev); 443 444 return QDF_STATUS_SUCCESS; 445 } 446 447 QDF_STATUS vdev_mgr_down_send(struct vdev_mlme_obj *mlme_obj) 448 { 449 QDF_STATUS status; 450 struct vdev_down_params param = {0}; 451 452 if (!mlme_obj) { 453 mlme_err("VDEV_MLME is NULL"); 454 return QDF_STATUS_E_INVAL; 455 } 456 457 status = vdev_mgr_down_param_update(mlme_obj, ¶m); 458 if (QDF_IS_STATUS_ERROR(status)) { 459 mlme_err("Param Update Error: %d", status); 460 return status; 461 } 462 463 status = tgt_vdev_mgr_down_send(mlme_obj, ¶m); 464 465 return status; 466 } 467 468 static QDF_STATUS vdev_mgr_peer_flush_tids_param_update( 469 struct vdev_mlme_obj *mlme_obj, 470 struct peer_flush_params *param, 471 uint8_t *mac, 472 uint32_t peer_tid_bitmap) 473 { 474 struct wlan_objmgr_vdev *vdev; 475 476 vdev = mlme_obj->vdev; 477 if (!vdev) { 478 mlme_err("VDEV is NULL"); 479 return QDF_STATUS_E_INVAL; 480 } 481 482 param->vdev_id = wlan_vdev_get_id(vdev); 483 param->peer_tid_bitmap = peer_tid_bitmap; 484 qdf_mem_copy(param->peer_mac, mac, QDF_MAC_ADDR_SIZE); 485 return QDF_STATUS_SUCCESS; 486 } 487 488 QDF_STATUS vdev_mgr_peer_flush_tids_send(struct vdev_mlme_obj *mlme_obj, 489 uint8_t *mac, 490 uint32_t peer_tid_bitmap) 491 { 492 QDF_STATUS status; 493 struct peer_flush_params param = {0}; 494 495 if (!mlme_obj || !mac) { 496 mlme_err("Invalid input"); 497 return QDF_STATUS_E_INVAL; 498 } 499 500 status = vdev_mgr_peer_flush_tids_param_update(mlme_obj, ¶m, 501 mac, peer_tid_bitmap); 502 if (QDF_IS_STATUS_ERROR(status)) { 503 mlme_err("Param Update Error: %d", status); 504 return status; 505 } 506 507 status = tgt_vdev_mgr_peer_flush_tids_send(mlme_obj, ¶m); 508 509 return status; 510 } 511 512 static QDF_STATUS vdev_mgr_multiple_restart_param_update( 513 struct wlan_objmgr_pdev *pdev, 514 struct mlme_channel_param *chan, 515 uint32_t disable_hw_ack, 516 uint32_t *vdev_ids, 517 uint32_t num_vdevs, 518 struct vdev_mlme_mvr_param *mvr_param, 519 struct multiple_vdev_restart_params *param) 520 { 521 param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 522 param->requestor_id = MULTIPLE_VDEV_RESTART_REQ_ID; 523 param->disable_hw_ack = disable_hw_ack; 524 param->cac_duration_ms = WLAN_DFS_WAIT_MS; 525 param->num_vdevs = num_vdevs; 526 527 qdf_mem_copy(param->vdev_ids, vdev_ids, 528 sizeof(uint32_t) * (param->num_vdevs)); 529 qdf_mem_copy(¶m->ch_param, chan, 530 sizeof(struct mlme_channel_param)); 531 qdf_mem_copy(param->mvr_param, mvr_param, 532 sizeof(*mvr_param) * (param->num_vdevs)); 533 534 return QDF_STATUS_SUCCESS; 535 } 536 537 QDF_STATUS vdev_mgr_multiple_restart_send(struct wlan_objmgr_pdev *pdev, 538 struct mlme_channel_param *chan, 539 uint32_t disable_hw_ack, 540 uint32_t *vdev_ids, 541 uint32_t num_vdevs, 542 struct vdev_mlme_mvr_param *mvr_param) 543 { 544 struct multiple_vdev_restart_params param = {0}; 545 546 vdev_mgr_multiple_restart_param_update(pdev, chan, 547 disable_hw_ack, 548 vdev_ids, num_vdevs, 549 mvr_param, ¶m); 550 551 return tgt_vdev_mgr_multiple_vdev_restart_send(pdev, ¶m); 552 } 553 554 qdf_export_symbol(vdev_mgr_multiple_restart_send); 555 556 static QDF_STATUS vdev_mgr_set_custom_aggr_size_param_update( 557 struct vdev_mlme_obj *mlme_obj, 558 struct set_custom_aggr_size_params *param, 559 bool is_amsdu) 560 { 561 struct wlan_objmgr_vdev *vdev; 562 563 vdev = mlme_obj->vdev; 564 if (!vdev) { 565 mlme_err("VDEV is NULL"); 566 return QDF_STATUS_E_INVAL; 567 } 568 569 param->aggr_type = is_amsdu ? WLAN_MLME_CUSTOM_AGGR_TYPE_AMSDU 570 : WLAN_MLME_CUSTOM_AGGR_TYPE_AMPDU; 571 /* 572 * We are only setting TX params, therefore 573 * we are disabling rx_aggr_size 574 */ 575 param->rx_aggr_size_disable = true; 576 param->tx_aggr_size = is_amsdu ? mlme_obj->mgmt.generic.amsdu 577 : mlme_obj->mgmt.generic.ampdu; 578 param->vdev_id = wlan_vdev_get_id(vdev); 579 580 return QDF_STATUS_SUCCESS; 581 } 582 583 QDF_STATUS vdev_mgr_set_custom_aggr_size_send( 584 struct vdev_mlme_obj *vdev_mlme, 585 bool is_amsdu) 586 { 587 QDF_STATUS status; 588 struct set_custom_aggr_size_params param = {0}; 589 590 status = vdev_mgr_set_custom_aggr_size_param_update(vdev_mlme, 591 ¶m, is_amsdu); 592 if (QDF_IS_STATUS_ERROR(status)) { 593 mlme_err("Param Update Error: %d", status); 594 return status; 595 } 596 597 return tgt_vdev_mgr_set_custom_aggr_size_send(vdev_mlme, ¶m); 598 } 599 600 static QDF_STATUS vdev_mgr_peer_delete_all_param_update( 601 struct vdev_mlme_obj *mlme_obj, 602 struct peer_delete_all_params *param) 603 { 604 struct wlan_objmgr_vdev *vdev; 605 606 vdev = mlme_obj->vdev; 607 if (!vdev) { 608 mlme_err("VDEV is NULL"); 609 return QDF_STATUS_E_INVAL; 610 } 611 612 param->vdev_id = wlan_vdev_get_id(vdev); 613 return QDF_STATUS_SUCCESS; 614 } 615 616 QDF_STATUS vdev_mgr_peer_delete_all_send(struct vdev_mlme_obj *mlme_obj) 617 { 618 QDF_STATUS status; 619 struct peer_delete_all_params param = {0}; 620 621 if (!mlme_obj) { 622 mlme_err("Invalid input"); 623 return QDF_STATUS_E_INVAL; 624 } 625 626 status = vdev_mgr_peer_delete_all_param_update(mlme_obj, ¶m); 627 if (QDF_IS_STATUS_ERROR(status)) { 628 mlme_err("Param Update Error: %d", status); 629 return status; 630 } 631 632 status = tgt_vdev_mgr_peer_delete_all_send(mlme_obj, ¶m); 633 634 return status; 635 } 636 637