wlan: Add support for suspend_noirq
Before going for suspend, suspend_noirq is called
to handle race condition
Change-Id: I5d0fd339fddd5cbf19868cb6869439099c74096f
CRs-Fixed: 2231816
diff --git a/CORE/HDD/src/wlan_hdd_dev_pwr.c b/CORE/HDD/src/wlan_hdd_dev_pwr.c
index 85c3349..92016c3 100644
--- a/CORE/HDD/src/wlan_hdd_dev_pwr.c
+++ b/CORE/HDD/src/wlan_hdd_dev_pwr.c
@@ -453,6 +453,53 @@
return 0;
}
+int __hddDevSuspendNoIrqHdlr(struct device *dev)
+{
+ int ret = 0;
+ hdd_context_t* pHddCtx = NULL;
+ pVosContextType pVosContext;
+ pVosSchedContext pSchedContext;
+
+ ENTER();
+
+ pHddCtx = (hdd_context_t*)wcnss_wlan_get_drvdata(dev);
+
+ /* Get the HDD context */
+ ret = wlan_hdd_validate_context(pHddCtx);
+ if (0 != ret)
+ {
+ return ret;
+ }
+
+ if(pHddCtx->isWlanSuspended != TRUE)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD,VOS_TRACE_LEVEL_FATAL,
+ "%s: WLAN is not in suspended state",__func__);
+ return -EPERM;
+ }
+ pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
+ if(pVosContext == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD,VOS_TRACE_LEVEL_FATAL,
+ "%s: Failed vos_get_global_context",__func__);
+ return -EPERM;
+ }
+
+ pSchedContext = &pVosContext->vosSched;
+
+ if (test_bit(RX_POST_EVENT, &pSchedContext->rxEventFlag))
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD,VOS_TRACE_LEVEL_INFO,
+ "%s: WLAN suspend is not honored",__func__);
+ return -EPERM;
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Suspend No IRQ done successfully",__func__);
+ EXIT();
+ return 0;
+}
+
int hddDevSuspendHdlr(struct device *dev)
{
int ret;
@@ -463,6 +510,19 @@
return ret;
}
+int hddDevSuspendNoIrqHdlr(struct device *dev)
+{
+ int ret;
+ vos_ssr_protect(__func__);
+ ret = __hddDevSuspendNoIrqHdlr(dev);
+ vos_ssr_unprotect(__func__);
+ return ret;
+}
+
+int hddDevResumeNoIrqHdlr(struct device *dev)
+{
+ return 0;
+}
/*----------------------------------------------------------------------------
@brief Function to resume the wlan driver.
@@ -520,6 +580,8 @@
static const struct dev_pm_ops pm_ops = {
.suspend = hddDevSuspendHdlr,
.resume = hddDevResumeHdlr,
+ .suspend_noirq = hddDevSuspendNoIrqHdlr,
+ .resume_noirq = hddDevResumeNoIrqHdlr
};
/*----------------------------------------------------------------------------