1 /*****************************************************************************
3 (c) Cambridge Silicon Radio Limited 2011
4 All rights reserved and confidential information of CSR
6 Refer to LICENSE.txt included with this source for details
9 *****************************************************************************/
11 #ifndef CSR_WIFI_FSM_TYPES_H
12 #define CSR_WIFI_FSM_TYPES_H
18 #include <linux/types.h>
19 #include "csr_macro.h"
20 #include "csr_panic.h"
21 #include "csr_sched.h"
23 #ifdef CSR_WIFI_FSM_MUTEX_ENABLE
24 #include "csr_framework_ext.h"
27 #include "csr_wifi_fsm.h"
29 #define CSR_WIFI_FSM_MAX_TRANSITION_HISTORY 10
33 * FSM event list header.
36 * Singly linked list of events.
38 typedef struct CsrWifiFsmEventList
40 CsrWifiFsmEvent *first;
41 CsrWifiFsmEvent *last;
42 } CsrWifiFsmEventList;
50 * Composite Id made up of the type, dest and a unique id so
51 * CsrWifiFsmRemoveTimer knows where to look when removing the timer
53 typedef struct CsrWifiFsmTimerId
57 CsrSchedQid destination;
66 * All timer MUST have this struct as the FIRST member.
67 * The first members of the structure MUST remain compatable
68 * with the CsrWifiFsmEvent so that timers are just specialised events
70 typedef struct CsrWifiFsmTimer
74 CsrSchedQid destination;
77 /* Private pointer to allow an optimal Event list */
78 struct CsrWifiFsmTimer *next;
80 CsrWifiFsmTimerId timerid;
90 * Allows the wrapping of alien events that do not use CsrWifiFsmEvent
91 * as the first member of the Event struct
95 CsrWifiFsmEvent event;
97 } CsrWifiFsmAlienEvent;
102 * FSM timer list header.
105 * Singly linked list of timers.
107 typedef struct CsrWifiFsmTimerList
109 CsrWifiFsmTimer *first;
110 CsrWifiFsmTimer *last;
112 } CsrWifiFsmTimerList;
116 * Process Entry Function Pointer
119 * Defines the entry function for a processes.
120 * Called at process initialisation.
122 * @param[in] context : FSM context
127 typedef void (*CsrWifiFsmProcEntryFnPtr)(CsrWifiFsmContext *context);
131 * Process Transition Function Pointer
134 * Defines a transition function for a processes.
135 * Called when an event causes a transition on a process
137 * @param[in] CsrWifiFsmContext* : FSM context
138 * @param[in] void* : FSM data (can be NULL)
139 * @param[in] const CsrWifiFsmEvent* : event to process
144 typedef void (*CsrWifiFsmTransitionFnPtr)(CsrWifiFsmContext *context, void *fsmData, const CsrWifiFsmEvent *event);
148 * Process reset/shutdown Function Pointer
151 * Defines the reset/shutdown function for a processes.
152 * Called to reset or shutdown an fsm.
154 * @param[in] context : FSM context
159 typedef void (*CsrWifiFsmProcResetFnPtr)(CsrWifiFsmContext *context);
163 * FSM Default Destination CallbackFunction Pointer
166 * Defines the default destination function for the FSM
167 * to call when an event does not have a valid destination.
170 * @param[in] context : External context
173 * u16 a valid destination OR CSR_WIFI_FSM_ENV
175 typedef u16 (*CsrWifiFsmDestLookupCallbackPtr)(void *context, const CsrWifiFsmEvent *event);
178 #ifdef CSR_WIFI_FSM_DUMP_ENABLE
181 * Trace Dump Function Pointer
184 * Called when we want to trace the FSM
186 * @param[in] context : FSM context
187 * @param[in] id : fsm id
192 typedef void (*CsrWifiFsmDumpFnPtr)(CsrWifiFsmContext *context, void *fsmData);
197 * Event ID to transition function entry
200 * Event ID to Transition Entry in a state table.
205 CsrWifiFsmTransitionFnPtr transition;
206 #ifdef CSR_LOG_ENABLE
207 const char *transitionName;
209 } CsrWifiFsmEventEntry;
213 * Single State's Transition Table
216 * Stores Data for a single State's event to
217 * transition functions mapping
223 const CsrWifiFsmEventEntry *eventEntryArray; /* array of transition function pointers for state */
224 #ifdef CSR_LOG_ENABLE
226 const char *stateName;
228 } CsrWifiFsmTableEntry;
232 * Process State Transtion table
235 * Stores Data for a processes State to transition table
239 u16 numStates; /* number of states */
240 const CsrWifiFsmTableEntry *aStateEventMatrix; /* state event matrix */
241 } CsrWifiFsmTransitionFunctionTable;
245 * Const Process definition
248 * Constant process specification.
249 * This is ALL the non dynamic data that defines
254 const char *processName;
256 const CsrWifiFsmTransitionFunctionTable transitionTable;
257 const CsrWifiFsmTableEntry unhandledTransitions;
258 const CsrWifiFsmTableEntry ignoreFunctions;
259 const CsrWifiFsmProcEntryFnPtr entryFn;
260 const CsrWifiFsmProcResetFnPtr resetFn;
261 #ifdef CSR_WIFI_FSM_DUMP_ENABLE
262 const CsrWifiFsmDumpFnPtr dumpFn; /* Called to dump fsm specific trace if not NULL */
264 } CsrWifiFsmProcessStateMachine;
266 #ifdef CSR_WIFI_FSM_DUMP_ENABLE
269 * Storage for state transition info
273 u16 transitionNumber;
274 CsrWifiFsmEvent event;
277 CsrWifiFsmTransitionFnPtr transitionFn;
278 u16 transitionCount; /* number consecutive of times this transition was seen */
279 #ifdef CSR_LOG_ENABLE
280 const char *transitionName;
282 } CsrWifiFsmTransitionRecord;
286 * Storage for the last state X transitions
291 CsrWifiFsmTransitionRecord records[CSR_WIFI_FSM_MAX_TRANSITION_HISTORY];
292 } CsrWifiFsmTransitionRecords;
297 * Dynamic Process data
300 * Dynamic process data that is used to keep track of the
301 * state and data for a process instance
305 const CsrWifiFsmProcessStateMachine *fsmInfo; /* state machine info that is constant regardless of context */
306 u16 instanceId; /* Runtime process id */
307 u16 state; /* Current state */
308 void *params; /* Instance user data */
309 CsrWifiFsmEventList savedEventQueue; /* The saved event queue */
310 struct CsrWifiFsmInstanceEntry *subFsm; /* Sub Fsm instance data */
311 struct CsrWifiFsmInstanceEntry *subFsmCaller; /* The Fsm instance that created the SubFsm and should be used for callbacks*/
312 #ifdef CSR_WIFI_FSM_DUMP_ENABLE
313 CsrWifiFsmTransitionRecords transitionRecords; /* Last X transitions in the FSM */
315 } CsrWifiFsmInstanceEntry;
319 * OnCreate Callback Function Pointer
322 * Called when an fsm is created.
324 * @param[in] extContext : External context
325 * @param[in] instance : FSM instance
330 typedef void (*CsrWifiFsmOnCreateFnPtr)(void *extContext, const CsrWifiFsmInstanceEntry *instance);
334 * OnTransition Callback Function Pointer
337 * Called when an event is processed by a fsm
339 * @param[in] extContext : External context
340 * @param[in] eventEntryArray : Entry data
341 * @param[in] event : Event
346 typedef void (*CsrWifiFsmOnTransitionFnPtr)(void *extContext, const CsrWifiFsmEventEntry *eventEntryArray, const CsrWifiFsmEvent *event);
350 * OnStateChange Callback Function Pointer
353 * Called when CsrWifiFsmNextState is called
355 * @param[in] extContext : External context
360 typedef void (*CsrWifiFsmOnStateChangeFnPtr)(void *extContext, u16 nextstate);
364 * OnIgnore,OnError or OnInvalid Callback Function Pointer
367 * Called when an event is processed by a fsm
369 * @param[in] extContext : External context
370 * @param[in] event : Event
375 typedef void (*CsrWifiFsmOnEventFnPtr)(void *extContext, const CsrWifiFsmEvent *event);
379 * Toplevel FSM context data
382 * Holds ALL FSM static and dynamic data for a FSM
384 struct CsrWifiFsmContext
386 CsrWifiFsmEventList eventQueue; /* The internal event queue */
387 CsrWifiFsmEventList externalEventQueue; /* The external event queue */
388 #ifdef CSR_WIFI_FSM_MUTEX_ENABLE
389 CsrMutexHandle externalEventQueueLock; /* The external event queue mutex */
391 u32 timeOffset; /* Amount to adjust the TimeOfDayMs by */
392 CsrWifiFsmTimerList timerQueue; /* The internal timer queue */
393 u8 useTempSaveList; /* Should the temp save list be used */
394 CsrWifiFsmEventList tempSaveList; /* The temp save event queue */
395 CsrWifiFsmEvent *eventForwardedOrSaved; /* The event that was forwarded or Saved */
396 u16 maxProcesses; /* Size of instanceArray */
397 u16 numProcesses; /* Current number allocated in instanceArray */
398 CsrWifiFsmInstanceEntry *instanceArray; /* Array of processes for this component */
399 CsrWifiFsmInstanceEntry *ownerInstance; /* The Process that owns currentInstance (SubFsm support) */
400 CsrWifiFsmInstanceEntry *currentInstance; /* Current Process that is executing */
401 CsrWifiFsmExternalWakupCallbackPtr externalEventFn; /* External event Callback */
402 CsrWifiFsmOnEventFnPtr appIgnoreCallback; /* Application Ignore event Callback */
403 CsrWifiFsmDestLookupCallbackPtr appEvtDstCallback; /* Application Lookup event Destination Function*/
405 void *applicationContext; /* Internal fsm application context */
406 void *externalContext; /* External context (set by the user of the fsm)*/
407 CsrLogTextTaskId loggingTaskId; /* Task Id to use in any logging output */
409 #ifndef CSR_WIFI_FSM_SCHEDULER_DISABLED
410 CsrSchedTid schedTimerId; /* Scheduler TimerId for use in Scheduler Tasks */
411 u32 schedTimerNexttimeoutMs; /* Next timeout time for the current timer */
414 #ifdef CSR_WIFI_FSM_MUTEX_ENABLE
415 #ifdef CSR_WIFI_FSM_TRANSITION_LOCK
416 CsrMutexHandle transitionLock; /* Lock when calling transition functions */
420 #ifdef CSR_LOG_ENABLE
421 CsrWifiFsmOnCreateFnPtr onCreate; /* Debug Transition Callback */
422 CsrWifiFsmOnTransitionFnPtr onTransition; /* Debug Transition Callback */
423 CsrWifiFsmOnTransitionFnPtr onUnhandedCallback; /* Unhanded event Callback */
424 CsrWifiFsmOnStateChangeFnPtr onStateChange; /* Debug State Change Callback */
425 CsrWifiFsmOnEventFnPtr onIgnoreCallback; /* Ignore event Callback */
426 CsrWifiFsmOnEventFnPtr onSaveCallback; /* Save event Callback */
427 CsrWifiFsmOnEventFnPtr onErrorCallback; /* Error event Callback */
428 CsrWifiFsmOnEventFnPtr onInvalidCallback; /* Invalid event Callback */
430 #ifdef CSR_WIFI_FSM_DUMP_ENABLE
431 u16 masterTransitionNumber; /* Increments on every transition */
440 #endif /* CSR_WIFI_FSM_TYPES_H */