xref: /illumos-gate/usr/src/uts/common/sys/fc4/fc.h (revision 24da5b34f49324ed742a340010ed5bd3d4e06625)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1995,1997-1998 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #ifndef _SYS_FC4_FC_H
28 #define	_SYS_FC4_FC_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * Fibre Channel Physical and Signaling Interface (FC-PH) definitions.
38  *
39  * NOTE: modifications of this file affect drivers, mpsas models, PLUTO
40  *	firmware, SOC assembly code. Please be communicative.
41  */
42 
43 #define	FC_PH_VERSION	0x06	/* 0x06 means 4.0 ! */
44 #define	MAX_FRAME_SIZE	2112	/* maximum size of frame payload */
45 
46 /*
47  * This is the standard frame header for FC-PH frames.
48  */
49 
50 typedef struct FC2_FRAME_HDR {
51 	uint_t	r_ctl:8,	d_id:24;
52 	uint_t	reserved1:8,	s_id:24;
53 	uint_t	type:8,		f_ctl:24;
54 	uint_t	seq_id:8,	df_ctl:8,	seq_cnt:16;
55 	ushort_t ox_id, rx_id;
56 	uint_t	ro;
57 }aFC2_FRAME_HDR, *FC2_FRAME_HDRptr, fc_frame_header_t;
58 
59 #define	WE_ARE_ORIGINATOR(fh)		(fh->f_ctl & F_CTL_XCHG_CONTEXT)
60 #define	UNSOLICITED_FRAME(fh)		(fh->rx_id == 0xffff)
61 #define	FIRST_SEQUENCE(fh)		(fh->f_ctl & F_CTL_FIRST_SEQ)
62 #define	LAST_FRAME_OF_SEQUENCE(fh)	(fh->f_ctl & F_CTL_END_SEQ)
63 #define	LAST_SEQUENCE_OF_EXCHANGE(fh)	(fh->f_ctl & F_CTL_LAST_SEQ)
64 #define	TRANSFER_INITIATIVE(fh)		(fh->f_ctl & F_CTL_SEQ_INITIATIVE)
65 
66 
67 /* legal values for r_ctl */
68 #define	R_CTL_ROUTING		0xf0 /* mask for routing bits */
69 #define	R_CTL_INFO		0x0f /* mask for information bits */
70 
71 #define	R_CTL_DEVICE_DATA	0x00 /* all I/O related frames */
72 #define	R_CTL_EXTENDED_SVC	0x20 /* extended link services (PLOGI) */
73 #define	R_CTL_FC4_SVC		0x30 /* FC-4 link services (FCP_LOGI) */
74 #define	R_CTL_VIDEO_BUFF	0x40 /* not yet defined */
75 #define	R_CTL_BASIC_SVC		0x80 /* basic link services (NOP) */
76 #define	R_CTL_LINK_CTL		0xc0 /* ACKs, etc. */
77 
78 /* legal values for r_ctl: Device Data */
79 #define	R_CTL_UNCATEGORIZED	0x00
80 #define	R_CTL_SOLICITED_DATA	0x01
81 #define	R_CTL_UNSOL_CONTROL	0x02
82 #define	R_CTL_SOLICITED_CONTROL	0x03
83 #define	R_CTL_UNSOL_DATA	0x04
84 #define	R_CTL_XFER_RDY		0x05
85 #define	R_CTL_COMMAND		0x06
86 #define	R_CTL_STATUS		0x07
87 
88 /* legal values for r_ctl: Basic Link Services, type 0 */
89 #define	R_CTL_LS_NOP		0x80
90 #define	R_CTL_LS_ABTS		0x81
91 #define	R_CTL_LS_RMC		0x82
92 #define	R_CTL_LS_BA_ACC		0x84
93 #define	R_CTL_LS_BA_RJT		0x85
94 
95 /* legal values for r_ctl: Extended Link Services, type 1 */
96 #define	R_CTL_ELS_REQ		0x22
97 #define	R_CTL_ELS_RSP		0x23
98 
99 /* Extended Link Service command codes, type 1 */
100 #define	LS_RJT			0x01000000
101 #define	LS_ACC			0x02000000
102 #define	LS_PLOGI		0x03000000
103 #define	LS_FLOGI		0x04000000
104 #define	LS_LOGO			0x05000000
105 #define	LS_ABTX			0x06000000
106 #define	LS_RCS			0x07000000
107 #define	LS_RES			0x08000000
108 #define	LS_RSS			0x09000000
109 #define	LS_RSI			0x0a000000
110 #define	LS_ESTS			0x0b000000
111 #define	LS_ESTC			0x0c000000
112 #define	LS_ADVC			0x0d000000
113 #define	LS_RTV			0x0e000000
114 #define	LS_RLS			0x0f000000
115 #define	LS_ECHO			0x10000000
116 #define	LS_TEST			0x11000000
117 #define	LS_RRQ			0x12000000
118 #define	LS_IDENT		0x20000000	/* vendor unique */
119 #define	LS_DISPLAY		0x21000000	/* vendor unique */
120 
121 /* legal values for r_ctl: Link Control */
122 #define	R_CTL_ACK_1		0xc0
123 #define	R_CTL_ACK_N		0xc1
124 #define	R_CTL_P_RJT		0xc2
125 #define	R_CTL_F_RJT		0xc3
126 #define	R_CTL_P_BSY		0xc4
127 #define	R_CTL_F_BSY_DF		0xc5
128 #define	R_CTL_F_BSY_LC		0xc6
129 #define	R_CTL_LCR		0xc7
130 
131 /* type field definitions for Link Data frames: */
132 #define	TYPE_BASIC_LS		0x00
133 #define	TYPE_EXTENDED_LS	0x01
134 
135 /* type field definitions for Device Data frames (from FC-PH 4.1): */
136 #define	TYPE_IS8802		0x04
137 #define	TYPE_IS8802_SNAP	0x05
138 #define	TYPE_SCSI_FCP		0x08 /* we use this one */
139 #define	TYPE_SCSI_GPP		0x09
140 #define	TYPE_HIPP_FP		0x0a
141 #define	TYPE_IPI3_MASTER	0x11
142 #define	TYPE_IPI3_SLAVE		0x12
143 #define	TYPE_IPI3_PEER		0x13
144 
145 #define	F_CTL_XCHG_CONTEXT	0x800000 /* 0 if SID is XCHG originator */
146 #define	F_CTL_SEQ_CONTEXT	0x400000 /* 0 if SID is SEQ initiator */
147 #define	F_CTL_FIRST_SEQ		0x200000 /* 1 if first sequence of XCHG */
148 #define	F_CTL_LAST_SEQ		0x100000 /* 1 if last SEQ of XCHG */
149 #define	F_CTL_END_SEQ		0x080000 /* 1 if last frame of a SEQ */
150 #define	F_CTL_END_CONNECT	0x040000 /* always 0 */
151 #define	F_CTL_CHAINED_SEQ	0x020000 /* always 0 */
152 #define	F_CTL_SEQ_INITIATIVE	0x010000 /* when 1 xfrs SEQ initiative */
153 #define	F_CTL_XID_REASSIGNED	0x008000 /* always 0 */
154 #define	F_CTL_INVALIDATE_XID	0x004000 /* always 0 */
155 #define	F_CTL_CONTINUE_SEQ	0x0000C0 /* always 0 */
156 #define	F_CTL_ABORT_SEQ		0x000030 /* always 0 */
157 #define	F_CTL_RO_PRESENT	0x000008 /* 1 if param field == RO */
158 #define	F_CTL_XCHG_REASSEMBLE	0x000004 /* always 0 */
159 #define	F_CTL_FILL_BYTES	0x000003 /* # of fill bytes in this frame */
160 #define	F_CTL_RESERVED		0x003F00
161 #define	F_CTL_ALWAYS_ZERO	(F_CTL_RESERVED | F_CTL_XCHG_REASSEMBLE | \
162 	F_CTL_ABORT_SEQ | F_CTL_CONTINUE_SEQ| F_CTL_INVALIDATE_XID | \
163 	F_CTL_XID_REASSIGNED | F_CTL_CHAINED_SEQ | F_CTL_END_CONNECT)
164 
165 /* Well known addresses ... */
166 #define	FS_GENERAL_MULTICAST	0xfffff7
167 #define	FS_WELL_KNOWN_MULTICAST	0xfffff8
168 #define	FS_HUNT_GROUP		0xfffff9
169 #define	FS_MANAGEMENT_SERVER	0xfffffa
170 #define	FS_TIME_SERVER		0xfffffb
171 #define	FS_NAME_SERVER		0xfffffc
172 #define	FS_FABRIC_CONTROLLER	0xfffffd
173 #define	FS_FABRIC_F_PORT	0xfffffe
174 #define	FS_BROADCAST		0xffffff
175 
176 /* Fabric Busy Reason Codes */
177 #define	FABRIC_BUSY		0x01
178 #define	NPORT_BUSY		0x03
179 
180 /* NPort Busy Reason Codes */
181 #define	PHYSICAL_BUSY		0x01
182 #define	RESOURSE_BUSY		0x03
183 
184 /* Reject Reason Codes */
185 
186 typedef struct FC2_RJT_PARAM {
187 	uchar_t	rjt_action;
188 	uchar_t	rjt_reason;
189 	uchar_t	reserved[2];
190 } aFC2_RJT_PARAM;
191 
192 #define	INVALID_D_ID		0x01
193 #define	INVALID_S_ID		0x02
194 #define	NPORT_NOT_AVAIL_TEMP	0x03
195 #define	NPORT_NOT_AVAIL_PERM	0x04
196 #define	CLASS_NOT_SUPPORTED	0x05
197 #define	DELIMITER_ERROR		0x06
198 #define	TYPE_NOT_SUPPORTED	0x07
199 #define	INVALID_LINK_CONTROL	0x08
200 #define	INVALID_R_CTL		0x09
201 #define	INVALID_F_CTL		0x0a
202 #define	INVALID_OX_ID		0x0b
203 #define	INVALID_RX_ID		0x0c
204 #define	INVALID_SEQ_ID		0x0d
205 #define	INVALID_DF_CTL		0x0e
206 #define	INVALID_SEQ_CNT		0x0f
207 #define	INVALID_PARAMETER	0x10
208 #define	EXCHANGE_ERROR		0x11
209 #define	PROTOCOL_ERROR		0x12
210 #define	INCORRECT_LENGTH	0x13
211 #define	UNEXPECTED_ACK		0x14
212 #define	UNEXPECTED_LINK_RESP	0x15
213 #define	LOGIN_REQUIRED		0x16
214 #define	EXCESSIVE_SEQUENCES	0x17
215 #define	CANT_ESTABLISH_EXCHANGE	0x18
216 #define	SECURITY_NOT_SUPPORTED	0x19
217 
218 /* BA_RJT and LS_RJT reason codes */
219 #define	RJT_INVALID_CMD_CODE	0x01
220 #define	RJT_LOGICAL_ERROR	0x03
221 #define	RJT_LOGICAL_BUSY	0x05
222 #define	RJT_PROTOCOL_ERR	0x07
223 #define	RJT_CANT_PERFORM_RQST	0x09
224 #define	RJT_CMD_NOT_SUPPORTED	0x0b
225 
226 
227 /*
228  * Frame Payloads that the SOC understands
229  * Transfer Ready:
230  */
231 
232 typedef struct Xfer_Rdy {
233 	int	seq_ro;
234 	int	burst_len;
235 	int	reserved;
236 } aXFER_RDY, *XFER_RDYptr;
237 
238 /*
239  * Link Error Status Block
240  */
241 
242 typedef struct LA_RLS_reply {
243 	int	code;
244 	int	link_failure;
245 	int	loss_of_sync;
246 	int	loss_of_signal;
247 	int	primitive_error;
248 	int	code_violations;
249 	int	invalid_crc;
250 } aLA_RLS_reply, *LA_RLS_replyptr;
251 
252 
253 /*
254  * Login
255  */
256 
257 typedef struct LOGI_PAYLOAD {
258 	uint_t	code;
259 	uchar_t	common_service_params[16];
260 	uchar_t	port_name[8];
261 	uchar_t	node_name[8];
262 	uchar_t	class1_service_params[16];
263 	uchar_t	class2_service_params[16];
264 	uchar_t	class3_service_params[16];
265 } aLOGI_PAYLOAD, *LOGI_PAYLOADptr;
266 
267 #define	SP_F_PORT_LOGIN	0x10
268 
269 
270 /*
271  * Extended Link Service Payload
272  */
273 
274 /* Arbitrary upper limit for now... */
275 #define	FC_MAX_ELS	(60-4)
276 
277 typedef struct ELS_payload {
278 	union els_cmd_u {
279 	    struct {
280 		uchar_t	ls_command;
281 		uchar_t	reserved[3];
282 	    } c;
283 	    uint_t i;
284 	} els_cmd;
285 	uchar_t	els_data[FC_MAX_ELS];
286 } els_payload_t;
287 
288 /*
289  * NOTE: This dataseg definition makes this file unique
290  *	from the Pluto fc_ph file.
291  */
292 
293 /*
294  * Data segment definition
295  */
296 typedef struct fc_dataseg {
297 	uint32_t	fc_base;	/* Address of buffer. */
298 	uint32_t	fc_count;	/* Length of buffer. */
299 } fc_dataseg_t;
300 
301 #ifdef	__cplusplus
302 }
303 #endif
304 
305 #endif	/* !_SYS_FC4_FC_H */
306