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