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