15aa09c48SJames Smart /* SPDX-License-Identifier: GPL-2.0 */ 25aa09c48SJames Smart /* 35aa09c48SJames Smart * Copyright (C) 2021 Broadcom. All Rights Reserved. The term 45aa09c48SJames Smart * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 55aa09c48SJames Smart * 65aa09c48SJames Smart */ 75aa09c48SJames Smart 85aa09c48SJames Smart /** 95aa09c48SJames Smart * Generic state machine framework declarations. 105aa09c48SJames Smart */ 115aa09c48SJames Smart 125aa09c48SJames Smart #ifndef _EFC_SM_H 135aa09c48SJames Smart #define _EFC_SM_H 145aa09c48SJames Smart 155aa09c48SJames Smart struct efc_sm_ctx; 165aa09c48SJames Smart 175aa09c48SJames Smart /* State Machine events */ 185aa09c48SJames Smart enum efc_sm_event { 195aa09c48SJames Smart /* Common Events */ 205aa09c48SJames Smart EFC_EVT_ENTER, 215aa09c48SJames Smart EFC_EVT_REENTER, 225aa09c48SJames Smart EFC_EVT_EXIT, 235aa09c48SJames Smart EFC_EVT_SHUTDOWN, 245aa09c48SJames Smart EFC_EVT_ALL_CHILD_NODES_FREE, 255aa09c48SJames Smart EFC_EVT_RESUME, 265aa09c48SJames Smart EFC_EVT_TIMER_EXPIRED, 275aa09c48SJames Smart 285aa09c48SJames Smart /* Domain Events */ 295aa09c48SJames Smart EFC_EVT_RESPONSE, 305aa09c48SJames Smart EFC_EVT_ERROR, 315aa09c48SJames Smart 325aa09c48SJames Smart EFC_EVT_DOMAIN_FOUND, 335aa09c48SJames Smart EFC_EVT_DOMAIN_ALLOC_OK, 345aa09c48SJames Smart EFC_EVT_DOMAIN_ALLOC_FAIL, 355aa09c48SJames Smart EFC_EVT_DOMAIN_REQ_ATTACH, 365aa09c48SJames Smart EFC_EVT_DOMAIN_ATTACH_OK, 375aa09c48SJames Smart EFC_EVT_DOMAIN_ATTACH_FAIL, 385aa09c48SJames Smart EFC_EVT_DOMAIN_LOST, 395aa09c48SJames Smart EFC_EVT_DOMAIN_FREE_OK, 405aa09c48SJames Smart EFC_EVT_DOMAIN_FREE_FAIL, 415aa09c48SJames Smart EFC_EVT_HW_DOMAIN_REQ_ATTACH, 425aa09c48SJames Smart EFC_EVT_HW_DOMAIN_REQ_FREE, 435aa09c48SJames Smart 445aa09c48SJames Smart /* Sport Events */ 455aa09c48SJames Smart EFC_EVT_NPORT_ALLOC_OK, 465aa09c48SJames Smart EFC_EVT_NPORT_ALLOC_FAIL, 475aa09c48SJames Smart EFC_EVT_NPORT_ATTACH_OK, 485aa09c48SJames Smart EFC_EVT_NPORT_ATTACH_FAIL, 495aa09c48SJames Smart EFC_EVT_NPORT_FREE_OK, 505aa09c48SJames Smart EFC_EVT_NPORT_FREE_FAIL, 515aa09c48SJames Smart EFC_EVT_NPORT_TOPOLOGY_NOTIFY, 525aa09c48SJames Smart EFC_EVT_HW_PORT_ALLOC_OK, 535aa09c48SJames Smart EFC_EVT_HW_PORT_ALLOC_FAIL, 545aa09c48SJames Smart EFC_EVT_HW_PORT_ATTACH_OK, 555aa09c48SJames Smart EFC_EVT_HW_PORT_REQ_ATTACH, 565aa09c48SJames Smart EFC_EVT_HW_PORT_REQ_FREE, 575aa09c48SJames Smart EFC_EVT_HW_PORT_FREE_OK, 585aa09c48SJames Smart 595aa09c48SJames Smart /* Login Events */ 605aa09c48SJames Smart EFC_EVT_SRRS_ELS_REQ_OK, 615aa09c48SJames Smart EFC_EVT_SRRS_ELS_CMPL_OK, 625aa09c48SJames Smart EFC_EVT_SRRS_ELS_REQ_FAIL, 635aa09c48SJames Smart EFC_EVT_SRRS_ELS_CMPL_FAIL, 645aa09c48SJames Smart EFC_EVT_SRRS_ELS_REQ_RJT, 655aa09c48SJames Smart EFC_EVT_NODE_ATTACH_OK, 665aa09c48SJames Smart EFC_EVT_NODE_ATTACH_FAIL, 675aa09c48SJames Smart EFC_EVT_NODE_FREE_OK, 685aa09c48SJames Smart EFC_EVT_NODE_FREE_FAIL, 695aa09c48SJames Smart EFC_EVT_ELS_FRAME, 705aa09c48SJames Smart EFC_EVT_ELS_REQ_TIMEOUT, 715aa09c48SJames Smart EFC_EVT_ELS_REQ_ABORTED, 725aa09c48SJames Smart /* request an ELS IO be aborted */ 735aa09c48SJames Smart EFC_EVT_ABORT_ELS, 745aa09c48SJames Smart /* ELS abort process complete */ 755aa09c48SJames Smart EFC_EVT_ELS_ABORT_CMPL, 765aa09c48SJames Smart 775aa09c48SJames Smart EFC_EVT_ABTS_RCVD, 785aa09c48SJames Smart 795aa09c48SJames Smart /* node is not in the GID_PT payload */ 805aa09c48SJames Smart EFC_EVT_NODE_MISSING, 815aa09c48SJames Smart /* node is allocated and in the GID_PT payload */ 825aa09c48SJames Smart EFC_EVT_NODE_REFOUND, 835aa09c48SJames Smart /* node shutting down due to PLOGI recvd (implicit logo) */ 845aa09c48SJames Smart EFC_EVT_SHUTDOWN_IMPLICIT_LOGO, 855aa09c48SJames Smart /* node shutting down due to LOGO recvd/sent (explicit logo) */ 865aa09c48SJames Smart EFC_EVT_SHUTDOWN_EXPLICIT_LOGO, 875aa09c48SJames Smart 885aa09c48SJames Smart EFC_EVT_PLOGI_RCVD, 895aa09c48SJames Smart EFC_EVT_FLOGI_RCVD, 905aa09c48SJames Smart EFC_EVT_LOGO_RCVD, 915aa09c48SJames Smart EFC_EVT_PRLI_RCVD, 925aa09c48SJames Smart EFC_EVT_PRLO_RCVD, 935aa09c48SJames Smart EFC_EVT_PDISC_RCVD, 945aa09c48SJames Smart EFC_EVT_FDISC_RCVD, 955aa09c48SJames Smart EFC_EVT_ADISC_RCVD, 965aa09c48SJames Smart EFC_EVT_RSCN_RCVD, 975aa09c48SJames Smart EFC_EVT_SCR_RCVD, 985aa09c48SJames Smart EFC_EVT_ELS_RCVD, 995aa09c48SJames Smart 1005aa09c48SJames Smart EFC_EVT_FCP_CMD_RCVD, 1015aa09c48SJames Smart 1025aa09c48SJames Smart EFC_EVT_GIDPT_DELAY_EXPIRED, 1035aa09c48SJames Smart 1045aa09c48SJames Smart /* SCSI Target Server events */ 1055aa09c48SJames Smart EFC_EVT_NODE_ACTIVE_IO_LIST_EMPTY, 1065aa09c48SJames Smart EFC_EVT_NODE_DEL_INI_COMPLETE, 1075aa09c48SJames Smart EFC_EVT_NODE_DEL_TGT_COMPLETE, 1085aa09c48SJames Smart EFC_EVT_NODE_SESS_REG_OK, 1095aa09c48SJames Smart EFC_EVT_NODE_SESS_REG_FAIL, 1105aa09c48SJames Smart 1115aa09c48SJames Smart /* Must be last */ 1125aa09c48SJames Smart EFC_EVT_LAST 1135aa09c48SJames Smart }; 1145aa09c48SJames Smart 1155aa09c48SJames Smart /* State Machine event name lookup array */ 1165aa09c48SJames Smart #define EFC_SM_EVENT_NAME { \ 1175aa09c48SJames Smart [EFC_EVT_ENTER] = "EFC_EVT_ENTER", \ 1185aa09c48SJames Smart [EFC_EVT_REENTER] = "EFC_EVT_REENTER", \ 1195aa09c48SJames Smart [EFC_EVT_EXIT] = "EFC_EVT_EXIT", \ 1205aa09c48SJames Smart [EFC_EVT_SHUTDOWN] = "EFC_EVT_SHUTDOWN", \ 1215aa09c48SJames Smart [EFC_EVT_ALL_CHILD_NODES_FREE] = "EFC_EVT_ALL_CHILD_NODES_FREE",\ 1225aa09c48SJames Smart [EFC_EVT_RESUME] = "EFC_EVT_RESUME", \ 1235aa09c48SJames Smart [EFC_EVT_TIMER_EXPIRED] = "EFC_EVT_TIMER_EXPIRED", \ 1245aa09c48SJames Smart [EFC_EVT_RESPONSE] = "EFC_EVT_RESPONSE", \ 1255aa09c48SJames Smart [EFC_EVT_ERROR] = "EFC_EVT_ERROR", \ 1265aa09c48SJames Smart [EFC_EVT_DOMAIN_FOUND] = "EFC_EVT_DOMAIN_FOUND", \ 1275aa09c48SJames Smart [EFC_EVT_DOMAIN_ALLOC_OK] = "EFC_EVT_DOMAIN_ALLOC_OK", \ 1285aa09c48SJames Smart [EFC_EVT_DOMAIN_ALLOC_FAIL] = "EFC_EVT_DOMAIN_ALLOC_FAIL", \ 1295aa09c48SJames Smart [EFC_EVT_DOMAIN_REQ_ATTACH] = "EFC_EVT_DOMAIN_REQ_ATTACH", \ 1305aa09c48SJames Smart [EFC_EVT_DOMAIN_ATTACH_OK] = "EFC_EVT_DOMAIN_ATTACH_OK", \ 1315aa09c48SJames Smart [EFC_EVT_DOMAIN_ATTACH_FAIL] = "EFC_EVT_DOMAIN_ATTACH_FAIL", \ 1325aa09c48SJames Smart [EFC_EVT_DOMAIN_LOST] = "EFC_EVT_DOMAIN_LOST", \ 1335aa09c48SJames Smart [EFC_EVT_DOMAIN_FREE_OK] = "EFC_EVT_DOMAIN_FREE_OK", \ 1345aa09c48SJames Smart [EFC_EVT_DOMAIN_FREE_FAIL] = "EFC_EVT_DOMAIN_FREE_FAIL", \ 1355aa09c48SJames Smart [EFC_EVT_HW_DOMAIN_REQ_ATTACH] = "EFC_EVT_HW_DOMAIN_REQ_ATTACH",\ 1365aa09c48SJames Smart [EFC_EVT_HW_DOMAIN_REQ_FREE] = "EFC_EVT_HW_DOMAIN_REQ_FREE", \ 1375aa09c48SJames Smart [EFC_EVT_NPORT_ALLOC_OK] = "EFC_EVT_NPORT_ALLOC_OK", \ 1385aa09c48SJames Smart [EFC_EVT_NPORT_ALLOC_FAIL] = "EFC_EVT_NPORT_ALLOC_FAIL", \ 1395aa09c48SJames Smart [EFC_EVT_NPORT_ATTACH_OK] = "EFC_EVT_NPORT_ATTACH_OK", \ 1405aa09c48SJames Smart [EFC_EVT_NPORT_ATTACH_FAIL] = "EFC_EVT_NPORT_ATTACH_FAIL", \ 1415aa09c48SJames Smart [EFC_EVT_NPORT_FREE_OK] = "EFC_EVT_NPORT_FREE_OK", \ 1425aa09c48SJames Smart [EFC_EVT_NPORT_FREE_FAIL] = "EFC_EVT_NPORT_FREE_FAIL", \ 1435aa09c48SJames Smart [EFC_EVT_NPORT_TOPOLOGY_NOTIFY] = "EFC_EVT_NPORT_TOPOLOGY_NOTIFY",\ 1445aa09c48SJames Smart [EFC_EVT_HW_PORT_ALLOC_OK] = "EFC_EVT_HW_PORT_ALLOC_OK", \ 1455aa09c48SJames Smart [EFC_EVT_HW_PORT_ALLOC_FAIL] = "EFC_EVT_HW_PORT_ALLOC_FAIL", \ 1465aa09c48SJames Smart [EFC_EVT_HW_PORT_ATTACH_OK] = "EFC_EVT_HW_PORT_ATTACH_OK", \ 1475aa09c48SJames Smart [EFC_EVT_HW_PORT_REQ_ATTACH] = "EFC_EVT_HW_PORT_REQ_ATTACH", \ 1485aa09c48SJames Smart [EFC_EVT_HW_PORT_REQ_FREE] = "EFC_EVT_HW_PORT_REQ_FREE", \ 1495aa09c48SJames Smart [EFC_EVT_HW_PORT_FREE_OK] = "EFC_EVT_HW_PORT_FREE_OK", \ 1505aa09c48SJames Smart [EFC_EVT_SRRS_ELS_REQ_OK] = "EFC_EVT_SRRS_ELS_REQ_OK", \ 1515aa09c48SJames Smart [EFC_EVT_SRRS_ELS_CMPL_OK] = "EFC_EVT_SRRS_ELS_CMPL_OK", \ 1525aa09c48SJames Smart [EFC_EVT_SRRS_ELS_REQ_FAIL] = "EFC_EVT_SRRS_ELS_REQ_FAIL", \ 1535aa09c48SJames Smart [EFC_EVT_SRRS_ELS_CMPL_FAIL] = "EFC_EVT_SRRS_ELS_CMPL_FAIL", \ 1545aa09c48SJames Smart [EFC_EVT_SRRS_ELS_REQ_RJT] = "EFC_EVT_SRRS_ELS_REQ_RJT", \ 1555aa09c48SJames Smart [EFC_EVT_NODE_ATTACH_OK] = "EFC_EVT_NODE_ATTACH_OK", \ 1565aa09c48SJames Smart [EFC_EVT_NODE_ATTACH_FAIL] = "EFC_EVT_NODE_ATTACH_FAIL", \ 1575aa09c48SJames Smart [EFC_EVT_NODE_FREE_OK] = "EFC_EVT_NODE_FREE_OK", \ 1585aa09c48SJames Smart [EFC_EVT_NODE_FREE_FAIL] = "EFC_EVT_NODE_FREE_FAIL", \ 1595aa09c48SJames Smart [EFC_EVT_ELS_FRAME] = "EFC_EVT_ELS_FRAME", \ 1605aa09c48SJames Smart [EFC_EVT_ELS_REQ_TIMEOUT] = "EFC_EVT_ELS_REQ_TIMEOUT", \ 1615aa09c48SJames Smart [EFC_EVT_ELS_REQ_ABORTED] = "EFC_EVT_ELS_REQ_ABORTED", \ 1625aa09c48SJames Smart [EFC_EVT_ABORT_ELS] = "EFC_EVT_ABORT_ELS", \ 1635aa09c48SJames Smart [EFC_EVT_ELS_ABORT_CMPL] = "EFC_EVT_ELS_ABORT_CMPL", \ 1645aa09c48SJames Smart [EFC_EVT_ABTS_RCVD] = "EFC_EVT_ABTS_RCVD", \ 1655aa09c48SJames Smart [EFC_EVT_NODE_MISSING] = "EFC_EVT_NODE_MISSING", \ 1665aa09c48SJames Smart [EFC_EVT_NODE_REFOUND] = "EFC_EVT_NODE_REFOUND", \ 1675aa09c48SJames Smart [EFC_EVT_SHUTDOWN_IMPLICIT_LOGO] = "EFC_EVT_SHUTDOWN_IMPLICIT_LOGO",\ 1685aa09c48SJames Smart [EFC_EVT_SHUTDOWN_EXPLICIT_LOGO] = "EFC_EVT_SHUTDOWN_EXPLICIT_LOGO",\ 1695aa09c48SJames Smart [EFC_EVT_PLOGI_RCVD] = "EFC_EVT_PLOGI_RCVD", \ 1705aa09c48SJames Smart [EFC_EVT_FLOGI_RCVD] = "EFC_EVT_FLOGI_RCVD", \ 1715aa09c48SJames Smart [EFC_EVT_LOGO_RCVD] = "EFC_EVT_LOGO_RCVD", \ 1725aa09c48SJames Smart [EFC_EVT_PRLI_RCVD] = "EFC_EVT_PRLI_RCVD", \ 1735aa09c48SJames Smart [EFC_EVT_PRLO_RCVD] = "EFC_EVT_PRLO_RCVD", \ 1745aa09c48SJames Smart [EFC_EVT_PDISC_RCVD] = "EFC_EVT_PDISC_RCVD", \ 1755aa09c48SJames Smart [EFC_EVT_FDISC_RCVD] = "EFC_EVT_FDISC_RCVD", \ 1765aa09c48SJames Smart [EFC_EVT_ADISC_RCVD] = "EFC_EVT_ADISC_RCVD", \ 1775aa09c48SJames Smart [EFC_EVT_RSCN_RCVD] = "EFC_EVT_RSCN_RCVD", \ 1785aa09c48SJames Smart [EFC_EVT_SCR_RCVD] = "EFC_EVT_SCR_RCVD", \ 1795aa09c48SJames Smart [EFC_EVT_ELS_RCVD] = "EFC_EVT_ELS_RCVD", \ 1805aa09c48SJames Smart [EFC_EVT_FCP_CMD_RCVD] = "EFC_EVT_FCP_CMD_RCVD", \ 1815aa09c48SJames Smart [EFC_EVT_NODE_DEL_INI_COMPLETE] = "EFC_EVT_NODE_DEL_INI_COMPLETE",\ 1825aa09c48SJames Smart [EFC_EVT_NODE_DEL_TGT_COMPLETE] = "EFC_EVT_NODE_DEL_TGT_COMPLETE",\ 1835aa09c48SJames Smart [EFC_EVT_LAST] = "EFC_EVT_LAST", \ 1845aa09c48SJames Smart } 1855aa09c48SJames Smart 1865aa09c48SJames Smart int 1875aa09c48SJames Smart efc_sm_post_event(struct efc_sm_ctx *ctx, 1885aa09c48SJames Smart enum efc_sm_event evt, void *data); 1895aa09c48SJames Smart void 1905aa09c48SJames Smart efc_sm_transition(struct efc_sm_ctx *ctx, 1915aa09c48SJames Smart void (*state)(struct efc_sm_ctx *ctx, 1925aa09c48SJames Smart enum efc_sm_event evt, void *arg), 1935aa09c48SJames Smart void *data); 1945aa09c48SJames Smart void efc_sm_disable(struct efc_sm_ctx *ctx); 1955aa09c48SJames Smart const char *efc_sm_event_name(enum efc_sm_event evt); 1965aa09c48SJames Smart 1975aa09c48SJames Smart #endif /* ! _EFC_SM_H */ 198