diff --git a/target_if/mlme/psoc/inc/target_if_psoc_timer_tx_ops.h b/target_if/mlme/psoc/inc/target_if_psoc_timer_tx_ops.h new file mode 100644 index 0000000000..ad781db7fb --- /dev/null +++ b/target_if/mlme/psoc/inc/target_if_psoc_timer_tx_ops.h @@ -0,0 +1,94 @@ + +/* + * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: target_if_psoc_timer_tx_ops.h + * + * This file provide declaration for APIs registered through lmac Tx Ops + */ + +#ifndef __TARGET_IF_PSOC_TIMER_TX_OPS_H__ +#define __TARGET_IF_PSOC_TIMER_TX_OPS_H__ + +/** + * target_if_psoc_vdev_rsp_timer_inuse() - API to check if the response timer + * for vdev is inuse + * @psoc: Psoc object + * @vdev_id: Vdev object id + * + * Return: QDF_STATUS_E_ALREADY in case the timer is inuse or QDF_STATUS_SUCCESS + */ +QDF_STATUS target_if_psoc_vdev_rsp_timer_inuse(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + +/** + * target_if_flush_psoc_vdev_timers() - API to flush target_if response timers + * for vdev + * @psoc: pointer to psoc object + * + * This API is used to flush target_if response timer. This API used while + * wlan driver shutdown. + * + * Return: none + */ +void target_if_flush_psoc_vdev_timers(struct wlan_objmgr_psoc *psoc); + +/** + * target_if_psoc_vdev_rsp_timer_init() - API to initialize response timers for + * vdev from psoc + * @psoc: pointer to psoc object + * @vdev_id: vdev id for which response timer to be retrieved + * + * This API is used to initialize vdev response timer for vdev-id. + * + * Return: QDF_STATUS + */ +QDF_STATUS target_if_psoc_vdev_rsp_timer_init(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + +/** + * target_if_psoc_vdev_rsp_timer_deinit() - API to de-initialize response timers + * for vdev from psoc + * @psoc: pointer to psoc object + * @vdev_id: vdev id for which response timer to be retrieved + * + * This API is used to de-initialize vdev response timer from vdev-id. + * + * Return: none + */ +void target_if_psoc_vdev_rsp_timer_deinit(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + +/** + * target_if_vdev_mgr_rsp_timer_mod() - API to modify time of response timers + * for vdev from psoc + * @psoc: pointer to psoc object + * @vdev_id: vdev id for which response timer to be retrieved + * @mseconds: milli seconds + * + * This API is used to modify vdev response timer for vdev-id. + * + * Return: none + */ +QDF_STATUS target_if_vdev_mgr_rsp_timer_mod( + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + int mseconds); + +#endif diff --git a/target_if/mlme/psoc/src/target_if_psoc_timer_tx_ops.c b/target_if/mlme/psoc/src/target_if_psoc_timer_tx_ops.c new file mode 100644 index 0000000000..7936e1f834 --- /dev/null +++ b/target_if/mlme/psoc/src/target_if_psoc_timer_tx_ops.c @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: target_if_psoc_timer_tx_ops.c + * + * This file provide definition for APIs registered through lmac Tx Ops + */ + +#include +#include +#include +#include +#include +#include + +QDF_STATUS target_if_psoc_vdev_rsp_timer_inuse(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) +{ + struct vdev_response_timer *vdev_rsp; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + + if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) { + mlme_err("Invalid vdev id passed VDEV_%d", vdev_id); + return QDF_STATUS_E_INVAL; + } + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); + if (!vdev_rsp) { + mlme_err("vdev response is NULL for VDEV_%d PSOC_%d", + vdev_id, wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + if (qdf_atomic_read(&vdev_rsp->rsp_timer_inuse)) { + mlme_err("vdev response timer still inuse VDEV_%d PSOC_%d", + vdev_id, wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_ALREADY; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS target_if_psoc_vdev_rsp_timer_init(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) +{ + struct vdev_response_timer *vdev_rsp; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + + if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) { + mlme_err("Invalid vdev id passed VDEV_%d PSOC_%d", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); + if (!vdev_rsp) { + mlme_err("vdev response is NULL for VDEV_%d PSOC_%d", + vdev_id, wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + + vdev_rsp->psoc = psoc; + vdev_rsp->vdev_id = vdev_id; + qdf_timer_init(NULL, &vdev_rsp->rsp_timer, + target_if_vdev_mgr_rsp_timer_mgmt_cb, + vdev_rsp, QDF_TIMER_TYPE_WAKE_APPS); + qdf_atomic_init(&vdev_rsp->rsp_timer_inuse); + + return QDF_STATUS_SUCCESS; +} + +void target_if_psoc_vdev_rsp_timer_deinit(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) +{ + struct vdev_response_timer *vdev_rsp; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + + if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) { + mlme_err("Invalid vdev id passed VDEV_%d PSOC_%d", vdev_id, + wlan_psoc_get_id(psoc)); + return; + } + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return; + } + + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); + if (!vdev_rsp) { + mlme_err("vdev response is NULL for VDEV_%d PSOC_%d", + vdev_id, wlan_psoc_get_id(psoc)); + return; + } + + qdf_timer_free(&vdev_rsp->rsp_timer); + qdf_atomic_set(&vdev_rsp->rsp_timer_inuse, 0); + vdev_rsp->psoc = NULL; +} + +void target_if_flush_psoc_vdev_timers(struct wlan_objmgr_psoc *psoc) +{ + struct vdev_response_timer *vdev_rsp; + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + int i; + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("PSOC_%d No Rx Ops", wlan_psoc_get_id(psoc)); + return; + } + + for (i = 0; i < WLAN_UMAC_PSOC_MAX_VDEVS; i++) { + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, + i); + if (vdev_rsp && qdf_timer_sync_cancel(&vdev_rsp->rsp_timer)) + target_if_vdev_mgr_rsp_timer_cb(vdev_rsp); + } +} + +QDF_STATUS target_if_vdev_mgr_rsp_timer_mod( + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + int mseconds) +{ + struct wlan_lmac_if_mlme_rx_ops *rx_ops; + struct vdev_response_timer *vdev_rsp; + + if (!psoc) { + mlme_err("Invalid input"); + return QDF_STATUS_E_FAILURE; + } + + rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_FAILURE; + } + + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); + qdf_timer_mod(&vdev_rsp->rsp_timer, mseconds); + return QDF_STATUS_SUCCESS; +} + diff --git a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h index b8e17c9dad..f97d0b11b2 100644 --- a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h +++ b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h @@ -51,33 +51,6 @@ static inline bool target_if_vdev_mgr_is_panic_allowed(void) } #endif -/** - * target_if_timer_flush_handler() - API to handle target_if timer flush - * request - * @pdev: pointer to pdev object - * @object: pointer to vdev object - * @arg: pointer to arguments passed - * - * This is a target_if timer flush handler used to flush target_if response - * timer. This API used while wlan driver shut down. - * - * Return: none - */ -void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev, - void *object, - void *arg); - -/** - * target_if_flush_vdev_timers() - API to flush target_if response timers - * for vdev - * @pdev: pointer to pdev object - * - * This API is used to flush target_if response timer. This API used while - * wlan driver shut down. - * - * Return: none - */ -void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev); /** * target_if_vdev_mgr_offload_bcn_tx_status_handler() - API to handle beacon @@ -175,4 +148,12 @@ QDF_STATUS target_if_vdev_mgr_wmi_event_register( QDF_STATUS target_if_vdev_mgr_wmi_event_unregister( struct wlan_objmgr_psoc *psoc); +/** + * target_if_vdev_mgr_rsp_timer_cb() - function to handle vdev related timeouts + * @vdev_rsp: pointer to vdev response timer + * + * Return: NONE + */ +void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp); + #endif /* __TARGET_IF_VDEV_MGR_RX_OPS_H__ */ diff --git a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_tx_ops.h b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_tx_ops.h index 618c5bcdc7..14fd51c639 100644 --- a/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_tx_ops.h +++ b/target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_tx_ops.h @@ -63,24 +63,22 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops); /** * target_if_vdev_mgr_assert_mgmt() - vdev assert mgmt api - * @vdev: pointer to objmgr vdev - * @vdev_rsp: pointer to vdev mlme response timer - * @set_bit: bit to be set + * @PSOC: pointer to objmgr psoc + * @vdev_id: vdev id * * Return: NA */ #ifdef VDEV_ASSERT_MANAGEMENT static inline void target_if_vdev_mgr_assert_mgmt( - struct wlan_objmgr_vdev *vdev, - struct vdev_response_timer *vdev_rsp, - uint8_t set_bit) + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) { } #else static inline void target_if_vdev_mgr_assert_mgmt( - struct wlan_objmgr_vdev *vdev, - struct vdev_response_timer *vdev_rsp, - uint8_t set_bit) + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) + { QDF_ASSERT(0); } @@ -89,14 +87,15 @@ static inline void target_if_vdev_mgr_assert_mgmt( /** * target_if_vdev_mgr_rsp_timer_stop() - API to stop response timer for * vdev manager operations - * @vdev: pointer to vdev object - * @vdev_rsp: pointer to response timer - * @clear_bit: acton bit + * @psoc: pointer to psoc object + * @vdev_rsp: vdev response timer + * @clear_bit: enum of wlan_vdev_mgr_tgt_if_rsp_bit * * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error */ QDF_STATUS target_if_vdev_mgr_rsp_timer_stop( - struct wlan_objmgr_vdev *vdev, - struct vdev_response_timer *vdev_rsp, - uint8_t clear_bit); + struct wlan_objmgr_psoc *psoc, + struct vdev_response_timer *vdev_rsp, + enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit); + #endif /* __TARGET_IF_VDEV_MGR_TX_OPS_H__ */ diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c index c32ace2064..488d9bef43 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c @@ -32,12 +32,10 @@ #include #include -static void target_if_vdev_mgr_rsp_timer_cb(void *arg) +void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp) { - struct wlan_objmgr_vdev *vdev = arg; struct wlan_objmgr_psoc *psoc; struct wlan_lmac_if_mlme_rx_ops *rx_ops; - struct vdev_response_timer *vdev_rsp; struct crash_inject param; struct wmi_unified *wmi_handle; struct vdev_start_response start_rsp = {0}; @@ -47,22 +45,23 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg) uint8_t vdev_id; uint16_t rsp_pos = RESPONSE_BIT_MAX; - vdev_id = wlan_vdev_get_id(vdev); - mlme_debug("Response timer expired for VDEV %d", vdev_id); + if (!vdev_rsp) { + mlme_err("Vdev response timer is NULL"); + return; + } - psoc = wlan_vdev_get_psoc(vdev); + psoc = vdev_rsp->psoc; if (!psoc) { mlme_err("PSOC is NULL"); return; } rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) { + if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { mlme_err("No Rx Ops"); return; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); if (!qdf_atomic_test_bit(START_RESPONSE_BIT, &vdev_rsp->rsp_status) && !qdf_atomic_test_bit(RESTART_RESPONSE_BIT, &vdev_rsp->rsp_status) && !qdf_atomic_test_bit(STOP_RESPONSE_BIT, &vdev_rsp->rsp_status) && @@ -70,7 +69,15 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg) !qdf_atomic_test_bit( PEER_DELETE_ALL_RESPONSE_BIT, &vdev_rsp->rsp_status)) { - mlme_debug("No response bit is set, ignoring actions"); + mlme_debug("No response bit is set, ignoring actions :%d", + vdev_rsp->vdev_id); + return; + } + + vdev_id = vdev_rsp->vdev_id; + if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) { + mlme_err("Invalid VDEV_%d PSOC_%d", vdev_id, + wlan_psoc_get_id(psoc)); return; } @@ -79,7 +86,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg) &vdev_rsp->rsp_status) || qdf_atomic_test_bit(RESTART_RESPONSE_BIT, &vdev_rsp->rsp_status)) { - start_rsp.vdev_id = wlan_vdev_get_id(vdev); + start_rsp.vdev_id = vdev_id; start_rsp.status = WLAN_MLME_HOST_VDEV_START_TIMEOUT; if (qdf_atomic_test_bit(START_RESPONSE_BIT, &vdev_rsp->rsp_status)) { @@ -92,31 +99,28 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg) rsp_pos = RESTART_RESPONSE_BIT; } - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos); + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); rx_ops->vdev_mgr_start_response(psoc, &start_rsp); } else if (qdf_atomic_test_bit(STOP_RESPONSE_BIT, &vdev_rsp->rsp_status)) { rsp_pos = STOP_RESPONSE_BIT; - stop_rsp.vdev_id = wlan_vdev_get_id(vdev); - - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos); + stop_rsp.vdev_id = vdev_id; + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp); } else if (qdf_atomic_test_bit(DELETE_RESPONSE_BIT, &vdev_rsp->rsp_status)) { - del_rsp.vdev_id = wlan_vdev_get_id(vdev); + del_rsp.vdev_id = vdev_id; rsp_pos = DELETE_RESPONSE_BIT; - - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos); + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); rx_ops->vdev_mgr_delete_response(psoc, &del_rsp); } else if (qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT, &vdev_rsp->rsp_status)) { - peer_del_all_rsp.vdev_id = wlan_vdev_get_id(vdev); + peer_del_all_rsp.vdev_id = vdev_id; rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT; - - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos); + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); rx_ops->vdev_mgr_peer_delete_all_response( psoc, @@ -134,7 +138,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg) } /* Trigger fw recovery to collect fw dump */ - wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); + wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc); if (wmi_handle) { mlme_err("PSOC_%d VDEV_%d: Self recovery, %s rsp timeout", wlan_psoc_get_id(psoc), vdev_id, @@ -150,46 +154,31 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg) } } -void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev, - void *object, - void *arg) -{ - struct vdev_response_timer *vdev_rsp; - struct wlan_lmac_if_mlme_rx_ops *rx_ops; - struct wlan_objmgr_psoc *psoc; - struct wlan_objmgr_vdev *vdev = object; - - psoc = wlan_pdev_get_psoc(pdev); - if (!psoc) { - mlme_err("PSOC is NULL"); - return; - } - - rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) { - mlme_err("No Rx Ops"); - return; - } - - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); - if (qdf_timer_sync_cancel(&vdev_rsp->rsp_timer)) - target_if_vdev_mgr_rsp_timer_cb(vdev); -} - -void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev) -{ - wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP, - target_if_timer_flush_handler, - NULL, true, WLAN_VDEV_TARGET_IF_ID); -} - #ifdef SERIALIZE_VDEV_RESP static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg) { - struct wlan_objmgr_vdev *vdev = msg->bodyptr; + struct vdev_response_timer *vdev_rsp; + struct wlan_objmgr_psoc *psoc; - if (vdev) - wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); + if (!msg->bodyptr) { + mlme_err("Message bodyptr is NULL"); + return QDF_STATUS_E_INVAL; + } + + vdev_rsp = msg->bodyptr; + if (!vdev_rsp) { + mlme_err("vdev response timer is NULL"); + return QDF_STATUS_E_INVAL; + } + + psoc = vdev_rsp->psoc; + if (!psoc) { + mlme_err("PSOC is NULL"); + return QDF_STATUS_E_INVAL; + } + + if (vdev_rsp->rsp_status) + wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID); return QDF_STATUS_SUCCESS; } @@ -198,12 +187,19 @@ static void target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg) { struct scheduler_msg msg = {0}; - struct wlan_objmgr_vdev *vdev = arg; + struct vdev_response_timer *vdev_rsp = arg; + struct wlan_objmgr_psoc *psoc; + + psoc = vdev_rsp->psoc; + if (!psoc) { + mlme_err("PSOC is NULL"); + return; + } msg.type = SYS_MSG_ID_MC_TIMER; msg.reserved = SYS_MSG_COOKIE; msg.callback = target_if_vdev_mgr_rsp_timer_cb; - msg.bodyptr = arg; + msg.bodyptr = vdev_rsp; msg.bodyval = 0; msg.flush_callback = target_if_vdev_mgr_rsp_flush_cb; @@ -214,8 +210,8 @@ target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg) return; mlme_err("Could not enqueue timer to timer queue"); - if (vdev) - wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); + if (psoc) + wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID); } void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg) @@ -243,8 +239,8 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn, struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct vdev_start_response rsp = {0}; wmi_host_vdev_start_resp vdev_start_resp; + uint8_t vdev_id; struct vdev_response_timer *vdev_rsp; - struct wlan_objmgr_vdev *vdev; if (!scn || !data) { mlme_err("Invalid input"); @@ -274,35 +270,26 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn, return -EINVAL; } - vdev = wlan_objmgr_get_vdev_by_id_from_psoc( - psoc, - vdev_start_resp.vdev_id, - WLAN_VDEV_TARGET_IF_ID); - if (!vdev) { - mlme_err("PSOC_%d :VDEV_%d is NULL", psoc->soc_objmgr.psoc_id, - vdev_start_resp.vdev_id); - return -EINVAL; - } - - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); + vdev_id = vdev_start_resp.vdev_id; + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); if (!vdev_rsp) { - mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL", - psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id); - goto release_vdev_target_if_ref; + mlme_err("vdev response timer is null VDEV_%d PSOC_%d", + vdev_id, wlan_psoc_get_id(psoc)); + return -EINVAL; } if (vdev_start_resp.resp_type == WMI_HOST_VDEV_RESTART_RESP_EVENT) status = target_if_vdev_mgr_rsp_timer_stop( - vdev, vdev_rsp, + psoc, vdev_rsp, RESTART_RESPONSE_BIT); else - status = target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + status = target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, START_RESPONSE_BIT); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", - psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id); - goto release_vdev_target_if_ref; + psoc->soc_objmgr.psoc_id, vdev_id); + goto err; } rsp.vdev_id = vdev_start_resp.vdev_id; @@ -317,8 +304,7 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn, status = rx_ops->vdev_mgr_start_response(psoc, &rsp); -release_vdev_target_if_ref: - wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); +err: return qdf_status_to_os_return(status); } @@ -333,7 +319,6 @@ static int target_if_vdev_mgr_stop_response_handler(ol_scn_t scn, struct vdev_stop_response rsp = {0}; uint32_t vdev_id; struct vdev_response_timer *vdev_rsp; - struct wlan_objmgr_vdev *vdev; if (!scn || !data) { mlme_err("Invalid input"); @@ -363,37 +348,26 @@ static int target_if_vdev_mgr_stop_response_handler(ol_scn_t scn, return -EINVAL; } - vdev = wlan_objmgr_get_vdev_by_id_from_psoc( - psoc, - vdev_id, - WLAN_VDEV_TARGET_IF_ID); - if (!vdev) { - mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id, - vdev_id); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); + if (!vdev_rsp) { + mlme_err("vdev response timer is null VDEV_%d PSOC_%d", + vdev_id, wlan_psoc_get_id(psoc)); return -EINVAL; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); - if (!vdev_rsp) { - mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL", - psoc->soc_objmgr.psoc_id, vdev_id); - goto release_vdev_target_if_ref; - } - - status = target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + status = target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, STOP_RESPONSE_BIT); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", psoc->soc_objmgr.psoc_id, vdev_id); - goto release_vdev_target_if_ref; + goto err; } rsp.vdev_id = vdev_id; status = rx_ops->vdev_mgr_stop_response(psoc, &rsp); -release_vdev_target_if_ref: - wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); +err: return qdf_status_to_os_return(status); } @@ -408,7 +382,6 @@ static int target_if_vdev_mgr_delete_response_handler(ol_scn_t scn, struct vdev_delete_response rsp = {0}; struct wmi_host_vdev_delete_resp vdev_del_resp; struct vdev_response_timer *vdev_rsp; - struct wlan_objmgr_vdev *vdev; if (!scn || !data) { mlme_err("Invalid input"); @@ -438,38 +411,28 @@ static int target_if_vdev_mgr_delete_response_handler(ol_scn_t scn, return -EINVAL; } - vdev = wlan_objmgr_get_vdev_by_id_from_psoc( - psoc, - vdev_del_resp.vdev_id, - WLAN_VDEV_TARGET_IF_ID); - if (!vdev) { - mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id, - vdev_del_resp.vdev_id); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, + vdev_del_resp.vdev_id); + if (!vdev_rsp) { + mlme_err("vdev response timer is null VDEV_%d PSOC_%d", + vdev_del_resp.vdev_id, wlan_psoc_get_id(psoc)); return -EINVAL; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); - if (!vdev_rsp) { - mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL", - psoc->soc_objmgr.psoc_id, vdev_del_resp.vdev_id); - goto release_vdev_target_if_ref; - } - status = target_if_vdev_mgr_rsp_timer_stop( - vdev, vdev_rsp, + psoc, vdev_rsp, DELETE_RESPONSE_BIT); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", - psoc->soc_objmgr.psoc_id, vdev_del_resp.vdev_id); - goto release_vdev_target_if_ref; + wlan_psoc_get_id(psoc), vdev_del_resp.vdev_id); + goto err; } rsp.vdev_id = vdev_del_resp.vdev_id; status = rx_ops->vdev_mgr_delete_response(psoc, &rsp); -release_vdev_target_if_ref: - wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); +err: return qdf_status_to_os_return(status); } @@ -486,7 +449,6 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler( struct wmi_host_vdev_peer_delete_all_response_event vdev_peer_del_all_resp; struct vdev_response_timer *vdev_rsp; - struct wlan_objmgr_vdev *vdev; if (!scn || !data) { mlme_err("Invalid input"); @@ -518,41 +480,32 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler( return -EINVAL; } - vdev = wlan_objmgr_get_vdev_by_id_from_psoc( - psoc, - vdev_peer_del_all_resp.vdev_id, - WLAN_VDEV_TARGET_IF_ID); - if (!vdev) { - mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id, - vdev_peer_del_all_resp.vdev_id); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, + vdev_peer_del_all_resp.vdev_id); + if (!vdev_rsp) { + mlme_err("vdev response timer is null VDEV_%d PSOC_%d", + vdev_peer_del_all_resp.vdev_id, + wlan_psoc_get_id(psoc)); return -EINVAL; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); - if (!vdev_rsp) { - mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL", - psoc->soc_objmgr.psoc_id, - vdev_peer_del_all_resp.vdev_id); - goto release_vdev_target_if_ref; - } - status = target_if_vdev_mgr_rsp_timer_stop( - vdev, vdev_rsp, + psoc, + vdev_rsp, PEER_DELETE_ALL_RESPONSE_BIT); if (QDF_IS_STATUS_ERROR(status)) { mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed", psoc->soc_objmgr.psoc_id, vdev_peer_del_all_resp.vdev_id); - goto release_vdev_target_if_ref; + goto err; } rsp.vdev_id = vdev_peer_del_all_resp.vdev_id; rsp.status = vdev_peer_del_all_resp.status; status = rx_ops->vdev_mgr_peer_delete_all_response(psoc, &rsp); -release_vdev_target_if_ref: - wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); +err: return qdf_status_to_os_return(status); } diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c index 13e934f863..a60ebe5436 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c @@ -37,6 +37,7 @@ #include #include #include +#include static QDF_STATUS target_if_vdev_mgr_register_event_handler( struct wlan_objmgr_psoc *psoc) @@ -50,25 +51,20 @@ static QDF_STATUS target_if_vdev_mgr_unregister_event_handler( return target_if_vdev_mgr_wmi_event_unregister(psoc); } -static QDF_STATUS target_if_vdev_mgr_rsp_timer_mod( - struct wlan_objmgr_vdev *vdev, - struct vdev_response_timer *vdev_rsp, - int mseconds) +QDF_STATUS +target_if_vdev_mgr_rsp_timer_stop(struct wlan_objmgr_psoc *psoc, + struct vdev_response_timer *vdev_rsp, + enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit) { - if (!vdev || !vdev_rsp) { - mlme_err("Invalid input"); + struct wlan_lmac_if_mlme_tx_ops *txops; + + txops = target_if_vdev_mgr_get_tx_ops(psoc); + if (!txops || !txops->psoc_vdev_rsp_timer_deinit) { + mlme_err("Failed to get mlme txrx_ops VDEV_%d PSOC_%d", + vdev_rsp->vdev_id, wlan_psoc_get_id(psoc)); return QDF_STATUS_E_FAILURE; } - qdf_timer_mod(&vdev_rsp->rsp_timer, mseconds); - return QDF_STATUS_SUCCESS; -} - -QDF_STATUS target_if_vdev_mgr_rsp_timer_stop( - struct wlan_objmgr_vdev *vdev, - struct vdev_response_timer *vdev_rsp, - uint8_t clear_bit) -{ if (qdf_atomic_test_and_clear_bit(clear_bit, &vdev_rsp->rsp_status)) { /* * This is triggered from timer expiry case only for @@ -78,46 +74,43 @@ QDF_STATUS target_if_vdev_mgr_rsp_timer_stop( qdf_timer_stop(&vdev_rsp->rsp_timer); vdev_rsp->timer_status = QDF_STATUS_SUCCESS; + if (clear_bit == DELETE_RESPONSE_BIT) + txops->psoc_vdev_rsp_timer_deinit(psoc, + vdev_rsp->vdev_id); + /* * Releasing reference taken at the time of * starting response timer */ - wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID); + wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID); return QDF_STATUS_SUCCESS; } - return QDF_STATUS_E_FAILURE; } static QDF_STATUS target_if_vdev_mgr_rsp_timer_start( - struct wlan_objmgr_vdev *vdev, - struct vdev_response_timer *vdev_rsp, - uint8_t set_bit) + struct wlan_objmgr_psoc *psoc, + struct vdev_response_timer *vdev_rsp, + enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit) { - uint8_t vdev_id; uint8_t rsp_pos; - struct wlan_objmgr_psoc *psoc; + uint8_t vdev_id; - psoc = wlan_vdev_get_psoc(vdev); - if (!psoc) { - mlme_err("PSOC is NULL"); - return QDF_STATUS_E_INVAL; - } - - vdev_id = wlan_vdev_get_id(vdev); /* it is expected to be only one command with FW at a time */ for (rsp_pos = START_RESPONSE_BIT; rsp_pos <= RESPONSE_BIT_MAX; rsp_pos++) { if (rsp_pos != set_bit) { if (qdf_atomic_test_bit(rsp_pos, &vdev_rsp->rsp_status)) { + vdev_id = vdev_rsp->vdev_id; mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", wlan_psoc_get_id(psoc), - vdev_id, string_from_rsp_bit(set_bit), + vdev_id, + string_from_rsp_bit(set_bit), string_from_rsp_bit(rsp_pos)); - target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp, - rsp_pos); - target_if_vdev_mgr_rsp_timer_stop(vdev, + target_if_vdev_mgr_assert_mgmt(psoc, + vdev_id); + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos); } @@ -127,39 +120,21 @@ static QDF_STATUS target_if_vdev_mgr_rsp_timer_start( if (qdf_atomic_test_and_set_bit(set_bit, &vdev_rsp->rsp_status)) { mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response", wlan_psoc_get_id(psoc), - vdev_id, string_from_rsp_bit(set_bit), + vdev_rsp->vdev_id, string_from_rsp_bit(set_bit), string_from_rsp_bit(set_bit)); - target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp, - set_bit); - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, set_bit); + target_if_vdev_mgr_assert_mgmt(psoc, vdev_rsp->vdev_id); + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, set_bit); qdf_atomic_set_bit(set_bit, &vdev_rsp->rsp_status); } /* reference taken for timer start, will be released with stop */ - wlan_objmgr_vdev_get_ref(vdev, WLAN_VDEV_TARGET_IF_ID); + wlan_objmgr_psoc_get_ref(psoc, WLAN_PSOC_TARGET_IF_ID); qdf_timer_start(&vdev_rsp->rsp_timer, vdev_rsp->expire_time); return QDF_STATUS_SUCCESS; } -static QDF_STATUS target_if_vdev_mgr_rsp_timer_init( - struct wlan_objmgr_vdev *vdev, - qdf_timer_t *rsp_timer) -{ - if (!vdev || !rsp_timer) { - mlme_err("Invalid input"); - return QDF_STATUS_E_INVAL; - } - - qdf_timer_init(NULL, rsp_timer, - target_if_vdev_mgr_rsp_timer_mgmt_cb, - (void *)vdev, QDF_TIMER_TYPE_WAKE_APPS); - mlme_debug("VDEV_%d: Response timer initialized", - wlan_vdev_get_id(vdev)); - - return QDF_STATUS_SUCCESS; -} struct wmi_unified *target_if_vdev_mgr_wmi_handle_get(struct wlan_objmgr_vdev *vdev) @@ -390,12 +365,29 @@ static QDF_STATUS target_if_vdev_mgr_create_send( QDF_STATUS status; struct wmi_unified *wmi_handle; uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0}; + struct wlan_lmac_if_mlme_tx_ops *txops; + struct wlan_objmgr_psoc *psoc; + uint8_t vdev_id; if (!vdev || !param) { mlme_err("Invalid input"); return QDF_STATUS_E_INVAL; } + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + mlme_err("Failed to get psoc for VDEV_%d", + wlan_vdev_get_id(vdev)); + return QDF_STATUS_E_INVAL; + } + + txops = wlan_mlme_get_lmac_tx_ops(psoc); + if (!txops || !txops->psoc_vdev_rsp_timer_init) { + mlme_err("Failed to get mlme txrx_ops for VDEV_%d PSOC_%d", + wlan_vdev_get_id(vdev), wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; + } + wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); if (!wmi_handle) { mlme_err("Failed to get WMI handle!"); @@ -406,6 +398,10 @@ static QDF_STATUS target_if_vdev_mgr_create_send( status = wmi_unified_vdev_create_send(wmi_handle, vap_addr, param); + vdev_id = wlan_vdev_get_id(vdev); + if (QDF_IS_STATUS_SUCCESS(status)) + status = txops->psoc_vdev_rsp_timer_init(psoc, vdev_id); + return status; } @@ -417,8 +413,8 @@ static QDF_STATUS target_if_vdev_mgr_start_send( struct wmi_unified *wmi_handle; struct wlan_objmgr_psoc *psoc; struct wlan_lmac_if_mlme_rx_ops *rx_ops; - struct vdev_response_timer *vdev_rsp; uint8_t vdev_id; + struct vdev_response_timer *vdev_rsp; if (!vdev || !param) { mlme_err("Invalid input"); @@ -434,24 +430,27 @@ static QDF_STATUS target_if_vdev_mgr_start_send( vdev_id = wlan_vdev_get_id(vdev); psoc = wlan_vdev_get_psoc(vdev); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { - mlme_err("VDEV_%d: No Rx Ops", vdev_id); + if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); return QDF_STATUS_E_INVAL; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); if (!vdev_rsp) { - mlme_err("VDEV_%d: Invalid response structure", vdev_id); - return QDF_STATUS_E_FAILURE; + mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; } - target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK); vdev_rsp->expire_time = START_RESPONSE_TIMER; + target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK); + if (param->is_restart) - target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, RESTART_RESPONSE_BIT); else - target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, START_RESPONSE_BIT); status = wmi_unified_vdev_start_send(wmi_handle, param); @@ -460,13 +459,12 @@ static QDF_STATUS target_if_vdev_mgr_start_send( vdev_rsp->expire_time = 0; target_if_wake_lock_timeout_release(vdev, START_WAKELOCK); if (param->is_restart) - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, RESTART_RESPONSE_BIT); else - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, START_RESPONSE_BIT); } - return status; } @@ -492,9 +490,9 @@ static QDF_STATUS target_if_vdev_mgr_delete_send( QDF_STATUS status; struct wlan_objmgr_psoc *psoc; struct wmi_unified *wmi_handle; - struct vdev_response_timer *vdev_rsp; struct wlan_lmac_if_mlme_rx_ops *rx_ops; uint8_t vdev_id; + struct vdev_response_timer *vdev_rsp; if (!vdev || !param) { mlme_err("Invalid input"); @@ -510,19 +508,22 @@ static QDF_STATUS target_if_vdev_mgr_delete_send( vdev_id = wlan_vdev_get_id(vdev); psoc = wlan_vdev_get_psoc(vdev); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { - mlme_err("VDEV_%d: No Rx Ops", vdev_id); + if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); return QDF_STATUS_E_INVAL; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); if (!vdev_rsp) { - mlme_err("VDEV_%d: Invalid response structure", vdev_id); - return QDF_STATUS_E_FAILURE; + mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; } + target_if_wake_lock_timeout_acquire(vdev, DELETE_WAKELOCK); vdev_rsp->expire_time = DELETE_RESPONSE_TIMER; - target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, DELETE_RESPONSE_BIT); status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id); @@ -534,7 +535,7 @@ static QDF_STATUS target_if_vdev_mgr_delete_send( wmi_service_sync_delete_cmds) || wlan_psoc_nif_feat_cap_get(psoc, WLAN_SOC_F_TESTMODE_ENABLE)) { - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, DELETE_RESPONSE_BIT); target_if_vdev_mgr_delete_response_send(vdev, rx_ops); } @@ -542,10 +543,9 @@ static QDF_STATUS target_if_vdev_mgr_delete_send( target_if_wake_lock_timeout_release(vdev, DELETE_WAKELOCK); vdev_rsp->expire_time = 0; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, DELETE_RESPONSE_BIT); } - return status; } @@ -557,8 +557,9 @@ static QDF_STATUS target_if_vdev_mgr_stop_send( struct wmi_unified *wmi_handle; struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_objmgr_psoc *psoc; - struct vdev_response_timer *vdev_rsp; uint8_t vdev_id; + struct vdev_response_timer *vdev_rsp; + if (!vdev || !param) { mlme_err("Invalid input"); @@ -574,31 +575,31 @@ static QDF_STATUS target_if_vdev_mgr_stop_send( vdev_id = wlan_vdev_get_id(vdev); psoc = wlan_vdev_get_psoc(vdev); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - - if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { - mlme_err("VDEV_%d: No Rx Ops", vdev_id); + if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); return QDF_STATUS_E_INVAL; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); if (!vdev_rsp) { - mlme_err("VDEV_%d: Invalid response structure", vdev_id); - return QDF_STATUS_E_FAILURE; + mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; } target_if_wake_lock_timeout_acquire(vdev, STOP_WAKELOCK); vdev_rsp->expire_time = STOP_RESPONSE_TIMER; - target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, STOP_RESPONSE_BIT); + target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT); status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id); if (QDF_IS_STATUS_ERROR(status)) { vdev_rsp->expire_time = 0; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; target_if_wake_lock_timeout_release(vdev, STOP_WAKELOCK); - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, STOP_RESPONSE_BIT); } - return status; } @@ -837,15 +838,16 @@ static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref( { struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_vdev *tvdev; - struct vdev_response_timer *vdev_rsp = NULL; struct wlan_lmac_if_mlme_rx_ops *rx_ops; - uint32_t vdev_idx; + int32_t vdev_idx = -1; int32_t last_vdev_idx = -1; + struct vdev_response_timer *vdev_rsp; psoc = wlan_pdev_get_psoc(pdev); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!(rx_ops && rx_ops->vdev_mgr_get_response_timer_info)) { - mlme_err("No Rx Ops"); + + if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d: No Rx Ops", vdev_idx); return last_vdev_idx; } @@ -860,15 +862,16 @@ static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref( return last_vdev_idx; } - last_vdev_idx = vdev_idx; - vdev_rsp = - rx_ops->vdev_mgr_get_response_timer_info(tvdev); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, + vdev_idx); if (!vdev_rsp) { - mlme_err("VDEV_%d: No Rx Ops", vdev_idx); + mlme_err("VDEV_%d PSOC_%d No vdev rsp timer", + vdev_idx, wlan_psoc_get_id(psoc)); return last_vdev_idx; } - target_if_vdev_mgr_rsp_timer_start(tvdev, vdev_rsp, + last_vdev_idx = vdev_idx; + target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, RESTART_RESPONSE_BIT); vdev_timer_started[vdev_idx] = true; } @@ -886,19 +889,30 @@ static void target_if_vdev_mgr_multi_vdev_restart_rel_ref( struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_vdev *tvdev; struct wlan_lmac_if_mlme_rx_ops *rx_ops; - struct vdev_response_timer *vdev_rsp = NULL; uint32_t vdev_idx; + struct vdev_response_timer *vdev_rsp; psoc = wlan_pdev_get_psoc(pdev); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); + if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d: No Rx Ops", last_vdev_idx); + return; + } + for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) { tvdev = vdev_list[vdev_idx]; + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, + vdev_idx); + if (!vdev_rsp) { + mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", + vdev_idx, wlan_psoc_get_id(psoc)); + return; + } + if (QDF_IS_STATUS_ERROR(status)) { - vdev_rsp = - rx_ops->vdev_mgr_get_response_timer_info(tvdev); - if (vdev_rsp && vdev_timer_started[vdev_idx]) { + if (vdev_timer_started[vdev_idx]) { target_if_vdev_mgr_rsp_timer_stop( - tvdev, vdev_rsp, + psoc, vdev_rsp, RESTART_RESPONSE_BIT); vdev_timer_started[vdev_idx] = false; } @@ -1018,8 +1032,8 @@ static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send( struct wmi_unified *wmi_handle; struct wlan_lmac_if_mlme_rx_ops *rx_ops; struct wlan_objmgr_psoc *psoc; - struct vdev_response_timer *vdev_rsp; uint8_t vdev_id; + struct vdev_response_timer *vdev_rsp; if (!vdev || !param) { mlme_err("Invalid input"); @@ -1036,29 +1050,30 @@ static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send( psoc = wlan_vdev_get_psoc(vdev); rx_ops = target_if_vdev_mgr_get_rx_ops(psoc); - if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) { - mlme_err("VDEV_%d: No Rx Ops", vdev_id); + if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) { + mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id, + wlan_psoc_get_id(psoc)); return QDF_STATUS_E_INVAL; } - vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev); + vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id); if (!vdev_rsp) { - mlme_err("VDEV_%d: Invalid response structure", vdev_id); - return QDF_STATUS_E_FAILURE; + mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id, + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_INVAL; } vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER; - target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, PEER_DELETE_ALL_RESPONSE_BIT); status = wmi_unified_peer_delete_all_send(wmi_handle, param); if (QDF_IS_STATUS_ERROR(status)) { vdev_rsp->expire_time = 0; vdev_rsp->timer_status = QDF_STATUS_E_CANCELED; - target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, + target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, PEER_DELETE_ALL_RESPONSE_BIT); } - return status; } @@ -1147,13 +1162,17 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) target_if_vdev_set_tx_rx_decap_type; mlme_tx_ops->vdev_sta_ps_param_send = target_if_vdev_mgr_sta_ps_param_send; - mlme_tx_ops->vdev_mgr_rsp_timer_init = - target_if_vdev_mgr_rsp_timer_init; - mlme_tx_ops->vdev_mgr_rsp_timer_mod = + mlme_tx_ops->psoc_vdev_rsp_timer_mod = target_if_vdev_mgr_rsp_timer_mod; mlme_tx_ops->peer_delete_all_send = target_if_vdev_mgr_peer_delete_all_send; target_if_vdev_register_tx_fils(mlme_tx_ops); + mlme_tx_ops->psoc_vdev_rsp_timer_init = + target_if_psoc_vdev_rsp_timer_init; + mlme_tx_ops->psoc_vdev_rsp_timer_deinit = + target_if_psoc_vdev_rsp_timer_deinit; + mlme_tx_ops->psoc_vdev_rsp_timer_inuse = + target_if_psoc_vdev_rsp_timer_inuse; return QDF_STATUS_SUCCESS; } diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h index 82586959bb..6987236a26 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h @@ -256,6 +256,7 @@ typedef void (*wlan_objmgr_peer_status_handler)( * @WLAN_MISC_ID: power manager, PAPI, rate set, etc. * @WLAN_FWOL_NB_ID: fw offload northbound operations * @WLAN_FWOL_SB_ID: fw offload southbound operations + * @WLAN_PSOC_TARGET_IF_ID PSOC related target_if operations * @WLAN_REF_ID_MAX: Max id used to generate ref count tracking array */ /* New value added to the enum must also be reflected in function @@ -334,6 +335,7 @@ typedef enum { WLAN_MISC_ID = 69, WLAN_FWOL_NB_ID = 70, WLAN_FWOL_SB_ID = 71, + WLAN_PSOC_TARGET_IF_ID = 72, WLAN_REF_ID_MAX, } wlan_objmgr_ref_dbgid; diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index ff54bd9ca4..fdee2dbc6d 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -185,8 +185,6 @@ enum wlan_mlme_cfg_id; * @get_wifi_iface_id: function to get wifi interface id * @vdev_mlme_attach: function to register events * @vdev_mlme_detach: function to unregister events - * @vdev_mgr_rsp_timer_init: function to initialize vdev response timer - * @vdev_mgr_rsp_timer_mod: function to timer_mod vdev response timer * @vdev_create_send: function to send vdev create * @vdev_start_send: function to send vdev start * @vdev_up_send: function to send vdev up @@ -207,18 +205,16 @@ enum wlan_mlme_cfg_id; * @vdev_bcn_miss_offload_send: function to send beacon miss offload * @vdev_sta_ps_param_send: function to sent STA power save config * @peer_delete_all_send: function to send vdev delete all peer request + * @psoc_vdev_rsp_timer_init: function to initialize psoc vdev response timer + * @psoc_vdev_rsp_timer_deinit: function to deinitialize psoc vdev rsp timer + * @psoc_vdev_rsp_timer_inuse: function to determine whether the vdev rsp + * timer is inuse or not + * @psoc_vdev_rsp_timer_mod: function to modify the time of vdev rsp timer */ struct wlan_lmac_if_mlme_tx_ops { uint32_t (*get_wifi_iface_id) (struct wlan_objmgr_pdev *pdev); QDF_STATUS (*vdev_mlme_attach)(struct wlan_objmgr_psoc *psoc); QDF_STATUS (*vdev_mlme_detach)(struct wlan_objmgr_psoc *psoc); - QDF_STATUS (*vdev_mgr_rsp_timer_init)( - struct wlan_objmgr_vdev *vdev, - qdf_timer_t *rsp_timer); - QDF_STATUS (*vdev_mgr_rsp_timer_mod)( - struct wlan_objmgr_vdev *vdev, - struct vdev_response_timer *vdev_rsp, - int mseconds); QDF_STATUS (*vdev_create_send)(struct wlan_objmgr_vdev *vdev, struct vdev_create_params *param); QDF_STATUS (*vdev_start_send)(struct wlan_objmgr_vdev *vdev, @@ -272,6 +268,20 @@ struct wlan_lmac_if_mlme_tx_ops { QDF_STATUS (*peer_delete_all_send)( struct wlan_objmgr_vdev *vdev, struct peer_delete_all_params *param); + QDF_STATUS (*psoc_vdev_rsp_timer_init)( + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + void (*psoc_vdev_rsp_timer_deinit)( + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + QDF_STATUS (*psoc_vdev_rsp_timer_inuse)( + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + QDF_STATUS (*psoc_vdev_rsp_timer_mod)( + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + int mseconds); + }; /** @@ -1489,7 +1499,6 @@ struct wlan_lmac_if_dfs_rx_ops { /** * struct wlan_lmac_if_mlme_rx_ops: Function pointer to call MLME functions - * @vdev_mgr_get_response_timer_info: function to get response timer info * @vdev_mgr_start_response: function to handle start response * @vdev_mgr_stop_response: function to handle stop response * @vdev_mgr_delete_response: function to handle delete response @@ -1499,10 +1508,10 @@ struct wlan_lmac_if_dfs_rx_ops { * @vdev_mgr_peer_delete_all_response: function to handle vdev delete all peer * event * @vdev_mgr_get_wakelock_info: function to get wakelock info + * @psoc_get_vdev_response_timer_info: function to get vdev response timer + * structure for a specific vdev id */ struct wlan_lmac_if_mlme_rx_ops { - struct vdev_response_timer *(*vdev_mgr_get_response_timer_info)( - struct wlan_objmgr_vdev *vdev); QDF_STATUS (*vdev_mgr_start_response)( struct wlan_objmgr_psoc *psoc, struct vdev_start_response *rsp); @@ -1525,6 +1534,9 @@ struct wlan_lmac_if_mlme_rx_ops { struct vdev_mlme_wakelock *(*vdev_mgr_get_wakelock_info)( struct wlan_objmgr_vdev *vdev); #endif + struct vdev_response_timer *(*psoc_get_vdev_response_timer_info)( + struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); }; #ifdef WLAN_SUPPORT_GREEN_AP diff --git a/umac/mlme/include/wlan_psoc_mlme.h b/umac/mlme/include/wlan_psoc_mlme.h index 3ab23a27ce..90644b4403 100644 --- a/umac/mlme/include/wlan_psoc_mlme.h +++ b/umac/mlme/include/wlan_psoc_mlme.h @@ -21,15 +21,19 @@ #define _WLAN_PSOC_MLME_H_ #include +#include +#include /** - * struct psoc_mlme_obj - PSOC MLME component object - * @psoc: PSOC object - * @ext_psoc_ptr: extended psoc mlme pointer + * struct psoc_mlme_obj - PSoC MLME component object + * @psoc: PSoC object + * @ext_psoc_ptr: PSoC legacy pointer + * @psoc_vdev_rt: PSoC Vdev response timer */ struct psoc_mlme_obj { struct wlan_objmgr_psoc *psoc; mlme_psoc_ext_t *ext_psoc_ptr; + struct vdev_response_timer psoc_vdev_rt[WLAN_UMAC_PSOC_MAX_VDEVS]; }; #endif diff --git a/umac/mlme/include/wlan_vdev_mlme.h b/umac/mlme/include/wlan_vdev_mlme.h index a9ad8f340c..a354239bc4 100644 --- a/umac/mlme/include/wlan_vdev_mlme.h +++ b/umac/mlme/include/wlan_vdev_mlme.h @@ -567,7 +567,6 @@ struct vdev_mlme_obj { struct wlan_objmgr_vdev *vdev; struct vdev_mlme_ops *ops; mlme_vdev_ext_t *ext_vdev_ptr; - struct vdev_response_timer vdev_rt; #ifdef FEATURE_VDEV_RSP_WAKELOCK struct vdev_mlme_wakelock vdev_wakelock; #endif diff --git a/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_psoc_mlme_main.h b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_psoc_mlme_main.h index db6a19066f..36026b7ae1 100644 --- a/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_psoc_mlme_main.h +++ b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_psoc_mlme_main.h @@ -40,4 +40,12 @@ QDF_STATUS wlan_psoc_mlme_init(void); */ QDF_STATUS wlan_psoc_mlme_deinit(void); +/** + * mlme_psoc_get_priv: get MLME priv object from psoc object + * @psoc: pointer to psoc object + * + * Return: pointer to MLME psoc private object + */ +struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc); + #endif diff --git a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c index 21ea246f7c..3303b3079b 100644 --- a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c +++ b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c @@ -26,6 +26,20 @@ #include #include +struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc) +{ + struct psoc_mlme_obj *psoc_mlme; + + psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc, + WLAN_UMAC_COMP_MLME); + if (!psoc_mlme) { + mlme_err("PSOC MLME component object is NULL"); + return NULL; + } + + return psoc_mlme; +} + static QDF_STATUS mlme_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, void *arg) { @@ -67,10 +81,9 @@ static QDF_STATUS mlme_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc, { struct psoc_mlme_obj *psoc_mlme; - psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc, - WLAN_UMAC_COMP_MLME); + psoc_mlme = mlme_psoc_get_priv(psoc); if (!psoc_mlme) { - mlme_err(" PSOC MLME component object is NULL"); + mlme_err("PSOC MLME component object is NULL"); return QDF_STATUS_E_FAILURE; } diff --git a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c index 9b85389205..746f62b0bd 100644 --- a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c +++ b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c @@ -22,23 +22,28 @@ #include #include #include -#include "include/wlan_mlme_cmn.h" -#include "include/wlan_vdev_mlme.h" -#include "include/wlan_pdev_mlme.h" -#include "vdev_mgr/core/src/vdev_mlme_sm.h" -#include "wlan_pdev_mlme_api.h" -#include "wlan_vdev_mlme_api.h" -#include "wlan_serialization_api.h" -#include "wlan_utility.h" +#include +#include +#include +#include +#include +#include +#include +#include #include -#include "target_if_vdev_mgr_wake_lock.h" +#include +#include +#include static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, void *arg) { struct vdev_mlme_obj *vdev_mlme; struct wlan_objmgr_pdev *pdev; + struct wlan_objmgr_psoc *psoc; struct pdev_mlme_obj *pdev_mlme; + struct wlan_lmac_if_mlme_tx_ops *txops; + QDF_STATUS status; if (!vdev) { mlme_err(" VDEV is NULL"); @@ -51,9 +56,33 @@ static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_E_FAILURE; } + /** + * 1st check whether for this vdev any vdev commands are pending for + * response. + */ + psoc = wlan_pdev_get_psoc(pdev); + if (!psoc) { + mlme_err("PSOC is NULL"); + return QDF_STATUS_E_FAILURE; + } + + txops = target_if_vdev_mgr_get_tx_ops(psoc); + if (!txops || !txops->psoc_vdev_rsp_timer_inuse) { + mlme_err("Failed to get mlme txrx_ops PSOC_%d", + wlan_psoc_get_id(psoc)); + return QDF_STATUS_E_FAILURE; + } + + status = txops->psoc_vdev_rsp_timer_inuse(psoc, wlan_vdev_get_id(vdev)); + if (QDF_IS_STATUS_ERROR(status)) { + mlme_err("The vdev response is pending for VDEV_%d status:%d", + wlan_vdev_get_id(vdev), status); + return QDF_STATUS_E_FAILURE; + } + pdev_mlme = wlan_pdev_mlme_get_cmpt_obj(pdev); if (!pdev_mlme) { - mlme_err(" PDEV MLME is NULL"); + mlme_err("PDEV MLME is NULL"); return QDF_STATUS_E_FAILURE; } @@ -105,15 +134,6 @@ init_failed: return QDF_STATUS_E_FAILURE; } -static void mlme_vdev_obj_timer_deinit( - struct vdev_mlme_obj *vdev_mlme) -{ - struct vdev_response_timer *vdev_rsp; - - vdev_rsp = &vdev_mlme->vdev_rt; - qdf_timer_free(&vdev_rsp->rsp_timer); -} - static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, void *arg) { @@ -143,8 +163,6 @@ static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, NULL, NULL); } - mlme_vdev_obj_timer_deinit(vdev_mlme); - mlme_vdev_sm_destroy(vdev_mlme); mlme_vdev_ops_ext_hdl_destroy(vdev_mlme); diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h index cc06e745d0..feeac72a19 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h @@ -81,16 +81,22 @@ static inline char *string_from_rsp_bit(enum wlan_vdev_mgr_tgt_if_rsp_bit bit) /** * struct vdev_response_timer - vdev mgmt response ops timer + * @psoc: Object manager psoc * @rsp_timer: VDEV MLME mgmt response timer * @rsp_status: variable to check response status * @expire_time: time to expire timer * @timer_status: status of timer + * @rsp_timer_inuse: Status bit to inform whether the rsp timer is inuse + * @vdev_id: vdev object id */ struct vdev_response_timer { + struct wlan_objmgr_psoc *psoc; qdf_timer_t rsp_timer; unsigned long rsp_status; uint32_t expire_time; QDF_STATUS timer_status; + qdf_atomic_t rsp_timer_inuse; + uint8_t vdev_id; }; /** diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c index 674c160227..c05d07d256 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c @@ -28,19 +28,23 @@ #include #include #include +#include +#include static struct vdev_response_timer * -tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_vdev *vdev) +tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) { - struct vdev_mlme_obj *vdev_mlme; + struct psoc_mlme_obj *psoc_mlme; - vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); - if (!vdev_mlme) { - mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(vdev)); + psoc_mlme = mlme_psoc_get_priv(psoc); + if (!psoc_mlme) { + mlme_err("VDEV_%d PSOC_%d PSOC_MLME is NULL", vdev_id, + wlan_psoc_get_id(psoc)); return NULL; } - return &vdev_mlme->vdev_rt; + return &psoc_mlme->psoc_vdev_rt[vdev_id]; } static QDF_STATUS tgt_vdev_mgr_start_response_handler( @@ -65,7 +69,8 @@ static QDF_STATUS tgt_vdev_mgr_start_response_handler( vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); if (!vdev_mlme) { - mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); + mlme_err("VDEV_%d PSOC_%d VDEV_MLME is NULL", rsp->vdev_id, + wlan_psoc_get_id(psoc)); goto tgt_vdev_mgr_start_response_handler_end; } @@ -101,7 +106,8 @@ static QDF_STATUS tgt_vdev_mgr_stop_response_handler( vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); if (!vdev_mlme) { - mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); + mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id, + wlan_psoc_get_id(psoc)); goto tgt_vdev_mgr_stop_response_handler_end; } @@ -138,7 +144,8 @@ static QDF_STATUS tgt_vdev_mgr_delete_response_handler( vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); if (!vdev_mlme) { - mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); + mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id, + wlan_psoc_get_id(psoc)); goto tgt_vdev_mgr_delete_response_handler_end; } @@ -176,7 +183,8 @@ static QDF_STATUS tgt_vdev_mgr_peer_delete_all_response_handler( vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); if (!vdev_mlme) { - mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id); + mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id, + wlan_psoc_get_id(psoc)); goto tgt_vdev_mgr_peer_delete_all_response_handler_end; } @@ -262,8 +270,7 @@ void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops) tgt_vdev_mgr_delete_response_handler; mlme_rx_ops->vdev_mgr_peer_delete_all_response = tgt_vdev_mgr_peer_delete_all_response_handler; - mlme_rx_ops->vdev_mgr_get_response_timer_info = + mlme_rx_ops->psoc_get_vdev_response_timer_info = tgt_vdev_mgr_get_response_timer_info; - tgt_vdev_mgr_reg_wakelock_info_rx_op(&rx_ops->mops); } diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c index 9a7bbe55bb..7da7af6029 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c @@ -63,7 +63,6 @@ QDF_STATUS tgt_vdev_mgr_create_send( enum wlan_op_subtype cdp_txrx_subtype; uint32_t vdev_id; uint8_t *vdev_addr; - struct vdev_response_timer *vdev_rsp; if (!param) { mlme_err("Invalid input"); @@ -73,25 +72,27 @@ QDF_STATUS tgt_vdev_mgr_create_send( vdev = mlme_obj->vdev; vdev_id = wlan_vdev_get_id(vdev); txops = wlan_vdev_mlme_get_lmac_txops(vdev); - if (!txops || !txops->vdev_create_send || - !txops->vdev_mgr_rsp_timer_init) { - mlme_err("VDEV_%d: No Tx Ops", vdev_id); + if (!txops || !txops->vdev_create_send) { + mlme_err("VDEV_%d No Tx Ops", vdev_id); + return QDF_STATUS_E_INVAL; + } + + psoc = wlan_vdev_get_psoc(vdev); + if (!psoc) { + mlme_err("psoc object is NULL"); return QDF_STATUS_E_INVAL; } status = txops->vdev_create_send(vdev, param); - if (QDF_IS_STATUS_SUCCESS(status)) { - vdev_rsp = &mlme_obj->vdev_rt; - txops->vdev_mgr_rsp_timer_init(vdev, &vdev_rsp->rsp_timer); - } else { - mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status); + if (QDF_IS_STATUS_ERROR(status)) { + mlme_err("VDEV_%d PSOC_%d Tx Ops Error : %d", vdev_id, + wlan_psoc_get_id(psoc), status); return status; } cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev); cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev); vdev_addr = wlan_vdev_mlme_get_macaddr(vdev); - psoc = wlan_vdev_get_psoc(vdev); pdev = wlan_vdev_get_pdev(vdev); soc_txrx_handle = wlan_psoc_get_dp_handle(psoc); pdev_txrx_handle = wlan_pdev_get_dp_handle(pdev); @@ -107,7 +108,6 @@ QDF_STATUS tgt_vdev_mgr_create_send( return QDF_STATUS_E_FAILURE; wlan_vdev_set_dp_handle(vdev, vdev_txrx_handle); - return status; }