Home | History | Annotate | Download | only in Sta_Management
      1 /*
      2  * PowerMgr.c
      3  *
      4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 /** \file PowerMgr.c
     35  *  \brief This is the PowerMgr module implementation.
     36  *  \
     37  *  \date 24-Oct-2005
     38  */
     39 
     40 /****************************************************************************
     41  *                                                                          *
     42  *   MODULE:  PowerMgr                                                      *
     43  *   PURPOSE: PowerMgr Module implementation.                               *
     44  *                                                                          *
     45  ****************************************************************************/
     46 
     47 #define __FILE_ID__  FILE_ID_71
     48 #include "tidef.h"
     49 #include "osApi.h"
     50 #include "timer.h"
     51 #include "paramOut.h"
     52 #include "report.h"
     53 #include "PowerMgr.h"
     54 #include "PowerMgr_API.h"
     55 #include "TrafficMonitorAPI.h"
     56 #include "qosMngr_API.h"
     57 #include "siteMgrApi.h"
     58 #include "TWDriver.h"
     59 #include "SoftGeminiApi.h"
     60 #include "DrvMainModules.h"
     61 #include "PowerMgrKeepAlive.h"
     62 #include "CmdBld.h"
     63 
     64 
     65 /*****************************************************************************
     66  **         Defines                                                         **
     67  *****************************************************************************/
     68 #define DEFAULT_LISTEN_INTERVAL (1)
     69 #define BET_DISABLE 0
     70 #define BET_ENABLE  1
     71 
     72 
     73 /*****************************************************************************
     74  **         Private Function prototypes                                      **
     75  *****************************************************************************/
     76 
     77 static void         powerSaveCompleteCB(TI_HANDLE hPowerMgr,TI_UINT8 PSMode,TI_UINT8 transStatus);
     78 static void         PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, TI_UINT32 cookie );
     79 static void         powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr);
     80 static void         powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr);
     81 static void         powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr);
     82 static void         powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured);
     83 static void         powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode);
     84 static void         PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr,PowerMgr_PowerMode_e dozeMode);
     85 static void         PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, TI_UINT32 cookie );
     86 static void         PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr );
     87 static void 		powerMgr_PsPollFailureTimeout( TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured );
     88 static void 		powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr );
     89 static TI_STATUS    powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,TI_UINT8 listenInterval, ETnetWakeOn tnetWakeupOn);
     90 static TI_STATUS    powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr);
     91 static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr);
     92 
     93 
     94 /*****************************************************************************
     95  **         Public Function prototypes                                      **
     96  *****************************************************************************/
     97 
     98 
     99 /****************************************************************************************
    100  *                        PowerMgr_create                                                           *
    101  ****************************************************************************************
    102 DESCRIPTION: Creates the object of the power Manager.
    103                 performs the following:
    104                 -   Allocate the Power Manager handle
    105                 -   Creates the retry timer
    106 
    107 INPUT:          - hOs - Handle to OS
    108 OUTPUT:
    109 RETURN:     Handle to the Power Manager module on success, NULL otherwise
    110 ****************************************************************************************/
    111 TI_HANDLE PowerMgr_create(TI_HANDLE hOs)
    112 {
    113 
    114     PowerMgr_t * pPowerMgr = NULL;
    115     pPowerMgr = (PowerMgr_t*) os_memoryAlloc (hOs, sizeof(PowerMgr_t));
    116     if ( pPowerMgr == NULL )
    117     {
    118         WLAN_OS_REPORT(("PowerMgr_create - Memory Allocation Error!\n"));
    119         return NULL;
    120     }
    121 
    122     os_memoryZero (hOs, pPowerMgr, sizeof(PowerMgr_t));
    123 
    124     pPowerMgr->hOS = hOs;
    125 
    126     /* create the power manager keep-alive sub module */
    127     pPowerMgr->hPowerMgrKeepAlive = powerMgrKL_create (hOs);
    128 
    129     return pPowerMgr;
    130 
    131 }
    132 
    133 
    134 /****************************************************************************************
    135 *                        powerSrv_destroy                                                          *
    136 ****************************************************************************************
    137 DESCRIPTION: Destroy the object of the power Manager.
    138                -   delete Power Manager alocation
    139                -   call the destroy function of the timer
    140 
    141 INPUT:          - hPowerMgr - Handle to the Power Manager
    142 OUTPUT:
    143 RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
    144 ****************************************************************************************/
    145 TI_STATUS PowerMgr_destroy(TI_HANDLE hPowerMgr)
    146 {
    147     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    148 
    149     /* destroy the power manager keep-alive sub module */
    150     powerMgrKL_destroy (pPowerMgr->hPowerMgrKeepAlive);
    151 
    152     if (pPowerMgr->hRetryPsTimer)
    153     {
    154         tmr_DestroyTimer (pPowerMgr->hRetryPsTimer);
    155     }
    156 
    157     if ( pPowerMgr->hPsPollFailureTimer != NULL )
    158     {
    159         tmr_DestroyTimer(pPowerMgr->hPsPollFailureTimer);
    160     }
    161     os_memoryFree(pPowerMgr->hOS, pPowerMgr, sizeof(PowerMgr_t));
    162 
    163     return TI_OK;
    164 }
    165 
    166 
    167 /****************************************************************************************
    168 *                        PowerMgr_init                                                         *
    169 ****************************************************************************************
    170 DESCRIPTION: Power Manager init function, called in init phase.
    171 
    172 INPUT:     pStadHandles  - The driver modules handles
    173 
    174 OUTPUT:
    175 
    176 RETURN:    void
    177 ****************************************************************************************/
    178 void PowerMgr_init (TStadHandlesList *pStadHandles)
    179 {
    180     PowerMgr_t *pPowerMgr = (PowerMgr_t*)(pStadHandles->hPowerMgr);
    181 
    182     pPowerMgr->hReport          = pStadHandles->hReport;
    183     pPowerMgr->hTrafficMonitor  = pStadHandles->hTrafficMon;
    184     pPowerMgr->hSiteMgr         = pStadHandles->hSiteMgr;
    185     pPowerMgr->hTWD             = pStadHandles->hTWD;
    186     pPowerMgr->hSoftGemini      = pStadHandles->hSoftGemini;
    187     pPowerMgr->hTimer           = pStadHandles->hTimer;
    188     pPowerMgr->psEnable         = TI_FALSE;
    189 
    190     /* initialize the power manager keep-alive sub module */
    191     powerMgrKL_init (pPowerMgr->hPowerMgrKeepAlive, pStadHandles);
    192 
    193 }
    194 
    195 
    196 TI_STATUS PowerMgr_SetDefaults (TI_HANDLE hPowerMgr, PowerMgrInitParams_t* pPowerMgrInitParams)
    197 {
    198     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    199     TI_UINT8 index;
    200     /* used to initialize the Traffic Monitor for Auto Ps events */
    201     TrafficAlertRegParm_t tmRegParam;
    202     TI_STATUS status;
    203 
    204 	pPowerMgr->reAuthActivePriority		= pPowerMgrInitParams->reAuthActivePriority;
    205 
    206     /* init power management options */
    207     pPowerMgr->beaconListenInterval = pPowerMgrInitParams->beaconListenInterval;
    208     pPowerMgr->dtimListenInterval = pPowerMgrInitParams->dtimListenInterval;
    209     pPowerMgr->defaultPowerLevel =  pPowerMgrInitParams->defaultPowerLevel;
    210     pPowerMgr->PowerSavePowerLevel =  pPowerMgrInitParams->PowerSavePowerLevel;
    211     pPowerMgr->powerMngPriority  = POWER_MANAGER_USER_PRIORITY;
    212     pPowerMgr->maxFullBeaconInterval = pPowerMgrInitParams->MaximalFullBeaconReceptionInterval;
    213     pPowerMgr->PsPollDeliveryFailureRecoveryPeriod = pPowerMgrInitParams->PsPollDeliveryFailureRecoveryPeriod;
    214 
    215     /*
    216      set AUTO PS parameters
    217      */
    218     pPowerMgr->autoModeInterval = pPowerMgrInitParams->autoModeInterval;
    219     pPowerMgr->autoModeActiveTH = pPowerMgrInitParams->autoModeActiveTH;
    220     pPowerMgr->autoModeDozeTH = pPowerMgrInitParams->autoModeDozeTH;
    221     pPowerMgr->autoModeDozeMode = pPowerMgrInitParams->autoModeDozeMode;
    222 
    223     /*
    224      register threshold in the traffic monitor.
    225      */
    226   	pPowerMgr->betEnable = pPowerMgrInitParams->BetEnable; /* save BET enable flag for CLI configuration */
    227 	pPowerMgr->betTrafficEnable = TI_FALSE;                   /* starting without BET */
    228 
    229     /* BET thresholds */
    230     /* general parameters */
    231     tmRegParam.Context = pPowerMgr;
    232     tmRegParam.TimeIntervalMs = BET_INTERVAL_VALUE;
    233     tmRegParam.Trigger = TRAFF_EDGE;
    234     tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
    235     tmRegParam.CallBack = PowerMgrConfigBetToFw;
    236 
    237     /* BET enable event */
    238     tmRegParam.Direction = TRAFF_DOWN;
    239     tmRegParam.Threshold = pPowerMgrInitParams->BetEnableThreshold;
    240     pPowerMgr->BetEnableThreshold = pPowerMgrInitParams->BetEnableThreshold;
    241     tmRegParam.Cookie = (TI_UINT32)BET_ENABLE;
    242     pPowerMgr->betEnableTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
    243                                                              &tmRegParam,
    244                                                              TI_FALSE);
    245     /* BET disable event */
    246     tmRegParam.Direction = TRAFF_UP;
    247     tmRegParam.Threshold = pPowerMgrInitParams->BetDisableThreshold;
    248     pPowerMgr->BetDisableThreshold = pPowerMgrInitParams->BetDisableThreshold;
    249     tmRegParam.Cookie = (TI_UINT32)BET_DISABLE;
    250     pPowerMgr->betDisableTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
    251                                                              &tmRegParam,
    252                                                              TI_FALSE);
    253 
    254     if ( (pPowerMgr->betDisableTMEvent == NULL) ||
    255          (pPowerMgr->betEnableTMEvent == NULL))
    256     {
    257         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - TM - ERROR registering BET events - ABROTING init!\n");
    258         return TI_NOK;
    259     }
    260     /*
    261     set the events as resets for one another
    262     */
    263     status = TrafficMonitor_SetRstCondition (pPowerMgr->hTrafficMonitor,
    264                                             pPowerMgr->betDisableTMEvent,
    265                                             pPowerMgr->betEnableTMEvent,
    266                                             TI_TRUE);
    267     if ( status != TI_OK )
    268     {
    269         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR binding BET events - ABROTING init!\n");
    270         return TI_NOK;
    271     }
    272 
    273     /* general parameters */
    274     tmRegParam.Context = pPowerMgr;
    275 
    276     tmRegParam.Cookie = (TI_UINT32)POWER_MODE_ACTIVE;
    277     tmRegParam.TimeIntervalMs = pPowerMgr->autoModeInterval;
    278     tmRegParam.Trigger = TRAFF_EDGE;
    279     tmRegParam.MonitorType = TX_RX_ALL_802_11_DATA_FRAMES;
    280 
    281     /* Active threshold */
    282     tmRegParam.CallBack = PowerMgrTMThresholdCrossCB;
    283     tmRegParam.Direction = TRAFF_UP;
    284     tmRegParam.Threshold = pPowerMgr->autoModeActiveTH;
    285     pPowerMgr->passToActiveTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
    286                                                              &tmRegParam,
    287                                                              TI_FALSE);
    288     /* Doze threshold */
    289     tmRegParam.Direction = TRAFF_DOWN;
    290     tmRegParam.Threshold = pPowerMgr->autoModeDozeTH;
    291     tmRegParam.Cookie = (TI_UINT32)POWER_MODE_SHORT_DOZE; /* diffrentiation between long / short doze is done at the
    292                                                           CB, according to configuration at time of CB invokation */
    293     pPowerMgr->passToDozeTMEvent = TrafficMonitor_RegEvent (pPowerMgr->hTrafficMonitor,
    294                                                            &tmRegParam,
    295                                                            TI_FALSE);
    296 
    297     if ( (pPowerMgr->passToActiveTMEvent == NULL) ||
    298          (pPowerMgr->passToDozeTMEvent == NULL))
    299     {
    300         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR registering Auto mode events - ABROTING init!\n");
    301         return TI_NOK;
    302     }
    303 
    304     /*
    305     set the events as resets for one another
    306     */
    307     status = TrafficMonitor_SetRstCondition (pPowerMgr->hTrafficMonitor,
    308                                             pPowerMgr->passToActiveTMEvent,
    309                                             pPowerMgr->passToDozeTMEvent,
    310                                             TI_TRUE);
    311     if ( status != TI_OK )
    312     {
    313         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr_init - ERROR binding Auto mode events - ABROTING init!\n");
    314         return TI_NOK;
    315     }
    316 
    317     /*
    318     configure the initialize power mode
    319     */
    320     pPowerMgr->desiredPowerModeProfile = pPowerMgrInitParams->powerMode;
    321     for ( index = 0;index < POWER_MANAGER_MAX_PRIORITY;index++ )
    322     {
    323         pPowerMgr->powerMngModePriority[index].powerMode = pPowerMgr->desiredPowerModeProfile;
    324         pPowerMgr->powerMngModePriority[index].priorityEnable = TI_FALSE;
    325     }
    326     pPowerMgr->powerMngModePriority[POWER_MANAGER_USER_PRIORITY].priorityEnable = TI_TRUE;
    327 
    328     if (pPowerMgr->reAuthActivePriority)
    329 		pPowerMgr->powerMngModePriority[POWER_MANAGER_REAUTH_PRIORITY].powerMode = POWER_MODE_ACTIVE;
    330 
    331     /* set the defualt power policy */
    332     TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
    333 
    334 
    335     /*create the timers */
    336     pPowerMgr->hRetryPsTimer = tmr_CreateTimer(pPowerMgr->hTimer);
    337 
    338     pPowerMgr->hPsPollFailureTimer = tmr_CreateTimer(pPowerMgr->hTimer);
    339 
    340     if ( (pPowerMgr->hPsPollFailureTimer == NULL) || (pPowerMgr->hRetryPsTimer == NULL))
    341     {
    342 TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_SetDefaults - ERROR creating timers - ABROTING init!\n");
    343         return TI_NOK;
    344     }
    345 
    346     /* Register and Enable the PsPoll failure */
    347     TWD_RegisterEvent (pPowerMgr->hTWD,
    348         TWD_OWN_EVENT_PSPOLL_DELIVERY_FAILURE,
    349         (void *)PowerMgr_PsPollFailureCB,
    350         hPowerMgr);
    351     TWD_EnableEvent (pPowerMgr->hTWD, TWD_OWN_EVENT_PSPOLL_DELIVERY_FAILURE);
    352 
    353     TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INIT, "PowerMgr_init - PowerMgr Initialized\n");
    354 
    355     /* set defaults for the power manager keep-alive sub module */
    356     powerMgrKL_setDefaults (pPowerMgr->hPowerMgrKeepAlive);
    357 
    358     return TI_OK;
    359 }
    360 
    361 /****************************************************************************************
    362  *                        PowerMgr_startPS                                                          *
    363  ****************************************************************************************
    364 DESCRIPTION: Start the power save algorithm of the driver and also the 802.11 PS.
    365 
    366 INPUT:          - hPowerMgr             - Handle to the Power Manager
    367 
    368 OUTPUT:
    369 RETURN:    TI_STATUS - TI_OK or PENDING on success else TI_NOK.\n
    370 ****************************************************************************************/
    371 TI_STATUS PowerMgr_startPS(TI_HANDLE hPowerMgr)
    372 {
    373     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    374 	int frameCount;
    375 
    376 
    377     TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_startPS - called\n");
    378 
    379     if ( pPowerMgr->psEnable == TI_TRUE )
    380     {
    381         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_startPS - PS mechanism is already Enable! Aborting psEnable=%d !\n", pPowerMgr->psEnable);
    382         /*
    383         this is a FATAL ERROR of the power manager!
    384         already enable power-save! thus return TI_OK, but there is an error in the upper
    385         layer that call tp PowerMgr_startPS() twice - should know that power-save
    386         is already enable therefor print the Error message.
    387         or
    388         the state machine while NOT in PS can be only in ACTIVE state and in some cases in
    389         PS_PENDING state. therefore the state machine is out of sync from it logic!
    390         */
    391         return TI_OK;
    392     }
    393 
    394     pPowerMgr->psEnable = TI_TRUE;
    395     /*set the correct rate after connection*/
    396     powerMgrNullPacketRateConfiguration(hPowerMgr);
    397     /*
    398     if in auto mode then need to refer to the threshold cross indication from the traffic monitor,
    399     else it need to refer to the configured power mode profile from the user.
    400     */
    401     pPowerMgr->desiredPowerModeProfile = powerMgrGetHighestPriority(hPowerMgr);
    402 
    403     if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
    404     {
    405         powerMgrStartAutoPowerMode(hPowerMgr);
    406     }
    407     else /*not auto mode - according to the current profle*/
    408     {
    409         powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->desiredPowerModeProfile);
    410     }
    411 
    412     TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->PowerSavePowerLevel);
    413 
    414    if ((pPowerMgr->betEnable)&&( pPowerMgr->desiredPowerModeProfile != POWER_MODE_ACTIVE ))
    415    {
    416 		TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
    417 									   pPowerMgr->betEnableTMEvent);
    418 
    419 		TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
    420 									   pPowerMgr->betDisableTMEvent);
    421 
    422 
    423 		frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
    424 
    425 		if (frameCount < pPowerMgr->BetEnableThreshold)
    426 		{
    427             pPowerMgr->betTrafficEnable = TI_TRUE;
    428 
    429 		}
    430 		else if (frameCount > pPowerMgr->BetDisableThreshold)
    431 		{
    432 			pPowerMgr->betTrafficEnable = TI_FALSE;
    433         }
    434 
    435 		PowerMgrConfigBetToFw(hPowerMgr,pPowerMgr->betTrafficEnable);
    436 	}
    437 
    438     /* also start the power manager keep-alive sub module */
    439     powerMgrKL_start (pPowerMgr->hPowerMgrKeepAlive);
    440 
    441     return TI_OK;
    442 }
    443 
    444 
    445 /****************************************************************************************
    446  *                        PowerMgr_stopPS                                                           *
    447  ****************************************************************************************
    448 DESCRIPTION: Stop the power save algorithm of the driver and also the 802.11 PS.
    449 
    450 INPUT:          - hPowerMgr             - Handle to the Power Manager
    451 
    452 OUTPUT:
    453 RETURN:    TI_STATUS - TI_OK or PENDING on success else TI_NOK.\n
    454 ****************************************************************************************/
    455 TI_STATUS PowerMgr_stopPS(TI_HANDLE hPowerMgr, TI_BOOL bDisconnect)
    456 {
    457     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    458     /*TI_STATUS status;*/
    459 
    460     TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_stopPS - called\n");
    461 
    462     if ( pPowerMgr->psEnable == TI_FALSE )
    463     {
    464         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_stopPS - PS is already Disable! Aborting!\n");
    465         /*
    466         Print Info message incase callng PowerMgr_stopPS() more than once in a row, without
    467         calling to PowerMgr_startPS() in the middle.
    468         this will return with TI_OK and not doing the Stop action!
    469         */
    470         return TI_OK;
    471     }
    472 
    473     pPowerMgr->psEnable = TI_FALSE;
    474     tmr_StopTimer (pPowerMgr->hRetryPsTimer);
    475 
    476     /* Check if PsPoll work-around is currently enabled */
    477     if ( pPowerMgr->powerMngModePriority[POWER_MANAGER_PS_POLL_FAILURE_PRIORITY].priorityEnable == TI_TRUE)
    478     {
    479         tmr_StopTimer(pPowerMgr->hPsPollFailureTimer);
    480         /* Exit the PsPoll work-around */
    481         powerMgr_PsPollFailureTimeout( hPowerMgr, TI_FALSE );
    482     }
    483 
    484     if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
    485     {
    486         powerMgrDisableThresholdsIndications(hPowerMgr);
    487     }
    488 
    489     TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_OFF, TI_FALSE, NULL, NULL, NULL);
    490 
    491     /* set the power policy of the system */
    492     TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
    493     if ((pPowerMgr->betEnable)&&( pPowerMgr->desiredPowerModeProfile != POWER_MODE_ACTIVE ))
    494 	{
    495 		TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
    496 									  pPowerMgr->betEnableTMEvent);
    497 
    498 		TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
    499 									  pPowerMgr->betDisableTMEvent);
    500 	}
    501 
    502    /* also stop the power manager keep-alive sub module */
    503     powerMgrKL_stop (pPowerMgr->hPowerMgrKeepAlive, bDisconnect);
    504 
    505     return TI_OK;
    506 }
    507 
    508 
    509 /****************************************************************************************
    510  *                        PowerMgr_getPsStatus                                                          *
    511  ****************************************************************************************
    512 DESCRIPTION: returns the 802.11 power save status (enable / disable).
    513 
    514 INPUT:          - hPowerMgr             - Handle to the Power Manager
    515 
    516 OUTPUT:
    517 RETURN:    TI_BOOL - TI_TRUE if enable else TI_FALSE.\n
    518 ****************************************************************************************/
    519 TI_BOOL PowerMgr_getPsStatus(TI_HANDLE hPowerMgr)
    520 {
    521     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    522 
    523     return  TWD_GetPsStatus (pPowerMgr->hTWD);
    524 }
    525 
    526 
    527 /****************************************************************************************
    528  *                        PowerMgr_setPowerMode                                                         *
    529  ****************************************************************************************
    530 DESCRIPTION: Configure of the PowerMode profile (auto / active / short doze / long doze).
    531 
    532 INPUT:          - hPowerMgr             - Handle to the Power Manager
    533             - thePowerMode      - the requested power mode (auto / active / short doze / long doze).
    534 OUTPUT:
    535 RETURN:    TI_STATUS - TI_OK on success else TI_NOK.\n
    536 ****************************************************************************************/
    537 TI_STATUS PowerMgr_setPowerMode(TI_HANDLE hPowerMgr)
    538 {
    539     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    540     PowerMgr_PowerMode_e powerMode;
    541 
    542     /*in this way we will run with the highest priority that is enabled*/
    543     powerMode = powerMgrGetHighestPriority(hPowerMgr);
    544 
    545     /* sanity checking */
    546     if ( powerMode >= POWER_MODE_MAX)
    547     {
    548         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setPowerMode - unknown parameter: %d\n", powerMode);
    549         return TI_NOK;
    550     }
    551 
    552     TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setPowerMode, power mode = %d\n", powerMode);
    553 
    554     if ( pPowerMgr->desiredPowerModeProfile != powerMode )
    555     {
    556         PowerMgr_PowerMode_e previousPowerModeProfile;
    557         previousPowerModeProfile = pPowerMgr->desiredPowerModeProfile;
    558         pPowerMgr->desiredPowerModeProfile = powerMode;
    559 
    560         if ( pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO )
    561         {
    562             if ( pPowerMgr->psEnable == TI_TRUE )
    563             {
    564                 powerMgrStartAutoPowerMode(hPowerMgr);
    565             }
    566 
    567             /*
    568             the transitions of state will be done according to the events from the
    569             traffic monitor - therefor abort and wait event from the traffic monitor.
    570             */
    571             return TI_OK;
    572         }
    573         else if ( previousPowerModeProfile == POWER_MODE_AUTO )
    574         {
    575             /*
    576             if the old power mode is AUTO and the new power mode is NOT then need
    577             to disable the thresholds indications from the traffic monitor.
    578             */
    579             powerMgrDisableThresholdsIndications(hPowerMgr);
    580         }
    581         if ( pPowerMgr->psEnable == TI_TRUE )
    582         {
    583             powerMgrPowerProfileConfiguration(hPowerMgr, powerMode);
    584         }
    585     }
    586     else
    587     {
    588         /*
    589         the power mode is already configure to the module - don't need to do anything!
    590         */
    591         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgr_setPowerMode - desiredPowerModeProfile == thePowerMode (=%d), ABORTING!\n", powerMode);
    592     }
    593 
    594     return TI_OK;
    595 }
    596 
    597 
    598 /****************************************************************************************
    599  *                        PowerMgr_setDozeModeInAuto                                    *
    600  ****************************************************************************************
    601 DESCRIPTION: Configure the doze mode (short-doze / long-doze) that auto mode will toggle between doze vs active.
    602 INPUT:      - hPowerMgr             - Handle to the Power Manager
    603             - dozeMode      - the requested doze mode when Mgr is in Auto mode (short-doze / long-doze)
    604 OUTPUT:
    605 RETURN:
    606 ****************************************************************************************/
    607 void PowerMgr_setDozeModeInAuto(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e dozeMode)
    608 {
    609     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    610     PowerMgr_PowerMode_e powerMode = powerMgrGetHighestPriority(hPowerMgr);
    611 
    612     /* check if we are trying to configure the same Doze mode */
    613     if ( dozeMode != pPowerMgr->autoModeDozeMode )
    614     {
    615         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d \n", dozeMode);
    616 
    617         pPowerMgr->autoModeDozeMode = dozeMode;
    618 
    619         /* in case we are already in Auto mode, we have to set the wake up condition MIB */
    620         if ( powerMode == POWER_MODE_AUTO )
    621         {
    622             if ( dozeMode == POWER_MODE_SHORT_DOZE )
    623             {
    624                 if ( pPowerMgr->beaconListenInterval > 1 )
    625                 {
    626                     powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
    627                 }
    628                 else
    629                 {
    630                     powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
    631                 }
    632             }
    633             else  /* POWER_MODE_LONG_DOZE */
    634             {
    635                 if ( pPowerMgr->dtimListenInterval > 1 )
    636                 {
    637                     powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
    638                 }
    639                 else
    640                 {
    641                     powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
    642                 }
    643             }
    644 
    645             TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_setDozeModeInAuto - already in Auto\n");
    646         }
    647     }
    648     else
    649     {
    650         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgr_setDozeModeInAuto - autoModeDozeMode == %d (same same ...)\n", dozeMode);
    651     }
    652 }
    653 
    654 /****************************************************************************************
    655  *                        PowerMgr_getPowerMode                                                         *
    656  ****************************************************************************************
    657 DESCRIPTION: Get the current PowerMode of the PowerMgr module.
    658 
    659 INPUT:          - hPowerMgr             - Handle to the Power Manager
    660 OUTPUT:
    661 RETURN:    PowerMgr_PowerMode_e - (auto / active / short doze / long doze).\n
    662 ****************************************************************************************/
    663 PowerMgr_PowerMode_e PowerMgr_getPowerMode(TI_HANDLE hPowerMgr)
    664 {
    665     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    666 
    667     return pPowerMgr->desiredPowerModeProfile;
    668 }
    669 
    670 
    671 TI_STATUS powerMgr_setParam(TI_HANDLE thePowerMgrHandle,
    672                             paramInfo_t *theParamP)
    673 {
    674     PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
    675 
    676     switch ( theParamP->paramType )
    677     {
    678     case POWER_MGR_POWER_MODE:
    679         pPowerMgr->powerMngModePriority[theParamP->content.powerMngPowerMode.PowerMngPriority].powerMode
    680                         = theParamP->content.powerMngPowerMode.PowerMode;
    681         PowerMgr_setPowerMode(thePowerMgrHandle);
    682         if (pPowerMgr->betEnable)
    683         PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betEnable );
    684         break;
    685 
    686     case POWER_MGR_DISABLE_PRIORITY:
    687         pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = TI_FALSE;
    688         PowerMgr_setPowerMode(thePowerMgrHandle);
    689         break;
    690 
    691     case POWER_MGR_ENABLE_PRIORITY:
    692         pPowerMgr->powerMngModePriority[theParamP->content.powerMngPriority].priorityEnable = TI_TRUE;
    693         PowerMgr_setPowerMode(thePowerMgrHandle);
    694         break;
    695 
    696     case POWER_MGR_POWER_LEVEL_PS:
    697         pPowerMgr->PowerSavePowerLevel = theParamP->content.PowerSavePowerLevel;
    698         /* If we are connected, config the new power level (this param is for connected state) */
    699 		if (pPowerMgr->psEnable)
    700         {
    701 			TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->PowerSavePowerLevel);
    702 		}
    703         break;
    704 
    705     case POWER_MGR_POWER_LEVEL_DEFAULT:
    706         pPowerMgr->defaultPowerLevel = theParamP->content.DefaultPowerLevel;
    707         /* If we are NOT connected, config the new power level (this param is for disconnected state) */
    708 		if (!pPowerMgr->psEnable)
    709 		{
    710 			TWD_CfgSleepAuth (pPowerMgr->hTWD, pPowerMgr->defaultPowerLevel);
    711 		}
    712         break;
    713 
    714     case POWER_MGR_POWER_LEVEL_DOZE_MODE:
    715         PowerMgr_setDozeModeInAuto(thePowerMgrHandle,theParamP->content.powerMngDozeMode);
    716         if (pPowerMgr->betEnable)
    717         PowerMgrConfigBetToFw(thePowerMgrHandle, pPowerMgr->betEnable );
    718         break;
    719 
    720     case POWER_MGR_KEEP_ALIVE_ENA_DIS:
    721     case POWER_MGR_KEEP_ALIVE_ADD_REM:
    722         return powerMgrKL_setParam (pPowerMgr->hPowerMgrKeepAlive, theParamP);
    723         break;
    724 
    725     default:
    726         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setParam - ERROR - Param is not supported, %d\n\n", theParamP->paramType);
    727 
    728         return PARAM_NOT_SUPPORTED;
    729     }
    730 
    731     return TI_OK;
    732 }
    733 
    734 
    735 
    736 TI_STATUS powerMgr_getParam(TI_HANDLE thePowerMgrHandle,
    737                             paramInfo_t *theParamP)
    738 {
    739     PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
    740 
    741     switch ( theParamP->paramType )
    742     {
    743     case POWER_MGR_POWER_MODE:
    744         theParamP->content.PowerMode = PowerMgr_getPowerMode(thePowerMgrHandle);
    745         break;
    746 
    747     case POWER_MGR_POWER_LEVEL_PS:
    748         theParamP->content.PowerSavePowerLevel = pPowerMgr->PowerSavePowerLevel;
    749         break;
    750 
    751     case POWER_MGR_POWER_LEVEL_DEFAULT:
    752         theParamP->content.DefaultPowerLevel = pPowerMgr->defaultPowerLevel;
    753         break;
    754 
    755     case POWER_MGR_POWER_LEVEL_DOZE_MODE:
    756         theParamP->content.powerMngDozeMode = pPowerMgr->autoModeDozeMode;
    757         break;
    758 
    759     case POWER_MGR_KEEP_ALIVE_GET_CONFIG:
    760         return powerMgrKL_getParam (pPowerMgr->hPowerMgrKeepAlive, theParamP);
    761         break;
    762 
    763     case POWER_MGR_GET_POWER_CONSUMPTION_STATISTICS:
    764 
    765        return cmdBld_ItrPowerConsumptionstat (pPowerMgr->hTWD,
    766                              theParamP->content.interogateCmdCBParams.fCb,
    767                              theParamP->content.interogateCmdCBParams.hCb,
    768                              (void*)theParamP->content.interogateCmdCBParams.pCb);
    769 
    770 
    771 
    772              break;
    773 
    774 
    775     default:
    776         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_getParam - ERROR - Param is not supported, %d\n\n", theParamP->paramType);
    777         return PARAM_NOT_SUPPORTED;
    778     }
    779 
    780     return TI_OK;
    781 }
    782 
    783 
    784 /*****************************************************************************
    785  **         Private Function prototypes                                     **
    786  *****************************************************************************/
    787 
    788 
    789 /****************************************************************************************
    790  *                        powerSaveCompleteCB                                                       *
    791  ****************************************************************************************
    792 DESCRIPTION: Callback for the Power server complete - gets the result of the request
    793               for PS or exit PS.
    794 
    795 INPUT:          - hPowerMgr             - Handle to the Power Manager
    796             - PSMode
    797             - trasStatus            - result string form the FW.
    798 OUTPUT:
    799 RETURN:    void.\n
    800 ****************************************************************************************/
    801 static void powerSaveCompleteCB(TI_HANDLE hPowerMgr,TI_UINT8 PSMode,TI_UINT8 transStatus)
    802 {
    803     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    804 
    805     TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerSaveCompleteCB, statud = %d\n", transStatus);
    806 
    807     /* Handling the event*/
    808     switch ( (EventsPowerSave_e)transStatus )
    809     {
    810     case ENTER_POWER_SAVE_FAIL:
    811     case EXIT_POWER_SAVE_FAIL:
    812         pPowerMgr->lastPsTransaction = transStatus;
    813         tmr_StartTimer (pPowerMgr->hRetryPsTimer,
    814                         powerMgrRetryPsTimeout,
    815                         (TI_HANDLE)pPowerMgr,
    816                       RE_ENTER_PS_TIMEOUT,
    817                       TI_FALSE);
    818         break;
    819 
    820     case ENTER_POWER_SAVE_SUCCESS:
    821     case EXIT_POWER_SAVE_SUCCESS:
    822         break;
    823 
    824     default:
    825         TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerSaveCompleteCB: invliad status: %d\n", transStatus);
    826         break;
    827     }
    828 }
    829 
    830 /**
    831  * \\n
    832  * \date 30-Aug-2006\n
    833  * \brief Power manager callback fro TM event notification
    834  *
    835  * Function Scope \e Public.\n
    836  * \param hPowerMgr - handle to the power maanger object.\n
    837  * \param cookie - values supplied during event registration (active / doze).\n
    838  */
    839 static void PowerMgrTMThresholdCrossCB( TI_HANDLE hPowerMgr, TI_UINT32 cookie )
    840 {
    841     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    842 
    843     TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgrTMThresholdCrossCB - TM notified threshold crossed, cookie: %d\n", cookie);
    844 
    845     /* sanity cehcking - TM notifications should only be received when PM is enabled and in auto mode */
    846     if ( (pPowerMgr->psEnable == TI_TRUE) && (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO))
    847     {
    848         switch ((PowerMgr_PowerMode_e)cookie)
    849         {
    850         case POWER_MODE_ACTIVE:
    851             powerMgrPowerProfileConfiguration( hPowerMgr, POWER_MODE_ACTIVE );
    852             break;
    853 
    854         /* threshold crossed down - need to enter configured doze mode */
    855         case POWER_MODE_SHORT_DOZE:
    856             powerMgrPowerProfileConfiguration( hPowerMgr, pPowerMgr->autoModeDozeMode );
    857             break;
    858 
    859         default:
    860             TRACE1( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgrTMThresholdCrossCB: TM notification with invalid cookie: %d!\n", cookie);
    861             break;
    862         }
    863     }
    864     else
    865     {
    866         TRACE2( pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgrTMThresholdCrossCB: TM motification when psEnable is :%d or desired profile is: %d\n", pPowerMgr->psEnable, pPowerMgr->desiredPowerModeProfile);
    867     }
    868 
    869 }
    870 
    871 /****************************************************************************************
    872 *                        powerMgrDisableThresholdsIndications                                           *
    873 *****************************************************************************************
    874 DESCRIPTION: This will send a disable message to the traffic monitor,
    875                  to stop sending indications on threshold pass.
    876 
    877 
    878 INPUT:          - hPowerMgr             - Handle to the Power Manager
    879 OUTPUT:
    880 RETURN:    void.\n
    881 ****************************************************************************************/
    882 static void powerMgrDisableThresholdsIndications(TI_HANDLE hPowerMgr)
    883 {
    884     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    885 
    886     /*
    887     auto is not a static/fix state, else its a dynamic state that flows between
    888     the 3 static/fix states: active, short-doze and long-doze.
    889     */
    890     TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
    891                                   pPowerMgr->passToActiveTMEvent);
    892 
    893     TrafficMonitor_StopEventNotif(pPowerMgr->hTrafficMonitor,
    894                                   pPowerMgr->passToDozeTMEvent);
    895 
    896 }
    897 
    898 
    899 /****************************************************************************************
    900 *                        powerMgrEnableThresholdsIndications                                            *
    901 *****************************************************************************************
    902 DESCRIPTION: TThis will send an enable message to the traffic monitor,
    903                 to start sending indications on threshold pass.
    904 
    905 
    906 INPUT:          - hPowerMgr             - Handle to the Power Manager
    907 OUTPUT:
    908 RETURN:    void.\n
    909 ****************************************************************************************/
    910 static void powerMgrEnableThresholdsIndications(TI_HANDLE hPowerMgr)
    911 {
    912     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    913 
    914     TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrEnableThresholdsIndications called\n");
    915     /*
    916     auto is not a static/fix state, but rather a dynamic state that flows between
    917     the 3 static/fix states: active, short-doze and long-doze.
    918     */
    919     TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
    920                                    pPowerMgr->passToActiveTMEvent);
    921 
    922     TrafficMonitor_StartEventNotif(pPowerMgr->hTrafficMonitor,
    923                                    pPowerMgr->passToDozeTMEvent);
    924 
    925 }
    926 
    927 
    928 /****************************************************************************************
    929 *                        powerMgrStartAutoPowerMode                                                 *
    930 *****************************************************************************************
    931 DESCRIPTION: configure the power manager to enter into AUTO power mode.
    932              The power manager will deside what power level will be applied
    933              acording to the traffic monitor.
    934 
    935 INPUT:          - hPowerMgr             - Handle to the Power Manager
    936 OUTPUT:
    937 RETURN:    void.\n
    938 ****************************************************************************************/
    939 static void powerMgrStartAutoPowerMode(TI_HANDLE hPowerMgr)
    940 {
    941     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    942     int frameCount;
    943 
    944     frameCount = TrafficMonitor_GetFrameBandwidth(pPowerMgr->hTrafficMonitor);
    945 
    946     TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrStartAutoPowerMode: Starting auto power mode,");
    947 
    948     /*Activates the correct profile*/
    949     if ( frameCount >= pPowerMgr->autoModeActiveTH )
    950     {
    951         powerMgrPowerProfileConfiguration(hPowerMgr, POWER_MODE_ACTIVE);
    952     }
    953     else
    954     {
    955         powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->autoModeDozeMode);
    956 
    957     }
    958     /* Activates the Trafic monitoe Events*/
    959     powerMgrEnableThresholdsIndications(hPowerMgr);
    960 }
    961 
    962 /****************************************************************************************
    963 *                        powerMgrRetryPsTimeout                                                     *
    964 *****************************************************************************************
    965 DESCRIPTION: Retry function if a PS/exit PS request failed
    966 
    967 INPUT:      hPowerMgr       - Handle to the Power Manager
    968             bTwdInitOccured - Indicates if TWDriver recovery occured since timer started
    969 
    970 OUTPUT:
    971 
    972 RETURN:    void.\n
    973 ****************************************************************************************/
    974 static void powerMgrRetryPsTimeout(TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured)
    975 {
    976     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
    977     TI_STATUS powerStatus;
    978 
    979     TRACE0( pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrRetryPsTimeout: timer expired.\n");
    980 
    981     if ( pPowerMgr->lastPsTransaction == ENTER_POWER_SAVE_FAIL )
    982     {
    983         powerStatus = TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_ON, TI_TRUE, hPowerMgr,powerSaveCompleteCB, NULL);/*NULL as GWSI callback*/
    984     }
    985     else
    986     {
    987         powerStatus = TWD_SetPsMode (pPowerMgr->hTWD, POWER_SAVE_OFF, TI_TRUE, hPowerMgr, powerSaveCompleteCB, NULL);/*NULL as GWSI callback*/
    988     }
    989 	return;
    990 }
    991 
    992 
    993 /****************************************************************************************
    994 *                        powerMgrPowerProfileConfiguration                                          *
    995 *****************************************************************************************
    996 DESCRIPTION: This function is the " builder " of the Power Save profiles.
    997              acording to the desired Power mode.
    998 
    999 INPUT:          - hPowerMgr             - Handle to the Power Manager
   1000 OUTPUT:
   1001 RETURN:    void.\n
   1002 ****************************************************************************************/
   1003 static void powerMgrPowerProfileConfiguration(TI_HANDLE hPowerMgr, PowerMgr_PowerMode_e desiredPowerMode)
   1004 {
   1005     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1006     TI_STATUS powerStatus;
   1007 
   1008     tmr_StopTimer (pPowerMgr->hRetryPsTimer);
   1009 
   1010 	pPowerMgr->lastPowerModeProfile = desiredPowerMode;
   1011 
   1012     switch ( desiredPowerMode )
   1013     {
   1014     case POWER_MODE_AUTO:
   1015         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==AUTO - This mode should not be sent to the GWSI - we send AUTO instead\n");
   1016         break;
   1017 
   1018     case POWER_MODE_ACTIVE:
   1019         /* set AWAKE through */
   1020         powerStatus = TWD_SetPsMode (pPowerMgr->hTWD,
   1021                                           POWER_SAVE_OFF,
   1022                                           TI_TRUE,
   1023                                           hPowerMgr,
   1024                                           powerSaveCompleteCB,
   1025                                           NULL);
   1026 
   1027         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==ACTIVE\n");
   1028         break;
   1029 
   1030     case POWER_MODE_SHORT_DOZE:
   1031         if ( pPowerMgr->beaconListenInterval > 1 )
   1032         {
   1033             powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
   1034         }
   1035         else
   1036         {
   1037             powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
   1038         }
   1039 
   1040         powerStatus = TWD_SetPsMode (pPowerMgr->hTWD,
   1041                                           POWER_SAVE_ON,
   1042                                           TI_TRUE,
   1043                                           hPowerMgr,
   1044                                           powerSaveCompleteCB,
   1045                                           NULL);
   1046 
   1047         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==SHORT_DOZE\n");
   1048         break;
   1049 
   1050     case POWER_MODE_LONG_DOZE:
   1051         if ( pPowerMgr->dtimListenInterval > 1 )
   1052         {
   1053             powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
   1054         }
   1055         else
   1056         {
   1057             powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
   1058         }
   1059         powerStatus = TWD_SetPsMode (pPowerMgr->hTWD,
   1060                                           POWER_SAVE_ON,
   1061                                           TI_TRUE,
   1062                                           hPowerMgr,
   1063                                           powerSaveCompleteCB,
   1064                                           NULL);
   1065 
   1066         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==LONG_DOZE\n");
   1067         break;
   1068 
   1069 	case POWER_MODE_PS_ONLY:
   1070 		/* When in SG PS mode, configure the user desired wake-up condition */
   1071 		powerMgr_SGSetUserDesiredwakeUpCond(pPowerMgr);
   1072 
   1073         powerStatus = TWD_SetPsMode (pPowerMgr->hTWD,
   1074                                           POWER_SAVE_ON,
   1075                                           TI_TRUE,
   1076                                           hPowerMgr,
   1077                                           powerSaveCompleteCB,
   1078                                           NULL);
   1079 
   1080         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMode==PS_ONLY\n");
   1081         break;
   1082 
   1083     default:
   1084         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "PowerMgr_setWakeUpConfiguration - ERROR - PowerMode - unknown parameter: %d\n", desiredPowerMode);
   1085         return;
   1086     }
   1087 
   1088 }
   1089 
   1090 
   1091 /****************************************************************************************
   1092 *                        powerMgrSendMBXWakeUpConditions                                            *
   1093 *****************************************************************************************
   1094 DESCRIPTION: Tsend configuration of the power management option that holds in the command
   1095                 mailbox inner sturcture.
   1096 
   1097 INPUT:          - hPowerMgr             - Handle to the Power Manager
   1098 OUTPUT:
   1099 RETURN:    TI_STATUS - TI_OK on success else TI_NOK.\n
   1100 ****************************************************************************************/
   1101 static TI_STATUS powerMgrSendMBXWakeUpConditions(TI_HANDLE hPowerMgr,
   1102                                                  TI_UINT8 listenInterval,
   1103                                                  ETnetWakeOn tnetWakeupOn)
   1104 {
   1105     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1106     TPowerMgmtConfig powerMgmtConfig;
   1107     TI_STATUS status = TI_OK;
   1108 
   1109     powerMgmtConfig.listenInterval = listenInterval;
   1110     powerMgmtConfig.tnetWakeupOn = tnetWakeupOn;
   1111 
   1112     TRACE2(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "powerMgrSendMBXWakeUpConditions: listenInterval = %d, tnetWakeupOn = %d\n", listenInterval,tnetWakeupOn);
   1113 
   1114     status = TWD_CfgWakeUpCondition (pPowerMgr->hTWD, &powerMgmtConfig);
   1115 
   1116     if ( status != TI_OK )
   1117     {
   1118         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrSendMBXWakeUpConditions - Error in wae up condition IE!\n");
   1119     }
   1120     return status;
   1121 }
   1122 
   1123 
   1124 
   1125 
   1126 static TI_STATUS powerMgrNullPacketRateConfiguration(TI_HANDLE hPowerMgr)
   1127 {
   1128     paramInfo_t     param;
   1129     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1130 
   1131     param.paramType = SITE_MGR_CURRENT_RATE_PAIR_PARAM;
   1132     if ( siteMgr_getParam(pPowerMgr->hSiteMgr, &param) == TI_OK )
   1133     {
   1134         TWD_SetNullRateModulation (pPowerMgr->hTWD, (TI_UINT16)param.content.siteMgrCurrentRateMask.basicRateMask);
   1135     }
   1136     else
   1137     {
   1138         TWD_SetNullRateModulation (pPowerMgr->hTWD, (DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER));
   1139         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrNullPacketRateConfiguration: error - faild to set rate so default was seted!\n");
   1140     }
   1141     return TI_OK;
   1142 
   1143 }
   1144 
   1145 
   1146 static PowerMgr_PowerMode_e powerMgrGetHighestPriority(TI_HANDLE hPowerMgr)
   1147 {
   1148     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1149     int index;
   1150     for ( index = POWER_MANAGER_MAX_PRIORITY-1;index >= 0;index-- )
   1151     {
   1152         if ( pPowerMgr->powerMngModePriority[index].priorityEnable )
   1153         {
   1154 
   1155             return pPowerMgr->powerMngModePriority[index].powerMode;
   1156         }
   1157 
   1158     }
   1159 
   1160     TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, "powerMgrGetHighestPriority - error - faild to get highest priority! sefault deseired mode was returned !!!\n");
   1161     return pPowerMgr->desiredPowerModeProfile;
   1162 }
   1163 
   1164 
   1165  /****************************************************************************************
   1166  *                        PowerMgr_notifyFWReset															*
   1167  ****************************************************************************************
   1168 DESCRIPTION: Notify the object of the power Manager about FW reset (recovery).
   1169 			 Calls PowerSrv module to Set Ps Mode
   1170 
   1171 INPUT:      - hPowerMgr - Handle to the Power Manager
   1172 OUTPUT:
   1173 RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
   1174 ****************************************************************************************/
   1175 TI_STATUS PowerMgr_notifyFWReset(TI_HANDLE hPowerMgr)
   1176 {
   1177 	PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1178 
   1179     TRACE2(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, "PowerMgr_notifyFWReset(): psEnable = %d, lastPowerModeProfile = %d\n", pPowerMgr->psEnable, pPowerMgr->lastPowerModeProfile);
   1180 
   1181 	if (pPowerMgr->psEnable)
   1182 	{
   1183 		powerMgrPowerProfileConfiguration(hPowerMgr, pPowerMgr->lastPowerModeProfile);
   1184 	}
   1185 
   1186     return TI_OK;
   1187 }
   1188 
   1189 
   1190 /****************************************************************************************
   1191  *                        PowerMgrConfigBetToFw															*
   1192  ****************************************************************************************
   1193 DESCRIPTION: callback from TM event notification.
   1194 				-	call PowerSrv module to Set Ps Mode
   1195 
   1196 INPUT:      	- hPowerMgr - Handle to the Power Manager
   1197                 - BetEnable - cookie:values supplied during event registration
   1198 OUTPUT:
   1199 RETURN:    None.
   1200 ****************************************************************************************/
   1201 static void PowerMgrConfigBetToFw( TI_HANDLE hPowerMgr, TI_UINT32 BetEnable )
   1202 {
   1203     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1204     TI_UINT8 MaximumConsecutiveET;
   1205     TI_UINT32 listenInterval;
   1206     paramInfo_t param;
   1207     TI_UINT32 beaconInterval;
   1208     TI_UINT32 dtimPeriod;
   1209     PowerMgr_PowerMode_e powerMode;
   1210 
   1211     param.paramType = SITE_MGR_BEACON_INTERVAL_PARAM;
   1212     siteMgr_getParam(pPowerMgr->hSiteMgr, &param);
   1213     beaconInterval = param.content.beaconInterval;
   1214 
   1215     param.paramType = SITE_MGR_DTIM_PERIOD_PARAM;
   1216     siteMgr_getParam(pPowerMgr->hSiteMgr, &param);
   1217     dtimPeriod = param.content.siteMgrDtimPeriod;
   1218 
   1219     /* get actual Power Mode */
   1220     if (pPowerMgr->desiredPowerModeProfile == POWER_MODE_AUTO)
   1221     {
   1222         powerMode = pPowerMgr->autoModeDozeMode;
   1223     }
   1224     else
   1225     {
   1226         powerMode = pPowerMgr->lastPowerModeProfile;
   1227     }
   1228 
   1229     /* calc ListenInterval */
   1230     if (powerMode == POWER_MODE_SHORT_DOZE)
   1231     {
   1232         listenInterval = beaconInterval * pPowerMgr->beaconListenInterval;
   1233     }
   1234     else if (powerMode == POWER_MODE_LONG_DOZE)
   1235     {
   1236         listenInterval = dtimPeriod * beaconInterval * pPowerMgr->dtimListenInterval;
   1237     }
   1238     else
   1239     {
   1240         listenInterval = beaconInterval;
   1241     }
   1242 
   1243     if (listenInterval == 0)
   1244     {
   1245         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, "PowerMgrConfigBetToFw: listenInterval is ZERO\n");
   1246         return;
   1247     }
   1248 
   1249     /* MaximumConsecutiveET = MaximalFullBeaconReceptionInterval / MAX( BeaconInterval, ListenInterval) */
   1250     MaximumConsecutiveET = pPowerMgr->maxFullBeaconInterval / listenInterval;
   1251 
   1252     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);
   1253 
   1254     pPowerMgr->betEnable = BetEnable; /* save BET enable flag for CLI configuration */
   1255 
   1256     TWD_CfgBet(pPowerMgr->hTWD, BetEnable, MaximumConsecutiveET);
   1257 }
   1258 
   1259 /**
   1260  * \date 10-April-2007\n
   1261  * \brief Returns to the configured wakeup condition, when SG protective mode is done
   1262  *
   1263  * Function Scope \e Public.\n
   1264  * Parameters:\n
   1265  * 1) TI_HANDLE - handle to the PowerMgr object.\n
   1266  * Return Value: void.\n
   1267  */
   1268 static void powerMgr_SGSetUserDesiredwakeUpCond( TI_HANDLE hPowerMgr )
   1269 {
   1270     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1271 
   1272    	if (pPowerMgr->psEnable)
   1273 	{
   1274 		/* set wakeup condition according to user mode power save profile */
   1275 		switch ( pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode )
   1276 		{
   1277 		case POWER_MODE_AUTO:
   1278 			/*set wakeup condition according to doze mode in auto and wakup interval */
   1279 			if ( pPowerMgr->autoModeDozeMode == POWER_MODE_SHORT_DOZE )
   1280 			{
   1281 				/* short doze */
   1282 				if ( pPowerMgr->beaconListenInterval > 1 )
   1283 				{
   1284 					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
   1285 				}
   1286 				else
   1287 				{
   1288 					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
   1289 				}
   1290 			}
   1291 			else
   1292 			{
   1293 				/* long doze */
   1294 				if ( pPowerMgr->dtimListenInterval > 1 )
   1295 				{
   1296 					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
   1297 				}
   1298 				else
   1299 				{
   1300 					powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
   1301 				}
   1302 			}
   1303 			break;
   1304 
   1305 		case POWER_MODE_ACTIVE:
   1306 			break;
   1307 
   1308 		case POWER_MODE_SHORT_DOZE:
   1309 			if ( pPowerMgr->beaconListenInterval > 1 )
   1310 			{
   1311 				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_N_BEACON);
   1312 			}
   1313 			else
   1314 			{
   1315 				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->beaconListenInterval,TNET_WAKE_ON_BEACON);
   1316 			}
   1317 			break;
   1318 
   1319 		case POWER_MODE_LONG_DOZE:
   1320 			if ( pPowerMgr->dtimListenInterval > 1 )
   1321 			{
   1322 				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_N_DTIM);
   1323 			}
   1324 			else
   1325 			{
   1326 				powerMgrSendMBXWakeUpConditions(hPowerMgr,pPowerMgr->dtimListenInterval,TNET_WAKE_ON_DTIM);
   1327 			}
   1328 			break;
   1329 
   1330 		default:
   1331 TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_ERROR, ": ERROR - PowerMode for user prioirty is: %d\n", pPowerMgr->powerMngModePriority[ POWER_MANAGER_USER_PRIORITY ].powerMode);
   1332 		}
   1333 	}/*end of if (psEnable)*/
   1334 }
   1335 
   1336 
   1337 
   1338 /****************************************************************************************
   1339 *                        PowerMgr_PsPollFailureCB															*
   1340 ****************************************************************************************
   1341 DESCRIPTION: Work around to solve AP bad behavior.
   1342          Some old AP's have trouble with Ps-Poll - The solution will be to exit PS for a
   1343          period of time
   1344 
   1345 INPUT:      	- hPowerMgr - Handle to the Power Manager
   1346 OUTPUT:
   1347 RETURN:
   1348 ****************************************************************************************/
   1349 static void PowerMgr_PsPollFailureCB( TI_HANDLE hPowerMgr )
   1350 {
   1351     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1352 
   1353     if ( pPowerMgr->PsPollDeliveryFailureRecoveryPeriod )
   1354     {
   1355         paramInfo_t param;
   1356 
   1357         TRACE1(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, " Oh boy, AP is not answering Ps-Poll's. enter active PS for %d Ms\n", pPowerMgr->PsPollDeliveryFailureRecoveryPeriod);
   1358 
   1359         /*
   1360          * Set the system to Active power save
   1361          */
   1362         param.paramType = POWER_MGR_POWER_MODE;
   1363         param.content.powerMngPowerMode.PowerMode = POWER_MODE_ACTIVE;
   1364         param.content.powerMngPowerMode.PowerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
   1365         powerMgr_setParam(hPowerMgr,&param);
   1366 
   1367         param.paramType = POWER_MGR_ENABLE_PRIORITY;
   1368         param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
   1369         powerMgr_setParam(hPowerMgr,&param);
   1370 
   1371         /*
   1372          * Set timer to exit the active mode
   1373          */
   1374         tmr_StartTimer(pPowerMgr->hPsPollFailureTimer,
   1375 					   powerMgr_PsPollFailureTimeout,
   1376 					   (TI_HANDLE)pPowerMgr,
   1377 					   pPowerMgr->PsPollDeliveryFailureRecoveryPeriod,
   1378 					   TI_FALSE);
   1379     }
   1380     else    /* Work-around is disabled */
   1381     {
   1382         TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_WARNING, " Oh boy, AP is not answering Ps-Poll's !!!\n");
   1383     }
   1384 	return;
   1385 }
   1386 
   1387 /****************************************************************************************
   1388 *                        powerMgr_PsPollFailureTimeout									*
   1389 ****************************************************************************************
   1390 DESCRIPTION: After the timeout of ps-poll failure - return to normal behavior
   1391 
   1392 INPUT:      	- hPowerMgr - Handle to the Power Manager
   1393 OUTPUT:
   1394 RETURN:
   1395 ****************************************************************************************/
   1396 static void powerMgr_PsPollFailureTimeout( TI_HANDLE hPowerMgr, TI_BOOL bTwdInitOccured )
   1397 {
   1398     PowerMgr_t *pPowerMgr = (PowerMgr_t*)hPowerMgr;
   1399     paramInfo_t param;
   1400 
   1401     TRACE0(pPowerMgr->hReport, REPORT_SEVERITY_INFORMATION, " \n");
   1402 
   1403     /* disable Ps-Poll priority */
   1404     param.paramType = POWER_MGR_DISABLE_PRIORITY;
   1405     param.content.powerMngPriority = POWER_MANAGER_PS_POLL_FAILURE_PRIORITY;
   1406     powerMgr_setParam(hPowerMgr,&param);
   1407 
   1408 	return;
   1409 }
   1410 
   1411 TI_BOOL PowerMgr_getReAuthActivePriority(TI_HANDLE thePowerMgrHandle)
   1412 {
   1413     PowerMgr_t *pPowerMgr = (PowerMgr_t*)thePowerMgrHandle;
   1414 	return pPowerMgr->reAuthActivePriority;
   1415 }
   1416