Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
0004  * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
0005  *
0006  */
0007 
0008 /**
0009  * Generic state machine framework declarations.
0010  */
0011 
0012 #ifndef _EFC_SM_H
0013 #define _EFC_SM_H
0014 
0015 struct efc_sm_ctx;
0016 
0017 /* State Machine events */
0018 enum efc_sm_event {
0019     /* Common Events */
0020     EFC_EVT_ENTER,
0021     EFC_EVT_REENTER,
0022     EFC_EVT_EXIT,
0023     EFC_EVT_SHUTDOWN,
0024     EFC_EVT_ALL_CHILD_NODES_FREE,
0025     EFC_EVT_RESUME,
0026     EFC_EVT_TIMER_EXPIRED,
0027 
0028     /* Domain Events */
0029     EFC_EVT_RESPONSE,
0030     EFC_EVT_ERROR,
0031 
0032     EFC_EVT_DOMAIN_FOUND,
0033     EFC_EVT_DOMAIN_ALLOC_OK,
0034     EFC_EVT_DOMAIN_ALLOC_FAIL,
0035     EFC_EVT_DOMAIN_REQ_ATTACH,
0036     EFC_EVT_DOMAIN_ATTACH_OK,
0037     EFC_EVT_DOMAIN_ATTACH_FAIL,
0038     EFC_EVT_DOMAIN_LOST,
0039     EFC_EVT_DOMAIN_FREE_OK,
0040     EFC_EVT_DOMAIN_FREE_FAIL,
0041     EFC_EVT_HW_DOMAIN_REQ_ATTACH,
0042     EFC_EVT_HW_DOMAIN_REQ_FREE,
0043 
0044     /* Sport Events */
0045     EFC_EVT_NPORT_ALLOC_OK,
0046     EFC_EVT_NPORT_ALLOC_FAIL,
0047     EFC_EVT_NPORT_ATTACH_OK,
0048     EFC_EVT_NPORT_ATTACH_FAIL,
0049     EFC_EVT_NPORT_FREE_OK,
0050     EFC_EVT_NPORT_FREE_FAIL,
0051     EFC_EVT_NPORT_TOPOLOGY_NOTIFY,
0052     EFC_EVT_HW_PORT_ALLOC_OK,
0053     EFC_EVT_HW_PORT_ALLOC_FAIL,
0054     EFC_EVT_HW_PORT_ATTACH_OK,
0055     EFC_EVT_HW_PORT_REQ_ATTACH,
0056     EFC_EVT_HW_PORT_REQ_FREE,
0057     EFC_EVT_HW_PORT_FREE_OK,
0058 
0059     /* Login Events */
0060     EFC_EVT_SRRS_ELS_REQ_OK,
0061     EFC_EVT_SRRS_ELS_CMPL_OK,
0062     EFC_EVT_SRRS_ELS_REQ_FAIL,
0063     EFC_EVT_SRRS_ELS_CMPL_FAIL,
0064     EFC_EVT_SRRS_ELS_REQ_RJT,
0065     EFC_EVT_NODE_ATTACH_OK,
0066     EFC_EVT_NODE_ATTACH_FAIL,
0067     EFC_EVT_NODE_FREE_OK,
0068     EFC_EVT_NODE_FREE_FAIL,
0069     EFC_EVT_ELS_FRAME,
0070     EFC_EVT_ELS_REQ_TIMEOUT,
0071     EFC_EVT_ELS_REQ_ABORTED,
0072     /* request an ELS IO be aborted */
0073     EFC_EVT_ABORT_ELS,
0074     /* ELS abort process complete */
0075     EFC_EVT_ELS_ABORT_CMPL,
0076 
0077     EFC_EVT_ABTS_RCVD,
0078 
0079     /* node is not in the GID_PT payload */
0080     EFC_EVT_NODE_MISSING,
0081     /* node is allocated and in the GID_PT payload */
0082     EFC_EVT_NODE_REFOUND,
0083     /* node shutting down due to PLOGI recvd (implicit logo) */
0084     EFC_EVT_SHUTDOWN_IMPLICIT_LOGO,
0085     /* node shutting down due to LOGO recvd/sent (explicit logo) */
0086     EFC_EVT_SHUTDOWN_EXPLICIT_LOGO,
0087 
0088     EFC_EVT_PLOGI_RCVD,
0089     EFC_EVT_FLOGI_RCVD,
0090     EFC_EVT_LOGO_RCVD,
0091     EFC_EVT_PRLI_RCVD,
0092     EFC_EVT_PRLO_RCVD,
0093     EFC_EVT_PDISC_RCVD,
0094     EFC_EVT_FDISC_RCVD,
0095     EFC_EVT_ADISC_RCVD,
0096     EFC_EVT_RSCN_RCVD,
0097     EFC_EVT_SCR_RCVD,
0098     EFC_EVT_ELS_RCVD,
0099 
0100     EFC_EVT_FCP_CMD_RCVD,
0101 
0102     EFC_EVT_GIDPT_DELAY_EXPIRED,
0103 
0104     /* SCSI Target Server events */
0105     EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY,
0106     EFC_EVT_NODE_DEL_INI_COMPLETE,
0107     EFC_EVT_NODE_DEL_TGT_COMPLETE,
0108     EFC_EVT_NODE_SESS_REG_OK,
0109     EFC_EVT_NODE_SESS_REG_FAIL,
0110 
0111     /* Must be last */
0112     EFC_EVT_LAST
0113 };
0114 
0115 /* State Machine event name lookup array */
0116 #define EFC_SM_EVENT_NAME {                     \
0117     [EFC_EVT_ENTER]         = "EFC_EVT_ENTER",      \
0118     [EFC_EVT_REENTER]       = "EFC_EVT_REENTER",        \
0119     [EFC_EVT_EXIT]          = "EFC_EVT_EXIT",       \
0120     [EFC_EVT_SHUTDOWN]      = "EFC_EVT_SHUTDOWN",       \
0121     [EFC_EVT_ALL_CHILD_NODES_FREE]  = "EFC_EVT_ALL_CHILD_NODES_FREE",\
0122     [EFC_EVT_RESUME]        = "EFC_EVT_RESUME",     \
0123     [EFC_EVT_TIMER_EXPIRED]     = "EFC_EVT_TIMER_EXPIRED",  \
0124     [EFC_EVT_RESPONSE]      = "EFC_EVT_RESPONSE",       \
0125     [EFC_EVT_ERROR]         = "EFC_EVT_ERROR",      \
0126     [EFC_EVT_DOMAIN_FOUND]      = "EFC_EVT_DOMAIN_FOUND",   \
0127     [EFC_EVT_DOMAIN_ALLOC_OK]   = "EFC_EVT_DOMAIN_ALLOC_OK",    \
0128     [EFC_EVT_DOMAIN_ALLOC_FAIL] = "EFC_EVT_DOMAIN_ALLOC_FAIL",  \
0129     [EFC_EVT_DOMAIN_REQ_ATTACH] = "EFC_EVT_DOMAIN_REQ_ATTACH",  \
0130     [EFC_EVT_DOMAIN_ATTACH_OK]  = "EFC_EVT_DOMAIN_ATTACH_OK",   \
0131     [EFC_EVT_DOMAIN_ATTACH_FAIL]    = "EFC_EVT_DOMAIN_ATTACH_FAIL", \
0132     [EFC_EVT_DOMAIN_LOST]       = "EFC_EVT_DOMAIN_LOST",    \
0133     [EFC_EVT_DOMAIN_FREE_OK]    = "EFC_EVT_DOMAIN_FREE_OK", \
0134     [EFC_EVT_DOMAIN_FREE_FAIL]  = "EFC_EVT_DOMAIN_FREE_FAIL",   \
0135     [EFC_EVT_HW_DOMAIN_REQ_ATTACH]  = "EFC_EVT_HW_DOMAIN_REQ_ATTACH",\
0136     [EFC_EVT_HW_DOMAIN_REQ_FREE]    = "EFC_EVT_HW_DOMAIN_REQ_FREE", \
0137     [EFC_EVT_NPORT_ALLOC_OK]    = "EFC_EVT_NPORT_ALLOC_OK", \
0138     [EFC_EVT_NPORT_ALLOC_FAIL]  = "EFC_EVT_NPORT_ALLOC_FAIL",   \
0139     [EFC_EVT_NPORT_ATTACH_OK]   = "EFC_EVT_NPORT_ATTACH_OK",    \
0140     [EFC_EVT_NPORT_ATTACH_FAIL] = "EFC_EVT_NPORT_ATTACH_FAIL",  \
0141     [EFC_EVT_NPORT_FREE_OK]     = "EFC_EVT_NPORT_FREE_OK",  \
0142     [EFC_EVT_NPORT_FREE_FAIL]   = "EFC_EVT_NPORT_FREE_FAIL",    \
0143     [EFC_EVT_NPORT_TOPOLOGY_NOTIFY] = "EFC_EVT_NPORT_TOPOLOGY_NOTIFY",\
0144     [EFC_EVT_HW_PORT_ALLOC_OK]  = "EFC_EVT_HW_PORT_ALLOC_OK",   \
0145     [EFC_EVT_HW_PORT_ALLOC_FAIL]    = "EFC_EVT_HW_PORT_ALLOC_FAIL", \
0146     [EFC_EVT_HW_PORT_ATTACH_OK] = "EFC_EVT_HW_PORT_ATTACH_OK",  \
0147     [EFC_EVT_HW_PORT_REQ_ATTACH]    = "EFC_EVT_HW_PORT_REQ_ATTACH", \
0148     [EFC_EVT_HW_PORT_REQ_FREE]  = "EFC_EVT_HW_PORT_REQ_FREE",   \
0149     [EFC_EVT_HW_PORT_FREE_OK]   = "EFC_EVT_HW_PORT_FREE_OK",    \
0150     [EFC_EVT_SRRS_ELS_REQ_OK]   = "EFC_EVT_SRRS_ELS_REQ_OK",    \
0151     [EFC_EVT_SRRS_ELS_CMPL_OK]  = "EFC_EVT_SRRS_ELS_CMPL_OK",   \
0152     [EFC_EVT_SRRS_ELS_REQ_FAIL] = "EFC_EVT_SRRS_ELS_REQ_FAIL",  \
0153     [EFC_EVT_SRRS_ELS_CMPL_FAIL]    = "EFC_EVT_SRRS_ELS_CMPL_FAIL", \
0154     [EFC_EVT_SRRS_ELS_REQ_RJT]  = "EFC_EVT_SRRS_ELS_REQ_RJT",   \
0155     [EFC_EVT_NODE_ATTACH_OK]    = "EFC_EVT_NODE_ATTACH_OK", \
0156     [EFC_EVT_NODE_ATTACH_FAIL]  = "EFC_EVT_NODE_ATTACH_FAIL",   \
0157     [EFC_EVT_NODE_FREE_OK]      = "EFC_EVT_NODE_FREE_OK",   \
0158     [EFC_EVT_NODE_FREE_FAIL]    = "EFC_EVT_NODE_FREE_FAIL", \
0159     [EFC_EVT_ELS_FRAME]     = "EFC_EVT_ELS_FRAME",      \
0160     [EFC_EVT_ELS_REQ_TIMEOUT]   = "EFC_EVT_ELS_REQ_TIMEOUT",    \
0161     [EFC_EVT_ELS_REQ_ABORTED]   = "EFC_EVT_ELS_REQ_ABORTED",    \
0162     [EFC_EVT_ABORT_ELS]     = "EFC_EVT_ABORT_ELS",      \
0163     [EFC_EVT_ELS_ABORT_CMPL]    = "EFC_EVT_ELS_ABORT_CMPL", \
0164     [EFC_EVT_ABTS_RCVD]     = "EFC_EVT_ABTS_RCVD",      \
0165     [EFC_EVT_NODE_MISSING]      = "EFC_EVT_NODE_MISSING",   \
0166     [EFC_EVT_NODE_REFOUND]      = "EFC_EVT_NODE_REFOUND",   \
0167     [EFC_EVT_SHUTDOWN_IMPLICIT_LOGO] = "EFC_EVT_SHUTDOWN_IMPLICIT_LOGO",\
0168     [EFC_EVT_SHUTDOWN_EXPLICIT_LOGO] = "EFC_EVT_SHUTDOWN_EXPLICIT_LOGO",\
0169     [EFC_EVT_PLOGI_RCVD]        = "EFC_EVT_PLOGI_RCVD",     \
0170     [EFC_EVT_FLOGI_RCVD]        = "EFC_EVT_FLOGI_RCVD",     \
0171     [EFC_EVT_LOGO_RCVD]     = "EFC_EVT_LOGO_RCVD",      \
0172     [EFC_EVT_PRLI_RCVD]     = "EFC_EVT_PRLI_RCVD",      \
0173     [EFC_EVT_PRLO_RCVD]     = "EFC_EVT_PRLO_RCVD",      \
0174     [EFC_EVT_PDISC_RCVD]        = "EFC_EVT_PDISC_RCVD",     \
0175     [EFC_EVT_FDISC_RCVD]        = "EFC_EVT_FDISC_RCVD",     \
0176     [EFC_EVT_ADISC_RCVD]        = "EFC_EVT_ADISC_RCVD",     \
0177     [EFC_EVT_RSCN_RCVD]     = "EFC_EVT_RSCN_RCVD",      \
0178     [EFC_EVT_SCR_RCVD]      = "EFC_EVT_SCR_RCVD",       \
0179     [EFC_EVT_ELS_RCVD]      = "EFC_EVT_ELS_RCVD",       \
0180     [EFC_EVT_FCP_CMD_RCVD]      = "EFC_EVT_FCP_CMD_RCVD",   \
0181     [EFC_EVT_NODE_DEL_INI_COMPLETE] = "EFC_EVT_NODE_DEL_INI_COMPLETE",\
0182     [EFC_EVT_NODE_DEL_TGT_COMPLETE] = "EFC_EVT_NODE_DEL_TGT_COMPLETE",\
0183     [EFC_EVT_LAST]          = "EFC_EVT_LAST",       \
0184 }
0185 
0186 int
0187 efc_sm_post_event(struct efc_sm_ctx *ctx,
0188           enum efc_sm_event evt, void *data);
0189 void
0190 efc_sm_transition(struct efc_sm_ctx *ctx,
0191           void (*state)(struct efc_sm_ctx *ctx,
0192                 enum efc_sm_event evt, void *arg),
0193           void *data);
0194 void efc_sm_disable(struct efc_sm_ctx *ctx);
0195 const char *efc_sm_event_name(enum efc_sm_event evt);
0196 
0197 #endif /* ! _EFC_SM_H */