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
32extern "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
77typedef 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 */
115typedef 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
147typedef 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
158typedef 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
168typedef 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. */
181typedef 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
196typedef 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
213typedef 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
225typedef 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 */
243typedef 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. */
253typedef 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 */
259typedef 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 */
265typedef 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. */
285typedef 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 */
296typedef 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
303typedef 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
309typedef 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