| /* |
| * PowerSrvSM.c |
| * |
| * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * * Neither the name Texas Instruments nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /** \file PowerSrvSM.c |
| * \brief This is the PowerSrvSM module implementation. |
| * \author Assaf Azulay |
| * \date 19-OCT-2005 |
| */ |
| |
| /**************************************************************************** |
| * * |
| * MODULE: PowerSrvSM * |
| * PURPOSE: PowerSrvSM Module implementation. * |
| * * |
| ****************************************************************************/ |
| |
| #define __FILE_ID__ FILE_ID_114 |
| #include "tidef.h" |
| #include "osApi.h" |
| #include "timer.h" |
| #include "fsm.h" |
| #include "report.h" |
| #include "TWDriver.h" |
| #include "PowerSrvSM.h" |
| #include "CmdBld.h" |
| |
| |
| /***************************************************************************** |
| ** Defines ** |
| *****************************************************************************/ |
| |
| |
| /***************************************************************************** |
| ** structs ** |
| *****************************************************************************/ |
| |
| |
| /***************************************************************************** |
| ** Private Function prototypes ** |
| *****************************************************************************/ |
| |
| static TI_STATUS powerSrvSmSMEvent(TI_UINT8* pCurrentState, |
| TI_UINT8 event, |
| TI_HANDLE hPowerSrvSM); |
| static TI_STATUS powerSrvSmDoUpdateRequest(TI_HANDLE hPowerSrvSM); |
| static TI_STATUS powerSrvSmDoEnterPowerSave(TI_HANDLE hPowerSrvSM); |
| static TI_STATUS powerSrvSmDoExitPowerSave(TI_HANDLE hPowerSrvSM); |
| static TI_STATUS powerSrvSmDoPending(TI_HANDLE hPowerSrvSM); |
| static TI_STATUS powerSrvSmDoAllready(TI_HANDLE hPowerSrvSM); |
| static TI_STATUS powerSrvSMActionUnexpected(TI_HANDLE hPowerSrvSM); |
| static TI_STATUS powerSrvSMSendMBXConfiguration(TI_HANDLE hPowerSrvSM, TI_BOOL PS_disableEnable); |
| static void powerSrvSMTimerExpired (TI_HANDLE hPowerSrvSM, TI_BOOL bTwdInitOccured); |
| |
| /*************************************************************************************** |
| ** Public Function prototypes ** |
| ****************************************************************************************/ |
| |
| |
| /**************************************************************************************** |
| * powerSrvSM_create * |
| **************************************************************************************** |
| DESCRIPTION: Power Server SM module creation function, called by the Power Server create in creation phase |
| performs the following: |
| - Allocate the Power Server SM handle |
| - Creates the fsm. |
| |
| INPUT: - hOs - Handle to OS |
| |
| |
| OUTPUT: |
| |
| RETURN: Handle to the Power Server SM module on success, NULL otherwise |
| ****************************************************************************************/ |
| TI_HANDLE powerSrvSM_create(TI_HANDLE hOsHandle) |
| { |
| PowerSrvSM_t *pPowerSrvSM = NULL; |
| fsm_stateMachine_t *pFsm = NULL; |
| TI_STATUS status; |
| |
| pPowerSrvSM = (PowerSrvSM_t*) os_memoryAlloc (hOsHandle, sizeof(PowerSrvSM_t)); |
| if ( pPowerSrvSM == NULL ) |
| { |
| WLAN_OS_REPORT(("%s(%d) - Memory Allocation Error!\n",__FUNCTION__,__LINE__)); |
| return NULL; |
| } |
| |
| os_memoryZero (hOsHandle, pPowerSrvSM, sizeof(PowerSrvSM_t)); |
| |
| pPowerSrvSM->hOS = hOsHandle; |
| |
| /* create the generic state-machine */ |
| status = fsm_Create(hOsHandle, |
| &pFsm, |
| (TI_UINT8)POWER_SRV_SM_STATE_NUM, |
| (TI_UINT8)POWER_SRV_SM_EVENT_NUM); |
| if ( status != TI_OK ) |
| { |
| WLAN_OS_REPORT(("%s(%d) - Error in create FSM!\n",__FUNCTION__,__LINE__)); |
| powerSrvSM_destroy(pPowerSrvSM); |
| return NULL; |
| } |
| |
| pPowerSrvSM->hFSM = (TI_HANDLE)pFsm; |
| |
| return pPowerSrvSM; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSM_destroy * |
| **************************************************************************************** |
| DESCRIPTION: Power Server SM module destroy function, |
| - delete Power Server SM allocation |
| |
| |
| INPUT: - hPowerSrvSM - Handle to the Power Server SM |
| |
| |
| OUTPUT: |
| |
| RETURN: TI_STATUS - TI_OK on success else TI_NOK. |
| ****************************************************************************************/ |
| TI_STATUS powerSrvSM_destroy(TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| TI_HANDLE osHandle = pPowerSrvSM->hOS; |
| |
| /* free the timer */ |
| if (pPowerSrvSM->hPwrSrvSmTimer) |
| { |
| tmr_DestroyTimer (pPowerSrvSM->hPwrSrvSmTimer); |
| } |
| |
| /* free the generic SM */ |
| if ( pPowerSrvSM->hFSM != NULL ) |
| { |
| fsm_Unload(osHandle, (fsm_stateMachine_t*)pPowerSrvSM->hFSM); |
| } |
| |
| /* free the Power Save SRV object */ |
| os_memoryFree(osHandle , pPowerSrvSM , sizeof(PowerSrvSM_t)); |
| |
| return TI_OK; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSM_init * |
| **************************************************************************************** |
| DESCRIPTION: Power Server SM module initialize function, called by the Power Server init in configure phase |
| performs the following: |
| - init the Stet machine states. |
| - set Active as start state. |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| - hReport - handle to the Report object. |
| - hCmdBld - handle to the Command Builder object. |
| - hTimer - handle to the Timer module object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK on success else TI_NOK. |
| ****************************************************************************************/ |
| TI_STATUS powerSrvSM_init (TI_HANDLE hPowerSrvSM, |
| TI_HANDLE hReport, |
| TI_HANDLE hCmdBld, |
| TI_HANDLE hTimer) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| fsm_actionCell_t smMatrix[POWER_SRV_SM_STATE_NUM][POWER_SRV_SM_EVENT_NUM] = |
| { |
| /* |
| next state and transition action for POWER_SRV_STATE_ACTIVE state |
| */ |
| { |
| /* POWER_SRV_EVENT_REQUEST_ACTIVE */ |
| {POWER_SRV_STATE_ACTIVE , powerSrvSmDoAllready}, |
| |
| /* POWER_SRV_EVENT_REQUEST_PS */ |
| {POWER_SRV_STATE_PEND_PS , powerSrvSmDoEnterPowerSave}, |
| |
| /* POWER_SRV_EVENT_SUCCESS */ |
| {POWER_SRV_STATE_ACTIVE , powerSrvSMActionUnexpected}, |
| |
| /* POWER_SRV_EVENT_FAIL */ |
| {POWER_SRV_STATE_ACTIVE , powerSrvSMActionUnexpected} |
| |
| }, |
| |
| /* |
| next state and transition action for POWER_SRV_STATE_PEND_PS state |
| */ |
| { |
| /* POWER_SRV_EVENT_REQUEST_ACTIVE */ |
| {POWER_SRV_STATE_PEND_PS , powerSrvSmDoPending}, |
| |
| /* POWER_SRV_EVENT_REQUEST_PS */ |
| {POWER_SRV_STATE_PEND_PS , powerSrvSmDoPending}, |
| |
| /* POWER_SRV_EVENT_SUCCESS */ |
| {POWER_SRV_STATE_PS , powerSrvSmDoUpdateRequest}, |
| |
| /* POWER_SRV_EVENT_FAIL */ |
| {POWER_SRV_STATE_ACTIVE , powerSrvSmDoUpdateRequest} |
| |
| }, |
| /* |
| next state and transition action for POWER_SRV_STATE_PS state |
| */ |
| { |
| /* POWER_SRV_EVENT_REQUEST_ACTIVE */ |
| {POWER_SRV_STATE_PEND_ACTIVE , powerSrvSmDoExitPowerSave}, |
| |
| /* POWER_SRV_EVENT_REQUEST_PS */ |
| {POWER_SRV_STATE_PS , powerSrvSmDoAllready}, |
| |
| /* POWER_SRV_EVENT_SUCCESS */ |
| {POWER_SRV_STATE_PS , powerSrvSMActionUnexpected}, |
| |
| /* POWER_SRV_EVENT_FAIL */ |
| {POWER_SRV_STATE_PS , powerSrvSMActionUnexpected} |
| |
| }, |
| /* |
| next state and transition action for POWER_SRV_STATE_PEND_ACTIVE state |
| */ |
| { |
| /* POWER_SRV_EVENT_REQUEST_ACTIVE */ |
| {POWER_SRV_STATE_PEND_ACTIVE , powerSrvSmDoPending}, |
| |
| /* POWER_SRV_EVENT_REQUEST_PS */ |
| {POWER_SRV_STATE_PEND_ACTIVE , powerSrvSmDoPending}, |
| |
| /* POWER_SRV_EVENT_SUCCESS */ |
| {POWER_SRV_STATE_ACTIVE , powerSrvSmDoUpdateRequest}, |
| |
| /* POWER_SRV_EVENT_FAIL */ |
| {POWER_SRV_STATE_ERROR_ACTIVE , powerSrvSmDoUpdateRequest} |
| |
| }, |
| /* |
| next state and transition action for POWER_SRV_STATE_ERROR_ACTIVE state |
| */ |
| { |
| /* POWER_SRV_EVENT_REQUEST_ACTIVE */ |
| {POWER_SRV_STATE_PEND_ACTIVE , powerSrvSmDoExitPowerSave}, |
| |
| /* POWER_SRV_EVENT_REQUEST_PS */ |
| {POWER_SRV_STATE_PEND_PS , powerSrvSmDoEnterPowerSave}, |
| |
| /* POWER_SRV_EVENT_SUCCESS */ |
| {POWER_SRV_STATE_ERROR_ACTIVE , powerSrvSMActionUnexpected}, |
| |
| /* POWER_SRV_EVENT_FAIL */ |
| {POWER_SRV_STATE_ERROR_ACTIVE , powerSrvSMActionUnexpected} |
| |
| }, |
| |
| }; |
| |
| pPowerSrvSM->hReport = hReport; |
| pPowerSrvSM->hCmdBld = hCmdBld; |
| pPowerSrvSM->hTimer = hTimer; |
| |
| /* create the timer */ |
| pPowerSrvSM->hPwrSrvSmTimer = tmr_CreateTimer (pPowerSrvSM->hTimer); |
| if (pPowerSrvSM->hPwrSrvSmTimer == NULL) |
| { |
| TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "powerSrvSM_init(): Failed to create hPwrSrvSmTimer!\n"); |
| return TI_NOK; |
| } |
| |
| fsm_Config(pPowerSrvSM->hFSM, |
| (fsm_Matrix_t)smMatrix, |
| POWER_SRV_SM_STATE_NUM, |
| POWER_SRV_SM_EVENT_NUM, |
| powerSrvSmSMEvent, |
| pPowerSrvSM->hOS); |
| |
| /* |
| the PowerSrvSM start in active mode (POWER_SRV_STATE_ACTIVE) |
| the PowerSrvSM::currentState must be sync with the PowerSrv::desiredPowerModeProfile (POWER_MODE_ACTIVE). |
| */ |
| pPowerSrvSM->currentState = POWER_SRV_STATE_ACTIVE; |
| |
| |
| /* |
| Null packet rate : 2,5.5 M |
| Probe Request : Not PBCC modulation, Long Preamble */ |
| pPowerSrvSM->NullPktRateModulation= (DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER); |
| |
| TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_INIT, "PowerSrvSM Initialized\n"); |
| |
| return TI_OK; |
| } |
| |
| /**************************************************************************************** |
| * powerSrvSM_config * |
| **************************************************************************************** |
| DESCRIPTION: Power Server SM module configuration function, called by the Power Server init in configure phase |
| performs the following: |
| - init the Stet machine states. |
| - set Active as start state. |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| - pPowerSrvInitParams - the Power Server initialize parameters. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK on success else TI_NOK. |
| ****************************************************************************************/ |
| TI_STATUS powerSrvSM_config(TI_HANDLE hPowerSrvSM, |
| TPowerSrvInitParams *pPowerSrvInitParams) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| /* |
| init PowerMgmtConfigration |
| */ |
| pPowerSrvSM->hangOverPeriod = pPowerSrvInitParams->hangOverPeriod; |
| pPowerSrvSM->numNullPktRetries = pPowerSrvInitParams->numNullPktRetries; |
| |
| return TI_OK; |
| } |
| /**************************************************************************************** |
| * powerSrvSM_SMApi * |
| ***************************************************************************************** |
| DESCRIPTION: This function triggers events from the outside of the module into the state machine. |
| |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| - theSMEvent - event from TWD. |
| |
| |
| OUTPUT: |
| RETURN: TI_STATUS TI_OK / PENDING / TI_NOK |
| ****************************************************************************************/ |
| TI_STATUS powerSrvSM_SMApi(TI_HANDLE hPowerSrvSM, |
| PowerSrvSMEvents_e theSMEvent) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| TI_STATUS status; |
| |
| switch ( theSMEvent ) |
| { |
| case POWER_SRV_EVENT_REQUEST_ACTIVE : |
| case POWER_SRV_EVENT_REQUEST_PS : |
| case POWER_SRV_EVENT_FAIL : |
| case POWER_SRV_EVENT_SUCCESS : |
| |
| TRACE1(pPowerSrvSM->hReport, REPORT_SEVERITY_INFORMATION, "powerSrvSM_SMApi(%d) called - legal input parameter.\n",theSMEvent); |
| break; |
| |
| default: |
| TRACE1(pPowerSrvSM->hReport, REPORT_SEVERITY_WARNING, "powerSrvSM_SMApi(%d) called, input parameter is illegal.",theSMEvent); |
| return TI_NOK; |
| } |
| |
| |
| status = powerSrvSmSMEvent((TI_UINT8*)&pPowerSrvSM->currentState, |
| (TI_UINT8)theSMEvent, |
| hPowerSrvSM); |
| |
| return status; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSm_setSmRequest * |
| ***************************************************************************************** |
| DESCRIPTION: This function sets the current SM working request. |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| -powerSrvRequest_t* - pointer to the correct request in the Power server. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK |
| ****************************************************************************************/ |
| TI_STATUS powerSrvSm_setSmRequest(TI_HANDLE hPowerSrvSM,powerSrvRequest_t* pSmRequest) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| pPowerSrvSM->pSmRequest = pSmRequest; |
| return TI_OK; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSM_getCurrentState * |
| ***************************************************************************************** |
| DESCRIPTION: This function returns the current state of the SM. |
| |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| |
| OUTPUT: |
| RETURN: PowerSrvSMStates_e current state |
| ****************************************************************************************/ |
| PowerSrvSMStates_e powerSrvSM_getCurrentState(TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| return pPowerSrvSM->currentState; |
| } |
| |
| /**************************************************************************************** |
| * powerSrvSM_setRateModulation * |
| ***************************************************************************************** |
| DESCRIPTION: This function sets the Rate Modulation |
| |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| - rateModulation - desired rate |
| |
| OUTPUT: |
| RETURN: void |
| ****************************************************************************************/ |
| |
| void powerSrvSM_setRateModulation(TI_HANDLE hPowerSrvSM, TI_UINT16 rateModulation) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| pPowerSrvSM->NullPktRateModulation= rateModulation; |
| } |
| |
| /**************************************************************************************** |
| * powerSrvSM_getRateModulation * |
| ***************************************************************************************** |
| DESCRIPTION: This function sets the Rate Modulation |
| |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: - desired rate |
| ****************************************************************************************/ |
| |
| TI_UINT32 powerSrvSM_getRateModulation(TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| return pPowerSrvSM->NullPktRateModulation; |
| } |
| |
| /**************************************************************************************** |
| * powerSrvSM_printObject * |
| ***************************************************************************************** |
| DESCRIPTION: This function prints the SM object |
| |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| |
| OUTPUT: |
| RETURN: void |
| ****************************************************************************************/ |
| void powerSrvSM_printObject(TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| char *pString; |
| |
| WLAN_OS_REPORT(("\n+++++ powerSrvSM_printObject +++++\n")); |
| WLAN_OS_REPORT(("Handle to the CmdBld is 0x%08X\n", pPowerSrvSM->hCmdBld)); |
| WLAN_OS_REPORT(("Handle to the OS is 0x%08X\n", pPowerSrvSM->hOS)); |
| WLAN_OS_REPORT(("Handle to the Report is 0x%08X\n", pPowerSrvSM->hReport)); |
| WLAN_OS_REPORT(("Handle to the FSM is 0x%08X\n", pPowerSrvSM->hFSM)); |
| |
| switch ( pPowerSrvSM->currentState ) |
| { |
| case POWER_SRV_STATE_ACTIVE: |
| pString = "POWER_SRV_STATE_ACTIVE"; |
| break; |
| |
| case POWER_SRV_STATE_PEND_PS: |
| pString = "POWER_SRV_STATE_PEND_PS"; |
| break; |
| |
| case POWER_SRV_STATE_PS: |
| pString = "POWER_SRV_STATE_PS"; |
| break; |
| |
| case POWER_SRV_STATE_PEND_ACTIVE: |
| pString = "POWER_SRV_STATE_PEND_ACTIVE"; |
| break; |
| |
| case POWER_SRV_STATE_ERROR_ACTIVE: |
| pString = "POWER_SRV_STATE_ERROR_ACTIVE"; |
| break; |
| |
| |
| default: |
| pString = "UNKWON PARAMETER"; |
| break; |
| } |
| WLAN_OS_REPORT(("The current state of the state machine is %s (=%d)\n", |
| pString, |
| pPowerSrvSM->currentState)); |
| |
| } |
| |
| |
| |
| |
| /***************************************************************************** |
| ** Private Function prototypes ** |
| *****************************************************************************/ |
| |
| |
| |
| |
| |
| |
| /**************************************************************************************** |
| * powerSrvSmDoEnterPowerSave * |
| ***************************************************************************************** |
| DESCRIPTION: This function is an action of the state machine to move from active state to PS |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK / TI_NOK |
| ****************************************************************************************/ |
| |
| static TI_STATUS powerSrvSmDoEnterPowerSave(TI_HANDLE hPowerSrvSM) |
| { |
| TI_STATUS status; |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| pPowerSrvSM->pSmRequest->requestState = RUNNING_REQUEST; |
| status = powerSrvSMSendMBXConfiguration(hPowerSrvSM, TI_TRUE); |
| return status; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSmDoExitPowerSave * |
| ***************************************************************************************** |
| DESCRIPTION: This function is an action of the state machine to move from PS state to Active |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK / TI_NOK |
| ****************************************************************************************/ |
| static TI_STATUS powerSrvSmDoExitPowerSave(TI_HANDLE hPowerSrvSM) |
| { |
| TI_STATUS status; |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| pPowerSrvSM->pSmRequest->requestState = RUNNING_REQUEST; |
| status = powerSrvSMSendMBXConfiguration(hPowerSrvSM, TI_FALSE); |
| return status; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSmDoUpdateRequest * |
| ***************************************************************************************** |
| DESCRIPTION: This function is an action of the state machine to update a request when the SM |
| is already in the requested state is already |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK / TI_NOK |
| ****************************************************************************************/ |
| |
| static TI_STATUS powerSrvSmDoUpdateRequest(TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| /* request has completed - stop the guard timer */ |
| tmr_StopTimer (pPowerSrvSM->hPwrSrvSmTimer); |
| |
| /*powerSrv_SetRequestState will update the correct request (acording to the current active request)*/ |
| if ( pPowerSrvSM->pSmRequest->requestState == RUNNING_REQUEST ) |
| { |
| pPowerSrvSM->pSmRequest->requestState = HANDLED_REQUEST; |
| } |
| |
| return TI_OK; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSmDoPending * |
| ***************************************************************************************** |
| DESCRIPTION: This function is an action of the state machine returns Pending in case that there is a request |
| waiting to be finished (already sent to FW) |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - PENDING |
| ****************************************************************************************/ |
| |
| static TI_STATUS powerSrvSmDoPending(TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| /*powerSrv_SetRequestState will check the mode and will update the correct request (Driver of user)*/ |
| pPowerSrvSM->pSmRequest->requestState = PENDING_REQUEST; |
| return POWER_SAVE_802_11_PENDING; |
| } |
| |
| |
| |
| /**************************************************************************************** |
| * powerSrvSmDoAllready * |
| ***************************************************************************************** |
| DESCRIPTION: This function is an action of the state machine stays in the same state since it the requested |
| one in the request |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK |
| ****************************************************************************************/ |
| static TI_STATUS powerSrvSmDoAllready(TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| /*powerSrv_SetRequestState will check the mode and will update the correct request (Driver of user)*/ |
| pPowerSrvSM->pSmRequest->requestState = HANDLED_REQUEST; |
| return POWER_SAVE_802_11_IS_CURRENT; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSMActionUnexpected * |
| ***************************************************************************************** |
| DESCRIPTION: This function is an action of the state machine stays in the same state and return that action |
| was not expected |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS - TI_OK |
| ****************************************************************************************/ |
| static TI_STATUS powerSrvSMActionUnexpected(TI_HANDLE hPowerSrvSM) |
| { |
| #ifdef TI_DBG |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "called: powerSrvSMActionUnexpected"); |
| #endif /* TI_DBG */ |
| |
| return TI_OK; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSmSMEvent * |
| ***************************************************************************************** |
| DESCRIPTION: This function is the manager of the state macine. its move the state machine |
| from one state to the other depend on the receive event, and call to the appropriate |
| action (function) for the move between the states. |
| |
| INPUT: - pCurrentState |
| - event |
| - hPowerSrvSM - handle to the PowerSrvSM object. |
| |
| OUTPUT: |
| RETURN: TI_STATUS |
| ****************************************************************************************/ |
| static TI_STATUS powerSrvSmSMEvent(TI_UINT8* pCurrentState, |
| TI_UINT8 event, |
| TI_HANDLE hPowerSrvSM) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| TI_STATUS status = TI_OK; |
| TI_UINT8 nextState; |
| |
| status = fsm_GetNextState((fsm_stateMachine_t*)pPowerSrvSM->hFSM, |
| (TI_UINT8)pPowerSrvSM->currentState, |
| event, |
| &nextState); |
| if ( status != TI_OK ) |
| { |
| TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_SM, "PowerSrvSM - State machine error, failed getting next state\n"); |
| return(status); |
| } |
| |
| |
| TRACE3( pPowerSrvSM->hReport, REPORT_SEVERITY_INFORMATION, "powerSrvSmSMEvent: <currentState = %d, event = %d> --> nextState = %d\n", *pCurrentState, event, nextState); |
| |
| status = fsm_Event(pPowerSrvSM->hFSM, |
| pCurrentState, |
| event, |
| (void*)pPowerSrvSM); |
| |
| return status; |
| } |
| |
| |
| /**************************************************************************************** |
| * powerSrvSMSendMBXConfiguration * |
| ***************************************************************************************** |
| DESCRIPTION: This function send configuration of the power save option that holds in the command |
| mailbox inner sturcture. |
| |
| INPUT: - hPowerSrvSM - handle to the PowerSrvSM object. |
| - PS_disableEnable - true = PS , false = active |
| |
| OUTPUT: |
| RETURN: TI_STATUS |
| ****************************************************************************************/ |
| static TI_STATUS powerSrvSMSendMBXConfiguration(TI_HANDLE hPowerSrvSM, TI_BOOL PS_disableEnable) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| TPowerSaveParams powerSaveParams; |
| TI_STATUS status; |
| |
| /*setting the params for the Hal*/ |
| powerSaveParams.hangOverPeriod = pPowerSrvSM->hangOverPeriod; |
| powerSaveParams.numNullPktRetries = pPowerSrvSM->numNullPktRetries; |
| powerSaveParams.NullPktRateModulation = pPowerSrvSM->NullPktRateModulation; |
| powerSaveParams.needToSendNullData = pPowerSrvSM->pSmRequest->sendNullDataOnExit; |
| powerSaveParams.ps802_11Enable = PS_disableEnable; |
| |
| /* start the FW guard timer, which is used to protect from FW stuck */ |
| tmr_StartTimer (pPowerSrvSM->hPwrSrvSmTimer, |
| powerSrvSMTimerExpired, |
| (TI_HANDLE)pPowerSrvSM, |
| POWER_SAVE_GUARD_TIME_MS, |
| TI_FALSE); |
| |
| /* that command should be sent to FW just in case we moved from Active to one of the PS modes |
| * and vice versa, it shoul not be sent when moving between different PS modes */ |
| status = cmdBld_CmdSetPsMode (pPowerSrvSM->hCmdBld, |
| &powerSaveParams, |
| (void *)pPowerSrvSM->pSmRequest->powerSaveCmdResponseCB, |
| (pPowerSrvSM->pSmRequest->powerSaveCmdResponseCB == NULL) ? NULL : pPowerSrvSM->pSmRequest->powerSaveCBObject); |
| |
| if ( status != TI_OK ) |
| { |
| TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "Error in configuring Power Manager paramters!\n"); |
| } |
| |
| return status; |
| } |
| |
| /**************************************************************************************** |
| * powerSrvSMTimerExpired * |
| ***************************************************************************************** |
| DESCRIPTION: This function is called upon timer expiry - when the FW has not returned |
| a response within the defined tme (50 ms) |
| |
| INPUT: hPowerSrvSM - handle to the PowerSrvSM object. |
| bTwdInitOccured - Indicates if TWDriver recovery occured since timer started |
| |
| OUTPUT: None |
| |
| RETURN: None |
| ****************************************************************************************/ |
| static void powerSrvSMTimerExpired (TI_HANDLE hPowerSrvSM, TI_BOOL bTwdInitOccured) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| /* Print an error message */ |
| TRACE0(pPowerSrvSM->hReport, REPORT_SEVERITY_ERROR, "PS guard timer expired!\n"); |
| |
| /* Call the error notification callback (triggering recovery) */ |
| pPowerSrvSM->failureEventCB( pPowerSrvSM->hFailureEventObj ,POWER_SAVE_FAILURE ); |
| } |
| |
| /**************************************************************************************** |
| * powerSrvRegisterFailureEventCB * |
| **************************************************************************************** |
| DESCRIPTION: Registers a failure event callback for PS SM error notifications. |
| |
| |
| INPUT: - hPowerSrv - handle to the PowerSrv object. |
| - failureEventCB - the failure event callback function.\n |
| - hFailureEventObj - handle to the object passed to the failure event callback function. |
| |
| OUTPUT: |
| RETURN: void. |
| ****************************************************************************************/ |
| void powerSrvSM_RegisterFailureEventCB( TI_HANDLE hPowerSrvSM, |
| void *failureEventCB, TI_HANDLE hFailureEventObj ) |
| { |
| PowerSrvSM_t *pPowerSrvSM = (PowerSrvSM_t*)hPowerSrvSM; |
| |
| pPowerSrvSM->failureEventCB = (TFailureEventCb)failureEventCB; |
| pPowerSrvSM->hFailureEventObj = hFailureEventObj; |
| } |
| |