2012-06-19 23:15:42 +00:00
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
(c) Cambridge Silicon Radio Limited 2011
|
|
|
|
All rights reserved and confidential information of CSR
|
|
|
|
|
|
|
|
Refer to LICENSE.txt included with this source for details
|
|
|
|
on the license terms.
|
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef CSR_WIFI_FSM_H
|
|
|
|
#define CSR_WIFI_FSM_H
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "csr_prim_defs.h"
|
|
|
|
#include "csr_log_text.h"
|
|
|
|
#include "csr_wifi_fsm_event.h"
|
|
|
|
|
|
|
|
/* including this file for CsrWifiInterfaceMode*/
|
|
|
|
#include "csr_wifi_common.h"
|
|
|
|
|
|
|
|
#define CSR_WIFI_FSM_ENV (0xFFFF)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Toplevel FSM context data
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* Holds ALL FSM static and dynamic data for a FSM
|
|
|
|
*/
|
|
|
|
typedef struct CsrWifiFsmContext CsrWifiFsmContext;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* FSM External Wakeup CallbackFunction Pointer
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* Defines the external wakeup function for the FSM
|
|
|
|
* to call when an external event is injected into the systen
|
|
|
|
*
|
|
|
|
* @param[in] context : External context
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* void
|
|
|
|
*/
|
|
|
|
typedef void (*CsrWifiFsmExternalWakupCallbackPtr)(void *context);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Initialises a top level FSM context
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* Initialises the FSM Context to an initial state and allocates
|
|
|
|
* space for "maxProcesses" number of instances
|
|
|
|
*
|
|
|
|
* @param[in] osaContext : OSA context
|
|
|
|
* @param[in] applicationContext : Internal fsm application context
|
|
|
|
* @param[in] externalContext : External context
|
|
|
|
* @param[in] maxProcesses : Max processes to allocate room for
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* CsrWifiFsmContext* fsm context
|
|
|
|
*/
|
2012-07-20 19:00:10 +00:00
|
|
|
extern CsrWifiFsmContext* CsrWifiFsmInit(void *applicationContext, void *externalContext, u16 maxProcesses, CsrLogTextTaskId loggingTaskId);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Resets the FSM's back to first conditions
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* This function is used to free any dynamic resources allocated for the
|
|
|
|
* given context by CsrWifiFsmInit().
|
|
|
|
* The FSM's reset function is called to cleanup any fsm specific memory
|
|
|
|
* The reset funtion does NOT need to free the fsm data pointer as
|
|
|
|
* CsrWifiFsmShutdown() will do it.
|
|
|
|
* the FSM's init function is call again to reinitialise the FSM context.
|
|
|
|
* CsrWifiFsmReset() should NEVER be called when CsrWifiFsmExecute() is running.
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* void
|
|
|
|
*/
|
|
|
|
extern void CsrWifiFsmReset(CsrWifiFsmContext *context);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Frees resources allocated by CsrWifiFsmInit
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* This function is used to free any dynamic resources allocated for the
|
|
|
|
* given context by CsrWifiFsmInit(), prior to complete termination of
|
|
|
|
* the program.
|
|
|
|
* The FSM's reset function is called to cleanup any fsm specific memory.
|
|
|
|
* The reset funtion does NOT need to free the fsm data pointer as
|
|
|
|
* CsrWifiFsmShutdown() will do it.
|
|
|
|
* CsrWifiFsmShutdown() should NEVER be called when CsrWifiFsmExecute() is running.
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* void
|
|
|
|
*/
|
|
|
|
extern void CsrWifiFsmShutdown(CsrWifiFsmContext *context);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Executes the fsm context
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* Executes the FSM context and runs until ALL events in the context are processed.
|
|
|
|
* When no more events are left to process then CsrWifiFsmExecute() returns to a time
|
|
|
|
* specifying when to next call the CsrWifiFsmExecute()
|
|
|
|
* Scheduling, threading, blocking and external event notification are outside
|
|
|
|
* the scope of the FSM and CsrWifiFsmExecute().
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
*
|
|
|
|
* @return
|
2012-07-20 19:05:42 +00:00
|
|
|
* u32 Time in ms until next timeout or 0xFFFFFFFF for no timer set
|
2012-06-19 23:15:42 +00:00
|
|
|
*/
|
2012-07-20 19:05:42 +00:00
|
|
|
extern u32 CsrWifiFsmExecute(CsrWifiFsmContext *context);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Adds an event to the FSM context's external event queue for processing
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* Adds an event to the contexts external queue
|
|
|
|
* This is thread safe and adds an event to the fsm's external event queue.
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
* @param[in] event : event to add to the event queue
|
|
|
|
* @param[in] source : source of the event (this can be a synergy task queue or an fsm instance id)
|
|
|
|
* @param[in] destination : destination of the event (This can be a fsm instance id or CSR_WIFI_FSM_ENV)
|
|
|
|
* @param[in] id : event id
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* void
|
|
|
|
*/
|
2012-07-20 19:00:10 +00:00
|
|
|
extern void CsrWifiFsmSendEventExternal(CsrWifiFsmContext *context, CsrWifiFsmEvent *event, u16 source, u16 destination, CsrPrim primtype, u16 id);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Adds an Alien event to the FSM context's external event queue for processing
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* Adds an event to the contexts external queue
|
|
|
|
* This is thread safe and adds an event to the fsm's external event queue.
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
* @param[in] event : event to add to the event queue
|
|
|
|
* @param[in] source : source of the event (this can be a synergy task queue or an fsm instance id)
|
|
|
|
* @param[in] destination : destination of the event (This can be a fsm instance id or CSR_WIFI_FSM_ENV)
|
|
|
|
* @param[in] id : event id
|
|
|
|
*/
|
|
|
|
#define CsrWifiFsmSendAlienEventExternal(_context, _alienEvent, _source, _destination, _primtype, _id) \
|
|
|
|
{ \
|
2012-07-20 23:41:09 +00:00
|
|
|
CsrWifiFsmAlienEvent *_evt = kmalloc(sizeof(CsrWifiFsmAlienEvent), GFP_KERNEL); \
|
2012-06-19 23:15:42 +00:00
|
|
|
_evt->alienEvent = _alienEvent; \
|
|
|
|
CsrWifiFsmSendEventExternal(_context, (CsrWifiFsmEvent *)_evt, _source, _destination, _primtype, _id); \
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Current time of day in ms
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
*
|
|
|
|
* @return
|
2012-07-20 19:05:42 +00:00
|
|
|
* u32 32 bit ms tick
|
2012-06-19 23:15:42 +00:00
|
|
|
*/
|
2012-07-20 19:05:42 +00:00
|
|
|
extern u32 CsrWifiFsmGetTimeOfDayMs(CsrWifiFsmContext *context);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Gets the time until the next FSM timer expiry
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* Returns the next timeout time or 0 if no timers are set.
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
*
|
|
|
|
* @return
|
2012-07-20 19:05:42 +00:00
|
|
|
* u32 Time in ms until next timeout or 0xFFFFFFFF for no timer set
|
2012-06-19 23:15:42 +00:00
|
|
|
*/
|
2012-07-20 19:05:42 +00:00
|
|
|
extern u32 CsrWifiFsmGetNextTimeout(CsrWifiFsmContext *context);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Fast forwards the fsm timers by ms Milliseconds
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
* @param[in] ms : Milliseconds to fast forward by
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* void
|
|
|
|
*/
|
2012-07-20 19:00:10 +00:00
|
|
|
extern void CsrWifiFsmFastForward(CsrWifiFsmContext *context, u16 ms);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* shift the current time of day by ms amount
|
|
|
|
*
|
|
|
|
* @par Description
|
|
|
|
* usefull to speed up tests where time needs to pass
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
* @param[in] ms : ms to adjust time by
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* void
|
|
|
|
*/
|
2012-07-20 19:05:42 +00:00
|
|
|
extern void CsrWifiFsmTestAdvanceTime(CsrWifiFsmContext *context, u32 ms);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* Check if the fsm has events to process
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
*
|
|
|
|
* @return
|
2012-07-20 19:25:15 +00:00
|
|
|
* u8 returns TRUE if there are events for the FSM to process
|
2012-06-19 23:15:42 +00:00
|
|
|
*/
|
2012-07-20 19:25:15 +00:00
|
|
|
extern u8 CsrWifiFsmHasEvents(CsrWifiFsmContext *context);
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief
|
|
|
|
* function that installs the contexts wakeup function
|
|
|
|
*
|
|
|
|
* @param[in] context : FSM context
|
|
|
|
* @param[in] callback : Callback function pointer
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* void
|
|
|
|
*/
|
|
|
|
extern void CsrWifiFsmInstallWakeupCallback(CsrWifiFsmContext *context, CsrWifiFsmExternalWakupCallbackPtr callback);
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* CSR_WIFI_FSM_H */
|
|
|
|
|