1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 4*4882a593Smuzhiyun * Copyright (c) 2014- QLogic Corporation. 5*4882a593Smuzhiyun * All rights reserved 6*4882a593Smuzhiyun * www.qlogic.com 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef __BFA_FC_H__ 12*4882a593Smuzhiyun #define __BFA_FC_H__ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include "bfad_drv.h" 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun typedef u64 wwn_t; 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define WWN_NULL (0) 19*4882a593Smuzhiyun #define FC_SYMNAME_MAX 256 /* max name server symbolic name size */ 20*4882a593Smuzhiyun #define FC_ALPA_MAX 128 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #pragma pack(1) 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define MAC_ADDRLEN (6) 25*4882a593Smuzhiyun struct mac_s { u8 mac[MAC_ADDRLEN]; }; 26*4882a593Smuzhiyun #define mac_t struct mac_s 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun /* 29*4882a593Smuzhiyun * generic SCSI cdb definition 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun #define SCSI_MAX_CDBLEN 16 32*4882a593Smuzhiyun struct scsi_cdb_s { 33*4882a593Smuzhiyun u8 scsi_cdb[SCSI_MAX_CDBLEN]; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* ------------------------------------------------------------ 37*4882a593Smuzhiyun * SCSI status byte values 38*4882a593Smuzhiyun * ------------------------------------------------------------ 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun #define SCSI_STATUS_GOOD 0x00 41*4882a593Smuzhiyun #define SCSI_STATUS_CHECK_CONDITION 0x02 42*4882a593Smuzhiyun #define SCSI_STATUS_CONDITION_MET 0x04 43*4882a593Smuzhiyun #define SCSI_STATUS_BUSY 0x08 44*4882a593Smuzhiyun #define SCSI_STATUS_INTERMEDIATE 0x10 45*4882a593Smuzhiyun #define SCSI_STATUS_ICM 0x14 /* intermediate condition met */ 46*4882a593Smuzhiyun #define SCSI_STATUS_RESERVATION_CONFLICT 0x18 47*4882a593Smuzhiyun #define SCSI_STATUS_COMMAND_TERMINATED 0x22 48*4882a593Smuzhiyun #define SCSI_STATUS_QUEUE_FULL 0x28 49*4882a593Smuzhiyun #define SCSI_STATUS_ACA_ACTIVE 0x30 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define SCSI_MAX_ALLOC_LEN 0xFF /* maximum allocarion length */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* 54*4882a593Smuzhiyun * Fibre Channel Header Structure (FCHS) definition 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun struct fchs_s { 57*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 58*4882a593Smuzhiyun u32 routing:4; /* routing bits */ 59*4882a593Smuzhiyun u32 cat_info:4; /* category info */ 60*4882a593Smuzhiyun #else 61*4882a593Smuzhiyun u32 cat_info:4; /* category info */ 62*4882a593Smuzhiyun u32 routing:4; /* routing bits */ 63*4882a593Smuzhiyun #endif 64*4882a593Smuzhiyun u32 d_id:24; /* destination identifier */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun u32 cs_ctl:8; /* class specific control */ 67*4882a593Smuzhiyun u32 s_id:24; /* source identifier */ 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun u32 type:8; /* data structure type */ 70*4882a593Smuzhiyun u32 f_ctl:24; /* initial frame control */ 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun u8 seq_id; /* sequence identifier */ 73*4882a593Smuzhiyun u8 df_ctl; /* data field control */ 74*4882a593Smuzhiyun u16 seq_cnt; /* sequence count */ 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun __be16 ox_id; /* originator exchange ID */ 77*4882a593Smuzhiyun u16 rx_id; /* responder exchange ID */ 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun u32 ro; /* relative offset */ 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* 83*4882a593Smuzhiyun * routing bit definitions 84*4882a593Smuzhiyun */ 85*4882a593Smuzhiyun enum { 86*4882a593Smuzhiyun FC_RTG_FC4_DEV_DATA = 0x0, /* FC-4 Device Data */ 87*4882a593Smuzhiyun FC_RTG_EXT_LINK = 0x2, /* Extended Link Data */ 88*4882a593Smuzhiyun FC_RTG_FC4_LINK_DATA = 0x3, /* FC-4 Link Data */ 89*4882a593Smuzhiyun FC_RTG_VIDEO_DATA = 0x4, /* Video Data */ 90*4882a593Smuzhiyun FC_RTG_EXT_HDR = 0x5, /* VFT, IFR or Encapsuled */ 91*4882a593Smuzhiyun FC_RTG_BASIC_LINK = 0x8, /* Basic Link data */ 92*4882a593Smuzhiyun FC_RTG_LINK_CTRL = 0xC, /* Link Control */ 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /* 96*4882a593Smuzhiyun * information category for extended link data and FC-4 Link Data 97*4882a593Smuzhiyun */ 98*4882a593Smuzhiyun enum { 99*4882a593Smuzhiyun FC_CAT_LD_REQUEST = 0x2, /* Request */ 100*4882a593Smuzhiyun FC_CAT_LD_REPLY = 0x3, /* Reply */ 101*4882a593Smuzhiyun FC_CAT_LD_DIAG = 0xF, /* for DIAG use only */ 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * information category for extended headers (VFT, IFR or encapsulation) 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun enum { 108*4882a593Smuzhiyun FC_CAT_VFT_HDR = 0x0, /* Virtual fabric tagging header */ 109*4882a593Smuzhiyun FC_CAT_IFR_HDR = 0x1, /* Inter-Fabric routing header */ 110*4882a593Smuzhiyun FC_CAT_ENC_HDR = 0x2, /* Encapsulation header */ 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* 114*4882a593Smuzhiyun * information category for FC-4 device data 115*4882a593Smuzhiyun */ 116*4882a593Smuzhiyun enum { 117*4882a593Smuzhiyun FC_CAT_UNCATEG_INFO = 0x0, /* Uncategorized information */ 118*4882a593Smuzhiyun FC_CAT_SOLICIT_DATA = 0x1, /* Solicited Data */ 119*4882a593Smuzhiyun FC_CAT_UNSOLICIT_CTRL = 0x2, /* Unsolicited Control */ 120*4882a593Smuzhiyun FC_CAT_SOLICIT_CTRL = 0x3, /* Solicited Control */ 121*4882a593Smuzhiyun FC_CAT_UNSOLICIT_DATA = 0x4, /* Unsolicited Data */ 122*4882a593Smuzhiyun FC_CAT_DATA_DESC = 0x5, /* Data Descriptor */ 123*4882a593Smuzhiyun FC_CAT_UNSOLICIT_CMD = 0x6, /* Unsolicited Command */ 124*4882a593Smuzhiyun FC_CAT_CMD_STATUS = 0x7, /* Command Status */ 125*4882a593Smuzhiyun }; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun /* 128*4882a593Smuzhiyun * Type Field Definitions. FC-PH Section 18.5 pg. 165 129*4882a593Smuzhiyun */ 130*4882a593Smuzhiyun enum { 131*4882a593Smuzhiyun FC_TYPE_BLS = 0x0, /* Basic Link Service */ 132*4882a593Smuzhiyun FC_TYPE_ELS = 0x1, /* Extended Link Service */ 133*4882a593Smuzhiyun FC_TYPE_IP = 0x5, /* IP */ 134*4882a593Smuzhiyun FC_TYPE_FCP = 0x8, /* SCSI-FCP */ 135*4882a593Smuzhiyun FC_TYPE_GPP = 0x9, /* SCSI_GPP */ 136*4882a593Smuzhiyun FC_TYPE_SERVICES = 0x20, /* Fibre Channel Services */ 137*4882a593Smuzhiyun FC_TYPE_FC_FSS = 0x22, /* Fabric Switch Services */ 138*4882a593Smuzhiyun FC_TYPE_FC_AL = 0x23, /* FC-AL */ 139*4882a593Smuzhiyun FC_TYPE_FC_SNMP = 0x24, /* FC-SNMP */ 140*4882a593Smuzhiyun FC_TYPE_FC_SPINFAB = 0xEE, /* SPINFAB */ 141*4882a593Smuzhiyun FC_TYPE_FC_DIAG = 0xEF, /* DIAG */ 142*4882a593Smuzhiyun FC_TYPE_MAX = 256, /* 256 FC-4 types */ 143*4882a593Smuzhiyun }; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /* 146*4882a593Smuzhiyun * Frame Control Definitions. FC-PH Table-45. pg. 168 147*4882a593Smuzhiyun */ 148*4882a593Smuzhiyun enum { 149*4882a593Smuzhiyun FCTL_EC_ORIG = 0x000000, /* exchange originator */ 150*4882a593Smuzhiyun FCTL_EC_RESP = 0x800000, /* exchange responder */ 151*4882a593Smuzhiyun FCTL_SEQ_INI = 0x000000, /* sequence initiator */ 152*4882a593Smuzhiyun FCTL_SEQ_REC = 0x400000, /* sequence recipient */ 153*4882a593Smuzhiyun FCTL_FS_EXCH = 0x200000, /* first sequence of xchg */ 154*4882a593Smuzhiyun FCTL_LS_EXCH = 0x100000, /* last sequence of xchg */ 155*4882a593Smuzhiyun FCTL_END_SEQ = 0x080000, /* last frame of sequence */ 156*4882a593Smuzhiyun FCTL_SI_XFER = 0x010000, /* seq initiative transfer */ 157*4882a593Smuzhiyun FCTL_RO_PRESENT = 0x000008, /* relative offset present */ 158*4882a593Smuzhiyun FCTL_FILLBYTE_MASK = 0x000003 /* , fill byte mask */ 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* 162*4882a593Smuzhiyun * Fabric Well Known Addresses 163*4882a593Smuzhiyun */ 164*4882a593Smuzhiyun enum { 165*4882a593Smuzhiyun FC_MIN_WELL_KNOWN_ADDR = 0xFFFFF0, 166*4882a593Smuzhiyun FC_DOMAIN_CONTROLLER_MASK = 0xFFFC00, 167*4882a593Smuzhiyun FC_ALIAS_SERVER = 0xFFFFF8, 168*4882a593Smuzhiyun FC_MGMT_SERVER = 0xFFFFFA, 169*4882a593Smuzhiyun FC_TIME_SERVER = 0xFFFFFB, 170*4882a593Smuzhiyun FC_NAME_SERVER = 0xFFFFFC, 171*4882a593Smuzhiyun FC_FABRIC_CONTROLLER = 0xFFFFFD, 172*4882a593Smuzhiyun FC_FABRIC_PORT = 0xFFFFFE, 173*4882a593Smuzhiyun FC_BROADCAST_SERVER = 0xFFFFFF 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /* 177*4882a593Smuzhiyun * domain/area/port defines 178*4882a593Smuzhiyun */ 179*4882a593Smuzhiyun #define FC_DOMAIN_MASK 0xFF0000 180*4882a593Smuzhiyun #define FC_DOMAIN_SHIFT 16 181*4882a593Smuzhiyun #define FC_AREA_MASK 0x00FF00 182*4882a593Smuzhiyun #define FC_AREA_SHIFT 8 183*4882a593Smuzhiyun #define FC_PORT_MASK 0x0000FF 184*4882a593Smuzhiyun #define FC_PORT_SHIFT 0 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #define FC_GET_DOMAIN(p) (((p) & FC_DOMAIN_MASK) >> FC_DOMAIN_SHIFT) 187*4882a593Smuzhiyun #define FC_GET_AREA(p) (((p) & FC_AREA_MASK) >> FC_AREA_SHIFT) 188*4882a593Smuzhiyun #define FC_GET_PORT(p) (((p) & FC_PORT_MASK) >> FC_PORT_SHIFT) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #define FC_DOMAIN_CTRLR(p) (FC_DOMAIN_CONTROLLER_MASK | (FC_GET_DOMAIN(p))) 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun enum { 193*4882a593Smuzhiyun FC_RXID_ANY = 0xFFFFU, 194*4882a593Smuzhiyun }; 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun /* 197*4882a593Smuzhiyun * generic ELS command 198*4882a593Smuzhiyun */ 199*4882a593Smuzhiyun struct fc_els_cmd_s { 200*4882a593Smuzhiyun u32 els_code:8; /* ELS Command Code */ 201*4882a593Smuzhiyun u32 reserved:24; 202*4882a593Smuzhiyun }; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun /* 205*4882a593Smuzhiyun * ELS Command Codes. FC-PH Table-75. pg. 223 206*4882a593Smuzhiyun */ 207*4882a593Smuzhiyun enum { 208*4882a593Smuzhiyun FC_ELS_LS_RJT = 0x1, /* Link Service Reject. */ 209*4882a593Smuzhiyun FC_ELS_ACC = 0x02, /* Accept */ 210*4882a593Smuzhiyun FC_ELS_PLOGI = 0x03, /* N_Port Login. */ 211*4882a593Smuzhiyun FC_ELS_FLOGI = 0x04, /* F_Port Login. */ 212*4882a593Smuzhiyun FC_ELS_LOGO = 0x05, /* Logout. */ 213*4882a593Smuzhiyun FC_ELS_ABTX = 0x06, /* Abort Exchange */ 214*4882a593Smuzhiyun FC_ELS_RES = 0x08, /* Read Exchange status */ 215*4882a593Smuzhiyun FC_ELS_RSS = 0x09, /* Read sequence status block */ 216*4882a593Smuzhiyun FC_ELS_RSI = 0x0A, /* Request Sequence Initiative */ 217*4882a593Smuzhiyun FC_ELS_ESTC = 0x0C, /* Estimate Credit. */ 218*4882a593Smuzhiyun FC_ELS_RTV = 0x0E, /* Read Timeout Value. */ 219*4882a593Smuzhiyun FC_ELS_RLS = 0x0F, /* Read Link Status. */ 220*4882a593Smuzhiyun FC_ELS_ECHO = 0x10, /* Echo */ 221*4882a593Smuzhiyun FC_ELS_TEST = 0x11, /* Test */ 222*4882a593Smuzhiyun FC_ELS_RRQ = 0x12, /* Reinstate Recovery Qualifier. */ 223*4882a593Smuzhiyun FC_ELS_REC = 0x13, /* Add this for TAPE support in FCR */ 224*4882a593Smuzhiyun FC_ELS_PRLI = 0x20, /* Process Login */ 225*4882a593Smuzhiyun FC_ELS_PRLO = 0x21, /* Process Logout. */ 226*4882a593Smuzhiyun FC_ELS_SCN = 0x22, /* State Change Notification. */ 227*4882a593Smuzhiyun FC_ELS_TPRLO = 0x24, /* Third Party Process Logout. */ 228*4882a593Smuzhiyun FC_ELS_PDISC = 0x50, /* Discover N_Port Parameters. */ 229*4882a593Smuzhiyun FC_ELS_FDISC = 0x51, /* Discover F_Port Parameters. */ 230*4882a593Smuzhiyun FC_ELS_ADISC = 0x52, /* Discover Address. */ 231*4882a593Smuzhiyun FC_ELS_FARP_REQ = 0x54, /* FARP Request. */ 232*4882a593Smuzhiyun FC_ELS_FARP_REP = 0x55, /* FARP Reply. */ 233*4882a593Smuzhiyun FC_ELS_FAN = 0x60, /* Fabric Address Notification */ 234*4882a593Smuzhiyun FC_ELS_RSCN = 0x61, /* Reg State Change Notification */ 235*4882a593Smuzhiyun FC_ELS_SCR = 0x62, /* State Change Registration. */ 236*4882a593Smuzhiyun FC_ELS_RTIN = 0x77, /* Mangement server request */ 237*4882a593Smuzhiyun FC_ELS_RNID = 0x78, /* Mangement server request */ 238*4882a593Smuzhiyun FC_ELS_RLIR = 0x79, /* Registered Link Incident Record */ 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun FC_ELS_RPSC = 0x7D, /* Report Port Speed Capabilities */ 241*4882a593Smuzhiyun FC_ELS_QSA = 0x7E, /* Query Security Attributes. Ref FC-SP */ 242*4882a593Smuzhiyun FC_ELS_E2E_LBEACON = 0x81, 243*4882a593Smuzhiyun /* End-to-End Link Beacon */ 244*4882a593Smuzhiyun FC_ELS_AUTH = 0x90, /* Authentication. Ref FC-SP */ 245*4882a593Smuzhiyun FC_ELS_RFCN = 0x97, /* Request Fabric Change Notification. Ref 246*4882a593Smuzhiyun *FC-SP */ 247*4882a593Smuzhiyun }; 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun /* 250*4882a593Smuzhiyun * Version numbers for FC-PH standards, 251*4882a593Smuzhiyun * used in login to indicate what port 252*4882a593Smuzhiyun * supports. See FC-PH-X table 158. 253*4882a593Smuzhiyun */ 254*4882a593Smuzhiyun enum { 255*4882a593Smuzhiyun FC_PH_VER_4_3 = 0x09, 256*4882a593Smuzhiyun FC_PH_VER_PH_3 = 0x20, 257*4882a593Smuzhiyun }; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* 260*4882a593Smuzhiyun * PDU size defines 261*4882a593Smuzhiyun */ 262*4882a593Smuzhiyun enum { 263*4882a593Smuzhiyun FC_MIN_PDUSZ = 512, 264*4882a593Smuzhiyun FC_MAX_PDUSZ = 2112, 265*4882a593Smuzhiyun }; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun /* 268*4882a593Smuzhiyun * N_Port PLOGI Common Service Parameters. 269*4882a593Smuzhiyun * FC-PH-x. Figure-76. pg. 308. 270*4882a593Smuzhiyun */ 271*4882a593Smuzhiyun struct fc_plogi_csp_s { 272*4882a593Smuzhiyun u8 verhi; /* FC-PH high version */ 273*4882a593Smuzhiyun u8 verlo; /* FC-PH low version */ 274*4882a593Smuzhiyun __be16 bbcred; /* BB_Credit */ 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 277*4882a593Smuzhiyun u8 ciro:1, /* continuously increasing RO */ 278*4882a593Smuzhiyun rro:1, /* random relative offset */ 279*4882a593Smuzhiyun npiv_supp:1, /* NPIV supported */ 280*4882a593Smuzhiyun port_type:1, /* N_Port/F_port */ 281*4882a593Smuzhiyun altbbcred:1, /* alternate BB_Credit */ 282*4882a593Smuzhiyun resolution:1, /* ms/ns ED_TOV resolution */ 283*4882a593Smuzhiyun vvl_info:1, /* VVL Info included */ 284*4882a593Smuzhiyun reserved1:1; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun u8 hg_supp:1, 287*4882a593Smuzhiyun query_dbc:1, 288*4882a593Smuzhiyun security:1, 289*4882a593Smuzhiyun sync_cap:1, 290*4882a593Smuzhiyun r_t_tov:1, 291*4882a593Smuzhiyun dh_dup_supp:1, 292*4882a593Smuzhiyun cisc:1, /* continuously increasing seq count */ 293*4882a593Smuzhiyun payload:1; 294*4882a593Smuzhiyun #else 295*4882a593Smuzhiyun u8 reserved2:2, 296*4882a593Smuzhiyun resolution:1, /* ms/ns ED_TOV resolution */ 297*4882a593Smuzhiyun altbbcred:1, /* alternate BB_Credit */ 298*4882a593Smuzhiyun port_type:1, /* N_Port/F_port */ 299*4882a593Smuzhiyun npiv_supp:1, /* NPIV supported */ 300*4882a593Smuzhiyun rro:1, /* random relative offset */ 301*4882a593Smuzhiyun ciro:1; /* continuously increasing RO */ 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun u8 payload:1, 304*4882a593Smuzhiyun cisc:1, /* continuously increasing seq count */ 305*4882a593Smuzhiyun dh_dup_supp:1, 306*4882a593Smuzhiyun r_t_tov:1, 307*4882a593Smuzhiyun sync_cap:1, 308*4882a593Smuzhiyun security:1, 309*4882a593Smuzhiyun query_dbc:1, 310*4882a593Smuzhiyun hg_supp:1; 311*4882a593Smuzhiyun #endif 312*4882a593Smuzhiyun __be16 rxsz; /* receive data_field size */ 313*4882a593Smuzhiyun __be16 conseq; 314*4882a593Smuzhiyun __be16 ro_bitmap; 315*4882a593Smuzhiyun __be32 e_d_tov; 316*4882a593Smuzhiyun }; 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun /* 319*4882a593Smuzhiyun * N_Port PLOGI Class Specific Parameters. 320*4882a593Smuzhiyun * FC-PH-x. Figure 78. pg. 318. 321*4882a593Smuzhiyun */ 322*4882a593Smuzhiyun struct fc_plogi_clp_s { 323*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 324*4882a593Smuzhiyun u32 class_valid:1; 325*4882a593Smuzhiyun u32 intermix:1; /* class intermix supported if set =1. 326*4882a593Smuzhiyun * valid only for class1. Reserved for 327*4882a593Smuzhiyun * class2 & class3 */ 328*4882a593Smuzhiyun u32 reserved1:2; 329*4882a593Smuzhiyun u32 sequential:1; 330*4882a593Smuzhiyun u32 reserved2:3; 331*4882a593Smuzhiyun #else 332*4882a593Smuzhiyun u32 reserved2:3; 333*4882a593Smuzhiyun u32 sequential:1; 334*4882a593Smuzhiyun u32 reserved1:2; 335*4882a593Smuzhiyun u32 intermix:1; /* class intermix supported if set =1. 336*4882a593Smuzhiyun * valid only for class1. Reserved for 337*4882a593Smuzhiyun * class2 & class3 */ 338*4882a593Smuzhiyun u32 class_valid:1; 339*4882a593Smuzhiyun #endif 340*4882a593Smuzhiyun u32 reserved3:24; 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun u32 reserved4:16; 343*4882a593Smuzhiyun u32 rxsz:16; /* Receive data_field size */ 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun u32 reserved5:8; 346*4882a593Smuzhiyun u32 conseq:8; 347*4882a593Smuzhiyun u32 e2e_credit:16; /* end to end credit */ 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun u32 reserved7:8; 350*4882a593Smuzhiyun u32 ospx:8; 351*4882a593Smuzhiyun u32 reserved8:16; 352*4882a593Smuzhiyun }; 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /* ASCII value for each character in string "BRCD" */ 355*4882a593Smuzhiyun #define FLOGI_VVL_BRCD 0x42524344 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun /* 358*4882a593Smuzhiyun * PLOGI els command and reply payload 359*4882a593Smuzhiyun */ 360*4882a593Smuzhiyun struct fc_logi_s { 361*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 362*4882a593Smuzhiyun struct fc_plogi_csp_s csp; /* common service params */ 363*4882a593Smuzhiyun wwn_t port_name; 364*4882a593Smuzhiyun wwn_t node_name; 365*4882a593Smuzhiyun struct fc_plogi_clp_s class1; /* class 1 service parameters */ 366*4882a593Smuzhiyun struct fc_plogi_clp_s class2; /* class 2 service parameters */ 367*4882a593Smuzhiyun struct fc_plogi_clp_s class3; /* class 3 service parameters */ 368*4882a593Smuzhiyun struct fc_plogi_clp_s class4; /* class 4 service parameters */ 369*4882a593Smuzhiyun u8 vvl[16]; /* vendor version level */ 370*4882a593Smuzhiyun }; 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun /* 373*4882a593Smuzhiyun * LOGO els command payload 374*4882a593Smuzhiyun */ 375*4882a593Smuzhiyun struct fc_logo_s { 376*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 377*4882a593Smuzhiyun u32 res1:8; 378*4882a593Smuzhiyun u32 nport_id:24; /* N_Port identifier of source */ 379*4882a593Smuzhiyun wwn_t orig_port_name; /* Port name of the LOGO originator */ 380*4882a593Smuzhiyun }; 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun /* 383*4882a593Smuzhiyun * ADISC els command payload 384*4882a593Smuzhiyun */ 385*4882a593Smuzhiyun struct fc_adisc_s { 386*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 387*4882a593Smuzhiyun u32 res1:8; 388*4882a593Smuzhiyun u32 orig_HA:24; /* originator hard address */ 389*4882a593Smuzhiyun wwn_t orig_port_name; /* originator port name */ 390*4882a593Smuzhiyun wwn_t orig_node_name; /* originator node name */ 391*4882a593Smuzhiyun u32 res2:8; 392*4882a593Smuzhiyun u32 nport_id:24; /* originator NPortID */ 393*4882a593Smuzhiyun }; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* 396*4882a593Smuzhiyun * Exchange status block 397*4882a593Smuzhiyun */ 398*4882a593Smuzhiyun struct fc_exch_status_blk_s { 399*4882a593Smuzhiyun u32 oxid:16; 400*4882a593Smuzhiyun u32 rxid:16; 401*4882a593Smuzhiyun u32 res1:8; 402*4882a593Smuzhiyun u32 orig_np:24; /* originator NPortID */ 403*4882a593Smuzhiyun u32 res2:8; 404*4882a593Smuzhiyun u32 resp_np:24; /* responder NPortID */ 405*4882a593Smuzhiyun u32 es_bits; 406*4882a593Smuzhiyun u32 res3; 407*4882a593Smuzhiyun /* 408*4882a593Smuzhiyun * un modified section of the fields 409*4882a593Smuzhiyun */ 410*4882a593Smuzhiyun }; 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun /* 413*4882a593Smuzhiyun * RES els command payload 414*4882a593Smuzhiyun */ 415*4882a593Smuzhiyun struct fc_res_s { 416*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 417*4882a593Smuzhiyun u32 res1:8; 418*4882a593Smuzhiyun u32 nport_id:24; /* N_Port identifier of source */ 419*4882a593Smuzhiyun u32 oxid:16; 420*4882a593Smuzhiyun u32 rxid:16; 421*4882a593Smuzhiyun u8 assoc_hdr[32]; 422*4882a593Smuzhiyun }; 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun /* 425*4882a593Smuzhiyun * RES els accept payload 426*4882a593Smuzhiyun */ 427*4882a593Smuzhiyun struct fc_res_acc_s { 428*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 429*4882a593Smuzhiyun struct fc_exch_status_blk_s fc_exch_blk; /* Exchange status block */ 430*4882a593Smuzhiyun }; 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /* 433*4882a593Smuzhiyun * REC els command payload 434*4882a593Smuzhiyun */ 435*4882a593Smuzhiyun struct fc_rec_s { 436*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 437*4882a593Smuzhiyun u32 res1:8; 438*4882a593Smuzhiyun u32 nport_id:24; /* N_Port identifier of source */ 439*4882a593Smuzhiyun u32 oxid:16; 440*4882a593Smuzhiyun u32 rxid:16; 441*4882a593Smuzhiyun }; 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun #define FC_REC_ESB_OWN_RSP 0x80000000 /* responder owns */ 444*4882a593Smuzhiyun #define FC_REC_ESB_SI 0x40000000 /* SI is owned */ 445*4882a593Smuzhiyun #define FC_REC_ESB_COMP 0x20000000 /* exchange is complete */ 446*4882a593Smuzhiyun #define FC_REC_ESB_ENDCOND_ABN 0x10000000 /* abnormal ending */ 447*4882a593Smuzhiyun #define FC_REC_ESB_RQACT 0x04000000 /* recovery qual active */ 448*4882a593Smuzhiyun #define FC_REC_ESB_ERRP_MSK 0x03000000 449*4882a593Smuzhiyun #define FC_REC_ESB_OXID_INV 0x00800000 /* invalid OXID */ 450*4882a593Smuzhiyun #define FC_REC_ESB_RXID_INV 0x00400000 /* invalid RXID */ 451*4882a593Smuzhiyun #define FC_REC_ESB_PRIO_INUSE 0x00200000 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun /* 454*4882a593Smuzhiyun * REC els accept payload 455*4882a593Smuzhiyun */ 456*4882a593Smuzhiyun struct fc_rec_acc_s { 457*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 458*4882a593Smuzhiyun u32 oxid:16; 459*4882a593Smuzhiyun u32 rxid:16; 460*4882a593Smuzhiyun u32 res1:8; 461*4882a593Smuzhiyun u32 orig_id:24; /* N_Port id of exchange originator */ 462*4882a593Smuzhiyun u32 res2:8; 463*4882a593Smuzhiyun u32 resp_id:24; /* N_Port id of exchange responder */ 464*4882a593Smuzhiyun u32 count; /* data transfer count */ 465*4882a593Smuzhiyun u32 e_stat; /* exchange status */ 466*4882a593Smuzhiyun }; 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun /* 469*4882a593Smuzhiyun * RSI els payload 470*4882a593Smuzhiyun */ 471*4882a593Smuzhiyun struct fc_rsi_s { 472*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; 473*4882a593Smuzhiyun u32 res1:8; 474*4882a593Smuzhiyun u32 orig_sid:24; 475*4882a593Smuzhiyun u32 oxid:16; 476*4882a593Smuzhiyun u32 rxid:16; 477*4882a593Smuzhiyun }; 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun /* 480*4882a593Smuzhiyun * structure for PRLI paramater pages, both request & response 481*4882a593Smuzhiyun * see FC-PH-X table 113 & 115 for explanation also FCP table 8 482*4882a593Smuzhiyun */ 483*4882a593Smuzhiyun struct fc_prli_params_s { 484*4882a593Smuzhiyun u32 reserved:16; 485*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 486*4882a593Smuzhiyun u32 reserved1:5; 487*4882a593Smuzhiyun u32 rec_support:1; 488*4882a593Smuzhiyun u32 task_retry_id:1; 489*4882a593Smuzhiyun u32 retry:1; 490*4882a593Smuzhiyun 491*4882a593Smuzhiyun u32 confirm:1; 492*4882a593Smuzhiyun u32 doverlay:1; 493*4882a593Smuzhiyun u32 initiator:1; 494*4882a593Smuzhiyun u32 target:1; 495*4882a593Smuzhiyun u32 cdmix:1; 496*4882a593Smuzhiyun u32 drmix:1; 497*4882a593Smuzhiyun u32 rxrdisab:1; 498*4882a593Smuzhiyun u32 wxrdisab:1; 499*4882a593Smuzhiyun #else 500*4882a593Smuzhiyun u32 retry:1; 501*4882a593Smuzhiyun u32 task_retry_id:1; 502*4882a593Smuzhiyun u32 rec_support:1; 503*4882a593Smuzhiyun u32 reserved1:5; 504*4882a593Smuzhiyun 505*4882a593Smuzhiyun u32 wxrdisab:1; 506*4882a593Smuzhiyun u32 rxrdisab:1; 507*4882a593Smuzhiyun u32 drmix:1; 508*4882a593Smuzhiyun u32 cdmix:1; 509*4882a593Smuzhiyun u32 target:1; 510*4882a593Smuzhiyun u32 initiator:1; 511*4882a593Smuzhiyun u32 doverlay:1; 512*4882a593Smuzhiyun u32 confirm:1; 513*4882a593Smuzhiyun #endif 514*4882a593Smuzhiyun }; 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun /* 517*4882a593Smuzhiyun * valid values for rspcode in PRLI ACC payload 518*4882a593Smuzhiyun */ 519*4882a593Smuzhiyun enum { 520*4882a593Smuzhiyun FC_PRLI_ACC_XQTD = 0x1, /* request executed */ 521*4882a593Smuzhiyun FC_PRLI_ACC_PREDEF_IMG = 0x5, /* predefined image - no prli needed */ 522*4882a593Smuzhiyun }; 523*4882a593Smuzhiyun 524*4882a593Smuzhiyun struct fc_prli_params_page_s { 525*4882a593Smuzhiyun u32 type:8; 526*4882a593Smuzhiyun u32 codext:8; 527*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 528*4882a593Smuzhiyun u32 origprocasv:1; 529*4882a593Smuzhiyun u32 rsppav:1; 530*4882a593Smuzhiyun u32 imagepair:1; 531*4882a593Smuzhiyun u32 reserved1:1; 532*4882a593Smuzhiyun u32 rspcode:4; 533*4882a593Smuzhiyun #else 534*4882a593Smuzhiyun u32 rspcode:4; 535*4882a593Smuzhiyun u32 reserved1:1; 536*4882a593Smuzhiyun u32 imagepair:1; 537*4882a593Smuzhiyun u32 rsppav:1; 538*4882a593Smuzhiyun u32 origprocasv:1; 539*4882a593Smuzhiyun #endif 540*4882a593Smuzhiyun u32 reserved2:8; 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun u32 origprocas; 543*4882a593Smuzhiyun u32 rspprocas; 544*4882a593Smuzhiyun struct fc_prli_params_s servparams; 545*4882a593Smuzhiyun }; 546*4882a593Smuzhiyun 547*4882a593Smuzhiyun /* 548*4882a593Smuzhiyun * PRLI request and accept payload, FC-PH-X tables 112 & 114 549*4882a593Smuzhiyun */ 550*4882a593Smuzhiyun struct fc_prli_s { 551*4882a593Smuzhiyun u32 command:8; 552*4882a593Smuzhiyun u32 pglen:8; 553*4882a593Smuzhiyun u32 pagebytes:16; 554*4882a593Smuzhiyun struct fc_prli_params_page_s parampage; 555*4882a593Smuzhiyun }; 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun /* 558*4882a593Smuzhiyun * PRLO logout params page 559*4882a593Smuzhiyun */ 560*4882a593Smuzhiyun struct fc_prlo_params_page_s { 561*4882a593Smuzhiyun u32 type:8; 562*4882a593Smuzhiyun u32 type_ext:8; 563*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 564*4882a593Smuzhiyun u32 opa_valid:1; /* originator process associator valid */ 565*4882a593Smuzhiyun u32 rpa_valid:1; /* responder process associator valid */ 566*4882a593Smuzhiyun u32 res1:14; 567*4882a593Smuzhiyun #else 568*4882a593Smuzhiyun u32 res1:14; 569*4882a593Smuzhiyun u32 rpa_valid:1; /* responder process associator valid */ 570*4882a593Smuzhiyun u32 opa_valid:1; /* originator process associator valid */ 571*4882a593Smuzhiyun #endif 572*4882a593Smuzhiyun u32 orig_process_assc; 573*4882a593Smuzhiyun u32 resp_process_assc; 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun u32 res2; 576*4882a593Smuzhiyun }; 577*4882a593Smuzhiyun 578*4882a593Smuzhiyun /* 579*4882a593Smuzhiyun * PRLO els command payload 580*4882a593Smuzhiyun */ 581*4882a593Smuzhiyun struct fc_prlo_s { 582*4882a593Smuzhiyun u32 command:8; 583*4882a593Smuzhiyun u32 page_len:8; 584*4882a593Smuzhiyun u32 payload_len:16; 585*4882a593Smuzhiyun struct fc_prlo_params_page_s prlo_params[1]; 586*4882a593Smuzhiyun }; 587*4882a593Smuzhiyun 588*4882a593Smuzhiyun /* 589*4882a593Smuzhiyun * PRLO Logout response parameter page 590*4882a593Smuzhiyun */ 591*4882a593Smuzhiyun struct fc_prlo_acc_params_page_s { 592*4882a593Smuzhiyun u32 type:8; 593*4882a593Smuzhiyun u32 type_ext:8; 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 596*4882a593Smuzhiyun u32 opa_valid:1; /* originator process associator valid */ 597*4882a593Smuzhiyun u32 rpa_valid:1; /* responder process associator valid */ 598*4882a593Smuzhiyun u32 res1:14; 599*4882a593Smuzhiyun #else 600*4882a593Smuzhiyun u32 res1:14; 601*4882a593Smuzhiyun u32 rpa_valid:1; /* responder process associator valid */ 602*4882a593Smuzhiyun u32 opa_valid:1; /* originator process associator valid */ 603*4882a593Smuzhiyun #endif 604*4882a593Smuzhiyun u32 orig_process_assc; 605*4882a593Smuzhiyun u32 resp_process_assc; 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun u32 fc4type_csp; 608*4882a593Smuzhiyun }; 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun /* 611*4882a593Smuzhiyun * PRLO els command ACC payload 612*4882a593Smuzhiyun */ 613*4882a593Smuzhiyun struct fc_prlo_acc_s { 614*4882a593Smuzhiyun u32 command:8; 615*4882a593Smuzhiyun u32 page_len:8; 616*4882a593Smuzhiyun u32 payload_len:16; 617*4882a593Smuzhiyun struct fc_prlo_acc_params_page_s prlo_acc_params[1]; 618*4882a593Smuzhiyun }; 619*4882a593Smuzhiyun 620*4882a593Smuzhiyun /* 621*4882a593Smuzhiyun * SCR els command payload 622*4882a593Smuzhiyun */ 623*4882a593Smuzhiyun enum { 624*4882a593Smuzhiyun FC_SCR_REG_FUNC_FABRIC_DETECTED = 0x01, 625*4882a593Smuzhiyun FC_SCR_REG_FUNC_N_PORT_DETECTED = 0x02, 626*4882a593Smuzhiyun FC_SCR_REG_FUNC_FULL = 0x03, 627*4882a593Smuzhiyun FC_SCR_REG_FUNC_CLEAR_REG = 0xFF, 628*4882a593Smuzhiyun }; 629*4882a593Smuzhiyun 630*4882a593Smuzhiyun /* SCR VU registrations */ 631*4882a593Smuzhiyun enum { 632*4882a593Smuzhiyun FC_VU_SCR_REG_FUNC_FABRIC_NAME_CHANGE = 0x01 633*4882a593Smuzhiyun }; 634*4882a593Smuzhiyun 635*4882a593Smuzhiyun struct fc_scr_s { 636*4882a593Smuzhiyun u32 command:8; 637*4882a593Smuzhiyun u32 res:24; 638*4882a593Smuzhiyun u32 vu_reg_func:8; /* Vendor Unique Registrations */ 639*4882a593Smuzhiyun u32 res1:16; 640*4882a593Smuzhiyun u32 reg_func:8; 641*4882a593Smuzhiyun }; 642*4882a593Smuzhiyun 643*4882a593Smuzhiyun /* 644*4882a593Smuzhiyun * Information category for Basic link data 645*4882a593Smuzhiyun */ 646*4882a593Smuzhiyun enum { 647*4882a593Smuzhiyun FC_CAT_NOP = 0x0, 648*4882a593Smuzhiyun FC_CAT_ABTS = 0x1, 649*4882a593Smuzhiyun FC_CAT_RMC = 0x2, 650*4882a593Smuzhiyun FC_CAT_BA_ACC = 0x4, 651*4882a593Smuzhiyun FC_CAT_BA_RJT = 0x5, 652*4882a593Smuzhiyun FC_CAT_PRMT = 0x6, 653*4882a593Smuzhiyun }; 654*4882a593Smuzhiyun 655*4882a593Smuzhiyun /* 656*4882a593Smuzhiyun * LS_RJT els reply payload 657*4882a593Smuzhiyun */ 658*4882a593Smuzhiyun struct fc_ls_rjt_s { 659*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 660*4882a593Smuzhiyun u32 res1:8; 661*4882a593Smuzhiyun u32 reason_code:8; /* Reason code for reject */ 662*4882a593Smuzhiyun u32 reason_code_expl:8; /* Reason code explanation */ 663*4882a593Smuzhiyun u32 vendor_unique:8; /* Vendor specific */ 664*4882a593Smuzhiyun }; 665*4882a593Smuzhiyun 666*4882a593Smuzhiyun /* 667*4882a593Smuzhiyun * LS_RJT reason codes 668*4882a593Smuzhiyun */ 669*4882a593Smuzhiyun enum { 670*4882a593Smuzhiyun FC_LS_RJT_RSN_INV_CMD_CODE = 0x01, 671*4882a593Smuzhiyun FC_LS_RJT_RSN_LOGICAL_ERROR = 0x03, 672*4882a593Smuzhiyun FC_LS_RJT_RSN_LOGICAL_BUSY = 0x05, 673*4882a593Smuzhiyun FC_LS_RJT_RSN_PROTOCOL_ERROR = 0x07, 674*4882a593Smuzhiyun FC_LS_RJT_RSN_UNABLE_TO_PERF_CMD = 0x09, 675*4882a593Smuzhiyun FC_LS_RJT_RSN_CMD_NOT_SUPP = 0x0B, 676*4882a593Smuzhiyun }; 677*4882a593Smuzhiyun 678*4882a593Smuzhiyun /* 679*4882a593Smuzhiyun * LS_RJT reason code explanation 680*4882a593Smuzhiyun */ 681*4882a593Smuzhiyun enum { 682*4882a593Smuzhiyun FC_LS_RJT_EXP_NO_ADDL_INFO = 0x00, 683*4882a593Smuzhiyun FC_LS_RJT_EXP_SPARMS_ERR_OPTIONS = 0x01, 684*4882a593Smuzhiyun FC_LS_RJT_EXP_SPARMS_ERR_INI_CTL = 0x03, 685*4882a593Smuzhiyun FC_LS_RJT_EXP_SPARMS_ERR_REC_CTL = 0x05, 686*4882a593Smuzhiyun FC_LS_RJT_EXP_SPARMS_ERR_RXSZ = 0x07, 687*4882a593Smuzhiyun FC_LS_RJT_EXP_SPARMS_ERR_CONSEQ = 0x09, 688*4882a593Smuzhiyun FC_LS_RJT_EXP_SPARMS_ERR_CREDIT = 0x0B, 689*4882a593Smuzhiyun FC_LS_RJT_EXP_INV_PORT_NAME = 0x0D, 690*4882a593Smuzhiyun FC_LS_RJT_EXP_INV_NODE_FABRIC_NAME = 0x0E, 691*4882a593Smuzhiyun FC_LS_RJT_EXP_INV_CSP = 0x0F, 692*4882a593Smuzhiyun FC_LS_RJT_EXP_INV_ASSOC_HDR = 0x11, 693*4882a593Smuzhiyun FC_LS_RJT_EXP_ASSOC_HDR_REQD = 0x13, 694*4882a593Smuzhiyun FC_LS_RJT_EXP_INV_ORIG_S_ID = 0x15, 695*4882a593Smuzhiyun FC_LS_RJT_EXP_INV_OXID_RXID_COMB = 0x17, 696*4882a593Smuzhiyun FC_LS_RJT_EXP_CMD_ALREADY_IN_PROG = 0x19, 697*4882a593Smuzhiyun FC_LS_RJT_EXP_LOGIN_REQUIRED = 0x1E, 698*4882a593Smuzhiyun FC_LS_RJT_EXP_INVALID_NPORT_ID = 0x1F, 699*4882a593Smuzhiyun FC_LS_RJT_EXP_INSUFF_RES = 0x29, 700*4882a593Smuzhiyun FC_LS_RJT_EXP_CMD_NOT_SUPP = 0x2C, 701*4882a593Smuzhiyun FC_LS_RJT_EXP_INV_PAYLOAD_LEN = 0x2D, 702*4882a593Smuzhiyun }; 703*4882a593Smuzhiyun 704*4882a593Smuzhiyun /* 705*4882a593Smuzhiyun * RRQ els command payload 706*4882a593Smuzhiyun */ 707*4882a593Smuzhiyun struct fc_rrq_s { 708*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; /* ELS command code */ 709*4882a593Smuzhiyun u32 res1:8; 710*4882a593Smuzhiyun u32 s_id:24; /* exchange originator S_ID */ 711*4882a593Smuzhiyun 712*4882a593Smuzhiyun u32 ox_id:16; /* originator exchange ID */ 713*4882a593Smuzhiyun u32 rx_id:16; /* responder exchange ID */ 714*4882a593Smuzhiyun 715*4882a593Smuzhiyun u32 res2[8]; /* optional association header */ 716*4882a593Smuzhiyun }; 717*4882a593Smuzhiyun 718*4882a593Smuzhiyun /* 719*4882a593Smuzhiyun * ABTS BA_ACC reply payload 720*4882a593Smuzhiyun */ 721*4882a593Smuzhiyun struct fc_ba_acc_s { 722*4882a593Smuzhiyun u32 seq_id_valid:8; /* set to 0x00 for Abort Exchange */ 723*4882a593Smuzhiyun u32 seq_id:8; /* invalid for Abort Exchange */ 724*4882a593Smuzhiyun u32 res2:16; 725*4882a593Smuzhiyun u32 ox_id:16; /* OX_ID from ABTS frame */ 726*4882a593Smuzhiyun u32 rx_id:16; /* RX_ID from ABTS frame */ 727*4882a593Smuzhiyun u32 low_seq_cnt:16; /* set to 0x0000 for Abort Exchange */ 728*4882a593Smuzhiyun u32 high_seq_cnt:16; /* set to 0xFFFF for Abort Exchange */ 729*4882a593Smuzhiyun }; 730*4882a593Smuzhiyun 731*4882a593Smuzhiyun /* 732*4882a593Smuzhiyun * ABTS BA_RJT reject payload 733*4882a593Smuzhiyun */ 734*4882a593Smuzhiyun struct fc_ba_rjt_s { 735*4882a593Smuzhiyun u32 res1:8; /* Reserved */ 736*4882a593Smuzhiyun u32 reason_code:8; /* reason code for reject */ 737*4882a593Smuzhiyun u32 reason_expl:8; /* reason code explanation */ 738*4882a593Smuzhiyun u32 vendor_unique:8; /* vendor unique reason code,set to 0 */ 739*4882a593Smuzhiyun }; 740*4882a593Smuzhiyun 741*4882a593Smuzhiyun /* 742*4882a593Smuzhiyun * TPRLO logout parameter page 743*4882a593Smuzhiyun */ 744*4882a593Smuzhiyun struct fc_tprlo_params_page_s { 745*4882a593Smuzhiyun u32 type:8; 746*4882a593Smuzhiyun u32 type_ext:8; 747*4882a593Smuzhiyun 748*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 749*4882a593Smuzhiyun u32 opa_valid:1; 750*4882a593Smuzhiyun u32 rpa_valid:1; 751*4882a593Smuzhiyun u32 tpo_nport_valid:1; 752*4882a593Smuzhiyun u32 global_process_logout:1; 753*4882a593Smuzhiyun u32 res1:12; 754*4882a593Smuzhiyun #else 755*4882a593Smuzhiyun u32 res1:12; 756*4882a593Smuzhiyun u32 global_process_logout:1; 757*4882a593Smuzhiyun u32 tpo_nport_valid:1; 758*4882a593Smuzhiyun u32 rpa_valid:1; 759*4882a593Smuzhiyun u32 opa_valid:1; 760*4882a593Smuzhiyun #endif 761*4882a593Smuzhiyun 762*4882a593Smuzhiyun u32 orig_process_assc; 763*4882a593Smuzhiyun u32 resp_process_assc; 764*4882a593Smuzhiyun 765*4882a593Smuzhiyun u32 res2:8; 766*4882a593Smuzhiyun u32 tpo_nport_id; 767*4882a593Smuzhiyun }; 768*4882a593Smuzhiyun 769*4882a593Smuzhiyun /* 770*4882a593Smuzhiyun * TPRLO ELS command payload 771*4882a593Smuzhiyun */ 772*4882a593Smuzhiyun struct fc_tprlo_s { 773*4882a593Smuzhiyun u32 command:8; 774*4882a593Smuzhiyun u32 page_len:8; 775*4882a593Smuzhiyun u32 payload_len:16; 776*4882a593Smuzhiyun 777*4882a593Smuzhiyun struct fc_tprlo_params_page_s tprlo_params[1]; 778*4882a593Smuzhiyun }; 779*4882a593Smuzhiyun 780*4882a593Smuzhiyun enum fc_tprlo_type { 781*4882a593Smuzhiyun FC_GLOBAL_LOGO = 1, 782*4882a593Smuzhiyun FC_TPR_LOGO 783*4882a593Smuzhiyun }; 784*4882a593Smuzhiyun 785*4882a593Smuzhiyun /* 786*4882a593Smuzhiyun * TPRLO els command ACC payload 787*4882a593Smuzhiyun */ 788*4882a593Smuzhiyun struct fc_tprlo_acc_s { 789*4882a593Smuzhiyun u32 command:8; 790*4882a593Smuzhiyun u32 page_len:8; 791*4882a593Smuzhiyun u32 payload_len:16; 792*4882a593Smuzhiyun struct fc_prlo_acc_params_page_s tprlo_acc_params[1]; 793*4882a593Smuzhiyun }; 794*4882a593Smuzhiyun 795*4882a593Smuzhiyun /* 796*4882a593Smuzhiyun * RSCN els command req payload 797*4882a593Smuzhiyun */ 798*4882a593Smuzhiyun #define FC_RSCN_PGLEN 0x4 799*4882a593Smuzhiyun 800*4882a593Smuzhiyun enum fc_rscn_format { 801*4882a593Smuzhiyun FC_RSCN_FORMAT_PORTID = 0x0, 802*4882a593Smuzhiyun FC_RSCN_FORMAT_AREA = 0x1, 803*4882a593Smuzhiyun FC_RSCN_FORMAT_DOMAIN = 0x2, 804*4882a593Smuzhiyun FC_RSCN_FORMAT_FABRIC = 0x3, 805*4882a593Smuzhiyun }; 806*4882a593Smuzhiyun 807*4882a593Smuzhiyun struct fc_rscn_event_s { 808*4882a593Smuzhiyun u32 format:2; 809*4882a593Smuzhiyun u32 qualifier:4; 810*4882a593Smuzhiyun u32 resvd:2; 811*4882a593Smuzhiyun u32 portid:24; 812*4882a593Smuzhiyun }; 813*4882a593Smuzhiyun 814*4882a593Smuzhiyun struct fc_rscn_pl_s { 815*4882a593Smuzhiyun u8 command; 816*4882a593Smuzhiyun u8 pagelen; 817*4882a593Smuzhiyun __be16 payldlen; 818*4882a593Smuzhiyun struct fc_rscn_event_s event[1]; 819*4882a593Smuzhiyun }; 820*4882a593Smuzhiyun 821*4882a593Smuzhiyun /* 822*4882a593Smuzhiyun * ECHO els command req payload 823*4882a593Smuzhiyun */ 824*4882a593Smuzhiyun struct fc_echo_s { 825*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; 826*4882a593Smuzhiyun }; 827*4882a593Smuzhiyun 828*4882a593Smuzhiyun /* 829*4882a593Smuzhiyun * RNID els command 830*4882a593Smuzhiyun */ 831*4882a593Smuzhiyun #define RNID_NODEID_DATA_FORMAT_COMMON 0x00 832*4882a593Smuzhiyun #define RNID_NODEID_DATA_FORMAT_FCP3 0x08 833*4882a593Smuzhiyun #define RNID_NODEID_DATA_FORMAT_DISCOVERY 0xDF 834*4882a593Smuzhiyun 835*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_UNKNOWN 0x00000001 836*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_OTHER 0x00000002 837*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_HUB 0x00000003 838*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_SWITCH 0x00000004 839*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_GATEWAY 0x00000005 840*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_STORAGE_DEVICE 0x00000009 841*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_HOST 0x0000000A 842*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_STORAGE_SUBSYSTEM 0x0000000B 843*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_STORAGE_ACCESS_DEVICE 0x0000000E 844*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_NAS_SERVER 0x00000011 845*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_BRIDGE 0x00000002 846*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_VIRTUALIZATION_DEVICE 0x00000003 847*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_MULTI_FUNCTION_DEVICE 0x000000FF 848*4882a593Smuzhiyun 849*4882a593Smuzhiyun /* 850*4882a593Smuzhiyun * RNID els command payload 851*4882a593Smuzhiyun */ 852*4882a593Smuzhiyun struct fc_rnid_cmd_s { 853*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; 854*4882a593Smuzhiyun u32 node_id_data_format:8; 855*4882a593Smuzhiyun u32 reserved:24; 856*4882a593Smuzhiyun }; 857*4882a593Smuzhiyun 858*4882a593Smuzhiyun /* 859*4882a593Smuzhiyun * RNID els response payload 860*4882a593Smuzhiyun */ 861*4882a593Smuzhiyun 862*4882a593Smuzhiyun struct fc_rnid_common_id_data_s { 863*4882a593Smuzhiyun wwn_t port_name; 864*4882a593Smuzhiyun wwn_t node_name; 865*4882a593Smuzhiyun }; 866*4882a593Smuzhiyun 867*4882a593Smuzhiyun struct fc_rnid_general_topology_data_s { 868*4882a593Smuzhiyun u32 vendor_unique[4]; 869*4882a593Smuzhiyun __be32 asso_type; 870*4882a593Smuzhiyun u32 phy_port_num; 871*4882a593Smuzhiyun __be32 num_attached_nodes; 872*4882a593Smuzhiyun u32 node_mgmt:8; 873*4882a593Smuzhiyun u32 ip_version:8; 874*4882a593Smuzhiyun u32 udp_tcp_port_num:16; 875*4882a593Smuzhiyun u32 ip_address[4]; 876*4882a593Smuzhiyun u32 reserved:16; 877*4882a593Smuzhiyun u32 vendor_specific:16; 878*4882a593Smuzhiyun }; 879*4882a593Smuzhiyun 880*4882a593Smuzhiyun struct fc_rnid_acc_s { 881*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; 882*4882a593Smuzhiyun u32 node_id_data_format:8; 883*4882a593Smuzhiyun u32 common_id_data_length:8; 884*4882a593Smuzhiyun u32 reserved:8; 885*4882a593Smuzhiyun u32 specific_id_data_length:8; 886*4882a593Smuzhiyun struct fc_rnid_common_id_data_s common_id_data; 887*4882a593Smuzhiyun struct fc_rnid_general_topology_data_s gen_topology_data; 888*4882a593Smuzhiyun }; 889*4882a593Smuzhiyun 890*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_UNKNOWN 0x00000001 891*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_OTHER 0x00000002 892*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_HUB 0x00000003 893*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_SWITCH 0x00000004 894*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_GATEWAY 0x00000005 895*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_STORAGE_DEVICE 0x00000009 896*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_HOST 0x0000000A 897*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_STORAGE_SUBSYSTEM 0x0000000B 898*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_STORAGE_ACCESS_DEVICE 0x0000000E 899*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_NAS_SERVER 0x00000011 900*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_BRIDGE 0x00000002 901*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_VIRTUALIZATION_DEVICE 0x00000003 902*4882a593Smuzhiyun #define RNID_ASSOCIATED_TYPE_MULTI_FUNCTION_DEVICE 0x000000FF 903*4882a593Smuzhiyun 904*4882a593Smuzhiyun enum fc_rpsc_speed_cap { 905*4882a593Smuzhiyun RPSC_SPEED_CAP_1G = 0x8000, 906*4882a593Smuzhiyun RPSC_SPEED_CAP_2G = 0x4000, 907*4882a593Smuzhiyun RPSC_SPEED_CAP_4G = 0x2000, 908*4882a593Smuzhiyun RPSC_SPEED_CAP_10G = 0x1000, 909*4882a593Smuzhiyun RPSC_SPEED_CAP_8G = 0x0800, 910*4882a593Smuzhiyun RPSC_SPEED_CAP_16G = 0x0400, 911*4882a593Smuzhiyun 912*4882a593Smuzhiyun RPSC_SPEED_CAP_UNKNOWN = 0x0001, 913*4882a593Smuzhiyun }; 914*4882a593Smuzhiyun 915*4882a593Smuzhiyun enum fc_rpsc_op_speed { 916*4882a593Smuzhiyun RPSC_OP_SPEED_1G = 0x8000, 917*4882a593Smuzhiyun RPSC_OP_SPEED_2G = 0x4000, 918*4882a593Smuzhiyun RPSC_OP_SPEED_4G = 0x2000, 919*4882a593Smuzhiyun RPSC_OP_SPEED_10G = 0x1000, 920*4882a593Smuzhiyun RPSC_OP_SPEED_8G = 0x0800, 921*4882a593Smuzhiyun RPSC_OP_SPEED_16G = 0x0400, 922*4882a593Smuzhiyun 923*4882a593Smuzhiyun RPSC_OP_SPEED_NOT_EST = 0x0001, /* speed not established */ 924*4882a593Smuzhiyun }; 925*4882a593Smuzhiyun 926*4882a593Smuzhiyun struct fc_rpsc_speed_info_s { 927*4882a593Smuzhiyun __be16 port_speed_cap; /* see enum fc_rpsc_speed_cap */ 928*4882a593Smuzhiyun __be16 port_op_speed; /* see enum fc_rpsc_op_speed */ 929*4882a593Smuzhiyun }; 930*4882a593Smuzhiyun 931*4882a593Smuzhiyun /* 932*4882a593Smuzhiyun * If RPSC request is sent to the Domain Controller, the request is for 933*4882a593Smuzhiyun * all the ports within that domain. 934*4882a593Smuzhiyun */ 935*4882a593Smuzhiyun struct fc_rpsc_cmd_s { 936*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; 937*4882a593Smuzhiyun }; 938*4882a593Smuzhiyun 939*4882a593Smuzhiyun /* 940*4882a593Smuzhiyun * RPSC Acc 941*4882a593Smuzhiyun */ 942*4882a593Smuzhiyun struct fc_rpsc_acc_s { 943*4882a593Smuzhiyun u32 command:8; 944*4882a593Smuzhiyun u32 rsvd:8; 945*4882a593Smuzhiyun u32 num_entries:16; 946*4882a593Smuzhiyun 947*4882a593Smuzhiyun struct fc_rpsc_speed_info_s speed_info[1]; 948*4882a593Smuzhiyun }; 949*4882a593Smuzhiyun 950*4882a593Smuzhiyun /* 951*4882a593Smuzhiyun * If RPSC2 request is sent to the Domain Controller, 952*4882a593Smuzhiyun */ 953*4882a593Smuzhiyun #define FC_BRCD_TOKEN 0x42524344 954*4882a593Smuzhiyun 955*4882a593Smuzhiyun struct fc_rpsc2_cmd_s { 956*4882a593Smuzhiyun struct fc_els_cmd_s els_cmd; 957*4882a593Smuzhiyun __be32 token; 958*4882a593Smuzhiyun u16 resvd; 959*4882a593Smuzhiyun __be16 num_pids; /* Number of pids in the request */ 960*4882a593Smuzhiyun struct { 961*4882a593Smuzhiyun u32 rsvd1:8; 962*4882a593Smuzhiyun u32 pid:24; /* port identifier */ 963*4882a593Smuzhiyun } pid_list[1]; 964*4882a593Smuzhiyun }; 965*4882a593Smuzhiyun 966*4882a593Smuzhiyun enum fc_rpsc2_port_type { 967*4882a593Smuzhiyun RPSC2_PORT_TYPE_UNKNOWN = 0, 968*4882a593Smuzhiyun RPSC2_PORT_TYPE_NPORT = 1, 969*4882a593Smuzhiyun RPSC2_PORT_TYPE_NLPORT = 2, 970*4882a593Smuzhiyun RPSC2_PORT_TYPE_NPIV_PORT = 0x5f, 971*4882a593Smuzhiyun RPSC2_PORT_TYPE_NPORT_TRUNK = 0x6f, 972*4882a593Smuzhiyun }; 973*4882a593Smuzhiyun 974*4882a593Smuzhiyun /* 975*4882a593Smuzhiyun * RPSC2 portInfo entry structure 976*4882a593Smuzhiyun */ 977*4882a593Smuzhiyun struct fc_rpsc2_port_info_s { 978*4882a593Smuzhiyun __be32 pid; /* PID */ 979*4882a593Smuzhiyun u16 resvd1; 980*4882a593Smuzhiyun __be16 index; /* port number / index */ 981*4882a593Smuzhiyun u8 resvd2; 982*4882a593Smuzhiyun u8 type; /* port type N/NL/... */ 983*4882a593Smuzhiyun __be16 speed; /* port Operating Speed */ 984*4882a593Smuzhiyun }; 985*4882a593Smuzhiyun 986*4882a593Smuzhiyun /* 987*4882a593Smuzhiyun * RPSC2 Accept payload 988*4882a593Smuzhiyun */ 989*4882a593Smuzhiyun struct fc_rpsc2_acc_s { 990*4882a593Smuzhiyun u8 els_cmd; 991*4882a593Smuzhiyun u8 resvd; 992*4882a593Smuzhiyun __be16 num_pids; /* Number of pids in the request */ 993*4882a593Smuzhiyun struct fc_rpsc2_port_info_s port_info[1]; /* port information */ 994*4882a593Smuzhiyun }; 995*4882a593Smuzhiyun 996*4882a593Smuzhiyun /* 997*4882a593Smuzhiyun * bit fields so that multiple classes can be specified 998*4882a593Smuzhiyun */ 999*4882a593Smuzhiyun enum fc_cos { 1000*4882a593Smuzhiyun FC_CLASS_2 = 0x04, 1001*4882a593Smuzhiyun FC_CLASS_3 = 0x08, 1002*4882a593Smuzhiyun FC_CLASS_2_3 = 0x0C, 1003*4882a593Smuzhiyun }; 1004*4882a593Smuzhiyun 1005*4882a593Smuzhiyun /* 1006*4882a593Smuzhiyun * symbolic name 1007*4882a593Smuzhiyun */ 1008*4882a593Smuzhiyun struct fc_symname_s { 1009*4882a593Smuzhiyun u8 symname[FC_SYMNAME_MAX]; 1010*4882a593Smuzhiyun }; 1011*4882a593Smuzhiyun 1012*4882a593Smuzhiyun struct fc_alpabm_s { 1013*4882a593Smuzhiyun u8 alpa_bm[FC_ALPA_MAX / 8]; 1014*4882a593Smuzhiyun }; 1015*4882a593Smuzhiyun 1016*4882a593Smuzhiyun /* 1017*4882a593Smuzhiyun * protocol default timeout values 1018*4882a593Smuzhiyun */ 1019*4882a593Smuzhiyun #define FC_ED_TOV 2 1020*4882a593Smuzhiyun #define FC_REC_TOV (FC_ED_TOV + 1) 1021*4882a593Smuzhiyun #define FC_RA_TOV 10 1022*4882a593Smuzhiyun #define FC_ELS_TOV (2 * FC_RA_TOV) 1023*4882a593Smuzhiyun #define FC_FCCT_TOV (3 * FC_RA_TOV) 1024*4882a593Smuzhiyun 1025*4882a593Smuzhiyun /* 1026*4882a593Smuzhiyun * virtual fabric related defines 1027*4882a593Smuzhiyun */ 1028*4882a593Smuzhiyun #define FC_VF_ID_NULL 0 /* must not be used as VF_ID */ 1029*4882a593Smuzhiyun #define FC_VF_ID_MIN 1 1030*4882a593Smuzhiyun #define FC_VF_ID_MAX 0xEFF 1031*4882a593Smuzhiyun #define FC_VF_ID_CTL 0xFEF /* control VF_ID */ 1032*4882a593Smuzhiyun 1033*4882a593Smuzhiyun /* 1034*4882a593Smuzhiyun * Virtual Fabric Tagging header format 1035*4882a593Smuzhiyun * @caution This is defined only in BIG ENDIAN format. 1036*4882a593Smuzhiyun */ 1037*4882a593Smuzhiyun struct fc_vft_s { 1038*4882a593Smuzhiyun u32 r_ctl:8; 1039*4882a593Smuzhiyun u32 ver:2; 1040*4882a593Smuzhiyun u32 type:4; 1041*4882a593Smuzhiyun u32 res_a:2; 1042*4882a593Smuzhiyun u32 priority:3; 1043*4882a593Smuzhiyun u32 vf_id:12; 1044*4882a593Smuzhiyun u32 res_b:1; 1045*4882a593Smuzhiyun u32 hopct:8; 1046*4882a593Smuzhiyun u32 res_c:24; 1047*4882a593Smuzhiyun }; 1048*4882a593Smuzhiyun 1049*4882a593Smuzhiyun /* 1050*4882a593Smuzhiyun * FCP_CMND definitions 1051*4882a593Smuzhiyun */ 1052*4882a593Smuzhiyun #define FCP_CMND_CDB_LEN 16 1053*4882a593Smuzhiyun #define FCP_CMND_LUN_LEN 8 1054*4882a593Smuzhiyun 1055*4882a593Smuzhiyun struct fcp_cmnd_s { 1056*4882a593Smuzhiyun struct scsi_lun lun; /* 64-bit LU number */ 1057*4882a593Smuzhiyun u8 crn; /* command reference number */ 1058*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 1059*4882a593Smuzhiyun u8 resvd:1, 1060*4882a593Smuzhiyun priority:4, /* FCP-3: SAM-3 priority */ 1061*4882a593Smuzhiyun taskattr:3; /* scsi task attribute */ 1062*4882a593Smuzhiyun #else 1063*4882a593Smuzhiyun u8 taskattr:3, /* scsi task attribute */ 1064*4882a593Smuzhiyun priority:4, /* FCP-3: SAM-3 priority */ 1065*4882a593Smuzhiyun resvd:1; 1066*4882a593Smuzhiyun #endif 1067*4882a593Smuzhiyun u8 tm_flags; /* task management flags */ 1068*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 1069*4882a593Smuzhiyun u8 addl_cdb_len:6, /* additional CDB length words */ 1070*4882a593Smuzhiyun iodir:2; /* read/write FCP_DATA IUs */ 1071*4882a593Smuzhiyun #else 1072*4882a593Smuzhiyun u8 iodir:2, /* read/write FCP_DATA IUs */ 1073*4882a593Smuzhiyun addl_cdb_len:6; /* additional CDB length */ 1074*4882a593Smuzhiyun #endif 1075*4882a593Smuzhiyun struct scsi_cdb_s cdb; 1076*4882a593Smuzhiyun 1077*4882a593Smuzhiyun __be32 fcp_dl; /* bytes to be transferred */ 1078*4882a593Smuzhiyun }; 1079*4882a593Smuzhiyun 1080*4882a593Smuzhiyun #define fcp_cmnd_cdb_len(_cmnd) ((_cmnd)->addl_cdb_len * 4 + FCP_CMND_CDB_LEN) 1081*4882a593Smuzhiyun #define fcp_cmnd_fcpdl(_cmnd) ((&(_cmnd)->fcp_dl)[(_cmnd)->addl_cdb_len]) 1082*4882a593Smuzhiyun 1083*4882a593Smuzhiyun /* 1084*4882a593Smuzhiyun * struct fcp_cmnd_s .iodir field values 1085*4882a593Smuzhiyun */ 1086*4882a593Smuzhiyun enum fcp_iodir { 1087*4882a593Smuzhiyun FCP_IODIR_NONE = 0, 1088*4882a593Smuzhiyun FCP_IODIR_WRITE = 1, 1089*4882a593Smuzhiyun FCP_IODIR_READ = 2, 1090*4882a593Smuzhiyun FCP_IODIR_RW = 3, 1091*4882a593Smuzhiyun }; 1092*4882a593Smuzhiyun 1093*4882a593Smuzhiyun /* 1094*4882a593Smuzhiyun * Task management flags field - only one bit shall be set 1095*4882a593Smuzhiyun */ 1096*4882a593Smuzhiyun enum fcp_tm_cmnd { 1097*4882a593Smuzhiyun FCP_TM_ABORT_TASK_SET = BIT(1), 1098*4882a593Smuzhiyun FCP_TM_CLEAR_TASK_SET = BIT(2), 1099*4882a593Smuzhiyun FCP_TM_LUN_RESET = BIT(4), 1100*4882a593Smuzhiyun FCP_TM_TARGET_RESET = BIT(5), /* obsolete in FCP-3 */ 1101*4882a593Smuzhiyun FCP_TM_CLEAR_ACA = BIT(6), 1102*4882a593Smuzhiyun }; 1103*4882a593Smuzhiyun 1104*4882a593Smuzhiyun /* 1105*4882a593Smuzhiyun * FCP_RSP residue flags 1106*4882a593Smuzhiyun */ 1107*4882a593Smuzhiyun enum fcp_residue { 1108*4882a593Smuzhiyun FCP_NO_RESIDUE = 0, /* no residue */ 1109*4882a593Smuzhiyun FCP_RESID_OVER = 1, /* more data left that was not sent */ 1110*4882a593Smuzhiyun FCP_RESID_UNDER = 2, /* less data than requested */ 1111*4882a593Smuzhiyun }; 1112*4882a593Smuzhiyun 1113*4882a593Smuzhiyun struct fcp_rspinfo_s { 1114*4882a593Smuzhiyun u32 res0:24; 1115*4882a593Smuzhiyun u32 rsp_code:8; /* response code (as above) */ 1116*4882a593Smuzhiyun u32 res1; 1117*4882a593Smuzhiyun }; 1118*4882a593Smuzhiyun 1119*4882a593Smuzhiyun struct fcp_resp_s { 1120*4882a593Smuzhiyun u32 reserved[2]; /* 2 words reserved */ 1121*4882a593Smuzhiyun u16 reserved2; 1122*4882a593Smuzhiyun #ifdef __BIG_ENDIAN 1123*4882a593Smuzhiyun u8 reserved3:3; 1124*4882a593Smuzhiyun u8 fcp_conf_req:1; /* FCP_CONF is requested */ 1125*4882a593Smuzhiyun u8 resid_flags:2; /* underflow/overflow */ 1126*4882a593Smuzhiyun u8 sns_len_valid:1; /* sense len is valid */ 1127*4882a593Smuzhiyun u8 rsp_len_valid:1; /* response len is valid */ 1128*4882a593Smuzhiyun #else 1129*4882a593Smuzhiyun u8 rsp_len_valid:1; /* response len is valid */ 1130*4882a593Smuzhiyun u8 sns_len_valid:1; /* sense len is valid */ 1131*4882a593Smuzhiyun u8 resid_flags:2; /* underflow/overflow */ 1132*4882a593Smuzhiyun u8 fcp_conf_req:1; /* FCP_CONF is requested */ 1133*4882a593Smuzhiyun u8 reserved3:3; 1134*4882a593Smuzhiyun #endif 1135*4882a593Smuzhiyun u8 scsi_status; /* one byte SCSI status */ 1136*4882a593Smuzhiyun u32 residue; /* residual data bytes */ 1137*4882a593Smuzhiyun u32 sns_len; /* length od sense info */ 1138*4882a593Smuzhiyun u32 rsp_len; /* length of response info */ 1139*4882a593Smuzhiyun }; 1140*4882a593Smuzhiyun 1141*4882a593Smuzhiyun #define fcp_snslen(__fcprsp) ((__fcprsp)->sns_len_valid ? \ 1142*4882a593Smuzhiyun (__fcprsp)->sns_len : 0) 1143*4882a593Smuzhiyun #define fcp_rsplen(__fcprsp) ((__fcprsp)->rsp_len_valid ? \ 1144*4882a593Smuzhiyun (__fcprsp)->rsp_len : 0) 1145*4882a593Smuzhiyun #define fcp_rspinfo(__fcprsp) ((struct fcp_rspinfo_s *)((__fcprsp) + 1)) 1146*4882a593Smuzhiyun #define fcp_snsinfo(__fcprsp) (((u8 *)fcp_rspinfo(__fcprsp)) + \ 1147*4882a593Smuzhiyun fcp_rsplen(__fcprsp)) 1148*4882a593Smuzhiyun /* 1149*4882a593Smuzhiyun * CT 1150*4882a593Smuzhiyun */ 1151*4882a593Smuzhiyun struct ct_hdr_s { 1152*4882a593Smuzhiyun u32 rev_id:8; /* Revision of the CT */ 1153*4882a593Smuzhiyun u32 in_id:24; /* Initiator Id */ 1154*4882a593Smuzhiyun u32 gs_type:8; /* Generic service Type */ 1155*4882a593Smuzhiyun u32 gs_sub_type:8; /* Generic service sub type */ 1156*4882a593Smuzhiyun u32 options:8; /* options */ 1157*4882a593Smuzhiyun u32 rsvrd:8; /* reserved */ 1158*4882a593Smuzhiyun u32 cmd_rsp_code:16;/* ct command/response code */ 1159*4882a593Smuzhiyun u32 max_res_size:16;/* maximum/residual size */ 1160*4882a593Smuzhiyun u32 frag_id:8; /* fragment ID */ 1161*4882a593Smuzhiyun u32 reason_code:8; /* reason code */ 1162*4882a593Smuzhiyun u32 exp_code:8; /* explanation code */ 1163*4882a593Smuzhiyun u32 vendor_unq:8; /* vendor unique */ 1164*4882a593Smuzhiyun }; 1165*4882a593Smuzhiyun 1166*4882a593Smuzhiyun /* 1167*4882a593Smuzhiyun * defines for the Revision 1168*4882a593Smuzhiyun */ 1169*4882a593Smuzhiyun enum { 1170*4882a593Smuzhiyun CT_GS3_REVISION = 0x01, 1171*4882a593Smuzhiyun }; 1172*4882a593Smuzhiyun 1173*4882a593Smuzhiyun /* 1174*4882a593Smuzhiyun * defines for gs_type 1175*4882a593Smuzhiyun */ 1176*4882a593Smuzhiyun enum { 1177*4882a593Smuzhiyun CT_GSTYPE_KEYSERVICE = 0xF7, 1178*4882a593Smuzhiyun CT_GSTYPE_ALIASSERVICE = 0xF8, 1179*4882a593Smuzhiyun CT_GSTYPE_MGMTSERVICE = 0xFA, 1180*4882a593Smuzhiyun CT_GSTYPE_TIMESERVICE = 0xFB, 1181*4882a593Smuzhiyun CT_GSTYPE_DIRSERVICE = 0xFC, 1182*4882a593Smuzhiyun }; 1183*4882a593Smuzhiyun 1184*4882a593Smuzhiyun /* 1185*4882a593Smuzhiyun * defines for gs_sub_type for gs type directory service 1186*4882a593Smuzhiyun */ 1187*4882a593Smuzhiyun enum { 1188*4882a593Smuzhiyun CT_GSSUBTYPE_NAMESERVER = 0x02, 1189*4882a593Smuzhiyun }; 1190*4882a593Smuzhiyun 1191*4882a593Smuzhiyun /* 1192*4882a593Smuzhiyun * defines for gs_sub_type for gs type management service 1193*4882a593Smuzhiyun */ 1194*4882a593Smuzhiyun enum { 1195*4882a593Smuzhiyun CT_GSSUBTYPE_CFGSERVER = 0x01, 1196*4882a593Smuzhiyun CT_GSSUBTYPE_UNZONED_NS = 0x02, 1197*4882a593Smuzhiyun CT_GSSUBTYPE_ZONESERVER = 0x03, 1198*4882a593Smuzhiyun CT_GSSUBTYPE_LOCKSERVER = 0x04, 1199*4882a593Smuzhiyun CT_GSSUBTYPE_HBA_MGMTSERVER = 0x10, /* for FDMI */ 1200*4882a593Smuzhiyun }; 1201*4882a593Smuzhiyun 1202*4882a593Smuzhiyun /* 1203*4882a593Smuzhiyun * defines for CT response code field 1204*4882a593Smuzhiyun */ 1205*4882a593Smuzhiyun enum { 1206*4882a593Smuzhiyun CT_RSP_REJECT = 0x8001, 1207*4882a593Smuzhiyun CT_RSP_ACCEPT = 0x8002, 1208*4882a593Smuzhiyun }; 1209*4882a593Smuzhiyun 1210*4882a593Smuzhiyun /* 1211*4882a593Smuzhiyun * defintions for CT reason code 1212*4882a593Smuzhiyun */ 1213*4882a593Smuzhiyun enum { 1214*4882a593Smuzhiyun CT_RSN_INV_CMD = 0x01, 1215*4882a593Smuzhiyun CT_RSN_INV_VER = 0x02, 1216*4882a593Smuzhiyun CT_RSN_LOGIC_ERR = 0x03, 1217*4882a593Smuzhiyun CT_RSN_INV_SIZE = 0x04, 1218*4882a593Smuzhiyun CT_RSN_LOGICAL_BUSY = 0x05, 1219*4882a593Smuzhiyun CT_RSN_PROTO_ERR = 0x07, 1220*4882a593Smuzhiyun CT_RSN_UNABLE_TO_PERF = 0x09, 1221*4882a593Smuzhiyun CT_RSN_NOT_SUPP = 0x0B, 1222*4882a593Smuzhiyun CT_RSN_SERVER_NOT_AVBL = 0x0D, 1223*4882a593Smuzhiyun CT_RSN_SESSION_COULD_NOT_BE_ESTBD = 0x0E, 1224*4882a593Smuzhiyun CT_RSN_VENDOR_SPECIFIC = 0xFF, 1225*4882a593Smuzhiyun 1226*4882a593Smuzhiyun }; 1227*4882a593Smuzhiyun 1228*4882a593Smuzhiyun /* 1229*4882a593Smuzhiyun * definitions for explanations code for Name server 1230*4882a593Smuzhiyun */ 1231*4882a593Smuzhiyun enum { 1232*4882a593Smuzhiyun CT_NS_EXP_NOADDITIONAL = 0x00, 1233*4882a593Smuzhiyun CT_NS_EXP_ID_NOT_REG = 0x01, 1234*4882a593Smuzhiyun CT_NS_EXP_PN_NOT_REG = 0x02, 1235*4882a593Smuzhiyun CT_NS_EXP_NN_NOT_REG = 0x03, 1236*4882a593Smuzhiyun CT_NS_EXP_CS_NOT_REG = 0x04, 1237*4882a593Smuzhiyun CT_NS_EXP_IPN_NOT_REG = 0x05, 1238*4882a593Smuzhiyun CT_NS_EXP_IPA_NOT_REG = 0x06, 1239*4882a593Smuzhiyun CT_NS_EXP_FT_NOT_REG = 0x07, 1240*4882a593Smuzhiyun CT_NS_EXP_SPN_NOT_REG = 0x08, 1241*4882a593Smuzhiyun CT_NS_EXP_SNN_NOT_REG = 0x09, 1242*4882a593Smuzhiyun CT_NS_EXP_PT_NOT_REG = 0x0A, 1243*4882a593Smuzhiyun CT_NS_EXP_IPP_NOT_REG = 0x0B, 1244*4882a593Smuzhiyun CT_NS_EXP_FPN_NOT_REG = 0x0C, 1245*4882a593Smuzhiyun CT_NS_EXP_HA_NOT_REG = 0x0D, 1246*4882a593Smuzhiyun CT_NS_EXP_FD_NOT_REG = 0x0E, 1247*4882a593Smuzhiyun CT_NS_EXP_FF_NOT_REG = 0x0F, 1248*4882a593Smuzhiyun CT_NS_EXP_ACCESSDENIED = 0x10, 1249*4882a593Smuzhiyun CT_NS_EXP_UNACCEPTABLE_ID = 0x11, 1250*4882a593Smuzhiyun CT_NS_EXP_DATABASEEMPTY = 0x12, 1251*4882a593Smuzhiyun CT_NS_EXP_NOT_REG_IN_SCOPE = 0x13, 1252*4882a593Smuzhiyun CT_NS_EXP_DOM_ID_NOT_PRESENT = 0x14, 1253*4882a593Smuzhiyun CT_NS_EXP_PORT_NUM_NOT_PRESENT = 0x15, 1254*4882a593Smuzhiyun CT_NS_EXP_NO_DEVICE_ATTACHED = 0x16 1255*4882a593Smuzhiyun }; 1256*4882a593Smuzhiyun 1257*4882a593Smuzhiyun /* 1258*4882a593Smuzhiyun * defintions for the explanation code for all servers 1259*4882a593Smuzhiyun */ 1260*4882a593Smuzhiyun enum { 1261*4882a593Smuzhiyun CT_EXP_AUTH_EXCEPTION = 0xF1, 1262*4882a593Smuzhiyun CT_EXP_DB_FULL = 0xF2, 1263*4882a593Smuzhiyun CT_EXP_DB_EMPTY = 0xF3, 1264*4882a593Smuzhiyun CT_EXP_PROCESSING_REQ = 0xF4, 1265*4882a593Smuzhiyun CT_EXP_UNABLE_TO_VERIFY_CONN = 0xF5, 1266*4882a593Smuzhiyun CT_EXP_DEVICES_NOT_IN_CMN_ZONE = 0xF6 1267*4882a593Smuzhiyun }; 1268*4882a593Smuzhiyun 1269*4882a593Smuzhiyun /* 1270*4882a593Smuzhiyun * Command codes for Name server 1271*4882a593Smuzhiyun */ 1272*4882a593Smuzhiyun enum { 1273*4882a593Smuzhiyun GS_GID_PN = 0x0121, /* Get Id on port name */ 1274*4882a593Smuzhiyun GS_GPN_ID = 0x0112, /* Get port name on ID */ 1275*4882a593Smuzhiyun GS_GNN_ID = 0x0113, /* Get node name on ID */ 1276*4882a593Smuzhiyun GS_GID_FT = 0x0171, /* Get Id on FC4 type */ 1277*4882a593Smuzhiyun GS_GSPN_ID = 0x0118, /* Get symbolic PN on ID */ 1278*4882a593Smuzhiyun GS_RFT_ID = 0x0217, /* Register fc4type on ID */ 1279*4882a593Smuzhiyun GS_RSPN_ID = 0x0218, /* Register symbolic PN on ID */ 1280*4882a593Smuzhiyun GS_RSNN_NN = 0x0239, /* Register symbolic NN on NN */ 1281*4882a593Smuzhiyun GS_RPN_ID = 0x0212, /* Register port name */ 1282*4882a593Smuzhiyun GS_RNN_ID = 0x0213, /* Register node name */ 1283*4882a593Smuzhiyun GS_RCS_ID = 0x0214, /* Register class of service */ 1284*4882a593Smuzhiyun GS_RPT_ID = 0x021A, /* Register port type */ 1285*4882a593Smuzhiyun GS_GA_NXT = 0x0100, /* Get all next */ 1286*4882a593Smuzhiyun GS_RFF_ID = 0x021F, /* Register FC4 Feature */ 1287*4882a593Smuzhiyun }; 1288*4882a593Smuzhiyun 1289*4882a593Smuzhiyun struct fcgs_id_req_s { 1290*4882a593Smuzhiyun u32 rsvd:8; 1291*4882a593Smuzhiyun u32 dap:24; /* port identifier */ 1292*4882a593Smuzhiyun }; 1293*4882a593Smuzhiyun #define fcgs_gpnid_req_t struct fcgs_id_req_s 1294*4882a593Smuzhiyun #define fcgs_gnnid_req_t struct fcgs_id_req_s 1295*4882a593Smuzhiyun #define fcgs_gspnid_req_t struct fcgs_id_req_s 1296*4882a593Smuzhiyun 1297*4882a593Smuzhiyun struct fcgs_gidpn_req_s { 1298*4882a593Smuzhiyun wwn_t port_name; /* port wwn */ 1299*4882a593Smuzhiyun }; 1300*4882a593Smuzhiyun 1301*4882a593Smuzhiyun struct fcgs_gidpn_resp_s { 1302*4882a593Smuzhiyun u32 rsvd:8; 1303*4882a593Smuzhiyun u32 dap:24; /* port identifier */ 1304*4882a593Smuzhiyun }; 1305*4882a593Smuzhiyun 1306*4882a593Smuzhiyun /* 1307*4882a593Smuzhiyun * RFT_ID 1308*4882a593Smuzhiyun */ 1309*4882a593Smuzhiyun struct fcgs_rftid_req_s { 1310*4882a593Smuzhiyun u32 rsvd:8; 1311*4882a593Smuzhiyun u32 dap:24; /* port identifier */ 1312*4882a593Smuzhiyun __be32 fc4_type[8]; /* fc4 types */ 1313*4882a593Smuzhiyun }; 1314*4882a593Smuzhiyun 1315*4882a593Smuzhiyun /* 1316*4882a593Smuzhiyun * RFF_ID : Register FC4 features. 1317*4882a593Smuzhiyun */ 1318*4882a593Smuzhiyun #define FC_GS_FCP_FC4_FEATURE_INITIATOR 0x02 1319*4882a593Smuzhiyun #define FC_GS_FCP_FC4_FEATURE_TARGET 0x01 1320*4882a593Smuzhiyun 1321*4882a593Smuzhiyun struct fcgs_rffid_req_s { 1322*4882a593Smuzhiyun u32 rsvd:8; 1323*4882a593Smuzhiyun u32 dap:24; /* port identifier */ 1324*4882a593Smuzhiyun u32 rsvd1:16; 1325*4882a593Smuzhiyun u32 fc4ftr_bits:8; /* fc4 feature bits */ 1326*4882a593Smuzhiyun u32 fc4_type:8; /* corresponding FC4 Type */ 1327*4882a593Smuzhiyun }; 1328*4882a593Smuzhiyun 1329*4882a593Smuzhiyun /* 1330*4882a593Smuzhiyun * GID_FT Request 1331*4882a593Smuzhiyun */ 1332*4882a593Smuzhiyun struct fcgs_gidft_req_s { 1333*4882a593Smuzhiyun u8 reserved; 1334*4882a593Smuzhiyun u8 domain_id; /* domain, 0 - all fabric */ 1335*4882a593Smuzhiyun u8 area_id; /* area, 0 - whole domain */ 1336*4882a593Smuzhiyun u8 fc4_type; /* FC_TYPE_FCP for SCSI devices */ 1337*4882a593Smuzhiyun }; 1338*4882a593Smuzhiyun 1339*4882a593Smuzhiyun /* 1340*4882a593Smuzhiyun * GID_FT Response 1341*4882a593Smuzhiyun */ 1342*4882a593Smuzhiyun struct fcgs_gidft_resp_s { 1343*4882a593Smuzhiyun u8 last:1; /* last port identifier flag */ 1344*4882a593Smuzhiyun u8 reserved:7; 1345*4882a593Smuzhiyun u32 pid:24; /* port identifier */ 1346*4882a593Smuzhiyun }; 1347*4882a593Smuzhiyun 1348*4882a593Smuzhiyun /* 1349*4882a593Smuzhiyun * RSPN_ID 1350*4882a593Smuzhiyun */ 1351*4882a593Smuzhiyun struct fcgs_rspnid_req_s { 1352*4882a593Smuzhiyun u32 rsvd:8; 1353*4882a593Smuzhiyun u32 dap:24; /* port identifier */ 1354*4882a593Smuzhiyun u8 spn_len; /* symbolic port name length */ 1355*4882a593Smuzhiyun u8 spn[256]; /* symbolic port name */ 1356*4882a593Smuzhiyun }; 1357*4882a593Smuzhiyun 1358*4882a593Smuzhiyun /* 1359*4882a593Smuzhiyun * RSNN_NN 1360*4882a593Smuzhiyun */ 1361*4882a593Smuzhiyun struct fcgs_rsnn_nn_req_s { 1362*4882a593Smuzhiyun wwn_t node_name; /* Node name */ 1363*4882a593Smuzhiyun u8 snn_len; /* symbolic node name length */ 1364*4882a593Smuzhiyun u8 snn[256]; /* symbolic node name */ 1365*4882a593Smuzhiyun }; 1366*4882a593Smuzhiyun 1367*4882a593Smuzhiyun /* 1368*4882a593Smuzhiyun * RPN_ID 1369*4882a593Smuzhiyun */ 1370*4882a593Smuzhiyun struct fcgs_rpnid_req_s { 1371*4882a593Smuzhiyun u32 rsvd:8; 1372*4882a593Smuzhiyun u32 port_id:24; 1373*4882a593Smuzhiyun wwn_t port_name; 1374*4882a593Smuzhiyun }; 1375*4882a593Smuzhiyun 1376*4882a593Smuzhiyun /* 1377*4882a593Smuzhiyun * RNN_ID 1378*4882a593Smuzhiyun */ 1379*4882a593Smuzhiyun struct fcgs_rnnid_req_s { 1380*4882a593Smuzhiyun u32 rsvd:8; 1381*4882a593Smuzhiyun u32 port_id:24; 1382*4882a593Smuzhiyun wwn_t node_name; 1383*4882a593Smuzhiyun }; 1384*4882a593Smuzhiyun 1385*4882a593Smuzhiyun /* 1386*4882a593Smuzhiyun * RCS_ID 1387*4882a593Smuzhiyun */ 1388*4882a593Smuzhiyun struct fcgs_rcsid_req_s { 1389*4882a593Smuzhiyun u32 rsvd:8; 1390*4882a593Smuzhiyun u32 port_id:24; 1391*4882a593Smuzhiyun u32 cos; 1392*4882a593Smuzhiyun }; 1393*4882a593Smuzhiyun 1394*4882a593Smuzhiyun /* 1395*4882a593Smuzhiyun * RPT_ID 1396*4882a593Smuzhiyun */ 1397*4882a593Smuzhiyun struct fcgs_rptid_req_s { 1398*4882a593Smuzhiyun u32 rsvd:8; 1399*4882a593Smuzhiyun u32 port_id:24; 1400*4882a593Smuzhiyun u32 port_type:8; 1401*4882a593Smuzhiyun u32 rsvd1:24; 1402*4882a593Smuzhiyun }; 1403*4882a593Smuzhiyun 1404*4882a593Smuzhiyun /* 1405*4882a593Smuzhiyun * GA_NXT Request 1406*4882a593Smuzhiyun */ 1407*4882a593Smuzhiyun struct fcgs_ganxt_req_s { 1408*4882a593Smuzhiyun u32 rsvd:8; 1409*4882a593Smuzhiyun u32 port_id:24; 1410*4882a593Smuzhiyun }; 1411*4882a593Smuzhiyun 1412*4882a593Smuzhiyun /* 1413*4882a593Smuzhiyun * GA_NXT Response 1414*4882a593Smuzhiyun */ 1415*4882a593Smuzhiyun struct fcgs_ganxt_rsp_s { 1416*4882a593Smuzhiyun u32 port_type:8; /* Port Type */ 1417*4882a593Smuzhiyun u32 port_id:24; /* Port Identifier */ 1418*4882a593Smuzhiyun wwn_t port_name; /* Port Name */ 1419*4882a593Smuzhiyun u8 spn_len; /* Length of Symbolic Port Name */ 1420*4882a593Smuzhiyun char spn[255]; /* Symbolic Port Name */ 1421*4882a593Smuzhiyun wwn_t node_name; /* Node Name */ 1422*4882a593Smuzhiyun u8 snn_len; /* Length of Symbolic Node Name */ 1423*4882a593Smuzhiyun char snn[255]; /* Symbolic Node Name */ 1424*4882a593Smuzhiyun u8 ipa[8]; /* Initial Process Associator */ 1425*4882a593Smuzhiyun u8 ip[16]; /* IP Address */ 1426*4882a593Smuzhiyun u32 cos; /* Class of Service */ 1427*4882a593Smuzhiyun u32 fc4types[8]; /* FC-4 TYPEs */ 1428*4882a593Smuzhiyun wwn_t fabric_port_name; /* Fabric Port Name */ 1429*4882a593Smuzhiyun u32 rsvd:8; /* Reserved */ 1430*4882a593Smuzhiyun u32 hard_addr:24; /* Hard Address */ 1431*4882a593Smuzhiyun }; 1432*4882a593Smuzhiyun 1433*4882a593Smuzhiyun /* 1434*4882a593Smuzhiyun * Command codes for Fabric Configuration Server 1435*4882a593Smuzhiyun */ 1436*4882a593Smuzhiyun enum { 1437*4882a593Smuzhiyun GS_FC_GFN_CMD = 0x0114, /* GS FC Get Fabric Name */ 1438*4882a593Smuzhiyun GS_FC_GMAL_CMD = 0x0116, /* GS FC GMAL */ 1439*4882a593Smuzhiyun GS_FC_TRACE_CMD = 0x0400, /* GS FC Trace Route */ 1440*4882a593Smuzhiyun GS_FC_PING_CMD = 0x0401, /* GS FC Ping */ 1441*4882a593Smuzhiyun }; 1442*4882a593Smuzhiyun 1443*4882a593Smuzhiyun /* 1444*4882a593Smuzhiyun * GMAL Command ( Get ( interconnect Element) Management Address List) 1445*4882a593Smuzhiyun * To retrieve the IP Address of a Switch. 1446*4882a593Smuzhiyun */ 1447*4882a593Smuzhiyun #define CT_GMAL_RESP_PREFIX_TELNET "telnet://" 1448*4882a593Smuzhiyun #define CT_GMAL_RESP_PREFIX_HTTP "http://" 1449*4882a593Smuzhiyun 1450*4882a593Smuzhiyun /* GMAL/GFN request */ 1451*4882a593Smuzhiyun struct fcgs_req_s { 1452*4882a593Smuzhiyun wwn_t wwn; /* PWWN/NWWN */ 1453*4882a593Smuzhiyun }; 1454*4882a593Smuzhiyun 1455*4882a593Smuzhiyun #define fcgs_gmal_req_t struct fcgs_req_s 1456*4882a593Smuzhiyun #define fcgs_gfn_req_t struct fcgs_req_s 1457*4882a593Smuzhiyun 1458*4882a593Smuzhiyun /* Accept Response to GMAL */ 1459*4882a593Smuzhiyun struct fcgs_gmal_resp_s { 1460*4882a593Smuzhiyun __be32 ms_len; /* Num of entries */ 1461*4882a593Smuzhiyun u8 ms_ma[256]; 1462*4882a593Smuzhiyun }; 1463*4882a593Smuzhiyun 1464*4882a593Smuzhiyun struct fcgs_gmal_entry_s { 1465*4882a593Smuzhiyun u8 len; 1466*4882a593Smuzhiyun u8 prefix[7]; /* like "http://" */ 1467*4882a593Smuzhiyun u8 ip_addr[248]; 1468*4882a593Smuzhiyun }; 1469*4882a593Smuzhiyun 1470*4882a593Smuzhiyun /* 1471*4882a593Smuzhiyun * FDMI Command Codes 1472*4882a593Smuzhiyun */ 1473*4882a593Smuzhiyun #define FDMI_GRHL 0x0100 1474*4882a593Smuzhiyun #define FDMI_GHAT 0x0101 1475*4882a593Smuzhiyun #define FDMI_GRPL 0x0102 1476*4882a593Smuzhiyun #define FDMI_GPAT 0x0110 1477*4882a593Smuzhiyun #define FDMI_RHBA 0x0200 1478*4882a593Smuzhiyun #define FDMI_RHAT 0x0201 1479*4882a593Smuzhiyun #define FDMI_RPRT 0x0210 1480*4882a593Smuzhiyun #define FDMI_RPA 0x0211 1481*4882a593Smuzhiyun #define FDMI_DHBA 0x0300 1482*4882a593Smuzhiyun #define FDMI_DPRT 0x0310 1483*4882a593Smuzhiyun 1484*4882a593Smuzhiyun /* 1485*4882a593Smuzhiyun * FDMI reason codes 1486*4882a593Smuzhiyun */ 1487*4882a593Smuzhiyun #define FDMI_NO_ADDITIONAL_EXP 0x00 1488*4882a593Smuzhiyun #define FDMI_HBA_ALREADY_REG 0x10 1489*4882a593Smuzhiyun #define FDMI_HBA_ATTRIB_NOT_REG 0x11 1490*4882a593Smuzhiyun #define FDMI_HBA_ATTRIB_MULTIPLE 0x12 1491*4882a593Smuzhiyun #define FDMI_HBA_ATTRIB_LENGTH_INVALID 0x13 1492*4882a593Smuzhiyun #define FDMI_HBA_ATTRIB_NOT_PRESENT 0x14 1493*4882a593Smuzhiyun #define FDMI_PORT_ORIG_NOT_IN_LIST 0x15 1494*4882a593Smuzhiyun #define FDMI_PORT_HBA_NOT_IN_LIST 0x16 1495*4882a593Smuzhiyun #define FDMI_PORT_ATTRIB_NOT_REG 0x20 1496*4882a593Smuzhiyun #define FDMI_PORT_NOT_REG 0x21 1497*4882a593Smuzhiyun #define FDMI_PORT_ATTRIB_MULTIPLE 0x22 1498*4882a593Smuzhiyun #define FDMI_PORT_ATTRIB_LENGTH_INVALID 0x23 1499*4882a593Smuzhiyun #define FDMI_PORT_ALREADY_REGISTEREED 0x24 1500*4882a593Smuzhiyun 1501*4882a593Smuzhiyun /* 1502*4882a593Smuzhiyun * FDMI Transmission Speed Mask values 1503*4882a593Smuzhiyun */ 1504*4882a593Smuzhiyun #define FDMI_TRANS_SPEED_1G 0x00000001 1505*4882a593Smuzhiyun #define FDMI_TRANS_SPEED_2G 0x00000002 1506*4882a593Smuzhiyun #define FDMI_TRANS_SPEED_10G 0x00000004 1507*4882a593Smuzhiyun #define FDMI_TRANS_SPEED_4G 0x00000008 1508*4882a593Smuzhiyun #define FDMI_TRANS_SPEED_8G 0x00000010 1509*4882a593Smuzhiyun #define FDMI_TRANS_SPEED_16G 0x00000020 1510*4882a593Smuzhiyun #define FDMI_TRANS_SPEED_UNKNOWN 0x00008000 1511*4882a593Smuzhiyun 1512*4882a593Smuzhiyun /* 1513*4882a593Smuzhiyun * FDMI HBA attribute types 1514*4882a593Smuzhiyun */ 1515*4882a593Smuzhiyun enum fdmi_hba_attribute_type { 1516*4882a593Smuzhiyun FDMI_HBA_ATTRIB_NODENAME = 1, /* 0x0001 */ 1517*4882a593Smuzhiyun FDMI_HBA_ATTRIB_MANUFACTURER, /* 0x0002 */ 1518*4882a593Smuzhiyun FDMI_HBA_ATTRIB_SERIALNUM, /* 0x0003 */ 1519*4882a593Smuzhiyun FDMI_HBA_ATTRIB_MODEL, /* 0x0004 */ 1520*4882a593Smuzhiyun FDMI_HBA_ATTRIB_MODEL_DESC, /* 0x0005 */ 1521*4882a593Smuzhiyun FDMI_HBA_ATTRIB_HW_VERSION, /* 0x0006 */ 1522*4882a593Smuzhiyun FDMI_HBA_ATTRIB_DRIVER_VERSION, /* 0x0007 */ 1523*4882a593Smuzhiyun FDMI_HBA_ATTRIB_ROM_VERSION, /* 0x0008 */ 1524*4882a593Smuzhiyun FDMI_HBA_ATTRIB_FW_VERSION, /* 0x0009 */ 1525*4882a593Smuzhiyun FDMI_HBA_ATTRIB_OS_NAME, /* 0x000A */ 1526*4882a593Smuzhiyun FDMI_HBA_ATTRIB_MAX_CT, /* 0x000B */ 1527*4882a593Smuzhiyun FDMI_HBA_ATTRIB_NODE_SYM_NAME, /* 0x000C */ 1528*4882a593Smuzhiyun FDMI_HBA_ATTRIB_VENDOR_INFO, /* 0x000D */ 1529*4882a593Smuzhiyun FDMI_HBA_ATTRIB_NUM_PORTS, /* 0x000E */ 1530*4882a593Smuzhiyun FDMI_HBA_ATTRIB_FABRIC_NAME, /* 0x000F */ 1531*4882a593Smuzhiyun FDMI_HBA_ATTRIB_BIOS_VER, /* 0x0010 */ 1532*4882a593Smuzhiyun FDMI_HBA_ATTRIB_VENDOR_ID = 0x00E0, 1533*4882a593Smuzhiyun 1534*4882a593Smuzhiyun FDMI_HBA_ATTRIB_MAX_TYPE 1535*4882a593Smuzhiyun }; 1536*4882a593Smuzhiyun 1537*4882a593Smuzhiyun /* 1538*4882a593Smuzhiyun * FDMI Port attribute types 1539*4882a593Smuzhiyun */ 1540*4882a593Smuzhiyun enum fdmi_port_attribute_type { 1541*4882a593Smuzhiyun FDMI_PORT_ATTRIB_FC4_TYPES = 1, /* 0x0001 */ 1542*4882a593Smuzhiyun FDMI_PORT_ATTRIB_SUPP_SPEED, /* 0x0002 */ 1543*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_SPEED, /* 0x0003 */ 1544*4882a593Smuzhiyun FDMI_PORT_ATTRIB_FRAME_SIZE, /* 0x0004 */ 1545*4882a593Smuzhiyun FDMI_PORT_ATTRIB_DEV_NAME, /* 0x0005 */ 1546*4882a593Smuzhiyun FDMI_PORT_ATTRIB_HOST_NAME, /* 0x0006 */ 1547*4882a593Smuzhiyun FDMI_PORT_ATTRIB_NODE_NAME, /* 0x0007 */ 1548*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_NAME, /* 0x0008 */ 1549*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_SYM_NAME, /* 0x0009 */ 1550*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_TYPE, /* 0x000A */ 1551*4882a593Smuzhiyun FDMI_PORT_ATTRIB_SUPP_COS, /* 0x000B */ 1552*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_FAB_NAME, /* 0x000C */ 1553*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_FC4_TYPE, /* 0x000D */ 1554*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_STATE = 0x101, /* 0x0101 */ 1555*4882a593Smuzhiyun FDMI_PORT_ATTRIB_PORT_NUM_RPRT = 0x102, /* 0x0102 */ 1556*4882a593Smuzhiyun 1557*4882a593Smuzhiyun FDMI_PORT_ATTR_MAX_TYPE 1558*4882a593Smuzhiyun }; 1559*4882a593Smuzhiyun 1560*4882a593Smuzhiyun /* 1561*4882a593Smuzhiyun * FDMI attribute 1562*4882a593Smuzhiyun */ 1563*4882a593Smuzhiyun struct fdmi_attr_s { 1564*4882a593Smuzhiyun __be16 type; 1565*4882a593Smuzhiyun __be16 len; 1566*4882a593Smuzhiyun u8 value[1]; 1567*4882a593Smuzhiyun }; 1568*4882a593Smuzhiyun 1569*4882a593Smuzhiyun /* 1570*4882a593Smuzhiyun * HBA Attribute Block 1571*4882a593Smuzhiyun */ 1572*4882a593Smuzhiyun struct fdmi_hba_attr_s { 1573*4882a593Smuzhiyun __be32 attr_count; /* # of attributes */ 1574*4882a593Smuzhiyun struct fdmi_attr_s hba_attr; /* n attributes */ 1575*4882a593Smuzhiyun }; 1576*4882a593Smuzhiyun 1577*4882a593Smuzhiyun /* 1578*4882a593Smuzhiyun * Registered Port List 1579*4882a593Smuzhiyun */ 1580*4882a593Smuzhiyun struct fdmi_port_list_s { 1581*4882a593Smuzhiyun __be32 num_ports; /* number Of Port Entries */ 1582*4882a593Smuzhiyun wwn_t port_entry; /* one or more */ 1583*4882a593Smuzhiyun }; 1584*4882a593Smuzhiyun 1585*4882a593Smuzhiyun /* 1586*4882a593Smuzhiyun * Port Attribute Block 1587*4882a593Smuzhiyun */ 1588*4882a593Smuzhiyun struct fdmi_port_attr_s { 1589*4882a593Smuzhiyun __be32 attr_count; /* # of attributes */ 1590*4882a593Smuzhiyun struct fdmi_attr_s port_attr; /* n attributes */ 1591*4882a593Smuzhiyun }; 1592*4882a593Smuzhiyun 1593*4882a593Smuzhiyun /* 1594*4882a593Smuzhiyun * FDMI Register HBA Attributes 1595*4882a593Smuzhiyun */ 1596*4882a593Smuzhiyun struct fdmi_rhba_s { 1597*4882a593Smuzhiyun wwn_t hba_id; /* HBA Identifier */ 1598*4882a593Smuzhiyun struct fdmi_port_list_s port_list; /* Registered Port List */ 1599*4882a593Smuzhiyun struct fdmi_hba_attr_s hba_attr_blk; /* HBA attribute block */ 1600*4882a593Smuzhiyun }; 1601*4882a593Smuzhiyun 1602*4882a593Smuzhiyun /* 1603*4882a593Smuzhiyun * FDMI Register Port 1604*4882a593Smuzhiyun */ 1605*4882a593Smuzhiyun struct fdmi_rprt_s { 1606*4882a593Smuzhiyun wwn_t hba_id; /* HBA Identifier */ 1607*4882a593Smuzhiyun wwn_t port_name; /* Port wwn */ 1608*4882a593Smuzhiyun struct fdmi_port_attr_s port_attr_blk; /* Port Attr Block */ 1609*4882a593Smuzhiyun }; 1610*4882a593Smuzhiyun 1611*4882a593Smuzhiyun /* 1612*4882a593Smuzhiyun * FDMI Register Port Attributes 1613*4882a593Smuzhiyun */ 1614*4882a593Smuzhiyun struct fdmi_rpa_s { 1615*4882a593Smuzhiyun wwn_t port_name; /* port wwn */ 1616*4882a593Smuzhiyun struct fdmi_port_attr_s port_attr_blk; /* Port Attr Block */ 1617*4882a593Smuzhiyun }; 1618*4882a593Smuzhiyun 1619*4882a593Smuzhiyun #pragma pack() 1620*4882a593Smuzhiyun 1621*4882a593Smuzhiyun #endif /* __BFA_FC_H__ */ 1622