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 param->special_vdev_mode = mlme_obj->mgmt.generic.special_vdev_mode; 69 70 return QDF_STATUS_SUCCESS; 71 } 72 73 QDF_STATUS vdev_mgr_create_send(struct vdev_mlme_obj *mlme_obj) 74 { 75 QDF_STATUS status; 76 struct vdev_create_params param = {0}; 77 78 if (!mlme_obj) { 79 mlme_err("VDEV_MLME is NULL"); 80 return QDF_STATUS_E_INVAL; 81 } 82 83 status = vdev_mgr_create_param_update(mlme_obj, ¶m); 84 if (QDF_IS_STATUS_ERROR(status)) { 85 mlme_err("Param Update Error: %d", status); 86 return status; 87 } 88 89 status = tgt_vdev_mgr_create_send(mlme_obj, ¶m); 90 91 return status; 92 } 93 94 #ifdef QCA_MCL_DFS_SUPPORT 95 static bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode) 96 { 97 return (op_mode == QDF_SAP_MODE || op_mode == QDF_P2P_GO_MODE); 98 } 99 100 static bool vdev_mgr_is_49G_5G_6G_chan_freq(uint16_t chan_freq) 101 { 102 return WLAN_REG_IS_5GHZ_CH_FREQ(chan_freq) || 103 WLAN_REG_IS_49GHZ_FREQ(chan_freq) || 104 WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq); 105 } 106 #else 107 static inline bool vdev_mgr_is_opmode_sap_or_p2p_go(enum QDF_OPMODE op_mode) 108 { 109 return true; 110 } 111 112 static inline bool vdev_mgr_is_49G_5G_6G_chan_freq(uint16_t chan_freq) 113 { 114 return true; 115 } 116 #endif 117 118 static QDF_STATUS vdev_mgr_start_param_update( 119 struct vdev_mlme_obj *mlme_obj, 120 struct vdev_start_params *param) 121 { 122 struct wlan_channel *des_chan; 123 uint32_t dfs_reg; 124 bool set_agile = false, dfs_set_cfreq2 = false; 125 struct wlan_objmgr_vdev *vdev; 126 struct wlan_objmgr_pdev *pdev; 127 enum QDF_OPMODE op_mode; 128 bool is_dfs_chan_updated = false; 129 130 vdev = mlme_obj->vdev; 131 if (!vdev) { 132 mlme_err("VDEV is NULL"); 133 return QDF_STATUS_E_INVAL; 134 } 135 136 pdev = wlan_vdev_get_pdev(vdev); 137 if (!pdev) { 138 mlme_err("PDEV is NULL"); 139 return QDF_STATUS_E_INVAL; 140 } 141 142 if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_MLME_SB_ID) != 143 QDF_STATUS_SUCCESS) { 144 mlme_err("Failed to get pdev reference"); 145 return QDF_STATUS_E_FAILURE; 146 } 147 148 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 149 param->vdev_id = wlan_vdev_get_id(vdev); 150 151 op_mode = wlan_vdev_mlme_get_opmode(vdev); 152 if (vdev_mgr_is_opmode_sap_or_p2p_go(op_mode) && 153 vdev_mgr_is_49G_5G_6G_chan_freq(des_chan->ch_freq)) 154 tgt_dfs_set_current_channel_for_freq(pdev, des_chan->ch_freq, 155 des_chan->ch_flags, 156 des_chan->ch_flagext, 157 des_chan->ch_ieee, 158 des_chan->ch_freq_seg1, 159 des_chan->ch_freq_seg2, 160 des_chan->ch_cfreq1, 161 des_chan->ch_cfreq2, 162 &is_dfs_chan_updated); 163 164 /* The Agile state machine should be stopped only once for the channel 165 * change. If the same channel is being sent to the FW then do 166 * not send unnecessary STOP to the state machine. 167 */ 168 if (is_dfs_chan_updated) 169 utils_dfs_agile_sm_deliver_evt(pdev, 170 DFS_AGILE_SM_EV_AGILE_STOP); 171 172 param->beacon_interval = mlme_obj->proto.generic.beacon_interval; 173 param->dtim_period = mlme_obj->proto.generic.dtim_period; 174 param->disable_hw_ack = mlme_obj->mgmt.generic.disable_hw_ack; 175 param->preferred_rx_streams = 176 mlme_obj->mgmt.chainmask_info.num_rx_chain; 177 param->preferred_tx_streams = 178 mlme_obj->mgmt.chainmask_info.num_tx_chain; 179 180 wlan_reg_get_dfs_region(pdev, &dfs_reg); 181 param->regdomain = dfs_reg; 182 param->he_ops = mlme_obj->proto.he_ops_info.he_ops; 183 184 param->channel.chan_id = des_chan->ch_ieee; 185 param->channel.pwr = mlme_obj->mgmt.generic.tx_power; 186 param->channel.mhz = des_chan->ch_freq; 187 param->channel.half_rate = mlme_obj->mgmt.rate_info.half_rate; 188 param->channel.quarter_rate = mlme_obj->mgmt.rate_info.quarter_rate; 189 param->channel.dfs_set = wlan_reg_is_dfs_for_freq(pdev, 190 des_chan->ch_freq); 191 param->channel.dfs_set_cfreq2 = utils_is_dfs_cfreq2_ch(pdev); 192 param->channel.is_chan_passive = 193 utils_is_dfs_chan_for_freq(pdev, param->channel.mhz); 194 param->channel.allow_ht = mlme_obj->proto.ht_info.allow_ht; 195 param->channel.allow_vht = mlme_obj->proto.vht_info.allow_vht; 196 param->channel.phy_mode = mlme_obj->mgmt.generic.phy_mode; 197 param->channel.cfreq1 = des_chan->ch_cfreq1; 198 param->channel.cfreq2 = des_chan->ch_cfreq2; 199 param->channel.maxpower = mlme_obj->mgmt.generic.maxpower; 200 param->channel.minpower = mlme_obj->mgmt.generic.minpower; 201 param->channel.maxregpower = mlme_obj->mgmt.generic.maxregpower; 202 param->channel.antennamax = mlme_obj->mgmt.generic.antennamax; 203 param->channel.reg_class_id = mlme_obj->mgmt.generic.reg_class_id; 204 param->bcn_tx_rate_code = vdev_mgr_fetch_ratecode(mlme_obj); 205 param->ldpc_rx_enabled = mlme_obj->proto.generic.ldpc; 206 if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) { 207 param->hidden_ssid = mlme_obj->mgmt.ap.hidden_ssid; 208 param->cac_duration_ms = mlme_obj->mgmt.ap.cac_duration_ms; 209 } 210 wlan_vdev_mlme_get_ssid(vdev, param->ssid.ssid, ¶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 bool is_non_tx_vdev; 381 382 if (!mlme_obj) { 383 mlme_err("VDEV_MLME is NULL"); 384 return QDF_STATUS_E_INVAL; 385 } 386 387 vdev = mlme_obj->vdev; 388 if (!vdev) { 389 mlme_err("VDEV is NULL"); 390 return QDF_STATUS_E_INVAL; 391 } 392 393 vdev_mgr_up_param_update(mlme_obj, ¶m); 394 vdev_mgr_bcn_tmpl_param_update(mlme_obj, &bcn_tmpl_param); 395 396 opmode = wlan_vdev_mlme_get_opmode(vdev); 397 if (opmode == QDF_STA_MODE) { 398 vdev_mgr_sta_ps_param_update(mlme_obj, &ps_param); 399 status = tgt_vdev_mgr_sta_ps_param_send(mlme_obj, &ps_param); 400 401 } 402 403 status = tgt_vdev_mgr_beacon_tmpl_send(mlme_obj, &bcn_tmpl_param); 404 if (QDF_IS_STATUS_ERROR(status)) 405 return status; 406 407 status = tgt_vdev_mgr_up_send(mlme_obj, ¶m); 408 if (QDF_IS_STATUS_ERROR(status)) 409 return status; 410 411 is_6g_sap_fd_enabled = wlan_vdev_mlme_feat_ext_cap_get(vdev, 412 WLAN_VDEV_FEXT_FILS_DISC_6G_SAP); 413 mlme_debug("SAP FD enabled %d", is_6g_sap_fd_enabled); 414 415 /* 416 * In case of a non-tx vdev, 'profile_num' must be greater 417 * than 0 indicating one or more non-tx vdev and 'profile_idx' 418 * must be in the range [1, 2^n] where n is the max bssid 419 * indicator 420 */ 421 is_non_tx_vdev = param.profile_num && param.profile_idx; 422 423 if (opmode == QDF_SAP_MODE && mlme_obj->vdev->vdev_mlme.des_chan && 424 WLAN_REG_IS_6GHZ_CHAN_FREQ( 425 mlme_obj->vdev->vdev_mlme.des_chan->ch_freq) && 426 !is_non_tx_vdev) { 427 fils_param.vdev_id = wlan_vdev_get_id(mlme_obj->vdev); 428 if (is_6g_sap_fd_enabled) { 429 fils_param.fd_period = DEFAULT_FILS_DISCOVERY_PERIOD; 430 } else { 431 fils_param.send_prb_rsp_frame = true; 432 fils_param.fd_period = DEFAULT_PROBE_RESP_PERIOD; 433 } 434 status = tgt_vdev_mgr_fils_enable_send(mlme_obj, 435 &fils_param); 436 } 437 438 return status; 439 } 440 441 static QDF_STATUS vdev_mgr_down_param_update( 442 struct vdev_mlme_obj *mlme_obj, 443 struct vdev_down_params *param) 444 { 445 struct wlan_objmgr_vdev *vdev; 446 447 vdev = mlme_obj->vdev; 448 if (!vdev) { 449 mlme_err("VDEV is NULL"); 450 return QDF_STATUS_E_INVAL; 451 } 452 453 param->vdev_id = wlan_vdev_get_id(vdev); 454 455 return QDF_STATUS_SUCCESS; 456 } 457 458 QDF_STATUS vdev_mgr_down_send(struct vdev_mlme_obj *mlme_obj) 459 { 460 QDF_STATUS status; 461 struct vdev_down_params param = {0}; 462 463 if (!mlme_obj) { 464 mlme_err("VDEV_MLME is NULL"); 465 return QDF_STATUS_E_INVAL; 466 } 467 468 status = vdev_mgr_down_param_update(mlme_obj, ¶m); 469 if (QDF_IS_STATUS_ERROR(status)) { 470 mlme_err("Param Update Error: %d", status); 471 return status; 472 } 473 474 status = tgt_vdev_mgr_down_send(mlme_obj, ¶m); 475 476 return status; 477 } 478 479 static QDF_STATUS vdev_mgr_peer_flush_tids_param_update( 480 struct vdev_mlme_obj *mlme_obj, 481 struct peer_flush_params *param, 482 uint8_t *mac, 483 uint32_t peer_tid_bitmap) 484 { 485 struct wlan_objmgr_vdev *vdev; 486 487 vdev = mlme_obj->vdev; 488 if (!vdev) { 489 mlme_err("VDEV is NULL"); 490 return QDF_STATUS_E_INVAL; 491 } 492 493 param->vdev_id = wlan_vdev_get_id(vdev); 494 param->peer_tid_bitmap = peer_tid_bitmap; 495 qdf_mem_copy(param->peer_mac, mac, QDF_MAC_ADDR_SIZE); 496 return QDF_STATUS_SUCCESS; 497 } 498 499 QDF_STATUS vdev_mgr_peer_flush_tids_send(struct vdev_mlme_obj *mlme_obj, 500 uint8_t *mac, 501 uint32_t peer_tid_bitmap) 502 { 503 QDF_STATUS status; 504 struct peer_flush_params param = {0}; 505 506 if (!mlme_obj || !mac) { 507 mlme_err("Invalid input"); 508 return QDF_STATUS_E_INVAL; 509 } 510 511 status = vdev_mgr_peer_flush_tids_param_update(mlme_obj, ¶m, 512 mac, peer_tid_bitmap); 513 if (QDF_IS_STATUS_ERROR(status)) { 514 mlme_err("Param Update Error: %d", status); 515 return status; 516 } 517 518 status = tgt_vdev_mgr_peer_flush_tids_send(mlme_obj, ¶m); 519 520 return status; 521 } 522 523 static QDF_STATUS vdev_mgr_multiple_restart_param_update( 524 struct wlan_objmgr_pdev *pdev, 525 struct mlme_channel_param *chan, 526 uint32_t disable_hw_ack, 527 uint32_t *vdev_ids, 528 uint32_t num_vdevs, 529 struct vdev_mlme_mvr_param *mvr_param, 530 struct multiple_vdev_restart_params *param) 531 { 532 param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 533 param->requestor_id = MULTIPLE_VDEV_RESTART_REQ_ID; 534 param->disable_hw_ack = disable_hw_ack; 535 param->cac_duration_ms = WLAN_DFS_WAIT_MS; 536 param->num_vdevs = num_vdevs; 537 538 qdf_mem_copy(param->vdev_ids, vdev_ids, 539 sizeof(uint32_t) * (param->num_vdevs)); 540 qdf_mem_copy(¶m->ch_param, chan, 541 sizeof(struct mlme_channel_param)); 542 qdf_mem_copy(param->mvr_param, mvr_param, 543 sizeof(*mvr_param) * (param->num_vdevs)); 544 545 return QDF_STATUS_SUCCESS; 546 } 547 548 QDF_STATUS vdev_mgr_multiple_restart_send(struct wlan_objmgr_pdev *pdev, 549 struct mlme_channel_param *chan, 550 uint32_t disable_hw_ack, 551 uint32_t *vdev_ids, 552 uint32_t num_vdevs, 553 struct vdev_mlme_mvr_param *mvr_param) 554 { 555 struct multiple_vdev_restart_params param = {0}; 556 557 vdev_mgr_multiple_restart_param_update(pdev, chan, 558 disable_hw_ack, 559 vdev_ids, num_vdevs, 560 mvr_param, ¶m); 561 562 return tgt_vdev_mgr_multiple_vdev_restart_send(pdev, ¶m); 563 } 564 565 qdf_export_symbol(vdev_mgr_multiple_restart_send); 566 567 static QDF_STATUS vdev_mgr_set_custom_aggr_size_param_update( 568 struct vdev_mlme_obj *mlme_obj, 569 struct set_custom_aggr_size_params *param, 570 bool is_amsdu) 571 { 572 struct wlan_objmgr_vdev *vdev; 573 574 vdev = mlme_obj->vdev; 575 if (!vdev) { 576 mlme_err("VDEV is NULL"); 577 return QDF_STATUS_E_INVAL; 578 } 579 580 param->aggr_type = is_amsdu ? WLAN_MLME_CUSTOM_AGGR_TYPE_AMSDU 581 : WLAN_MLME_CUSTOM_AGGR_TYPE_AMPDU; 582 /* 583 * We are only setting TX params, therefore 584 * we are disabling rx_aggr_size 585 */ 586 param->rx_aggr_size_disable = true; 587 param->tx_aggr_size = is_amsdu ? mlme_obj->mgmt.generic.amsdu 588 : mlme_obj->mgmt.generic.ampdu; 589 param->vdev_id = wlan_vdev_get_id(vdev); 590 591 return QDF_STATUS_SUCCESS; 592 } 593 594 QDF_STATUS vdev_mgr_set_custom_aggr_size_send( 595 struct vdev_mlme_obj *vdev_mlme, 596 bool is_amsdu) 597 { 598 QDF_STATUS status; 599 struct set_custom_aggr_size_params param = {0}; 600 601 status = vdev_mgr_set_custom_aggr_size_param_update(vdev_mlme, 602 ¶m, is_amsdu); 603 if (QDF_IS_STATUS_ERROR(status)) { 604 mlme_err("Param Update Error: %d", status); 605 return status; 606 } 607 608 return tgt_vdev_mgr_set_custom_aggr_size_send(vdev_mlme, ¶m); 609 } 610 611 static QDF_STATUS vdev_mgr_peer_delete_all_param_update( 612 struct vdev_mlme_obj *mlme_obj, 613 struct peer_delete_all_params *param) 614 { 615 struct wlan_objmgr_vdev *vdev; 616 617 vdev = mlme_obj->vdev; 618 if (!vdev) { 619 mlme_err("VDEV is NULL"); 620 return QDF_STATUS_E_INVAL; 621 } 622 623 param->vdev_id = wlan_vdev_get_id(vdev); 624 return QDF_STATUS_SUCCESS; 625 } 626 627 QDF_STATUS vdev_mgr_peer_delete_all_send(struct vdev_mlme_obj *mlme_obj) 628 { 629 QDF_STATUS status; 630 struct peer_delete_all_params param = {0}; 631 632 if (!mlme_obj) { 633 mlme_err("Invalid input"); 634 return QDF_STATUS_E_INVAL; 635 } 636 637 status = vdev_mgr_peer_delete_all_param_update(mlme_obj, ¶m); 638 if (QDF_IS_STATUS_ERROR(status)) { 639 mlme_err("Param Update Error: %d", status); 640 return status; 641 } 642 643 status = tgt_vdev_mgr_peer_delete_all_send(mlme_obj, ¶m); 644 645 return status; 646 } 647 648