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) 1996,2000 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #ifndef _SYS_SCSI_GENERIC_MESSAGE_H
28 #define	_SYS_SCSI_GENERIC_MESSAGE_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /*
37  * Defined Messages For Parallel SCSI.
38  */
39 
40 /*
41  * The SCSI specification defines message codes 0x00, 0x02-0x1F,
42  * as fixed single byte messages, 0x01 as indicating extended (multi-byte)
43  * messages, 0x20-0x2F as fixed two byte messages, and 0x80-0xFF
44  * as IDENTIFY messages.
45  */
46 
47 #define	MSG_COMMAND_COMPLETE	0x00
48 #define	MSG_SAVE_DATA_PTR	0x02
49 #define	MSG_RESTORE_PTRS	0x03
50 #define	MSG_DISCONNECT		0x04
51 #define	MSG_INITIATOR_ERROR	0x05
52 #define	MSG_ABORT		0x06
53 #define	MSG_REJECT		0x07
54 #define	MSG_NOP			0x08
55 #define	MSG_MSG_PARITY		0x09
56 #define	MSG_LINK_CMPLT		0x0A
57 #define	MSG_LINK_CMPLT_FLAG	0x0B
58 #define	MSG_DEVICE_RESET	0x0C
59 #define	MSG_ABORT_TAG		0x0D
60 #define	MSG_CLEAR_QUEUE		0x0E
61 #define	MSG_INITIATE_RECOVERY	0x0F
62 #define	MSG_RELEASE_RECOVERY	0x10
63 #define	MSG_TERMINATE_PROCESS	0x11
64 #define	MSG_CONTINUE_TASK	0x12
65 #define	MSG_TARGET_TRAN_DIS	0x13
66 #define	MSG_CLEAR_ACA		0x16
67 
68 
69 /*
70  * Message code 0x01 indicates an extended
71  * (two or more) byte message. The EXTENDED
72  * message byte is followed immediately by
73  * a message length byte and then an extended
74  * message code byte.
75  *
76  * Note: The EXTENDED IDENTIFY message is pre-SCSI-2.
77  */
78 
79 #define	MSG_EXTENDED		0x01
80 
81 #define	MSG_MODIFY_DATA_PTR	0x00
82 #define	MSG_SYNCHRONOUS		0x01
83 #define	MSG_IDENTIFY_EXTENDED	0x02
84 #define	MSG_WIDE_DATA_XFER	0x03
85 #define	MSG_PARALLEL_PROTOCOL	0x04
86 
87 /*
88  * parallel protocol message optional flags
89  */
90 #define	OPT_IU			0x01
91 #define	OPT_DT			0x02
92 #define	OPT_QAS_REQ		0x04
93 
94 /*
95  * Message codes 0x20-0x2F are fixed two byte messages.
96  */
97 
98 
99 #define	MSG_SIMPLE_QTAG		0x20
100 #define	MSG_HEAD_QTAG		0x21
101 #define	MSG_ORDERED_QTAG	0x22
102 #define	MSG_IGNORE_WIDE_RESID	0x23
103 #define	MSG_ACA			0x24
104 #define	MSG_LUN_RESET		0x25
105 
106 /*
107  * Codes 0x80-0xFF are identify messages, indicated
108  * by the setting of the most significant bit in the
109  * message (0x80).
110  */
111 
112 #define	MSG_IDENTIFY		0x80
113 
114 /*
115  * Initiators will set bit 6 in an Identify message
116  * to indicate whether or not they can accommodate
117  * disconnect/reconnect
118  */
119 
120 #define	INI_CAN_DISCON		0x40
121 
122 /*
123  * ..so we can have a compound definition
124  * for Initiators that can accommodate
125  * disconnect/reconnect
126  */
127 
128 #define	MSG_DR_IDENTIFY		(MSG_IDENTIFY|INI_CAN_DISCON)
129 
130 /*
131  * Note: Following is ONLY applicable to pre-SCSI-3.
132  *
133  * Bit 5 of the identify message specifies that, if zero,
134  * that the IDENTIFY message is directed to a logical unit,
135  * and if one, that the IDENTIFY message is directed to a
136  * target routine that does not involve a logical unit.
137  */
138 
139 #define	MSG_LUNTAR		0x20
140 
141 /*
142  * Note: Following is ONLY applicable to pre-SCSI-3.
143  *
144  * Bits 2-0 identify either the logical unit or the target
145  * routine number based upon whether MSG_LUNTAR is clear
146  * or set.
147  */
148 
149 #define	MSG_LUNRTN		0x07
150 
151 /*
152  * Note: Following is ONLY applicable to pre-SCSI-3.
153  *
154  * Bits 4-3 are reserved and must be zero.
155  */
156 
157 #define	BAD_IDENTIFY		0x18
158 
159 /*
160  * These macros may be useful to quickly determine the
161  * length of a message based upon the message code.
162  */
163 
164 /*
165  * Note: IS_IDENTIFY_MSG is ONLY applicable to pre-SCSI-3.
166  *	 For SCSI-3, use IS_IDENTIFY_MSG_SCSI3.
167  */
168 #define	IS_IDENTIFY_MSG(msg)	\
169 	(((msg) & MSG_IDENTIFY) && !((msg) & BAD_IDENTIFY))
170 #define	IS_IDENTIFY_MSG_SCSI3(msg)	((msg) & MSG_IDENTIFY)
171 #define	IS_EXTENDED_MSG(msg)	((msg) == MSG_EXTENDED)
172 #define	IS_2BYTE_MSG(msg)	(((msg) & 0xF0) == 0x20)
173 #define	IS_1BYTE_MSG(msg)	(!(IS_EXTENDED_MSG((msg))) && \
174 	((((msg) & 0xF0) == 0) || IS_IDENTIFY_MSG((msg))))
175 
176 #ifdef	__cplusplus
177 }
178 #endif
179 
180 #endif	/* _SYS_SCSI_GENERIC_MESSAGE_H */
181