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 * $FreeBSD$ 32*ef270ab1SKenneth D. Merry */ 33*ef270ab1SKenneth D. Merry 34*ef270ab1SKenneth D. Merry /** 35*ef270ab1SKenneth D. Merry * @file 36*ef270ab1SKenneth D. Merry * Generic state machine framework. 37*ef270ab1SKenneth D. Merry */ 38*ef270ab1SKenneth D. Merry 39*ef270ab1SKenneth D. Merry #include "ocs_os.h" 40*ef270ab1SKenneth D. Merry #include "ocs_sm.h" 41*ef270ab1SKenneth D. Merry 42*ef270ab1SKenneth D. Merry const char *ocs_sm_id[] = { 43*ef270ab1SKenneth D. Merry "common", 44*ef270ab1SKenneth D. Merry "domain", 45*ef270ab1SKenneth D. Merry "login" 46*ef270ab1SKenneth D. Merry }; 47*ef270ab1SKenneth D. Merry 48*ef270ab1SKenneth D. Merry /** 49*ef270ab1SKenneth D. Merry * @brief Post an event to a context. 50*ef270ab1SKenneth D. Merry * 51*ef270ab1SKenneth D. Merry * @param ctx State machine context 52*ef270ab1SKenneth D. Merry * @param evt Event to post 53*ef270ab1SKenneth D. Merry * @param data Event-specific data (if any) 54*ef270ab1SKenneth D. Merry * 55*ef270ab1SKenneth D. Merry * @return 0 if successfully posted event; -1 if state machine 56*ef270ab1SKenneth D. Merry * is disabled 57*ef270ab1SKenneth D. Merry */ 58*ef270ab1SKenneth D. Merry int 59*ef270ab1SKenneth D. Merry ocs_sm_post_event(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *data) 60*ef270ab1SKenneth D. Merry { 61*ef270ab1SKenneth D. Merry if (ctx->current_state) { 62*ef270ab1SKenneth D. Merry ctx->current_state(ctx, evt, data); 63*ef270ab1SKenneth D. Merry return 0; 64*ef270ab1SKenneth D. Merry } else { 65*ef270ab1SKenneth D. Merry return -1; 66*ef270ab1SKenneth D. Merry } 67*ef270ab1SKenneth D. Merry } 68*ef270ab1SKenneth D. Merry 69*ef270ab1SKenneth D. Merry /** 70*ef270ab1SKenneth D. Merry * @brief Transition to a new state. 71*ef270ab1SKenneth D. Merry */ 72*ef270ab1SKenneth D. Merry void 73*ef270ab1SKenneth D. Merry ocs_sm_transition(ocs_sm_ctx_t *ctx, ocs_sm_function_t state, void *data) 74*ef270ab1SKenneth D. Merry { 75*ef270ab1SKenneth D. Merry if (ctx->current_state == state) { 76*ef270ab1SKenneth D. Merry ocs_sm_post_event(ctx, OCS_EVT_REENTER, data); 77*ef270ab1SKenneth D. Merry } else { 78*ef270ab1SKenneth D. Merry ocs_sm_post_event(ctx, OCS_EVT_EXIT, data); 79*ef270ab1SKenneth D. Merry ctx->current_state = state; 80*ef270ab1SKenneth D. Merry ocs_sm_post_event(ctx, OCS_EVT_ENTER, data); 81*ef270ab1SKenneth D. Merry } 82*ef270ab1SKenneth D. Merry } 83*ef270ab1SKenneth D. Merry 84*ef270ab1SKenneth D. Merry /** 85*ef270ab1SKenneth D. Merry * @brief Disable further state machine processing. 86*ef270ab1SKenneth D. Merry */ 87*ef270ab1SKenneth D. Merry void 88*ef270ab1SKenneth D. Merry ocs_sm_disable(ocs_sm_ctx_t *ctx) 89*ef270ab1SKenneth D. Merry { 90*ef270ab1SKenneth D. Merry ctx->current_state = NULL; 91*ef270ab1SKenneth D. Merry } 92*ef270ab1SKenneth D. Merry 93*ef270ab1SKenneth D. Merry const char *ocs_sm_event_name(ocs_sm_event_t evt) 94*ef270ab1SKenneth D. Merry { 95*ef270ab1SKenneth D. Merry switch (evt) { 96*ef270ab1SKenneth D. Merry #define RETEVT(x) case x: return #x; 97*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ENTER) 98*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_REENTER) 99*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_EXIT) 100*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SHUTDOWN) 101*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RESPONSE) 102*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RESUME) 103*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_TIMER_EXPIRED) 104*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ERROR) 105*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SRRS_ELS_REQ_OK) 106*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SRRS_ELS_CMPL_OK) 107*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SRRS_ELS_REQ_FAIL) 108*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SRRS_ELS_CMPL_FAIL) 109*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SRRS_ELS_REQ_RJT) 110*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_ATTACH_OK) 111*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_ATTACH_FAIL) 112*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_FREE_OK) 113*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ELS_REQ_TIMEOUT) 114*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ELS_REQ_ABORTED) 115*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ABORT_ELS) 116*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ELS_ABORT_CMPL) 117*ef270ab1SKenneth D. Merry 118*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_FOUND) 119*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_ALLOC_OK) 120*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_ALLOC_FAIL) 121*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_REQ_ATTACH) 122*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_ATTACH_OK) 123*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_ATTACH_FAIL) 124*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_LOST) 125*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_FREE_OK) 126*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_DOMAIN_FREE_FAIL) 127*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_DOMAIN_REQ_ATTACH) 128*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_DOMAIN_REQ_FREE) 129*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ALL_CHILD_NODES_FREE) 130*ef270ab1SKenneth D. Merry 131*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SPORT_ALLOC_OK) 132*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SPORT_ALLOC_FAIL) 133*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SPORT_ATTACH_OK) 134*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SPORT_ATTACH_FAIL) 135*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SPORT_FREE_OK) 136*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SPORT_FREE_FAIL) 137*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SPORT_TOPOLOGY_NOTIFY) 138*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_PORT_ALLOC_OK) 139*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_PORT_ALLOC_FAIL) 140*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_PORT_ATTACH_OK) 141*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_PORT_REQ_ATTACH) 142*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_PORT_REQ_FREE) 143*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_HW_PORT_FREE_OK) 144*ef270ab1SKenneth D. Merry 145*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_FREE_FAIL) 146*ef270ab1SKenneth D. Merry 147*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ABTS_RCVD) 148*ef270ab1SKenneth D. Merry 149*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_MISSING) 150*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_REFOUND) 151*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SHUTDOWN_IMPLICIT_LOGO) 152*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SHUTDOWN_EXPLICIT_LOGO) 153*ef270ab1SKenneth D. Merry 154*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ELS_FRAME) 155*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_PLOGI_RCVD) 156*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_FLOGI_RCVD) 157*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_LOGO_RCVD) 158*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_PRLI_RCVD) 159*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_PRLO_RCVD) 160*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_PDISC_RCVD) 161*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_FDISC_RCVD) 162*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ADISC_RCVD) 163*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RSCN_RCVD) 164*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_SCR_RCVD) 165*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ELS_RCVD) 166*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_LAST) 167*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_FCP_CMD_RCVD) 168*ef270ab1SKenneth D. Merry 169*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RFT_ID_RCVD) 170*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RFF_ID_RCVD) 171*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_GNN_ID_RCVD) 172*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_GPN_ID_RCVD) 173*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_GFPN_ID_RCVD) 174*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_GFF_ID_RCVD) 175*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_GID_FT_RCVD) 176*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_GID_PT_RCVD) 177*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RPN_ID_RCVD) 178*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RNN_ID_RCVD) 179*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RCS_ID_RCVD) 180*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RSNN_NN_RCVD) 181*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RSPN_ID_RCVD) 182*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RHBA_RCVD) 183*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RPA_RCVD) 184*ef270ab1SKenneth D. Merry 185*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_GIDPT_DELAY_EXPIRED) 186*ef270ab1SKenneth D. Merry 187*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ABORT_IO) 188*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ABORT_IO_NO_RESP) 189*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_IO_CMPL) 190*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_IO_CMPL_ERRORS) 191*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_RESP_CMPL) 192*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_ABORT_CMPL) 193*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_ACTIVE_IO_LIST_EMPTY) 194*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_DEL_INI_COMPLETE) 195*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_NODE_DEL_TGT_COMPLETE) 196*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_IO_ABORTED_BY_TMF) 197*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_IO_ABORT_IGNORED) 198*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_IO_FIRST_BURST) 199*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_IO_FIRST_BURST_ERR) 200*ef270ab1SKenneth D. Merry RETEVT(OCS_EVT_IO_FIRST_BURST_ABORTED) 201*ef270ab1SKenneth D. Merry 202*ef270ab1SKenneth D. Merry default: 203*ef270ab1SKenneth D. Merry break; 204*ef270ab1SKenneth D. Merry #undef RETEVT 205*ef270ab1SKenneth D. Merry } 206*ef270ab1SKenneth D. Merry return "unknown"; 207*ef270ab1SKenneth D. Merry } 208