root/drivers/net/ethernet/brocade/bna/bfa_cs.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. bfa_sm_to_state
  2. bfa_wc_up
  3. bfa_wc_down
  4. bfa_wc_init
  5. bfa_wc_wait

   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Linux network driver for QLogic BR-series Converged Network Adapter.
   4  */
   5 /*
   6  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
   7  * Copyright (c) 2014-2015 QLogic Corporation
   8  * All rights reserved
   9  * www.qlogic.com
  10  */
  11 
  12 /* BFA common services */
  13 
  14 #ifndef __BFA_CS_H__
  15 #define __BFA_CS_H__
  16 
  17 #include "cna.h"
  18 
  19 /* BFA state machine interfaces */
  20 
  21 typedef void (*bfa_sm_t)(void *sm, int event);
  22 
  23 /* For converting from state machine function to state encoding. */
  24 struct bfa_sm_table {
  25         bfa_sm_t        sm;     /*!< state machine function     */
  26         int             state;  /*!< state machine encoding     */
  27         char            *name;  /*!< state name for display     */
  28 };
  29 #define BFA_SM(_sm)             ((bfa_sm_t)(_sm))
  30 
  31 /* State machine with entry actions. */
  32 typedef void (*bfa_fsm_t)(void *fsm, int event);
  33 
  34 /* oc - object class eg. bfa_ioc
  35  * st - state, eg. reset
  36  * otype - object type, eg. struct bfa_ioc
  37  * etype - object type, eg. enum ioc_event
  38  */
  39 #define bfa_fsm_state_decl(oc, st, otype, etype)                        \
  40         static void oc ## _sm_ ## st(otype * fsm, etype event);         \
  41         static void oc ## _sm_ ## st ## _entry(otype * fsm)
  42 
  43 #define bfa_fsm_set_state(_fsm, _state) do {                            \
  44         (_fsm)->fsm = (bfa_fsm_t)(_state);                              \
  45         _state ## _entry(_fsm);                                         \
  46 } while (0)
  47 
  48 #define bfa_fsm_send_event(_fsm, _event)        ((_fsm)->fsm((_fsm), (_event)))
  49 #define bfa_fsm_cmp_state(_fsm, _state)                                 \
  50         ((_fsm)->fsm == (bfa_fsm_t)(_state))
  51 
  52 static inline int
  53 bfa_sm_to_state(const struct bfa_sm_table *smt, bfa_sm_t sm)
  54 {
  55         int     i = 0;
  56 
  57         while (smt[i].sm && smt[i].sm != sm)
  58                 i++;
  59         return smt[i].state;
  60 }
  61 
  62 /* Generic wait counter. */
  63 
  64 typedef void (*bfa_wc_resume_t) (void *cbarg);
  65 
  66 struct bfa_wc {
  67         bfa_wc_resume_t wc_resume;
  68         void            *wc_cbarg;
  69         int             wc_count;
  70 };
  71 
  72 static inline void
  73 bfa_wc_up(struct bfa_wc *wc)
  74 {
  75         wc->wc_count++;
  76 }
  77 
  78 static inline void
  79 bfa_wc_down(struct bfa_wc *wc)
  80 {
  81         wc->wc_count--;
  82         if (wc->wc_count == 0)
  83                 wc->wc_resume(wc->wc_cbarg);
  84 }
  85 
  86 /* Initialize a waiting counter. */
  87 static inline void
  88 bfa_wc_init(struct bfa_wc *wc, bfa_wc_resume_t wc_resume, void *wc_cbarg)
  89 {
  90         wc->wc_resume = wc_resume;
  91         wc->wc_cbarg = wc_cbarg;
  92         wc->wc_count = 0;
  93         bfa_wc_up(wc);
  94 }
  95 
  96 /* Wait for counter to reach zero */
  97 static inline void
  98 bfa_wc_wait(struct bfa_wc *wc)
  99 {
 100         bfa_wc_down(wc);
 101 }
 102 
 103 #endif /* __BFA_CS_H__ */

/* [<][>][^][v][top][bottom][index][help] */