1*ef270ab1SKenneth D. Merry /*- 2*ef270ab1SKenneth D. Merry * Copyright (c) 2017 Broadcom. All rights reserved. 3*ef270ab1SKenneth D. Merry * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 4*ef270ab1SKenneth D. Merry * 5*ef270ab1SKenneth D. Merry * Redistribution and use in source and binary forms, with or without 6*ef270ab1SKenneth D. Merry * modification, are permitted provided that the following conditions are met: 7*ef270ab1SKenneth D. Merry * 8*ef270ab1SKenneth D. Merry * 1. Redistributions of source code must retain the above copyright notice, 9*ef270ab1SKenneth D. Merry * this list of conditions and the following disclaimer. 10*ef270ab1SKenneth D. Merry * 11*ef270ab1SKenneth D. Merry * 2. Redistributions in binary form must reproduce the above copyright notice, 12*ef270ab1SKenneth D. Merry * this list of conditions and the following disclaimer in the documentation 13*ef270ab1SKenneth D. Merry * and/or other materials provided with the distribution. 14*ef270ab1SKenneth D. Merry * 15*ef270ab1SKenneth D. Merry * 3. Neither the name of the copyright holder nor the names of its contributors 16*ef270ab1SKenneth D. Merry * may be used to endorse or promote products derived from this software 17*ef270ab1SKenneth D. Merry * without specific prior written permission. 18*ef270ab1SKenneth D. Merry * 19*ef270ab1SKenneth D. Merry * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20*ef270ab1SKenneth D. Merry * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21*ef270ab1SKenneth D. Merry * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22*ef270ab1SKenneth D. Merry * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23*ef270ab1SKenneth D. Merry * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24*ef270ab1SKenneth D. Merry * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25*ef270ab1SKenneth D. Merry * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26*ef270ab1SKenneth D. Merry * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27*ef270ab1SKenneth D. Merry * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28*ef270ab1SKenneth D. Merry * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29*ef270ab1SKenneth D. Merry * POSSIBILITY OF SUCH DAMAGE. 30*ef270ab1SKenneth D. Merry */ 31*ef270ab1SKenneth D. Merry 32*ef270ab1SKenneth D. Merry /** 33*ef270ab1SKenneth D. Merry * @file 34*ef270ab1SKenneth D. Merry * Generic state machine framework declarations. 35*ef270ab1SKenneth D. Merry */ 36*ef270ab1SKenneth D. Merry 37*ef270ab1SKenneth D. Merry #ifndef _OCS_SM_H 38*ef270ab1SKenneth D. Merry #define _OCS_SM_H 39*ef270ab1SKenneth D. Merry 40*ef270ab1SKenneth D. Merry /** 41*ef270ab1SKenneth D. Merry * State Machine (SM) IDs. 42*ef270ab1SKenneth D. Merry */ 43*ef270ab1SKenneth D. Merry enum { 44*ef270ab1SKenneth D. Merry OCS_SM_COMMON = 0, 45*ef270ab1SKenneth D. Merry OCS_SM_DOMAIN, 46*ef270ab1SKenneth D. Merry OCS_SM_PORT, 47*ef270ab1SKenneth D. Merry OCS_SM_LOGIN, 48*ef270ab1SKenneth D. Merry OCS_SM_LAST 49*ef270ab1SKenneth D. Merry }; 50*ef270ab1SKenneth D. Merry 51*ef270ab1SKenneth D. Merry #define OCS_SM_EVENT_SHIFT 24 52*ef270ab1SKenneth D. Merry #define OCS_SM_EVENT_START(id) ((id) << OCS_SM_EVENT_SHIFT) 53*ef270ab1SKenneth D. Merry 54*ef270ab1SKenneth D. Merry extern const char *ocs_sm_id[]; /**< String format of the above enums. */ 55*ef270ab1SKenneth D. Merry 56*ef270ab1SKenneth D. Merry /** 57*ef270ab1SKenneth D. Merry * State Machine events. 58*ef270ab1SKenneth D. Merry */ 59*ef270ab1SKenneth D. Merry typedef enum { 60*ef270ab1SKenneth D. Merry /* Common Events */ 61*ef270ab1SKenneth D. Merry OCS_EVT_ENTER = OCS_SM_EVENT_START(OCS_SM_COMMON), 62*ef270ab1SKenneth D. Merry OCS_EVT_REENTER, 63*ef270ab1SKenneth D. Merry OCS_EVT_EXIT, 64*ef270ab1SKenneth D. Merry OCS_EVT_SHUTDOWN, 65*ef270ab1SKenneth D. Merry OCS_EVT_ALL_CHILD_NODES_FREE, 66*ef270ab1SKenneth D. Merry OCS_EVT_RESUME, 67*ef270ab1SKenneth D. Merry OCS_EVT_TIMER_EXPIRED, 68*ef270ab1SKenneth D. Merry 69*ef270ab1SKenneth D. Merry /* Domain Events */ 70*ef270ab1SKenneth D. Merry OCS_EVT_RESPONSE = OCS_SM_EVENT_START(OCS_SM_DOMAIN), 71*ef270ab1SKenneth D. Merry OCS_EVT_ERROR, 72*ef270ab1SKenneth D. Merry 73*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_FOUND, 74*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_ALLOC_OK, 75*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_ALLOC_FAIL, 76*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_REQ_ATTACH, 77*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_ATTACH_OK, 78*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_ATTACH_FAIL, 79*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_LOST, 80*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_FREE_OK, 81*ef270ab1SKenneth D. Merry OCS_EVT_DOMAIN_FREE_FAIL, 82*ef270ab1SKenneth D. Merry OCS_EVT_HW_DOMAIN_REQ_ATTACH, 83*ef270ab1SKenneth D. Merry OCS_EVT_HW_DOMAIN_REQ_FREE, 84*ef270ab1SKenneth D. Merry 85*ef270ab1SKenneth D. Merry /* Sport Events */ 86*ef270ab1SKenneth D. Merry OCS_EVT_SPORT_ALLOC_OK = OCS_SM_EVENT_START(OCS_SM_PORT), 87*ef270ab1SKenneth D. Merry OCS_EVT_SPORT_ALLOC_FAIL, 88*ef270ab1SKenneth D. Merry OCS_EVT_SPORT_ATTACH_OK, 89*ef270ab1SKenneth D. Merry OCS_EVT_SPORT_ATTACH_FAIL, 90*ef270ab1SKenneth D. Merry OCS_EVT_SPORT_FREE_OK, 91*ef270ab1SKenneth D. Merry OCS_EVT_SPORT_FREE_FAIL, 92*ef270ab1SKenneth D. Merry OCS_EVT_SPORT_TOPOLOGY_NOTIFY, 93*ef270ab1SKenneth D. Merry OCS_EVT_HW_PORT_ALLOC_OK, 94*ef270ab1SKenneth D. Merry OCS_EVT_HW_PORT_ALLOC_FAIL, 95*ef270ab1SKenneth D. Merry OCS_EVT_HW_PORT_ATTACH_OK, 96*ef270ab1SKenneth D. Merry OCS_EVT_HW_PORT_REQ_ATTACH, 97*ef270ab1SKenneth D. Merry OCS_EVT_HW_PORT_REQ_FREE, 98*ef270ab1SKenneth D. Merry OCS_EVT_HW_PORT_FREE_OK, 99*ef270ab1SKenneth D. Merry 100*ef270ab1SKenneth D. Merry /* Login Events */ 101*ef270ab1SKenneth D. Merry OCS_EVT_SRRS_ELS_REQ_OK = OCS_SM_EVENT_START(OCS_SM_LOGIN), 102*ef270ab1SKenneth D. Merry OCS_EVT_SRRS_ELS_CMPL_OK, 103*ef270ab1SKenneth D. Merry OCS_EVT_SRRS_ELS_REQ_FAIL, 104*ef270ab1SKenneth D. Merry OCS_EVT_SRRS_ELS_CMPL_FAIL, 105*ef270ab1SKenneth D. Merry OCS_EVT_SRRS_ELS_REQ_RJT, 106*ef270ab1SKenneth D. Merry OCS_EVT_NODE_ATTACH_OK, 107*ef270ab1SKenneth D. Merry OCS_EVT_NODE_ATTACH_FAIL, 108*ef270ab1SKenneth D. Merry OCS_EVT_NODE_FREE_OK, 109*ef270ab1SKenneth D. Merry OCS_EVT_NODE_FREE_FAIL, 110*ef270ab1SKenneth D. Merry OCS_EVT_ELS_FRAME, 111*ef270ab1SKenneth D. Merry OCS_EVT_ELS_REQ_TIMEOUT, 112*ef270ab1SKenneth D. Merry OCS_EVT_ELS_REQ_ABORTED, 113*ef270ab1SKenneth D. Merry OCS_EVT_ABORT_ELS, /**< request an ELS IO be aborted */ 114*ef270ab1SKenneth D. Merry OCS_EVT_ELS_ABORT_CMPL, /**< ELS abort process complete */ 115*ef270ab1SKenneth D. Merry 116*ef270ab1SKenneth D. Merry OCS_EVT_ABTS_RCVD, 117*ef270ab1SKenneth D. Merry 118*ef270ab1SKenneth D. Merry OCS_EVT_NODE_MISSING, /**< node is not in the GID_PT payload */ 119*ef270ab1SKenneth D. Merry OCS_EVT_NODE_REFOUND, /**< node is allocated and in the GID_PT payload */ 120*ef270ab1SKenneth D. Merry OCS_EVT_SHUTDOWN_IMPLICIT_LOGO, /**< node shutting down due to PLOGI recvd (implicit logo) */ 121*ef270ab1SKenneth D. Merry OCS_EVT_SHUTDOWN_EXPLICIT_LOGO, /**< node shutting down due to LOGO recvd/sent (explicit logo) */ 122*ef270ab1SKenneth D. Merry 123*ef270ab1SKenneth D. Merry OCS_EVT_PLOGI_RCVD, 124*ef270ab1SKenneth D. Merry OCS_EVT_FLOGI_RCVD, 125*ef270ab1SKenneth D. Merry OCS_EVT_LOGO_RCVD, 126*ef270ab1SKenneth D. Merry OCS_EVT_RRQ_RCVD, 127*ef270ab1SKenneth D. Merry OCS_EVT_PRLI_RCVD, 128*ef270ab1SKenneth D. Merry OCS_EVT_PRLO_RCVD, 129*ef270ab1SKenneth D. Merry OCS_EVT_PDISC_RCVD, 130*ef270ab1SKenneth D. Merry OCS_EVT_FDISC_RCVD, 131*ef270ab1SKenneth D. Merry OCS_EVT_ADISC_RCVD, 132*ef270ab1SKenneth D. Merry OCS_EVT_RSCN_RCVD, 133*ef270ab1SKenneth D. Merry OCS_EVT_SCR_RCVD, 134*ef270ab1SKenneth D. Merry OCS_EVT_ELS_RCVD, 135*ef270ab1SKenneth D. Merry 136*ef270ab1SKenneth D. Merry OCS_EVT_FCP_CMD_RCVD, 137*ef270ab1SKenneth D. Merry 138*ef270ab1SKenneth D. Merry /* Used by fabric emulation */ 139*ef270ab1SKenneth D. Merry OCS_EVT_RFT_ID_RCVD, 140*ef270ab1SKenneth D. Merry OCS_EVT_RFF_ID_RCVD, 141*ef270ab1SKenneth D. Merry OCS_EVT_GNN_ID_RCVD, 142*ef270ab1SKenneth D. Merry OCS_EVT_GPN_ID_RCVD, 143*ef270ab1SKenneth D. Merry OCS_EVT_GFPN_ID_RCVD, 144*ef270ab1SKenneth D. Merry OCS_EVT_GFF_ID_RCVD, 145*ef270ab1SKenneth D. Merry OCS_EVT_GID_FT_RCVD, 146*ef270ab1SKenneth D. Merry OCS_EVT_GID_PT_RCVD, 147*ef270ab1SKenneth D. Merry OCS_EVT_RPN_ID_RCVD, 148*ef270ab1SKenneth D. Merry OCS_EVT_RNN_ID_RCVD, 149*ef270ab1SKenneth D. Merry OCS_EVT_RCS_ID_RCVD, 150*ef270ab1SKenneth D. Merry OCS_EVT_RSNN_NN_RCVD, 151*ef270ab1SKenneth D. Merry OCS_EVT_RSPN_ID_RCVD, 152*ef270ab1SKenneth D. Merry OCS_EVT_RHBA_RCVD, 153*ef270ab1SKenneth D. Merry OCS_EVT_RPA_RCVD, 154*ef270ab1SKenneth D. Merry 155*ef270ab1SKenneth D. Merry OCS_EVT_GIDPT_DELAY_EXPIRED, 156*ef270ab1SKenneth D. Merry 157*ef270ab1SKenneth D. Merry /* SCSI Target Server events */ 158*ef270ab1SKenneth D. Merry OCS_EVT_ABORT_IO, 159*ef270ab1SKenneth D. Merry OCS_EVT_ABORT_IO_NO_RESP, 160*ef270ab1SKenneth D. Merry OCS_EVT_IO_CMPL, 161*ef270ab1SKenneth D. Merry OCS_EVT_IO_CMPL_ERRORS, 162*ef270ab1SKenneth D. Merry OCS_EVT_RESP_CMPL, 163*ef270ab1SKenneth D. Merry OCS_EVT_ABORT_CMPL, 164*ef270ab1SKenneth D. Merry OCS_EVT_NODE_ACTIVE_IO_LIST_EMPTY, 165*ef270ab1SKenneth D. Merry OCS_EVT_NODE_DEL_INI_COMPLETE, 166*ef270ab1SKenneth D. Merry OCS_EVT_NODE_DEL_TGT_COMPLETE, 167*ef270ab1SKenneth D. Merry OCS_EVT_IO_ABORTED_BY_TMF, 168*ef270ab1SKenneth D. Merry OCS_EVT_IO_ABORT_IGNORED, 169*ef270ab1SKenneth D. Merry OCS_EVT_IO_FIRST_BURST, 170*ef270ab1SKenneth D. Merry OCS_EVT_IO_FIRST_BURST_ERR, 171*ef270ab1SKenneth D. Merry OCS_EVT_IO_FIRST_BURST_ABORTED, 172*ef270ab1SKenneth D. Merry 173*ef270ab1SKenneth D. Merry /* Must be last */ 174*ef270ab1SKenneth D. Merry OCS_EVT_LAST 175*ef270ab1SKenneth D. Merry } ocs_sm_event_t; 176*ef270ab1SKenneth D. Merry 177*ef270ab1SKenneth D. Merry /* Declare ocs_sm_ctx_s */ 178*ef270ab1SKenneth D. Merry typedef struct ocs_sm_ctx_s ocs_sm_ctx_t; 179*ef270ab1SKenneth D. Merry 180*ef270ab1SKenneth D. Merry /* State machine state function */ 181*ef270ab1SKenneth D. Merry typedef void *(*ocs_sm_function_t)(ocs_sm_ctx_t *, ocs_sm_event_t, void *); 182*ef270ab1SKenneth D. Merry 183*ef270ab1SKenneth D. Merry /* State machine context header */ 184*ef270ab1SKenneth D. Merry struct ocs_sm_ctx_s { 185*ef270ab1SKenneth D. Merry ocs_sm_function_t current_state; 186*ef270ab1SKenneth D. Merry const char *description; 187*ef270ab1SKenneth D. Merry void *app; /** Application-specific handle. */ 188*ef270ab1SKenneth D. Merry }; 189*ef270ab1SKenneth D. Merry 190*ef270ab1SKenneth D. Merry extern int ocs_sm_post_event(ocs_sm_ctx_t *, ocs_sm_event_t, void *); 191*ef270ab1SKenneth D. Merry extern void ocs_sm_transition(ocs_sm_ctx_t *, ocs_sm_function_t, void *); 192*ef270ab1SKenneth D. Merry extern void ocs_sm_disable(ocs_sm_ctx_t *ctx); 193*ef270ab1SKenneth D. Merry extern const char *ocs_sm_event_name(ocs_sm_event_t evt); 194*ef270ab1SKenneth D. Merry 195*ef270ab1SKenneth D. Merry #if 0 196*ef270ab1SKenneth D. Merry #define smtrace(sm) ocs_log_debug(NULL, "%s: %-20s --> %s\n", sm, ocs_sm_event_name(evt), __func__) 197*ef270ab1SKenneth D. Merry #else 198*ef270ab1SKenneth D. Merry #define smtrace(...) 199*ef270ab1SKenneth D. Merry #endif 200*ef270ab1SKenneth D. Merry 201*ef270ab1SKenneth D. Merry #endif /* ! _OCS_SM_H */ 202