.. | .. |
---|
2 | 2 | /* |
---|
3 | 3 | * Copyright(c) 2007 Intel Corporation. All rights reserved. |
---|
4 | 4 | * |
---|
5 | | - * This program is free software; you can redistribute it and/or modify it |
---|
6 | | - * under the terms and conditions of the GNU General Public License, |
---|
7 | | - * version 2, as published by the Free Software Foundation. |
---|
8 | | - * |
---|
9 | | - * This program is distributed in the hope it will be useful, but WITHOUT |
---|
10 | | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
---|
11 | | - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
---|
12 | | - * more details. |
---|
13 | | - * |
---|
14 | | - * You should have received a copy of the GNU General Public License along with |
---|
15 | | - * this program; if not, write to the Free Software Foundation, Inc., |
---|
16 | | - * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. |
---|
17 | | - * |
---|
18 | 5 | * Maintained at www.Open-FCoE.org |
---|
19 | 6 | */ |
---|
20 | 7 | |
---|
.. | .. |
---|
22 | 9 | #define _FC_ELS_H_ |
---|
23 | 10 | |
---|
24 | 11 | #include <linux/types.h> |
---|
| 12 | +#include <asm/byteorder.h> |
---|
25 | 13 | |
---|
26 | 14 | /* |
---|
27 | 15 | * Fibre Channel Switch - Enhanced Link Services definitions. |
---|
.. | .. |
---|
52 | 40 | ELS_RRQ = 0x12, /* reinstate recovery qualifier */ |
---|
53 | 41 | ELS_REC = 0x13, /* read exchange concise */ |
---|
54 | 42 | ELS_SRR = 0x14, /* sequence retransmission request */ |
---|
| 43 | + ELS_FPIN = 0x16, /* Fabric Performance Impact Notification */ |
---|
| 44 | + ELS_RDP = 0x18, /* Read Diagnostic Parameters */ |
---|
| 45 | + ELS_RDF = 0x19, /* Register Diagnostic Functions */ |
---|
55 | 46 | ELS_PRLI = 0x20, /* process login */ |
---|
56 | 47 | ELS_PRLO = 0x21, /* process logout */ |
---|
57 | 48 | ELS_SCN = 0x22, /* state change notification */ |
---|
.. | .. |
---|
119 | 110 | [ELS_RRQ] = "RRQ", \ |
---|
120 | 111 | [ELS_REC] = "REC", \ |
---|
121 | 112 | [ELS_SRR] = "SRR", \ |
---|
| 113 | + [ELS_FPIN] = "FPIN", \ |
---|
| 114 | + [ELS_RDP] = "RDP", \ |
---|
| 115 | + [ELS_RDF] = "RDF", \ |
---|
122 | 116 | [ELS_PRLI] = "PRLI", \ |
---|
123 | 117 | [ELS_PRLO] = "PRLO", \ |
---|
124 | 118 | [ELS_SCN] = "SCN", \ |
---|
.. | .. |
---|
217 | 211 | ELS_EXPL_NOT_NEIGHBOR = 0x62, /* VN2VN_Port not in neighbor set */ |
---|
218 | 212 | /* TBD - above definitions incomplete */ |
---|
219 | 213 | }; |
---|
| 214 | + |
---|
| 215 | +/* |
---|
| 216 | + * Link Service TLV Descriptor Tag Values |
---|
| 217 | + */ |
---|
| 218 | +enum fc_ls_tlv_dtag { |
---|
| 219 | + ELS_DTAG_LS_REQ_INFO = 0x00000001, |
---|
| 220 | + /* Link Service Request Information Descriptor */ |
---|
| 221 | + ELS_DTAG_LNK_INTEGRITY = 0x00020001, |
---|
| 222 | + /* Link Integrity Notification Descriptor */ |
---|
| 223 | + ELS_DTAG_DELIVERY = 0x00020002, |
---|
| 224 | + /* Delivery Notification Descriptor */ |
---|
| 225 | + ELS_DTAG_PEER_CONGEST = 0x00020003, |
---|
| 226 | + /* Peer Congestion Notification Descriptor */ |
---|
| 227 | + ELS_DTAG_CONGESTION = 0x00020004, |
---|
| 228 | + /* Congestion Notification Descriptor */ |
---|
| 229 | + ELS_DTAG_FPIN_REGISTER = 0x00030001, |
---|
| 230 | + /* FPIN Registration Descriptor */ |
---|
| 231 | +}; |
---|
| 232 | + |
---|
| 233 | +/* |
---|
| 234 | + * Initializer useful for decoding table. |
---|
| 235 | + * Please keep this in sync with the above definitions. |
---|
| 236 | + */ |
---|
| 237 | +#define FC_LS_TLV_DTAG_INIT { \ |
---|
| 238 | + { ELS_DTAG_LS_REQ_INFO, "Link Service Request Information" }, \ |
---|
| 239 | + { ELS_DTAG_LNK_INTEGRITY, "Link Integrity Notification" }, \ |
---|
| 240 | + { ELS_DTAG_DELIVERY, "Delivery Notification Present" }, \ |
---|
| 241 | + { ELS_DTAG_PEER_CONGEST, "Peer Congestion Notification" }, \ |
---|
| 242 | + { ELS_DTAG_CONGESTION, "Congestion Notification" }, \ |
---|
| 243 | + { ELS_DTAG_FPIN_REGISTER, "FPIN Registration" }, \ |
---|
| 244 | +} |
---|
| 245 | + |
---|
| 246 | + |
---|
| 247 | +/* |
---|
| 248 | + * Generic Link Service TLV Descriptor format |
---|
| 249 | + * |
---|
| 250 | + * This structure, as it defines no payload, will also be referred to |
---|
| 251 | + * as the "tlv header" - which contains the tag and len fields. |
---|
| 252 | + */ |
---|
| 253 | +struct fc_tlv_desc { |
---|
| 254 | + __be32 desc_tag; /* Notification Descriptor Tag */ |
---|
| 255 | + __be32 desc_len; /* Length of Descriptor (in bytes). |
---|
| 256 | + * Size of descriptor excluding |
---|
| 257 | + * desc_tag and desc_len fields. |
---|
| 258 | + */ |
---|
| 259 | + __u8 desc_value[0]; /* Descriptor Value */ |
---|
| 260 | +}; |
---|
| 261 | + |
---|
| 262 | +/* Descriptor tag and len fields are considered the mandatory header |
---|
| 263 | + * for a descriptor |
---|
| 264 | + */ |
---|
| 265 | +#define FC_TLV_DESC_HDR_SZ sizeof(struct fc_tlv_desc) |
---|
| 266 | + |
---|
| 267 | +/* |
---|
| 268 | + * Macro, used when initializing payloads, to return the descriptor length. |
---|
| 269 | + * Length is size of descriptor minus the tag and len fields. |
---|
| 270 | + */ |
---|
| 271 | +#define FC_TLV_DESC_LENGTH_FROM_SZ(desc) \ |
---|
| 272 | + (sizeof(desc) - FC_TLV_DESC_HDR_SZ) |
---|
| 273 | + |
---|
| 274 | +/* Macro, used on received payloads, to return the descriptor length */ |
---|
| 275 | +#define FC_TLV_DESC_SZ_FROM_LENGTH(tlv) \ |
---|
| 276 | + (__be32_to_cpu((tlv)->desc_len) + FC_TLV_DESC_HDR_SZ) |
---|
| 277 | + |
---|
| 278 | +/* |
---|
| 279 | + * This helper is used to walk descriptors in a descriptor list. |
---|
| 280 | + * Given the address of the current descriptor, which minimally contains a |
---|
| 281 | + * tag and len field, calculate the address of the next descriptor based |
---|
| 282 | + * on the len field. |
---|
| 283 | + */ |
---|
| 284 | +static inline void *fc_tlv_next_desc(void *desc) |
---|
| 285 | +{ |
---|
| 286 | + struct fc_tlv_desc *tlv = desc; |
---|
| 287 | + |
---|
| 288 | + return (desc + FC_TLV_DESC_SZ_FROM_LENGTH(tlv)); |
---|
| 289 | +} |
---|
| 290 | + |
---|
| 291 | + |
---|
| 292 | +/* |
---|
| 293 | + * Link Service Request Information Descriptor |
---|
| 294 | + */ |
---|
| 295 | +struct fc_els_lsri_desc { |
---|
| 296 | + __be32 desc_tag; /* descriptor tag (0x0000 0001) */ |
---|
| 297 | + __be32 desc_len; /* Length of Descriptor (in bytes) (4). |
---|
| 298 | + * Size of descriptor excluding |
---|
| 299 | + * desc_tag and desc_len fields. |
---|
| 300 | + */ |
---|
| 301 | + struct { |
---|
| 302 | + __u8 cmd; /* ELS cmd byte */ |
---|
| 303 | + __u8 bytes[3]; /* bytes 1..3 */ |
---|
| 304 | + } rqst_w0; /* Request word 0 */ |
---|
| 305 | +}; |
---|
| 306 | + |
---|
220 | 307 | |
---|
221 | 308 | /* |
---|
222 | 309 | * Common service parameters (N ports). |
---|
.. | .. |
---|
829 | 916 | ELS_CLID_IC_LIP = 8, /* receiving LIP */ |
---|
830 | 917 | }; |
---|
831 | 918 | |
---|
| 919 | + |
---|
| 920 | +enum fc_fpin_li_event_types { |
---|
| 921 | + FPIN_LI_UNKNOWN = 0x0, |
---|
| 922 | + FPIN_LI_LINK_FAILURE = 0x1, |
---|
| 923 | + FPIN_LI_LOSS_OF_SYNC = 0x2, |
---|
| 924 | + FPIN_LI_LOSS_OF_SIG = 0x3, |
---|
| 925 | + FPIN_LI_PRIM_SEQ_ERR = 0x4, |
---|
| 926 | + FPIN_LI_INVALID_TX_WD = 0x5, |
---|
| 927 | + FPIN_LI_INVALID_CRC = 0x6, |
---|
| 928 | + FPIN_LI_DEVICE_SPEC = 0xF, |
---|
| 929 | +}; |
---|
| 930 | + |
---|
| 931 | +/* |
---|
| 932 | + * Initializer useful for decoding table. |
---|
| 933 | + * Please keep this in sync with the above definitions. |
---|
| 934 | + */ |
---|
| 935 | +#define FC_FPIN_LI_EVT_TYPES_INIT { \ |
---|
| 936 | + { FPIN_LI_UNKNOWN, "Unknown" }, \ |
---|
| 937 | + { FPIN_LI_LINK_FAILURE, "Link Failure" }, \ |
---|
| 938 | + { FPIN_LI_LOSS_OF_SYNC, "Loss of Synchronization" }, \ |
---|
| 939 | + { FPIN_LI_LOSS_OF_SIG, "Loss of Signal" }, \ |
---|
| 940 | + { FPIN_LI_PRIM_SEQ_ERR, "Primitive Sequence Protocol Error" }, \ |
---|
| 941 | + { FPIN_LI_INVALID_TX_WD, "Invalid Transmission Word" }, \ |
---|
| 942 | + { FPIN_LI_INVALID_CRC, "Invalid CRC" }, \ |
---|
| 943 | + { FPIN_LI_DEVICE_SPEC, "Device Specific" }, \ |
---|
| 944 | +} |
---|
| 945 | + |
---|
| 946 | + |
---|
| 947 | +/* |
---|
| 948 | + * Link Integrity Notification Descriptor |
---|
| 949 | + */ |
---|
| 950 | +struct fc_fn_li_desc { |
---|
| 951 | + __be32 desc_tag; /* Descriptor Tag (0x00020001) */ |
---|
| 952 | + __be32 desc_len; /* Length of Descriptor (in bytes). |
---|
| 953 | + * Size of descriptor excluding |
---|
| 954 | + * desc_tag and desc_len fields. |
---|
| 955 | + */ |
---|
| 956 | + __be64 detecting_wwpn; /* Port Name that detected event */ |
---|
| 957 | + __be64 attached_wwpn; /* Port Name of device attached to |
---|
| 958 | + * detecting Port Name |
---|
| 959 | + */ |
---|
| 960 | + __be16 event_type; /* see enum fc_fpin_li_event_types */ |
---|
| 961 | + __be16 event_modifier; /* Implementation specific value |
---|
| 962 | + * describing the event type |
---|
| 963 | + */ |
---|
| 964 | + __be32 event_threshold;/* duration in ms of the link |
---|
| 965 | + * integrity detection cycle |
---|
| 966 | + */ |
---|
| 967 | + __be32 event_count; /* minimum number of event |
---|
| 968 | + * occurrences during the event |
---|
| 969 | + * threshold to caause the LI event |
---|
| 970 | + */ |
---|
| 971 | + __be32 pname_count; /* number of portname_list elements */ |
---|
| 972 | + __be64 pname_list[0]; /* list of N_Port_Names accessible |
---|
| 973 | + * through the attached port |
---|
| 974 | + */ |
---|
| 975 | +}; |
---|
| 976 | + |
---|
| 977 | +/* |
---|
| 978 | + * ELS_FPIN - Fabric Performance Impact Notification |
---|
| 979 | + */ |
---|
| 980 | +struct fc_els_fpin { |
---|
| 981 | + __u8 fpin_cmd; /* command (0x16) */ |
---|
| 982 | + __u8 fpin_zero[3]; /* specified as zero - part of cmd */ |
---|
| 983 | + __be32 desc_len; /* Length of Descriptor List (in bytes). |
---|
| 984 | + * Size of ELS excluding fpin_cmd, |
---|
| 985 | + * fpin_zero and desc_len fields. |
---|
| 986 | + */ |
---|
| 987 | + struct fc_tlv_desc fpin_desc[0]; /* Descriptor list */ |
---|
| 988 | +}; |
---|
| 989 | + |
---|
| 990 | +/* Diagnostic Function Descriptor - FPIN Registration */ |
---|
| 991 | +struct fc_df_desc_fpin_reg { |
---|
| 992 | + __be32 desc_tag; /* FPIN Registration (0x00030001) */ |
---|
| 993 | + __be32 desc_len; /* Length of Descriptor (in bytes). |
---|
| 994 | + * Size of descriptor excluding |
---|
| 995 | + * desc_tag and desc_len fields. |
---|
| 996 | + */ |
---|
| 997 | + __be32 count; /* Number of desc_tags elements */ |
---|
| 998 | + __be32 desc_tags[0]; /* Array of Descriptor Tags. |
---|
| 999 | + * Each tag indicates a function |
---|
| 1000 | + * supported by the N_Port (request) |
---|
| 1001 | + * or by the N_Port and Fabric |
---|
| 1002 | + * Controller (reply; may be a subset |
---|
| 1003 | + * of the request). |
---|
| 1004 | + * See ELS_FN_DTAG_xxx for tag values. |
---|
| 1005 | + */ |
---|
| 1006 | +}; |
---|
| 1007 | + |
---|
| 1008 | +/* |
---|
| 1009 | + * ELS_RDF - Register Diagnostic Functions |
---|
| 1010 | + */ |
---|
| 1011 | +struct fc_els_rdf { |
---|
| 1012 | + __u8 fpin_cmd; /* command (0x19) */ |
---|
| 1013 | + __u8 fpin_zero[3]; /* specified as zero - part of cmd */ |
---|
| 1014 | + __be32 desc_len; /* Length of Descriptor List (in bytes). |
---|
| 1015 | + * Size of ELS excluding fpin_cmd, |
---|
| 1016 | + * fpin_zero and desc_len fields. |
---|
| 1017 | + */ |
---|
| 1018 | + struct fc_tlv_desc desc[0]; /* Descriptor list */ |
---|
| 1019 | +}; |
---|
| 1020 | + |
---|
| 1021 | +/* |
---|
| 1022 | + * ELS RDF LS_ACC Response. |
---|
| 1023 | + */ |
---|
| 1024 | +struct fc_els_rdf_resp { |
---|
| 1025 | + struct fc_els_ls_acc acc_hdr; |
---|
| 1026 | + __be32 desc_list_len; /* Length of response (in |
---|
| 1027 | + * bytes). Excludes acc_hdr |
---|
| 1028 | + * and desc_list_len fields. |
---|
| 1029 | + */ |
---|
| 1030 | + struct fc_els_lsri_desc lsri; |
---|
| 1031 | + struct fc_tlv_desc desc[0]; /* Supported Descriptor list */ |
---|
| 1032 | +}; |
---|
| 1033 | + |
---|
| 1034 | + |
---|
832 | 1035 | #endif /* _FC_ELS_H_ */ |
---|