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.h 331766 2018-03-30 15:28:25Z ken $ 32331766Sken */ 33331766Sken 34331766Sken/** 35331766Sken * @file 36331766Sken * Generic state machine framework declarations. 37331766Sken */ 38331766Sken 39331766Sken#ifndef _OCS_SM_H 40331766Sken#define _OCS_SM_H 41331766Sken 42331766Sken/** 43331766Sken * State Machine (SM) IDs. 44331766Sken */ 45331766Skenenum { 46331766Sken OCS_SM_COMMON = 0, 47331766Sken OCS_SM_DOMAIN, 48331766Sken OCS_SM_PORT, 49331766Sken OCS_SM_LOGIN, 50331766Sken OCS_SM_LAST 51331766Sken}; 52331766Sken 53331766Sken#define OCS_SM_EVENT_SHIFT 24 54331766Sken#define OCS_SM_EVENT_START(id) ((id) << OCS_SM_EVENT_SHIFT) 55331766Sken 56331766Skenextern const char *ocs_sm_id[]; /**< String format of the above enums. */ 57331766Sken 58331766Sken/** 59331766Sken * State Machine events. 60331766Sken */ 61331766Skentypedef enum { 62331766Sken /* Common Events */ 63331766Sken OCS_EVT_ENTER = OCS_SM_EVENT_START(OCS_SM_COMMON), 64331766Sken OCS_EVT_REENTER, 65331766Sken OCS_EVT_EXIT, 66331766Sken OCS_EVT_SHUTDOWN, 67331766Sken OCS_EVT_ALL_CHILD_NODES_FREE, 68331766Sken OCS_EVT_RESUME, 69331766Sken OCS_EVT_TIMER_EXPIRED, 70331766Sken 71331766Sken /* Domain Events */ 72331766Sken OCS_EVT_RESPONSE = OCS_SM_EVENT_START(OCS_SM_DOMAIN), 73331766Sken OCS_EVT_ERROR, 74331766Sken 75331766Sken OCS_EVT_DOMAIN_FOUND, 76331766Sken OCS_EVT_DOMAIN_ALLOC_OK, 77331766Sken OCS_EVT_DOMAIN_ALLOC_FAIL, 78331766Sken OCS_EVT_DOMAIN_REQ_ATTACH, 79331766Sken OCS_EVT_DOMAIN_ATTACH_OK, 80331766Sken OCS_EVT_DOMAIN_ATTACH_FAIL, 81331766Sken OCS_EVT_DOMAIN_LOST, 82331766Sken OCS_EVT_DOMAIN_FREE_OK, 83331766Sken OCS_EVT_DOMAIN_FREE_FAIL, 84331766Sken OCS_EVT_HW_DOMAIN_REQ_ATTACH, 85331766Sken OCS_EVT_HW_DOMAIN_REQ_FREE, 86331766Sken 87331766Sken /* Sport Events */ 88331766Sken OCS_EVT_SPORT_ALLOC_OK = OCS_SM_EVENT_START(OCS_SM_PORT), 89331766Sken OCS_EVT_SPORT_ALLOC_FAIL, 90331766Sken OCS_EVT_SPORT_ATTACH_OK, 91331766Sken OCS_EVT_SPORT_ATTACH_FAIL, 92331766Sken OCS_EVT_SPORT_FREE_OK, 93331766Sken OCS_EVT_SPORT_FREE_FAIL, 94331766Sken OCS_EVT_SPORT_TOPOLOGY_NOTIFY, 95331766Sken OCS_EVT_HW_PORT_ALLOC_OK, 96331766Sken OCS_EVT_HW_PORT_ALLOC_FAIL, 97331766Sken OCS_EVT_HW_PORT_ATTACH_OK, 98331766Sken OCS_EVT_HW_PORT_REQ_ATTACH, 99331766Sken OCS_EVT_HW_PORT_REQ_FREE, 100331766Sken OCS_EVT_HW_PORT_FREE_OK, 101331766Sken 102331766Sken /* Login Events */ 103331766Sken OCS_EVT_SRRS_ELS_REQ_OK = OCS_SM_EVENT_START(OCS_SM_LOGIN), 104331766Sken OCS_EVT_SRRS_ELS_CMPL_OK, 105331766Sken OCS_EVT_SRRS_ELS_REQ_FAIL, 106331766Sken OCS_EVT_SRRS_ELS_CMPL_FAIL, 107331766Sken OCS_EVT_SRRS_ELS_REQ_RJT, 108331766Sken OCS_EVT_NODE_ATTACH_OK, 109331766Sken OCS_EVT_NODE_ATTACH_FAIL, 110331766Sken OCS_EVT_NODE_FREE_OK, 111331766Sken OCS_EVT_NODE_FREE_FAIL, 112331766Sken OCS_EVT_ELS_FRAME, 113331766Sken OCS_EVT_ELS_REQ_TIMEOUT, 114331766Sken OCS_EVT_ELS_REQ_ABORTED, 115331766Sken OCS_EVT_ABORT_ELS, /**< request an ELS IO be aborted */ 116331766Sken OCS_EVT_ELS_ABORT_CMPL, /**< ELS abort process complete */ 117331766Sken 118331766Sken OCS_EVT_ABTS_RCVD, 119331766Sken 120331766Sken OCS_EVT_NODE_MISSING, /**< node is not in the GID_PT payload */ 121331766Sken OCS_EVT_NODE_REFOUND, /**< node is allocated and in the GID_PT payload */ 122331766Sken OCS_EVT_SHUTDOWN_IMPLICIT_LOGO, /**< node shutting down due to PLOGI recvd (implicit logo) */ 123331766Sken OCS_EVT_SHUTDOWN_EXPLICIT_LOGO, /**< node shutting down due to LOGO recvd/sent (explicit logo) */ 124331766Sken 125331766Sken OCS_EVT_PLOGI_RCVD, 126331766Sken OCS_EVT_FLOGI_RCVD, 127331766Sken OCS_EVT_LOGO_RCVD, 128331766Sken OCS_EVT_RRQ_RCVD, 129331766Sken OCS_EVT_PRLI_RCVD, 130331766Sken OCS_EVT_PRLO_RCVD, 131331766Sken OCS_EVT_PDISC_RCVD, 132331766Sken OCS_EVT_FDISC_RCVD, 133331766Sken OCS_EVT_ADISC_RCVD, 134331766Sken OCS_EVT_RSCN_RCVD, 135331766Sken OCS_EVT_SCR_RCVD, 136331766Sken OCS_EVT_ELS_RCVD, 137331766Sken 138331766Sken OCS_EVT_FCP_CMD_RCVD, 139331766Sken 140331766Sken /* Used by fabric emulation */ 141331766Sken OCS_EVT_RFT_ID_RCVD, 142331766Sken OCS_EVT_RFF_ID_RCVD, 143331766Sken OCS_EVT_GNN_ID_RCVD, 144331766Sken OCS_EVT_GPN_ID_RCVD, 145331766Sken OCS_EVT_GFPN_ID_RCVD, 146331766Sken OCS_EVT_GFF_ID_RCVD, 147331766Sken OCS_EVT_GID_FT_RCVD, 148331766Sken OCS_EVT_GID_PT_RCVD, 149331766Sken OCS_EVT_RPN_ID_RCVD, 150331766Sken OCS_EVT_RNN_ID_RCVD, 151331766Sken OCS_EVT_RCS_ID_RCVD, 152331766Sken OCS_EVT_RSNN_NN_RCVD, 153331766Sken OCS_EVT_RSPN_ID_RCVD, 154331766Sken OCS_EVT_RHBA_RCVD, 155331766Sken OCS_EVT_RPA_RCVD, 156331766Sken 157331766Sken OCS_EVT_GIDPT_DELAY_EXPIRED, 158331766Sken 159331766Sken /* SCSI Target Server events */ 160331766Sken OCS_EVT_ABORT_IO, 161331766Sken OCS_EVT_ABORT_IO_NO_RESP, 162331766Sken OCS_EVT_IO_CMPL, 163331766Sken OCS_EVT_IO_CMPL_ERRORS, 164331766Sken OCS_EVT_RESP_CMPL, 165331766Sken OCS_EVT_ABORT_CMPL, 166331766Sken OCS_EVT_NODE_ACTIVE_IO_LIST_EMPTY, 167331766Sken OCS_EVT_NODE_DEL_INI_COMPLETE, 168331766Sken OCS_EVT_NODE_DEL_TGT_COMPLETE, 169331766Sken OCS_EVT_IO_ABORTED_BY_TMF, 170331766Sken OCS_EVT_IO_ABORT_IGNORED, 171331766Sken OCS_EVT_IO_FIRST_BURST, 172331766Sken OCS_EVT_IO_FIRST_BURST_ERR, 173331766Sken OCS_EVT_IO_FIRST_BURST_ABORTED, 174331766Sken 175331766Sken /* Must be last */ 176331766Sken OCS_EVT_LAST 177331766Sken} ocs_sm_event_t; 178331766Sken 179331766Sken/* Declare ocs_sm_ctx_s */ 180331766Skentypedef struct ocs_sm_ctx_s ocs_sm_ctx_t; 181331766Sken 182331766Sken/* State machine state function */ 183331766Skentypedef void *(*ocs_sm_function_t)(ocs_sm_ctx_t *, ocs_sm_event_t, void *); 184331766Sken 185331766Sken/* State machine context header */ 186331766Skenstruct ocs_sm_ctx_s { 187331766Sken ocs_sm_function_t current_state; 188331766Sken const char *description; 189331766Sken void *app; /** Application-specific handle. */ 190331766Sken}; 191331766Sken 192331766Skenextern int ocs_sm_post_event(ocs_sm_ctx_t *, ocs_sm_event_t, void *); 193331766Skenextern void ocs_sm_transition(ocs_sm_ctx_t *, ocs_sm_function_t, void *); 194331766Skenextern void ocs_sm_disable(ocs_sm_ctx_t *ctx); 195331766Skenextern const char *ocs_sm_event_name(ocs_sm_event_t evt); 196331766Sken 197331766Sken#if 0 198331766Sken#define smtrace(sm) ocs_log_debug(NULL, "%s: %-20s --> %s\n", sm, ocs_sm_event_name(evt), __func__) 199331766Sken#else 200331766Sken#define smtrace(...) 201331766Sken#endif 202331766Sken 203331766Sken#endif /* ! _OCS_SM_H */ 204