1331766Sken/*- 2331766Sken * Copyright (c) 2017 Broadcom. All rights reserved. 3331766Sken * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries. 4331766Sken * 5331766Sken * Redistribution and use in source and binary forms, with or without 6331766Sken * modification, are permitted provided that the following conditions are met: 7331766Sken * 8331766Sken * 1. Redistributions of source code must retain the above copyright notice, 9331766Sken * this list of conditions and the following disclaimer. 10331766Sken * 11331766Sken * 2. Redistributions in binary form must reproduce the above copyright notice, 12331766Sken * this list of conditions and the following disclaimer in the documentation 13331766Sken * and/or other materials provided with the distribution. 14331766Sken * 15331766Sken * 3. Neither the name of the copyright holder nor the names of its contributors 16331766Sken * may be used to endorse or promote products derived from this software 17331766Sken * without specific prior written permission. 18331766Sken * 19331766Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20331766Sken * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21331766Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22331766Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23331766Sken * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24331766Sken * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25331766Sken * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26331766Sken * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27331766Sken * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28331766Sken * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29331766Sken * POSSIBILITY OF SUCH DAMAGE. 30331766Sken * 31331766Sken * $FreeBSD: stable/11/sys/dev/ocs_fc/ocs_sm.c 331766 2018-03-30 15:28:25Z ken $ 32331766Sken */ 33331766Sken 34331766Sken/** 35331766Sken * @file 36331766Sken * Generic state machine framework. 37331766Sken */ 38331766Sken 39331766Sken#include "ocs_os.h" 40331766Sken#include "ocs_sm.h" 41331766Sken 42331766Skenconst char *ocs_sm_id[] = { 43331766Sken "common", 44331766Sken "domain", 45331766Sken "login" 46331766Sken}; 47331766Sken 48331766Sken/** 49331766Sken * @brief Post an event to a context. 50331766Sken * 51331766Sken * @param ctx State machine context 52331766Sken * @param evt Event to post 53331766Sken * @param data Event-specific data (if any) 54331766Sken * 55331766Sken * @return 0 if successfully posted event; -1 if state machine 56331766Sken * is disabled 57331766Sken */ 58331766Skenint 59331766Skenocs_sm_post_event(ocs_sm_ctx_t *ctx, ocs_sm_event_t evt, void *data) 60331766Sken{ 61331766Sken if (ctx->current_state) { 62331766Sken ctx->current_state(ctx, evt, data); 63331766Sken return 0; 64331766Sken } else { 65331766Sken return -1; 66331766Sken } 67331766Sken} 68331766Sken 69331766Sken/** 70331766Sken * @brief Transition to a new state. 71331766Sken */ 72331766Skenvoid 73331766Skenocs_sm_transition(ocs_sm_ctx_t *ctx, ocs_sm_function_t state, void *data) 74331766Sken{ 75331766Sken if (ctx->current_state == state) { 76331766Sken ocs_sm_post_event(ctx, OCS_EVT_REENTER, data); 77331766Sken } else { 78331766Sken ocs_sm_post_event(ctx, OCS_EVT_EXIT, data); 79331766Sken ctx->current_state = state; 80331766Sken ocs_sm_post_event(ctx, OCS_EVT_ENTER, data); 81331766Sken } 82331766Sken} 83331766Sken 84331766Sken/** 85331766Sken * @brief Disable further state machine processing. 86331766Sken */ 87331766Skenvoid 88331766Skenocs_sm_disable(ocs_sm_ctx_t *ctx) 89331766Sken{ 90331766Sken ctx->current_state = NULL; 91331766Sken} 92331766Sken 93331766Skenconst char *ocs_sm_event_name(ocs_sm_event_t evt) 94331766Sken{ 95331766Sken switch (evt) { 96331766Sken #define RETEVT(x) case x: return #x; 97331766Sken RETEVT(OCS_EVT_ENTER) 98331766Sken RETEVT(OCS_EVT_REENTER) 99331766Sken RETEVT(OCS_EVT_EXIT) 100331766Sken RETEVT(OCS_EVT_SHUTDOWN) 101331766Sken RETEVT(OCS_EVT_RESPONSE) 102331766Sken RETEVT(OCS_EVT_RESUME) 103331766Sken RETEVT(OCS_EVT_TIMER_EXPIRED) 104331766Sken RETEVT(OCS_EVT_ERROR) 105331766Sken RETEVT(OCS_EVT_SRRS_ELS_REQ_OK) 106331766Sken RETEVT(OCS_EVT_SRRS_ELS_CMPL_OK) 107331766Sken RETEVT(OCS_EVT_SRRS_ELS_REQ_FAIL) 108331766Sken RETEVT(OCS_EVT_SRRS_ELS_CMPL_FAIL) 109331766Sken RETEVT(OCS_EVT_SRRS_ELS_REQ_RJT) 110331766Sken RETEVT(OCS_EVT_NODE_ATTACH_OK) 111331766Sken RETEVT(OCS_EVT_NODE_ATTACH_FAIL) 112331766Sken RETEVT(OCS_EVT_NODE_FREE_OK) 113331766Sken RETEVT(OCS_EVT_ELS_REQ_TIMEOUT) 114331766Sken RETEVT(OCS_EVT_ELS_REQ_ABORTED) 115331766Sken RETEVT(OCS_EVT_ABORT_ELS) 116331766Sken RETEVT(OCS_EVT_ELS_ABORT_CMPL) 117331766Sken 118331766Sken RETEVT(OCS_EVT_DOMAIN_FOUND) 119331766Sken RETEVT(OCS_EVT_DOMAIN_ALLOC_OK) 120331766Sken RETEVT(OCS_EVT_DOMAIN_ALLOC_FAIL) 121331766Sken RETEVT(OCS_EVT_DOMAIN_REQ_ATTACH) 122331766Sken RETEVT(OCS_EVT_DOMAIN_ATTACH_OK) 123331766Sken RETEVT(OCS_EVT_DOMAIN_ATTACH_FAIL) 124331766Sken RETEVT(OCS_EVT_DOMAIN_LOST) 125331766Sken RETEVT(OCS_EVT_DOMAIN_FREE_OK) 126331766Sken RETEVT(OCS_EVT_DOMAIN_FREE_FAIL) 127331766Sken RETEVT(OCS_EVT_HW_DOMAIN_REQ_ATTACH) 128331766Sken RETEVT(OCS_EVT_HW_DOMAIN_REQ_FREE) 129331766Sken RETEVT(OCS_EVT_ALL_CHILD_NODES_FREE) 130331766Sken 131331766Sken RETEVT(OCS_EVT_SPORT_ALLOC_OK) 132331766Sken RETEVT(OCS_EVT_SPORT_ALLOC_FAIL) 133331766Sken RETEVT(OCS_EVT_SPORT_ATTACH_OK) 134331766Sken RETEVT(OCS_EVT_SPORT_ATTACH_FAIL) 135331766Sken RETEVT(OCS_EVT_SPORT_FREE_OK) 136331766Sken RETEVT(OCS_EVT_SPORT_FREE_FAIL) 137331766Sken RETEVT(OCS_EVT_SPORT_TOPOLOGY_NOTIFY) 138331766Sken RETEVT(OCS_EVT_HW_PORT_ALLOC_OK) 139331766Sken RETEVT(OCS_EVT_HW_PORT_ALLOC_FAIL) 140331766Sken RETEVT(OCS_EVT_HW_PORT_ATTACH_OK) 141331766Sken RETEVT(OCS_EVT_HW_PORT_REQ_ATTACH) 142331766Sken RETEVT(OCS_EVT_HW_PORT_REQ_FREE) 143331766Sken RETEVT(OCS_EVT_HW_PORT_FREE_OK) 144331766Sken 145331766Sken RETEVT(OCS_EVT_NODE_FREE_FAIL) 146331766Sken 147331766Sken RETEVT(OCS_EVT_ABTS_RCVD) 148331766Sken 149331766Sken RETEVT(OCS_EVT_NODE_MISSING) 150331766Sken RETEVT(OCS_EVT_NODE_REFOUND) 151331766Sken RETEVT(OCS_EVT_SHUTDOWN_IMPLICIT_LOGO) 152331766Sken RETEVT(OCS_EVT_SHUTDOWN_EXPLICIT_LOGO) 153331766Sken 154331766Sken RETEVT(OCS_EVT_ELS_FRAME) 155331766Sken RETEVT(OCS_EVT_PLOGI_RCVD) 156331766Sken RETEVT(OCS_EVT_FLOGI_RCVD) 157331766Sken RETEVT(OCS_EVT_LOGO_RCVD) 158331766Sken RETEVT(OCS_EVT_PRLI_RCVD) 159331766Sken RETEVT(OCS_EVT_PRLO_RCVD) 160331766Sken RETEVT(OCS_EVT_PDISC_RCVD) 161331766Sken RETEVT(OCS_EVT_FDISC_RCVD) 162331766Sken RETEVT(OCS_EVT_ADISC_RCVD) 163331766Sken RETEVT(OCS_EVT_RSCN_RCVD) 164331766Sken RETEVT(OCS_EVT_SCR_RCVD) 165331766Sken RETEVT(OCS_EVT_ELS_RCVD) 166331766Sken RETEVT(OCS_EVT_LAST) 167331766Sken RETEVT(OCS_EVT_FCP_CMD_RCVD) 168331766Sken 169331766Sken RETEVT(OCS_EVT_RFT_ID_RCVD) 170331766Sken RETEVT(OCS_EVT_RFF_ID_RCVD) 171331766Sken RETEVT(OCS_EVT_GNN_ID_RCVD) 172331766Sken RETEVT(OCS_EVT_GPN_ID_RCVD) 173331766Sken RETEVT(OCS_EVT_GFPN_ID_RCVD) 174331766Sken RETEVT(OCS_EVT_GFF_ID_RCVD) 175331766Sken RETEVT(OCS_EVT_GID_FT_RCVD) 176331766Sken RETEVT(OCS_EVT_GID_PT_RCVD) 177331766Sken RETEVT(OCS_EVT_RPN_ID_RCVD) 178331766Sken RETEVT(OCS_EVT_RNN_ID_RCVD) 179331766Sken RETEVT(OCS_EVT_RCS_ID_RCVD) 180331766Sken RETEVT(OCS_EVT_RSNN_NN_RCVD) 181331766Sken RETEVT(OCS_EVT_RSPN_ID_RCVD) 182331766Sken RETEVT(OCS_EVT_RHBA_RCVD) 183331766Sken RETEVT(OCS_EVT_RPA_RCVD) 184331766Sken 185331766Sken RETEVT(OCS_EVT_GIDPT_DELAY_EXPIRED) 186331766Sken 187331766Sken RETEVT(OCS_EVT_ABORT_IO) 188331766Sken RETEVT(OCS_EVT_ABORT_IO_NO_RESP) 189331766Sken RETEVT(OCS_EVT_IO_CMPL) 190331766Sken RETEVT(OCS_EVT_IO_CMPL_ERRORS) 191331766Sken RETEVT(OCS_EVT_RESP_CMPL) 192331766Sken RETEVT(OCS_EVT_ABORT_CMPL) 193331766Sken RETEVT(OCS_EVT_NODE_ACTIVE_IO_LIST_EMPTY) 194331766Sken RETEVT(OCS_EVT_NODE_DEL_INI_COMPLETE) 195331766Sken RETEVT(OCS_EVT_NODE_DEL_TGT_COMPLETE) 196331766Sken RETEVT(OCS_EVT_IO_ABORTED_BY_TMF) 197331766Sken RETEVT(OCS_EVT_IO_ABORT_IGNORED) 198331766Sken RETEVT(OCS_EVT_IO_FIRST_BURST) 199331766Sken RETEVT(OCS_EVT_IO_FIRST_BURST_ERR) 200331766Sken RETEVT(OCS_EVT_IO_FIRST_BURST_ABORTED) 201331766Sken 202331766Sken default: 203331766Sken break; 204331766Sken #undef RETEVT 205331766Sken } 206331766Sken return "unknown"; 207331766Sken} 208