diff options
| author | Govind Singh <govinds@codeaurora.org> | 2016-09-12 11:44:12 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-09-21 13:36:02 +0530 |
| commit | 7fc52d2a37fc6f6e42fec6c1abea2d845ae5549d (patch) | |
| tree | 605b91900635732b5caa7312393237c5ad73fb79 | |
| parent | a5f556179c396821ae5aac9b1d7bd3a73986fd95 (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.c | 15 |
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); } |
