Home | History | Annotate | Download | only in MacServices
      1 /*
      2  * PowerSrvSM.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 PowerSrvSM.c
     35  *  \brief This is the PowerSrvSM module implementation.
     36  *  \author Assaf Azulay
     37  *  \date 19-OCT-2005
     38  */
     39 
     40 /****************************************************************************
     41  *                                                                          *
     42  *   MODULE:  PowerSrvSM                                                    *
     43  *   PURPOSE: PowerSrvSM Module implementation.                             *
     44  *                                                                          *
     45  ****************************************************************************/
     46 
     47 #define __FILE_ID__  FILE_ID_114
     48 #include "tidef.h"
     49 #include "osApi.h"
     50 #include "timer.h"
     51 #include "fsm.h"
     52 #include "report.h"
     53 #include "TWDriver.h"
     54 #include "PowerSrvSM.h"
     55 #include "CmdBld.h"
     56 
     57 
     58 /*****************************************************************************
     59  **         Defines                                                         **
     60  *****************************************************************************/
     61 
     62 
     63 /*****************************************************************************
     64  **         structs                                                         **
     65  *****************************************************************************/
     66 
     67 
     68 /*****************************************************************************
     69  **         Private Function prototypes                                     **
     70  *****************************************************************************/
     71 
     72 static TI_STATUS powerSrvSmSMEvent(TI_UINT8* pCurrentState,
     73                                    TI_UINT8 event,
     74                                    TI_HANDLE hPowerSrvSM);
     75 static TI_STATUS powerSrvSmDoUpdateRequest(TI_HANDLE hPowerSrvSM);
     76 static TI_STATUS powerSrvSmDoEnterPowerSave(TI_HANDLE hPowerSrvSM);
     77 static TI_STATUS powerSrvSmDoExitPowerSave(TI_HANDLE hPowerSrvSM);
     78 static TI_STATUS powerSrvSmDoPending(TI_HANDLE hPowerSrvSM);
     79 static TI_STATUS powerSrvSmDoAllready(TI_HANDLE hPowerSrvSM);
     80 static TI_STATUS powerSrvSMActionUnexpected(TI_HANDLE hPowerSrvSM);
     81 static TI_STATUS powerSrvSMSendMBXConfiguration(TI_HANDLE hPowerSrvSM, TI_BOOL PS_disableEnable);
     82 static void      powerSrvSMTimerExpired (TI_HANDLE hPowerSrvSM, TI_BOOL bTwdInitOccured);
     83 
     84 /***************************************************************************************
     85  **         Public Function prototypes                                      **
     86  ****************************************************************************************/
     87 
     88 
     89 /****************************************************************************************
     90  *                        powerSrvSM_create                                                         *
     91  ****************************************************************************************
     92 DESCRIPTION: Power Server SM module creation function, called by the Power Server create in creation phase
     93                 performs the following:
     94                 -   Allocate the Power Server SM handle
     95                 -   Creates the fsm.
     96 
     97 INPUT:          - hOs - Handle to OS
     98 
     99 
    100 OUTPUT:
    101 
    102 RETURN:     Handle to the Power Server SM module on success, NULL otherwise
    103 ****************************************************************************************/
    104 TI_HANDLE powerSrvSM_create(TI_HANDLE hOsHandle)
    105 {
    106     PowerSrvSM_t *pPowerSrvSM = NULL;
    107     fsm_stateMachine_t *pFsm = NULL;
    108     TI_STATUS status;
    109 
    110     pPowerSrvSM = (PowerSrvSM_t*) os_memoryAlloc (hOsHandle, sizeof(PowerSrvSM_t));
    111     if ( pPowerSrvSM == NULL )
    112     {
    113         WLAN_OS_REPORT(("%s(%d) - Memory Allocation Error!\n",__FUNCTION__,__LINE__));
    114         return NULL;
    115     }
    116 
    117     os_memoryZero (hOsHandle, pPowerSrvSM, sizeof(PowerSrvSM_t));
    118 
    119     pPowerSrvSM->hOS = hOsHandle;
    120 
    121     /* create the generic state-machine */
    122     status = fsm_Create(hOsHandle,
    123                         &pFsm,
    124                         (TI_UINT8)POWER_SRV_SM_STATE_NUM,
    125                         (TI_UINT8)POWER_SRV_SM_EVENT_NUM);
    126     if ( status != TI_OK )
    127     {
    128         WLAN_OS_REPORT(("%s(%d) - Error in create FSM!\n",__FUNCTION__,__LINE__));
    129         powerSrvSM_destroy(pPowerSrvSM);
    130         return NULL;
    131     }
    132 
    133     pPowerSrvSM->hFSM = (TI_HANDLE)pFsm;
    134 
    135     return pPowerSrvSM;
    136 }
    137 
    138 
    139 /****************************************************************************************
    140  *                        powerSrvSM_destroy                                                            *
    141  ****************************************************************************************
    142 DESCRIPTION: Power Server SM module destroy function,
    143                 -   delete Power Server SM allocation
    144 
    145 
    146 INPUT:          - hPowerSrvSM - Handle to the Power Server  SM
    147 
    148 
    149 OUTPUT:
    150 
    151 RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
    152 ****************************************************************************************/
    153 TI_STATUS powerSrvSM_destroy(TI_HANDLE hPowerSrvSM)
    154 {
    155     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    156 
    157     TI_HANDLE osHandle = pPowerSrvSM->hOS;
    158 
    159     /* free the timer */
    160     if (pPowerSrvSM->hPwrSrvSmTimer)
    161     {
    162         tmr_DestroyTimer (pPowerSrvSM->hPwrSrvSmTimer);
    163     }
    164 
    165     /* free the generic SM */
    166     if ( pPowerSrvSM->hFSM != NULL )
    167     {
    168         fsm_Unload(osHandle, (fsm_stateMachine_t*)pPowerSrvSM->hFSM);
    169     }
    170 
    171     /* free the Power Save SRV object */
    172     os_memoryFree(osHandle , pPowerSrvSM , sizeof(PowerSrvSM_t));
    173 
    174     return TI_OK;
    175 }
    176 
    177 
    178 /****************************************************************************************
    179 *                        powerSrvSM_init                                                           *
    180 ****************************************************************************************
    181 DESCRIPTION: Power Server SM module initialize function, called by the Power Server init in configure phase
    182                performs the following:
    183                -   init the Stet machine states.
    184                -   set Active as start state.
    185 
    186 INPUT:     - hPowerSrvSM       - handle to the PowerSrvSM object.
    187            - hReport           - handle to the Report object.
    188            - hCmdBld           - handle to the Command Builder object.
    189            - hTimer            - handle to the Timer module object.
    190 
    191 OUTPUT:
    192 RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
    193 ****************************************************************************************/
    194 TI_STATUS powerSrvSM_init (TI_HANDLE hPowerSrvSM,
    195                            TI_HANDLE hReport,
    196                            TI_HANDLE hCmdBld,
    197                            TI_HANDLE hTimer)
    198 {
    199     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    200 
    201     fsm_actionCell_t smMatrix[POWER_SRV_SM_STATE_NUM][POWER_SRV_SM_EVENT_NUM] =
    202     {
    203         /*
    204         next state and transition action for POWER_SRV_STATE_ACTIVE state
    205         */
    206         {
    207             /* POWER_SRV_EVENT_REQUEST_ACTIVE */
    208             {POWER_SRV_STATE_ACTIVE             , powerSrvSmDoAllready},
    209 
    210             /* POWER_SRV_EVENT_REQUEST_PS */
    211             {POWER_SRV_STATE_PEND_PS                , powerSrvSmDoEnterPowerSave},
    212 
    213             /* POWER_SRV_EVENT_SUCCESS */
    214             {POWER_SRV_STATE_ACTIVE                 , powerSrvSMActionUnexpected},
    215 
    216             /* POWER_SRV_EVENT_FAIL */
    217             {POWER_SRV_STATE_ACTIVE                 , powerSrvSMActionUnexpected}
    218 
    219         },
    220 
    221         /*
    222         next state and transition action for POWER_SRV_STATE_PEND_PS state
    223         */
    224         {
    225             /* POWER_SRV_EVENT_REQUEST_ACTIVE */
    226             {POWER_SRV_STATE_PEND_PS            , powerSrvSmDoPending},
    227 
    228             /* POWER_SRV_EVENT_REQUEST_PS */
    229             {POWER_SRV_STATE_PEND_PS        , powerSrvSmDoPending},
    230 
    231             /* POWER_SRV_EVENT_SUCCESS */
    232             {POWER_SRV_STATE_PS                 , powerSrvSmDoUpdateRequest},
    233 
    234             /* POWER_SRV_EVENT_FAIL */
    235             {POWER_SRV_STATE_ACTIVE             , powerSrvSmDoUpdateRequest}
    236 
    237         },
    238         /*
    239         next state and transition action for POWER_SRV_STATE_PS state
    240         */
    241         {
    242             /* POWER_SRV_EVENT_REQUEST_ACTIVE */
    243             {POWER_SRV_STATE_PEND_ACTIVE        , powerSrvSmDoExitPowerSave},
    244 
    245             /* POWER_SRV_EVENT_REQUEST_PS */
    246             {POWER_SRV_STATE_PS                 , powerSrvSmDoAllready},
    247 
    248             /* POWER_SRV_EVENT_SUCCESS */
    249             {POWER_SRV_STATE_PS                 , powerSrvSMActionUnexpected},
    250 
    251             /* POWER_SRV_EVENT_FAIL */
    252             {POWER_SRV_STATE_PS                 , powerSrvSMActionUnexpected}
    253 
    254         },
    255         /*
    256         next state and transition action for POWER_SRV_STATE_PEND_ACTIVE state
    257         */
    258         {
    259             /* POWER_SRV_EVENT_REQUEST_ACTIVE */
    260             {POWER_SRV_STATE_PEND_ACTIVE            , powerSrvSmDoPending},
    261 
    262             /* POWER_SRV_EVENT_REQUEST_PS */
    263             {POWER_SRV_STATE_PEND_ACTIVE        , powerSrvSmDoPending},
    264 
    265             /* POWER_SRV_EVENT_SUCCESS */
    266             {POWER_SRV_STATE_ACTIVE             , powerSrvSmDoUpdateRequest},
    267 
    268             /* POWER_SRV_EVENT_FAIL */
    269             {POWER_SRV_STATE_ERROR_ACTIVE       , powerSrvSmDoUpdateRequest}
    270 
    271         },
    272         /*
    273         next state and transition action for POWER_SRV_STATE_ERROR_ACTIVE state
    274         */
    275         {
    276             /* POWER_SRV_EVENT_REQUEST_ACTIVE */
    277             {POWER_SRV_STATE_PEND_ACTIVE            , powerSrvSmDoExitPowerSave},
    278 
    279             /* POWER_SRV_EVENT_REQUEST_PS */
    280             {POWER_SRV_STATE_PEND_PS        , powerSrvSmDoEnterPowerSave},
    281 
    282             /* POWER_SRV_EVENT_SUCCESS */
    283             {POWER_SRV_STATE_ERROR_ACTIVE       , powerSrvSMActionUnexpected},
    284 
    285             /* POWER_SRV_EVENT_FAIL */
    286             {POWER_SRV_STATE_ERROR_ACTIVE       , powerSrvSMActionUnexpected}
    287 
    288         },
    289 
    290     };
    291 
    292     pPowerSrvSM->hReport = hReport;
    293     pPowerSrvSM->hCmdBld = hCmdBld;
    294     pPowerSrvSM->hTimer  = hTimer;
    295 
    296     /* create the timer */
    297     pPowerSrvSM->hPwrSrvSmTimer = tmr_CreateTimer (pPowerSrvSM->hTimer);
    298 	if (pPowerSrvSM->hPwrSrvSmTimer == NULL)
    299 	{
    300         TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "powerSrvSM_init(): Failed to create hPwrSrvSmTimer!\n");
    301 		return TI_NOK;
    302 	}
    303 
    304     fsm_Config(pPowerSrvSM->hFSM,
    305                (fsm_Matrix_t)smMatrix,
    306                POWER_SRV_SM_STATE_NUM,
    307                POWER_SRV_SM_EVENT_NUM,
    308                powerSrvSmSMEvent,
    309                pPowerSrvSM->hOS);
    310 
    311     /*
    312     the PowerSrvSM start in active mode (POWER_SRV_STATE_ACTIVE)
    313     the PowerSrvSM::currentState must be sync with the PowerSrv::desiredPowerModeProfile (POWER_MODE_ACTIVE).
    314     */
    315     pPowerSrvSM->currentState = POWER_SRV_STATE_ACTIVE;
    316 
    317 
    318     /*
    319     Null packet rate : 2,5.5 M
    320     Probe Request : Not PBCC modulation, Long Preamble */
    321     pPowerSrvSM->NullPktRateModulation= (DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER);
    322 
    323     TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_INIT, "PowerSrvSM Initialized\n");
    324 
    325     return TI_OK;
    326 }
    327 
    328 /****************************************************************************************
    329 *                        powerSrvSM_config                                                         *
    330 ****************************************************************************************
    331 DESCRIPTION: Power Server SM module configuration function, called by the Power Server init in configure phase
    332                performs the following:
    333                -   init the Stet machine states.
    334                -   set Active as start state.
    335 
    336 INPUT:      - hPowerSrvSM       - handle to the PowerSrvSM object.
    337            - pPowerSrvInitParams   - the Power Server initialize parameters.
    338 
    339 OUTPUT:
    340 RETURN:    TI_STATUS - TI_OK on success else TI_NOK.
    341 ****************************************************************************************/
    342 TI_STATUS powerSrvSM_config(TI_HANDLE hPowerSrvSM,
    343                             TPowerSrvInitParams *pPowerSrvInitParams)
    344 {
    345     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    346 
    347     /*
    348     init PowerMgmtConfigration
    349     */
    350     pPowerSrvSM->hangOverPeriod =   pPowerSrvInitParams->hangOverPeriod;
    351     pPowerSrvSM->numNullPktRetries =    pPowerSrvInitParams->numNullPktRetries;
    352 
    353     return TI_OK;
    354 }
    355 /****************************************************************************************
    356  *                        powerSrvSM_SMApi                                                           *
    357  *****************************************************************************************
    358 DESCRIPTION: This function triggers events from the outside of the module into the state machine.
    359 
    360 
    361 INPUT:      - hPowerSrvSM                   - handle to the PowerSrvSM object.
    362             - theSMEvent                    - event from TWD.
    363 
    364 
    365 OUTPUT:
    366 RETURN:    TI_STATUS TI_OK / PENDING / TI_NOK
    367 ****************************************************************************************/
    368 TI_STATUS powerSrvSM_SMApi(TI_HANDLE hPowerSrvSM,
    369                            PowerSrvSMEvents_e theSMEvent)
    370 {
    371     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    372     TI_STATUS status;
    373 
    374     switch ( theSMEvent )
    375     {
    376     case POWER_SRV_EVENT_REQUEST_ACTIVE :
    377     case POWER_SRV_EVENT_REQUEST_PS :
    378     case POWER_SRV_EVENT_FAIL :
    379     case POWER_SRV_EVENT_SUCCESS :
    380 
    381         TRACE1(pPowerSrvSM->hReport, REPORT_SEVERITY_INFORMATION, "powerSrvSM_SMApi(%d) called - legal input parameter.\n",theSMEvent);
    382         break;
    383 
    384     default:
    385         TRACE1(pPowerSrvSM->hReport, REPORT_SEVERITY_WARNING, "powerSrvSM_SMApi(%d) called,                            input parameter is illegal.",theSMEvent);
    386         return TI_NOK;
    387     }
    388 
    389 
    390     status = powerSrvSmSMEvent((TI_UINT8*)&pPowerSrvSM->currentState,
    391                                (TI_UINT8)theSMEvent,
    392                                hPowerSrvSM);
    393 
    394     return status;
    395 }
    396 
    397 
    398 /****************************************************************************************
    399  *                        powerSrvSm_setSmRequest                                                    *
    400  *****************************************************************************************
    401 DESCRIPTION: This function sets the current SM working request.
    402 
    403 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    404             -powerSrvRequest_t*                 - pointer to the correct request in the Power server.
    405 
    406 OUTPUT:
    407 RETURN:    TI_STATUS -  TI_OK
    408 ****************************************************************************************/
    409 TI_STATUS powerSrvSm_setSmRequest(TI_HANDLE hPowerSrvSM,powerSrvRequest_t* pSmRequest)
    410 {
    411     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    412     pPowerSrvSM->pSmRequest = pSmRequest;
    413     return TI_OK;
    414 }
    415 
    416 
    417 /****************************************************************************************
    418  *                        powerSrvSM_getCurrentState                                                         *
    419  *****************************************************************************************
    420 DESCRIPTION: This function returns the current state of the SM.
    421 
    422 
    423 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    424 
    425 
    426 OUTPUT:
    427 RETURN:    PowerSrvSMStates_e current state
    428 ****************************************************************************************/
    429 PowerSrvSMStates_e powerSrvSM_getCurrentState(TI_HANDLE hPowerSrvSM)
    430 {
    431     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    432 
    433     return pPowerSrvSM->currentState;
    434 }
    435 
    436 /****************************************************************************************
    437  *                        powerSrvSM_setRateModulation                                               *
    438  *****************************************************************************************
    439 DESCRIPTION: This function sets the Rate Modulation
    440 
    441 
    442 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    443             - rateModulation                        - desired rate
    444 
    445 OUTPUT:
    446 RETURN:      void
    447 ****************************************************************************************/
    448 
    449 void powerSrvSM_setRateModulation(TI_HANDLE hPowerSrvSM, TI_UINT16 rateModulation)
    450 {
    451     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    452     pPowerSrvSM->NullPktRateModulation= rateModulation;
    453 }
    454 
    455 /****************************************************************************************
    456  *                        powerSrvSM_getRateModulation                                               *
    457  *****************************************************************************************
    458 DESCRIPTION: This function sets the Rate Modulation
    459 
    460 
    461 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    462 
    463 OUTPUT:
    464 RETURN:      -  desired rate
    465 ****************************************************************************************/
    466 
    467 TI_UINT32 powerSrvSM_getRateModulation(TI_HANDLE hPowerSrvSM)
    468 {
    469     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    470     return pPowerSrvSM->NullPktRateModulation;
    471 }
    472 
    473 /****************************************************************************************
    474  *                        powerSrvSM_printObject                                                         *
    475  *****************************************************************************************
    476 DESCRIPTION: This function prints the SM object
    477 
    478 
    479 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    480 
    481 
    482 OUTPUT:
    483 RETURN:   void
    484 ****************************************************************************************/
    485 void powerSrvSM_printObject(TI_HANDLE hPowerSrvSM)
    486 {
    487     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    488     char *pString;
    489 
    490     WLAN_OS_REPORT(("\n+++++ powerSrvSM_printObject +++++\n"));
    491     WLAN_OS_REPORT(("Handle to the CmdBld is 0x%08X\n", pPowerSrvSM->hCmdBld));
    492     WLAN_OS_REPORT(("Handle to the OS is 0x%08X\n", pPowerSrvSM->hOS));
    493     WLAN_OS_REPORT(("Handle to the Report is 0x%08X\n", pPowerSrvSM->hReport));
    494     WLAN_OS_REPORT(("Handle to the FSM is 0x%08X\n", pPowerSrvSM->hFSM));
    495 
    496     switch ( pPowerSrvSM->currentState )
    497     {
    498     case POWER_SRV_STATE_ACTIVE:
    499         pString = "POWER_SRV_STATE_ACTIVE";
    500         break;
    501 
    502     case POWER_SRV_STATE_PEND_PS:
    503         pString = "POWER_SRV_STATE_PEND_PS";
    504         break;
    505 
    506     case POWER_SRV_STATE_PS:
    507         pString = "POWER_SRV_STATE_PS";
    508         break;
    509 
    510     case POWER_SRV_STATE_PEND_ACTIVE:
    511         pString = "POWER_SRV_STATE_PEND_ACTIVE";
    512         break;
    513 
    514     case POWER_SRV_STATE_ERROR_ACTIVE:
    515         pString = "POWER_SRV_STATE_ERROR_ACTIVE";
    516         break;
    517 
    518 
    519     default:
    520         pString = "UNKWON PARAMETER";
    521         break;
    522     }
    523     WLAN_OS_REPORT(("The current state of the state machine is %s (=%d)\n",
    524                     pString,
    525                     pPowerSrvSM->currentState));
    526 
    527 }
    528 
    529 
    530 
    531 
    532 /*****************************************************************************
    533  **         Private Function prototypes                                                             **
    534  *****************************************************************************/
    535 
    536 
    537 
    538 
    539 
    540 
    541 /****************************************************************************************
    542  *                        powerSrvSmDoEnterPowerSave                                                 *
    543  *****************************************************************************************
    544 DESCRIPTION: This function is an action of the state machine to move from active state to PS
    545 
    546 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    547 
    548 OUTPUT:
    549 RETURN:    TI_STATUS - TI_OK / TI_NOK
    550 ****************************************************************************************/
    551 
    552 static TI_STATUS powerSrvSmDoEnterPowerSave(TI_HANDLE hPowerSrvSM)
    553 {
    554     TI_STATUS status;
    555     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    556     pPowerSrvSM->pSmRequest->requestState = RUNNING_REQUEST;
    557     status = powerSrvSMSendMBXConfiguration(hPowerSrvSM, TI_TRUE);
    558     return status;
    559 }
    560 
    561 
    562 /****************************************************************************************
    563  *                        powerSrvSmDoExitPowerSave                                              *
    564  *****************************************************************************************
    565 DESCRIPTION: This function is an action of the state machine to move from PS state to Active
    566 
    567 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    568 
    569 OUTPUT:
    570 RETURN:    TI_STATUS - TI_OK / TI_NOK
    571 ****************************************************************************************/
    572 static TI_STATUS powerSrvSmDoExitPowerSave(TI_HANDLE hPowerSrvSM)
    573 {
    574     TI_STATUS status;
    575     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    576     pPowerSrvSM->pSmRequest->requestState = RUNNING_REQUEST;
    577     status = powerSrvSMSendMBXConfiguration(hPowerSrvSM, TI_FALSE);
    578     return status;
    579 }
    580 
    581 
    582 /****************************************************************************************
    583  *                        powerSrvSmDoUpdateRequest                                                  *
    584  *****************************************************************************************
    585 DESCRIPTION: This function is an action of the state machine to update a request when the SM
    586               is already in the requested state is already
    587 
    588 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    589 
    590 OUTPUT:
    591 RETURN:    TI_STATUS - TI_OK / TI_NOK
    592 ****************************************************************************************/
    593 
    594 static TI_STATUS powerSrvSmDoUpdateRequest(TI_HANDLE hPowerSrvSM)
    595 {
    596     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    597 
    598     /* request has completed - stop the guard timer */
    599     tmr_StopTimer (pPowerSrvSM->hPwrSrvSmTimer);
    600 
    601     /*powerSrv_SetRequestState  will update the correct request (acording to the current active request)*/
    602     if ( pPowerSrvSM->pSmRequest->requestState == RUNNING_REQUEST )
    603     {
    604         pPowerSrvSM->pSmRequest->requestState = HANDLED_REQUEST;
    605     }
    606 
    607     return TI_OK;
    608 }
    609 
    610 
    611 /****************************************************************************************
    612  *                        powerSrvSmDoPending                                                        *
    613  *****************************************************************************************
    614 DESCRIPTION: This function is an action of the state machine returns Pending in case that there is a request
    615               waiting to be finished (already sent to FW)
    616 
    617 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    618 
    619 OUTPUT:
    620 RETURN:    TI_STATUS - PENDING
    621 ****************************************************************************************/
    622 
    623 static TI_STATUS powerSrvSmDoPending(TI_HANDLE hPowerSrvSM)
    624 {
    625     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    626 
    627     /*powerSrv_SetRequestState will check the mode and will update the correct request (Driver of user)*/
    628     pPowerSrvSM->pSmRequest->requestState = PENDING_REQUEST;
    629     return POWER_SAVE_802_11_PENDING;
    630 }
    631 
    632 
    633 
    634 /****************************************************************************************
    635  *                        powerSrvSmDoAllready                                                       *
    636  *****************************************************************************************
    637 DESCRIPTION: This function is an action of the state machine stays in the same state since it the requested
    638               one in the request
    639 
    640 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    641 
    642 OUTPUT:
    643 RETURN:    TI_STATUS - TI_OK
    644 ****************************************************************************************/
    645 static TI_STATUS powerSrvSmDoAllready(TI_HANDLE hPowerSrvSM)
    646 {
    647     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    648 
    649     /*powerSrv_SetRequestState will check the mode and will update the correct request (Driver of user)*/
    650     pPowerSrvSM->pSmRequest->requestState = HANDLED_REQUEST;
    651     return POWER_SAVE_802_11_IS_CURRENT;
    652 }
    653 
    654 
    655 /****************************************************************************************
    656  *                        powerSrvSMActionUnexpected                                                 *
    657  *****************************************************************************************
    658 DESCRIPTION: This function is an action of the state machine stays in the same state and return that action
    659               was not expected
    660 
    661 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    662 
    663 OUTPUT:
    664 RETURN:    TI_STATUS - TI_OK
    665 ****************************************************************************************/
    666 static TI_STATUS powerSrvSMActionUnexpected(TI_HANDLE hPowerSrvSM)
    667 {
    668 #ifdef TI_DBG
    669     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    670 
    671     TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "called: powerSrvSMActionUnexpected");
    672 #endif /* TI_DBG */
    673 
    674     return TI_OK;
    675 }
    676 
    677 
    678 /****************************************************************************************
    679  *                        powerSrvSmSMEvent                                                      *
    680  *****************************************************************************************
    681 DESCRIPTION: This function is the manager of the state macine. its move the state machine
    682               from one state to the other depend on the receive event, and call to the appropriate
    683               action (function) for the move between the states.
    684 
    685 INPUT:      - pCurrentState
    686             - event
    687             - hPowerSrvSM                       - handle to the PowerSrvSM object.
    688 
    689 OUTPUT:
    690 RETURN:    TI_STATUS
    691 ****************************************************************************************/
    692 static TI_STATUS powerSrvSmSMEvent(TI_UINT8* pCurrentState,
    693                                    TI_UINT8 event,
    694                                    TI_HANDLE hPowerSrvSM)
    695 {
    696     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    697     TI_STATUS status = TI_OK;
    698     TI_UINT8 nextState;
    699 
    700     status = fsm_GetNextState((fsm_stateMachine_t*)pPowerSrvSM->hFSM,
    701                               (TI_UINT8)pPowerSrvSM->currentState,
    702                               event,
    703                               &nextState);
    704     if ( status != TI_OK )
    705     {
    706         TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_SM, "PowerSrvSM - State machine error, failed getting next state\n");
    707         return(status);
    708     }
    709 
    710 
    711 	TRACE3( pPowerSrvSM->hReport, REPORT_SEVERITY_INFORMATION, "powerSrvSmSMEvent: <currentState = %d, event = %d> --> nextState = %d\n", *pCurrentState, event, nextState);
    712 
    713     status = fsm_Event(pPowerSrvSM->hFSM,
    714                        pCurrentState,
    715                        event,
    716                        (void*)pPowerSrvSM);
    717 
    718     return status;
    719 }
    720 
    721 
    722 /****************************************************************************************
    723 *                        powerSrvSMSendMBXConfiguration                                             *
    724 *****************************************************************************************
    725 DESCRIPTION: This function send configuration of the power save option that holds in the command
    726                 mailbox inner sturcture.
    727 
    728 INPUT:      - hPowerSrvSM                       - handle to the PowerSrvSM object.
    729            - PS_disableEnable                      - true = PS , false = active
    730 
    731 OUTPUT:
    732 RETURN:    TI_STATUS
    733 ****************************************************************************************/
    734 static TI_STATUS    powerSrvSMSendMBXConfiguration(TI_HANDLE hPowerSrvSM, TI_BOOL PS_disableEnable)
    735 {
    736     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    737     TPowerSaveParams powerSaveParams;
    738     TI_STATUS status;
    739 
    740     /*setting the params for the Hal*/
    741     powerSaveParams.hangOverPeriod          = pPowerSrvSM->hangOverPeriod;
    742     powerSaveParams.numNullPktRetries       = pPowerSrvSM->numNullPktRetries;
    743     powerSaveParams.NullPktRateModulation   = pPowerSrvSM->NullPktRateModulation;
    744     powerSaveParams.needToSendNullData      = pPowerSrvSM->pSmRequest->sendNullDataOnExit;
    745     powerSaveParams.ps802_11Enable          = PS_disableEnable;
    746 
    747     /* start the FW guard timer, which is used to protect from FW stuck */
    748     tmr_StartTimer (pPowerSrvSM->hPwrSrvSmTimer,
    749                     powerSrvSMTimerExpired,
    750                     (TI_HANDLE)pPowerSrvSM,
    751                     POWER_SAVE_GUARD_TIME_MS,
    752                     TI_FALSE);
    753 
    754     /* that command should be sent to FW just in case we moved from Active to one of the PS modes
    755      * and vice versa, it shoul not be sent when moving between different PS modes */
    756     status = cmdBld_CmdSetPsMode (pPowerSrvSM->hCmdBld,
    757                                   &powerSaveParams,
    758                                   (void *)pPowerSrvSM->pSmRequest->powerSaveCmdResponseCB,
    759                                   (pPowerSrvSM->pSmRequest->powerSaveCmdResponseCB == NULL) ? NULL : pPowerSrvSM->pSmRequest->powerSaveCBObject);
    760 
    761     if ( status != TI_OK )
    762     {
    763         TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "Error in configuring Power Manager paramters!\n");
    764     }
    765 
    766     return status;
    767 }
    768 
    769 /****************************************************************************************
    770 *                               powerSrvSMTimerExpired                                  *
    771 *****************************************************************************************
    772 DESCRIPTION: This function is called upon timer expiry - when the FW has not returned
    773              a response within the defined tme (50 ms)
    774 
    775 INPUT:      hPowerSrvSM     - handle to the PowerSrvSM object.
    776             bTwdInitOccured - Indicates if TWDriver recovery occured since timer started
    777 
    778 OUTPUT:    None
    779 
    780 RETURN:    None
    781 ****************************************************************************************/
    782 static void powerSrvSMTimerExpired (TI_HANDLE hPowerSrvSM, TI_BOOL bTwdInitOccured)
    783 {
    784     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    785 
    786     /* Print an error message */
    787     TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "PS guard timer expired!\n");
    788 
    789     /* Call the error notification callback (triggering recovery) */
    790     pPowerSrvSM->failureEventCB( pPowerSrvSM->hFailureEventObj ,POWER_SAVE_FAILURE );
    791 }
    792 
    793 /****************************************************************************************
    794  *                        powerSrvRegisterFailureEventCB                                                    *
    795  ****************************************************************************************
    796 DESCRIPTION: Registers a failure event callback for PS SM error notifications.
    797 
    798 
    799 INPUT:      - hPowerSrv         - handle to the PowerSrv object.
    800             - failureEventCB    - the failure event callback function.\n
    801             - hFailureEventObj - handle to the object passed to the failure event callback function.
    802 
    803 OUTPUT:
    804 RETURN:    void.
    805 ****************************************************************************************/
    806 void powerSrvSM_RegisterFailureEventCB( TI_HANDLE hPowerSrvSM,
    807                                         void *failureEventCB, TI_HANDLE hFailureEventObj )
    808 {
    809     PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM;
    810 
    811     pPowerSrvSM->failureEventCB = (TFailureEventCb)failureEventCB;
    812     pPowerSrvSM->hFailureEventObj = hFailureEventObj;
    813 }
    814 
    815