wlan: Enable wow before going to suspend state.
When WoWL is enabled, remember whether device is exiting from
WoWL because of wake-up indication or user explicitly disabling
WoWL. If device is coming out of WoWL because of wake-up indication
then re-enable it while going to suspend state.
Change-Id: I629993364413d0d4132b806452b42fdeb68c22ca
CRs-Fixed: 685406
diff --git a/CORE/HDD/inc/wlan_hdd_wowl.h b/CORE/HDD/inc/wlan_hdd_wowl.h
index 7cbbef3..5aeb487 100644
--- a/CORE/HDD/inc/wlan_hdd_wowl.h
+++ b/CORE/HDD/inc/wlan_hdd_wowl.h
@@ -181,10 +181,13 @@
/**============================================================================
@brief hdd_exit_wowl() - Function which will disable WoWL
+ @param wowlExitSrc: is wowl exiting because of wakeup pkt or user explicitly
+ disabling WoWL
+
@return : FALSE if any errors encountered
: TRUE otherwise
===========================================================================*/
-v_BOOL_t hdd_exit_wowl (hdd_adapter_t*pAdapter);
+v_BOOL_t hdd_exit_wowl (hdd_adapter_t*pAdapter, tWowlExitSource wowlExitSrc);
/**============================================================================
@brief hdd_init_wowl() - Init function which will initialize the WoWL module
diff --git a/CORE/HDD/src/wlan_hdd_debugfs.c b/CORE/HDD/src/wlan_hdd_debugfs.c
index f491dea..52b6a61 100644
--- a/CORE/HDD/src/wlan_hdd_debugfs.c
+++ b/CORE/HDD/src/wlan_hdd_debugfs.c
@@ -86,7 +86,7 @@
/* Disable wow */
if (!wow_enable) {
- if (!hdd_exit_wowl(pAdapter))
+ if (!hdd_exit_wowl(pAdapter, eWOWL_EXIT_USER))
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: hdd_exit_wowl failed!", __func__);
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 4cda1b9..bdcfbc5 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -4429,7 +4429,7 @@
switch (set_value)
{
case 0x00:
- hdd_exit_wowl(pAdapter);
+ hdd_exit_wowl(pAdapter, eWOWL_EXIT_USER);
break;
case 0x01:
case 0x02:
diff --git a/CORE/HDD/src/wlan_hdd_wowl.c b/CORE/HDD/src/wlan_hdd_wowl.c
index 93d7f1f..4b82ba8 100644
--- a/CORE/HDD/src/wlan_hdd_wowl.c
+++ b/CORE/HDD/src/wlan_hdd_wowl.c
@@ -93,7 +93,7 @@
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: Wake Reason %d",
__func__, pWakeReasonInd->ulReason );
- hdd_exit_wowl((hdd_adapter_t *)pContext);
+ hdd_exit_wowl( (hdd_adapter_t *)pContext, eWOWL_EXIT_WAKEIND );
}
#endif
@@ -572,15 +572,17 @@
/**============================================================================
@brief hdd_exit_wowl() - Function which will disable WoWL
+ @param wowlExitSrc: To know is wowl exiting because of wakeup pkt or user
+ explicitly disabling WoWL
@return : FALSE if any errors encountered
: TRUE otherwise
===========================================================================*/
-v_BOOL_t hdd_exit_wowl (hdd_adapter_t*pAdapter)
+v_BOOL_t hdd_exit_wowl (hdd_adapter_t*pAdapter, tWowlExitSource wowlExitSrc)
{
tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
eHalStatus halStatus;
- halStatus = sme_ExitWowl( hHal );
+ halStatus = sme_ExitWowl( hHal, wowlExitSrc );
if ( !HAL_STATUS_SUCCESS( halStatus ) )
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
diff --git a/CORE/SME/inc/pmc.h b/CORE/SME/inc/pmc.h
index e6164ef..0afe567 100644
--- a/CORE/SME/inc/pmc.h
+++ b/CORE/SME/inc/pmc.h
@@ -177,6 +177,7 @@
tANI_BOOLEAN pmcReady; /*whether eWNI_SME_SYS_READY_IND has been sent to PE or not */
tANI_BOOLEAN wowlEnabled; /* TRUE if WoWL is enabled */
tANI_BOOLEAN wowlModeRequired; /* TRUE if device should go to WOWL on entering BMPS */
+ tWowlExitSource wowlExitSrc; /*WoWl exiting because of wakeup pkt or user explicitly disabling WoWL*/
void (*enterWowlCallbackRoutine) (void *callbackContext, eHalStatus status); /* routine to call for wowl request */
void *enterWowlCallbackContext;/* value to be passed as parameter to routine specified above */
tSirSmeWowlEnterParams wowlEnterParams; /* WOWL mode configuration */
diff --git a/CORE/SME/inc/pmcApi.h b/CORE/SME/inc/pmcApi.h
index d0d965b..e085be2 100644
--- a/CORE/SME/inc/pmcApi.h
+++ b/CORE/SME/inc/pmcApi.h
@@ -214,8 +214,11 @@
} tPmcSmpsMode;
-
-
+typedef enum
+{
+ eWOWL_EXIT_USER,
+ eWOWL_EXIT_WAKEIND
+}tWowlExitSource;
/* Configuration parameters for Idle Mode Power Save (IMPS). */
@@ -418,7 +421,7 @@
#endif // WLAN_WAKEUP_EVENTS
tpSirSmeWowlEnterParams wowlEnterParams, tANI_U8 sessionId);
-extern eHalStatus pmcExitWowl (tHalHandle hHal);
+extern eHalStatus pmcExitWowl (tHalHandle hHal, tWowlExitSource wowlExitSrc);
extern eHalStatus pmcSetHostOffload (tHalHandle hHal, tpSirHostOffloadReq pRequest,
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 32433c2..e93d6cc 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -1499,7 +1499,7 @@
not even completed.
eHAL_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
---------------------------------------------------------------------------*/
-extern eHalStatus sme_ExitWowl (tHalHandle hHal);
+extern eHalStatus sme_ExitWowl (tHalHandle hHal, tWowlExitSource wowlExitSrc);
/* ---------------------------------------------------------------------------
diff --git a/CORE/SME/src/pmc/pmc.c b/CORE/SME/src/pmc/pmc.c
index 5409cb7..b8cf095 100644
--- a/CORE/SME/src/pmc/pmc.c
+++ b/CORE/SME/src/pmc/pmc.c
@@ -1814,9 +1814,6 @@
/* Call Wowl callback routine. */
if (pMac->pmc.enterWowlCallbackRoutine != NULL)
pMac->pmc.enterWowlCallbackRoutine(pMac->pmc.enterWowlCallbackContext, callbackStatus);
-
- pMac->pmc.enterWowlCallbackRoutine = NULL;
- pMac->pmc.enterWowlCallbackContext = NULL;
}
diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c
index 367945e..d49ccef 100644
--- a/CORE/SME/src/pmc/pmcApi.c
+++ b/CORE/SME/src/pmc/pmcApi.c
@@ -210,6 +210,7 @@
pMac->pmc.requestFullPowerPending = FALSE;
pMac->pmc.uapsdSessionRequired = FALSE;
pMac->pmc.wowlModeRequired = FALSE;
+ pMac->pmc.wowlExitSrc = eWOWL_EXIT_USER;
pMac->pmc.bmpsRequestedByHdd = FALSE;
pMac->pmc.remainInPowerActiveTillDHCP = FALSE;
pMac->pmc.remainInPowerActiveThreshold = 0;
@@ -1760,7 +1761,16 @@
status = pmcEnterBmpsCheck( pMac );
if(HAL_STATUS_SUCCESS( status ))
{
+ /* If DUT exits from WoWL because of wake-up indication then it enters
+ * into WoWL again. Disable WoWL only when user explicitly disables.
+ */
+ if(pMac->pmc.wowlModeRequired == FALSE && pMac->pmc.wowlExitSrc == eWOWL_EXIT_WAKEIND)
+ {
+ pMac->pmc.wowlModeRequired = TRUE;
+ }
+
status = pmcEnterRequestBmpsState(hHal);
+
/* Enter Request BMPS State. */
if ( HAL_STATUS_SUCCESS( status ) )
{
@@ -2472,6 +2482,11 @@
pMac->pmc.wowlModeRequired = TRUE;
+ /* By default set wowlExitSrc to eWOWL_EXIT_WAKEIND, so that device will
+ * come out of WoWL only when user explicity disables WoWL.
+ */
+ pMac->pmc.wowlExitSrc = eWOWL_EXIT_WAKEIND;
+
return eHAL_STATUS_PMC_PENDING;
}
@@ -2481,11 +2496,13 @@
SME will initiate exit from WoWLAN mode and device will be put in BMPS
mode.
\param hHal - The handle returned by macOpen.
+ wowlExitSrc - is wowl exiting because of wakeup pkt or user
+ explicitly disabling WoWL
\return eHalStatus
eHAL_STATUS_FAILURE Device cannot exit WoWLAN mode.
eHAL_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
---------------------------------------------------------------------------*/
-eHalStatus pmcExitWowl (tHalHandle hHal)
+eHalStatus pmcExitWowl (tHalHandle hHal, tWowlExitSource wowlExitSrc)
{
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
@@ -2503,13 +2520,24 @@
/* Clear any buffered command for entering WOWL */
pMac->pmc.wowlModeRequired = FALSE;
+ /* are we exiting from WoW because of wake indication
+ or user disabling this feature */
+ pMac->pmc.wowlExitSrc = wowlExitSrc;
+
/* Enter REQUEST_EXIT_WOWL State*/
if (pmcRequestExitWowlState(hHal) != eHAL_STATUS_SUCCESS)
return eHAL_STATUS_FAILURE;
- /* Clear the callback routines */
- pMac->pmc.enterWowlCallbackRoutine = NULL;
- pMac->pmc.enterWowlCallbackContext = NULL;
+ if (eWOWL_EXIT_USER == wowlExitSrc)
+ {
+ /* Clear the callback routines */
+ pMac->pmc.enterWowlCallbackRoutine = NULL;
+ pMac->pmc.enterWowlCallbackContext = NULL;
+#ifdef WLAN_WAKEUP_EVENTS
+ pMac->pmc.wakeReasonIndCB = NULL;
+ pMac->pmc.wakeReasonIndCBContext = NULL;
+#endif
+ }
return eHAL_STATUS_SUCCESS;
}
diff --git a/CORE/SME/src/pmc/pmcLogDump.c b/CORE/SME/src/pmc/pmcLogDump.c
index 6bd7ad8..ea3043e 100644
--- a/CORE/SME/src/pmc/pmcLogDump.c
+++ b/CORE/SME/src/pmc/pmcLogDump.c
@@ -275,7 +275,7 @@
dump_pmc_exit_wowl( tpAniSirGlobal pMac, tANI_U32 arg1, tANI_U32 arg2, tANI_U32 arg3, tANI_U32 arg4, char *p)
{
(void) arg1; (void) arg2; (void) arg3; (void) arg4;
- (void)sme_ExitWowl(pMac);
+ (void)sme_ExitWowl(pMac, eWOWL_EXIT_USER);
return p;
}
@@ -369,7 +369,7 @@
pmcMessageProcessor(pMac, &smeRsp);
//Exit Wowl
- sme_ExitWowl(pMac);
+ sme_ExitWowl(pMac, eWOWL_EXIT_USER);
smeRsp.messageType = eWNI_PMC_EXIT_WOWL_RSP;
pmcMessageProcessor(pMac, &smeRsp);
return p;
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 3e5ff6c..8ef7293 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -4484,7 +4484,7 @@
eHAL_STATUS_FAILURE Device cannot exit WoWLAN mode.
eHAL_STATUS_SUCCESS Request accepted to exit WoWLAN mode.
---------------------------------------------------------------------------*/
-eHalStatus sme_ExitWowl (tHalHandle hHal)
+eHalStatus sme_ExitWowl (tHalHandle hHal, tWowlExitSource wowlExitSrc)
{
eHalStatus status = eHAL_STATUS_FAILURE;
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
@@ -4493,7 +4493,7 @@
status = sme_AcquireGlobalLock( &pMac->sme );
if ( HAL_STATUS_SUCCESS( status ) )
{
- status = pmcExitWowl (hHal);
+ status = pmcExitWowl (hHal, wowlExitSrc);
sme_ReleaseGlobalLock( &pMac->sme );
}
@@ -8244,9 +8244,6 @@
if (pMac->pmc.wakeReasonIndCB != NULL)
pMac->pmc.wakeReasonIndCB(pMac->pmc.wakeReasonIndCBContext, pWakeReasonInd);
- pMac->pmc.wakeReasonIndCB = NULL;
- pMac->pmc.wakeReasonIndCBContext = NULL;
-
smsLog(pMac, LOG1, "Wake Reason Indication in %s(), reason=%d", __func__, pWakeReasonInd->ulReason);
}