|
@@ -11,20 +11,24 @@
|
|
|
* General Public License for more details.
|
|
|
*/
|
|
|
/*
|
|
|
- * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
|
|
|
+ * Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
|
|
|
* All rights reserved
|
|
|
* www.brocade.com
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
- * @file bfasm.h State machine defines
|
|
|
+ * @file bfa_cs.h BFA common services
|
|
|
*/
|
|
|
|
|
|
-#ifndef __BFA_SM_H__
|
|
|
-#define __BFA_SM_H__
|
|
|
+#ifndef __BFA_CS_H__
|
|
|
+#define __BFA_CS_H__
|
|
|
|
|
|
#include "cna.h"
|
|
|
|
|
|
+/**
|
|
|
+ * @ BFA state machine interfaces
|
|
|
+ */
|
|
|
+
|
|
|
typedef void (*bfa_sm_t)(void *sm, int event);
|
|
|
|
|
|
/**
|
|
@@ -33,7 +37,7 @@ typedef void (*bfa_sm_t)(void *sm, int event);
|
|
|
* otype - object type, eg. struct bfa_ioc
|
|
|
* etype - object type, eg. enum ioc_event
|
|
|
*/
|
|
|
-#define bfa_sm_state_decl(oc, st, otype, etype) \
|
|
|
+#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))
|
|
@@ -49,7 +53,7 @@ struct bfa_sm_table {
|
|
|
int state; /*!< state machine encoding */
|
|
|
char *name; /*!< state name for display */
|
|
|
};
|
|
|
-#define BFA_SM(_sm) ((bfa_sm_t)(_sm))
|
|
|
+#define BFA_SM(_sm) ((bfa_sm_t)(_sm))
|
|
|
|
|
|
/**
|
|
|
* State machine with entry actions.
|
|
@@ -62,18 +66,18 @@ typedef void (*bfa_fsm_t)(void *fsm, int event);
|
|
|
* 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); \
|
|
|
+#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); \
|
|
|
+#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) \
|
|
|
+#define bfa_fsm_cmp_state(_fsm, _state) \
|
|
|
((_fsm)->fsm == (bfa_fsm_t)(_state))
|
|
|
|
|
|
static inline int
|
|
@@ -85,4 +89,52 @@ bfa_sm_to_state(const struct bfa_sm_table *smt, bfa_sm_t sm)
|
|
|
i++;
|
|
|
return smt[i].state;
|
|
|
}
|
|
|
-#endif
|
|
|
+
|
|
|
+/**
|
|
|
+ * @ Generic wait counter.
|
|
|
+ */
|
|
|
+
|
|
|
+typedef void (*bfa_wc_resume_t) (void *cbarg);
|
|
|
+
|
|
|
+struct bfa_wc {
|
|
|
+ bfa_wc_resume_t wc_resume;
|
|
|
+ void *wc_cbarg;
|
|
|
+ int wc_count;
|
|
|
+};
|
|
|
+
|
|
|
+static inline void
|
|
|
+bfa_wc_up(struct bfa_wc *wc)
|
|
|
+{
|
|
|
+ wc->wc_count++;
|
|
|
+}
|
|
|
+
|
|
|
+static inline void
|
|
|
+bfa_wc_down(struct bfa_wc *wc)
|
|
|
+{
|
|
|
+ wc->wc_count--;
|
|
|
+ if (wc->wc_count == 0)
|
|
|
+ wc->wc_resume(wc->wc_cbarg);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Initialize a waiting counter.
|
|
|
+ */
|
|
|
+static inline void
|
|
|
+bfa_wc_init(struct bfa_wc *wc, bfa_wc_resume_t wc_resume, void *wc_cbarg)
|
|
|
+{
|
|
|
+ wc->wc_resume = wc_resume;
|
|
|
+ wc->wc_cbarg = wc_cbarg;
|
|
|
+ wc->wc_count = 0;
|
|
|
+ bfa_wc_up(wc);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Wait for counter to reach zero
|
|
|
+ */
|
|
|
+static inline void
|
|
|
+bfa_wc_wait(struct bfa_wc *wc)
|
|
|
+{
|
|
|
+ bfa_wc_down(wc);
|
|
|
+}
|
|
|
+
|
|
|
+#endif /* __BFA_CS_H__ */
|