xref: /titanic_51/usr/src/uts/common/sys/scsi/impl/uscsi.h (revision 9241eba2ee6b19f556bc3779eef7f62da5efffe5)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
56567eb0aSlh195018  * Common Development and Distribution License (the "License").
66567eb0aSlh195018  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
222ee4dfc7SJane Chu  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
24*9241eba2SRobert Mustacchi  *
25*9241eba2SRobert Mustacchi  * Copyright 2016 Joyent, Inc.
267c478bd9Sstevel@tonic-gate  */
277c478bd9Sstevel@tonic-gate 
287c478bd9Sstevel@tonic-gate /*
29*9241eba2SRobert Mustacchi  * Defines for user SCSI commands
307c478bd9Sstevel@tonic-gate  */
317c478bd9Sstevel@tonic-gate 
327c478bd9Sstevel@tonic-gate #ifndef _SYS_SCSI_IMPL_USCSI_H
337c478bd9Sstevel@tonic-gate #define	_SYS_SCSI_IMPL_USCSI_H
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate 
367c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
377c478bd9Sstevel@tonic-gate extern "C" {
387c478bd9Sstevel@tonic-gate #endif
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate /*
417c478bd9Sstevel@tonic-gate  * definition for user-scsi command structure
427c478bd9Sstevel@tonic-gate  */
437c478bd9Sstevel@tonic-gate struct uscsi_cmd {
447c478bd9Sstevel@tonic-gate 	int		uscsi_flags;	/* read, write, etc. see below */
457c478bd9Sstevel@tonic-gate 	short		uscsi_status;	/* resulting status  */
467c478bd9Sstevel@tonic-gate 	short		uscsi_timeout;	/* Command Timeout */
477c478bd9Sstevel@tonic-gate 	caddr_t		uscsi_cdb;	/* cdb to send to target */
487c478bd9Sstevel@tonic-gate 	caddr_t		uscsi_bufaddr;	/* i/o source/destination */
497c478bd9Sstevel@tonic-gate 	size_t		uscsi_buflen;	/* size of i/o to take place */
507c478bd9Sstevel@tonic-gate 	size_t		uscsi_resid;	/* resid from i/o operation */
517c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_cdblen;	/* # of valid cdb bytes */
527c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_rqlen;	/* size of uscsi_rqbuf */
537c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_rqstatus;	/* status of request sense cmd */
547c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_rqresid;	/* resid of request sense cmd */
557c478bd9Sstevel@tonic-gate 	caddr_t		uscsi_rqbuf;	/* request sense buffer */
56602ca9eaScth 	ulong_t		uscsi_path_instance; /* private: hardware path */
577c478bd9Sstevel@tonic-gate };
587c478bd9Sstevel@tonic-gate 
597c478bd9Sstevel@tonic-gate #if defined(_SYSCALL32)
607c478bd9Sstevel@tonic-gate struct uscsi_cmd32 {
617c478bd9Sstevel@tonic-gate 	int		uscsi_flags;	/* read, write, etc. see below */
627c478bd9Sstevel@tonic-gate 	short		uscsi_status;	/* resulting status  */
637c478bd9Sstevel@tonic-gate 	short		uscsi_timeout;	/* Command Timeout */
647c478bd9Sstevel@tonic-gate 	caddr32_t	uscsi_cdb;	/* cdb to send to target */
657c478bd9Sstevel@tonic-gate 	caddr32_t	uscsi_bufaddr;	/* i/o source/destination */
667c478bd9Sstevel@tonic-gate 	size32_t	uscsi_buflen;	/* size of i/o to take place */
677c478bd9Sstevel@tonic-gate 	size32_t	uscsi_resid;	/* resid from i/o operation */
687c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_cdblen;	/* # of valid cdb bytes */
697c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_rqlen;	/* size of uscsi_rqbuf */
707c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_rqstatus;	/* status of request sense cmd */
717c478bd9Sstevel@tonic-gate 	uchar_t		uscsi_rqresid;	/* resid of request sense cmd */
727c478bd9Sstevel@tonic-gate 	caddr32_t	uscsi_rqbuf;	/* request sense buffer */
73602ca9eaScth 	uint32_t	uscsi_path_instance; /* private: hardware path */
747c478bd9Sstevel@tonic-gate };
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate #define	uscsi_cmd32touscsi_cmd(u32, ucmd)				\
777c478bd9Sstevel@tonic-gate 	ucmd->uscsi_flags	= u32->uscsi_flags;			\
787c478bd9Sstevel@tonic-gate 	ucmd->uscsi_status	= u32->uscsi_status;			\
797c478bd9Sstevel@tonic-gate 	ucmd->uscsi_timeout	= u32->uscsi_timeout;			\
807c478bd9Sstevel@tonic-gate 	ucmd->uscsi_cdb		= (caddr_t)(uintptr_t)u32->uscsi_cdb;	\
817c478bd9Sstevel@tonic-gate 	ucmd->uscsi_bufaddr	= (caddr_t)(uintptr_t)u32->uscsi_bufaddr; \
827c478bd9Sstevel@tonic-gate 	ucmd->uscsi_buflen	= (size_t)u32->uscsi_buflen;		\
837c478bd9Sstevel@tonic-gate 	ucmd->uscsi_resid	= (size_t)u32->uscsi_resid;		\
847c478bd9Sstevel@tonic-gate 	ucmd->uscsi_cdblen	= u32->uscsi_cdblen;			\
857c478bd9Sstevel@tonic-gate 	ucmd->uscsi_rqlen	= u32->uscsi_rqlen;			\
867c478bd9Sstevel@tonic-gate 	ucmd->uscsi_rqstatus	= u32->uscsi_rqstatus;			\
877c478bd9Sstevel@tonic-gate 	ucmd->uscsi_rqresid	= u32->uscsi_rqresid;			\
887c478bd9Sstevel@tonic-gate 	ucmd->uscsi_rqbuf	= (caddr_t)(uintptr_t)u32->uscsi_rqbuf;	\
89602ca9eaScth 	ucmd->uscsi_path_instance = (ulong_t)u32->uscsi_path_instance;
907c478bd9Sstevel@tonic-gate 
917c478bd9Sstevel@tonic-gate 
927c478bd9Sstevel@tonic-gate #define	uscsi_cmdtouscsi_cmd32(ucmd, u32)				\
937c478bd9Sstevel@tonic-gate 	u32->uscsi_flags	= ucmd->uscsi_flags;			\
947c478bd9Sstevel@tonic-gate 	u32->uscsi_status	= ucmd->uscsi_status;			\
957c478bd9Sstevel@tonic-gate 	u32->uscsi_timeout	= ucmd->uscsi_timeout;			\
967c478bd9Sstevel@tonic-gate 	u32->uscsi_cdb		= (caddr32_t)(uintptr_t)ucmd->uscsi_cdb;  \
977c478bd9Sstevel@tonic-gate 	u32->uscsi_bufaddr	= (caddr32_t)(uintptr_t)ucmd->uscsi_bufaddr; \
987c478bd9Sstevel@tonic-gate 	u32->uscsi_buflen	= (size32_t)ucmd->uscsi_buflen;		\
997c478bd9Sstevel@tonic-gate 	u32->uscsi_resid	= (size32_t)ucmd->uscsi_resid;		\
1007c478bd9Sstevel@tonic-gate 	u32->uscsi_cdblen	= ucmd->uscsi_cdblen;			\
1017c478bd9Sstevel@tonic-gate 	u32->uscsi_rqlen	= ucmd->uscsi_rqlen;			\
1027c478bd9Sstevel@tonic-gate 	u32->uscsi_rqstatus	= ucmd->uscsi_rqstatus;			\
1037c478bd9Sstevel@tonic-gate 	u32->uscsi_rqresid	= ucmd->uscsi_rqresid;			\
1047c478bd9Sstevel@tonic-gate 	u32->uscsi_rqbuf	= (caddr32_t)(uintptr_t)ucmd->uscsi_rqbuf; \
105602ca9eaScth 	u32->uscsi_path_instance = (uint32_t)ucmd->uscsi_path_instance;
1067c478bd9Sstevel@tonic-gate 
1077c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
1087c478bd9Sstevel@tonic-gate 
1097c478bd9Sstevel@tonic-gate 
1107c478bd9Sstevel@tonic-gate /*
1117c478bd9Sstevel@tonic-gate  * flags for uscsi_flags field
1127c478bd9Sstevel@tonic-gate  */
1137c478bd9Sstevel@tonic-gate /*
1147c478bd9Sstevel@tonic-gate  * generic flags
1157c478bd9Sstevel@tonic-gate  */
116602ca9eaScth #define	USCSI_SILENT	0x00000001	/* no error messages */
117602ca9eaScth #define	USCSI_DIAGNOSE	0x00000002	/* fail if any error occurs */
118602ca9eaScth #define	USCSI_ISOLATE	0x00000004	/* isolate from normal commands */
119602ca9eaScth #define	USCSI_READ	0x00000008	/* get data from device */
120602ca9eaScth #define	USCSI_WRITE	0x00000000	/* send data to device */
121602ca9eaScth 
122602ca9eaScth #define	USCSI_RESET	0x00004000	/* Reset target */
123602ca9eaScth #define	USCSI_RESET_TARGET	\
124602ca9eaScth 			USCSI_RESET	/* Reset target */
125602ca9eaScth #define	USCSI_RESET_ALL	0x00008000	/* Reset all targets */
126602ca9eaScth #define	USCSI_RQENABLE	0x00010000	/* Enable Request Sense extensions */
127602ca9eaScth #define	USCSI_RENEGOT	0x00020000	/* renegotiate wide/sync on next I/O */
128602ca9eaScth #define	USCSI_RESET_LUN	0x00040000	/* Reset logical unit */
129602ca9eaScth #define	USCSI_PATH_INSTANCE	\
130602ca9eaScth 			0x00080000	/* use path instance for transport */
1317c478bd9Sstevel@tonic-gate 
1327c478bd9Sstevel@tonic-gate /*
1337c478bd9Sstevel@tonic-gate  * suitable for parallel SCSI bus only
1347c478bd9Sstevel@tonic-gate  */
135602ca9eaScth #define	USCSI_ASYNC	0x00001000	/* Set bus to asynchronous mode */
136602ca9eaScth #define	USCSI_SYNC	0x00002000	/* Set bus to sync mode if possible */
1377c478bd9Sstevel@tonic-gate 
1387c478bd9Sstevel@tonic-gate /*
1397c478bd9Sstevel@tonic-gate  * the following flags should not be used at user level but may
1407c478bd9Sstevel@tonic-gate  * be used by a scsi target driver for internal commands
1417c478bd9Sstevel@tonic-gate  */
1427c478bd9Sstevel@tonic-gate /*
1437c478bd9Sstevel@tonic-gate  * generic flags
1447c478bd9Sstevel@tonic-gate  */
145602ca9eaScth #define	USCSI_NOINTR	0x00000040	/* No interrupts, NEVER use this flag */
146602ca9eaScth #define	USCSI_NOTAG	0x00000100	/* Disable tagged queueing */
147602ca9eaScth #define	USCSI_OTAG	0x00000200	/* ORDERED QUEUE tagged cmd */
148602ca9eaScth #define	USCSI_HTAG	0x00000400	/* HEAD OF QUEUE tagged cmd */
149602ca9eaScth #define	USCSI_HEAD	0x00000800	/* Head of HA queue */
1507c478bd9Sstevel@tonic-gate 
1517c478bd9Sstevel@tonic-gate /*
1527c478bd9Sstevel@tonic-gate  * suitable for parallel SCSI bus only
1537c478bd9Sstevel@tonic-gate  */
154602ca9eaScth #define	USCSI_NOPARITY	0x00000010	/* run command without parity */
155602ca9eaScth #define	USCSI_NODISCON	0x00000020	/* run command without disconnects */
1567c478bd9Sstevel@tonic-gate 
1572ee4dfc7SJane Chu /*
1582ee4dfc7SJane Chu  * suitable for FMA module for PM purpose
1592ee4dfc7SJane Chu  */
1602ee4dfc7SJane Chu #define	USCSI_PMFAILFAST	0x00100000	/* fail command if device is */
1612ee4dfc7SJane Chu 						/* in low power */
1627c478bd9Sstevel@tonic-gate 
1632ee4dfc7SJane Chu 
1642ee4dfc7SJane Chu #define	USCSI_RESERVED	0xffe00000	/* Reserved Bits, must be zero */
1657c478bd9Sstevel@tonic-gate 
1667c478bd9Sstevel@tonic-gate struct uscsi_rqs {
1677c478bd9Sstevel@tonic-gate 	int		rqs_flags;	/* see below */
1687c478bd9Sstevel@tonic-gate 	ushort_t	rqs_buflen;	/* maximum number or bytes to return */
1697c478bd9Sstevel@tonic-gate 	ushort_t	rqs_resid;	/* untransferred length of RQS data */
1707c478bd9Sstevel@tonic-gate 	caddr_t		rqs_bufaddr;	/* request sense buffer */
1717c478bd9Sstevel@tonic-gate };
1727c478bd9Sstevel@tonic-gate 
1737c478bd9Sstevel@tonic-gate #if defined(_SYSCALL32)
1747c478bd9Sstevel@tonic-gate struct uscsi_rqs32	{
1757c478bd9Sstevel@tonic-gate 	int		rqs_flags;	/* see below */
1767c478bd9Sstevel@tonic-gate 	ushort_t	rqs_buflen;	/* maximum number or bytes to return */
1777c478bd9Sstevel@tonic-gate 	ushort_t	rqs_resid;	/* untransferred length of RQS data */
1787c478bd9Sstevel@tonic-gate 	caddr32_t	rqs_bufaddr;	/* request sense buffer */
1797c478bd9Sstevel@tonic-gate };
1807c478bd9Sstevel@tonic-gate #endif /* _SYSCALL32 */
1817c478bd9Sstevel@tonic-gate 
1827c478bd9Sstevel@tonic-gate 
1837c478bd9Sstevel@tonic-gate /*
1847c478bd9Sstevel@tonic-gate  * uscsi_rqs flags
1857c478bd9Sstevel@tonic-gate  */
1867c478bd9Sstevel@tonic-gate 
1877c478bd9Sstevel@tonic-gate #define	RQS_OVR		0x01	/* RQS data has been overwritten */
1887c478bd9Sstevel@tonic-gate #define	RQS_VALID	0x02	/* RQS data is valid */
1897c478bd9Sstevel@tonic-gate 
1907c478bd9Sstevel@tonic-gate /*
191*9241eba2SRobert Mustacchi  * Structure for USCSIMAXXFER ioctls
192*9241eba2SRobert Mustacchi  */
193*9241eba2SRobert Mustacchi typedef uint64_t	uscsi_xfer_t;
194*9241eba2SRobert Mustacchi 
195*9241eba2SRobert Mustacchi /*
1967c478bd9Sstevel@tonic-gate  * User SCSI io control command
1977c478bd9Sstevel@tonic-gate  */
1987c478bd9Sstevel@tonic-gate #define	USCSIIOC	(0x04 << 8)
1997c478bd9Sstevel@tonic-gate #define	USCSICMD	(USCSIIOC|201) 	/* user scsi command */
200*9241eba2SRobert Mustacchi #define	USCSIMAXXFER	(USCSIIOC|202)	/* get max transfer size */
2017c478bd9Sstevel@tonic-gate 
2026567eb0aSlh195018 #ifdef	_KERNEL
2036567eb0aSlh195018 
2046567eb0aSlh195018 #include <sys/scsi/scsi_types.h>
2056567eb0aSlh195018 
2069e1c849eSDavid Zhang - Sun Microsystems - Beijing China struct uscsi_cmd *scsi_uscsi_alloc();
2079e1c849eSDavid Zhang - Sun Microsystems - Beijing China int	scsi_uscsi_copyin(intptr_t, int,
2089e1c849eSDavid Zhang - Sun Microsystems - Beijing China 	    struct scsi_address *, struct uscsi_cmd **);
2096567eb0aSlh195018 int	scsi_uscsi_alloc_and_copyin(intptr_t, int,
2106567eb0aSlh195018 	    struct scsi_address *, struct uscsi_cmd **);
2119e1c849eSDavid Zhang - Sun Microsystems - Beijing China 
212602ca9eaScth int	scsi_uscsi_pktinit(struct uscsi_cmd *, struct scsi_pkt *);
2136567eb0aSlh195018 int	scsi_uscsi_handle_cmd(dev_t, enum uio_seg,
2146567eb0aSlh195018 	    struct uscsi_cmd *, int (*)(struct buf *),
2156567eb0aSlh195018 	    struct buf *, void *);
216602ca9eaScth int	scsi_uscsi_pktfini(struct scsi_pkt *, struct uscsi_cmd *);
2179e1c849eSDavid Zhang - Sun Microsystems - Beijing China 
2189e1c849eSDavid Zhang - Sun Microsystems - Beijing China int	scsi_uscsi_copyout(intptr_t, struct uscsi_cmd *);
2199e1c849eSDavid Zhang - Sun Microsystems - Beijing China void	scsi_uscsi_free(struct uscsi_cmd *);
2206567eb0aSlh195018 int	scsi_uscsi_copyout_and_free(intptr_t, struct uscsi_cmd *);
2216567eb0aSlh195018 
2226567eb0aSlh195018 #endif	/* _KERNEL */
2236567eb0aSlh195018 
2247c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
2257c478bd9Sstevel@tonic-gate }
2267c478bd9Sstevel@tonic-gate #endif
2277c478bd9Sstevel@tonic-gate 
2287c478bd9Sstevel@tonic-gate #endif	/* _SYS_SCSI_IMPL_USCSI_H */
229