From 642b26aaf0e691592fdfec4870156295a0f24035 Mon Sep 17 00:00:00 2001 From: Surya Prakash Raajen Date: Mon, 5 Sep 2022 16:19:55 +0530 Subject: [PATCH] qcacmn: Fix wmi_mlo_teardown_cmd_send issue When teardown completeion event is received from FW, teardown completion handler resets pdev link to NULL, when the expectation is only to put pdev state in teardown, such that when soc goes down the list gets cleared. Change-Id: Ief490eabe0546207f0ef649cb6d5cde1faf582d8 CRs-Fixed: 3280671 --- umac/mlo_mgr/src/wlan_mlo_mgr_setup.c | 90 +++++++++++++-------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c b/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c index 06ac115fbe..acf4bc0868 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c +++ b/umac/mlo_mgr/src/wlan_mlo_mgr_setup.c @@ -147,6 +147,48 @@ bool mlo_vdevs_check_single_soc(struct wlan_objmgr_vdev **wlan_vdev_list, qdf_export_symbol(mlo_vdevs_check_single_soc); +static void mlo_check_state(struct wlan_objmgr_psoc *psoc, + void *obj, void *args) +{ + struct wlan_objmgr_pdev *pdev; + uint8_t link_idx; + struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx(); + struct mlo_state_params *params = (struct mlo_state_params *)args; + + pdev = (struct wlan_objmgr_pdev *)obj; + + if (!mlo_ctx) + return; + + if (mlo_find_pdev_idx(pdev, &link_idx) != QDF_STATUS_SUCCESS) { + qdf_info("Failed to find pdev"); + return; + } + + if (mlo_ctx->setup_info.state[link_idx] != params->check_state) + params->link_state_fail = 1; +} + +QDF_STATUS mlo_check_all_pdev_state(struct wlan_objmgr_psoc *psoc, + enum MLO_LINK_STATE state) +{ + QDF_STATUS status = QDF_STATUS_E_INVAL; + struct mlo_state_params params = {0}; + + params.check_state = state; + + wlan_objmgr_iterate_obj_list(psoc, WLAN_PDEV_OP, + mlo_check_state, ¶ms, + 0, WLAN_MLME_NB_ID); + + if (params.link_state_fail) + status = QDF_STATUS_E_INVAL; + else + status = QDF_STATUS_SUCCESS; + + return status; +} + void mlo_setup_init(void) { struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx(); @@ -414,12 +456,12 @@ void mlo_link_teardown_complete(struct wlan_objmgr_pdev *pdev) } qdf_debug("Teardown link idx = %d", link_idx); - mlo_ctx->setup_info.pdev_list[link_idx] = NULL; mlo_ctx->setup_info.state[link_idx] = MLO_LINK_TEARDOWN; /* Waiting for teardown on other links */ - if (mlo_ctx->setup_info.num_links) - return; + for (link_idx = 0; link_idx < mlo_ctx->setup_info.tot_links; link_idx++) + if (mlo_ctx->setup_info.state[link_idx] != MLO_LINK_TEARDOWN) + return; qdf_info("Teardown complete"); @@ -435,28 +477,6 @@ void mlo_link_teardown_complete(struct wlan_objmgr_pdev *pdev) qdf_export_symbol(mlo_link_teardown_complete); -static void mlo_check_state(struct wlan_objmgr_psoc *psoc, - void *obj, void *args) -{ - struct wlan_objmgr_pdev *pdev; - uint8_t link_idx; - struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx(); - struct mlo_state_params *params = (struct mlo_state_params *)args; - - pdev = (struct wlan_objmgr_pdev *)obj; - - if (!mlo_ctx) - return; - - if (mlo_find_pdev_idx(pdev, &link_idx) != QDF_STATUS_SUCCESS) { - qdf_info("Failed to find pdev"); - return; - } - - if (mlo_ctx->setup_info.state[link_idx] != params->check_state) - params->link_state_fail = 1; -} - static void mlo_force_teardown(void) { struct mlo_mgr_context *mlo_ctx = wlan_objmgr_get_mlo_ctx(); @@ -478,26 +498,6 @@ static void mlo_force_teardown(void) } } -QDF_STATUS mlo_check_all_pdev_state(struct wlan_objmgr_psoc *psoc, - enum MLO_LINK_STATE state) -{ - QDF_STATUS status = QDF_STATUS_E_INVAL; - struct mlo_state_params params = {0}; - - params.check_state = state; - - wlan_objmgr_iterate_obj_list(psoc, WLAN_PDEV_OP, - mlo_check_state, ¶ms, - 0, WLAN_MLME_NB_ID); - - if (params.link_state_fail) - status = QDF_STATUS_E_INVAL; - else - status = QDF_STATUS_SUCCESS; - - return status; -} - #define MLO_MGR_TEARDOWN_TIMEOUT 3000 QDF_STATUS mlo_link_teardown_link(struct wlan_objmgr_psoc *psoc, uint32_t reason)