From 387e65caa6ba448c207bc296a10c54d24fc45962 Mon Sep 17 00:00:00 2001 From: Jianmin Zhu Date: Fri, 18 Oct 2019 20:21:57 +0800 Subject: [PATCH] qcacld-3.0: Avoid wifi fail when timeout waiting for sme close session In special case when vdev delete for wlan disabled, event eWNI_SME_DEL_STA_SELF_RSP has been sent to QDF_MODULE_ID_SME queue, but scheduler thread have no execution chance, timed out waiting for sme close session in hdd_vdev_destroy, sme session isn't cleaned up. When enable wifi again, vdev create failed for cannot re-open active session, wifi failed to start any more, can't recover until system reboot. Fix: When timed out waiting for sme close session in hdd_vdev_destroy, clean up sme session too as normal process. Change-Id: If6c6ed313928294bb83ebbc0e716a574e6a07470 CRs-Fixed: 2547355 --- core/hdd/src/wlan_hdd_main.c | 8 +++++--- core/sme/inc/sme_api.h | 9 +++++++++ core/sme/src/common/sme_api.c | 12 ++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 8a87ba2bead9..9153848d8d07 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -4457,13 +4457,15 @@ int hdd_vdev_destroy(struct hdd_adapter *adapter) if (adapter->device_mode == QDF_NDI_MODE) hdd_ndp_session_end_handler(adapter); - if (status == QDF_STATUS_E_TIMEOUT) + if (status == QDF_STATUS_E_TIMEOUT) { hdd_err("timed out waiting for sme vdev delete"); - else if (adapter->qdf_session_close_event.force_set) + sme_cleanup_session(hdd_ctx->mac_handle, vdev_id); + } else if (adapter->qdf_session_close_event.force_set) { hdd_info("SSR occurred during sme vdev delete"); - else + } else { hdd_err("failed to wait for sme vdev delete; status:%u", status); + } } release_vdev: diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index cc81e539cff0..2d2cdfc12f05 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -398,6 +398,15 @@ QDF_STATUS sme_create_vdev(mac_handle_t mac_handle, */ QDF_STATUS sme_vdev_delete(mac_handle_t mac_handle, uint8_t vdev_id); +/** + * sme_cleanup_session() - clean up sme session info for vdev + * @mac_handle: mac handle + * @vdev_id: vdev id + * + * Return: none + */ +void sme_cleanup_session(mac_handle_t mac_handle, uint8_t vdev_id); + /** * sme_set_curr_device_mode() - Sets the current operating device mode. * @mac_handle: The handle returned by mac_open. diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 551f411764a7..13cc5ee605ab 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -4562,6 +4562,18 @@ QDF_STATUS sme_vdev_delete(mac_handle_t mac_handle, uint8_t vdev_id) return status; } +void sme_cleanup_session(mac_handle_t mac_handle, uint8_t vdev_id) +{ + QDF_STATUS status; + struct mac_context *mac = MAC_CONTEXT(mac_handle); + + status = sme_acquire_global_lock(&mac->sme); + if (QDF_IS_STATUS_ERROR(status)) + return; + csr_cleanup_session(mac, vdev_id); + sme_release_global_lock(&mac->sme); +} + /* * sme_change_mcc_beacon_interval() - * To update P2P-GO beaconInterval. This function should be called after