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 * Contains declarations shared between the alex layer and HW/SLI4 37*ef270ab1SKenneth D. Merry */ 38*ef270ab1SKenneth D. Merry 39*ef270ab1SKenneth D. Merry 40*ef270ab1SKenneth D. Merry #if !defined(__OCS_COMMON_H__) 41*ef270ab1SKenneth D. Merry #define __OCS_COMMON_H__ 42*ef270ab1SKenneth D. Merry 43*ef270ab1SKenneth D. Merry #include "ocs_sm.h" 44*ef270ab1SKenneth D. Merry #include "ocs_utils.h" 45*ef270ab1SKenneth D. Merry 46*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_XPORT_DISABLE_AUTORSP_TSEND (1U << 0) 47*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_XPORT_DISABLE_AUTORSP_TRECEIVE (1U << 1) 48*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_XPORT_ENABLE_TARGET_RSCN (1U << 3) 49*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_TGT_ALWAYS_VERIFY_DIF (1U << 4) 50*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_TGT_SET_DIF_REF_TAG_CRC (1U << 5) 51*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_TEST_CHAINED_SGLS (1U << 6) 52*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_ISCSI_ISNS_ENABLE (1U << 7) 53*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_ENABLE_FABRIC_EMULATION (1U << 8) 54*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_INHIBIT_INITIATOR (1U << 9) 55*ef270ab1SKenneth D. Merry #define OCS_CTRLMASK_CRASH_RESET (1U << 10) 56*ef270ab1SKenneth D. Merry 57*ef270ab1SKenneth D. Merry #define enable_target_rscn(ocs) \ 58*ef270ab1SKenneth D. Merry ((ocs->ctrlmask & OCS_CTRLMASK_XPORT_ENABLE_TARGET_RSCN) != 0) 59*ef270ab1SKenneth D. Merry 60*ef270ab1SKenneth D. Merry /* Used for error injection testing. */ 61*ef270ab1SKenneth D. Merry typedef enum { 62*ef270ab1SKenneth D. Merry NO_ERR_INJECT = 0, 63*ef270ab1SKenneth D. Merry INJECT_DROP_CMD, 64*ef270ab1SKenneth D. Merry INJECT_FREE_DROPPED, 65*ef270ab1SKenneth D. Merry INJECT_DROP_DATA, 66*ef270ab1SKenneth D. Merry INJECT_DROP_RESP, 67*ef270ab1SKenneth D. Merry INJECT_DELAY_CMD, 68*ef270ab1SKenneth D. Merry } ocs_err_injection_e; 69*ef270ab1SKenneth D. Merry 70*ef270ab1SKenneth D. Merry #define MAX_OCS_DEVICES 64 71*ef270ab1SKenneth D. Merry 72*ef270ab1SKenneth D. Merry typedef enum {OCS_XPORT_FC, OCS_XPORT_ISCSI} ocs_xport_e; 73*ef270ab1SKenneth D. Merry 74*ef270ab1SKenneth D. Merry #define OCS_SERVICE_PARMS_LENGTH 0x74 75*ef270ab1SKenneth D. Merry #define OCS_DISPLAY_NAME_LENGTH 32 76*ef270ab1SKenneth D. Merry #define OCS_DISPLAY_BUS_INFO_LENGTH 16 77*ef270ab1SKenneth D. Merry 78*ef270ab1SKenneth D. Merry #define OCS_WWN_LENGTH 32 79*ef270ab1SKenneth D. Merry 80*ef270ab1SKenneth D. Merry typedef struct ocs_hw_s ocs_hw_t; 81*ef270ab1SKenneth D. Merry typedef struct ocs_domain_s ocs_domain_t; 82*ef270ab1SKenneth D. Merry typedef struct ocs_sli_port_s ocs_sli_port_t; 83*ef270ab1SKenneth D. Merry typedef struct ocs_sli_port_s ocs_sport_t; 84*ef270ab1SKenneth D. Merry typedef struct ocs_remote_node_s ocs_remote_node_t; 85*ef270ab1SKenneth D. Merry typedef struct ocs_remote_node_group_s ocs_remote_node_group_t; 86*ef270ab1SKenneth D. Merry typedef struct ocs_node_s ocs_node_t; 87*ef270ab1SKenneth D. Merry typedef struct ocs_io_s ocs_io_t; 88*ef270ab1SKenneth D. Merry typedef struct ocs_xport_s ocs_xport_t; 89*ef270ab1SKenneth D. Merry typedef struct ocs_node_cb_s ocs_node_cb_t; 90*ef270ab1SKenneth D. Merry typedef struct ocs_ns_s ocs_ns_t; 91*ef270ab1SKenneth D. Merry 92*ef270ab1SKenneth D. Merry /* Node group data structure */ 93*ef270ab1SKenneth D. Merry typedef struct ocs_node_group_dir_s ocs_node_group_dir_t; 94*ef270ab1SKenneth D. Merry 95*ef270ab1SKenneth D. Merry #include "ocs_cam.h" 96*ef270ab1SKenneth D. Merry 97*ef270ab1SKenneth D. Merry /*-------------------------------------------------- 98*ef270ab1SKenneth D. Merry * Shared HW/SLI objects 99*ef270ab1SKenneth D. Merry * 100*ef270ab1SKenneth D. Merry * Several objects used by the HW/SLI layers are communal; part of the 101*ef270ab1SKenneth D. Merry * object is for the sole use of the lower layers, but implementations 102*ef270ab1SKenneth D. Merry * are free to add their own fields if desired. 103*ef270ab1SKenneth D. Merry */ 104*ef270ab1SKenneth D. Merry 105*ef270ab1SKenneth D. Merry /** 106*ef270ab1SKenneth D. Merry * @brief Description of discovered Fabric Domain 107*ef270ab1SKenneth D. Merry * 108*ef270ab1SKenneth D. Merry * @note Not all fields are valid for all mediums (FC/ethernet). 109*ef270ab1SKenneth D. Merry */ 110*ef270ab1SKenneth D. Merry typedef struct ocs_domain_record_s { 111*ef270ab1SKenneth D. Merry uint32_t index; /**< FCF table index (used in REG_FCFI) */ 112*ef270ab1SKenneth D. Merry uint32_t priority; /**< FCF reported priority */ 113*ef270ab1SKenneth D. Merry uint8_t address[6]; /**< Switch MAC/FC address */ 114*ef270ab1SKenneth D. Merry uint8_t wwn[8]; /**< Switch WWN */ 115*ef270ab1SKenneth D. Merry union { 116*ef270ab1SKenneth D. Merry uint8_t vlan[512]; /**< bitmap of valid VLAN IDs */ 117*ef270ab1SKenneth D. Merry uint8_t loop[128]; /**< FC-AL position map */ 118*ef270ab1SKenneth D. Merry } map; 119*ef270ab1SKenneth D. Merry uint32_t speed; /**< link speed */ 120*ef270ab1SKenneth D. Merry uint32_t fc_id; /**< our ports fc_id */ 121*ef270ab1SKenneth D. Merry uint32_t is_fc:1, /**< Connection medium is native FC */ 122*ef270ab1SKenneth D. Merry is_ethernet:1, /**< Connection medium is ethernet (FCoE) */ 123*ef270ab1SKenneth D. Merry is_loop:1, /**< Topology is FC-AL */ 124*ef270ab1SKenneth D. Merry is_nport:1, /**< Topology is N-PORT */ 125*ef270ab1SKenneth D. Merry :28; 126*ef270ab1SKenneth D. Merry } ocs_domain_record_t; 127*ef270ab1SKenneth D. Merry 128*ef270ab1SKenneth D. Merry /** 129*ef270ab1SKenneth D. Merry * @brief Node group directory entry 130*ef270ab1SKenneth D. Merry */ 131*ef270ab1SKenneth D. Merry struct ocs_node_group_dir_s { 132*ef270ab1SKenneth D. Merry uint32_t instance_index; /*<< instance index */ 133*ef270ab1SKenneth D. Merry ocs_sport_t *sport; /*<< pointer to sport */ 134*ef270ab1SKenneth D. Merry uint8_t service_params[OCS_SERVICE_PARMS_LENGTH]; /**< Login parameters */ 135*ef270ab1SKenneth D. Merry ocs_list_link_t link; /**< linked list link */ 136*ef270ab1SKenneth D. Merry ocs_list_t node_group_list; /**< linked list of node groups */ 137*ef270ab1SKenneth D. Merry uint32_t node_group_list_count; /**< current number of elements on the node group list */ 138*ef270ab1SKenneth D. Merry uint32_t next_idx; /*<< index of the next node group in list */ 139*ef270ab1SKenneth D. Merry }; 140*ef270ab1SKenneth D. Merry 141*ef270ab1SKenneth D. Merry typedef enum { 142*ef270ab1SKenneth D. Merry OCS_SPORT_TOPOLOGY_UNKNOWN=0, 143*ef270ab1SKenneth D. Merry OCS_SPORT_TOPOLOGY_FABRIC, 144*ef270ab1SKenneth D. Merry OCS_SPORT_TOPOLOGY_P2P, 145*ef270ab1SKenneth D. Merry OCS_SPORT_TOPOLOGY_LOOP, 146*ef270ab1SKenneth D. Merry } ocs_sport_topology_e; 147*ef270ab1SKenneth D. Merry 148*ef270ab1SKenneth D. Merry /** 149*ef270ab1SKenneth D. Merry * @brief SLI Port object 150*ef270ab1SKenneth D. Merry * 151*ef270ab1SKenneth D. Merry * The SLI Port object represents the connection between the driver and the 152*ef270ab1SKenneth D. Merry * FC/FCoE domain. In some topologies / hardware, it is possible to have 153*ef270ab1SKenneth D. Merry * multiple connections to the domain via different WWN. Each would require 154*ef270ab1SKenneth D. Merry * a separate SLI port object. 155*ef270ab1SKenneth D. Merry */ 156*ef270ab1SKenneth D. Merry struct ocs_sli_port_s { 157*ef270ab1SKenneth D. Merry 158*ef270ab1SKenneth D. Merry ocs_t *ocs; /**< pointer to ocs */ 159*ef270ab1SKenneth D. Merry uint32_t tgt_id; /**< target id */ 160*ef270ab1SKenneth D. Merry uint32_t index; /**< ??? */ 161*ef270ab1SKenneth D. Merry uint32_t instance_index; 162*ef270ab1SKenneth D. Merry char display_name[OCS_DISPLAY_NAME_LENGTH]; /**< sport display name */ 163*ef270ab1SKenneth D. Merry ocs_domain_t *domain; /**< current fabric domain */ 164*ef270ab1SKenneth D. Merry uint32_t is_vport:1; /**< this SPORT is a virtual port */ 165*ef270ab1SKenneth D. Merry uint64_t wwpn; /**< WWPN from HW (host endian) */ 166*ef270ab1SKenneth D. Merry uint64_t wwnn; /**< WWNN from HW (host endian) */ 167*ef270ab1SKenneth D. Merry ocs_list_t node_list; /**< list of nodes */ 168*ef270ab1SKenneth D. Merry ocs_scsi_ini_sport_t ini_sport; /**< initiator backend private sport data */ 169*ef270ab1SKenneth D. Merry ocs_scsi_tgt_sport_t tgt_sport; /**< target backend private sport data */ 170*ef270ab1SKenneth D. Merry void *tgt_data; /**< target backend private pointer */ 171*ef270ab1SKenneth D. Merry void *ini_data; /**< initiator backend private pointer */ 172*ef270ab1SKenneth D. Merry ocs_mgmt_functions_t *mgmt_functions; 173*ef270ab1SKenneth D. Merry 174*ef270ab1SKenneth D. Merry /* 175*ef270ab1SKenneth D. Merry * Members private to HW/SLI 176*ef270ab1SKenneth D. Merry */ 177*ef270ab1SKenneth D. Merry ocs_sm_ctx_t ctx; /**< state machine context */ 178*ef270ab1SKenneth D. Merry ocs_hw_t *hw; /**< pointer to HW */ 179*ef270ab1SKenneth D. Merry uint32_t indicator; /**< VPI */ 180*ef270ab1SKenneth D. Merry uint32_t fc_id; /**< FC address */ 181*ef270ab1SKenneth D. Merry ocs_dma_t dma; /**< memory for Service Parameters */ 182*ef270ab1SKenneth D. Merry 183*ef270ab1SKenneth D. Merry uint8_t wwnn_str[OCS_WWN_LENGTH]; /**< WWN (ASCII) */ 184*ef270ab1SKenneth D. Merry uint64_t sli_wwpn; /**< WWPN (wire endian) */ 185*ef270ab1SKenneth D. Merry uint64_t sli_wwnn; /**< WWNN (wire endian) */ 186*ef270ab1SKenneth D. Merry uint32_t sm_free_req_pending:1; /**< Free request received while waiting for attach response */ 187*ef270ab1SKenneth D. Merry 188*ef270ab1SKenneth D. Merry /* 189*ef270ab1SKenneth D. Merry * Implementation specific fields allowed here 190*ef270ab1SKenneth D. Merry */ 191*ef270ab1SKenneth D. Merry ocs_sm_ctx_t sm; /**< sport context state machine */ 192*ef270ab1SKenneth D. Merry sparse_vector_t lookup; /**< fc_id to node lookup object */ 193*ef270ab1SKenneth D. Merry ocs_list_link_t link; 194*ef270ab1SKenneth D. Merry uint32_t enable_ini:1, /**< SCSI initiator enabled for this node */ 195*ef270ab1SKenneth D. Merry enable_tgt:1, /**< SCSI target enabled for this node */ 196*ef270ab1SKenneth D. Merry enable_rscn:1, /**< This SPORT will be expecting RSCN */ 197*ef270ab1SKenneth D. Merry shutting_down:1, /**< sport in process of shutting down */ 198*ef270ab1SKenneth D. Merry p2p_winner:1; /**< TRUE if we're the point-to-point winner */ 199*ef270ab1SKenneth D. Merry ocs_sport_topology_e topology; /**< topology: fabric/p2p/unknown */ 200*ef270ab1SKenneth D. Merry uint8_t service_params[OCS_SERVICE_PARMS_LENGTH]; /**< Login parameters */ 201*ef270ab1SKenneth D. Merry uint32_t p2p_remote_port_id; /**< Remote node's port id for p2p */ 202*ef270ab1SKenneth D. Merry uint32_t p2p_port_id; /**< our port's id */ 203*ef270ab1SKenneth D. Merry 204*ef270ab1SKenneth D. Merry /* List of remote node group directory entries (used by high login mode) */ 205*ef270ab1SKenneth D. Merry ocs_lock_t node_group_lock; 206*ef270ab1SKenneth D. Merry uint32_t node_group_dir_next_instance; /**< HLM next node group directory instance value */ 207*ef270ab1SKenneth D. Merry uint32_t node_group_next_instance; /**< HLM next node group instance value */ 208*ef270ab1SKenneth D. Merry ocs_list_t node_group_dir_list; 209*ef270ab1SKenneth D. Merry }; 210*ef270ab1SKenneth D. Merry 211*ef270ab1SKenneth D. Merry /** 212*ef270ab1SKenneth D. Merry * @brief Fibre Channel domain object 213*ef270ab1SKenneth D. Merry * 214*ef270ab1SKenneth D. Merry * This object is a container for the various SLI components needed 215*ef270ab1SKenneth D. Merry * to connect to the domain of a FC or FCoE switch 216*ef270ab1SKenneth D. Merry */ 217*ef270ab1SKenneth D. Merry struct ocs_domain_s { 218*ef270ab1SKenneth D. Merry 219*ef270ab1SKenneth D. Merry ocs_t *ocs; /**< pointer back to ocs */ 220*ef270ab1SKenneth D. Merry uint32_t instance_index; /**< unique instance index value */ 221*ef270ab1SKenneth D. Merry char display_name[OCS_DISPLAY_NAME_LENGTH]; /**< Node display name */ 222*ef270ab1SKenneth D. Merry ocs_list_t sport_list; /**< linked list of SLI ports */ 223*ef270ab1SKenneth D. Merry ocs_scsi_ini_domain_t ini_domain; /**< initiator backend private domain data */ 224*ef270ab1SKenneth D. Merry ocs_scsi_tgt_domain_t tgt_domain; /**< target backend private domain data */ 225*ef270ab1SKenneth D. Merry ocs_mgmt_functions_t *mgmt_functions; 226*ef270ab1SKenneth D. Merry 227*ef270ab1SKenneth D. Merry /* Declarations private to HW/SLI */ 228*ef270ab1SKenneth D. Merry ocs_hw_t *hw; /**< pointer to HW */ 229*ef270ab1SKenneth D. Merry ocs_sm_ctx_t sm; /**< state machine context */ 230*ef270ab1SKenneth D. Merry uint32_t fcf; /**< FC Forwarder table index */ 231*ef270ab1SKenneth D. Merry uint32_t fcf_indicator; /**< FCFI */ 232*ef270ab1SKenneth D. Merry uint32_t vlan_id; /**< VLAN tag for this domain */ 233*ef270ab1SKenneth D. Merry uint32_t indicator; /**< VFI */ 234*ef270ab1SKenneth D. Merry ocs_dma_t dma; /**< memory for Service Parameters */ 235*ef270ab1SKenneth D. Merry uint32_t req_rediscover_fcf:1; /**< TRUE if fcf rediscover is needed (in response 236*ef270ab1SKenneth D. Merry * to Vlink Clear async event */ 237*ef270ab1SKenneth D. Merry 238*ef270ab1SKenneth D. Merry /* Declarations private to FC transport */ 239*ef270ab1SKenneth D. Merry uint64_t fcf_wwn; /**< WWN for FCF/switch */ 240*ef270ab1SKenneth D. Merry ocs_list_link_t link; 241*ef270ab1SKenneth D. Merry ocs_sm_ctx_t drvsm; /**< driver domain sm context */ 242*ef270ab1SKenneth D. Merry uint32_t attached:1, /**< set true after attach completes */ 243*ef270ab1SKenneth D. Merry is_fc:1, /**< is FC */ 244*ef270ab1SKenneth D. Merry is_loop:1, /**< is loop topology */ 245*ef270ab1SKenneth D. Merry is_nlport:1, /**< is public loop */ 246*ef270ab1SKenneth D. Merry domain_found_pending:1, /**< A domain found is pending, drec is updated */ 247*ef270ab1SKenneth D. Merry req_domain_free:1, /**< True if domain object should be free'd */ 248*ef270ab1SKenneth D. Merry req_accept_frames:1, /**< set in domain state machine to enable frames */ 249*ef270ab1SKenneth D. Merry domain_notify_pend:1; /** Set in domain SM to avoid duplicate node event post */ 250*ef270ab1SKenneth D. Merry ocs_domain_record_t pending_drec; /**< Pending drec if a domain found is pending */ 251*ef270ab1SKenneth D. Merry uint8_t service_params[OCS_SERVICE_PARMS_LENGTH]; /**< any sports service parameters */ 252*ef270ab1SKenneth D. Merry uint8_t flogi_service_params[OCS_SERVICE_PARMS_LENGTH]; /**< Fabric/P2p service parameters from FLOGI */ 253*ef270ab1SKenneth D. Merry uint8_t femul_enable; /**< TRUE if Fabric Emulation mode is enabled */ 254*ef270ab1SKenneth D. Merry 255*ef270ab1SKenneth D. Merry /* Declarations shared with back-ends */ 256*ef270ab1SKenneth D. Merry sparse_vector_t lookup; /**< d_id to node lookup object */ 257*ef270ab1SKenneth D. Merry ocs_lock_t lookup_lock; 258*ef270ab1SKenneth D. Merry 259*ef270ab1SKenneth D. Merry ocs_sli_port_t *sport; /**< Pointer to first (physical) SLI port (also at the head of sport_list) */ 260*ef270ab1SKenneth D. Merry uint32_t sport_instance_count; /**< count of sport instances */ 261*ef270ab1SKenneth D. Merry 262*ef270ab1SKenneth D. Merry /* Fabric Emulation */ 263*ef270ab1SKenneth D. Merry ocs_bitmap_t *portid_pool; 264*ef270ab1SKenneth D. Merry ocs_ns_t *ocs_ns; /*>> Directory(Name) services data */ 265*ef270ab1SKenneth D. Merry }; 266*ef270ab1SKenneth D. Merry 267*ef270ab1SKenneth D. Merry /** 268*ef270ab1SKenneth D. Merry * @brief Remote Node object 269*ef270ab1SKenneth D. Merry * 270*ef270ab1SKenneth D. Merry * This object represents a connection between the SLI port and another 271*ef270ab1SKenneth D. Merry * Nx_Port on the fabric. Note this can be either a well known port such 272*ef270ab1SKenneth D. Merry * as a F_Port (i.e. ff:ff:fe) or another N_Port. 273*ef270ab1SKenneth D. Merry */ 274*ef270ab1SKenneth D. Merry struct ocs_remote_node_s { 275*ef270ab1SKenneth D. Merry /* 276*ef270ab1SKenneth D. Merry * Members private to HW/SLI 277*ef270ab1SKenneth D. Merry */ 278*ef270ab1SKenneth D. Merry uint32_t indicator; /**< RPI */ 279*ef270ab1SKenneth D. Merry uint32_t index; 280*ef270ab1SKenneth D. Merry uint32_t fc_id; /**< FC address */ 281*ef270ab1SKenneth D. Merry 282*ef270ab1SKenneth D. Merry uint32_t attached:1, /**< true if attached */ 283*ef270ab1SKenneth D. Merry node_group:1, /**< true if in node group */ 284*ef270ab1SKenneth D. Merry free_group:1; /**< true if the node group should be free'd */ 285*ef270ab1SKenneth D. Merry 286*ef270ab1SKenneth D. Merry ocs_sli_port_t *sport; /**< associated SLI port */ 287*ef270ab1SKenneth D. Merry 288*ef270ab1SKenneth D. Merry /* 289*ef270ab1SKenneth D. Merry * Implementation specific fields allowed here 290*ef270ab1SKenneth D. Merry */ 291*ef270ab1SKenneth D. Merry void *node; /**< associated node */ 292*ef270ab1SKenneth D. Merry }; 293*ef270ab1SKenneth D. Merry 294*ef270ab1SKenneth D. Merry struct ocs_remote_node_group_s { 295*ef270ab1SKenneth D. Merry /* 296*ef270ab1SKenneth D. Merry * Members private to HW/SLI 297*ef270ab1SKenneth D. Merry */ 298*ef270ab1SKenneth D. Merry uint32_t indicator; /**< RPI */ 299*ef270ab1SKenneth D. Merry uint32_t index; 300*ef270ab1SKenneth D. Merry 301*ef270ab1SKenneth D. Merry /* 302*ef270ab1SKenneth D. Merry * Implementation specific fields allowed here 303*ef270ab1SKenneth D. Merry */ 304*ef270ab1SKenneth D. Merry 305*ef270ab1SKenneth D. Merry 306*ef270ab1SKenneth D. Merry uint32_t instance_index; /*<< instance index */ 307*ef270ab1SKenneth D. Merry ocs_node_group_dir_t *node_group_dir; /*<< pointer to the node group directory */ 308*ef270ab1SKenneth D. Merry ocs_list_link_t link; /*<< linked list link */ 309*ef270ab1SKenneth D. Merry }; 310*ef270ab1SKenneth D. Merry 311*ef270ab1SKenneth D. Merry typedef enum { 312*ef270ab1SKenneth D. Merry OCS_NODE_SHUTDOWN_DEFAULT = 0, 313*ef270ab1SKenneth D. Merry OCS_NODE_SHUTDOWN_EXPLICIT_LOGO, 314*ef270ab1SKenneth D. Merry OCS_NODE_SHUTDOWN_IMPLICIT_LOGO, 315*ef270ab1SKenneth D. Merry } ocs_node_shutd_rsn_e; 316*ef270ab1SKenneth D. Merry 317*ef270ab1SKenneth D. Merry typedef enum { 318*ef270ab1SKenneth D. Merry OCS_NODE_SEND_LS_ACC_NONE = 0, 319*ef270ab1SKenneth D. Merry OCS_NODE_SEND_LS_ACC_PLOGI, 320*ef270ab1SKenneth D. Merry OCS_NODE_SEND_LS_ACC_PRLI, 321*ef270ab1SKenneth D. Merry } ocs_node_send_ls_acc_e; 322*ef270ab1SKenneth D. Merry 323*ef270ab1SKenneth D. Merry /** 324*ef270ab1SKenneth D. Merry * @brief FC Node object 325*ef270ab1SKenneth D. Merry * 326*ef270ab1SKenneth D. Merry */ 327*ef270ab1SKenneth D. Merry struct ocs_node_s { 328*ef270ab1SKenneth D. Merry 329*ef270ab1SKenneth D. Merry ocs_t *ocs; /**< pointer back to ocs structure */ 330*ef270ab1SKenneth D. Merry uint32_t instance_index; /**< unique instance index value */ 331*ef270ab1SKenneth D. Merry char display_name[OCS_DISPLAY_NAME_LENGTH]; /**< Node display name */ 332*ef270ab1SKenneth D. Merry ocs_sport_t *sport; 333*ef270ab1SKenneth D. Merry uint32_t hold_frames:1; /**< hold incoming frames if true */ 334*ef270ab1SKenneth D. Merry ocs_rlock_t lock; /**< node wide lock */ 335*ef270ab1SKenneth D. Merry ocs_lock_t active_ios_lock; /**< active SCSI and XPORT I/O's for this node */ 336*ef270ab1SKenneth D. Merry ocs_list_t active_ios; /**< active I/O's for this node */ 337*ef270ab1SKenneth D. Merry uint32_t max_wr_xfer_size; /**< Max write IO size per phase for the transport */ 338*ef270ab1SKenneth D. Merry ocs_scsi_ini_node_t ini_node; /**< backend initiator private node data */ 339*ef270ab1SKenneth D. Merry ocs_scsi_tgt_node_t tgt_node; /**< backend target private node data */ 340*ef270ab1SKenneth D. Merry ocs_mgmt_functions_t *mgmt_functions; 341*ef270ab1SKenneth D. Merry 342*ef270ab1SKenneth D. Merry /* Declarations private to HW/SLI */ 343*ef270ab1SKenneth D. Merry ocs_remote_node_t rnode; /**< Remote node */ 344*ef270ab1SKenneth D. Merry 345*ef270ab1SKenneth D. Merry /* Declarations private to FC transport */ 346*ef270ab1SKenneth D. Merry ocs_sm_ctx_t sm; /**< state machine context */ 347*ef270ab1SKenneth D. Merry uint32_t evtdepth; /**< current event posting nesting depth */ 348*ef270ab1SKenneth D. Merry uint32_t req_free:1, /**< this node is to be free'd */ 349*ef270ab1SKenneth D. Merry attached:1, /**< node is attached (REGLOGIN complete) */ 350*ef270ab1SKenneth D. Merry fcp_enabled:1, /**< node is enabled to handle FCP */ 351*ef270ab1SKenneth D. Merry rscn_pending:1, /**< for name server node RSCN is pending */ 352*ef270ab1SKenneth D. Merry send_plogi:1, /**< if initiator, send PLOGI at node initialization */ 353*ef270ab1SKenneth D. Merry send_plogi_acc:1,/**< send PLOGI accept, upon completion of node attach */ 354*ef270ab1SKenneth D. Merry io_alloc_enabled:1, /**< TRUE if ocs_scsi_io_alloc() and ocs_els_io_alloc() are enabled */ 355*ef270ab1SKenneth D. Merry sent_prli:1; /**< if initiator, sent prli. */ 356*ef270ab1SKenneth D. Merry ocs_node_send_ls_acc_e send_ls_acc; /**< type of LS acc to send */ 357*ef270ab1SKenneth D. Merry ocs_io_t *ls_acc_io; /**< SCSI IO for LS acc */ 358*ef270ab1SKenneth D. Merry uint32_t ls_acc_oxid; /**< OX_ID for pending accept */ 359*ef270ab1SKenneth D. Merry uint32_t ls_acc_did; /**< D_ID for pending accept */ 360*ef270ab1SKenneth D. Merry ocs_node_shutd_rsn_e shutdown_reason;/**< reason for node shutdown */ 361*ef270ab1SKenneth D. Merry ocs_dma_t sparm_dma_buf; /**< service parameters buffer */ 362*ef270ab1SKenneth D. Merry uint8_t service_params[OCS_SERVICE_PARMS_LENGTH]; /**< plogi/acc frame from remote device */ 363*ef270ab1SKenneth D. Merry ocs_lock_t pend_frames_lock; /**< lock for inbound pending frames list */ 364*ef270ab1SKenneth D. Merry ocs_list_t pend_frames; /**< inbound pending frames list */ 365*ef270ab1SKenneth D. Merry uint32_t pend_frames_processed; /**< count of frames processed in hold frames interval */ 366*ef270ab1SKenneth D. Merry uint32_t ox_id_in_use; /**< used to verify one at a time us of ox_id */ 367*ef270ab1SKenneth D. Merry uint32_t els_retries_remaining; /**< for ELS, number of retries remaining */ 368*ef270ab1SKenneth D. Merry uint32_t els_req_cnt; /**< number of outstanding ELS requests */ 369*ef270ab1SKenneth D. Merry uint32_t els_cmpl_cnt; /**< number of outstanding ELS completions */ 370*ef270ab1SKenneth D. Merry uint32_t abort_cnt; /**< Abort counter for debugging purpose */ 371*ef270ab1SKenneth D. Merry 372*ef270ab1SKenneth D. Merry char current_state_name[OCS_DISPLAY_NAME_LENGTH]; /**< current node state */ 373*ef270ab1SKenneth D. Merry char prev_state_name[OCS_DISPLAY_NAME_LENGTH]; /**< previous node state */ 374*ef270ab1SKenneth D. Merry ocs_sm_event_t current_evt; /**< current event */ 375*ef270ab1SKenneth D. Merry ocs_sm_event_t prev_evt; /**< current event */ 376*ef270ab1SKenneth D. Merry uint32_t targ:1, /**< node is target capable */ 377*ef270ab1SKenneth D. Merry init:1, /**< node is initiator capable */ 378*ef270ab1SKenneth D. Merry refound:1, /**< Handle node refound case when node is being deleted */ 379*ef270ab1SKenneth D. Merry fcp2device:1, /* FCP2 device */ 380*ef270ab1SKenneth D. Merry reserved:4, 381*ef270ab1SKenneth D. Merry fc_type:8; 382*ef270ab1SKenneth D. Merry ocs_list_t els_io_pend_list; /**< list of pending (not yet processed) ELS IOs */ 383*ef270ab1SKenneth D. Merry ocs_list_t els_io_active_list; /**< list of active (processed) ELS IOs */ 384*ef270ab1SKenneth D. Merry 385*ef270ab1SKenneth D. Merry ocs_sm_function_t nodedb_state; /**< Node debugging, saved state */ 386*ef270ab1SKenneth D. Merry 387*ef270ab1SKenneth D. Merry ocs_timer_t gidpt_delay_timer; /**< GIDPT delay timer */ 388*ef270ab1SKenneth D. Merry time_t time_last_gidpt_msec; /**< Start time of last target RSCN GIDPT */ 389*ef270ab1SKenneth D. Merry 390*ef270ab1SKenneth D. Merry /* WWN */ 391*ef270ab1SKenneth D. Merry char wwnn[OCS_WWN_LENGTH]; /**< remote port WWN (uses iSCSI naming) */ 392*ef270ab1SKenneth D. Merry char wwpn[OCS_WWN_LENGTH]; /**< remote port WWN (uses iSCSI naming) */ 393*ef270ab1SKenneth D. Merry 394*ef270ab1SKenneth D. Merry /* Statistics */ 395*ef270ab1SKenneth D. Merry uint32_t chained_io_count; /**< count of IOs with chained SGL's */ 396*ef270ab1SKenneth D. Merry 397*ef270ab1SKenneth D. Merry ocs_list_link_t link; /**< node list link */ 398*ef270ab1SKenneth D. Merry 399*ef270ab1SKenneth D. Merry ocs_remote_node_group_t *node_group; /**< pointer to node group (if HLM enabled) */ 400*ef270ab1SKenneth D. Merry }; 401*ef270ab1SKenneth D. Merry 402*ef270ab1SKenneth D. Merry /** 403*ef270ab1SKenneth D. Merry * @brief Virtual port specification 404*ef270ab1SKenneth D. Merry * 405*ef270ab1SKenneth D. Merry * Collection of the information required to restore a virtual port across 406*ef270ab1SKenneth D. Merry * link events 407*ef270ab1SKenneth D. Merry */ 408*ef270ab1SKenneth D. Merry 409*ef270ab1SKenneth D. Merry typedef struct ocs_vport_spec_s ocs_vport_spec_t; 410*ef270ab1SKenneth D. Merry struct ocs_vport_spec_s { 411*ef270ab1SKenneth D. Merry uint32_t domain_instance; /*>> instance index of this domain for the sport */ 412*ef270ab1SKenneth D. Merry uint64_t wwnn; /*>> node name */ 413*ef270ab1SKenneth D. Merry uint64_t wwpn; /*>> port name */ 414*ef270ab1SKenneth D. Merry uint32_t fc_id; /*>> port id */ 415*ef270ab1SKenneth D. Merry uint32_t enable_tgt:1, /*>> port is a target */ 416*ef270ab1SKenneth D. Merry enable_ini:1; /*>> port is an initiator */ 417*ef270ab1SKenneth D. Merry ocs_list_link_t link; /*>> link */ 418*ef270ab1SKenneth D. Merry void *tgt_data; /**< target backend pointer */ 419*ef270ab1SKenneth D. Merry void *ini_data; /**< initiator backend pointer */ 420*ef270ab1SKenneth D. Merry ocs_sport_t *sport; /**< Used to match record after attaching for update */ 421*ef270ab1SKenneth D. Merry }; 422*ef270ab1SKenneth D. Merry 423*ef270ab1SKenneth D. Merry 424*ef270ab1SKenneth D. Merry #endif /* __OCS_COMMON_H__*/ 425