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