summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGovind Singh <govinds@codeaurora.org>2016-09-12 11:44:12 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-09-21 13:36:02 +0530
commit7fc52d2a37fc6f6e42fec6c1abea2d845ae5549d (patch)
tree605b91900635732b5caa7312393237c5ad73fb79
parenta5f556179c396821ae5aac9b1d7bd3a73986fd95 (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);
}