xref: /illumos-gate/usr/src/uts/common/sys/scsi/impl/uscsi.h (revision 2f172c55ef76964744bc62b4500ece87f3089b4d)
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 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 /*
27  * Defines for user SCSI commands					*
28  */
29 
30 #ifndef _SYS_SCSI_IMPL_USCSI_H
31 #define	_SYS_SCSI_IMPL_USCSI_H
32 
33 
34 #ifdef	__cplusplus
35 extern "C" {
36 #endif
37 
38 /*
39  * definition for user-scsi command structure
40  */
41 struct uscsi_cmd {
42 	int		uscsi_flags;	/* read, write, etc. see below */
43 	short		uscsi_status;	/* resulting status  */
44 	short		uscsi_timeout;	/* Command Timeout */
45 	caddr_t		uscsi_cdb;	/* cdb to send to target */
46 	caddr_t		uscsi_bufaddr;	/* i/o source/destination */
47 	size_t		uscsi_buflen;	/* size of i/o to take place */
48 	size_t		uscsi_resid;	/* resid from i/o operation */
49 	uchar_t		uscsi_cdblen;	/* # of valid cdb bytes */
50 	uchar_t		uscsi_rqlen;	/* size of uscsi_rqbuf */
51 	uchar_t		uscsi_rqstatus;	/* status of request sense cmd */
52 	uchar_t		uscsi_rqresid;	/* resid of request sense cmd */
53 	caddr_t		uscsi_rqbuf;	/* request sense buffer */
54 	ulong_t		uscsi_path_instance; /* private: hardware path */
55 };
56 
57 #if defined(_SYSCALL32)
58 struct uscsi_cmd32 {
59 	int		uscsi_flags;	/* read, write, etc. see below */
60 	short		uscsi_status;	/* resulting status  */
61 	short		uscsi_timeout;	/* Command Timeout */
62 	caddr32_t	uscsi_cdb;	/* cdb to send to target */
63 	caddr32_t	uscsi_bufaddr;	/* i/o source/destination */
64 	size32_t	uscsi_buflen;	/* size of i/o to take place */
65 	size32_t	uscsi_resid;	/* resid from i/o operation */
66 	uchar_t		uscsi_cdblen;	/* # of valid cdb bytes */
67 	uchar_t		uscsi_rqlen;	/* size of uscsi_rqbuf */
68 	uchar_t		uscsi_rqstatus;	/* status of request sense cmd */
69 	uchar_t		uscsi_rqresid;	/* resid of request sense cmd */
70 	caddr32_t	uscsi_rqbuf;	/* request sense buffer */
71 	uint32_t	uscsi_path_instance; /* private: hardware path */
72 };
73 
74 #define	uscsi_cmd32touscsi_cmd(u32, ucmd)				\
75 	ucmd->uscsi_flags	= u32->uscsi_flags;			\
76 	ucmd->uscsi_status	= u32->uscsi_status;			\
77 	ucmd->uscsi_timeout	= u32->uscsi_timeout;			\
78 	ucmd->uscsi_cdb		= (caddr_t)(uintptr_t)u32->uscsi_cdb;	\
79 	ucmd->uscsi_bufaddr	= (caddr_t)(uintptr_t)u32->uscsi_bufaddr; \
80 	ucmd->uscsi_buflen	= (size_t)u32->uscsi_buflen;		\
81 	ucmd->uscsi_resid	= (size_t)u32->uscsi_resid;		\
82 	ucmd->uscsi_cdblen	= u32->uscsi_cdblen;			\
83 	ucmd->uscsi_rqlen	= u32->uscsi_rqlen;			\
84 	ucmd->uscsi_rqstatus	= u32->uscsi_rqstatus;			\
85 	ucmd->uscsi_rqresid	= u32->uscsi_rqresid;			\
86 	ucmd->uscsi_rqbuf	= (caddr_t)(uintptr_t)u32->uscsi_rqbuf;	\
87 	ucmd->uscsi_path_instance = (ulong_t)u32->uscsi_path_instance;
88 
89 
90 #define	uscsi_cmdtouscsi_cmd32(ucmd, u32)				\
91 	u32->uscsi_flags	= ucmd->uscsi_flags;			\
92 	u32->uscsi_status	= ucmd->uscsi_status;			\
93 	u32->uscsi_timeout	= ucmd->uscsi_timeout;			\
94 	u32->uscsi_cdb		= (caddr32_t)(uintptr_t)ucmd->uscsi_cdb;  \
95 	u32->uscsi_bufaddr	= (caddr32_t)(uintptr_t)ucmd->uscsi_bufaddr; \
96 	u32->uscsi_buflen	= (size32_t)ucmd->uscsi_buflen;		\
97 	u32->uscsi_resid	= (size32_t)ucmd->uscsi_resid;		\
98 	u32->uscsi_cdblen	= ucmd->uscsi_cdblen;			\
99 	u32->uscsi_rqlen	= ucmd->uscsi_rqlen;			\
100 	u32->uscsi_rqstatus	= ucmd->uscsi_rqstatus;			\
101 	u32->uscsi_rqresid	= ucmd->uscsi_rqresid;			\
102 	u32->uscsi_rqbuf	= (caddr32_t)(uintptr_t)ucmd->uscsi_rqbuf; \
103 	u32->uscsi_path_instance = (uint32_t)ucmd->uscsi_path_instance;
104 
105 #endif /* _SYSCALL32 */
106 
107 
108 /*
109  * flags for uscsi_flags field
110  */
111 /*
112  * generic flags
113  */
114 #define	USCSI_SILENT	0x00000001	/* no error messages */
115 #define	USCSI_DIAGNOSE	0x00000002	/* fail if any error occurs */
116 #define	USCSI_ISOLATE	0x00000004	/* isolate from normal commands */
117 #define	USCSI_READ	0x00000008	/* get data from device */
118 #define	USCSI_WRITE	0x00000000	/* send data to device */
119 
120 #define	USCSI_RESET	0x00004000	/* Reset target */
121 #define	USCSI_RESET_TARGET	\
122 			USCSI_RESET	/* Reset target */
123 #define	USCSI_RESET_ALL	0x00008000	/* Reset all targets */
124 #define	USCSI_RQENABLE	0x00010000	/* Enable Request Sense extensions */
125 #define	USCSI_RENEGOT	0x00020000	/* renegotiate wide/sync on next I/O */
126 #define	USCSI_RESET_LUN	0x00040000	/* Reset logical unit */
127 #define	USCSI_PATH_INSTANCE	\
128 			0x00080000	/* use path instance for transport */
129 
130 /*
131  * suitable for parallel SCSI bus only
132  */
133 #define	USCSI_ASYNC	0x00001000	/* Set bus to asynchronous mode */
134 #define	USCSI_SYNC	0x00002000	/* Set bus to sync mode if possible */
135 
136 /*
137  * the following flags should not be used at user level but may
138  * be used by a scsi target driver for internal commands
139  */
140 /*
141  * generic flags
142  */
143 #define	USCSI_NOINTR	0x00000040	/* No interrupts, NEVER use this flag */
144 #define	USCSI_NOTAG	0x00000100	/* Disable tagged queueing */
145 #define	USCSI_OTAG	0x00000200	/* ORDERED QUEUE tagged cmd */
146 #define	USCSI_HTAG	0x00000400	/* HEAD OF QUEUE tagged cmd */
147 #define	USCSI_HEAD	0x00000800	/* Head of HA queue */
148 
149 /*
150  * suitable for parallel SCSI bus only
151  */
152 #define	USCSI_NOPARITY	0x00000010	/* run command without parity */
153 #define	USCSI_NODISCON	0x00000020	/* run command without disconnects */
154 
155 /*
156  * suitable for FMA module for PM purpose
157  */
158 #define	USCSI_PMFAILFAST	0x00100000	/* fail command if device is */
159 						/* in low power */
160 
161 
162 #define	USCSI_RESERVED	0xffe00000	/* Reserved Bits, must be zero */
163 
164 struct uscsi_rqs {
165 	int		rqs_flags;	/* see below */
166 	ushort_t	rqs_buflen;	/* maximum number or bytes to return */
167 	ushort_t	rqs_resid;	/* untransferred length of RQS data */
168 	caddr_t		rqs_bufaddr;	/* request sense buffer */
169 };
170 
171 #if defined(_SYSCALL32)
172 struct uscsi_rqs32	{
173 	int		rqs_flags;	/* see below */
174 	ushort_t	rqs_buflen;	/* maximum number or bytes to return */
175 	ushort_t	rqs_resid;	/* untransferred length of RQS data */
176 	caddr32_t	rqs_bufaddr;	/* request sense buffer */
177 };
178 #endif /* _SYSCALL32 */
179 
180 
181 /*
182  * uscsi_rqs flags
183  */
184 
185 #define	RQS_OVR		0x01	/* RQS data has been overwritten */
186 #define	RQS_VALID	0x02	/* RQS data is valid */
187 
188 /*
189  * User SCSI io control command
190  */
191 #define	USCSIIOC	(0x04 << 8)
192 #define	USCSICMD	(USCSIIOC|201) 	/* user scsi command */
193 
194 #ifdef	_KERNEL
195 
196 #include <sys/scsi/scsi_types.h>
197 
198 struct uscsi_cmd *scsi_uscsi_alloc();
199 int	scsi_uscsi_copyin(intptr_t, int,
200 	    struct scsi_address *, struct uscsi_cmd **);
201 int	scsi_uscsi_alloc_and_copyin(intptr_t, int,
202 	    struct scsi_address *, struct uscsi_cmd **);
203 
204 int	scsi_uscsi_pktinit(struct uscsi_cmd *, struct scsi_pkt *);
205 int	scsi_uscsi_handle_cmd(dev_t, enum uio_seg,
206 	    struct uscsi_cmd *, int (*)(struct buf *),
207 	    struct buf *, void *);
208 int	scsi_uscsi_pktfini(struct scsi_pkt *, struct uscsi_cmd *);
209 
210 int	scsi_uscsi_copyout(intptr_t, struct uscsi_cmd *);
211 void	scsi_uscsi_free(struct uscsi_cmd *);
212 int	scsi_uscsi_copyout_and_free(intptr_t, struct uscsi_cmd *);
213 
214 #endif	/* _KERNEL */
215 
216 #ifdef	__cplusplus
217 }
218 #endif
219 
220 #endif	/* _SYS_SCSI_IMPL_USCSI_H */
221