18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright(c) 2007 Intel Corporation. All rights reserved. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Maintained at www.Open-FCoE.org 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _FC_ELS_H_ 98c2ecf20Sopenharmony_ci#define _FC_ELS_H_ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/types.h> 128c2ecf20Sopenharmony_ci#include <asm/byteorder.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci/* 158c2ecf20Sopenharmony_ci * Fibre Channel Switch - Enhanced Link Services definitions. 168c2ecf20Sopenharmony_ci * From T11 FC-LS Rev 1.2 June 7, 2005. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* 208c2ecf20Sopenharmony_ci * ELS Command codes - byte 0 of the frame payload 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_cienum fc_els_cmd { 238c2ecf20Sopenharmony_ci ELS_LS_RJT = 0x01, /* ESL reject */ 248c2ecf20Sopenharmony_ci ELS_LS_ACC = 0x02, /* ESL Accept */ 258c2ecf20Sopenharmony_ci ELS_PLOGI = 0x03, /* N_Port login */ 268c2ecf20Sopenharmony_ci ELS_FLOGI = 0x04, /* F_Port login */ 278c2ecf20Sopenharmony_ci ELS_LOGO = 0x05, /* Logout */ 288c2ecf20Sopenharmony_ci ELS_ABTX = 0x06, /* Abort exchange - obsolete */ 298c2ecf20Sopenharmony_ci ELS_RCS = 0x07, /* read connection status */ 308c2ecf20Sopenharmony_ci ELS_RES = 0x08, /* read exchange status block */ 318c2ecf20Sopenharmony_ci ELS_RSS = 0x09, /* read sequence status block */ 328c2ecf20Sopenharmony_ci ELS_RSI = 0x0a, /* read sequence initiative */ 338c2ecf20Sopenharmony_ci ELS_ESTS = 0x0b, /* establish streaming */ 348c2ecf20Sopenharmony_ci ELS_ESTC = 0x0c, /* estimate credit */ 358c2ecf20Sopenharmony_ci ELS_ADVC = 0x0d, /* advise credit */ 368c2ecf20Sopenharmony_ci ELS_RTV = 0x0e, /* read timeout value */ 378c2ecf20Sopenharmony_ci ELS_RLS = 0x0f, /* read link error status block */ 388c2ecf20Sopenharmony_ci ELS_ECHO = 0x10, /* echo */ 398c2ecf20Sopenharmony_ci ELS_TEST = 0x11, /* test */ 408c2ecf20Sopenharmony_ci ELS_RRQ = 0x12, /* reinstate recovery qualifier */ 418c2ecf20Sopenharmony_ci ELS_REC = 0x13, /* read exchange concise */ 428c2ecf20Sopenharmony_ci ELS_SRR = 0x14, /* sequence retransmission request */ 438c2ecf20Sopenharmony_ci ELS_FPIN = 0x16, /* Fabric Performance Impact Notification */ 448c2ecf20Sopenharmony_ci ELS_RDP = 0x18, /* Read Diagnostic Parameters */ 458c2ecf20Sopenharmony_ci ELS_RDF = 0x19, /* Register Diagnostic Functions */ 468c2ecf20Sopenharmony_ci ELS_PRLI = 0x20, /* process login */ 478c2ecf20Sopenharmony_ci ELS_PRLO = 0x21, /* process logout */ 488c2ecf20Sopenharmony_ci ELS_SCN = 0x22, /* state change notification */ 498c2ecf20Sopenharmony_ci ELS_TPLS = 0x23, /* test process login state */ 508c2ecf20Sopenharmony_ci ELS_TPRLO = 0x24, /* third party process logout */ 518c2ecf20Sopenharmony_ci ELS_LCLM = 0x25, /* login control list mgmt (obs) */ 528c2ecf20Sopenharmony_ci ELS_GAID = 0x30, /* get alias_ID */ 538c2ecf20Sopenharmony_ci ELS_FACT = 0x31, /* fabric activate alias_id */ 548c2ecf20Sopenharmony_ci ELS_FDACDT = 0x32, /* fabric deactivate alias_id */ 558c2ecf20Sopenharmony_ci ELS_NACT = 0x33, /* N-port activate alias_id */ 568c2ecf20Sopenharmony_ci ELS_NDACT = 0x34, /* N-port deactivate alias_id */ 578c2ecf20Sopenharmony_ci ELS_QOSR = 0x40, /* quality of service request */ 588c2ecf20Sopenharmony_ci ELS_RVCS = 0x41, /* read virtual circuit status */ 598c2ecf20Sopenharmony_ci ELS_PDISC = 0x50, /* discover N_port service params */ 608c2ecf20Sopenharmony_ci ELS_FDISC = 0x51, /* discover F_port service params */ 618c2ecf20Sopenharmony_ci ELS_ADISC = 0x52, /* discover address */ 628c2ecf20Sopenharmony_ci ELS_RNC = 0x53, /* report node cap (obs) */ 638c2ecf20Sopenharmony_ci ELS_FARP_REQ = 0x54, /* FC ARP request */ 648c2ecf20Sopenharmony_ci ELS_FARP_REPL = 0x55, /* FC ARP reply */ 658c2ecf20Sopenharmony_ci ELS_RPS = 0x56, /* read port status block */ 668c2ecf20Sopenharmony_ci ELS_RPL = 0x57, /* read port list */ 678c2ecf20Sopenharmony_ci ELS_RPBC = 0x58, /* read port buffer condition */ 688c2ecf20Sopenharmony_ci ELS_FAN = 0x60, /* fabric address notification */ 698c2ecf20Sopenharmony_ci ELS_RSCN = 0x61, /* registered state change notification */ 708c2ecf20Sopenharmony_ci ELS_SCR = 0x62, /* state change registration */ 718c2ecf20Sopenharmony_ci ELS_RNFT = 0x63, /* report node FC-4 types */ 728c2ecf20Sopenharmony_ci ELS_CSR = 0x68, /* clock synch. request */ 738c2ecf20Sopenharmony_ci ELS_CSU = 0x69, /* clock synch. update */ 748c2ecf20Sopenharmony_ci ELS_LINIT = 0x70, /* loop initialize */ 758c2ecf20Sopenharmony_ci ELS_LSTS = 0x72, /* loop status */ 768c2ecf20Sopenharmony_ci ELS_RNID = 0x78, /* request node ID data */ 778c2ecf20Sopenharmony_ci ELS_RLIR = 0x79, /* registered link incident report */ 788c2ecf20Sopenharmony_ci ELS_LIRR = 0x7a, /* link incident record registration */ 798c2ecf20Sopenharmony_ci ELS_SRL = 0x7b, /* scan remote loop */ 808c2ecf20Sopenharmony_ci ELS_SBRP = 0x7c, /* set bit-error reporting params */ 818c2ecf20Sopenharmony_ci ELS_RPSC = 0x7d, /* report speed capabilities */ 828c2ecf20Sopenharmony_ci ELS_QSA = 0x7e, /* query security attributes */ 838c2ecf20Sopenharmony_ci ELS_EVFP = 0x7f, /* exchange virt. fabrics params */ 848c2ecf20Sopenharmony_ci ELS_LKA = 0x80, /* link keep-alive */ 858c2ecf20Sopenharmony_ci ELS_AUTH_ELS = 0x90, /* authentication ELS */ 868c2ecf20Sopenharmony_ci}; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci/* 898c2ecf20Sopenharmony_ci * Initializer useful for decoding table. 908c2ecf20Sopenharmony_ci * Please keep this in sync with the above definitions. 918c2ecf20Sopenharmony_ci */ 928c2ecf20Sopenharmony_ci#define FC_ELS_CMDS_INIT { \ 938c2ecf20Sopenharmony_ci [ELS_LS_RJT] = "LS_RJT", \ 948c2ecf20Sopenharmony_ci [ELS_LS_ACC] = "LS_ACC", \ 958c2ecf20Sopenharmony_ci [ELS_PLOGI] = "PLOGI", \ 968c2ecf20Sopenharmony_ci [ELS_FLOGI] = "FLOGI", \ 978c2ecf20Sopenharmony_ci [ELS_LOGO] = "LOGO", \ 988c2ecf20Sopenharmony_ci [ELS_ABTX] = "ABTX", \ 998c2ecf20Sopenharmony_ci [ELS_RCS] = "RCS", \ 1008c2ecf20Sopenharmony_ci [ELS_RES] = "RES", \ 1018c2ecf20Sopenharmony_ci [ELS_RSS] = "RSS", \ 1028c2ecf20Sopenharmony_ci [ELS_RSI] = "RSI", \ 1038c2ecf20Sopenharmony_ci [ELS_ESTS] = "ESTS", \ 1048c2ecf20Sopenharmony_ci [ELS_ESTC] = "ESTC", \ 1058c2ecf20Sopenharmony_ci [ELS_ADVC] = "ADVC", \ 1068c2ecf20Sopenharmony_ci [ELS_RTV] = "RTV", \ 1078c2ecf20Sopenharmony_ci [ELS_RLS] = "RLS", \ 1088c2ecf20Sopenharmony_ci [ELS_ECHO] = "ECHO", \ 1098c2ecf20Sopenharmony_ci [ELS_TEST] = "TEST", \ 1108c2ecf20Sopenharmony_ci [ELS_RRQ] = "RRQ", \ 1118c2ecf20Sopenharmony_ci [ELS_REC] = "REC", \ 1128c2ecf20Sopenharmony_ci [ELS_SRR] = "SRR", \ 1138c2ecf20Sopenharmony_ci [ELS_FPIN] = "FPIN", \ 1148c2ecf20Sopenharmony_ci [ELS_RDP] = "RDP", \ 1158c2ecf20Sopenharmony_ci [ELS_RDF] = "RDF", \ 1168c2ecf20Sopenharmony_ci [ELS_PRLI] = "PRLI", \ 1178c2ecf20Sopenharmony_ci [ELS_PRLO] = "PRLO", \ 1188c2ecf20Sopenharmony_ci [ELS_SCN] = "SCN", \ 1198c2ecf20Sopenharmony_ci [ELS_TPLS] = "TPLS", \ 1208c2ecf20Sopenharmony_ci [ELS_TPRLO] = "TPRLO", \ 1218c2ecf20Sopenharmony_ci [ELS_LCLM] = "LCLM", \ 1228c2ecf20Sopenharmony_ci [ELS_GAID] = "GAID", \ 1238c2ecf20Sopenharmony_ci [ELS_FACT] = "FACT", \ 1248c2ecf20Sopenharmony_ci [ELS_FDACDT] = "FDACDT", \ 1258c2ecf20Sopenharmony_ci [ELS_NACT] = "NACT", \ 1268c2ecf20Sopenharmony_ci [ELS_NDACT] = "NDACT", \ 1278c2ecf20Sopenharmony_ci [ELS_QOSR] = "QOSR", \ 1288c2ecf20Sopenharmony_ci [ELS_RVCS] = "RVCS", \ 1298c2ecf20Sopenharmony_ci [ELS_PDISC] = "PDISC", \ 1308c2ecf20Sopenharmony_ci [ELS_FDISC] = "FDISC", \ 1318c2ecf20Sopenharmony_ci [ELS_ADISC] = "ADISC", \ 1328c2ecf20Sopenharmony_ci [ELS_RNC] = "RNC", \ 1338c2ecf20Sopenharmony_ci [ELS_FARP_REQ] = "FARP_REQ", \ 1348c2ecf20Sopenharmony_ci [ELS_FARP_REPL] = "FARP_REPL", \ 1358c2ecf20Sopenharmony_ci [ELS_RPS] = "RPS", \ 1368c2ecf20Sopenharmony_ci [ELS_RPL] = "RPL", \ 1378c2ecf20Sopenharmony_ci [ELS_RPBC] = "RPBC", \ 1388c2ecf20Sopenharmony_ci [ELS_FAN] = "FAN", \ 1398c2ecf20Sopenharmony_ci [ELS_RSCN] = "RSCN", \ 1408c2ecf20Sopenharmony_ci [ELS_SCR] = "SCR", \ 1418c2ecf20Sopenharmony_ci [ELS_RNFT] = "RNFT", \ 1428c2ecf20Sopenharmony_ci [ELS_CSR] = "CSR", \ 1438c2ecf20Sopenharmony_ci [ELS_CSU] = "CSU", \ 1448c2ecf20Sopenharmony_ci [ELS_LINIT] = "LINIT", \ 1458c2ecf20Sopenharmony_ci [ELS_LSTS] = "LSTS", \ 1468c2ecf20Sopenharmony_ci [ELS_RNID] = "RNID", \ 1478c2ecf20Sopenharmony_ci [ELS_RLIR] = "RLIR", \ 1488c2ecf20Sopenharmony_ci [ELS_LIRR] = "LIRR", \ 1498c2ecf20Sopenharmony_ci [ELS_SRL] = "SRL", \ 1508c2ecf20Sopenharmony_ci [ELS_SBRP] = "SBRP", \ 1518c2ecf20Sopenharmony_ci [ELS_RPSC] = "RPSC", \ 1528c2ecf20Sopenharmony_ci [ELS_QSA] = "QSA", \ 1538c2ecf20Sopenharmony_ci [ELS_EVFP] = "EVFP", \ 1548c2ecf20Sopenharmony_ci [ELS_LKA] = "LKA", \ 1558c2ecf20Sopenharmony_ci [ELS_AUTH_ELS] = "AUTH_ELS", \ 1568c2ecf20Sopenharmony_ci} 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci/* 1598c2ecf20Sopenharmony_ci * LS_ACC payload. 1608c2ecf20Sopenharmony_ci */ 1618c2ecf20Sopenharmony_cistruct fc_els_ls_acc { 1628c2ecf20Sopenharmony_ci __u8 la_cmd; /* command code ELS_LS_ACC */ 1638c2ecf20Sopenharmony_ci __u8 la_resv[3]; /* reserved */ 1648c2ecf20Sopenharmony_ci}; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci/* 1678c2ecf20Sopenharmony_ci * ELS reject payload. 1688c2ecf20Sopenharmony_ci */ 1698c2ecf20Sopenharmony_cistruct fc_els_ls_rjt { 1708c2ecf20Sopenharmony_ci __u8 er_cmd; /* command code ELS_LS_RJT */ 1718c2ecf20Sopenharmony_ci __u8 er_resv[4]; /* reserved must be zero */ 1728c2ecf20Sopenharmony_ci __u8 er_reason; /* reason (enum fc_els_rjt_reason below) */ 1738c2ecf20Sopenharmony_ci __u8 er_explan; /* explanation (enum fc_els_rjt_explan below) */ 1748c2ecf20Sopenharmony_ci __u8 er_vendor; /* vendor specific code */ 1758c2ecf20Sopenharmony_ci}; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci/* 1788c2ecf20Sopenharmony_ci * ELS reject reason codes (er_reason). 1798c2ecf20Sopenharmony_ci */ 1808c2ecf20Sopenharmony_cienum fc_els_rjt_reason { 1818c2ecf20Sopenharmony_ci ELS_RJT_NONE = 0, /* no reject - not to be sent */ 1828c2ecf20Sopenharmony_ci ELS_RJT_INVAL = 0x01, /* invalid ELS command code */ 1838c2ecf20Sopenharmony_ci ELS_RJT_LOGIC = 0x03, /* logical error */ 1848c2ecf20Sopenharmony_ci ELS_RJT_BUSY = 0x05, /* logical busy */ 1858c2ecf20Sopenharmony_ci ELS_RJT_PROT = 0x07, /* protocol error */ 1868c2ecf20Sopenharmony_ci ELS_RJT_UNAB = 0x09, /* unable to perform command request */ 1878c2ecf20Sopenharmony_ci ELS_RJT_UNSUP = 0x0b, /* command not supported */ 1888c2ecf20Sopenharmony_ci ELS_RJT_INPROG = 0x0e, /* command already in progress */ 1898c2ecf20Sopenharmony_ci ELS_RJT_FIP = 0x20, /* FIP error */ 1908c2ecf20Sopenharmony_ci ELS_RJT_VENDOR = 0xff, /* vendor specific error */ 1918c2ecf20Sopenharmony_ci}; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci/* 1958c2ecf20Sopenharmony_ci * reason code explanation (er_explan). 1968c2ecf20Sopenharmony_ci */ 1978c2ecf20Sopenharmony_cienum fc_els_rjt_explan { 1988c2ecf20Sopenharmony_ci ELS_EXPL_NONE = 0x00, /* No additional explanation */ 1998c2ecf20Sopenharmony_ci ELS_EXPL_SPP_OPT_ERR = 0x01, /* service parameter error - options */ 2008c2ecf20Sopenharmony_ci ELS_EXPL_SPP_ICTL_ERR = 0x03, /* service parm error - initiator ctl */ 2018c2ecf20Sopenharmony_ci ELS_EXPL_AH = 0x11, /* invalid association header */ 2028c2ecf20Sopenharmony_ci ELS_EXPL_AH_REQ = 0x13, /* association_header required */ 2038c2ecf20Sopenharmony_ci ELS_EXPL_SID = 0x15, /* invalid originator S_ID */ 2048c2ecf20Sopenharmony_ci ELS_EXPL_OXID_RXID = 0x17, /* invalid OX_ID-RX_ID combination */ 2058c2ecf20Sopenharmony_ci ELS_EXPL_INPROG = 0x19, /* Request already in progress */ 2068c2ecf20Sopenharmony_ci ELS_EXPL_PLOGI_REQD = 0x1e, /* N_Port login required */ 2078c2ecf20Sopenharmony_ci ELS_EXPL_INSUF_RES = 0x29, /* insufficient resources */ 2088c2ecf20Sopenharmony_ci ELS_EXPL_UNAB_DATA = 0x2a, /* unable to supply requested data */ 2098c2ecf20Sopenharmony_ci ELS_EXPL_UNSUPR = 0x2c, /* Request not supported */ 2108c2ecf20Sopenharmony_ci ELS_EXPL_INV_LEN = 0x2d, /* Invalid payload length */ 2118c2ecf20Sopenharmony_ci ELS_EXPL_NOT_NEIGHBOR = 0x62, /* VN2VN_Port not in neighbor set */ 2128c2ecf20Sopenharmony_ci /* TBD - above definitions incomplete */ 2138c2ecf20Sopenharmony_ci}; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci/* 2168c2ecf20Sopenharmony_ci * Link Service TLV Descriptor Tag Values 2178c2ecf20Sopenharmony_ci */ 2188c2ecf20Sopenharmony_cienum fc_ls_tlv_dtag { 2198c2ecf20Sopenharmony_ci ELS_DTAG_LS_REQ_INFO = 0x00000001, 2208c2ecf20Sopenharmony_ci /* Link Service Request Information Descriptor */ 2218c2ecf20Sopenharmony_ci ELS_DTAG_LNK_INTEGRITY = 0x00020001, 2228c2ecf20Sopenharmony_ci /* Link Integrity Notification Descriptor */ 2238c2ecf20Sopenharmony_ci ELS_DTAG_DELIVERY = 0x00020002, 2248c2ecf20Sopenharmony_ci /* Delivery Notification Descriptor */ 2258c2ecf20Sopenharmony_ci ELS_DTAG_PEER_CONGEST = 0x00020003, 2268c2ecf20Sopenharmony_ci /* Peer Congestion Notification Descriptor */ 2278c2ecf20Sopenharmony_ci ELS_DTAG_CONGESTION = 0x00020004, 2288c2ecf20Sopenharmony_ci /* Congestion Notification Descriptor */ 2298c2ecf20Sopenharmony_ci ELS_DTAG_FPIN_REGISTER = 0x00030001, 2308c2ecf20Sopenharmony_ci /* FPIN Registration Descriptor */ 2318c2ecf20Sopenharmony_ci}; 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci/* 2348c2ecf20Sopenharmony_ci * Initializer useful for decoding table. 2358c2ecf20Sopenharmony_ci * Please keep this in sync with the above definitions. 2368c2ecf20Sopenharmony_ci */ 2378c2ecf20Sopenharmony_ci#define FC_LS_TLV_DTAG_INIT { \ 2388c2ecf20Sopenharmony_ci { ELS_DTAG_LS_REQ_INFO, "Link Service Request Information" }, \ 2398c2ecf20Sopenharmony_ci { ELS_DTAG_LNK_INTEGRITY, "Link Integrity Notification" }, \ 2408c2ecf20Sopenharmony_ci { ELS_DTAG_DELIVERY, "Delivery Notification Present" }, \ 2418c2ecf20Sopenharmony_ci { ELS_DTAG_PEER_CONGEST, "Peer Congestion Notification" }, \ 2428c2ecf20Sopenharmony_ci { ELS_DTAG_CONGESTION, "Congestion Notification" }, \ 2438c2ecf20Sopenharmony_ci { ELS_DTAG_FPIN_REGISTER, "FPIN Registration" }, \ 2448c2ecf20Sopenharmony_ci} 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci/* 2488c2ecf20Sopenharmony_ci * Generic Link Service TLV Descriptor format 2498c2ecf20Sopenharmony_ci * 2508c2ecf20Sopenharmony_ci * This structure, as it defines no payload, will also be referred to 2518c2ecf20Sopenharmony_ci * as the "tlv header" - which contains the tag and len fields. 2528c2ecf20Sopenharmony_ci */ 2538c2ecf20Sopenharmony_cistruct fc_tlv_desc { 2548c2ecf20Sopenharmony_ci __be32 desc_tag; /* Notification Descriptor Tag */ 2558c2ecf20Sopenharmony_ci __be32 desc_len; /* Length of Descriptor (in bytes). 2568c2ecf20Sopenharmony_ci * Size of descriptor excluding 2578c2ecf20Sopenharmony_ci * desc_tag and desc_len fields. 2588c2ecf20Sopenharmony_ci */ 2598c2ecf20Sopenharmony_ci __u8 desc_value[0]; /* Descriptor Value */ 2608c2ecf20Sopenharmony_ci}; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci/* Descriptor tag and len fields are considered the mandatory header 2638c2ecf20Sopenharmony_ci * for a descriptor 2648c2ecf20Sopenharmony_ci */ 2658c2ecf20Sopenharmony_ci#define FC_TLV_DESC_HDR_SZ sizeof(struct fc_tlv_desc) 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci/* 2688c2ecf20Sopenharmony_ci * Macro, used when initializing payloads, to return the descriptor length. 2698c2ecf20Sopenharmony_ci * Length is size of descriptor minus the tag and len fields. 2708c2ecf20Sopenharmony_ci */ 2718c2ecf20Sopenharmony_ci#define FC_TLV_DESC_LENGTH_FROM_SZ(desc) \ 2728c2ecf20Sopenharmony_ci (sizeof(desc) - FC_TLV_DESC_HDR_SZ) 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci/* Macro, used on received payloads, to return the descriptor length */ 2758c2ecf20Sopenharmony_ci#define FC_TLV_DESC_SZ_FROM_LENGTH(tlv) \ 2768c2ecf20Sopenharmony_ci (__be32_to_cpu((tlv)->desc_len) + FC_TLV_DESC_HDR_SZ) 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ci/* 2798c2ecf20Sopenharmony_ci * This helper is used to walk descriptors in a descriptor list. 2808c2ecf20Sopenharmony_ci * Given the address of the current descriptor, which minimally contains a 2818c2ecf20Sopenharmony_ci * tag and len field, calculate the address of the next descriptor based 2828c2ecf20Sopenharmony_ci * on the len field. 2838c2ecf20Sopenharmony_ci */ 2848c2ecf20Sopenharmony_cistatic inline void *fc_tlv_next_desc(void *desc) 2858c2ecf20Sopenharmony_ci{ 2868c2ecf20Sopenharmony_ci struct fc_tlv_desc *tlv = desc; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci return (desc + FC_TLV_DESC_SZ_FROM_LENGTH(tlv)); 2898c2ecf20Sopenharmony_ci} 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ci/* 2938c2ecf20Sopenharmony_ci * Link Service Request Information Descriptor 2948c2ecf20Sopenharmony_ci */ 2958c2ecf20Sopenharmony_cistruct fc_els_lsri_desc { 2968c2ecf20Sopenharmony_ci __be32 desc_tag; /* descriptor tag (0x0000 0001) */ 2978c2ecf20Sopenharmony_ci __be32 desc_len; /* Length of Descriptor (in bytes) (4). 2988c2ecf20Sopenharmony_ci * Size of descriptor excluding 2998c2ecf20Sopenharmony_ci * desc_tag and desc_len fields. 3008c2ecf20Sopenharmony_ci */ 3018c2ecf20Sopenharmony_ci struct { 3028c2ecf20Sopenharmony_ci __u8 cmd; /* ELS cmd byte */ 3038c2ecf20Sopenharmony_ci __u8 bytes[3]; /* bytes 1..3 */ 3048c2ecf20Sopenharmony_ci } rqst_w0; /* Request word 0 */ 3058c2ecf20Sopenharmony_ci}; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci/* 3098c2ecf20Sopenharmony_ci * Common service parameters (N ports). 3108c2ecf20Sopenharmony_ci */ 3118c2ecf20Sopenharmony_cistruct fc_els_csp { 3128c2ecf20Sopenharmony_ci __u8 sp_hi_ver; /* highest version supported (obs.) */ 3138c2ecf20Sopenharmony_ci __u8 sp_lo_ver; /* highest version supported (obs.) */ 3148c2ecf20Sopenharmony_ci __be16 sp_bb_cred; /* buffer-to-buffer credits */ 3158c2ecf20Sopenharmony_ci __be16 sp_features; /* common feature flags */ 3168c2ecf20Sopenharmony_ci __be16 sp_bb_data; /* b-b state number and data field sz */ 3178c2ecf20Sopenharmony_ci union { 3188c2ecf20Sopenharmony_ci struct { 3198c2ecf20Sopenharmony_ci __be16 _sp_tot_seq; /* total concurrent sequences */ 3208c2ecf20Sopenharmony_ci __be16 _sp_rel_off; /* rel. offset by info cat */ 3218c2ecf20Sopenharmony_ci } sp_plogi; 3228c2ecf20Sopenharmony_ci struct { 3238c2ecf20Sopenharmony_ci __be32 _sp_r_a_tov; /* resource alloc. timeout msec */ 3248c2ecf20Sopenharmony_ci } sp_flogi_acc; 3258c2ecf20Sopenharmony_ci } sp_u; 3268c2ecf20Sopenharmony_ci __be32 sp_e_d_tov; /* error detect timeout value */ 3278c2ecf20Sopenharmony_ci}; 3288c2ecf20Sopenharmony_ci#define sp_tot_seq sp_u.sp_plogi._sp_tot_seq 3298c2ecf20Sopenharmony_ci#define sp_rel_off sp_u.sp_plogi._sp_rel_off 3308c2ecf20Sopenharmony_ci#define sp_r_a_tov sp_u.sp_flogi_acc._sp_r_a_tov 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci#define FC_SP_BB_DATA_MASK 0xfff /* mask for data field size in sp_bb_data */ 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci/* 3358c2ecf20Sopenharmony_ci * Minimum and maximum values for max data field size in service parameters. 3368c2ecf20Sopenharmony_ci */ 3378c2ecf20Sopenharmony_ci#define FC_SP_MIN_MAX_PAYLOAD FC_MIN_MAX_PAYLOAD 3388c2ecf20Sopenharmony_ci#define FC_SP_MAX_MAX_PAYLOAD FC_MAX_PAYLOAD 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci/* 3418c2ecf20Sopenharmony_ci * sp_features 3428c2ecf20Sopenharmony_ci */ 3438c2ecf20Sopenharmony_ci#define FC_SP_FT_NPIV 0x8000 /* multiple N_Port_ID support (FLOGI) */ 3448c2ecf20Sopenharmony_ci#define FC_SP_FT_CIRO 0x8000 /* continuously increasing rel off (PLOGI) */ 3458c2ecf20Sopenharmony_ci#define FC_SP_FT_CLAD 0x8000 /* clean address (in FLOGI LS_ACC) */ 3468c2ecf20Sopenharmony_ci#define FC_SP_FT_RAND 0x4000 /* random relative offset */ 3478c2ecf20Sopenharmony_ci#define FC_SP_FT_VAL 0x2000 /* valid vendor version level */ 3488c2ecf20Sopenharmony_ci#define FC_SP_FT_NPIV_ACC 0x2000 /* NPIV assignment (FLOGI LS_ACC) */ 3498c2ecf20Sopenharmony_ci#define FC_SP_FT_FPORT 0x1000 /* F port (1) vs. N port (0) */ 3508c2ecf20Sopenharmony_ci#define FC_SP_FT_ABB 0x0800 /* alternate BB_credit management */ 3518c2ecf20Sopenharmony_ci#define FC_SP_FT_EDTR 0x0400 /* E_D_TOV Resolution is nanoseconds */ 3528c2ecf20Sopenharmony_ci#define FC_SP_FT_MCAST 0x0200 /* multicast */ 3538c2ecf20Sopenharmony_ci#define FC_SP_FT_BCAST 0x0100 /* broadcast */ 3548c2ecf20Sopenharmony_ci#define FC_SP_FT_HUNT 0x0080 /* hunt group */ 3558c2ecf20Sopenharmony_ci#define FC_SP_FT_SIMP 0x0040 /* dedicated simplex */ 3568c2ecf20Sopenharmony_ci#define FC_SP_FT_SEC 0x0020 /* reserved for security */ 3578c2ecf20Sopenharmony_ci#define FC_SP_FT_CSYN 0x0010 /* clock synch. supported */ 3588c2ecf20Sopenharmony_ci#define FC_SP_FT_RTTOV 0x0008 /* R_T_TOV value 100 uS, else 100 mS */ 3598c2ecf20Sopenharmony_ci#define FC_SP_FT_HALF 0x0004 /* dynamic half duplex */ 3608c2ecf20Sopenharmony_ci#define FC_SP_FT_SEQC 0x0002 /* SEQ_CNT */ 3618c2ecf20Sopenharmony_ci#define FC_SP_FT_PAYL 0x0001 /* FLOGI payload length 256, else 116 */ 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_ci/* 3648c2ecf20Sopenharmony_ci * Class-specific service parameters. 3658c2ecf20Sopenharmony_ci */ 3668c2ecf20Sopenharmony_cistruct fc_els_cssp { 3678c2ecf20Sopenharmony_ci __be16 cp_class; /* class flags */ 3688c2ecf20Sopenharmony_ci __be16 cp_init; /* initiator flags */ 3698c2ecf20Sopenharmony_ci __be16 cp_recip; /* recipient flags */ 3708c2ecf20Sopenharmony_ci __be16 cp_rdfs; /* receive data field size */ 3718c2ecf20Sopenharmony_ci __be16 cp_con_seq; /* concurrent sequences */ 3728c2ecf20Sopenharmony_ci __be16 cp_ee_cred; /* N-port end-to-end credit */ 3738c2ecf20Sopenharmony_ci __u8 cp_resv1; /* reserved */ 3748c2ecf20Sopenharmony_ci __u8 cp_open_seq; /* open sequences per exchange */ 3758c2ecf20Sopenharmony_ci __u8 _cp_resv2[2]; /* reserved */ 3768c2ecf20Sopenharmony_ci}; 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci/* 3798c2ecf20Sopenharmony_ci * cp_class flags. 3808c2ecf20Sopenharmony_ci */ 3818c2ecf20Sopenharmony_ci#define FC_CPC_VALID 0x8000 /* class valid */ 3828c2ecf20Sopenharmony_ci#define FC_CPC_IMIX 0x4000 /* intermix mode */ 3838c2ecf20Sopenharmony_ci#define FC_CPC_SEQ 0x0800 /* sequential delivery */ 3848c2ecf20Sopenharmony_ci#define FC_CPC_CAMP 0x0200 /* camp-on */ 3858c2ecf20Sopenharmony_ci#define FC_CPC_PRI 0x0080 /* priority */ 3868c2ecf20Sopenharmony_ci 3878c2ecf20Sopenharmony_ci/* 3888c2ecf20Sopenharmony_ci * cp_init flags. 3898c2ecf20Sopenharmony_ci * (TBD: not all flags defined here). 3908c2ecf20Sopenharmony_ci */ 3918c2ecf20Sopenharmony_ci#define FC_CPI_CSYN 0x0010 /* clock synch. capable */ 3928c2ecf20Sopenharmony_ci 3938c2ecf20Sopenharmony_ci/* 3948c2ecf20Sopenharmony_ci * cp_recip flags. 3958c2ecf20Sopenharmony_ci */ 3968c2ecf20Sopenharmony_ci#define FC_CPR_CSYN 0x0008 /* clock synch. capable */ 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ci/* 3998c2ecf20Sopenharmony_ci * NFC_ELS_FLOGI: Fabric login request. 4008c2ecf20Sopenharmony_ci * NFC_ELS_PLOGI: Port login request (same format). 4018c2ecf20Sopenharmony_ci */ 4028c2ecf20Sopenharmony_cistruct fc_els_flogi { 4038c2ecf20Sopenharmony_ci __u8 fl_cmd; /* command */ 4048c2ecf20Sopenharmony_ci __u8 _fl_resvd[3]; /* must be zero */ 4058c2ecf20Sopenharmony_ci struct fc_els_csp fl_csp; /* common service parameters */ 4068c2ecf20Sopenharmony_ci __be64 fl_wwpn; /* port name */ 4078c2ecf20Sopenharmony_ci __be64 fl_wwnn; /* node name */ 4088c2ecf20Sopenharmony_ci struct fc_els_cssp fl_cssp[4]; /* class 1-4 service parameters */ 4098c2ecf20Sopenharmony_ci __u8 fl_vend[16]; /* vendor version level */ 4108c2ecf20Sopenharmony_ci} __attribute__((__packed__)); 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ci/* 4138c2ecf20Sopenharmony_ci * Process login service parameter page. 4148c2ecf20Sopenharmony_ci */ 4158c2ecf20Sopenharmony_cistruct fc_els_spp { 4168c2ecf20Sopenharmony_ci __u8 spp_type; /* type code or common service params */ 4178c2ecf20Sopenharmony_ci __u8 spp_type_ext; /* type code extension */ 4188c2ecf20Sopenharmony_ci __u8 spp_flags; 4198c2ecf20Sopenharmony_ci __u8 _spp_resvd; 4208c2ecf20Sopenharmony_ci __be32 spp_orig_pa; /* originator process associator */ 4218c2ecf20Sopenharmony_ci __be32 spp_resp_pa; /* responder process associator */ 4228c2ecf20Sopenharmony_ci __be32 spp_params; /* service parameters */ 4238c2ecf20Sopenharmony_ci}; 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_ci/* 4268c2ecf20Sopenharmony_ci * spp_flags. 4278c2ecf20Sopenharmony_ci */ 4288c2ecf20Sopenharmony_ci#define FC_SPP_OPA_VAL 0x80 /* originator proc. assoc. valid */ 4298c2ecf20Sopenharmony_ci#define FC_SPP_RPA_VAL 0x40 /* responder proc. assoc. valid */ 4308c2ecf20Sopenharmony_ci#define FC_SPP_EST_IMG_PAIR 0x20 /* establish image pair */ 4318c2ecf20Sopenharmony_ci#define FC_SPP_RESP_MASK 0x0f /* mask for response code (below) */ 4328c2ecf20Sopenharmony_ci 4338c2ecf20Sopenharmony_ci/* 4348c2ecf20Sopenharmony_ci * SPP response code in spp_flags - lower 4 bits. 4358c2ecf20Sopenharmony_ci */ 4368c2ecf20Sopenharmony_cienum fc_els_spp_resp { 4378c2ecf20Sopenharmony_ci FC_SPP_RESP_ACK = 1, /* request executed */ 4388c2ecf20Sopenharmony_ci FC_SPP_RESP_RES = 2, /* unable due to lack of resources */ 4398c2ecf20Sopenharmony_ci FC_SPP_RESP_INIT = 3, /* initialization not complete */ 4408c2ecf20Sopenharmony_ci FC_SPP_RESP_NO_PA = 4, /* unknown process associator */ 4418c2ecf20Sopenharmony_ci FC_SPP_RESP_CONF = 5, /* configuration precludes image pair */ 4428c2ecf20Sopenharmony_ci FC_SPP_RESP_COND = 6, /* request completed conditionally */ 4438c2ecf20Sopenharmony_ci FC_SPP_RESP_MULT = 7, /* unable to handle multiple SPPs */ 4448c2ecf20Sopenharmony_ci FC_SPP_RESP_INVL = 8, /* SPP is invalid */ 4458c2ecf20Sopenharmony_ci}; 4468c2ecf20Sopenharmony_ci 4478c2ecf20Sopenharmony_ci/* 4488c2ecf20Sopenharmony_ci * ELS_RRQ - Reinstate Recovery Qualifier 4498c2ecf20Sopenharmony_ci */ 4508c2ecf20Sopenharmony_cistruct fc_els_rrq { 4518c2ecf20Sopenharmony_ci __u8 rrq_cmd; /* command (0x12) */ 4528c2ecf20Sopenharmony_ci __u8 rrq_zero[3]; /* specified as zero - part of cmd */ 4538c2ecf20Sopenharmony_ci __u8 rrq_resvd; /* reserved */ 4548c2ecf20Sopenharmony_ci __u8 rrq_s_id[3]; /* originator FID */ 4558c2ecf20Sopenharmony_ci __be16 rrq_ox_id; /* originator exchange ID */ 4568c2ecf20Sopenharmony_ci __be16 rrq_rx_id; /* responders exchange ID */ 4578c2ecf20Sopenharmony_ci}; 4588c2ecf20Sopenharmony_ci 4598c2ecf20Sopenharmony_ci/* 4608c2ecf20Sopenharmony_ci * ELS_REC - Read exchange concise. 4618c2ecf20Sopenharmony_ci */ 4628c2ecf20Sopenharmony_cistruct fc_els_rec { 4638c2ecf20Sopenharmony_ci __u8 rec_cmd; /* command (0x13) */ 4648c2ecf20Sopenharmony_ci __u8 rec_zero[3]; /* specified as zero - part of cmd */ 4658c2ecf20Sopenharmony_ci __u8 rec_resvd; /* reserved */ 4668c2ecf20Sopenharmony_ci __u8 rec_s_id[3]; /* originator FID */ 4678c2ecf20Sopenharmony_ci __be16 rec_ox_id; /* originator exchange ID */ 4688c2ecf20Sopenharmony_ci __be16 rec_rx_id; /* responders exchange ID */ 4698c2ecf20Sopenharmony_ci}; 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_ci/* 4728c2ecf20Sopenharmony_ci * ELS_REC LS_ACC payload. 4738c2ecf20Sopenharmony_ci */ 4748c2ecf20Sopenharmony_cistruct fc_els_rec_acc { 4758c2ecf20Sopenharmony_ci __u8 reca_cmd; /* accept (0x02) */ 4768c2ecf20Sopenharmony_ci __u8 reca_zero[3]; /* specified as zero - part of cmd */ 4778c2ecf20Sopenharmony_ci __be16 reca_ox_id; /* originator exchange ID */ 4788c2ecf20Sopenharmony_ci __be16 reca_rx_id; /* responders exchange ID */ 4798c2ecf20Sopenharmony_ci __u8 reca_resvd1; /* reserved */ 4808c2ecf20Sopenharmony_ci __u8 reca_ofid[3]; /* originator FID */ 4818c2ecf20Sopenharmony_ci __u8 reca_resvd2; /* reserved */ 4828c2ecf20Sopenharmony_ci __u8 reca_rfid[3]; /* responder FID */ 4838c2ecf20Sopenharmony_ci __be32 reca_fc4value; /* FC4 value */ 4848c2ecf20Sopenharmony_ci __be32 reca_e_stat; /* ESB (exchange status block) status */ 4858c2ecf20Sopenharmony_ci}; 4868c2ecf20Sopenharmony_ci 4878c2ecf20Sopenharmony_ci/* 4888c2ecf20Sopenharmony_ci * ELS_PRLI - Process login request and response. 4898c2ecf20Sopenharmony_ci */ 4908c2ecf20Sopenharmony_cistruct fc_els_prli { 4918c2ecf20Sopenharmony_ci __u8 prli_cmd; /* command */ 4928c2ecf20Sopenharmony_ci __u8 prli_spp_len; /* length of each serv. parm. page */ 4938c2ecf20Sopenharmony_ci __be16 prli_len; /* length of entire payload */ 4948c2ecf20Sopenharmony_ci /* service parameter pages follow */ 4958c2ecf20Sopenharmony_ci}; 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_ci/* 4988c2ecf20Sopenharmony_ci * ELS_PRLO - Process logout request and response. 4998c2ecf20Sopenharmony_ci */ 5008c2ecf20Sopenharmony_cistruct fc_els_prlo { 5018c2ecf20Sopenharmony_ci __u8 prlo_cmd; /* command */ 5028c2ecf20Sopenharmony_ci __u8 prlo_obs; /* obsolete, but shall be set to 10h */ 5038c2ecf20Sopenharmony_ci __be16 prlo_len; /* payload length */ 5048c2ecf20Sopenharmony_ci}; 5058c2ecf20Sopenharmony_ci 5068c2ecf20Sopenharmony_ci/* 5078c2ecf20Sopenharmony_ci * ELS_ADISC payload 5088c2ecf20Sopenharmony_ci */ 5098c2ecf20Sopenharmony_cistruct fc_els_adisc { 5108c2ecf20Sopenharmony_ci __u8 adisc_cmd; 5118c2ecf20Sopenharmony_ci __u8 adisc_resv[3]; 5128c2ecf20Sopenharmony_ci __u8 adisc_resv1; 5138c2ecf20Sopenharmony_ci __u8 adisc_hard_addr[3]; 5148c2ecf20Sopenharmony_ci __be64 adisc_wwpn; 5158c2ecf20Sopenharmony_ci __be64 adisc_wwnn; 5168c2ecf20Sopenharmony_ci __u8 adisc_resv2; 5178c2ecf20Sopenharmony_ci __u8 adisc_port_id[3]; 5188c2ecf20Sopenharmony_ci} __attribute__((__packed__)); 5198c2ecf20Sopenharmony_ci 5208c2ecf20Sopenharmony_ci/* 5218c2ecf20Sopenharmony_ci * ELS_LOGO - process or fabric logout. 5228c2ecf20Sopenharmony_ci */ 5238c2ecf20Sopenharmony_cistruct fc_els_logo { 5248c2ecf20Sopenharmony_ci __u8 fl_cmd; /* command code */ 5258c2ecf20Sopenharmony_ci __u8 fl_zero[3]; /* specified as zero - part of cmd */ 5268c2ecf20Sopenharmony_ci __u8 fl_resvd; /* reserved */ 5278c2ecf20Sopenharmony_ci __u8 fl_n_port_id[3];/* N port ID */ 5288c2ecf20Sopenharmony_ci __be64 fl_n_port_wwn; /* port name */ 5298c2ecf20Sopenharmony_ci}; 5308c2ecf20Sopenharmony_ci 5318c2ecf20Sopenharmony_ci/* 5328c2ecf20Sopenharmony_ci * ELS_RTV - read timeout value. 5338c2ecf20Sopenharmony_ci */ 5348c2ecf20Sopenharmony_cistruct fc_els_rtv { 5358c2ecf20Sopenharmony_ci __u8 rtv_cmd; /* command code 0x0e */ 5368c2ecf20Sopenharmony_ci __u8 rtv_zero[3]; /* specified as zero - part of cmd */ 5378c2ecf20Sopenharmony_ci}; 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci/* 5408c2ecf20Sopenharmony_ci * LS_ACC for ELS_RTV - read timeout value. 5418c2ecf20Sopenharmony_ci */ 5428c2ecf20Sopenharmony_cistruct fc_els_rtv_acc { 5438c2ecf20Sopenharmony_ci __u8 rtv_cmd; /* command code 0x02 */ 5448c2ecf20Sopenharmony_ci __u8 rtv_zero[3]; /* specified as zero - part of cmd */ 5458c2ecf20Sopenharmony_ci __be32 rtv_r_a_tov; /* resource allocation timeout value */ 5468c2ecf20Sopenharmony_ci __be32 rtv_e_d_tov; /* error detection timeout value */ 5478c2ecf20Sopenharmony_ci __be32 rtv_toq; /* timeout qualifier (see below) */ 5488c2ecf20Sopenharmony_ci}; 5498c2ecf20Sopenharmony_ci 5508c2ecf20Sopenharmony_ci/* 5518c2ecf20Sopenharmony_ci * rtv_toq bits. 5528c2ecf20Sopenharmony_ci */ 5538c2ecf20Sopenharmony_ci#define FC_ELS_RTV_EDRES (1 << 26) /* E_D_TOV resolution is nS else mS */ 5548c2ecf20Sopenharmony_ci#define FC_ELS_RTV_RTTOV (1 << 19) /* R_T_TOV is 100 uS else 100 mS */ 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci/* 5578c2ecf20Sopenharmony_ci * ELS_SCR - state change registration payload. 5588c2ecf20Sopenharmony_ci */ 5598c2ecf20Sopenharmony_cistruct fc_els_scr { 5608c2ecf20Sopenharmony_ci __u8 scr_cmd; /* command code */ 5618c2ecf20Sopenharmony_ci __u8 scr_resv[6]; /* reserved */ 5628c2ecf20Sopenharmony_ci __u8 scr_reg_func; /* registration function (see below) */ 5638c2ecf20Sopenharmony_ci}; 5648c2ecf20Sopenharmony_ci 5658c2ecf20Sopenharmony_cienum fc_els_scr_func { 5668c2ecf20Sopenharmony_ci ELS_SCRF_FAB = 1, /* fabric-detected registration */ 5678c2ecf20Sopenharmony_ci ELS_SCRF_NPORT = 2, /* Nx_Port-detected registration */ 5688c2ecf20Sopenharmony_ci ELS_SCRF_FULL = 3, /* full registration */ 5698c2ecf20Sopenharmony_ci ELS_SCRF_CLEAR = 255, /* remove any current registrations */ 5708c2ecf20Sopenharmony_ci}; 5718c2ecf20Sopenharmony_ci 5728c2ecf20Sopenharmony_ci/* 5738c2ecf20Sopenharmony_ci * ELS_RSCN - registered state change notification payload. 5748c2ecf20Sopenharmony_ci */ 5758c2ecf20Sopenharmony_cistruct fc_els_rscn { 5768c2ecf20Sopenharmony_ci __u8 rscn_cmd; /* RSCN opcode (0x61) */ 5778c2ecf20Sopenharmony_ci __u8 rscn_page_len; /* page length (4) */ 5788c2ecf20Sopenharmony_ci __be16 rscn_plen; /* payload length including this word */ 5798c2ecf20Sopenharmony_ci 5808c2ecf20Sopenharmony_ci /* followed by 4-byte generic affected Port_ID pages */ 5818c2ecf20Sopenharmony_ci}; 5828c2ecf20Sopenharmony_ci 5838c2ecf20Sopenharmony_cistruct fc_els_rscn_page { 5848c2ecf20Sopenharmony_ci __u8 rscn_page_flags; /* event and address format */ 5858c2ecf20Sopenharmony_ci __u8 rscn_fid[3]; /* fabric ID */ 5868c2ecf20Sopenharmony_ci}; 5878c2ecf20Sopenharmony_ci 5888c2ecf20Sopenharmony_ci#define ELS_RSCN_EV_QUAL_BIT 2 /* shift count for event qualifier */ 5898c2ecf20Sopenharmony_ci#define ELS_RSCN_EV_QUAL_MASK 0xf /* mask for event qualifier */ 5908c2ecf20Sopenharmony_ci#define ELS_RSCN_ADDR_FMT_BIT 0 /* shift count for address format */ 5918c2ecf20Sopenharmony_ci#define ELS_RSCN_ADDR_FMT_MASK 0x3 /* mask for address format */ 5928c2ecf20Sopenharmony_ci 5938c2ecf20Sopenharmony_cienum fc_els_rscn_ev_qual { 5948c2ecf20Sopenharmony_ci ELS_EV_QUAL_NONE = 0, /* unspecified */ 5958c2ecf20Sopenharmony_ci ELS_EV_QUAL_NS_OBJ = 1, /* changed name server object */ 5968c2ecf20Sopenharmony_ci ELS_EV_QUAL_PORT_ATTR = 2, /* changed port attribute */ 5978c2ecf20Sopenharmony_ci ELS_EV_QUAL_SERV_OBJ = 3, /* changed service object */ 5988c2ecf20Sopenharmony_ci ELS_EV_QUAL_SW_CONFIG = 4, /* changed switch configuration */ 5998c2ecf20Sopenharmony_ci ELS_EV_QUAL_REM_OBJ = 5, /* removed object */ 6008c2ecf20Sopenharmony_ci}; 6018c2ecf20Sopenharmony_ci 6028c2ecf20Sopenharmony_cienum fc_els_rscn_addr_fmt { 6038c2ecf20Sopenharmony_ci ELS_ADDR_FMT_PORT = 0, /* rscn_fid is a port address */ 6048c2ecf20Sopenharmony_ci ELS_ADDR_FMT_AREA = 1, /* rscn_fid is a area address */ 6058c2ecf20Sopenharmony_ci ELS_ADDR_FMT_DOM = 2, /* rscn_fid is a domain address */ 6068c2ecf20Sopenharmony_ci ELS_ADDR_FMT_FAB = 3, /* anything on fabric may have changed */ 6078c2ecf20Sopenharmony_ci}; 6088c2ecf20Sopenharmony_ci 6098c2ecf20Sopenharmony_ci/* 6108c2ecf20Sopenharmony_ci * ELS_RNID - request Node ID. 6118c2ecf20Sopenharmony_ci */ 6128c2ecf20Sopenharmony_cistruct fc_els_rnid { 6138c2ecf20Sopenharmony_ci __u8 rnid_cmd; /* RNID opcode (0x78) */ 6148c2ecf20Sopenharmony_ci __u8 rnid_resv[3]; /* reserved */ 6158c2ecf20Sopenharmony_ci __u8 rnid_fmt; /* data format */ 6168c2ecf20Sopenharmony_ci __u8 rnid_resv2[3]; /* reserved */ 6178c2ecf20Sopenharmony_ci}; 6188c2ecf20Sopenharmony_ci 6198c2ecf20Sopenharmony_ci/* 6208c2ecf20Sopenharmony_ci * Node Identification Data formats (rnid_fmt) 6218c2ecf20Sopenharmony_ci */ 6228c2ecf20Sopenharmony_cienum fc_els_rnid_fmt { 6238c2ecf20Sopenharmony_ci ELS_RNIDF_NONE = 0, /* no specific identification data */ 6248c2ecf20Sopenharmony_ci ELS_RNIDF_GEN = 0xdf, /* general topology discovery format */ 6258c2ecf20Sopenharmony_ci}; 6268c2ecf20Sopenharmony_ci 6278c2ecf20Sopenharmony_ci/* 6288c2ecf20Sopenharmony_ci * ELS_RNID response. 6298c2ecf20Sopenharmony_ci */ 6308c2ecf20Sopenharmony_cistruct fc_els_rnid_resp { 6318c2ecf20Sopenharmony_ci __u8 rnid_cmd; /* response code (LS_ACC) */ 6328c2ecf20Sopenharmony_ci __u8 rnid_resv[3]; /* reserved */ 6338c2ecf20Sopenharmony_ci __u8 rnid_fmt; /* data format */ 6348c2ecf20Sopenharmony_ci __u8 rnid_cid_len; /* common ID data length */ 6358c2ecf20Sopenharmony_ci __u8 rnid_resv2; /* reserved */ 6368c2ecf20Sopenharmony_ci __u8 rnid_sid_len; /* specific ID data length */ 6378c2ecf20Sopenharmony_ci}; 6388c2ecf20Sopenharmony_ci 6398c2ecf20Sopenharmony_cistruct fc_els_rnid_cid { 6408c2ecf20Sopenharmony_ci __be64 rnid_wwpn; /* N port name */ 6418c2ecf20Sopenharmony_ci __be64 rnid_wwnn; /* node name */ 6428c2ecf20Sopenharmony_ci}; 6438c2ecf20Sopenharmony_ci 6448c2ecf20Sopenharmony_cistruct fc_els_rnid_gen { 6458c2ecf20Sopenharmony_ci __u8 rnid_vend_id[16]; /* vendor-unique ID */ 6468c2ecf20Sopenharmony_ci __be32 rnid_atype; /* associated type (see below) */ 6478c2ecf20Sopenharmony_ci __be32 rnid_phys_port; /* physical port number */ 6488c2ecf20Sopenharmony_ci __be32 rnid_att_nodes; /* number of attached nodes */ 6498c2ecf20Sopenharmony_ci __u8 rnid_node_mgmt; /* node management (see below) */ 6508c2ecf20Sopenharmony_ci __u8 rnid_ip_ver; /* IP version (see below) */ 6518c2ecf20Sopenharmony_ci __be16 rnid_prot_port; /* UDP / TCP port number */ 6528c2ecf20Sopenharmony_ci __be32 rnid_ip_addr[4]; /* IP address */ 6538c2ecf20Sopenharmony_ci __u8 rnid_resvd[2]; /* reserved */ 6548c2ecf20Sopenharmony_ci __be16 rnid_vend_spec; /* vendor-specific field */ 6558c2ecf20Sopenharmony_ci}; 6568c2ecf20Sopenharmony_ci 6578c2ecf20Sopenharmony_cienum fc_els_rnid_atype { 6588c2ecf20Sopenharmony_ci ELS_RNIDA_UNK = 0x01, /* unknown */ 6598c2ecf20Sopenharmony_ci ELS_RNIDA_OTHER = 0x02, /* none of the following */ 6608c2ecf20Sopenharmony_ci ELS_RNIDA_HUB = 0x03, 6618c2ecf20Sopenharmony_ci ELS_RNIDA_SWITCH = 0x04, 6628c2ecf20Sopenharmony_ci ELS_RNIDA_GATEWAY = 0x05, 6638c2ecf20Sopenharmony_ci ELS_RNIDA_CONV = 0x06, /* Obsolete, do not use this value */ 6648c2ecf20Sopenharmony_ci ELS_RNIDA_HBA = 0x07, /* Obsolete, do not use this value */ 6658c2ecf20Sopenharmony_ci ELS_RNIDA_PROXY = 0x08, /* Obsolete, do not use this value */ 6668c2ecf20Sopenharmony_ci ELS_RNIDA_STORAGE = 0x09, 6678c2ecf20Sopenharmony_ci ELS_RNIDA_HOST = 0x0a, 6688c2ecf20Sopenharmony_ci ELS_RNIDA_SUBSYS = 0x0b, /* storage subsystem (e.g., RAID) */ 6698c2ecf20Sopenharmony_ci ELS_RNIDA_ACCESS = 0x0e, /* access device (e.g. media changer) */ 6708c2ecf20Sopenharmony_ci ELS_RNIDA_NAS = 0x11, /* NAS server */ 6718c2ecf20Sopenharmony_ci ELS_RNIDA_BRIDGE = 0x12, /* bridge */ 6728c2ecf20Sopenharmony_ci ELS_RNIDA_VIRT = 0x13, /* virtualization device */ 6738c2ecf20Sopenharmony_ci ELS_RNIDA_MF = 0xff, /* multifunction device (bits below) */ 6748c2ecf20Sopenharmony_ci ELS_RNIDA_MF_HUB = 1UL << 31, /* hub */ 6758c2ecf20Sopenharmony_ci ELS_RNIDA_MF_SW = 1UL << 30, /* switch */ 6768c2ecf20Sopenharmony_ci ELS_RNIDA_MF_GW = 1UL << 29, /* gateway */ 6778c2ecf20Sopenharmony_ci ELS_RNIDA_MF_ST = 1UL << 28, /* storage */ 6788c2ecf20Sopenharmony_ci ELS_RNIDA_MF_HOST = 1UL << 27, /* host */ 6798c2ecf20Sopenharmony_ci ELS_RNIDA_MF_SUB = 1UL << 26, /* storage subsystem */ 6808c2ecf20Sopenharmony_ci ELS_RNIDA_MF_ACC = 1UL << 25, /* storage access dev */ 6818c2ecf20Sopenharmony_ci ELS_RNIDA_MF_WDM = 1UL << 24, /* wavelength division mux */ 6828c2ecf20Sopenharmony_ci ELS_RNIDA_MF_NAS = 1UL << 23, /* NAS server */ 6838c2ecf20Sopenharmony_ci ELS_RNIDA_MF_BR = 1UL << 22, /* bridge */ 6848c2ecf20Sopenharmony_ci ELS_RNIDA_MF_VIRT = 1UL << 21, /* virtualization device */ 6858c2ecf20Sopenharmony_ci}; 6868c2ecf20Sopenharmony_ci 6878c2ecf20Sopenharmony_cienum fc_els_rnid_mgmt { 6888c2ecf20Sopenharmony_ci ELS_RNIDM_SNMP = 0, 6898c2ecf20Sopenharmony_ci ELS_RNIDM_TELNET = 1, 6908c2ecf20Sopenharmony_ci ELS_RNIDM_HTTP = 2, 6918c2ecf20Sopenharmony_ci ELS_RNIDM_HTTPS = 3, 6928c2ecf20Sopenharmony_ci ELS_RNIDM_XML = 4, /* HTTP + XML */ 6938c2ecf20Sopenharmony_ci}; 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_cienum fc_els_rnid_ipver { 6968c2ecf20Sopenharmony_ci ELS_RNIDIP_NONE = 0, /* no IP support or node mgmt. */ 6978c2ecf20Sopenharmony_ci ELS_RNIDIP_V4 = 1, /* IPv4 */ 6988c2ecf20Sopenharmony_ci ELS_RNIDIP_V6 = 2, /* IPv6 */ 6998c2ecf20Sopenharmony_ci}; 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_ci/* 7028c2ecf20Sopenharmony_ci * ELS RPL - Read Port List. 7038c2ecf20Sopenharmony_ci */ 7048c2ecf20Sopenharmony_cistruct fc_els_rpl { 7058c2ecf20Sopenharmony_ci __u8 rpl_cmd; /* command */ 7068c2ecf20Sopenharmony_ci __u8 rpl_resv[5]; /* reserved - must be zero */ 7078c2ecf20Sopenharmony_ci __be16 rpl_max_size; /* maximum response size or zero */ 7088c2ecf20Sopenharmony_ci __u8 rpl_resv1; /* reserved - must be zero */ 7098c2ecf20Sopenharmony_ci __u8 rpl_index[3]; /* starting index */ 7108c2ecf20Sopenharmony_ci}; 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ci/* 7138c2ecf20Sopenharmony_ci * Port number block in RPL response. 7148c2ecf20Sopenharmony_ci */ 7158c2ecf20Sopenharmony_cistruct fc_els_pnb { 7168c2ecf20Sopenharmony_ci __be32 pnb_phys_pn; /* physical port number */ 7178c2ecf20Sopenharmony_ci __u8 pnb_resv; /* reserved */ 7188c2ecf20Sopenharmony_ci __u8 pnb_port_id[3]; /* port ID */ 7198c2ecf20Sopenharmony_ci __be64 pnb_wwpn; /* port name */ 7208c2ecf20Sopenharmony_ci}; 7218c2ecf20Sopenharmony_ci 7228c2ecf20Sopenharmony_ci/* 7238c2ecf20Sopenharmony_ci * RPL LS_ACC response. 7248c2ecf20Sopenharmony_ci */ 7258c2ecf20Sopenharmony_cistruct fc_els_rpl_resp { 7268c2ecf20Sopenharmony_ci __u8 rpl_cmd; /* ELS_LS_ACC */ 7278c2ecf20Sopenharmony_ci __u8 rpl_resv1; /* reserved - must be zero */ 7288c2ecf20Sopenharmony_ci __be16 rpl_plen; /* payload length */ 7298c2ecf20Sopenharmony_ci __u8 rpl_resv2; /* reserved - must be zero */ 7308c2ecf20Sopenharmony_ci __u8 rpl_llen[3]; /* list length */ 7318c2ecf20Sopenharmony_ci __u8 rpl_resv3; /* reserved - must be zero */ 7328c2ecf20Sopenharmony_ci __u8 rpl_index[3]; /* starting index */ 7338c2ecf20Sopenharmony_ci struct fc_els_pnb rpl_pnb[1]; /* variable number of PNBs */ 7348c2ecf20Sopenharmony_ci}; 7358c2ecf20Sopenharmony_ci 7368c2ecf20Sopenharmony_ci/* 7378c2ecf20Sopenharmony_ci * Link Error Status Block. 7388c2ecf20Sopenharmony_ci */ 7398c2ecf20Sopenharmony_cistruct fc_els_lesb { 7408c2ecf20Sopenharmony_ci __be32 lesb_link_fail; /* link failure count */ 7418c2ecf20Sopenharmony_ci __be32 lesb_sync_loss; /* loss of synchronization count */ 7428c2ecf20Sopenharmony_ci __be32 lesb_sig_loss; /* loss of signal count */ 7438c2ecf20Sopenharmony_ci __be32 lesb_prim_err; /* primitive sequence error count */ 7448c2ecf20Sopenharmony_ci __be32 lesb_inv_word; /* invalid transmission word count */ 7458c2ecf20Sopenharmony_ci __be32 lesb_inv_crc; /* invalid CRC count */ 7468c2ecf20Sopenharmony_ci}; 7478c2ecf20Sopenharmony_ci 7488c2ecf20Sopenharmony_ci/* 7498c2ecf20Sopenharmony_ci * ELS RPS - Read Port Status Block request. 7508c2ecf20Sopenharmony_ci */ 7518c2ecf20Sopenharmony_cistruct fc_els_rps { 7528c2ecf20Sopenharmony_ci __u8 rps_cmd; /* command */ 7538c2ecf20Sopenharmony_ci __u8 rps_resv[2]; /* reserved - must be zero */ 7548c2ecf20Sopenharmony_ci __u8 rps_flag; /* flag - see below */ 7558c2ecf20Sopenharmony_ci __be64 rps_port_spec; /* port selection */ 7568c2ecf20Sopenharmony_ci}; 7578c2ecf20Sopenharmony_ci 7588c2ecf20Sopenharmony_cienum fc_els_rps_flag { 7598c2ecf20Sopenharmony_ci FC_ELS_RPS_DID = 0x00, /* port identified by D_ID of req. */ 7608c2ecf20Sopenharmony_ci FC_ELS_RPS_PPN = 0x01, /* port_spec is physical port number */ 7618c2ecf20Sopenharmony_ci FC_ELS_RPS_WWPN = 0x02, /* port_spec is port WWN */ 7628c2ecf20Sopenharmony_ci}; 7638c2ecf20Sopenharmony_ci 7648c2ecf20Sopenharmony_ci/* 7658c2ecf20Sopenharmony_ci * ELS RPS LS_ACC response. 7668c2ecf20Sopenharmony_ci */ 7678c2ecf20Sopenharmony_cistruct fc_els_rps_resp { 7688c2ecf20Sopenharmony_ci __u8 rps_cmd; /* command - LS_ACC */ 7698c2ecf20Sopenharmony_ci __u8 rps_resv[2]; /* reserved - must be zero */ 7708c2ecf20Sopenharmony_ci __u8 rps_flag; /* flag - see below */ 7718c2ecf20Sopenharmony_ci __u8 rps_resv2[2]; /* reserved */ 7728c2ecf20Sopenharmony_ci __be16 rps_status; /* port status - see below */ 7738c2ecf20Sopenharmony_ci struct fc_els_lesb rps_lesb; /* link error status block */ 7748c2ecf20Sopenharmony_ci}; 7758c2ecf20Sopenharmony_ci 7768c2ecf20Sopenharmony_cienum fc_els_rps_resp_flag { 7778c2ecf20Sopenharmony_ci FC_ELS_RPS_LPEV = 0x01, /* L_port extension valid */ 7788c2ecf20Sopenharmony_ci}; 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_cienum fc_els_rps_resp_status { 7818c2ecf20Sopenharmony_ci FC_ELS_RPS_PTP = 1 << 5, /* point-to-point connection */ 7828c2ecf20Sopenharmony_ci FC_ELS_RPS_LOOP = 1 << 4, /* loop mode */ 7838c2ecf20Sopenharmony_ci FC_ELS_RPS_FAB = 1 << 3, /* fabric present */ 7848c2ecf20Sopenharmony_ci FC_ELS_RPS_NO_SIG = 1 << 2, /* loss of signal */ 7858c2ecf20Sopenharmony_ci FC_ELS_RPS_NO_SYNC = 1 << 1, /* loss of synchronization */ 7868c2ecf20Sopenharmony_ci FC_ELS_RPS_RESET = 1 << 0, /* in link reset protocol */ 7878c2ecf20Sopenharmony_ci}; 7888c2ecf20Sopenharmony_ci 7898c2ecf20Sopenharmony_ci/* 7908c2ecf20Sopenharmony_ci * ELS LIRR - Link Incident Record Registration request. 7918c2ecf20Sopenharmony_ci */ 7928c2ecf20Sopenharmony_cistruct fc_els_lirr { 7938c2ecf20Sopenharmony_ci __u8 lirr_cmd; /* command */ 7948c2ecf20Sopenharmony_ci __u8 lirr_resv[3]; /* reserved - must be zero */ 7958c2ecf20Sopenharmony_ci __u8 lirr_func; /* registration function */ 7968c2ecf20Sopenharmony_ci __u8 lirr_fmt; /* FC-4 type of RLIR requested */ 7978c2ecf20Sopenharmony_ci __u8 lirr_resv2[2]; /* reserved - must be zero */ 7988c2ecf20Sopenharmony_ci}; 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_cienum fc_els_lirr_func { 8018c2ecf20Sopenharmony_ci ELS_LIRR_SET_COND = 0x01, /* set - conditionally receive */ 8028c2ecf20Sopenharmony_ci ELS_LIRR_SET_UNCOND = 0x02, /* set - unconditionally receive */ 8038c2ecf20Sopenharmony_ci ELS_LIRR_CLEAR = 0xff /* clear registration */ 8048c2ecf20Sopenharmony_ci}; 8058c2ecf20Sopenharmony_ci 8068c2ecf20Sopenharmony_ci/* 8078c2ecf20Sopenharmony_ci * ELS SRL - Scan Remote Loop request. 8088c2ecf20Sopenharmony_ci */ 8098c2ecf20Sopenharmony_cistruct fc_els_srl { 8108c2ecf20Sopenharmony_ci __u8 srl_cmd; /* command */ 8118c2ecf20Sopenharmony_ci __u8 srl_resv[3]; /* reserved - must be zero */ 8128c2ecf20Sopenharmony_ci __u8 srl_flag; /* flag - see below */ 8138c2ecf20Sopenharmony_ci __u8 srl_flag_param[3]; /* flag parameter */ 8148c2ecf20Sopenharmony_ci}; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_cienum fc_els_srl_flag { 8178c2ecf20Sopenharmony_ci FC_ELS_SRL_ALL = 0x00, /* scan all FL ports */ 8188c2ecf20Sopenharmony_ci FC_ELS_SRL_ONE = 0x01, /* scan specified loop */ 8198c2ecf20Sopenharmony_ci FC_ELS_SRL_EN_PER = 0x02, /* enable periodic scanning (param) */ 8208c2ecf20Sopenharmony_ci FC_ELS_SRL_DIS_PER = 0x03, /* disable periodic scanning */ 8218c2ecf20Sopenharmony_ci}; 8228c2ecf20Sopenharmony_ci 8238c2ecf20Sopenharmony_ci/* 8248c2ecf20Sopenharmony_ci * ELS RLS - Read Link Error Status Block request. 8258c2ecf20Sopenharmony_ci */ 8268c2ecf20Sopenharmony_cistruct fc_els_rls { 8278c2ecf20Sopenharmony_ci __u8 rls_cmd; /* command */ 8288c2ecf20Sopenharmony_ci __u8 rls_resv[4]; /* reserved - must be zero */ 8298c2ecf20Sopenharmony_ci __u8 rls_port_id[3]; /* port ID */ 8308c2ecf20Sopenharmony_ci}; 8318c2ecf20Sopenharmony_ci 8328c2ecf20Sopenharmony_ci/* 8338c2ecf20Sopenharmony_ci * ELS RLS LS_ACC Response. 8348c2ecf20Sopenharmony_ci */ 8358c2ecf20Sopenharmony_cistruct fc_els_rls_resp { 8368c2ecf20Sopenharmony_ci __u8 rls_cmd; /* ELS_LS_ACC */ 8378c2ecf20Sopenharmony_ci __u8 rls_resv[3]; /* reserved - must be zero */ 8388c2ecf20Sopenharmony_ci struct fc_els_lesb rls_lesb; /* link error status block */ 8398c2ecf20Sopenharmony_ci}; 8408c2ecf20Sopenharmony_ci 8418c2ecf20Sopenharmony_ci/* 8428c2ecf20Sopenharmony_ci * ELS RLIR - Registered Link Incident Report. 8438c2ecf20Sopenharmony_ci * This is followed by the CLIR and the CLID, described below. 8448c2ecf20Sopenharmony_ci */ 8458c2ecf20Sopenharmony_cistruct fc_els_rlir { 8468c2ecf20Sopenharmony_ci __u8 rlir_cmd; /* command */ 8478c2ecf20Sopenharmony_ci __u8 rlir_resv[3]; /* reserved - must be zero */ 8488c2ecf20Sopenharmony_ci __u8 rlir_fmt; /* format (FC4-type if type specific) */ 8498c2ecf20Sopenharmony_ci __u8 rlir_clr_len; /* common link incident record length */ 8508c2ecf20Sopenharmony_ci __u8 rlir_cld_len; /* common link incident desc. length */ 8518c2ecf20Sopenharmony_ci __u8 rlir_slr_len; /* spec. link incident record length */ 8528c2ecf20Sopenharmony_ci}; 8538c2ecf20Sopenharmony_ci 8548c2ecf20Sopenharmony_ci/* 8558c2ecf20Sopenharmony_ci * CLIR - Common Link Incident Record Data. - Sent via RLIR. 8568c2ecf20Sopenharmony_ci */ 8578c2ecf20Sopenharmony_cistruct fc_els_clir { 8588c2ecf20Sopenharmony_ci __be64 clir_wwpn; /* incident port name */ 8598c2ecf20Sopenharmony_ci __be64 clir_wwnn; /* incident port node name */ 8608c2ecf20Sopenharmony_ci __u8 clir_port_type; /* incident port type */ 8618c2ecf20Sopenharmony_ci __u8 clir_port_id[3]; /* incident port ID */ 8628c2ecf20Sopenharmony_ci 8638c2ecf20Sopenharmony_ci __be64 clir_conn_wwpn; /* connected port name */ 8648c2ecf20Sopenharmony_ci __be64 clir_conn_wwnn; /* connected node name */ 8658c2ecf20Sopenharmony_ci __be64 clir_fab_name; /* fabric name */ 8668c2ecf20Sopenharmony_ci __be32 clir_phys_port; /* physical port number */ 8678c2ecf20Sopenharmony_ci __be32 clir_trans_id; /* transaction ID */ 8688c2ecf20Sopenharmony_ci __u8 clir_resv[3]; /* reserved */ 8698c2ecf20Sopenharmony_ci __u8 clir_ts_fmt; /* time stamp format */ 8708c2ecf20Sopenharmony_ci __be64 clir_timestamp; /* time stamp */ 8718c2ecf20Sopenharmony_ci}; 8728c2ecf20Sopenharmony_ci 8738c2ecf20Sopenharmony_ci/* 8748c2ecf20Sopenharmony_ci * CLIR clir_ts_fmt - time stamp format values. 8758c2ecf20Sopenharmony_ci */ 8768c2ecf20Sopenharmony_cienum fc_els_clir_ts_fmt { 8778c2ecf20Sopenharmony_ci ELS_CLIR_TS_UNKNOWN = 0, /* time stamp field unknown */ 8788c2ecf20Sopenharmony_ci ELS_CLIR_TS_SEC_FRAC = 1, /* time in seconds and fractions */ 8798c2ecf20Sopenharmony_ci ELS_CLIR_TS_CSU = 2, /* time in clock synch update format */ 8808c2ecf20Sopenharmony_ci}; 8818c2ecf20Sopenharmony_ci 8828c2ecf20Sopenharmony_ci/* 8838c2ecf20Sopenharmony_ci * Common Link Incident Descriptor - sent via RLIR. 8848c2ecf20Sopenharmony_ci */ 8858c2ecf20Sopenharmony_cistruct fc_els_clid { 8868c2ecf20Sopenharmony_ci __u8 clid_iq; /* incident qualifier flags */ 8878c2ecf20Sopenharmony_ci __u8 clid_ic; /* incident code */ 8888c2ecf20Sopenharmony_ci __be16 clid_epai; /* domain/area of ISL */ 8898c2ecf20Sopenharmony_ci}; 8908c2ecf20Sopenharmony_ci 8918c2ecf20Sopenharmony_ci/* 8928c2ecf20Sopenharmony_ci * CLID incident qualifier flags. 8938c2ecf20Sopenharmony_ci */ 8948c2ecf20Sopenharmony_cienum fc_els_clid_iq { 8958c2ecf20Sopenharmony_ci ELS_CLID_SWITCH = 0x20, /* incident port is a switch node */ 8968c2ecf20Sopenharmony_ci ELS_CLID_E_PORT = 0x10, /* incident is an ISL (E) port */ 8978c2ecf20Sopenharmony_ci ELS_CLID_SEV_MASK = 0x0c, /* severity 2-bit field mask */ 8988c2ecf20Sopenharmony_ci ELS_CLID_SEV_INFO = 0x00, /* report is informational */ 8998c2ecf20Sopenharmony_ci ELS_CLID_SEV_INOP = 0x08, /* link not operational */ 9008c2ecf20Sopenharmony_ci ELS_CLID_SEV_DEG = 0x04, /* link degraded but operational */ 9018c2ecf20Sopenharmony_ci ELS_CLID_LASER = 0x02, /* subassembly is a laser */ 9028c2ecf20Sopenharmony_ci ELS_CLID_FRU = 0x01, /* format can identify a FRU */ 9038c2ecf20Sopenharmony_ci}; 9048c2ecf20Sopenharmony_ci 9058c2ecf20Sopenharmony_ci/* 9068c2ecf20Sopenharmony_ci * CLID incident code. 9078c2ecf20Sopenharmony_ci */ 9088c2ecf20Sopenharmony_cienum fc_els_clid_ic { 9098c2ecf20Sopenharmony_ci ELS_CLID_IC_IMPL = 1, /* implicit incident */ 9108c2ecf20Sopenharmony_ci ELS_CLID_IC_BER = 2, /* bit-error-rate threshold exceeded */ 9118c2ecf20Sopenharmony_ci ELS_CLID_IC_LOS = 3, /* loss of synch or signal */ 9128c2ecf20Sopenharmony_ci ELS_CLID_IC_NOS = 4, /* non-operational primitive sequence */ 9138c2ecf20Sopenharmony_ci ELS_CLID_IC_PST = 5, /* primitive sequence timeout */ 9148c2ecf20Sopenharmony_ci ELS_CLID_IC_INVAL = 6, /* invalid primitive sequence */ 9158c2ecf20Sopenharmony_ci ELS_CLID_IC_LOOP_TO = 7, /* loop initialization time out */ 9168c2ecf20Sopenharmony_ci ELS_CLID_IC_LIP = 8, /* receiving LIP */ 9178c2ecf20Sopenharmony_ci}; 9188c2ecf20Sopenharmony_ci 9198c2ecf20Sopenharmony_ci 9208c2ecf20Sopenharmony_cienum fc_fpin_li_event_types { 9218c2ecf20Sopenharmony_ci FPIN_LI_UNKNOWN = 0x0, 9228c2ecf20Sopenharmony_ci FPIN_LI_LINK_FAILURE = 0x1, 9238c2ecf20Sopenharmony_ci FPIN_LI_LOSS_OF_SYNC = 0x2, 9248c2ecf20Sopenharmony_ci FPIN_LI_LOSS_OF_SIG = 0x3, 9258c2ecf20Sopenharmony_ci FPIN_LI_PRIM_SEQ_ERR = 0x4, 9268c2ecf20Sopenharmony_ci FPIN_LI_INVALID_TX_WD = 0x5, 9278c2ecf20Sopenharmony_ci FPIN_LI_INVALID_CRC = 0x6, 9288c2ecf20Sopenharmony_ci FPIN_LI_DEVICE_SPEC = 0xF, 9298c2ecf20Sopenharmony_ci}; 9308c2ecf20Sopenharmony_ci 9318c2ecf20Sopenharmony_ci/* 9328c2ecf20Sopenharmony_ci * Initializer useful for decoding table. 9338c2ecf20Sopenharmony_ci * Please keep this in sync with the above definitions. 9348c2ecf20Sopenharmony_ci */ 9358c2ecf20Sopenharmony_ci#define FC_FPIN_LI_EVT_TYPES_INIT { \ 9368c2ecf20Sopenharmony_ci { FPIN_LI_UNKNOWN, "Unknown" }, \ 9378c2ecf20Sopenharmony_ci { FPIN_LI_LINK_FAILURE, "Link Failure" }, \ 9388c2ecf20Sopenharmony_ci { FPIN_LI_LOSS_OF_SYNC, "Loss of Synchronization" }, \ 9398c2ecf20Sopenharmony_ci { FPIN_LI_LOSS_OF_SIG, "Loss of Signal" }, \ 9408c2ecf20Sopenharmony_ci { FPIN_LI_PRIM_SEQ_ERR, "Primitive Sequence Protocol Error" }, \ 9418c2ecf20Sopenharmony_ci { FPIN_LI_INVALID_TX_WD, "Invalid Transmission Word" }, \ 9428c2ecf20Sopenharmony_ci { FPIN_LI_INVALID_CRC, "Invalid CRC" }, \ 9438c2ecf20Sopenharmony_ci { FPIN_LI_DEVICE_SPEC, "Device Specific" }, \ 9448c2ecf20Sopenharmony_ci} 9458c2ecf20Sopenharmony_ci 9468c2ecf20Sopenharmony_ci 9478c2ecf20Sopenharmony_ci/* 9488c2ecf20Sopenharmony_ci * Link Integrity Notification Descriptor 9498c2ecf20Sopenharmony_ci */ 9508c2ecf20Sopenharmony_cistruct fc_fn_li_desc { 9518c2ecf20Sopenharmony_ci __be32 desc_tag; /* Descriptor Tag (0x00020001) */ 9528c2ecf20Sopenharmony_ci __be32 desc_len; /* Length of Descriptor (in bytes). 9538c2ecf20Sopenharmony_ci * Size of descriptor excluding 9548c2ecf20Sopenharmony_ci * desc_tag and desc_len fields. 9558c2ecf20Sopenharmony_ci */ 9568c2ecf20Sopenharmony_ci __be64 detecting_wwpn; /* Port Name that detected event */ 9578c2ecf20Sopenharmony_ci __be64 attached_wwpn; /* Port Name of device attached to 9588c2ecf20Sopenharmony_ci * detecting Port Name 9598c2ecf20Sopenharmony_ci */ 9608c2ecf20Sopenharmony_ci __be16 event_type; /* see enum fc_fpin_li_event_types */ 9618c2ecf20Sopenharmony_ci __be16 event_modifier; /* Implementation specific value 9628c2ecf20Sopenharmony_ci * describing the event type 9638c2ecf20Sopenharmony_ci */ 9648c2ecf20Sopenharmony_ci __be32 event_threshold;/* duration in ms of the link 9658c2ecf20Sopenharmony_ci * integrity detection cycle 9668c2ecf20Sopenharmony_ci */ 9678c2ecf20Sopenharmony_ci __be32 event_count; /* minimum number of event 9688c2ecf20Sopenharmony_ci * occurrences during the event 9698c2ecf20Sopenharmony_ci * threshold to caause the LI event 9708c2ecf20Sopenharmony_ci */ 9718c2ecf20Sopenharmony_ci __be32 pname_count; /* number of portname_list elements */ 9728c2ecf20Sopenharmony_ci __be64 pname_list[0]; /* list of N_Port_Names accessible 9738c2ecf20Sopenharmony_ci * through the attached port 9748c2ecf20Sopenharmony_ci */ 9758c2ecf20Sopenharmony_ci}; 9768c2ecf20Sopenharmony_ci 9778c2ecf20Sopenharmony_ci/* 9788c2ecf20Sopenharmony_ci * ELS_FPIN - Fabric Performance Impact Notification 9798c2ecf20Sopenharmony_ci */ 9808c2ecf20Sopenharmony_cistruct fc_els_fpin { 9818c2ecf20Sopenharmony_ci __u8 fpin_cmd; /* command (0x16) */ 9828c2ecf20Sopenharmony_ci __u8 fpin_zero[3]; /* specified as zero - part of cmd */ 9838c2ecf20Sopenharmony_ci __be32 desc_len; /* Length of Descriptor List (in bytes). 9848c2ecf20Sopenharmony_ci * Size of ELS excluding fpin_cmd, 9858c2ecf20Sopenharmony_ci * fpin_zero and desc_len fields. 9868c2ecf20Sopenharmony_ci */ 9878c2ecf20Sopenharmony_ci struct fc_tlv_desc fpin_desc[0]; /* Descriptor list */ 9888c2ecf20Sopenharmony_ci}; 9898c2ecf20Sopenharmony_ci 9908c2ecf20Sopenharmony_ci/* Diagnostic Function Descriptor - FPIN Registration */ 9918c2ecf20Sopenharmony_cistruct fc_df_desc_fpin_reg { 9928c2ecf20Sopenharmony_ci __be32 desc_tag; /* FPIN Registration (0x00030001) */ 9938c2ecf20Sopenharmony_ci __be32 desc_len; /* Length of Descriptor (in bytes). 9948c2ecf20Sopenharmony_ci * Size of descriptor excluding 9958c2ecf20Sopenharmony_ci * desc_tag and desc_len fields. 9968c2ecf20Sopenharmony_ci */ 9978c2ecf20Sopenharmony_ci __be32 count; /* Number of desc_tags elements */ 9988c2ecf20Sopenharmony_ci __be32 desc_tags[0]; /* Array of Descriptor Tags. 9998c2ecf20Sopenharmony_ci * Each tag indicates a function 10008c2ecf20Sopenharmony_ci * supported by the N_Port (request) 10018c2ecf20Sopenharmony_ci * or by the N_Port and Fabric 10028c2ecf20Sopenharmony_ci * Controller (reply; may be a subset 10038c2ecf20Sopenharmony_ci * of the request). 10048c2ecf20Sopenharmony_ci * See ELS_FN_DTAG_xxx for tag values. 10058c2ecf20Sopenharmony_ci */ 10068c2ecf20Sopenharmony_ci}; 10078c2ecf20Sopenharmony_ci 10088c2ecf20Sopenharmony_ci/* 10098c2ecf20Sopenharmony_ci * ELS_RDF - Register Diagnostic Functions 10108c2ecf20Sopenharmony_ci */ 10118c2ecf20Sopenharmony_cistruct fc_els_rdf { 10128c2ecf20Sopenharmony_ci __u8 fpin_cmd; /* command (0x19) */ 10138c2ecf20Sopenharmony_ci __u8 fpin_zero[3]; /* specified as zero - part of cmd */ 10148c2ecf20Sopenharmony_ci __be32 desc_len; /* Length of Descriptor List (in bytes). 10158c2ecf20Sopenharmony_ci * Size of ELS excluding fpin_cmd, 10168c2ecf20Sopenharmony_ci * fpin_zero and desc_len fields. 10178c2ecf20Sopenharmony_ci */ 10188c2ecf20Sopenharmony_ci struct fc_tlv_desc desc[0]; /* Descriptor list */ 10198c2ecf20Sopenharmony_ci}; 10208c2ecf20Sopenharmony_ci 10218c2ecf20Sopenharmony_ci/* 10228c2ecf20Sopenharmony_ci * ELS RDF LS_ACC Response. 10238c2ecf20Sopenharmony_ci */ 10248c2ecf20Sopenharmony_cistruct fc_els_rdf_resp { 10258c2ecf20Sopenharmony_ci struct fc_els_ls_acc acc_hdr; 10268c2ecf20Sopenharmony_ci __be32 desc_list_len; /* Length of response (in 10278c2ecf20Sopenharmony_ci * bytes). Excludes acc_hdr 10288c2ecf20Sopenharmony_ci * and desc_list_len fields. 10298c2ecf20Sopenharmony_ci */ 10308c2ecf20Sopenharmony_ci struct fc_els_lsri_desc lsri; 10318c2ecf20Sopenharmony_ci struct fc_tlv_desc desc[0]; /* Supported Descriptor list */ 10328c2ecf20Sopenharmony_ci}; 10338c2ecf20Sopenharmony_ci 10348c2ecf20Sopenharmony_ci 10358c2ecf20Sopenharmony_ci#endif /* _FC_ELS_H_ */ 1036