linux/drivers/net/ethernet/brocade/bna/bfa_cs.h
<<
>>
Prefs
   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
  21typedef void (*bfa_sm_t)(void *sm, int event);
  22
  23/* For converting from state machine function to state encoding. */
  24struct 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. */
  32typedef 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
  52static inline int
  53bfa_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
  64typedef void (*bfa_wc_resume_t) (void *cbarg);
  65
  66struct bfa_wc {
  67        bfa_wc_resume_t wc_resume;
  68        void            *wc_cbarg;
  69        int             wc_count;
  70};
  71
  72static inline void
  73bfa_wc_up(struct bfa_wc *wc)
  74{
  75        wc->wc_count++;
  76}
  77
  78static inline void
  79bfa_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. */
  87static inline void
  88bfa_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 */
  97static inline void
  98bfa_wc_wait(struct bfa_wc *wc)
  99{
 100        bfa_wc_down(wc);
 101}
 102
 103#endif /* __BFA_CS_H__ */
 104