OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / system / wlan / ti / wilink_6_1 / stad / src / Sta_Management / PowerMgr.c
diff --git a/system/wlan/ti/wilink_6_1/stad/src/Sta_Management/PowerMgr.c b/system/wlan/ti/wilink_6_1/stad/src/Sta_Management/PowerMgr.c
new file mode 100644 (file)
index 0000000..4fb21e4
--- /dev/null
@@ -0,0 +1,1415 @@
+/*
+ * PowerMgr.c
+ *
+ * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.      
+ * All rights reserved.                                                  
+ *                                                                       
+ * Redistribution and use in source and binary forms, with or without    
+ * modification, are permitted provided that the following conditions    
+ * are met:                                                              
+ *                                                                       
+ *  * Redistributions of source code must retain the above copyright     
+ *    notice, this list of conditions and the following disclaimer.      
+ *  * Redistributions in binary form must reproduce the above copyright  
+ *    notice, this list of conditions and the following disclaimer in    
+ *    the documentation and/or other materials provided with the         
+ *    distribution.                                                      
+ *  * Neither the name Texas Instruments nor the names of its            
+ *    contributors may be used to endorse or promote products derived    
+ *    from this software without specific prior written permission.      
+ *                                                                       
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** \file PowerMgr.c
+ *  \brief This is the PowerMgr module implementation.
+ *  \
+ *  \date 24-Oct-2005
+ */
+
+/****************************************************************************
+ *                                                                          *
+ *   MODULE:  PowerMgr                                                      *
+ *   PURPOSE: PowerMgr Module implementation.                               *
+ *                                                                          *
+ ****************************************************************************/
+
+#define __FILE_ID__  FILE_ID_71
+#include "tidef.h"
+#include "osApi.h"
+#include "timer.h"
+#include "paramOut.h"
+#include "report.h"
+#include "PowerMgr.h"
+#include "PowerMgr_API.h"
+#include "TrafficMonitorAPI.h"
+#include "qosMngr_API.h"
+#include "siteMgrApi.h"
+#include "TWDriver.h"
+#include "SoftGeminiApi.h"
+#include "DrvMainModules.h"
+#include "PowerMgrKeepAlive.h"
+#include "CmdBld.h"
+
+
+/*****************************************************************************
+ **         Defines                                                         **
+ *****************************************************************************/
+#define DEFAULT_LISTEN_INTERVAL (1)
+#define BET_DISABLE 0
+#define BET_ENABLE  1
+
+
+/*****************************************************************************
+ **         Private Function prototypes                                      **
+ *****************************************************************************/
+
+static void         powerSaveCompleteCB(TI_HANDLE hPowerMgr,TI_UINT8 PSMode,TI_UINT8 transStatus);
+static void         PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, TI_UINT32 cookie );
+static void         powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr);
+static void         powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr);
+static void         powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr);
+static void         powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured);
+static void         powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode);
+static void         PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr,PowerMgr_PowerMode_e dozeMode);
+static void         PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, TI_UINT32 cookie );
+static void         PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr );
+static void            powerMgr_PsPollFailureTimeout( TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured );
+static void            powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr );
+static TI_STATUS    powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,TI_UINT8 listenInterval, ETnetWakeOn tnetWakeupOn);
+static TI_STATUS    powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr);
+static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr);
+
+
+/*****************************************************************************
+ **         Public Function prototypes                                      **
+ *****************************************************************************/
+
+
+/****************************************************************************************
+ *                        PowerMgr_create                                                           *
+ ****************************************************************************************
+DESCRIPTION: Creates the object of the power Manager. 
+                performs the following:
+                -   Allocate the Power Manager handle
+                -   Creates the retry timer
+                                                                                                                   
+INPUT:          - hOs - Handle to OS        
+OUTPUT:     
+RETURN:     Handle to the Power Manager module on success, NULL otherwise
+****************************************************************************************/
+TI_HANDLE PowerMgr_create(TI_HANDLE hOs)
+{
+
+    PowerMgr_t * pPowerMgr = NULL;
+    pPowerMgr = (PowerMgr_t*) os_memoryAlloc (hOs, sizeof(PowerMgr_t));
+    if ( pPowerMgr == NULL )
+    {
+        WLAN_OS_REPORT(("PowerMgr_create - Memory Allocation Error!\n"));
+        return NULL;
+    }
+
+    os_memoryZero (hOs, pPowerMgr, sizeof(PowerMgr_t));
+
+    pPowerMgr->hOS = hOs;
+
+    /* create the power manager keep-alive sub module */
+    pPowerMgr->hPowerMgrKeepAlive = powerMgrKL_create (hOs);
+
+    return pPowerMgr;
+
+}
+
+
+/****************************************************************************************
+*                        powerSrv_destroy                                                          *
+****************************************************************************************
+DESCRIPTION: Destroy the object of the power Manager.
+               -   delete Power Manager alocation
+               -   call the destroy function of the timer
+                                                                                                                  
+INPUT:          - hPowerMgr - Handle to the Power Manager   
+OUTPUT:     
+RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
+****************************************************************************************/
+TI_STATUS PowerMgr_destroy(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    /* destroy the power manager keep-alive sub module */
+    powerMgrKL_destroy (pPowerMgr->hPowerMgrKeepAlive);
+
+    if (pPowerMgr->hRetryPsTimer)
+    {
+        tmr_DestroyTimer (pPowerMgr->hRetryPsTimer);
+    }
+
+    if ( pPowerMgr->hPsPollFailureTimer != NULL )
+    {
+        tmr_DestroyTimer(pPowerMgr->hPsPollFailureTimer);
+    }
+    os_memoryFree(pPowerMgr->hOS, pPowerMgr, sizeof(PowerMgr_t));
+
+    return TI_OK;
+}
+
+
+/****************************************************************************************
+*                        PowerMgr_init                                                         *
+****************************************************************************************
+DESCRIPTION: Power Manager init function, called in init phase.
+                                                                                                                 
+INPUT:     pStadHandles  - The driver modules handles
+
+OUTPUT:     
+
+RETURN:    void
+****************************************************************************************/
+void PowerMgr_init (TStadHandlesList *pStadHandles)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)(pStadHandles->hPowerMgr);
+
+    pPowerMgr->hReport          = pStadHandles->hReport;
+    pPowerMgr->hTrafficMonitor  = pStadHandles->hTrafficMon;
+    pPowerMgr->hSiteMgr         = pStadHandles->hSiteMgr;
+    pPowerMgr->hTWD             = pStadHandles->hTWD;
+    pPowerMgr->hSoftGemini      = pStadHandles->hSoftGemini;
+    pPowerMgr->hTimer           = pStadHandles->hTimer;
+    pPowerMgr->psEnable         = TI_FALSE;
+
+    /* initialize the power manager keep-alive sub module */
+    powerMgrKL_init (pPowerMgr->hPowerMgrKeepAlive, pStadHandles);
+
+}
+
+
+TI_STATUS PowerMgr_SetDefaults (TI_HANDLE hPowerMgr, PowerMgrInitParams_t* pPowerMgrInitParams)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    TI_UINT8 index;
+    /* used to initialize the Traffic Monitor for Auto Ps events */
+    TrafficAlertRegParm_t tmRegParam;
+    TI_STATUS status;
+
+       pPowerMgr->reAuthActivePriority         = pPowerMgrInitParams->reAuthActivePriority;
+
+    /* init power management options */
+    pPowerMgr->beaconListenInterval = pPowerMgrInitParams->beaconListenInterval;
+    pPowerMgr->dtimListenInterval = pPowerMgrInitParams->dtimListenInterval;
+    pPowerMgr->defaultPowerLevel =  pPowerMgrInitParams->defaultPowerLevel;
+    pPowerMgr->PowerSavePowerLevel =  pPowerMgrInitParams->PowerSavePowerLevel;
+    pPowerMgr->powerMngPriority  = POWER_MANAGER_USER_PRIORITY;
+    pPowerMgr->maxFullBeaconInterval = pPowerMgrInitParams->MaximalFullBeaconReceptionInterval;
+    pPowerMgr->PsPollDeliveryFailureRecoveryPeriod = pPowerMgrInitParams->PsPollDeliveryFailureRecoveryPeriod;
+
+    /*
+     set AUTO PS parameters 
+     */
+    pPowerMgr->autoModeInterval = pPowerMgrInitParams->autoModeInterval;
+    pPowerMgr->autoModeActiveTH = pPowerMgrInitParams->autoModeActiveTH;
+    pPowerMgr->autoModeDozeTH = pPowerMgrInitParams->autoModeDozeTH;
+    pPowerMgr->autoModeDozeMode = pPowerMgrInitParams->autoModeDozeMode;
+
+    /*
+     register threshold in the traffic monitor.
+     */
+       pPowerMgr->betEnable = pPowerMgrInitParams->BetEnable; /* save BET enable flag for CLI configuration */
+       pPowerMgr->betTrafficEnable = TI_FALSE;                   /* starting without BET */
+
+    /* BET thresholds */
+    /* general parameters */
+    tmRegParam.Context = pPowerMgr;
+    tmRegParam.TimeIntervalMs = BET_INTERVAL_VALUE;
+    tmRegParam.Trigger = TRAFF_EDGE;
+    tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
+    tmRegParam.CallBack = PowerMgrConfigBetToFw;
+
+    /* BET enable event */
+    tmRegParam.Direction = TRAFF_DOWN;
+    tmRegParam.Threshold = pPowerMgrInitParams->BetEnableThreshold;
+    pPowerMgr->BetEnableThreshold = pPowerMgrInitParams->BetEnableThreshold;
+    tmRegParam.Cookie = (TI_UINT32)BET_ENABLE;
+    pPowerMgr->betEnableTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
+                                                             &tmRegParam,
+                                                             TI_FALSE);
+    /* BET disable event */
+    tmRegParam.Direction = TRAFF_UP;
+    tmRegParam.Threshold = pPowerMgrInitParams->BetDisableThreshold;
+    pPowerMgr->BetDisableThreshold = pPowerMgrInitParams->BetDisableThreshold;
+    tmRegParam.Cookie = (TI_UINT32)BET_DISABLE;
+    pPowerMgr->betDisableTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
+                                                             &tmRegParam,
+                                                             TI_FALSE);
+
+    if ( (pPowerMgr->betDisableTMEvent == NULL) ||
+         (pPowerMgr->betEnableTMEvent == NULL))
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - TM - ERROR registering BET events - ABROTING init!\n");
+        return TI_NOK;
+    }
+    /*
+    set the events as resets for one another
+    */
+    status = TrafficMonitor_SetRstCondition (pPowerMgr->hTrafficMonitor,
+                                            pPowerMgr->betDisableTMEvent,
+                                            pPowerMgr->betEnableTMEvent,
+                                            TI_TRUE);
+    if ( status != TI_OK )
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR binding BET events - ABROTING init!\n");
+        return TI_NOK;
+    }
+
+    /* general parameters */
+    tmRegParam.Context = pPowerMgr;
+
+    tmRegParam.Cookie = (TI_UINT32)POWER_MODE_ACTIVE;
+    tmRegParam.TimeIntervalMs = pPowerMgr->autoModeInterval;
+    tmRegParam.Trigger = TRAFF_EDGE;
+    tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
+
+    /* Active threshold */
+    tmRegParam.CallBack = PowerMgrTMThresholdCrossCB;
+    tmRegParam.Direction = TRAFF_UP;
+    tmRegParam.Threshold = pPowerMgr->autoModeActiveTH;
+    pPowerMgr->passToActiveTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
+                                                             &tmRegParam,
+                                                             TI_FALSE);
+    /* Doze threshold */
+    tmRegParam.Direction = TRAFF_DOWN;
+    tmRegParam.Threshold = pPowerMgr->autoModeDozeTH;
+    tmRegParam.Cookie = (TI_UINT32)POWER_MODE_SHORT_DOZE; /* diffrentiation between long / short doze is done at the 
+                                                          CB, according to configuration at time of CB invokation */
+    pPowerMgr->passToDozeTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
+                                                           &tmRegParam,
+                                                           TI_FALSE);
+
+    if ( (pPowerMgr->passToActiveTMEvent == NULL) ||
+         (pPowerMgr->passToDozeTMEvent == NULL))
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR registering Auto mode events - ABROTING init!\n");
+        return TI_NOK;
+    }
+
+    /*
+    set the events as resets for one another
+    */
+    status = TrafficMonitor_SetRstCondition (pPowerMgr->hTrafficMonitor,
+                                            pPowerMgr->passToActiveTMEvent,
+                                            pPowerMgr->passToDozeTMEvent,
+                                            TI_TRUE);
+    if ( status != TI_OK )
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR binding Auto mode events - ABROTING init!\n");
+        return TI_NOK;
+    }
+
+    /*
+    configure the initialize power mode
+    */
+    pPowerMgr->desiredPowerModeProfile = pPowerMgrInitParams->powerMode;
+    for ( index = 0;index < POWER_MANAGER_MAX_PRIORITY;index++ )
+    {
+        pPowerMgr->powerMngModePriority[index].powerMode = pPowerMgr->desiredPowerModeProfile;
+        pPowerMgr->powerMngModePriority[index].priorityEnable = TI_FALSE;
+    }
+    pPowerMgr->powerMngModePriority[POWER_MANAGER_USER_PRIORITY].priorityEnable = TI_TRUE;
+
+    if (pPowerMgr->reAuthActivePriority)
+               pPowerMgr->powerMngModePriority[POWER_MANAGER_REAUTH_PRIORITY].powerMode = POWER_MODE_ACTIVE;
+
+    /* set the defualt power policy */
+    TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
+
+
+    /*create the timers */
+    pPowerMgr->hRetryPsTimer = tmr_CreateTimer(pPowerMgr->hTimer);
+
+    pPowerMgr->hPsPollFailureTimer = tmr_CreateTimer(pPowerMgr->hTimer);
+
+    if ( (pPowerMgr->hPsPollFailureTimer == NULL) || (pPowerMgr->hRetryPsTimer == NULL))
+    {
+TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_SetDefaults - ERROR creating timers - ABROTING init!\n");
+        return TI_NOK;
+    }
+
+    /* Register and Enable the PsPoll failure */
+    TWD_RegisterEvent (pPowerMgr->hTWD,
+        TWD_OWN_EVENT_PSPOLL_DELIVERY_FAILURE,
+        (void *)PowerMgr_PsPollFailureCB, 
+        hPowerMgr);
+    TWD_EnableEvent (pPowerMgr->hTWD, TWD_OWN_EVENT_PSPOLL_DELIVERY_FAILURE);
+
+    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr Initialized\n");
+
+    /* set defaults for the power manager keep-alive sub module */
+    powerMgrKL_setDefaults (pPowerMgr->hPowerMgrKeepAlive);
+
+    return TI_OK;
+}
+
+/****************************************************************************************
+ *                        PowerMgr_startPS                                                          *
+ ****************************************************************************************
+DESCRIPTION: Start the power save algorithm of the driver and also the 802.11 PS.
+                                                                                                                   
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+
+OUTPUT:     
+RETURN:    TI_STATUS - TI_OK or PENDING on success else TI_NOK.\n
+****************************************************************************************/
+TI_STATUS PowerMgr_startPS(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+       int frameCount;
+
+    
+    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_startPS - called\n");
+
+    if ( pPowerMgr->psEnable == TI_TRUE )
+    {
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_startPS - PS mechanism is already Enable! Aborting psEnable=%d !\n", pPowerMgr->psEnable);
+        /*
+        this is a FATAL ERROR of the power manager!
+        already enable power-save! thus return TI_OK, but there is an error in the upper
+        layer that call tp PowerMgr_startPS() twice - should know that power-save
+        is already enable therefor print the Error message.
+        or
+        the state machine while NOT in PS can be only in ACTIVE state and in some cases in
+        PS_PENDING state. therefore the state machine is out of sync from it logic!
+        */
+        return TI_OK;
+    }
+
+    pPowerMgr->psEnable = TI_TRUE;
+    /*set the correct rate after connection*/
+    powerMgrNullPacketRateConfiguration(hPowerMgr);
+    /*
+    if in auto mode then need to refer to the threshold cross indication from the traffic monitor,
+    else it need to refer to the configured power mode profile from the user.
+    */
+    pPowerMgr->desiredPowerModeProfile = powerMgrGetHighestPriority(hPowerMgr);
+
+    if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
+    {
+        powerMgrStartAutoPowerMode(hPowerMgr);
+    }
+    else /*not auto mode - according to the current profle*/
+    {
+        powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->desiredPowerModeProfile);
+    }
+
+    TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->PowerSavePowerLevel);
+
+   if ((pPowerMgr->betEnable)&&( pPowerMgr->desiredPowerModeProfile != POWER_MODE_ACTIVE ))
+   {
+               TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
+                                                                          pPowerMgr->betEnableTMEvent);
+
+               TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
+                                                                          pPowerMgr->betDisableTMEvent);
+
+       
+               frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
+       
+               if (frameCount < pPowerMgr->BetEnableThreshold) 
+               {
+            pPowerMgr->betTrafficEnable = TI_TRUE;
+            
+               }
+               else if (frameCount > pPowerMgr->BetDisableThreshold) 
+               {
+                       pPowerMgr->betTrafficEnable = TI_FALSE;
+        }
+       
+               PowerMgrConfigBetToFw(hPowerMgr,pPowerMgr->betTrafficEnable);
+       }
+    
+    /* also start the power manager keep-alive sub module */
+    powerMgrKL_start (pPowerMgr->hPowerMgrKeepAlive);
+
+    return TI_OK;
+}
+
+
+/****************************************************************************************
+ *                        PowerMgr_stopPS                                                           *
+ ****************************************************************************************
+DESCRIPTION: Stop the power save algorithm of the driver and also the 802.11 PS.
+                                                                                                                               
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+
+OUTPUT:     
+RETURN:    TI_STATUS - TI_OK or PENDING on success else TI_NOK.\n
+****************************************************************************************/
+TI_STATUS PowerMgr_stopPS(TI_HANDLE hPowerMgr, TI_BOOL bDisconnect)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    /*TI_STATUS status;*/
+
+    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_stopPS - called\n");
+
+    if ( pPowerMgr->psEnable == TI_FALSE )
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_stopPS - PS is already Disable! Aborting!\n");
+        /*
+        Print Info message incase callng PowerMgr_stopPS() more than once in a row, without
+        calling to PowerMgr_startPS() in the middle.
+        this will return with TI_OK and not doing the Stop action!
+        */
+        return TI_OK;
+    }
+
+    pPowerMgr->psEnable = TI_FALSE;
+    tmr_StopTimer (pPowerMgr->hRetryPsTimer);
+
+    /* Check if PsPoll work-around is currently enabled */
+    if ( pPowerMgr->powerMngModePriority[POWER_MANAGER_PS_POLL_FAILURE_PRIORITY].priorityEnable == TI_TRUE)
+    {
+        tmr_StopTimer(pPowerMgr->hPsPollFailureTimer);
+        /* Exit the PsPoll work-around */
+        powerMgr_PsPollFailureTimeout( hPowerMgr, TI_FALSE );
+    }
+
+    if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
+    {
+        powerMgrDisableThresholdsIndications(hPowerMgr);
+    }
+
+    TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_OFF, TI_FALSE, NULL, NULL, NULL);
+
+    /* set the power policy of the system */
+    TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
+    if ((pPowerMgr->betEnable)&&( pPowerMgr->desiredPowerModeProfile != POWER_MODE_ACTIVE ))
+       {
+               TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
+                                                                         pPowerMgr->betEnableTMEvent);
+
+               TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
+                                                                         pPowerMgr->betDisableTMEvent);
+       }
+
+   /* also stop the power manager keep-alive sub module */
+    powerMgrKL_stop (pPowerMgr->hPowerMgrKeepAlive, bDisconnect);
+
+    return TI_OK;
+}
+
+
+/****************************************************************************************
+ *                        PowerMgr_getPsStatus                                                          *
+ ****************************************************************************************
+DESCRIPTION: returns the 802.11 power save status (enable / disable).
+                                                                                                                               
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+
+OUTPUT:     
+RETURN:    TI_BOOL - TI_TRUE if enable else TI_FALSE.\n
+****************************************************************************************/
+TI_BOOL PowerMgr_getPsStatus(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    return  TWD_GetPsStatus (pPowerMgr->hTWD);
+}
+
+
+/****************************************************************************************
+ *                        PowerMgr_setPowerMode                                                         *
+ ****************************************************************************************
+DESCRIPTION: Configure of the PowerMode profile (auto / active / short doze / long doze).
+                                                                                                                               
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+            - thePowerMode      - the requested power mode (auto / active / short doze / long doze).
+OUTPUT:     
+RETURN:    TI_STATUS - TI_OK on success else TI_NOK.\n
+****************************************************************************************/
+TI_STATUS PowerMgr_setPowerMode(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    PowerMgr_PowerMode_e powerMode;
+
+    /*in this way we will run with the highest priority that is enabled*/
+    powerMode = powerMgrGetHighestPriority(hPowerMgr);
+
+    /* sanity checking */
+    if ( powerMode >= POWER_MODE_MAX)
+    {
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setPowerMode - unknown parameter: %d\n", powerMode);
+        return TI_NOK;
+    }
+
+    TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setPowerMode, power mode = %d\n", powerMode);
+
+    if ( pPowerMgr->desiredPowerModeProfile != powerMode )
+    {
+        PowerMgr_PowerMode_e previousPowerModeProfile;
+        previousPowerModeProfile = pPowerMgr->desiredPowerModeProfile;
+        pPowerMgr->desiredPowerModeProfile = powerMode;
+
+        if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
+        {
+            if ( pPowerMgr->psEnable == TI_TRUE )
+            {
+                powerMgrStartAutoPowerMode(hPowerMgr);
+            }
+
+            /*
+            the transitions of state will be done according to the events from the
+            traffic monitor - therefor abort and wait event from the traffic monitor.
+            */
+            return TI_OK;
+        }
+        else if ( previousPowerModeProfile == POWER_MODE_AUTO )
+        {
+            /*
+            if the old power mode is AUTO and the new power mode is NOT then need
+            to disable the thresholds indications from the traffic monitor.
+            */
+            powerMgrDisableThresholdsIndications(hPowerMgr);
+        }
+        if ( pPowerMgr->psEnable == TI_TRUE )
+        {
+            powerMgrPowerProfileConfiguration(hPowerMgr, powerMode);
+        }
+    }
+    else
+    {
+        /*
+        the power mode is already configure to the module - don't need to do anything!
+        */
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgr_setPowerMode - desiredPowerModeProfile == thePowerMode (=%d), ABORTING!\n", powerMode);
+    }
+
+    return TI_OK;
+}
+
+
+/****************************************************************************************
+ *                        PowerMgr_setDozeModeInAuto                                    *
+ ****************************************************************************************
+DESCRIPTION: Configure the doze mode (short-doze / long-doze) that auto mode will toggle between doze vs active.                                                                                        
+INPUT:      - hPowerMgr             - Handle to the Power Manager
+            - dozeMode      - the requested doze mode when Mgr is in Auto mode (short-doze / long-doze)
+OUTPUT:     
+RETURN:   
+****************************************************************************************/
+void PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e dozeMode)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    PowerMgr_PowerMode_e powerMode = powerMgrGetHighestPriority(hPowerMgr);
+
+    /* check if we are trying to configure the same Doze mode */
+    if ( dozeMode != pPowerMgr->autoModeDozeMode )
+    {
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d \n", dozeMode);
+
+        pPowerMgr->autoModeDozeMode = dozeMode;
+
+        /* in case we are already in Auto mode, we have to set the wake up condition MIB */
+        if ( powerMode == POWER_MODE_AUTO )
+        {
+            if ( dozeMode == POWER_MODE_SHORT_DOZE )
+            {
+                if ( pPowerMgr->beaconListenInterval > 1 )
+                {
+                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);       
+                }
+                else
+                {
+                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);     
+                }
+            }
+            else  /* POWER_MODE_LONG_DOZE */
+            {
+                if ( pPowerMgr->dtimListenInterval > 1 )
+                {
+                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);       
+                }
+                else
+                {
+                    powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);     
+                }
+            }
+
+            TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setDozeModeInAuto - already in Auto\n");
+        }
+    }
+    else
+    {
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d (same same ...)\n", dozeMode);
+    }
+}
+
+/****************************************************************************************
+ *                        PowerMgr_getPowerMode                                                         *
+ ****************************************************************************************
+DESCRIPTION: Get the current PowerMode of the PowerMgr module. 
+                                                                                                                               
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+OUTPUT:     
+RETURN:    PowerMgr_PowerMode_e - (auto / active / short doze / long doze).\n
+****************************************************************************************/
+PowerMgr_PowerMode_e PowerMgr_getPowerMode(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    return pPowerMgr->desiredPowerModeProfile;
+}
+
+
+TI_STATUS powerMgr_setParam(TI_HANDLE thePowerMgrHandle,
+                            paramInfo_t *theParamP)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
+
+    switch ( theParamP->paramType )
+    {
+    case POWER_MGR_POWER_MODE:
+        pPowerMgr->powerMngModePriority[theParamP->content.powerMngPowerMode.PowerMngPriority].powerMode
+                        = theParamP->content.powerMngPowerMode.PowerMode;
+        PowerMgr_setPowerMode(thePowerMgrHandle);
+        if (pPowerMgr->betEnable)
+        PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betEnable );
+        break;
+
+    case POWER_MGR_DISABLE_PRIORITY:
+        pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = TI_FALSE;
+        PowerMgr_setPowerMode(thePowerMgrHandle);
+        break;
+
+    case POWER_MGR_ENABLE_PRIORITY:
+        pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = TI_TRUE;
+        PowerMgr_setPowerMode(thePowerMgrHandle);
+        break;
+
+    case POWER_MGR_POWER_LEVEL_PS:
+        pPowerMgr->PowerSavePowerLevel = theParamP->content.PowerSavePowerLevel;
+        /* If we are connected, config the new power level (this param is for connected state) */
+               if (pPowerMgr->psEnable)
+        {
+                       TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->PowerSavePowerLevel);
+               }
+        break;
+
+    case POWER_MGR_POWER_LEVEL_DEFAULT:
+        pPowerMgr->defaultPowerLevel = theParamP->content.DefaultPowerLevel;
+        /* If we are NOT connected, config the new power level (this param is for disconnected state) */
+               if (!pPowerMgr->psEnable)
+               {       
+                       TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
+               }
+        break;
+
+    case POWER_MGR_POWER_LEVEL_DOZE_MODE:
+        PowerMgr_setDozeModeInAuto(thePowerMgrHandle,theParamP->content.powerMngDozeMode);
+        if (pPowerMgr->betEnable)
+        PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betEnable );
+        break;
+
+    case POWER_MGR_KEEP_ALIVE_ENA_DIS:
+    case POWER_MGR_KEEP_ALIVE_ADD_REM:
+        return powerMgrKL_setParam (pPowerMgr->hPowerMgrKeepAlive, theParamP);
+        break;
+
+    default:
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setParam - ERROR - Param is not supported, %d\n\n", theParamP->paramType);
+
+        return PARAM_NOT_SUPPORTED;
+    }
+
+    return TI_OK;
+}
+
+
+
+TI_STATUS powerMgr_getParam(TI_HANDLE thePowerMgrHandle,
+                            paramInfo_t *theParamP)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
+
+    switch ( theParamP->paramType )
+    {
+    case POWER_MGR_POWER_MODE:
+        theParamP->content.PowerMode = PowerMgr_getPowerMode(thePowerMgrHandle);
+        break;
+
+    case POWER_MGR_POWER_LEVEL_PS:
+        theParamP->content.PowerSavePowerLevel = pPowerMgr->PowerSavePowerLevel;
+        break;
+
+    case POWER_MGR_POWER_LEVEL_DEFAULT:
+        theParamP->content.DefaultPowerLevel = pPowerMgr->defaultPowerLevel;
+        break;
+
+    case POWER_MGR_POWER_LEVEL_DOZE_MODE:
+        theParamP->content.powerMngDozeMode = pPowerMgr->autoModeDozeMode;
+        break;
+
+    case POWER_MGR_KEEP_ALIVE_GET_CONFIG:
+        return powerMgrKL_getParam (pPowerMgr->hPowerMgrKeepAlive, theParamP);
+        break;
+
+    case POWER_MGR_GET_POWER_CONSUMPTION_STATISTICS:
+       
+       return cmdBld_ItrPowerConsumptionstat (pPowerMgr->hTWD,
+                             theParamP->content.interogateCmdCBParams.fCb, 
+                             theParamP->content.interogateCmdCBParams.hCb,
+                             (void*)theParamP->content.interogateCmdCBParams.pCb);
+
+
+
+             break;
+
+
+    default:
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_getParam - ERROR - Param is not supported, %d\n\n", theParamP->paramType);
+        return PARAM_NOT_SUPPORTED;
+    }
+
+    return TI_OK;
+}
+
+
+/*****************************************************************************
+ **         Private Function prototypes                                     **
+ *****************************************************************************/
+
+
+/****************************************************************************************
+ *                        powerSaveCompleteCB                                                       *
+ ****************************************************************************************
+DESCRIPTION: Callback for the Power server complete - gets the result of the request 
+              for PS or exit PS.
+                                                                                                                               
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+            - PSMode
+            - trasStatus            - result string form the FW.
+OUTPUT:     
+RETURN:    void.\n
+****************************************************************************************/
+static void powerSaveCompleteCB(TI_HANDLE hPowerMgr,TI_UINT8 PSMode,TI_UINT8 transStatus)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerSaveCompleteCB, statud = %d\n", transStatus);
+
+    /* Handling the event*/
+    switch ( (EventsPowerSave_e)transStatus )
+    {
+    case ENTER_POWER_SAVE_FAIL:
+    case EXIT_POWER_SAVE_FAIL:
+        pPowerMgr->lastPsTransaction = transStatus;
+        tmr_StartTimer (pPowerMgr->hRetryPsTimer,
+                        powerMgrRetryPsTimeout,
+                        (TI_HANDLE)pPowerMgr,
+                      RE_ENTER_PS_TIMEOUT,
+                      TI_FALSE);
+        break;
+
+    case ENTER_POWER_SAVE_SUCCESS:
+    case EXIT_POWER_SAVE_SUCCESS:
+        break;
+
+    default:
+        TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerSaveCompleteCB: invliad status: %d\n", transStatus);
+        break;
+    }
+}
+
+/**
+ * \\n
+ * \date 30-Aug-2006\n
+ * \brief Power manager callback fro TM event notification
+ *
+ * Function Scope \e Public.\n
+ * \param hPowerMgr - handle to the power maanger object.\n
+ * \param cookie - values supplied during event registration (active / doze).\n
+ */
+static void PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, TI_UINT32 cookie )
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgrTMThresholdCrossCB - TM notified threshold crossed, cookie: %d\n", cookie);
+
+    /* sanity cehcking - TM notifications should only be received when PM is enabled and in auto mode */
+    if ( (pPowerMgr->psEnable == TI_TRUE) && (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO))
+    {
+        switch ((PowerMgr_PowerMode_e)cookie)
+        {
+        case POWER_MODE_ACTIVE:
+            powerMgrPowerProfileConfiguration( hPowerMgr, POWER_MODE_ACTIVE );
+            break;
+
+        /* threshold crossed down - need to enter configured doze mode */
+        case POWER_MODE_SHORT_DOZE:
+            powerMgrPowerProfileConfiguration( hPowerMgr, pPowerMgr->autoModeDozeMode );
+            break;
+
+        default:
+            TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgrTMThresholdCrossCB: TM notification with invalid cookie: %d!\n", cookie);
+            break;
+        }
+    }
+    else
+    {
+        TRACE2( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgrTMThresholdCrossCB: TM motification when psEnable is :%d or desired profile is: %d\n", pPowerMgr->psEnable, pPowerMgr->desiredPowerModeProfile);
+    }
+
+}
+
+/****************************************************************************************
+*                        powerMgrDisableThresholdsIndications                                           *
+*****************************************************************************************
+DESCRIPTION: This will send a disable message to the traffic monitor,
+                 to stop sending indications on threshold pass.
+
+                                                                                                                              
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+OUTPUT:     
+RETURN:    void.\n
+****************************************************************************************/
+static void powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    /*
+    auto is not a static/fix state, else its a dynamic state that flows between
+    the 3 static/fix states: active, short-doze and long-doze.
+    */
+    TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
+                                  pPowerMgr->passToActiveTMEvent);
+
+    TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
+                                  pPowerMgr->passToDozeTMEvent);
+
+}
+
+
+/****************************************************************************************
+*                        powerMgrEnableThresholdsIndications                                            *
+*****************************************************************************************
+DESCRIPTION: TThis will send an enable message to the traffic monitor,
+                to start sending indications on threshold pass.
+
+                                                                                                                              
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+OUTPUT:     
+RETURN:    void.\n
+****************************************************************************************/
+static void powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrEnableThresholdsIndications called\n");
+    /*
+    auto is not a static/fix state, but rather a dynamic state that flows between
+    the 3 static/fix states: active, short-doze and long-doze.
+    */
+    TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
+                                   pPowerMgr->passToActiveTMEvent);
+
+    TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
+                                   pPowerMgr->passToDozeTMEvent);
+
+}
+
+
+/****************************************************************************************
+*                        powerMgrStartAutoPowerMode                                                 *
+*****************************************************************************************
+DESCRIPTION: configure the power manager to enter into AUTO power mode. 
+             The power manager will deside what power level will be applied 
+             acording to the traffic monitor.
+                                                                                                                              
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+OUTPUT:     
+RETURN:    void.\n
+****************************************************************************************/
+static void powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    int frameCount;
+
+    frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
+
+    TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrStartAutoPowerMode: Starting auto power mode,");
+
+    /*Activates the correct profile*/
+    if ( frameCount >= pPowerMgr->autoModeActiveTH )
+    {
+        powerMgrPowerProfileConfiguration(hPowerMgr, POWER_MODE_ACTIVE);
+    }
+    else
+    {
+        powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->autoModeDozeMode);
+
+    }
+    /* Activates the Trafic monitoe Events*/        
+    powerMgrEnableThresholdsIndications(hPowerMgr);
+}
+
+/****************************************************************************************
+*                        powerMgrRetryPsTimeout                                                     *
+*****************************************************************************************
+DESCRIPTION: Retry function if a PS/exit PS request failed
+                                                                                                                              
+INPUT:      hPowerMgr       - Handle to the Power Manager
+            bTwdInitOccured - Indicates if TWDriver recovery occured since timer started 
+
+OUTPUT:     
+
+RETURN:    void.\n
+****************************************************************************************/
+static void powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    TI_STATUS powerStatus;
+
+    TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrRetryPsTimeout: timer expired.\n");
+
+    if ( pPowerMgr->lastPsTransaction == ENTER_POWER_SAVE_FAIL )
+    {
+        powerStatus = TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_ON, TI_TRUE, hPowerMgr,powerSaveCompleteCB, NULL);/*NULL as GWSI callback*/
+    }
+    else
+    {
+        powerStatus = TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_OFF, TI_TRUE, hPowerMgr, powerSaveCompleteCB, NULL);/*NULL as GWSI callback*/
+    }
+       return;
+}
+
+
+/****************************************************************************************
+*                        powerMgrPowerProfileConfiguration                                          *
+*****************************************************************************************
+DESCRIPTION: This function is the " builder " of the Power Save profiles. 
+             acording to the desired Power mode.
+                                                                                                                              
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+OUTPUT:     
+RETURN:    void.\n
+****************************************************************************************/
+static void powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    TI_STATUS powerStatus;
+
+    tmr_StopTimer (pPowerMgr->hRetryPsTimer);
+
+       pPowerMgr->lastPowerModeProfile = desiredPowerMode;
+
+    switch ( desiredPowerMode )
+    {
+    case POWER_MODE_AUTO:
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==AUTO - This mode should not be sent to the GWSI - we send AUTO instead\n");
+        break;
+
+    case POWER_MODE_ACTIVE:
+        /* set AWAKE through */
+        powerStatus = TWD_SetPsMode (pPowerMgr->hTWD,
+                                          POWER_SAVE_OFF, 
+                                          TI_TRUE, 
+                                          hPowerMgr,
+                                          powerSaveCompleteCB,
+                                          NULL);
+
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==ACTIVE\n");
+        break;
+
+    case POWER_MODE_SHORT_DOZE:
+        if ( pPowerMgr->beaconListenInterval > 1 )
+        {
+            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);       
+        }
+        else
+        {
+            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);     
+        }
+
+        powerStatus = TWD_SetPsMode (pPowerMgr->hTWD, 
+                                          POWER_SAVE_ON, 
+                                          TI_TRUE, 
+                                          hPowerMgr,
+                                          powerSaveCompleteCB,
+                                          NULL);
+
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==SHORT_DOZE\n");
+        break;
+
+    case POWER_MODE_LONG_DOZE:
+        if ( pPowerMgr->dtimListenInterval > 1 )
+        {
+            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);       
+        }
+        else
+        {
+            powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);     
+        }
+        powerStatus = TWD_SetPsMode (pPowerMgr->hTWD, 
+                                          POWER_SAVE_ON, 
+                                          TI_TRUE, 
+                                          hPowerMgr,
+                                          powerSaveCompleteCB,
+                                          NULL);
+
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==LONG_DOZE\n");
+        break;
+
+       case POWER_MODE_PS_ONLY:
+               /* When in SG PS mode, configure the user desired wake-up condition */
+               powerMgr_SGSetUserDesiredwakeUpCond(pPowerMgr);
+
+        powerStatus = TWD_SetPsMode (pPowerMgr->hTWD, 
+                                          POWER_SAVE_ON, 
+                                          TI_TRUE, 
+                                          hPowerMgr,
+                                          powerSaveCompleteCB,
+                                          NULL);
+
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==PS_ONLY\n");
+        break;
+
+    default:
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setWakeUpConfiguration - ERROR - PowerMode - unknown parameter: %d\n", desiredPowerMode);
+        return;
+    }
+
+}
+
+
+/****************************************************************************************
+*                        powerMgrSendMBXWakeUpConditions                                            *
+*****************************************************************************************
+DESCRIPTION: Tsend configuration of the power management option that holds in the command
+                mailbox inner sturcture.
+                                                                                                                              
+INPUT:          - hPowerMgr             - Handle to the Power Manager
+OUTPUT:     
+RETURN:    TI_STATUS - TI_OK on success else TI_NOK.\n
+****************************************************************************************/
+static TI_STATUS powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,
+                                                 TI_UINT8 listenInterval,
+                                                 ETnetWakeOn tnetWakeupOn)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    TPowerMgmtConfig powerMgmtConfig;
+    TI_STATUS status = TI_OK;
+
+    powerMgmtConfig.listenInterval = listenInterval;
+    powerMgmtConfig.tnetWakeupOn = tnetWakeupOn;
+
+    TRACE2(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrSendMBXWakeUpConditions: listenInterval = %d, tnetWakeupOn = %d\n", listenInterval,tnetWakeupOn);
+
+    status = TWD_CfgWakeUpCondition (pPowerMgr->hTWD, &powerMgmtConfig);
+                                      
+    if ( status != TI_OK )
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrSendMBXWakeUpConditions - Error in wae up condition IE!\n");
+    }
+    return status;
+}
+
+
+
+
+static TI_STATUS powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr)
+{
+    paramInfo_t     param;
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
+    if ( siteMgr_getParam(pPowerMgr->hSiteMgr, &param) == TI_OK )
+    {
+        TWD_SetNullRateModulation (pPowerMgr->hTWD, (TI_UINT16)param.content.siteMgrCurrentRateMask.basicRateMask);
+    }
+    else
+    {
+        TWD_SetNullRateModulation (pPowerMgr->hTWD, (DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER));
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrNullPacketRateConfiguration: error - faild to set rate so default was seted!\n");
+    }
+    return TI_OK;
+
+}
+
+
+static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    int index;
+    for ( index = POWER_MANAGER_MAX_PRIORITY-1;index >= 0;index-- )
+    {
+        if ( pPowerMgr->powerMngModePriority[index].priorityEnable )
+        {
+
+            return pPowerMgr->powerMngModePriority[index].powerMode;
+        }
+
+    }
+
+    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrGetHighestPriority - error - faild to get highest priority! sefault deseired mode was returned !!!\n");
+    return pPowerMgr->desiredPowerModeProfile;
+}
+
+
+ /****************************************************************************************
+ *                        PowerMgr_notifyFWReset                                                                                                                       *
+ ****************************************************************************************
+DESCRIPTION: Notify the object of the power Manager about FW reset (recovery).
+                        Calls PowerSrv module to Set Ps Mode
+                                                                                                                                  
+INPUT:      - hPowerMgr - Handle to the Power Manager  
+OUTPUT:                
+RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
+****************************************************************************************/
+TI_STATUS PowerMgr_notifyFWReset(TI_HANDLE hPowerMgr)
+{
+       PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    TRACE2(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_notifyFWReset(): psEnable = %d, lastPowerModeProfile = %d\n", pPowerMgr->psEnable, pPowerMgr->lastPowerModeProfile);
+
+       if (pPowerMgr->psEnable)
+       {
+               powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->lastPowerModeProfile);
+       }
+       
+    return TI_OK;
+}
+
+
+/****************************************************************************************
+ *                        PowerMgrConfigBetToFw                                                                                                                        *
+ ****************************************************************************************
+DESCRIPTION: callback from TM event notification.
+                               -       call PowerSrv module to Set Ps Mode
+                                                                                                                                  
+INPUT:         - hPowerMgr - Handle to the Power Manager       
+                - BetEnable - cookie:values supplied during event registration
+OUTPUT:                
+RETURN:    None.
+****************************************************************************************/
+static void PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, TI_UINT32 BetEnable )
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    TI_UINT8 MaximumConsecutiveET;
+    TI_UINT32 listenInterval;
+    paramInfo_t param;
+    TI_UINT32 beaconInterval;
+    TI_UINT32 dtimPeriod;
+    PowerMgr_PowerMode_e powerMode;
+
+    param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM;
+    siteMgr_getParam(pPowerMgr->hSiteMgr, &param);
+    beaconInterval = param.content.beaconInterval;
+
+    param.paramType = SITE_MGR_DTIM_PERIOD_PARAM;
+    siteMgr_getParam(pPowerMgr->hSiteMgr, &param);
+    dtimPeriod = param.content.siteMgrDtimPeriod;
+
+    /* get actual Power Mode */
+    if (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO)
+    {
+        powerMode = pPowerMgr->autoModeDozeMode;
+    }
+    else
+    {
+        powerMode = pPowerMgr->lastPowerModeProfile;
+    }
+
+    /* calc ListenInterval */
+    if (powerMode == POWER_MODE_SHORT_DOZE)
+    {
+        listenInterval = beaconInterval * pPowerMgr->beaconListenInterval;
+    }
+    else if (powerMode == POWER_MODE_LONG_DOZE)
+    {
+        listenInterval = dtimPeriod * beaconInterval * pPowerMgr->dtimListenInterval;
+    }
+    else
+    {
+        listenInterval = beaconInterval;
+    }
+
+    if (listenInterval == 0)
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgrConfigBetToFw: listenInterval is ZERO\n");
+        return;
+    }
+
+    /* MaximumConsecutiveET = MaximalFullBeaconReceptionInterval / MAX( BeaconInterval, ListenInterval) */
+    MaximumConsecutiveET = pPowerMgr->maxFullBeaconInterval / listenInterval;
+
+    TRACE5(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgrConfigBetToFw:\n                           Power Mode = %d\n                           beaconInterval = %d\n                           listenInterval = %d\n                           Bet Enable = %d\n                           MaximumConsecutiveET = %d\n", powerMode, beaconInterval, listenInterval, BetEnable, MaximumConsecutiveET);
+
+    pPowerMgr->betEnable = BetEnable; /* save BET enable flag for CLI configuration */
+
+    TWD_CfgBet(pPowerMgr->hTWD, BetEnable, MaximumConsecutiveET);
+}
+
+/**
+ * \date 10-April-2007\n
+ * \brief Returns to the configured wakeup condition, when SG protective mode is done
+ *
+ * Function Scope \e Public.\n
+ * Parameters:\n
+ * 1) TI_HANDLE - handle to the PowerMgr object.\n
+ * Return Value: void.\n
+ */
+static void powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr )
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+       if (pPowerMgr->psEnable)
+       {
+               /* set wakeup condition according to user mode power save profile */
+               switch ( pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode )
+               {
+               case POWER_MODE_AUTO:
+                       /*set wakeup condition according to doze mode in auto and wakup interval */
+                       if ( pPowerMgr->autoModeDozeMode == POWER_MODE_SHORT_DOZE )
+                       {
+                               /* short doze */
+                               if ( pPowerMgr->beaconListenInterval > 1 )
+                               {
+                                       powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);       
+                               }
+                               else
+                               {
+                                       powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);     
+                               }
+                       }
+                       else
+                       {
+                               /* long doze */
+                               if ( pPowerMgr->dtimListenInterval > 1 )
+                               {
+                                       powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);       
+                               }
+                               else
+                               {
+                                       powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);     
+                               }
+                       }
+                       break;
+       
+               case POWER_MODE_ACTIVE:
+                       break;
+       
+               case POWER_MODE_SHORT_DOZE:
+                       if ( pPowerMgr->beaconListenInterval > 1 )
+                       {
+                               powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);       
+                       }
+                       else
+                       {
+                               powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);     
+                       }
+                       break;
+       
+               case POWER_MODE_LONG_DOZE:
+                       if ( pPowerMgr->dtimListenInterval > 1 )
+                       {
+                               powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);       
+                       }
+                       else
+                       {
+                               powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);     
+                       }
+                       break;
+       
+               default:
+TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, ": ERROR - PowerMode for user prioirty is: %d\n", pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode);
+               }
+       }/*end of if (psEnable)*/
+}
+
+
+
+/****************************************************************************************
+*                        PowerMgr_PsPollFailureCB                                                                                                                      *
+****************************************************************************************
+DESCRIPTION: Work around to solve AP bad behavior.
+         Some old AP's have trouble with Ps-Poll - The solution will be to exit PS for a 
+         period of time
+                                                                                                                              
+INPUT:         - hPowerMgr - Handle to the Power Manager       
+OUTPUT:                
+RETURN:    
+****************************************************************************************/
+static void PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr )
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+
+    if ( pPowerMgr->PsPollDeliveryFailureRecoveryPeriod )
+    {
+        paramInfo_t param;
+             
+        TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, " Oh boy, AP is not answering Ps-Poll's. enter active PS for %d Ms\n", pPowerMgr->PsPollDeliveryFailureRecoveryPeriod);
+
+        /*
+         * Set the system to Active power save 
+         */
+        param.paramType = POWER_MGR_POWER_MODE;
+        param.content.powerMngPowerMode.PowerMode = POWER_MODE_ACTIVE;
+        param.content.powerMngPowerMode.PowerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
+        powerMgr_setParam(hPowerMgr,&param);
+        
+        param.paramType = POWER_MGR_ENABLE_PRIORITY;
+        param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
+        powerMgr_setParam(hPowerMgr,&param);
+
+        /*
+         * Set timer to exit the active mode
+         */
+        tmr_StartTimer(pPowerMgr->hPsPollFailureTimer,
+                                          powerMgr_PsPollFailureTimeout,
+                                          (TI_HANDLE)pPowerMgr,
+                                          pPowerMgr->PsPollDeliveryFailureRecoveryPeriod,
+                                          TI_FALSE);
+    } 
+    else    /* Work-around is disabled */
+    {
+        TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, " Oh boy, AP is not answering Ps-Poll's !!!\n");
+    }
+       return;
+}
+
+/****************************************************************************************
+*                        powerMgr_PsPollFailureTimeout                                                                 *
+****************************************************************************************
+DESCRIPTION: After the timeout of ps-poll failure - return to normal behavior
+                                                                                                                              
+INPUT:         - hPowerMgr - Handle to the Power Manager       
+OUTPUT:                
+RETURN:    
+****************************************************************************************/
+static void powerMgr_PsPollFailureTimeout( TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured )
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
+    paramInfo_t param;
+
+    TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, " \n");
+    
+    /* disable Ps-Poll priority */
+    param.paramType = POWER_MGR_DISABLE_PRIORITY;
+    param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
+    powerMgr_setParam(hPowerMgr,&param);
+
+       return;
+}
+
+TI_BOOL PowerMgr_getReAuthActivePriority(TI_HANDLE thePowerMgrHandle)
+{
+    PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
+       return pPowerMgr->reAuthActivePriority;
+}