1 /* 2 * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: target_if_vdev_mgr_tx_ops.c 22 * 23 * This file provide definition for APIs registered through lmac Tx Ops 24 */ 25 #include <wlan_objmgr_pdev_obj.h> 26 #include <wlan_objmgr_vdev_obj.h> 27 #include <wmi_unified_api.h> 28 #include <wmi_unified_param.h> 29 #include <init_deinit_lmac.h> 30 #include <target_if_vdev_mgr_tx_ops.h> 31 #include <target_if_vdev_mgr_rx_ops.h> 32 #include <target_if.h> 33 #include <target_type.h> 34 #include <wlan_mlme_dbg.h> 35 #include <wlan_vdev_mgr_tgt_if_tx_defs.h> 36 #include <wlan_vdev_mgr_utils_api.h> 37 #include <wlan_cmn.h> 38 #include <wmi_unified_vdev_api.h> 39 #include <cdp_txrx_ctrl.h> 40 #include <target_if_psoc_timer_tx_ops.h> 41 #include <target_if_psoc_wake_lock.h> 42 43 static QDF_STATUS target_if_vdev_mgr_register_event_handler( 44 struct wlan_objmgr_psoc *psoc) 45 { 46 return target_if_vdev_mgr_wmi_event_register(psoc); 47 } 48 49 static QDF_STATUS target_if_vdev_mgr_unregister_event_handler( 50 struct wlan_objmgr_psoc *psoc) 51 { 52 return target_if_vdev_mgr_wmi_event_unregister(psoc); 53 } 54 55 QDF_STATUS 56 target_if_vdev_mgr_rsp_timer_stop(struct wlan_objmgr_psoc *psoc, 57 struct vdev_response_timer *vdev_rsp, 58 enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit) 59 { 60 struct wlan_lmac_if_mlme_tx_ops *txops; 61 62 txops = target_if_vdev_mgr_get_tx_ops(psoc); 63 if (!txops || !txops->psoc_vdev_rsp_timer_deinit) { 64 mlme_err("Failed to get mlme txrx_ops VDEV_%d PSOC_%d", 65 vdev_rsp->vdev_id, wlan_psoc_get_id(psoc)); 66 return QDF_STATUS_E_FAILURE; 67 } 68 69 if (qdf_atomic_test_and_clear_bit(clear_bit, &vdev_rsp->rsp_status)) { 70 /* 71 * This is triggered from timer expiry case only for 72 * which timer stop is not required 73 */ 74 if (vdev_rsp->timer_status == QDF_STATUS_E_TIMEOUT) { 75 if (clear_bit == DELETE_RESPONSE_BIT) { 76 qdf_atomic_set(&vdev_rsp->rsp_timer_inuse, 0); 77 vdev_rsp->psoc = NULL; 78 } 79 } else { 80 if (clear_bit == DELETE_RESPONSE_BIT) { 81 txops->psoc_vdev_rsp_timer_deinit(psoc, 82 vdev_rsp->vdev_id); 83 } else { 84 qdf_timer_stop(&vdev_rsp->rsp_timer); 85 } 86 } 87 88 /* 89 * Reset the timer_status to clear any error state. As this 90 * variable is persistent, any leftover error status can cause 91 * undesirable effects. 92 */ 93 vdev_rsp->timer_status = QDF_STATUS_SUCCESS; 94 /* 95 * Releasing reference taken at the time of 96 * starting response timer 97 */ 98 wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID); 99 return QDF_STATUS_SUCCESS; 100 } 101 return QDF_STATUS_E_FAILURE; 102 } 103 104 QDF_STATUS 105 target_if_vdev_mgr_rsp_timer_start(struct wlan_objmgr_psoc *psoc, 106 struct vdev_response_timer *vdev_rsp, 107 enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit) 108 { 109 uint8_t rsp_pos; 110 uint8_t vdev_id; 111 112 /* it is expected to be only one command with FW at a time */ 113 for (rsp_pos = START_RESPONSE_BIT; rsp_pos <= RESPONSE_BIT_MAX; 114 rsp_pos++) { 115 if (rsp_pos != set_bit) { 116 if (qdf_atomic_test_bit(rsp_pos, 117 &vdev_rsp->rsp_status)) { 118 vdev_id = vdev_rsp->vdev_id; 119 mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", 120 wlan_psoc_get_id(psoc), 121 vdev_id, 122 string_from_rsp_bit(set_bit), 123 string_from_rsp_bit(rsp_pos)); 124 target_if_vdev_mgr_assert_mgmt(psoc, 125 vdev_id); 126 target_if_vdev_mgr_rsp_timer_stop(psoc, 127 vdev_rsp, 128 rsp_pos); 129 } 130 } 131 } 132 133 if (qdf_atomic_test_and_set_bit(set_bit, &vdev_rsp->rsp_status)) { 134 mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", 135 wlan_psoc_get_id(psoc), 136 vdev_rsp->vdev_id, string_from_rsp_bit(set_bit), 137 string_from_rsp_bit(set_bit)); 138 target_if_vdev_mgr_assert_mgmt(psoc, vdev_rsp->vdev_id); 139 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, set_bit); 140 141 qdf_atomic_set_bit(set_bit, &vdev_rsp->rsp_status); 142 } 143 144 /* reference taken for timer start, will be released with stop */ 145 wlan_objmgr_psoc_get_ref(psoc, WLAN_PSOC_TARGET_IF_ID); 146 qdf_timer_start(&vdev_rsp->rsp_timer, vdev_rsp->expire_time); 147 148 return QDF_STATUS_SUCCESS; 149 } 150 151 152 struct wmi_unified 153 *target_if_vdev_mgr_wmi_handle_get(struct wlan_objmgr_vdev *vdev) 154 { 155 struct wlan_objmgr_pdev *pdev; 156 struct wmi_unified *wmi_handle; 157 158 pdev = wlan_vdev_get_pdev(vdev); 159 if (!pdev) { 160 mlme_err("PDEV is NULL"); 161 return NULL; 162 } 163 164 wmi_handle = get_wmi_unified_hdl_from_pdev(pdev); 165 if (!wmi_handle) { 166 mlme_err("wmi_handle is null"); 167 return NULL; 168 } 169 170 return wmi_handle; 171 } 172 173 static inline uint32_t 174 target_if_vdev_mlme_build_txbf_caps(struct wlan_objmgr_vdev *vdev) 175 { 176 uint32_t txbf_cap; 177 uint32_t subfer; 178 uint32_t mubfer; 179 uint32_t subfee; 180 uint32_t mubfee; 181 uint32_t implicit_bf; 182 uint32_t sounding_dimension; 183 uint32_t bfee_sts_cap; 184 185 txbf_cap = 0; 186 /* 187 * ensure to set these after mlme component is attached to objmgr 188 */ 189 wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_SUBFEE, &subfee); 190 wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_MUBFEE, &mubfee); 191 wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_SUBFER, &subfer); 192 wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_MUBFER, &mubfer); 193 wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_BFEE_STS_CAP, 194 &bfee_sts_cap); 195 wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_IMLICIT_BF, 196 &implicit_bf); 197 wlan_util_vdev_get_param(vdev, WLAN_MLME_CFG_SOUNDING_DIM, 198 &sounding_dimension); 199 200 WMI_HOST_TXBF_CONF_SU_TX_BFEE_SET(txbf_cap, subfee); 201 WMI_HOST_TXBF_CONF_MU_TX_BFEE_SET(txbf_cap, mubfee); 202 WMI_HOST_TXBF_CONF_SU_TX_BFER_SET(txbf_cap, subfer); 203 WMI_HOST_TXBF_CONF_MU_TX_BFER_SET(txbf_cap, mubfer); 204 WMI_HOST_TXBF_CONF_STS_CAP_SET(txbf_cap, bfee_sts_cap); 205 WMI_HOST_TXBF_CONF_IMPLICIT_BF_SET(txbf_cap, implicit_bf); 206 WMI_HOST_TXBF_CONF_BF_SND_DIM_SET(txbf_cap, sounding_dimension); 207 208 mlme_debug("VHT su bfee:%d mu bfee:%d su bfer:%d " 209 "mu bfer:%d impl bf:%d sounding dim:%d", 210 WMI_HOST_TXBF_CONF_SU_TX_BFEE_GET(txbf_cap), 211 WMI_HOST_TXBF_CONF_MU_TX_BFEE_GET(txbf_cap), 212 WMI_HOST_TXBF_CONF_SU_TX_BFER_GET(txbf_cap), 213 WMI_HOST_TXBF_CONF_MU_TX_BFER_GET(txbf_cap), 214 WMI_HOST_TXBF_CONF_IMPLICIT_BF_GET(txbf_cap), 215 WMI_HOST_TXBF_CONF_BF_SND_DIM_GET(txbf_cap)); 216 217 return txbf_cap; 218 } 219 220 static inline uint32_t 221 target_if_vdev_mlme_id_2_wmi(uint32_t cfg_id) 222 { 223 int wmi_id; 224 225 switch (cfg_id) { 226 case WLAN_MLME_CFG_DTIM_PERIOD: 227 wmi_id = wmi_vdev_param_dtim_period; 228 break; 229 case WLAN_MLME_CFG_SLOT_TIME: 230 wmi_id = wmi_vdev_param_slot_time; 231 break; 232 case WLAN_MLME_CFG_PROTECTION_MODE: 233 wmi_id = wmi_vdev_param_protection_mode; 234 break; 235 case WLAN_MLME_CFG_BEACON_INTERVAL: 236 wmi_id = wmi_vdev_param_beacon_interval; 237 break; 238 case WLAN_MLME_CFG_LDPC: 239 wmi_id = wmi_vdev_param_ldpc; 240 break; 241 case WLAN_MLME_CFG_NSS: 242 wmi_id = wmi_vdev_param_nss; 243 break; 244 case WLAN_MLME_CFG_SUBFER: 245 case WLAN_MLME_CFG_MUBFER: 246 case WLAN_MLME_CFG_SUBFEE: 247 case WLAN_MLME_CFG_MUBFEE: 248 case WLAN_MLME_CFG_IMLICIT_BF: 249 case WLAN_MLME_CFG_SOUNDING_DIM: 250 case WLAN_MLME_CFG_TXBF_CAPS: 251 wmi_id = wmi_vdev_param_txbf; 252 break; 253 case WLAN_MLME_CFG_HE_OPS: 254 wmi_id = wmi_vdev_param_set_heop; 255 break; 256 #ifdef WLAN_FEATURE_11BE 257 case WLAN_MLME_CFG_EHT_OPS: 258 wmi_id = wmi_vdev_param_set_ehtop; 259 break; 260 #endif 261 case WLAN_MLME_CFG_RTS_THRESHOLD: 262 wmi_id = wmi_vdev_param_rts_threshold; 263 break; 264 case WLAN_MLME_CFG_FRAG_THRESHOLD: 265 wmi_id = wmi_vdev_param_fragmentation_threshold; 266 break; 267 case WLAN_MLME_CFG_DROP_UNENCRY: 268 wmi_id = wmi_vdev_param_drop_unencry; 269 break; 270 case WLAN_MLME_CFG_TX_POWER: 271 wmi_id = wmi_vdev_param_tx_power; 272 break; 273 case WLAN_MLME_CFG_AMPDU: 274 wmi_id = wmi_vdev_param_ampdu_subframe_size_per_ac; 275 break; 276 case WLAN_MLME_CFG_AMSDU: 277 wmi_id = wmi_vdev_param_amsdu_subframe_size_per_ac; 278 break; 279 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 280 wmi_id = 281 wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs; 282 break; 283 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 284 wmi_id = 285 wmi_vdev_param_ap_keepalive_max_idle_inactive_time_secs; 286 break; 287 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 288 wmi_id = 289 wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs; 290 break; 291 case WLAN_MLME_CFG_UAPSD: 292 wmi_id = WMI_HOST_STA_PS_PARAM_UAPSD; 293 break; 294 case WLAN_MLME_CFG_BCN_TX_RATE_CODE: 295 wmi_id = wmi_vdev_param_beacon_rate; 296 break; 297 case WLAN_MLME_CFG_TX_MGMT_RATE_CODE: 298 wmi_id = wmi_vdev_param_mgmt_rate; 299 break; 300 case WLAN_MLME_CFG_LISTEN_INTERVAL: 301 wmi_id = wmi_vdev_param_listen_interval; 302 break; 303 case WLAN_MLME_CFG_ENABLE_MULTI_GROUP_KEY: 304 wmi_id = wmi_vdev_param_enable_multi_group_key; 305 break; 306 case WLAN_MLME_CFG_MAX_GROUP_KEYS: 307 wmi_id = wmi_vdev_param_max_group_keys; 308 break; 309 case WLAN_MLME_CFG_TX_ENCAP_TYPE: 310 wmi_id = wmi_vdev_param_tx_encap_type; 311 break; 312 case WLAN_MLME_CFG_RX_DECAP_TYPE: 313 wmi_id = wmi_vdev_param_rx_decap_type; 314 break; 315 case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_RESPONDER_ROLE: 316 wmi_id = wmi_vdev_param_enable_disable_rtt_responder_role; 317 break; 318 case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_INITIATOR_ROLE: 319 wmi_id = wmi_vdev_param_enable_disable_rtt_initiator_role; 320 break; 321 default: 322 wmi_id = cfg_id; 323 break; 324 } 325 326 return wmi_id; 327 } 328 329 static 330 QDF_STATUS target_if_vdev_set_tx_rx_decap_type(struct wlan_objmgr_vdev *vdev, 331 enum wlan_mlme_cfg_id param_id, 332 uint32_t value) 333 { 334 ol_txrx_soc_handle soc_txrx_handle; 335 struct wlan_objmgr_psoc *psoc; 336 uint8_t vdev_id = wlan_vdev_get_id(vdev); 337 cdp_config_param_type val = {0}; 338 339 psoc = wlan_vdev_get_psoc(vdev); 340 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 341 342 if (!soc_txrx_handle) 343 return QDF_STATUS_E_INVAL; 344 345 if (param_id == WLAN_MLME_CFG_TX_ENCAP_TYPE) { 346 val.cdp_vdev_param_tx_encap = value; 347 return cdp_txrx_set_vdev_param(soc_txrx_handle, 348 vdev_id, CDP_TX_ENCAP_TYPE, 349 val); 350 } else if (param_id == WLAN_MLME_CFG_RX_DECAP_TYPE) { 351 val.cdp_vdev_param_rx_decap = value; 352 return cdp_txrx_set_vdev_param(soc_txrx_handle, 353 vdev_id, CDP_RX_DECAP_TYPE, 354 val); 355 } 356 357 return QDF_STATUS_SUCCESS; 358 } 359 360 static QDF_STATUS target_if_vdev_mgr_set_param_send( 361 struct wlan_objmgr_vdev *vdev, 362 struct vdev_set_params *param) 363 { 364 QDF_STATUS status; 365 struct wmi_unified *wmi_handle; 366 int param_id; 367 368 if (!vdev || !param) { 369 mlme_err("Invalid input"); 370 return QDF_STATUS_E_INVAL; 371 } 372 373 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 374 if (!wmi_handle) { 375 mlme_err("Failed to get WMI handle!"); 376 return QDF_STATUS_E_INVAL; 377 } 378 379 param_id = target_if_vdev_mlme_id_2_wmi(param->param_id); 380 param->param_id = param_id; 381 if (param->param_id == wmi_vdev_param_txbf) 382 param->param_value = target_if_vdev_mlme_build_txbf_caps(vdev); 383 status = wmi_unified_vdev_set_param_send(wmi_handle, param); 384 385 return status; 386 } 387 388 static QDF_STATUS target_if_vdev_mgr_create_send( 389 struct wlan_objmgr_vdev *vdev, 390 struct vdev_create_params *param) 391 { 392 QDF_STATUS status; 393 struct wmi_unified *wmi_handle; 394 uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0}; 395 struct wlan_lmac_if_mlme_tx_ops *txops; 396 struct wlan_objmgr_psoc *psoc; 397 uint8_t vdev_id; 398 399 if (!vdev || !param) { 400 mlme_err("Invalid input"); 401 return QDF_STATUS_E_INVAL; 402 } 403 404 psoc = wlan_vdev_get_psoc(vdev); 405 if (!psoc) { 406 mlme_err("Failed to get psoc for VDEV_%d", 407 wlan_vdev_get_id(vdev)); 408 return QDF_STATUS_E_INVAL; 409 } 410 411 txops = wlan_mlme_get_lmac_tx_ops(psoc); 412 if (!txops || !txops->psoc_vdev_rsp_timer_init) { 413 mlme_err("Failed to get mlme txrx_ops for VDEV_%d PSOC_%d", 414 wlan_vdev_get_id(vdev), wlan_psoc_get_id(psoc)); 415 return QDF_STATUS_E_INVAL; 416 } 417 418 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 419 if (!wmi_handle) { 420 mlme_err("Failed to get WMI handle!"); 421 return QDF_STATUS_E_INVAL; 422 } 423 424 WLAN_ADDR_COPY(vap_addr, wlan_vdev_mlme_get_macaddr(vdev)); 425 status = wmi_unified_vdev_create_send(wmi_handle, vap_addr, 426 param); 427 428 vdev_id = wlan_vdev_get_id(vdev); 429 if (QDF_IS_STATUS_SUCCESS(status)) 430 status = txops->psoc_vdev_rsp_timer_init(psoc, vdev_id); 431 432 return status; 433 } 434 435 static QDF_STATUS target_if_vdev_mgr_start_send( 436 struct wlan_objmgr_vdev *vdev, 437 struct vdev_start_params *param) 438 { 439 QDF_STATUS status; 440 struct wmi_unified *wmi_handle; 441 struct wlan_objmgr_psoc *psoc; 442 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 443 uint8_t vdev_id; 444 struct vdev_response_timer *vdev_rsp; 445 446 if (!vdev || !param) { 447 mlme_err("Invalid input"); 448 return QDF_STATUS_E_INVAL; 449 } 450 451 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 452 if (!wmi_handle) { 453 mlme_err("Failed to get WMI handle!"); 454 return QDF_STATUS_E_INVAL; 455 } 456 457 vdev_id = wlan_vdev_get_id(vdev); 458 psoc = wlan_vdev_get_psoc(vdev); 459 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 460 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 461 mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id, 462 wlan_psoc_get_id(psoc)); 463 return QDF_STATUS_E_INVAL; 464 } 465 466 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 467 if (!vdev_rsp) { 468 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 469 wlan_psoc_get_id(psoc)); 470 return QDF_STATUS_E_INVAL; 471 } 472 473 vdev_rsp->expire_time = START_RESPONSE_TIMER; 474 target_if_wake_lock_timeout_acquire(psoc, START_WAKELOCK); 475 476 if (param->is_restart) 477 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 478 RESTART_RESPONSE_BIT); 479 else 480 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 481 START_RESPONSE_BIT); 482 483 status = wmi_unified_vdev_start_send(wmi_handle, param); 484 if (QDF_IS_STATUS_ERROR(status)) { 485 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 486 vdev_rsp->expire_time = 0; 487 target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); 488 if (param->is_restart) 489 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 490 RESTART_RESPONSE_BIT); 491 else 492 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 493 START_RESPONSE_BIT); 494 } else { 495 target_if_vdev_start_link_handler(vdev, 496 param->is_restart); 497 } 498 return status; 499 } 500 501 static QDF_STATUS target_if_vdev_mgr_delete_response_send( 502 struct wlan_objmgr_vdev *vdev, 503 struct wlan_lmac_if_mlme_rx_ops *rx_ops) 504 { 505 QDF_STATUS status = QDF_STATUS_SUCCESS; 506 struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev); 507 struct vdev_delete_response rsp = {0}; 508 509 rsp.vdev_id = wlan_vdev_get_id(vdev); 510 status = rx_ops->vdev_mgr_delete_response(psoc, &rsp); 511 target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK); 512 513 return status; 514 } 515 516 static QDF_STATUS target_if_vdev_mgr_delete_send( 517 struct wlan_objmgr_vdev *vdev, 518 struct vdev_delete_params *param) 519 { 520 QDF_STATUS status; 521 struct wlan_objmgr_psoc *psoc; 522 struct wmi_unified *wmi_handle; 523 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 524 uint8_t vdev_id; 525 struct vdev_response_timer *vdev_rsp; 526 527 if (!vdev || !param) { 528 mlme_err("Invalid input"); 529 return QDF_STATUS_E_INVAL; 530 } 531 532 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 533 if (!wmi_handle) { 534 mlme_err("Failed to get WMI handle!"); 535 return QDF_STATUS_E_INVAL; 536 } 537 538 vdev_id = wlan_vdev_get_id(vdev); 539 psoc = wlan_vdev_get_psoc(vdev); 540 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 541 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 542 mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, 543 wlan_psoc_get_id(psoc)); 544 return QDF_STATUS_E_INVAL; 545 } 546 547 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 548 if (!vdev_rsp) { 549 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 550 wlan_psoc_get_id(psoc)); 551 return QDF_STATUS_E_INVAL; 552 } 553 554 vdev_rsp->expire_time = DELETE_RESPONSE_TIMER; 555 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 556 DELETE_RESPONSE_BIT); 557 target_if_wake_lock_timeout_acquire(psoc, DELETE_WAKELOCK); 558 559 status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id); 560 if (QDF_IS_STATUS_SUCCESS(status)) { 561 /* 562 * Simulate delete response if target doesn't support 563 */ 564 if (!wmi_service_enabled(wmi_handle, 565 wmi_service_sync_delete_cmds) || 566 wlan_psoc_nif_feat_cap_get(psoc, 567 WLAN_SOC_F_TESTMODE_ENABLE)) { 568 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 569 DELETE_RESPONSE_BIT); 570 target_if_vdev_mgr_delete_response_send(vdev, rx_ops); 571 } 572 } else { 573 vdev_rsp->expire_time = 0; 574 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 575 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 576 DELETE_RESPONSE_BIT); 577 target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK); 578 } 579 return status; 580 } 581 582 static QDF_STATUS target_if_vdev_mgr_stop_send( 583 struct wlan_objmgr_vdev *vdev, 584 struct vdev_stop_params *param) 585 { 586 QDF_STATUS status; 587 struct wmi_unified *wmi_handle; 588 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 589 struct wlan_objmgr_psoc *psoc; 590 uint8_t vdev_id; 591 struct vdev_response_timer *vdev_rsp; 592 593 594 if (!vdev || !param) { 595 mlme_err("Invalid input"); 596 return QDF_STATUS_E_INVAL; 597 } 598 599 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 600 if (!wmi_handle) { 601 mlme_err("Failed to get WMI handle!"); 602 return QDF_STATUS_E_INVAL; 603 } 604 605 vdev_id = wlan_vdev_get_id(vdev); 606 psoc = wlan_vdev_get_psoc(vdev); 607 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 608 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 609 mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, 610 wlan_psoc_get_id(psoc)); 611 return QDF_STATUS_E_INVAL; 612 } 613 614 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 615 if (!vdev_rsp) { 616 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 617 wlan_psoc_get_id(psoc)); 618 return QDF_STATUS_E_INVAL; 619 } 620 621 vdev_rsp->expire_time = STOP_RESPONSE_TIMER; 622 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT); 623 /* 624 * START wakelock is acquired before sending the start command and 625 * released after sending up command to fw. This is to prevent the 626 * system to go into suspend state during the connection. 627 * In auth/assoc failure scenario UP command is not sent 628 * so release the START wakelock here. 629 */ 630 target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); 631 target_if_wake_lock_timeout_acquire(psoc, STOP_WAKELOCK); 632 633 status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id); 634 if (QDF_IS_STATUS_ERROR(status)) { 635 vdev_rsp->expire_time = 0; 636 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 637 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 638 STOP_RESPONSE_BIT); 639 target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK); 640 } else { 641 target_if_vdev_stop_link_handler(vdev); 642 } 643 return status; 644 } 645 646 static QDF_STATUS target_if_vdev_mgr_down_send( 647 struct wlan_objmgr_vdev *vdev, 648 struct vdev_down_params *param) 649 { 650 QDF_STATUS status; 651 struct wmi_unified *wmi_handle; 652 struct wlan_objmgr_psoc *psoc; 653 654 if (!vdev || !param) { 655 mlme_err("Invalid input"); 656 return QDF_STATUS_E_INVAL; 657 } 658 659 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 660 if (!wmi_handle) { 661 mlme_err("Failed to get WMI handle!"); 662 return QDF_STATUS_E_INVAL; 663 } 664 665 psoc = wlan_vdev_get_psoc(vdev); 666 if (!psoc) { 667 mlme_err("Failed to get PSOC Object"); 668 return QDF_STATUS_E_INVAL; 669 } 670 671 status = wmi_unified_vdev_down_send(wmi_handle, param->vdev_id); 672 target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK); 673 674 return status; 675 } 676 677 static QDF_STATUS target_if_vdev_mgr_up_send( 678 struct wlan_objmgr_vdev *vdev, 679 struct vdev_up_params *param) 680 { 681 QDF_STATUS status; 682 struct wmi_unified *wmi_handle; 683 uint8_t bssid[QDF_MAC_ADDR_SIZE]; 684 struct wlan_objmgr_psoc *psoc; 685 686 if (!vdev || !param) { 687 mlme_err("Invalid input"); 688 return QDF_STATUS_E_INVAL; 689 } 690 691 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 692 if (!wmi_handle) { 693 mlme_err("Failed to get WMI handle!"); 694 return QDF_STATUS_E_INVAL; 695 } 696 697 psoc = wlan_vdev_get_psoc(vdev); 698 if (!psoc) { 699 mlme_err("Failed to get PSOC Object"); 700 return QDF_STATUS_E_INVAL; 701 } 702 ucfg_wlan_vdev_mgr_get_param_bssid(vdev, bssid); 703 704 status = wmi_unified_vdev_up_send(wmi_handle, bssid, param); 705 target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); 706 707 return status; 708 } 709 710 static QDF_STATUS target_if_vdev_mgr_beacon_tmpl_send( 711 struct wlan_objmgr_vdev *vdev, 712 struct beacon_tmpl_params *param) 713 { 714 QDF_STATUS status; 715 struct wmi_unified *wmi_handle; 716 717 if (!vdev || !param) { 718 mlme_err("Invalid input"); 719 return QDF_STATUS_E_INVAL; 720 } 721 722 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 723 if (!wmi_handle) { 724 mlme_err("Failed to get WMI handle!"); 725 return QDF_STATUS_E_INVAL; 726 } 727 728 status = wmi_unified_beacon_tmpl_send_cmd(wmi_handle, param); 729 return status; 730 } 731 732 QDF_STATUS target_if_vdev_mgr_send_fd_tmpl(struct wlan_objmgr_vdev *vdev, 733 struct fils_discovery_tmpl_params *param) 734 { 735 QDF_STATUS status; 736 struct wmi_unified *wmi_handle; 737 738 if (!vdev || !param) { 739 mlme_err("Invalid input"); 740 return QDF_STATUS_E_INVAL; 741 } 742 743 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 744 if (!wmi_handle) { 745 mlme_err("Failed to get WMI handle!"); 746 return QDF_STATUS_E_INVAL; 747 } 748 749 status = wmi_unified_fd_tmpl_send_cmd(wmi_handle, param); 750 751 return status; 752 } 753 754 static QDF_STATUS target_if_vdev_mgr_set_nac_rssi_send( 755 struct wlan_objmgr_vdev *vdev, 756 struct vdev_scan_nac_rssi_params *param) 757 { 758 QDF_STATUS status; 759 struct wmi_unified *wmi_handle; 760 761 if (!vdev || !param) { 762 mlme_err("Invalid input"); 763 return QDF_STATUS_E_INVAL; 764 } 765 766 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 767 if (!wmi_handle) { 768 mlme_err("Failed to get WMI handle!"); 769 return QDF_STATUS_E_INVAL; 770 } 771 772 status = wmi_unified_vdev_set_nac_rssi_send(wmi_handle, param); 773 774 return status; 775 } 776 777 static QDF_STATUS target_if_vdev_mgr_set_neighbour_rx_cmd_send( 778 struct wlan_objmgr_vdev *vdev, 779 struct set_neighbour_rx_params *param, 780 uint8_t *mac) 781 { 782 QDF_STATUS status; 783 struct wmi_unified *wmi_handle; 784 785 if (!vdev || !param) { 786 mlme_err("Invalid input"); 787 return QDF_STATUS_E_INVAL; 788 } 789 790 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 791 if (!wmi_handle) { 792 mlme_err("Failed to get WMI handle!"); 793 return QDF_STATUS_E_INVAL; 794 } 795 796 status = wmi_unified_vdev_set_neighbour_rx_cmd_send(wmi_handle, 797 mac, param); 798 799 return status; 800 } 801 802 static QDF_STATUS target_if_vdev_mgr_sifs_trigger_send( 803 struct wlan_objmgr_vdev *vdev, 804 struct sifs_trigger_param *param) 805 { 806 QDF_STATUS status; 807 struct wmi_unified *wmi_handle; 808 809 if (!vdev || !param) { 810 mlme_err("Invalid input"); 811 return QDF_STATUS_E_INVAL; 812 } 813 814 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 815 if (!wmi_handle) { 816 mlme_err("Failed to get WMI handle!"); 817 return QDF_STATUS_E_INVAL; 818 } 819 820 status = wmi_unified_sifs_trigger_send(wmi_handle, param); 821 822 return status; 823 } 824 825 static QDF_STATUS target_if_vdev_mgr_set_custom_aggr_size_cmd_send( 826 struct wlan_objmgr_vdev *vdev, 827 struct set_custom_aggr_size_params *param) 828 { 829 QDF_STATUS status; 830 struct wmi_unified *wmi_handle; 831 832 if (!vdev || !param) { 833 mlme_err("Invalid input"); 834 return QDF_STATUS_E_INVAL; 835 } 836 837 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 838 if (!wmi_handle) { 839 mlme_err("Failed to get WMI handle!"); 840 return QDF_STATUS_E_INVAL; 841 } 842 843 status = wmi_unified_vdev_set_custom_aggr_size_cmd_send(wmi_handle, 844 param); 845 846 return status; 847 } 848 849 static QDF_STATUS target_if_vdev_mgr_config_ratemask_cmd_send( 850 struct wlan_objmgr_vdev *vdev, 851 struct config_ratemask_params *param) 852 { 853 QDF_STATUS status; 854 struct wmi_unified *wmi_handle; 855 856 if (!vdev || !param) { 857 mlme_err("Invalid input"); 858 return QDF_STATUS_E_INVAL; 859 } 860 861 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 862 if (!wmi_handle) { 863 mlme_err("Failed to get WMI handle!"); 864 return QDF_STATUS_E_INVAL; 865 } 866 867 status = wmi_unified_vdev_config_ratemask_cmd_send(wmi_handle, 868 param); 869 return status; 870 } 871 872 static QDF_STATUS target_if_vdev_mgr_peer_flush_tids_send( 873 struct wlan_objmgr_vdev *vdev, 874 struct peer_flush_params *param) 875 { 876 QDF_STATUS status; 877 struct wmi_unified *wmi_handle; 878 879 if (!vdev || !param) { 880 mlme_err("Invalid input"); 881 return QDF_STATUS_E_INVAL; 882 } 883 884 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 885 if (!wmi_handle) { 886 mlme_err("Failed to get WMI handle!"); 887 return QDF_STATUS_E_INVAL; 888 } 889 890 status = wmi_unified_peer_flush_tids_send(wmi_handle, param->peer_mac, 891 param); 892 893 return status; 894 } 895 896 static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref( 897 struct wlan_objmgr_pdev *pdev, 898 struct multiple_vdev_restart_params *param, 899 struct wlan_objmgr_vdev **vdev_list, 900 bool *vdev_timer_started) 901 { 902 struct wlan_objmgr_psoc *psoc; 903 struct wlan_objmgr_vdev *tvdev; 904 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 905 int32_t vdev_idx = -1; 906 int32_t last_vdev_idx = -1; 907 struct vdev_response_timer *vdev_rsp; 908 909 psoc = wlan_pdev_get_psoc(pdev); 910 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 911 912 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 913 mlme_err("VDEV_%d: No Rx Ops", vdev_idx); 914 return last_vdev_idx; 915 } 916 917 for (vdev_idx = 0; vdev_idx < param->num_vdevs ; vdev_idx++) { 918 vdev_list[vdev_idx] = wlan_objmgr_get_vdev_by_id_from_pdev( 919 pdev, 920 param->vdev_ids[vdev_idx], 921 WLAN_VDEV_TARGET_IF_ID); 922 tvdev = vdev_list[vdev_idx]; 923 if (!tvdev) { 924 mlme_err("VDEV_%d is NULL", vdev_idx); 925 return last_vdev_idx; 926 } 927 928 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info( 929 psoc, 930 wlan_vdev_get_id(tvdev)); 931 if (!vdev_rsp) { 932 wlan_objmgr_vdev_release_ref(tvdev, 933 WLAN_VDEV_TARGET_IF_ID); 934 vdev_list[vdev_idx] = NULL; 935 mlme_err("VDEV_%d PSOC_%d No vdev rsp timer", 936 vdev_idx, wlan_psoc_get_id(psoc)); 937 return last_vdev_idx; 938 } 939 940 last_vdev_idx = vdev_idx; 941 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 942 RESTART_RESPONSE_BIT); 943 vdev_timer_started[vdev_idx] = true; 944 } 945 946 return last_vdev_idx; 947 } 948 949 static void target_if_vdev_mgr_multi_vdev_restart_rel_ref( 950 struct wlan_objmgr_pdev *pdev, 951 struct wlan_objmgr_vdev **vdev_list, 952 bool *vdev_timer_started, 953 int32_t last_vdev_idx, 954 QDF_STATUS status) 955 { 956 struct wlan_objmgr_psoc *psoc; 957 struct wlan_objmgr_vdev *tvdev; 958 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 959 int32_t vdev_idx; 960 struct vdev_response_timer *vdev_rsp; 961 962 psoc = wlan_pdev_get_psoc(pdev); 963 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 964 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 965 mlme_err("VDEV_%d: No Rx Ops", last_vdev_idx); 966 return; 967 } 968 969 for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) { 970 tvdev = vdev_list[vdev_idx]; 971 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, 972 vdev_idx); 973 if (!vdev_rsp) { 974 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", 975 vdev_idx, wlan_psoc_get_id(psoc)); 976 return; 977 } 978 979 if (QDF_IS_STATUS_ERROR(status)) { 980 if (vdev_timer_started[vdev_idx]) { 981 target_if_vdev_mgr_rsp_timer_stop( 982 psoc, vdev_rsp, 983 RESTART_RESPONSE_BIT); 984 vdev_timer_started[vdev_idx] = false; 985 } 986 } 987 wlan_objmgr_vdev_release_ref(tvdev, 988 WLAN_VDEV_TARGET_IF_ID); 989 } 990 } 991 992 static QDF_STATUS target_if_vdev_mgr_multiple_vdev_restart_req_cmd( 993 struct wlan_objmgr_pdev *pdev, 994 struct multiple_vdev_restart_params *param) 995 { 996 QDF_STATUS status = QDF_STATUS_E_FAILURE; 997 struct wmi_unified *wmi_handle; 998 struct wlan_objmgr_psoc *psoc; 999 struct wlan_objmgr_vdev *vdev_list[WLAN_UMAC_PDEV_MAX_VDEVS] = {NULL}; 1000 bool vdev_timer_started[WLAN_UMAC_PDEV_MAX_VDEVS] = {false}; 1001 int32_t last_vdev_idx = -1; 1002 1003 if (!pdev || !param) { 1004 mlme_err("Invalid input"); 1005 return QDF_STATUS_E_INVAL; 1006 } 1007 1008 psoc = wlan_pdev_get_psoc(pdev); 1009 if (!psoc) { 1010 mlme_err("PSOC is NULL"); 1011 return QDF_STATUS_E_INVAL; 1012 } 1013 1014 wmi_handle = get_wmi_unified_hdl_from_pdev(pdev); 1015 if (!wmi_handle) { 1016 mlme_err("PDEV WMI Handle is NULL!"); 1017 return QDF_STATUS_E_INVAL; 1018 } 1019 1020 if (param->num_vdevs > WLAN_UMAC_PDEV_MAX_VDEVS) { 1021 mlme_err("param->num_vdevs: %u exceed the limit", 1022 param->num_vdevs); 1023 return QDF_STATUS_E_INVAL; 1024 } 1025 1026 last_vdev_idx = target_if_vdev_mgr_multi_vdev_restart_get_ref( 1027 pdev, param, 1028 vdev_list, 1029 vdev_timer_started); 1030 if (last_vdev_idx < 0 || (last_vdev_idx != (param->num_vdevs - 1))) { 1031 target_if_vdev_mgr_multi_vdev_restart_rel_ref( 1032 pdev, vdev_list, 1033 vdev_timer_started, 1034 last_vdev_idx, 1035 QDF_STATUS_E_FAILURE); 1036 return QDF_STATUS_E_INVAL; 1037 } 1038 1039 status = wmi_unified_send_multiple_vdev_restart_req_cmd(wmi_handle, 1040 param); 1041 1042 target_if_vdev_mgr_multi_vdev_restart_rel_ref( 1043 pdev, vdev_list, 1044 vdev_timer_started, 1045 last_vdev_idx, status); 1046 1047 return status; 1048 } 1049 1050 static QDF_STATUS target_if_vdev_mgr_multiple_vdev_set_param_cmd( 1051 struct wlan_objmgr_pdev *pdev, 1052 struct multiple_vdev_set_param *param) 1053 { 1054 QDF_STATUS status = QDF_STATUS_E_FAILURE; 1055 struct wmi_unified *wmi_handle; 1056 struct wlan_objmgr_psoc *psoc; 1057 int param_id; 1058 1059 if (!pdev || !param) { 1060 mlme_err("Invalid input"); 1061 return QDF_STATUS_E_INVAL; 1062 } 1063 1064 psoc = wlan_pdev_get_psoc(pdev); 1065 if (!psoc) { 1066 mlme_err("PSOC is NULL"); 1067 return QDF_STATUS_E_INVAL; 1068 } 1069 1070 wmi_handle = get_wmi_unified_hdl_from_pdev(pdev); 1071 if (!wmi_handle) { 1072 mlme_err("PDEV WMI Handle is NULL!"); 1073 return QDF_STATUS_E_INVAL; 1074 } 1075 1076 if (param->num_vdevs > WLAN_UMAC_PDEV_MAX_VDEVS) { 1077 mlme_err("param->num_vdevs: %u exceed the limit", 1078 param->num_vdevs); 1079 return QDF_STATUS_E_INVAL; 1080 } 1081 1082 param_id = target_if_vdev_mlme_id_2_wmi(param->param_id); 1083 param->param_id = param_id; 1084 1085 status = wmi_unified_send_multiple_vdev_set_param_cmd(wmi_handle, 1086 param); 1087 1088 return status; 1089 } 1090 1091 static QDF_STATUS target_if_vdev_mgr_beacon_send( 1092 struct wlan_objmgr_vdev *vdev, 1093 struct beacon_params *param) 1094 { 1095 QDF_STATUS status; 1096 struct wmi_unified *wmi_handle; 1097 1098 if (!vdev || !param) { 1099 mlme_err("Invalid input"); 1100 return QDF_STATUS_E_INVAL; 1101 } 1102 1103 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1104 if (!wmi_handle) { 1105 mlme_err("Failed to get WMI handle!"); 1106 return QDF_STATUS_E_INVAL; 1107 } 1108 1109 status = wmi_unified_beacon_send_cmd(wmi_handle, param); 1110 1111 return status; 1112 } 1113 1114 static QDF_STATUS target_if_vdev_mgr_sta_ps_param_send( 1115 struct wlan_objmgr_vdev *vdev, 1116 struct sta_ps_params *param) 1117 { 1118 QDF_STATUS status; 1119 struct wmi_unified *wmi_handle; 1120 int param_id; 1121 1122 if (!vdev || !param) { 1123 mlme_err("Invalid input"); 1124 return QDF_STATUS_E_INVAL; 1125 } 1126 1127 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1128 if (!wmi_handle) { 1129 mlme_err("Failed to get WMI handle!"); 1130 return QDF_STATUS_E_INVAL; 1131 } 1132 1133 param_id = target_if_vdev_mlme_id_2_wmi(param->param_id); 1134 param->param_id = param_id; 1135 1136 status = wmi_unified_sta_ps_cmd_send(wmi_handle, param); 1137 1138 return status; 1139 } 1140 1141 static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send( 1142 struct wlan_objmgr_vdev *vdev, 1143 struct peer_delete_all_params *param) 1144 { 1145 QDF_STATUS status; 1146 struct wmi_unified *wmi_handle; 1147 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 1148 struct wlan_objmgr_psoc *psoc; 1149 uint8_t vdev_id; 1150 struct vdev_response_timer *vdev_rsp; 1151 1152 if (!vdev || !param) { 1153 mlme_err("Invalid input"); 1154 return QDF_STATUS_E_INVAL; 1155 } 1156 1157 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1158 if (!wmi_handle) { 1159 mlme_err("Failed to get WMI handle!"); 1160 return QDF_STATUS_E_INVAL; 1161 } 1162 1163 vdev_id = wlan_vdev_get_id(vdev); 1164 psoc = wlan_vdev_get_psoc(vdev); 1165 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 1166 1167 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 1168 mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, 1169 wlan_psoc_get_id(psoc)); 1170 return QDF_STATUS_E_INVAL; 1171 } 1172 1173 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 1174 if (!vdev_rsp) { 1175 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 1176 wlan_psoc_get_id(psoc)); 1177 return QDF_STATUS_E_INVAL; 1178 } 1179 1180 vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER; 1181 vdev_rsp->peer_type_bitmap = param->peer_type_bitmap; 1182 1183 mlme_debug("VDEV_%d: PSOC_%d vdev delete all: bitmap:%d", vdev_id, 1184 wlan_psoc_get_id(psoc), vdev_rsp->peer_type_bitmap); 1185 1186 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 1187 PEER_DELETE_ALL_RESPONSE_BIT); 1188 1189 status = wmi_unified_peer_delete_all_send(wmi_handle, param); 1190 if (QDF_IS_STATUS_ERROR(status)) { 1191 vdev_rsp->expire_time = 0; 1192 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 1193 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 1194 PEER_DELETE_ALL_RESPONSE_BIT); 1195 } 1196 return status; 1197 } 1198 1199 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ) 1200 static QDF_STATUS target_if_vdev_mgr_fils_enable_send( 1201 struct wlan_objmgr_vdev *vdev, 1202 struct config_fils_params *param) 1203 { 1204 QDF_STATUS status; 1205 struct wmi_unified *wmi_handle; 1206 1207 if (!vdev || !param) { 1208 mlme_err("Invalid input"); 1209 return QDF_STATUS_E_INVAL; 1210 } 1211 1212 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1213 if (!wmi_handle) { 1214 mlme_err("Failed to get WMI handle!"); 1215 return QDF_STATUS_E_INVAL; 1216 } 1217 1218 status = wmi_unified_vdev_fils_enable_cmd_send(wmi_handle, param); 1219 1220 return status; 1221 } 1222 1223 static void target_if_vdev_register_tx_fils( 1224 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops) 1225 { 1226 mlme_tx_ops->vdev_fils_enable_send = 1227 target_if_vdev_mgr_fils_enable_send; 1228 } 1229 #else 1230 static void target_if_vdev_register_tx_fils( 1231 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops) 1232 { 1233 } 1234 #endif 1235 1236 #ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE 1237 static QDF_STATUS 1238 target_if_vdev_mgr_set_mac_address_send(struct qdf_mac_addr mac_addr, 1239 struct qdf_mac_addr mld_addr, 1240 struct wlan_objmgr_vdev *vdev) 1241 { 1242 struct set_mac_addr_params params = {0}; 1243 struct wmi_unified *wmi_handle; 1244 1245 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1246 if (!wmi_handle) { 1247 mlme_err("Failed to get WMI handle!"); 1248 return QDF_STATUS_E_INVAL; 1249 } 1250 1251 params.vdev_id = wlan_vdev_get_id(vdev); 1252 params.mac_addr = mac_addr; 1253 params.mld_addr = mld_addr; 1254 1255 return wmi_unified_send_set_mac_addr(wmi_handle, ¶ms); 1256 } 1257 1258 static void target_if_vdev_register_set_mac_address( 1259 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops) 1260 { 1261 mlme_tx_ops->vdev_send_set_mac_addr = 1262 target_if_vdev_mgr_set_mac_address_send; 1263 } 1264 #else 1265 static void target_if_vdev_register_set_mac_address( 1266 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops) 1267 { 1268 } 1269 #endif 1270 1271 QDF_STATUS 1272 target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 1273 { 1274 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops; 1275 1276 if (!tx_ops) { 1277 mlme_err("Invalid input"); 1278 return QDF_STATUS_E_INVAL; 1279 } 1280 1281 mlme_tx_ops = &tx_ops->mops; 1282 if (!mlme_tx_ops) { 1283 mlme_err("No Tx Ops"); 1284 return QDF_STATUS_E_FAILURE; 1285 } 1286 1287 mlme_tx_ops->vdev_mlme_attach = 1288 target_if_vdev_mgr_register_event_handler; 1289 mlme_tx_ops->vdev_mlme_detach = 1290 target_if_vdev_mgr_unregister_event_handler; 1291 mlme_tx_ops->vdev_create_send = target_if_vdev_mgr_create_send; 1292 mlme_tx_ops->vdev_start_send = target_if_vdev_mgr_start_send; 1293 mlme_tx_ops->vdev_up_send = target_if_vdev_mgr_up_send; 1294 mlme_tx_ops->vdev_delete_send = target_if_vdev_mgr_delete_send; 1295 mlme_tx_ops->vdev_stop_send = target_if_vdev_mgr_stop_send; 1296 mlme_tx_ops->vdev_down_send = target_if_vdev_mgr_down_send; 1297 mlme_tx_ops->vdev_set_nac_rssi_send = 1298 target_if_vdev_mgr_set_nac_rssi_send; 1299 mlme_tx_ops->vdev_set_neighbour_rx_cmd_send = 1300 target_if_vdev_mgr_set_neighbour_rx_cmd_send; 1301 mlme_tx_ops->vdev_sifs_trigger_send = 1302 target_if_vdev_mgr_sifs_trigger_send; 1303 mlme_tx_ops->vdev_set_custom_aggr_size_cmd_send = 1304 target_if_vdev_mgr_set_custom_aggr_size_cmd_send; 1305 mlme_tx_ops->vdev_config_ratemask_cmd_send = 1306 target_if_vdev_mgr_config_ratemask_cmd_send; 1307 mlme_tx_ops->peer_flush_tids_send = 1308 target_if_vdev_mgr_peer_flush_tids_send; 1309 mlme_tx_ops->multiple_vdev_restart_req_cmd = 1310 target_if_vdev_mgr_multiple_vdev_restart_req_cmd; 1311 mlme_tx_ops->multiple_vdev_set_param_cmd = 1312 target_if_vdev_mgr_multiple_vdev_set_param_cmd; 1313 mlme_tx_ops->beacon_cmd_send = target_if_vdev_mgr_beacon_send; 1314 mlme_tx_ops->beacon_tmpl_send = target_if_vdev_mgr_beacon_tmpl_send; 1315 mlme_tx_ops->vdev_set_param_send = 1316 target_if_vdev_mgr_set_param_send; 1317 mlme_tx_ops->vdev_set_tx_rx_decap_type = 1318 target_if_vdev_set_tx_rx_decap_type; 1319 mlme_tx_ops->vdev_sta_ps_param_send = 1320 target_if_vdev_mgr_sta_ps_param_send; 1321 mlme_tx_ops->psoc_vdev_rsp_timer_mod = 1322 target_if_vdev_mgr_rsp_timer_mod; 1323 mlme_tx_ops->peer_delete_all_send = 1324 target_if_vdev_mgr_peer_delete_all_send; 1325 target_if_vdev_register_tx_fils(mlme_tx_ops); 1326 1327 mlme_tx_ops->psoc_vdev_rsp_timer_init = 1328 target_if_psoc_vdev_rsp_timer_init; 1329 mlme_tx_ops->psoc_vdev_rsp_timer_deinit = 1330 target_if_psoc_vdev_rsp_timer_deinit; 1331 mlme_tx_ops->psoc_vdev_rsp_timer_inuse = 1332 target_if_psoc_vdev_rsp_timer_inuse; 1333 mlme_tx_ops->psoc_wake_lock_init = 1334 target_if_wake_lock_init; 1335 mlme_tx_ops->psoc_wake_lock_deinit = 1336 target_if_wake_lock_deinit; 1337 mlme_tx_ops->vdev_mgr_rsp_timer_stop = 1338 target_if_vdev_mgr_rsp_timer_stop; 1339 target_if_vdev_register_set_mac_address(mlme_tx_ops); 1340 return QDF_STATUS_SUCCESS; 1341 } 1342