summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGovind Singh <govinds@codeaurora.org>2016-09-12 11:44:12 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-10-04 16:40:32 +0530
commitcb792840695ba89397553249d262bd8688dbe2d4 (patch)
treef85a73082d020d4f92a3fa88537640def92ddcdb
parentce5af24c2e33f02594b8201cd9dbb52617503acb (diff)
qcacld-2.0: Do not reschedule wlan tasklet when SSR is in progress
SSR is not completing as tasklet_kill is blocked due polling of the tasklet state to TASKLET_STATE_SCHED. This is coming due to race condition of tasklet disable and tasklet reschedule if there is any outstanding rx packet. To avoid this scenario, do not reschedule wlan tasklet when SSR is in progress. Change-Id: I4f12aae79b1fff40c3c95e4f60376540e9f32ef8 CRs-Fixed: 1064926
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c
index 633214cf7d56..597eae8008f4 100644
--- a/CORE/SERVICES/HIF/PCIe/if_pci.c
+++ b/CORE/SERVICES/HIF/PCIe/if_pci.c
@@ -805,6 +805,15 @@ wlan_tasklet(unsigned long data)
CE_per_engine_service_any(sc->irq_event, sc);
adf_os_atomic_set(&sc->tasklet_from_intr, 0);
if (CE_get_rx_pending(sc)) {
+ if (vos_is_load_unload_in_progress(VOS_MODULE_ID_HIF, NULL)) {
+ pr_err("%s: Load/Unload in Progress\n", __func__);
+ goto end;
+ }
+ if (vos_is_logp_in_progress(VOS_MODULE_ID_HIF, NULL)) {
+ pr_err("%s: LOGP in progress\n", __func__);
+ goto end;
+ }
+
/*
* There are frames pending, schedule tasklet to process them.
* Enable the interrupt only when there is no pending frames in
@@ -815,6 +824,8 @@ wlan_tasklet(unsigned long data)
#else
tasklet_schedule(&sc->intr_tq);
#endif
+
+end:
adf_os_atomic_set(&sc->ce_suspend, 1);
return;
}
@@ -3140,10 +3151,6 @@ void hif_disable_isr(void *ol_sc)
scn->MSI_magic = NULL;
scn->MSI_magic_dma = 0;
#endif
- /* disable the tasklet to avoid recursive scheduling
- * of tasklet if rx pending packet count is greater
- * than 0. */
- tasklet_disable(&hif_sc->intr_tq);
/* Cancel the pending tasklet */
tasklet_kill(&hif_sc->intr_tq);
}