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 struct vdev_mlme_mbss_11ax *mbss; 130 131 vdev = mlme_obj->vdev; 132 if (!vdev) { 133 mlme_err("VDEV is NULL"); 134 return QDF_STATUS_E_INVAL; 135 } 136 137 pdev = wlan_vdev_get_pdev(vdev); 138 if (!pdev) { 139 mlme_err("PDEV is NULL"); 140 return QDF_STATUS_E_INVAL; 141 } 142 143 if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_MLME_SB_ID) != 144 QDF_STATUS_SUCCESS) { 145 mlme_err("Failed to get pdev reference"); 146 return QDF_STATUS_E_FAILURE; 147 } 148 149 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 150 param->vdev_id = wlan_vdev_get_id(vdev); 151 152 op_mode = wlan_vdev_mlme_get_opmode(vdev); 153 if (vdev_mgr_is_opmode_sap_or_p2p_go(op_mode) && 154 vdev_mgr_is_49G_5G_6G_chan_freq(des_chan->ch_freq)) { 155 tgt_dfs_set_current_channel_for_freq(pdev, des_chan->ch_freq, 156 des_chan->ch_flags, 157 des_chan->ch_flagext, 158 des_chan->ch_ieee, 159 des_chan->ch_freq_seg1, 160 des_chan->ch_freq_seg2, 161 des_chan->ch_cfreq1, 162 des_chan->ch_cfreq2, 163 &is_dfs_chan_updated); 164 if (des_chan->ch_cfreq2) 165 param->channel.dfs_set_cfreq2 = 166 utils_is_dfs_cfreq2_ch(pdev); 167 } 168 169 /* The Agile state machine should be stopped only once for the channel 170 * change. If the same channel is being sent to the FW then do 171 * not send unnecessary STOP to the state machine. 172 */ 173 if (is_dfs_chan_updated) 174 utils_dfs_agile_sm_deliver_evt(pdev, 175 DFS_AGILE_SM_EV_AGILE_STOP); 176 177 param->beacon_interval = mlme_obj->proto.generic.beacon_interval; 178 param->dtim_period = mlme_obj->proto.generic.dtim_period; 179 param->disable_hw_ack = mlme_obj->mgmt.generic.disable_hw_ack; 180 param->preferred_rx_streams = 181 mlme_obj->mgmt.chainmask_info.num_rx_chain; 182 param->preferred_tx_streams = 183 mlme_obj->mgmt.chainmask_info.num_tx_chain; 184 185 wlan_reg_get_dfs_region(pdev, &dfs_reg); 186 param->regdomain = dfs_reg; 187 param->he_ops = mlme_obj->proto.he_ops_info.he_ops; 188 189 param->channel.chan_id = des_chan->ch_ieee; 190 param->channel.pwr = mlme_obj->mgmt.generic.tx_power; 191 param->channel.mhz = des_chan->ch_freq; 192 param->channel.half_rate = mlme_obj->mgmt.rate_info.half_rate; 193 param->channel.quarter_rate = mlme_obj->mgmt.rate_info.quarter_rate; 194 param->channel.dfs_set = wlan_reg_is_dfs_for_freq(pdev, 195 des_chan->ch_freq); 196 param->channel.is_chan_passive = 197 utils_is_dfs_chan_for_freq(pdev, param->channel.mhz); 198 param->channel.allow_ht = mlme_obj->proto.ht_info.allow_ht; 199 param->channel.allow_vht = mlme_obj->proto.vht_info.allow_vht; 200 param->channel.phy_mode = mlme_obj->mgmt.generic.phy_mode; 201 param->channel.cfreq1 = des_chan->ch_cfreq1; 202 param->channel.cfreq2 = des_chan->ch_cfreq2; 203 param->channel.maxpower = mlme_obj->mgmt.generic.maxpower; 204 param->channel.minpower = mlme_obj->mgmt.generic.minpower; 205 param->channel.maxregpower = mlme_obj->mgmt.generic.maxregpower; 206 param->channel.antennamax = mlme_obj->mgmt.generic.antennamax; 207 param->channel.reg_class_id = mlme_obj->mgmt.generic.reg_class_id; 208 param->bcn_tx_rate_code = vdev_mgr_fetch_ratecode(mlme_obj); 209 param->ldpc_rx_enabled = mlme_obj->proto.generic.ldpc; 210 211 mbss = &mlme_obj->mgmt.mbss_11ax; 212 param->mbssid_flags = mbss->mbssid_flags; 213 param->vdevid_trans = mbss->vdevid_trans; 214 215 if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) { 216 param->hidden_ssid = mlme_obj->mgmt.ap.hidden_ssid; 217 param->cac_duration_ms = mlme_obj->mgmt.ap.cac_duration_ms; 218 } 219 wlan_vdev_mlme_get_ssid(vdev, param->ssid.ssid, ¶m->ssid.length); 220 221 if (des_chan->ch_phymode == WLAN_PHYMODE_11AC_VHT80 || 222 des_chan->ch_phymode == WLAN_PHYMODE_11AXA_HE80) { 223 tgt_dfs_find_vht80_precac_chan_freq(pdev, 224 des_chan->ch_phymode, 225 des_chan->ch_freq_seg1, 226 ¶m->channel.cfreq1, 227 ¶m->channel.cfreq2, 228 ¶m->channel.phy_mode, 229 &dfs_set_cfreq2, 230 &set_agile); 231 param->channel.dfs_set_cfreq2 = dfs_set_cfreq2; 232 param->channel.set_agile = set_agile; 233 } 234 235 wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_SB_ID); 236 return QDF_STATUS_SUCCESS; 237 } 238 239 QDF_STATUS vdev_mgr_start_send( 240 struct vdev_mlme_obj *mlme_obj, 241 bool restart) 242 { 243 QDF_STATUS status; 244 struct vdev_start_params param = {0}; 245 246 if (!mlme_obj) { 247 mlme_err("VDEV_MLME is NULL"); 248 return QDF_STATUS_E_INVAL; 249 } 250 251 status = vdev_mgr_start_param_update(mlme_obj, ¶m); 252 if (QDF_IS_STATUS_ERROR(status)) { 253 mlme_err("Param Update Error: %d", status); 254 return status; 255 } 256 257 param.is_restart = restart; 258 status = tgt_vdev_mgr_start_send(mlme_obj, ¶m); 259 260 return status; 261 } 262 263 static QDF_STATUS vdev_mgr_delete_param_update( 264 struct vdev_mlme_obj *mlme_obj, 265 struct vdev_delete_params *param) 266 { 267 struct wlan_objmgr_vdev *vdev; 268 269 vdev = mlme_obj->vdev; 270 if (!vdev) { 271 mlme_err("VDEV is NULL"); 272 return QDF_STATUS_E_INVAL; 273 } 274 275 param->vdev_id = wlan_vdev_get_id(vdev); 276 return QDF_STATUS_SUCCESS; 277 } 278 279 QDF_STATUS vdev_mgr_delete_send(struct vdev_mlme_obj *mlme_obj) 280 { 281 QDF_STATUS status; 282 struct vdev_delete_params param; 283 284 if (!mlme_obj) { 285 mlme_err("VDEV_MLME is NULL"); 286 return QDF_STATUS_E_INVAL; 287 } 288 289 status = vdev_mgr_delete_param_update(mlme_obj, ¶m); 290 if (QDF_IS_STATUS_ERROR(status)) { 291 mlme_err("Param Update Error: %d", status); 292 return status; 293 } 294 295 status = tgt_vdev_mgr_delete_send(mlme_obj, ¶m); 296 297 return status; 298 } 299 300 static QDF_STATUS vdev_mgr_stop_param_update( 301 struct vdev_mlme_obj *mlme_obj, 302 struct vdev_stop_params *param) 303 { 304 struct wlan_objmgr_vdev *vdev; 305 306 vdev = mlme_obj->vdev; 307 if (!vdev) { 308 mlme_err("VDEV is NULL"); 309 return QDF_STATUS_E_INVAL; 310 } 311 312 param->vdev_id = wlan_vdev_get_id(vdev); 313 314 return QDF_STATUS_SUCCESS; 315 } 316 317 QDF_STATUS vdev_mgr_stop_send(struct vdev_mlme_obj *mlme_obj) 318 { 319 QDF_STATUS status; 320 struct vdev_stop_params param = {0}; 321 322 if (!mlme_obj) { 323 mlme_err("VDEV_MLME is NULL"); 324 return QDF_STATUS_E_INVAL; 325 } 326 327 status = vdev_mgr_stop_param_update(mlme_obj, ¶m); 328 if (QDF_IS_STATUS_ERROR(status)) { 329 mlme_err("Param Update Error: %d", status); 330 return status; 331 } 332 333 status = tgt_vdev_mgr_stop_send(mlme_obj, ¶m); 334 335 return status; 336 } 337 338 static QDF_STATUS vdev_mgr_bcn_tmpl_param_update( 339 struct vdev_mlme_obj *mlme_obj, 340 struct beacon_tmpl_params *param) 341 { 342 return QDF_STATUS_SUCCESS; 343 } 344 345 static QDF_STATUS vdev_mgr_sta_ps_param_update( 346 struct vdev_mlme_obj *mlme_obj, 347 struct sta_ps_params *param) 348 { 349 struct wlan_objmgr_vdev *vdev; 350 351 vdev = mlme_obj->vdev; 352 param->vdev_id = wlan_vdev_get_id(vdev); 353 param->param_id = WLAN_MLME_CFG_UAPSD; 354 param->value = mlme_obj->proto.sta.uapsd_cfg; 355 return QDF_STATUS_SUCCESS; 356 } 357 358 static QDF_STATUS vdev_mgr_up_param_update( 359 struct vdev_mlme_obj *mlme_obj, 360 struct vdev_up_params *param) 361 { 362 struct vdev_mlme_mbss_11ax *mbss; 363 struct wlan_objmgr_vdev *vdev; 364 365 vdev = mlme_obj->vdev; 366 param->vdev_id = wlan_vdev_get_id(vdev); 367 param->assoc_id = mlme_obj->proto.sta.assoc_id; 368 mbss = &mlme_obj->mgmt.mbss_11ax; 369 if (mbss->profile_idx) { 370 param->profile_idx = mbss->profile_idx; 371 param->profile_num = mbss->profile_num; 372 qdf_mem_copy(param->trans_bssid, mbss->trans_bssid, 373 QDF_MAC_ADDR_SIZE); 374 } 375 376 return QDF_STATUS_SUCCESS; 377 } 378 379 QDF_STATUS vdev_mgr_up_send(struct vdev_mlme_obj *mlme_obj) 380 { 381 QDF_STATUS status; 382 struct vdev_up_params param = {0}; 383 struct sta_ps_params ps_param = {0}; 384 struct beacon_tmpl_params bcn_tmpl_param = {0}; 385 enum QDF_OPMODE opmode; 386 struct wlan_objmgr_vdev *vdev; 387 struct config_fils_params fils_param = {0}; 388 uint8_t is_6g_sap_fd_enabled; 389 bool is_non_tx_vdev; 390 391 if (!mlme_obj) { 392 mlme_err("VDEV_MLME is NULL"); 393 return QDF_STATUS_E_INVAL; 394 } 395 396 vdev = mlme_obj->vdev; 397 if (!vdev) { 398 mlme_err("VDEV is NULL"); 399 return QDF_STATUS_E_INVAL; 400 } 401 402 vdev_mgr_up_param_update(mlme_obj, ¶m); 403 vdev_mgr_bcn_tmpl_param_update(mlme_obj, &bcn_tmpl_param); 404 405 opmode = wlan_vdev_mlme_get_opmode(vdev); 406 if (opmode == QDF_STA_MODE) { 407 vdev_mgr_sta_ps_param_update(mlme_obj, &ps_param); 408 status = tgt_vdev_mgr_sta_ps_param_send(mlme_obj, &ps_param); 409 410 } 411 412 status = tgt_vdev_mgr_beacon_tmpl_send(mlme_obj, &bcn_tmpl_param); 413 if (QDF_IS_STATUS_ERROR(status)) 414 return status; 415 416 status = tgt_vdev_mgr_up_send(mlme_obj, ¶m); 417 if (QDF_IS_STATUS_ERROR(status)) 418 return status; 419 420 is_6g_sap_fd_enabled = wlan_vdev_mlme_feat_ext_cap_get(vdev, 421 WLAN_VDEV_FEXT_FILS_DISC_6G_SAP); 422 mlme_debug("SAP FD enabled %d", is_6g_sap_fd_enabled); 423 424 /* 425 * In case of a non-tx vdev, 'profile_num' must be greater 426 * than 0 indicating one or more non-tx vdev and 'profile_idx' 427 * must be in the range [1, 2^n] where n is the max bssid 428 * indicator 429 */ 430 is_non_tx_vdev = param.profile_num && param.profile_idx; 431 432 if (opmode == QDF_SAP_MODE && mlme_obj->vdev->vdev_mlme.des_chan && 433 WLAN_REG_IS_6GHZ_CHAN_FREQ( 434 mlme_obj->vdev->vdev_mlme.des_chan->ch_freq) && 435 !is_non_tx_vdev) { 436 fils_param.vdev_id = wlan_vdev_get_id(mlme_obj->vdev); 437 if (is_6g_sap_fd_enabled) { 438 fils_param.fd_period = DEFAULT_FILS_DISCOVERY_PERIOD; 439 } else { 440 fils_param.send_prb_rsp_frame = true; 441 fils_param.fd_period = DEFAULT_PROBE_RESP_PERIOD; 442 } 443 status = tgt_vdev_mgr_fils_enable_send(mlme_obj, 444 &fils_param); 445 } 446 447 return status; 448 } 449 450 static QDF_STATUS vdev_mgr_down_param_update( 451 struct vdev_mlme_obj *mlme_obj, 452 struct vdev_down_params *param) 453 { 454 struct wlan_objmgr_vdev *vdev; 455 456 vdev = mlme_obj->vdev; 457 if (!vdev) { 458 mlme_err("VDEV is NULL"); 459 return QDF_STATUS_E_INVAL; 460 } 461 462 param->vdev_id = wlan_vdev_get_id(vdev); 463 464 return QDF_STATUS_SUCCESS; 465 } 466 467 QDF_STATUS vdev_mgr_down_send(struct vdev_mlme_obj *mlme_obj) 468 { 469 QDF_STATUS status; 470 struct vdev_down_params param = {0}; 471 472 if (!mlme_obj) { 473 mlme_err("VDEV_MLME is NULL"); 474 return QDF_STATUS_E_INVAL; 475 } 476 477 status = vdev_mgr_down_param_update(mlme_obj, ¶m); 478 if (QDF_IS_STATUS_ERROR(status)) { 479 mlme_err("Param Update Error: %d", status); 480 return status; 481 } 482 483 status = tgt_vdev_mgr_down_send(mlme_obj, ¶m); 484 485 return status; 486 } 487 488 static QDF_STATUS vdev_mgr_peer_flush_tids_param_update( 489 struct vdev_mlme_obj *mlme_obj, 490 struct peer_flush_params *param, 491 uint8_t *mac, 492 uint32_t peer_tid_bitmap) 493 { 494 struct wlan_objmgr_vdev *vdev; 495 496 vdev = mlme_obj->vdev; 497 if (!vdev) { 498 mlme_err("VDEV is NULL"); 499 return QDF_STATUS_E_INVAL; 500 } 501 502 param->vdev_id = wlan_vdev_get_id(vdev); 503 param->peer_tid_bitmap = peer_tid_bitmap; 504 qdf_mem_copy(param->peer_mac, mac, QDF_MAC_ADDR_SIZE); 505 return QDF_STATUS_SUCCESS; 506 } 507 508 QDF_STATUS vdev_mgr_peer_flush_tids_send(struct vdev_mlme_obj *mlme_obj, 509 uint8_t *mac, 510 uint32_t peer_tid_bitmap) 511 { 512 QDF_STATUS status; 513 struct peer_flush_params param = {0}; 514 515 if (!mlme_obj || !mac) { 516 mlme_err("Invalid input"); 517 return QDF_STATUS_E_INVAL; 518 } 519 520 status = vdev_mgr_peer_flush_tids_param_update(mlme_obj, ¶m, 521 mac, peer_tid_bitmap); 522 if (QDF_IS_STATUS_ERROR(status)) { 523 mlme_err("Param Update Error: %d", status); 524 return status; 525 } 526 527 status = tgt_vdev_mgr_peer_flush_tids_send(mlme_obj, ¶m); 528 529 return status; 530 } 531 532 static QDF_STATUS vdev_mgr_multiple_restart_param_update( 533 struct wlan_objmgr_pdev *pdev, 534 struct mlme_channel_param *chan, 535 uint32_t disable_hw_ack, 536 uint32_t *vdev_ids, 537 uint32_t num_vdevs, 538 struct vdev_mlme_mvr_param *mvr_param, 539 struct multiple_vdev_restart_params *param) 540 { 541 param->pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 542 param->requestor_id = MULTIPLE_VDEV_RESTART_REQ_ID; 543 param->disable_hw_ack = disable_hw_ack; 544 param->cac_duration_ms = WLAN_DFS_WAIT_MS; 545 param->num_vdevs = num_vdevs; 546 547 qdf_mem_copy(param->vdev_ids, vdev_ids, 548 sizeof(uint32_t) * (param->num_vdevs)); 549 qdf_mem_copy(¶m->ch_param, chan, 550 sizeof(struct mlme_channel_param)); 551 qdf_mem_copy(param->mvr_param, mvr_param, 552 sizeof(*mvr_param) * (param->num_vdevs)); 553 554 return QDF_STATUS_SUCCESS; 555 } 556 557 QDF_STATUS vdev_mgr_multiple_restart_send(struct wlan_objmgr_pdev *pdev, 558 struct mlme_channel_param *chan, 559 uint32_t disable_hw_ack, 560 uint32_t *vdev_ids, 561 uint32_t num_vdevs, 562 struct vdev_mlme_mvr_param *mvr_param) 563 { 564 struct multiple_vdev_restart_params param = {0}; 565 566 vdev_mgr_multiple_restart_param_update(pdev, chan, 567 disable_hw_ack, 568 vdev_ids, num_vdevs, 569 mvr_param, ¶m); 570 571 return tgt_vdev_mgr_multiple_vdev_restart_send(pdev, ¶m); 572 } 573 574 qdf_export_symbol(vdev_mgr_multiple_restart_send); 575 576 static QDF_STATUS vdev_mgr_set_custom_aggr_size_param_update( 577 struct vdev_mlme_obj *mlme_obj, 578 struct set_custom_aggr_size_params *param, 579 bool is_amsdu) 580 { 581 struct wlan_objmgr_vdev *vdev; 582 583 vdev = mlme_obj->vdev; 584 if (!vdev) { 585 mlme_err("VDEV is NULL"); 586 return QDF_STATUS_E_INVAL; 587 } 588 589 param->aggr_type = is_amsdu ? WLAN_MLME_CUSTOM_AGGR_TYPE_AMSDU 590 : WLAN_MLME_CUSTOM_AGGR_TYPE_AMPDU; 591 /* 592 * We are only setting TX params, therefore 593 * we are disabling rx_aggr_size 594 */ 595 param->rx_aggr_size_disable = true; 596 param->tx_aggr_size = is_amsdu ? mlme_obj->mgmt.generic.amsdu 597 : mlme_obj->mgmt.generic.ampdu; 598 param->vdev_id = wlan_vdev_get_id(vdev); 599 600 return QDF_STATUS_SUCCESS; 601 } 602 603 QDF_STATUS vdev_mgr_set_custom_aggr_size_send( 604 struct vdev_mlme_obj *vdev_mlme, 605 bool is_amsdu) 606 { 607 QDF_STATUS status; 608 struct set_custom_aggr_size_params param = {0}; 609 610 status = vdev_mgr_set_custom_aggr_size_param_update(vdev_mlme, 611 ¶m, is_amsdu); 612 if (QDF_IS_STATUS_ERROR(status)) { 613 mlme_err("Param Update Error: %d", status); 614 return status; 615 } 616 617 return tgt_vdev_mgr_set_custom_aggr_size_send(vdev_mlme, ¶m); 618 } 619 620 static QDF_STATUS vdev_mgr_peer_delete_all_param_update( 621 struct vdev_mlme_obj *mlme_obj, 622 struct peer_delete_all_params *param) 623 { 624 struct wlan_objmgr_vdev *vdev; 625 626 vdev = mlme_obj->vdev; 627 if (!vdev) { 628 mlme_err("VDEV is NULL"); 629 return QDF_STATUS_E_INVAL; 630 } 631 632 param->vdev_id = wlan_vdev_get_id(vdev); 633 return QDF_STATUS_SUCCESS; 634 } 635 636 QDF_STATUS vdev_mgr_peer_delete_all_send(struct vdev_mlme_obj *mlme_obj) 637 { 638 QDF_STATUS status; 639 struct peer_delete_all_params param = {0}; 640 641 if (!mlme_obj) { 642 mlme_err("Invalid input"); 643 return QDF_STATUS_E_INVAL; 644 } 645 646 status = vdev_mgr_peer_delete_all_param_update(mlme_obj, ¶m); 647 if (QDF_IS_STATUS_ERROR(status)) { 648 mlme_err("Param Update Error: %d", status); 649 return status; 650 } 651 652 status = tgt_vdev_mgr_peer_delete_all_send(mlme_obj, ¶m); 653 654 return status; 655 } 656 657