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-1998 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ifndef _SYS_FC4_FCAL_H
28#define	_SYS_FC4_FCAL_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#ifdef	__cplusplus
33extern "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
50typedef 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	uint16_t	ox_id, rx_id;
56	uint32_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/* legal values for r_ctl: Link Control */
100#define	R_CTL_ACK_1		0xc0
101#define	R_CTL_ACK_N		0xc1
102#define	R_CTL_P_RJT		0xc2
103#define	R_CTL_F_RJT		0xc3
104#define	R_CTL_P_BSY		0xc4
105#define	R_CTL_F_BSY_DF		0xc5
106#define	R_CTL_F_BSY_LC		0xc6
107#define	R_CTL_LCR		0xc7
108
109/* type field definitions for Link Data frames: */
110#define	TYPE_BASIC_LS		0x00
111#define	TYPE_EXTENDED_LS	0x01
112
113/* type field definitions for Device Data frames (from FC-PH 4.1): */
114#define	TYPE_IS8802		0x04
115#define	TYPE_IS8802_SNAP	0x05
116#define	TYPE_SCSI_FCP		0x08 /* we use this one */
117#define	TYPE_SCSI_GPP		0x09
118#define	TYPE_HIPP_FP		0x0a
119#define	TYPE_IPI3_MASTER	0x11
120#define	TYPE_IPI3_SLAVE		0x12
121#define	TYPE_IPI3_PEER		0x13
122
123#define	F_CTL_XCHG_CONTEXT	0x800000 /* 0 if SID is XCHG originator */
124#define	F_CTL_SEQ_CONTEXT	0x400000 /* 0 if SID is SEQ initiator */
125#define	F_CTL_FIRST_SEQ		0x200000 /* 1 if first sequence of XCHG */
126#define	F_CTL_LAST_SEQ		0x100000 /* 1 if last SEQ of XCHG */
127#define	F_CTL_END_SEQ		0x080000 /* 1 if last frame of a SEQ */
128#define	F_CTL_END_CONNECT	0x040000 /* always 0 */
129#define	F_CTL_CHAINED_SEQ	0x020000 /* always 0 */
130#define	F_CTL_SEQ_INITIATIVE	0x010000 /* when 1 xfrs SEQ initiative */
131#define	F_CTL_XID_REASSIGNED	0x008000 /* always 0 */
132#define	F_CTL_INVALIDATE_XID	0x004000 /* always 0 */
133#define	F_CTL_CONTINUE_SEQ	0x0000C0 /* always 0 */
134#define	F_CTL_ABORT_SEQ		0x000030 /* always 0 */
135#define	F_CTL_RO_PRESENT	0x000008 /* 1 if param field == RO */
136#define	F_CTL_XCHG_REASSEMBLE	0x000004 /* always 0 */
137#define	F_CTL_FILL_BYTES	0x000003 /* # of fill bytes in this frame */
138#define	F_CTL_RESERVED		0x003F00
139#define	F_CTL_ALWAYS_ZERO	(F_CTL_RESERVED | F_CTL_XCHG_REASSEMBLE | \
140	F_CTL_ABORT_SEQ | F_CTL_CONTINUE_SEQ| F_CTL_INVALIDATE_XID | \
141	F_CTL_XID_REASSIGNED | F_CTL_CHAINED_SEQ | F_CTL_END_CONNECT)
142
143/* Well known addresses ... */
144#define	FS_GENERAL_MULTICAST	0xfffff7
145#define	FS_WELL_KNOWN_MULTICAST	0xfffff8
146#define	FS_HUNT_GROUP		0xfffff9
147#define	FS_MANAGEMENT_SERVER	0xfffffa
148#define	FS_TIME_SERVER		0xfffffb
149#define	FS_NAME_SERVER		0xfffffc
150#define	FS_FABRIC_CONTROLLER	0xfffffd
151#define	FS_FABRIC_F_PORT	0xfffffe
152#define	FS_BROADCAST		0xffffff
153
154/* Fabric Busy Reason Codes */
155#define	FABRIC_BUSY		0x01
156#define	NPORT_BUSY		0x03
157
158/* NPort Busy Reason Codes */
159#define	PHYSICAL_BUSY		0x01
160#define	RESOURSE_BUSY		0x03
161
162/* Reject Reason Codes */
163
164typedef struct FC2_RJT_PARAM {
165	uchar_t	rjt_action;
166	uchar_t	rjt_reason;
167	uchar_t	reserved[2];
168} aFC2_RJT_PARAM;
169
170#define	INVALID_D_ID		0x01
171#define	INVALID_S_ID		0x02
172#define	NPORT_NOT_AVAIL_TEMP	0x03
173#define	NPORT_NOT_AVAIL_PERM	0x04
174#define	CLASS_NOT_SUPPORTED	0x05
175#define	DELIMITER_ERROR		0x06
176#define	TYPE_NOT_SUPPORTED	0x07
177#define	INVALID_LINK_CONTROL	0x08
178#define	INVALID_R_CTL		0x09
179#define	INVALID_F_CTL		0x0a
180#define	INVALID_OX_ID		0x0b
181#define	INVALID_RX_ID		0x0c
182#define	INVALID_SEQ_ID		0x0d
183#define	INVALID_DF_CTL		0x0e
184#define	INVALID_SEQ_CNT		0x0f
185#define	INVALID_PARAMETER	0x10
186#define	EXCHANGE_ERROR		0x11
187#define	PROTOCOL_ERROR		0x12
188#define	INCORRECT_LENGTH	0x13
189#define	UNEXPECTED_ACK		0x14
190#define	UNEXPECTED_LINK_RESP	0x15
191#define	LOGIN_REQUIRED		0x16
192#define	EXCESSIVE_SEQUENCES	0x17
193#define	CANT_ESTABLISH_EXCHANGE	0x18
194#define	SECURITY_NOT_SUPPORTED	0x19
195
196/* BA_RJT and LS_RJT reason codes */
197#define	RJT_INVALID_CMD_CODE	0x01
198#define	RJT_LOGICAL_ERROR	0x03
199#define	RJT_LOGICAL_BUSY	0x05
200#define	RJT_PROTOCOL_ERR	0x07
201#define	RJT_CANT_PERFORM_RQST	0x09
202#define	RJT_CMD_NOT_SUPPORTED	0x0b
203
204
205/*
206 * Frame Payloads that the SOC understands
207 * Transfer Ready:
208 */
209
210typedef struct Xfer_Rdy {
211	int32_t	seq_ro;
212	int32_t	burst_len;
213	int32_t	reserved;
214} aXFER_RDY, *XFER_RDYptr;
215
216/*
217 * Extended Link Service Payload
218 */
219
220/* Arbitrary upper limit for now... */
221#define	FC_MAX_ELS	(60-4)
222
223typedef struct ELS_payload {
224	union els_cmd_u {
225	    struct {
226		uchar_t	ls_command;
227		uchar_t	reserved[3];
228	    } c;
229	    uint32_t i;
230	} els_cmd;
231	uchar_t	els_data[FC_MAX_ELS];
232} els_payload_t;
233
234
235/*
236 * Data segment definition
237 */
238typedef struct fc_dataseg {
239	uint32_t	fc_base;	/* Address of buffer. */
240	uint32_t	fc_count;	/* Length of buffer. */
241} fc_dataseg_t;
242
243#ifdef	__cplusplus
244}
245#endif
246
247#endif	/* !_SYS_FC4_FCAL_H */
248