Unleashed v1.4
[unleashed.git] / include / sys / fibre-channel / fc_appif.h
blob78aa260ad570e1cf137bc18377c4f9d552f672c7
1 /*
2 * CDDL HEADER START
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.
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.
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]
19 * CDDL HEADER END
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _FC_APPIF_H
27 #define _FC_APPIF_H
29 #include <sys/note.h>
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
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 */
40 * Local port topology definitions
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.
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
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.
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))
62 * fc_remote_port state (map_state) definitions.
64 * Used with the pd_state field in the fc_remote_port_t struct.
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 */
72 * Firmware, FCode revision field lengths
74 #define FC_FCODE_REV_SIZE 25
75 #define FC_FW_REV_SIZE 25
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 */
82 uint32_t ct_reserved1 : 8,
83 ct_options : 8,
84 ct_fcssubtype : 8,
85 ct_fcstype : 8;
87 uint32_t ct_aiusize : 16,
88 ct_cmdrsp : 16;
90 uint32_t ct_vendor : 8,
91 ct_expln : 8,
92 ct_reason : 8,
93 ct_reserved2 : 8;
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 */
103 uint32_t ct_cmdrsp : 16, /* command/response code */
104 ct_aiusize : 16; /* AIU/residual size */
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 */
111 #endif /* _BIT_FIELDS_LTOH */
112 } fc_ct_header_t;
114 /* World Wide Name format */
115 typedef union la_wwn {
116 uchar_t raw_wwn[8];
117 uint32_t i_wwn[2];
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;
127 #else
128 struct {
129 uint32_t naa_id : 4,
130 nport_id : 12,
131 wwn_hi : 16;
132 uint32_t wwn_lo;
134 #endif /* _BIT_FIELDS_LTOH */
135 } la_wwn_t;
138 * Values for naa_id
140 #define NAA_ID_IEEE 1
141 #define NAA_ID_IEEE_EXTENDED 2
143 #ifndef FC_WWN_SIZE
144 #define FC_WWN_SIZE (sizeof (la_wwn_t))
145 #endif /* FC_WWN_SIZE */
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;
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;
168 typedef struct ls_code {
169 #if defined(_BIT_FIELDS_LTOH)
170 uint32_t mbz : 24,
171 ls_code : 8;
173 #else
174 uint32_t ls_code : 8,
175 mbz : 24;
176 #endif /* _BIT_FIELDS_LTOH */
177 } ls_code_t;
180 /* Login Payload. */
181 typedef struct la_els_logi {
182 ls_code_t ls_code;
183 com_svc_t common_service;
185 la_wwn_t nport_ww_name;
186 la_wwn_t node_ww_name;
188 svc_param_t class_1;
189 svc_param_t class_2;
190 svc_param_t class_3;
192 uchar_t reserved[16];
193 uchar_t vendor_version[16];
194 } la_els_logi_t;
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;
207 #if defined(_SYSCALL32)
209 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
210 #pragma pack(4)
211 #endif
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;
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;
236 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
237 #pragma pack()
238 #endif
240 #endif /* _SYSCALL32 */
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;
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;
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;
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;
277 /* RNID get data format flag */
278 #define FCIO_CFLAGS_RNID_GET_GENERAL_TOPOLOGY 0xDF
279 #define FCIO_CFLAGS_RNID_GET_VENDOR_SPECIFIC 0xE0
281 /* RNID maximum data length - common data(16) + specific data(252) */
282 #define FCIO_RNID_MAX_DATA_LEN 268
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;
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
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;
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;
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;
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 */
328 #ifdef __cplusplus
330 #endif
332 #endif /* _FC_APPIF_H */