2010-08-23 20:24:12 -07:00
/*
* Linux network driver for Brocade Converged Network Adapter .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License ( GPL ) Version 2 as
* published by the Free Software Foundation
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*/
/*
* Copyright ( c ) 2005 - 2010 Brocade Communications Systems , Inc .
* All rights reserved
* www . brocade . com
*/
/**
* @ file bfasm . h State machine defines
*/
# ifndef __BFA_SM_H__
# define __BFA_SM_H__
# include "cna.h"
typedef void ( * bfa_sm_t ) ( void * sm , int event ) ;
/**
* oc - object class eg . bfa_ioc
* st - state , eg . reset
* otype - object type , eg . struct bfa_ioc
* etype - object type , eg . enum ioc_event
*/
# define bfa_sm_state_decl(oc, st, otype, etype) \
static void oc # # _sm_ # # st ( otype * fsm , etype event )
# define bfa_sm_set_state(_sm, _state) ((_sm)->sm = (bfa_sm_t)(_state))
# define bfa_sm_send_event(_sm, _event) ((_sm)->sm((_sm), (_event)))
# define bfa_sm_get_state(_sm) ((_sm)->sm)
# define bfa_sm_cmp_state(_sm, _state) ((_sm)->sm == (bfa_sm_t)(_state))
/**
* For converting from state machine function to state encoding .
*/
struct bfa_sm_table {
bfa_sm_t sm ; /*!< state machine function */
int state ; /*!< state machine encoding */
char * name ; /*!< state name for display */
} ;
# define BFA_SM(_sm) ((bfa_sm_t)(_sm))
/**
* State machine with entry actions .
*/
typedef void ( * bfa_fsm_t ) ( void * fsm , int event ) ;
/**
* oc - object class eg . bfa_ioc
* st - state , eg . reset
* otype - object type , eg . struct bfa_ioc
* etype - object type , eg . enum ioc_event
*/
# define bfa_fsm_state_decl(oc, st, otype, etype) \
static void oc # # _sm_ # # st ( otype * fsm , etype event ) ; \
static void oc # # _sm_ # # st # # _entry ( otype * fsm )
# define bfa_fsm_set_state(_fsm, _state) do { \
( _fsm ) - > fsm = ( bfa_fsm_t ) ( _state ) ; \
_state # # _entry ( _fsm ) ; \
} while ( 0 )
# define bfa_fsm_send_event(_fsm, _event) ((_fsm)->fsm((_fsm), (_event)))
# define bfa_fsm_get_state(_fsm) ((_fsm)->fsm)
# define bfa_fsm_cmp_state(_fsm, _state) \
( ( _fsm ) - > fsm = = ( bfa_fsm_t ) ( _state ) )
static inline int
2010-10-05 15:46:05 +00:00
bfa_sm_to_state ( const struct bfa_sm_table * smt , bfa_sm_t sm )
2010-08-23 20:24:12 -07:00
{
int i = 0 ;
while ( smt [ i ] . sm & & smt [ i ] . sm ! = sm )
i + + ;
return smt [ i ] . state ;
}
# endif