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
 };
 
 /*----------------------------------------------------------------------------