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