1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _FC_APPIF_H 27 #define _FC_APPIF_H 28 29 #include <sys/note.h> 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #if !defined(_BIT_FIELDS_LTOH) && !defined(_BIT_FIELDS_HTOL) 36 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 37 #endif /* _BIT_FIELDS_LTOH */ 38 39 /* 40 * Local port topology definitions 41 * 42 * fp/fctl use these a lot with the fp_topology field in the fc_port_t struct, 43 * but use is not limited to fp_topology. These are also understood by ULPs. 44 */ 45 #define FC_TOP_UNKNOWN 0 46 #define FC_TOP_PRIVATE_LOOP 1 47 #define FC_TOP_PUBLIC_LOOP 2 48 #define FC_TOP_FABRIC 3 49 #define FC_TOP_PT_PT 4 50 #define FC_TOP_NO_NS 5 51 52 /* 53 * Macros used with the preceeding topology #defines. 54 * fp/fctl use these a lot with the fp_topology field in the fc_port_t struct, 55 * but use is not limited to fp_topology. These are also understood by ULPs. 56 */ 57 #define FC_TOP_EXTERNAL(t) FC_IS_TOP_SWITCH(t) 58 #define FC_IS_TOP_SWITCH(t) (((t) == FC_TOP_FABRIC) ||\ 59 ((t) == FC_TOP_PUBLIC_LOOP)) 60 61 /* 62 * fc_remote_port state (map_state) definitions. 63 * 64 * Used with the pd_state field in the fc_remote_port_t struct. 65 */ 66 #define PORT_DEVICE_INVALID 0 /* State when created or login failed */ 67 #define PORT_DEVICE_VALID 1 /* Logged out */ 68 #define PORT_DEVICE_LOGGED_IN 2 /* Logged in */ 69 70 71 /* 72 * Firmware, FCode revision field lengths 73 */ 74 #define FC_FCODE_REV_SIZE 25 75 #define FC_FW_REV_SIZE 25 76 77 typedef struct ct_header { 78 #if defined(_BIT_FIELDS_LTOH) 79 uint32_t ct_inid : 24, /* Initial Node ID */ 80 ct_rev : 8; /* Revision */ 81 82 uint32_t ct_reserved1 : 8, 83 ct_options : 8, 84 ct_fcssubtype : 8, 85 ct_fcstype : 8; 86 87 uint32_t ct_aiusize : 16, 88 ct_cmdrsp : 16; 89 90 uint32_t ct_vendor : 8, 91 ct_expln : 8, 92 ct_reason : 8, 93 ct_reserved2 : 8; 94 95 #else 96 uint32_t ct_rev : 8, /* revision */ 97 ct_inid : 24; /* initial node ID */ 98 uint32_t ct_fcstype : 8, /* type of service */ 99 ct_fcssubtype : 8, /* subtype of service */ 100 ct_options : 8, /* options */ 101 ct_reserved1 : 8; /* reserved */ 102 103 uint32_t ct_cmdrsp : 16, /* command/response code */ 104 ct_aiusize : 16; /* AIU/residual size */ 105 106 uint32_t ct_reserved2 : 8, /* reserved */ 107 ct_reason : 8, /* reason code */ 108 ct_expln : 8, /* reason explanation */ 109 ct_vendor : 8; /* vendor unique */ 110 111 #endif /* _BIT_FIELDS_LTOH */ 112 } fc_ct_header_t; 113 114 /* World Wide Name format */ 115 typedef union la_wwn { 116 uchar_t raw_wwn[8]; 117 uint32_t i_wwn[2]; 118 119 #if defined(_BIT_FIELDS_LTOH) 120 struct { 121 uint32_t wwn_hi : 16, 122 nport_id : 12, 123 naa_id : 4; 124 uint32_t wwn_lo; 125 }w; 126 127 #else 128 struct { 129 uint32_t naa_id : 4, 130 nport_id : 12, 131 wwn_hi : 16; 132 uint32_t wwn_lo; 133 }w; 134 #endif /* _BIT_FIELDS_LTOH */ 135 } la_wwn_t; 136 137 /* 138 * Values for naa_id 139 */ 140 #define NAA_ID_IEEE 1 141 #define NAA_ID_IEEE_EXTENDED 2 142 143 #ifndef FC_WWN_SIZE 144 #define FC_WWN_SIZE (sizeof (la_wwn_t)) 145 #endif /* FC_WWN_SIZE */ 146 147 typedef struct service_param { 148 uint16_t class_opt; 149 uint16_t initiator_ctl; 150 uint16_t recipient_ctl; 151 uint16_t rcv_size; 152 uint16_t conc_sequences; 153 uint16_t n_port_e_to_e_credit; 154 uint16_t open_seq_per_xchng; 155 uint16_t rsvd; 156 } svc_param_t; 157 158 typedef struct common_service { 159 uint16_t fcph_version; 160 uint16_t btob_credit; 161 uint16_t cmn_features; 162 uint16_t rx_bufsize; 163 uint16_t conc_sequences; 164 uint16_t relative_offset; 165 uint32_t e_d_tov; 166 } com_svc_t; 167 168 typedef struct ls_code { 169 #if defined(_BIT_FIELDS_LTOH) 170 uint32_t mbz : 24, 171 ls_code : 8; 172 173 #else 174 uint32_t ls_code : 8, 175 mbz : 24; 176 #endif /* _BIT_FIELDS_LTOH */ 177 } ls_code_t; 178 179 180 /* Login Payload. */ 181 typedef struct la_els_logi { 182 ls_code_t ls_code; 183 com_svc_t common_service; 184 185 la_wwn_t nport_ww_name; 186 la_wwn_t node_ww_name; 187 188 svc_param_t class_1; 189 svc_param_t class_2; 190 svc_param_t class_3; 191 192 uchar_t reserved[16]; 193 uchar_t vendor_version[16]; 194 } la_els_logi_t; 195 196 typedef struct fc_ns_cmd { 197 uint32_t ns_flags; /* for future use */ 198 uint16_t ns_cmd; /* NS command type */ 199 uint16_t ns_req_len; 200 caddr_t ns_req_payload; /* No CT header */ 201 uint16_t ns_resp_len; 202 caddr_t ns_resp_payload; /* no CT header */ 203 void *ns_fctl_private; /* Transport private */ 204 fc_ct_header_t ns_resp_hdr; /* for the curious */ 205 } fc_ns_cmd_t; 206 207 #if defined(_SYSCALL32) 208 209 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 210 #pragma pack(4) 211 #endif 212 213 typedef struct la_els_logi32 { 214 ls_code_t ls_code; 215 com_svc_t common_service; 216 la_wwn_t nport_ww_name; 217 la_wwn_t node_ww_name; 218 svc_param_t class_1; 219 svc_param_t class_2; 220 svc_param_t class_3; 221 uchar_t reserved[16]; 222 uchar_t vendor_version[16]; 223 } la_els_logi32_t; 224 225 typedef struct fc_ns_cmd32 { 226 uint32_t ns_flags; /* for future use */ 227 uint16_t ns_cmd; /* NS command type */ 228 uint16_t ns_req_len; 229 caddr_t ns_req_payload; /* No CT header */ 230 uint16_t ns_resp_len; 231 caddr_t ns_resp_payload; /* no CT header */ 232 void *ns_fctl_private; /* Transport private */ 233 fc_ct_header_t ns_resp_hdr; /* for the curious */ 234 } fc_ns_cmd32_t; 235 236 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 237 #pragma pack() 238 #endif 239 240 #endif /* _SYSCALL32 */ 241 242 /* Link Error Parameters in the RLS Accept payload */ 243 typedef struct fc_rls_acc_params { 244 uint32_t rls_link_fail; /* link failure count */ 245 uint32_t rls_sync_loss; /* loss of sync count */ 246 uint32_t rls_sig_loss; /* loss of signal count */ 247 uint32_t rls_prim_seq_err; /* primitive seq error */ 248 uint32_t rls_invalid_word; /* invalid tx word */ 249 uint32_t rls_invalid_crc; /* invalid CRC count */ 250 } fc_rls_acc_t; 251 252 /* RLS Payload. */ 253 typedef struct la_els_rls { 254 ls_code_t ls_code; 255 fc_portid_t rls_portid; /* port identifier */ 256 } la_els_rls_t; 257 258 /* RLS accept payload */ 259 typedef struct la_els_rls_acc { 260 ls_code_t ls_code; 261 fc_rls_acc_t rls_link_params; /* link error status block */ 262 } la_els_rls_acc_t; 263 264 /* Node Id Parameters in the RNID Get/Set Accept/Request payload */ 265 typedef struct fc_rnid_params { 266 uchar_t global_id[16]; /* global name */ 267 uint32_t unit_type; /* unit type */ 268 uint32_t port_id; /* port id */ 269 uint32_t num_attached; /* number of attached nodes */ 270 uint16_t ip_version; /* ip version */ 271 uint16_t udp_port; /* udp port number */ 272 uchar_t ip_addr[16]; /* ip address */ 273 uint16_t specific_id_resv; /* reserved */ 274 uint16_t topo_flags; /* topology discovery flags */ 275 } fc_rnid_t; 276 277 /* RNID get data format flag */ 278 #define FCIO_CFLAGS_RNID_GET_GENERAL_TOPOLOGY 0xDF 279 #define FCIO_CFLAGS_RNID_GET_VENDOR_SPECIFIC 0xE0 280 281 /* RNID maximum data length - common data(16) + specific data(252) */ 282 #define FCIO_RNID_MAX_DATA_LEN 268 283 284 /* RNID Payload. */ 285 typedef struct la_els_rnid { 286 ls_code_t ls_code; 287 uchar_t data_format; /* data format returned */ 288 uchar_t resv[3]; 289 } la_els_rnid_t; 290 291 /* 292 * ELS RNID header 293 * - cmn_len can be 0 or 16 - if it is 0 then specific data starts at 294 * offset 8 else specific data starts at offset 24 in the RNID els response 295 */ 296 typedef struct fc_rnid_hdr { 297 uchar_t data_format; 298 uchar_t cmn_len; 299 uchar_t resv; 300 uchar_t specific_len; 301 }fc_rnid_hdr_t; 302 303 typedef struct la_els_rnid_acc { 304 ls_code_t ls_code; 305 fc_rnid_hdr_t hdr; 306 uchar_t data[FCIO_RNID_MAX_DATA_LEN]; 307 } la_els_rnid_acc_t; 308 309 typedef struct la_npiv_create_entry { 310 la_wwn_t VNodeWWN; 311 la_wwn_t VPortWWN; 312 uint32_t vindex; 313 } la_npiv_create_entry_t; 314 315 #if !defined(__lint) 316 _NOTE(SCHEME_PROTECTS_DATA("unique per request", fc_ns_cmd)) 317 _NOTE(SCHEME_PROTECTS_DATA("unique per request", ct_header)) 318 _NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_logi)) 319 _NOTE(SCHEME_PROTECTS_DATA("unique per request", la_wwn)) 320 _NOTE(SCHEME_PROTECTS_DATA("unique per request", fc_rls_acc_params)) 321 _NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rls)) 322 _NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rls_acc)) 323 _NOTE(SCHEME_PROTECTS_DATA("unique per request", fc_rnid_params)) 324 _NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rnid)) 325 _NOTE(SCHEME_PROTECTS_DATA("unique per request", la_els_rnid_acc)) 326 #endif /* __lint */ 327 328 #ifdef __cplusplus 329 } 330 #endif 331 332 #endif /* _FC_APPIF_H */ 333