summaryrefslogtreecommitdiff
path: root/wilink_6_1/TWD/MacServices/PowerSrvSM.c
diff options
context:
space:
mode:
Diffstat (limited to 'wilink_6_1/TWD/MacServices/PowerSrvSM.c')
-rw-r--r--wilink_6_1/TWD/MacServices/PowerSrvSM.c814
1 files changed, 814 insertions, 0 deletions
diff --git a/wilink_6_1/TWD/MacServices/PowerSrvSM.c b/wilink_6_1/TWD/MacServices/PowerSrvSM.c
new file mode 100644
index 0000000..173a080
--- /dev/null
+++ b/wilink_6_1/TWD/MacServices/PowerSrvSM.c
@@ -0,0 +1,814 @@
+/*
+ * 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;
+}
+