Wlan: Wait for SSR Re-Init sucess rather than Timeout.
While unload thread is blocked during SSR, it waits for 1 second
before rechecking the status and it does so for 30 iterations
Implemented wait for completion timeout in unload driver thread,
while completion is done from SSR reinit success.
Change-Id: Ib82cfab41be2c5d98a662a6dea06ac9af86b1ad4
CRs-Fixed: 624323.
(cherry picked from commit 3be3e8613a58cf5f1765689cced021213dfcaefd)
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index f442f4f..e721281 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -7991,6 +7991,7 @@
init_completion(&pHddCtx->scan_info.scan_req_completion_event);
init_completion(&pHddCtx->scan_info.abortscan_event_var);
init_completion(&pHddCtx->wiphy_channel_update_event);
+ init_completion(&pHddCtx->ssr_comp_var);
#ifdef CONFIG_ENABLE_LINUX_REG
init_completion(&pHddCtx->linux_reg_req);
@@ -8931,7 +8932,7 @@
{
hdd_context_t *pHddCtx = NULL;
v_CONTEXT_t pVosContext = NULL;
- int retry = 0;
+ unsigned long rc = 0;
pr_info("%s: unloading driver v%s\n", WLAN_MODULE_NAME, QWLAN_VERSIONSTR);
@@ -8953,18 +8954,21 @@
}
else
{
- while (pHddCtx->isLogpInProgress) {
+ INIT_COMPLETION(pHddCtx->ssr_comp_var);
+
+ if (pHddCtx->isLogpInProgress)
+ {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s:SSR in Progress; block rmmod for 1 second!!!", __func__);
- msleep(1000);
-
- if (retry++ == HDD_MOD_EXIT_SSR_MAX_RETRIES) {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s:SSR never completed, fatal error", __func__);
- VOS_BUG(0);
+ "%s:SSR in Progress; block rmmod !!!", __func__);
+ rc = wait_for_completion_timeout(&pHddCtx->ssr_comp_var,
+ msecs_to_jiffies(30000));
+ if(!rc)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
+ "%s:SSR timedout, fatal error", __func__);
+ VOS_BUG(0);
}
- }
-
+ }
pHddCtx->isLoadUnloadInProgress = TRUE;
vos_set_load_unload_in_progress(VOS_MODULE_ID_VOSS, TRUE);