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 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 case WLAN_MLME_CFG_RTS_THRESHOLD: 256 wmi_id = wmi_vdev_param_rts_threshold; 257 break; 258 case WLAN_MLME_CFG_FRAG_THRESHOLD: 259 wmi_id = wmi_vdev_param_fragmentation_threshold; 260 break; 261 case WLAN_MLME_CFG_DROP_UNENCRY: 262 wmi_id = wmi_vdev_param_drop_unencry; 263 break; 264 case WLAN_MLME_CFG_TX_POWER: 265 wmi_id = wmi_vdev_param_tx_power; 266 break; 267 case WLAN_MLME_CFG_AMPDU: 268 wmi_id = wmi_vdev_param_ampdu_subframe_size_per_ac; 269 break; 270 case WLAN_MLME_CFG_AMSDU: 271 wmi_id = wmi_vdev_param_amsdu_subframe_size_per_ac; 272 break; 273 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 274 wmi_id = 275 wmi_vdev_param_ap_keepalive_min_idle_inactive_time_secs; 276 break; 277 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 278 wmi_id = 279 wmi_vdev_param_ap_keepalive_max_idle_inactive_time_secs; 280 break; 281 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 282 wmi_id = 283 wmi_vdev_param_ap_keepalive_max_unresponsive_time_secs; 284 break; 285 case WLAN_MLME_CFG_UAPSD: 286 wmi_id = WMI_HOST_STA_PS_PARAM_UAPSD; 287 break; 288 case WLAN_MLME_CFG_BCN_TX_RATE_CODE: 289 wmi_id = wmi_vdev_param_beacon_rate; 290 break; 291 case WLAN_MLME_CFG_TX_MGMT_RATE_CODE: 292 wmi_id = wmi_vdev_param_mgmt_rate; 293 break; 294 case WLAN_MLME_CFG_LISTEN_INTERVAL: 295 wmi_id = wmi_vdev_param_listen_interval; 296 break; 297 case WLAN_MLME_CFG_ENABLE_MULTI_GROUP_KEY: 298 wmi_id = wmi_vdev_param_enable_multi_group_key; 299 break; 300 case WLAN_MLME_CFG_MAX_GROUP_KEYS: 301 wmi_id = wmi_vdev_param_max_group_keys; 302 break; 303 case WLAN_MLME_CFG_TX_ENCAP_TYPE: 304 wmi_id = wmi_vdev_param_tx_encap_type; 305 break; 306 case WLAN_MLME_CFG_RX_DECAP_TYPE: 307 wmi_id = wmi_vdev_param_rx_decap_type; 308 break; 309 default: 310 wmi_id = cfg_id; 311 break; 312 } 313 314 return wmi_id; 315 } 316 317 static 318 QDF_STATUS target_if_vdev_set_tx_rx_decap_type(struct wlan_objmgr_vdev *vdev, 319 enum wlan_mlme_cfg_id param_id, 320 uint32_t value) 321 { 322 ol_txrx_soc_handle soc_txrx_handle; 323 struct wlan_objmgr_psoc *psoc; 324 uint8_t vdev_id = wlan_vdev_get_id(vdev); 325 cdp_config_param_type val = {0}; 326 327 psoc = wlan_vdev_get_psoc(vdev); 328 soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); 329 330 if (!soc_txrx_handle) 331 return QDF_STATUS_E_INVAL; 332 333 if (param_id == WLAN_MLME_CFG_TX_ENCAP_TYPE) { 334 val.cdp_vdev_param_tx_encap = value; 335 return cdp_txrx_set_vdev_param(soc_txrx_handle, 336 vdev_id, CDP_TX_ENCAP_TYPE, 337 val); 338 } else if (param_id == WLAN_MLME_CFG_RX_DECAP_TYPE) { 339 val.cdp_vdev_param_rx_decap = value; 340 return cdp_txrx_set_vdev_param(soc_txrx_handle, 341 vdev_id, CDP_RX_DECAP_TYPE, 342 val); 343 } 344 345 return QDF_STATUS_SUCCESS; 346 } 347 348 static QDF_STATUS target_if_vdev_mgr_set_param_send( 349 struct wlan_objmgr_vdev *vdev, 350 struct vdev_set_params *param) 351 { 352 QDF_STATUS status; 353 struct wmi_unified *wmi_handle; 354 int param_id; 355 356 if (!vdev || !param) { 357 mlme_err("Invalid input"); 358 return QDF_STATUS_E_INVAL; 359 } 360 361 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 362 if (!wmi_handle) { 363 mlme_err("Failed to get WMI handle!"); 364 return QDF_STATUS_E_INVAL; 365 } 366 param_id = target_if_vdev_mlme_id_2_wmi(param->param_id); 367 param->param_id = param_id; 368 if (param->param_id == wmi_vdev_param_txbf) 369 param->param_value = target_if_vdev_mlme_build_txbf_caps(vdev); 370 371 status = wmi_unified_vdev_set_param_send(wmi_handle, param); 372 373 return status; 374 } 375 376 static QDF_STATUS target_if_vdev_mgr_create_send( 377 struct wlan_objmgr_vdev *vdev, 378 struct vdev_create_params *param) 379 { 380 QDF_STATUS status; 381 struct wmi_unified *wmi_handle; 382 uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0}; 383 struct wlan_lmac_if_mlme_tx_ops *txops; 384 struct wlan_objmgr_psoc *psoc; 385 uint8_t vdev_id; 386 387 if (!vdev || !param) { 388 mlme_err("Invalid input"); 389 return QDF_STATUS_E_INVAL; 390 } 391 392 psoc = wlan_vdev_get_psoc(vdev); 393 if (!psoc) { 394 mlme_err("Failed to get psoc for VDEV_%d", 395 wlan_vdev_get_id(vdev)); 396 return QDF_STATUS_E_INVAL; 397 } 398 399 txops = wlan_mlme_get_lmac_tx_ops(psoc); 400 if (!txops || !txops->psoc_vdev_rsp_timer_init) { 401 mlme_err("Failed to get mlme txrx_ops for VDEV_%d PSOC_%d", 402 wlan_vdev_get_id(vdev), wlan_psoc_get_id(psoc)); 403 return QDF_STATUS_E_INVAL; 404 } 405 406 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 407 if (!wmi_handle) { 408 mlme_err("Failed to get WMI handle!"); 409 return QDF_STATUS_E_INVAL; 410 } 411 412 WLAN_ADDR_COPY(vap_addr, wlan_vdev_mlme_get_macaddr(vdev)); 413 status = wmi_unified_vdev_create_send(wmi_handle, vap_addr, 414 param); 415 416 vdev_id = wlan_vdev_get_id(vdev); 417 if (QDF_IS_STATUS_SUCCESS(status)) 418 status = txops->psoc_vdev_rsp_timer_init(psoc, vdev_id); 419 420 return status; 421 } 422 423 static QDF_STATUS target_if_vdev_mgr_start_send( 424 struct wlan_objmgr_vdev *vdev, 425 struct vdev_start_params *param) 426 { 427 QDF_STATUS status; 428 struct wmi_unified *wmi_handle; 429 struct wlan_objmgr_psoc *psoc; 430 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 431 uint8_t vdev_id; 432 struct vdev_response_timer *vdev_rsp; 433 434 if (!vdev || !param) { 435 mlme_err("Invalid input"); 436 return QDF_STATUS_E_INVAL; 437 } 438 439 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 440 if (!wmi_handle) { 441 mlme_err("Failed to get WMI handle!"); 442 return QDF_STATUS_E_INVAL; 443 } 444 445 vdev_id = wlan_vdev_get_id(vdev); 446 psoc = wlan_vdev_get_psoc(vdev); 447 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 448 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 449 mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id, 450 wlan_psoc_get_id(psoc)); 451 return QDF_STATUS_E_INVAL; 452 } 453 454 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 455 if (!vdev_rsp) { 456 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 457 wlan_psoc_get_id(psoc)); 458 return QDF_STATUS_E_INVAL; 459 } 460 461 vdev_rsp->expire_time = START_RESPONSE_TIMER; 462 target_if_wake_lock_timeout_acquire(psoc, START_WAKELOCK); 463 464 if (param->is_restart) 465 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 466 RESTART_RESPONSE_BIT); 467 else 468 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 469 START_RESPONSE_BIT); 470 471 status = wmi_unified_vdev_start_send(wmi_handle, param); 472 if (QDF_IS_STATUS_ERROR(status)) { 473 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 474 vdev_rsp->expire_time = 0; 475 target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); 476 if (param->is_restart) 477 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 478 RESTART_RESPONSE_BIT); 479 else 480 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 481 START_RESPONSE_BIT); 482 } else { 483 target_if_vdev_start_link_handler(vdev, 484 param->channel.dfs_set); 485 } 486 return status; 487 } 488 489 static QDF_STATUS target_if_vdev_mgr_delete_response_send( 490 struct wlan_objmgr_vdev *vdev, 491 struct wlan_lmac_if_mlme_rx_ops *rx_ops) 492 { 493 QDF_STATUS status = QDF_STATUS_SUCCESS; 494 struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev); 495 struct vdev_delete_response rsp = {0}; 496 497 rsp.vdev_id = wlan_vdev_get_id(vdev); 498 status = rx_ops->vdev_mgr_delete_response(psoc, &rsp); 499 target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK); 500 501 return status; 502 } 503 504 static QDF_STATUS target_if_vdev_mgr_delete_send( 505 struct wlan_objmgr_vdev *vdev, 506 struct vdev_delete_params *param) 507 { 508 QDF_STATUS status; 509 struct wlan_objmgr_psoc *psoc; 510 struct wmi_unified *wmi_handle; 511 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 512 uint8_t vdev_id; 513 struct vdev_response_timer *vdev_rsp; 514 515 if (!vdev || !param) { 516 mlme_err("Invalid input"); 517 return QDF_STATUS_E_INVAL; 518 } 519 520 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 521 if (!wmi_handle) { 522 mlme_err("Failed to get WMI handle!"); 523 return QDF_STATUS_E_INVAL; 524 } 525 526 vdev_id = wlan_vdev_get_id(vdev); 527 psoc = wlan_vdev_get_psoc(vdev); 528 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 529 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 530 mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, 531 wlan_psoc_get_id(psoc)); 532 return QDF_STATUS_E_INVAL; 533 } 534 535 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 536 if (!vdev_rsp) { 537 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 538 wlan_psoc_get_id(psoc)); 539 return QDF_STATUS_E_INVAL; 540 } 541 542 vdev_rsp->expire_time = DELETE_RESPONSE_TIMER; 543 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 544 DELETE_RESPONSE_BIT); 545 target_if_wake_lock_timeout_acquire(psoc, DELETE_WAKELOCK); 546 547 status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id); 548 if (QDF_IS_STATUS_SUCCESS(status)) { 549 /* 550 * Simulate delete response if target doesn't support 551 */ 552 if (!wmi_service_enabled(wmi_handle, 553 wmi_service_sync_delete_cmds) || 554 wlan_psoc_nif_feat_cap_get(psoc, 555 WLAN_SOC_F_TESTMODE_ENABLE)) { 556 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 557 DELETE_RESPONSE_BIT); 558 target_if_vdev_mgr_delete_response_send(vdev, rx_ops); 559 } 560 } else { 561 vdev_rsp->expire_time = 0; 562 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 563 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 564 DELETE_RESPONSE_BIT); 565 target_if_wake_lock_timeout_release(psoc, DELETE_WAKELOCK); 566 } 567 return status; 568 } 569 570 static QDF_STATUS target_if_vdev_mgr_stop_send( 571 struct wlan_objmgr_vdev *vdev, 572 struct vdev_stop_params *param) 573 { 574 QDF_STATUS status; 575 struct wmi_unified *wmi_handle; 576 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 577 struct wlan_objmgr_psoc *psoc; 578 uint8_t vdev_id; 579 struct vdev_response_timer *vdev_rsp; 580 581 582 if (!vdev || !param) { 583 mlme_err("Invalid input"); 584 return QDF_STATUS_E_INVAL; 585 } 586 587 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 588 if (!wmi_handle) { 589 mlme_err("Failed to get WMI handle!"); 590 return QDF_STATUS_E_INVAL; 591 } 592 593 vdev_id = wlan_vdev_get_id(vdev); 594 psoc = wlan_vdev_get_psoc(vdev); 595 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 596 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 597 mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, 598 wlan_psoc_get_id(psoc)); 599 return QDF_STATUS_E_INVAL; 600 } 601 602 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 603 if (!vdev_rsp) { 604 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 605 wlan_psoc_get_id(psoc)); 606 return QDF_STATUS_E_INVAL; 607 } 608 609 vdev_rsp->expire_time = STOP_RESPONSE_TIMER; 610 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT); 611 /* 612 * START wakelock is acquired before sending the start command and 613 * released after sending up command to fw. This is to prevent the 614 * system to go into suspend state during the connection. 615 * In auth/assoc failure scenario UP command is not sent 616 * so release the START wakelock here. 617 */ 618 target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); 619 target_if_wake_lock_timeout_acquire(psoc, STOP_WAKELOCK); 620 621 status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id); 622 if (QDF_IS_STATUS_ERROR(status)) { 623 vdev_rsp->expire_time = 0; 624 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 625 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 626 STOP_RESPONSE_BIT); 627 target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK); 628 } else { 629 target_if_vdev_stop_link_handler(vdev); 630 } 631 return status; 632 } 633 634 static QDF_STATUS target_if_vdev_mgr_down_send( 635 struct wlan_objmgr_vdev *vdev, 636 struct vdev_down_params *param) 637 { 638 QDF_STATUS status; 639 struct wmi_unified *wmi_handle; 640 struct wlan_objmgr_psoc *psoc; 641 642 if (!vdev || !param) { 643 mlme_err("Invalid input"); 644 return QDF_STATUS_E_INVAL; 645 } 646 647 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 648 if (!wmi_handle) { 649 mlme_err("Failed to get WMI handle!"); 650 return QDF_STATUS_E_INVAL; 651 } 652 653 psoc = wlan_vdev_get_psoc(vdev); 654 if (!psoc) { 655 mlme_err("Failed to get PSOC Object"); 656 return QDF_STATUS_E_INVAL; 657 } 658 659 status = wmi_unified_vdev_down_send(wmi_handle, param->vdev_id); 660 target_if_wake_lock_timeout_release(psoc, STOP_WAKELOCK); 661 662 return status; 663 } 664 665 static QDF_STATUS target_if_vdev_mgr_up_send( 666 struct wlan_objmgr_vdev *vdev, 667 struct vdev_up_params *param) 668 { 669 QDF_STATUS status; 670 struct wmi_unified *wmi_handle; 671 uint8_t bssid[QDF_MAC_ADDR_SIZE]; 672 struct wlan_objmgr_psoc *psoc; 673 674 if (!vdev || !param) { 675 mlme_err("Invalid input"); 676 return QDF_STATUS_E_INVAL; 677 } 678 679 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 680 if (!wmi_handle) { 681 mlme_err("Failed to get WMI handle!"); 682 return QDF_STATUS_E_INVAL; 683 } 684 685 psoc = wlan_vdev_get_psoc(vdev); 686 if (!psoc) { 687 mlme_err("Failed to get PSOC Object"); 688 return QDF_STATUS_E_INVAL; 689 } 690 ucfg_wlan_vdev_mgr_get_param_bssid(vdev, bssid); 691 692 status = wmi_unified_vdev_up_send(wmi_handle, bssid, param); 693 target_if_wake_lock_timeout_release(psoc, START_WAKELOCK); 694 695 return status; 696 } 697 698 static QDF_STATUS target_if_vdev_mgr_beacon_tmpl_send( 699 struct wlan_objmgr_vdev *vdev, 700 struct beacon_tmpl_params *param) 701 { 702 QDF_STATUS status; 703 struct wmi_unified *wmi_handle; 704 705 if (!vdev || !param) { 706 mlme_err("Invalid input"); 707 return QDF_STATUS_E_INVAL; 708 } 709 710 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 711 if (!wmi_handle) { 712 mlme_err("Failed to get WMI handle!"); 713 return QDF_STATUS_E_INVAL; 714 } 715 716 status = wmi_unified_beacon_tmpl_send_cmd(wmi_handle, param); 717 return status; 718 } 719 720 static QDF_STATUS target_if_vdev_mgr_set_nac_rssi_send( 721 struct wlan_objmgr_vdev *vdev, 722 struct vdev_scan_nac_rssi_params *param) 723 { 724 QDF_STATUS status; 725 struct wmi_unified *wmi_handle; 726 727 if (!vdev || !param) { 728 mlme_err("Invalid input"); 729 return QDF_STATUS_E_INVAL; 730 } 731 732 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 733 if (!wmi_handle) { 734 mlme_err("Failed to get WMI handle!"); 735 return QDF_STATUS_E_INVAL; 736 } 737 738 status = wmi_unified_vdev_set_nac_rssi_send(wmi_handle, param); 739 740 return status; 741 } 742 743 static QDF_STATUS target_if_vdev_mgr_set_neighbour_rx_cmd_send( 744 struct wlan_objmgr_vdev *vdev, 745 struct set_neighbour_rx_params *param, 746 uint8_t *mac) 747 { 748 QDF_STATUS status; 749 struct wmi_unified *wmi_handle; 750 751 if (!vdev || !param) { 752 mlme_err("Invalid input"); 753 return QDF_STATUS_E_INVAL; 754 } 755 756 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 757 if (!wmi_handle) { 758 mlme_err("Failed to get WMI handle!"); 759 return QDF_STATUS_E_INVAL; 760 } 761 762 status = wmi_unified_vdev_set_neighbour_rx_cmd_send(wmi_handle, 763 mac, param); 764 765 return status; 766 } 767 768 static QDF_STATUS target_if_vdev_mgr_sifs_trigger_send( 769 struct wlan_objmgr_vdev *vdev, 770 struct sifs_trigger_param *param) 771 { 772 QDF_STATUS status; 773 struct wmi_unified *wmi_handle; 774 775 if (!vdev || !param) { 776 mlme_err("Invalid input"); 777 return QDF_STATUS_E_INVAL; 778 } 779 780 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 781 if (!wmi_handle) { 782 mlme_err("Failed to get WMI handle!"); 783 return QDF_STATUS_E_INVAL; 784 } 785 786 status = wmi_unified_sifs_trigger_send(wmi_handle, param); 787 788 return status; 789 } 790 791 static QDF_STATUS target_if_vdev_mgr_set_custom_aggr_size_cmd_send( 792 struct wlan_objmgr_vdev *vdev, 793 struct set_custom_aggr_size_params *param) 794 { 795 QDF_STATUS status; 796 struct wmi_unified *wmi_handle; 797 798 if (!vdev || !param) { 799 mlme_err("Invalid input"); 800 return QDF_STATUS_E_INVAL; 801 } 802 803 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 804 if (!wmi_handle) { 805 mlme_err("Failed to get WMI handle!"); 806 return QDF_STATUS_E_INVAL; 807 } 808 809 status = wmi_unified_vdev_set_custom_aggr_size_cmd_send(wmi_handle, 810 param); 811 812 return status; 813 } 814 815 static QDF_STATUS target_if_vdev_mgr_config_ratemask_cmd_send( 816 struct wlan_objmgr_vdev *vdev, 817 struct config_ratemask_params *param) 818 { 819 QDF_STATUS status; 820 struct wmi_unified *wmi_handle; 821 822 if (!vdev || !param) { 823 mlme_err("Invalid input"); 824 return QDF_STATUS_E_INVAL; 825 } 826 827 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 828 if (!wmi_handle) { 829 mlme_err("Failed to get WMI handle!"); 830 return QDF_STATUS_E_INVAL; 831 } 832 833 status = wmi_unified_vdev_config_ratemask_cmd_send(wmi_handle, 834 param); 835 return status; 836 } 837 838 static QDF_STATUS target_if_vdev_mgr_peer_flush_tids_send( 839 struct wlan_objmgr_vdev *vdev, 840 struct peer_flush_params *param) 841 { 842 QDF_STATUS status; 843 struct wmi_unified *wmi_handle; 844 845 if (!vdev || !param) { 846 mlme_err("Invalid input"); 847 return QDF_STATUS_E_INVAL; 848 } 849 850 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 851 if (!wmi_handle) { 852 mlme_err("Failed to get WMI handle!"); 853 return QDF_STATUS_E_INVAL; 854 } 855 856 status = wmi_unified_peer_flush_tids_send(wmi_handle, param->peer_mac, 857 param); 858 859 return status; 860 } 861 862 static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref( 863 struct wlan_objmgr_pdev *pdev, 864 struct multiple_vdev_restart_params *param, 865 struct wlan_objmgr_vdev **vdev_list, 866 bool *vdev_timer_started) 867 { 868 struct wlan_objmgr_psoc *psoc; 869 struct wlan_objmgr_vdev *tvdev; 870 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 871 int32_t vdev_idx = -1; 872 int32_t last_vdev_idx = -1; 873 struct vdev_response_timer *vdev_rsp; 874 875 psoc = wlan_pdev_get_psoc(pdev); 876 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 877 878 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 879 mlme_err("VDEV_%d: No Rx Ops", vdev_idx); 880 return last_vdev_idx; 881 } 882 883 for (vdev_idx = 0; vdev_idx < param->num_vdevs ; vdev_idx++) { 884 vdev_list[vdev_idx] = wlan_objmgr_get_vdev_by_id_from_pdev( 885 pdev, 886 param->vdev_ids[vdev_idx], 887 WLAN_VDEV_TARGET_IF_ID); 888 tvdev = vdev_list[vdev_idx]; 889 if (!tvdev) { 890 mlme_err("VDEV_%d is NULL", vdev_idx); 891 return last_vdev_idx; 892 } 893 894 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info( 895 psoc, 896 wlan_vdev_get_id(tvdev)); 897 if (!vdev_rsp) { 898 wlan_objmgr_vdev_release_ref(tvdev, 899 WLAN_VDEV_TARGET_IF_ID); 900 vdev_list[vdev_idx] = NULL; 901 mlme_err("VDEV_%d PSOC_%d No vdev rsp timer", 902 vdev_idx, wlan_psoc_get_id(psoc)); 903 return last_vdev_idx; 904 } 905 906 last_vdev_idx = vdev_idx; 907 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 908 RESTART_RESPONSE_BIT); 909 vdev_timer_started[vdev_idx] = true; 910 } 911 912 return last_vdev_idx; 913 } 914 915 static void target_if_vdev_mgr_multi_vdev_restart_rel_ref( 916 struct wlan_objmgr_pdev *pdev, 917 struct wlan_objmgr_vdev **vdev_list, 918 bool *vdev_timer_started, 919 int32_t last_vdev_idx, 920 QDF_STATUS status) 921 { 922 struct wlan_objmgr_psoc *psoc; 923 struct wlan_objmgr_vdev *tvdev; 924 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 925 int32_t vdev_idx; 926 struct vdev_response_timer *vdev_rsp; 927 928 psoc = wlan_pdev_get_psoc(pdev); 929 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 930 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 931 mlme_err("VDEV_%d: No Rx Ops", last_vdev_idx); 932 return; 933 } 934 935 for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) { 936 tvdev = vdev_list[vdev_idx]; 937 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, 938 vdev_idx); 939 if (!vdev_rsp) { 940 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", 941 vdev_idx, wlan_psoc_get_id(psoc)); 942 return; 943 } 944 945 if (QDF_IS_STATUS_ERROR(status)) { 946 if (vdev_timer_started[vdev_idx]) { 947 target_if_vdev_mgr_rsp_timer_stop( 948 psoc, vdev_rsp, 949 RESTART_RESPONSE_BIT); 950 vdev_timer_started[vdev_idx] = false; 951 } 952 } 953 wlan_objmgr_vdev_release_ref(tvdev, 954 WLAN_VDEV_TARGET_IF_ID); 955 } 956 } 957 958 static QDF_STATUS target_if_vdev_mgr_multiple_vdev_restart_req_cmd( 959 struct wlan_objmgr_pdev *pdev, 960 struct multiple_vdev_restart_params *param) 961 { 962 QDF_STATUS status = QDF_STATUS_E_FAILURE; 963 struct wmi_unified *wmi_handle; 964 struct wlan_objmgr_psoc *psoc; 965 struct wlan_objmgr_vdev *vdev_list[WLAN_UMAC_PDEV_MAX_VDEVS] = {NULL}; 966 bool vdev_timer_started[WLAN_UMAC_PDEV_MAX_VDEVS] = {false}; 967 int32_t last_vdev_idx = -1; 968 969 if (!pdev || !param) { 970 mlme_err("Invalid input"); 971 return QDF_STATUS_E_INVAL; 972 } 973 974 psoc = wlan_pdev_get_psoc(pdev); 975 if (!psoc) { 976 mlme_err("PSOC is NULL"); 977 return QDF_STATUS_E_INVAL; 978 } 979 980 wmi_handle = get_wmi_unified_hdl_from_pdev(pdev); 981 if (!wmi_handle) { 982 mlme_err("PDEV WMI Handle is NULL!"); 983 return QDF_STATUS_E_INVAL; 984 } 985 986 if (param->num_vdevs > WLAN_UMAC_PDEV_MAX_VDEVS) { 987 mlme_err("param->num_vdevs: %u exceed the limit", 988 param->num_vdevs); 989 return QDF_STATUS_E_INVAL; 990 } 991 992 last_vdev_idx = target_if_vdev_mgr_multi_vdev_restart_get_ref( 993 pdev, param, 994 vdev_list, 995 vdev_timer_started); 996 if (last_vdev_idx < 0 || (last_vdev_idx != (param->num_vdevs - 1))) { 997 target_if_vdev_mgr_multi_vdev_restart_rel_ref( 998 pdev, vdev_list, 999 vdev_timer_started, 1000 last_vdev_idx, 1001 QDF_STATUS_E_FAILURE); 1002 return QDF_STATUS_E_INVAL; 1003 } 1004 1005 status = wmi_unified_send_multiple_vdev_restart_req_cmd(wmi_handle, 1006 param); 1007 1008 target_if_vdev_mgr_multi_vdev_restart_rel_ref( 1009 pdev, vdev_list, 1010 vdev_timer_started, 1011 last_vdev_idx, status); 1012 1013 return status; 1014 } 1015 1016 static QDF_STATUS target_if_vdev_mgr_beacon_send( 1017 struct wlan_objmgr_vdev *vdev, 1018 struct beacon_params *param) 1019 { 1020 QDF_STATUS status; 1021 struct wmi_unified *wmi_handle; 1022 1023 if (!vdev || !param) { 1024 mlme_err("Invalid input"); 1025 return QDF_STATUS_E_INVAL; 1026 } 1027 1028 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1029 if (!wmi_handle) { 1030 mlme_err("Failed to get WMI handle!"); 1031 return QDF_STATUS_E_INVAL; 1032 } 1033 1034 status = wmi_unified_beacon_send_cmd(wmi_handle, param); 1035 1036 return status; 1037 } 1038 1039 static QDF_STATUS target_if_vdev_mgr_sta_ps_param_send( 1040 struct wlan_objmgr_vdev *vdev, 1041 struct sta_ps_params *param) 1042 { 1043 QDF_STATUS status; 1044 struct wmi_unified *wmi_handle; 1045 int param_id; 1046 1047 if (!vdev || !param) { 1048 mlme_err("Invalid input"); 1049 return QDF_STATUS_E_INVAL; 1050 } 1051 1052 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1053 if (!wmi_handle) { 1054 mlme_err("Failed to get WMI handle!"); 1055 return QDF_STATUS_E_INVAL; 1056 } 1057 1058 param_id = target_if_vdev_mlme_id_2_wmi(param->param_id); 1059 param->param_id = param_id; 1060 1061 status = wmi_unified_sta_ps_cmd_send(wmi_handle, param); 1062 1063 return status; 1064 } 1065 1066 static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send( 1067 struct wlan_objmgr_vdev *vdev, 1068 struct peer_delete_all_params *param) 1069 { 1070 QDF_STATUS status; 1071 struct wmi_unified *wmi_handle; 1072 struct wlan_lmac_if_mlme_rx_ops *rx_ops; 1073 struct wlan_objmgr_psoc *psoc; 1074 uint8_t vdev_id; 1075 struct vdev_response_timer *vdev_rsp; 1076 1077 if (!vdev || !param) { 1078 mlme_err("Invalid input"); 1079 return QDF_STATUS_E_INVAL; 1080 } 1081 1082 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1083 if (!wmi_handle) { 1084 mlme_err("Failed to get WMI handle!"); 1085 return QDF_STATUS_E_INVAL; 1086 } 1087 1088 vdev_id = wlan_vdev_get_id(vdev); 1089 psoc = wlan_vdev_get_psoc(vdev); 1090 rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); 1091 1092 if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { 1093 mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, 1094 wlan_psoc_get_id(psoc)); 1095 return QDF_STATUS_E_INVAL; 1096 } 1097 1098 vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); 1099 if (!vdev_rsp) { 1100 mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, 1101 wlan_psoc_get_id(psoc)); 1102 return QDF_STATUS_E_INVAL; 1103 } 1104 1105 vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER; 1106 target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, 1107 PEER_DELETE_ALL_RESPONSE_BIT); 1108 1109 status = wmi_unified_peer_delete_all_send(wmi_handle, param); 1110 if (QDF_IS_STATUS_ERROR(status)) { 1111 vdev_rsp->expire_time = 0; 1112 vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; 1113 target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, 1114 PEER_DELETE_ALL_RESPONSE_BIT); 1115 } 1116 return status; 1117 } 1118 1119 #if defined(WLAN_SUPPORT_FILS) || defined(CONFIG_BAND_6GHZ) 1120 static QDF_STATUS target_if_vdev_mgr_fils_enable_send( 1121 struct wlan_objmgr_vdev *vdev, 1122 struct config_fils_params *param) 1123 { 1124 QDF_STATUS status; 1125 struct wmi_unified *wmi_handle; 1126 1127 if (!vdev || !param) { 1128 mlme_err("Invalid input"); 1129 return QDF_STATUS_E_INVAL; 1130 } 1131 1132 wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); 1133 if (!wmi_handle) { 1134 mlme_err("Failed to get WMI handle!"); 1135 return QDF_STATUS_E_INVAL; 1136 } 1137 1138 status = wmi_unified_vdev_fils_enable_cmd_send(wmi_handle, param); 1139 1140 return status; 1141 } 1142 1143 static void target_if_vdev_register_tx_fils( 1144 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops) 1145 { 1146 mlme_tx_ops->vdev_fils_enable_send = 1147 target_if_vdev_mgr_fils_enable_send; 1148 } 1149 #else 1150 static void target_if_vdev_register_tx_fils( 1151 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops) 1152 { 1153 } 1154 #endif 1155 1156 QDF_STATUS 1157 target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 1158 { 1159 struct wlan_lmac_if_mlme_tx_ops *mlme_tx_ops; 1160 1161 if (!tx_ops) { 1162 mlme_err("Invalid input"); 1163 return QDF_STATUS_E_INVAL; 1164 } 1165 1166 mlme_tx_ops = &tx_ops->mops; 1167 if (!mlme_tx_ops) { 1168 mlme_err("No Tx Ops"); 1169 return QDF_STATUS_E_FAILURE; 1170 } 1171 1172 mlme_tx_ops->vdev_mlme_attach = 1173 target_if_vdev_mgr_register_event_handler; 1174 mlme_tx_ops->vdev_mlme_detach = 1175 target_if_vdev_mgr_unregister_event_handler; 1176 mlme_tx_ops->vdev_create_send = target_if_vdev_mgr_create_send; 1177 mlme_tx_ops->vdev_start_send = target_if_vdev_mgr_start_send; 1178 mlme_tx_ops->vdev_up_send = target_if_vdev_mgr_up_send; 1179 mlme_tx_ops->vdev_delete_send = target_if_vdev_mgr_delete_send; 1180 mlme_tx_ops->vdev_stop_send = target_if_vdev_mgr_stop_send; 1181 mlme_tx_ops->vdev_down_send = target_if_vdev_mgr_down_send; 1182 mlme_tx_ops->vdev_set_nac_rssi_send = 1183 target_if_vdev_mgr_set_nac_rssi_send; 1184 mlme_tx_ops->vdev_set_neighbour_rx_cmd_send = 1185 target_if_vdev_mgr_set_neighbour_rx_cmd_send; 1186 mlme_tx_ops->vdev_sifs_trigger_send = 1187 target_if_vdev_mgr_sifs_trigger_send; 1188 mlme_tx_ops->vdev_set_custom_aggr_size_cmd_send = 1189 target_if_vdev_mgr_set_custom_aggr_size_cmd_send; 1190 mlme_tx_ops->vdev_config_ratemask_cmd_send = 1191 target_if_vdev_mgr_config_ratemask_cmd_send; 1192 mlme_tx_ops->peer_flush_tids_send = 1193 target_if_vdev_mgr_peer_flush_tids_send; 1194 mlme_tx_ops->multiple_vdev_restart_req_cmd = 1195 target_if_vdev_mgr_multiple_vdev_restart_req_cmd; 1196 mlme_tx_ops->beacon_cmd_send = target_if_vdev_mgr_beacon_send; 1197 mlme_tx_ops->beacon_tmpl_send = target_if_vdev_mgr_beacon_tmpl_send; 1198 mlme_tx_ops->vdev_set_param_send = 1199 target_if_vdev_mgr_set_param_send; 1200 mlme_tx_ops->vdev_set_tx_rx_decap_type = 1201 target_if_vdev_set_tx_rx_decap_type; 1202 mlme_tx_ops->vdev_sta_ps_param_send = 1203 target_if_vdev_mgr_sta_ps_param_send; 1204 mlme_tx_ops->psoc_vdev_rsp_timer_mod = 1205 target_if_vdev_mgr_rsp_timer_mod; 1206 mlme_tx_ops->peer_delete_all_send = 1207 target_if_vdev_mgr_peer_delete_all_send; 1208 target_if_vdev_register_tx_fils(mlme_tx_ops); 1209 1210 mlme_tx_ops->psoc_vdev_rsp_timer_init = 1211 target_if_psoc_vdev_rsp_timer_init; 1212 mlme_tx_ops->psoc_vdev_rsp_timer_deinit = 1213 target_if_psoc_vdev_rsp_timer_deinit; 1214 mlme_tx_ops->psoc_vdev_rsp_timer_inuse = 1215 target_if_psoc_vdev_rsp_timer_inuse; 1216 mlme_tx_ops->psoc_wake_lock_init = 1217 target_if_wake_lock_init; 1218 mlme_tx_ops->psoc_wake_lock_deinit = 1219 target_if_wake_lock_deinit; 1220 mlme_tx_ops->vdev_mgr_rsp_timer_stop = 1221 target_if_vdev_mgr_rsp_timer_stop; 1222 return QDF_STATUS_SUCCESS; 1223 } 1224