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