Linux Audio

Check our new training course

Loading...
v3.1
 
  1#ifndef _SCSI_GENERIC_H
  2#define _SCSI_GENERIC_H
  3
  4#include <linux/compiler.h>
  5
  6/*
  7   History:
  8    Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
  9     process control of SCSI devices.
 10    Development Sponsored by Killy Corp. NY NY
 11Original driver (sg.h):
 12*       Copyright (C) 1992 Lawrence Foard
 13Version 2 and 3 extensions to driver:
 14*       Copyright (C) 1998 - 2006 Douglas Gilbert
 15
 16    Version: 3.5.34 (20060920)
 17    This version is for 2.6 series kernels.
 18
 19    For a full changelog see http://www.torque.net/sg
 20
 21Map of SG verions to the Linux kernels in which they appear:
 22       ----------        ----------------------------------
 23       original          all kernels < 2.2.6
 24       2.1.40            2.2.20
 25       3.0.x             optional version 3 sg driver for 2.2 series
 26       3.1.17++          2.4.0++
 27       3.5.30++          2.6.0++
 28
 29Major new features in SG 3.x driver (cf SG 2.x drivers)
 30	- SG_IO ioctl() combines function if write() and read()
 31	- new interface (sg_io_hdr_t) but still supports old interface
 32	- scatter/gather in user space, direct IO, and mmap supported
 33
 34 The normal action of this driver is to use the adapter (HBA) driver to DMA
 35 data into kernel buffers and then use the CPU to copy the data into the 
 36 user space (vice versa for writes). That is called "indirect" IO due to 
 37 the double handling of data. There are two methods offered to remove the
 38 redundant copy: 1) direct IO and 2) using the mmap() system call to map
 39 the reserve buffer (this driver has one reserve buffer per fd) into the
 40 user space. Both have their advantages.
 41 In terms of absolute speed mmap() is faster. If speed is not a concern, 
 42 indirect IO should be fine. Read the documentation for more information.
 43
 44 ** N.B. To use direct IO 'echo 1 > /proc/scsi/sg/allow_dio' or
 45         'echo 1 > /sys/module/sg/parameters/allow_dio' is needed.
 46         That attribute is 0 by default. **
 47 
 48 Historical note: this SCSI pass-through driver has been known as "sg" for 
 49 a decade. In broader kernel discussions "sg" is used to refer to scatter
 50 gather techniques. The context should clarify which "sg" is referred to.
 51
 52 Documentation
 53 =============
 54 A web site for the SG device driver can be found at:
 55	http://www.torque.net/sg  [alternatively check the MAINTAINERS file]
 56 The documentation for the sg version 3 driver can be found at:
 57 	http://www.torque.net/sg/p/sg_v3_ho.html
 58 This is a rendering from DocBook source [change the extension to "sgml"
 59 or "xml"]. There are renderings in "ps", "pdf", "rtf" and "txt" (soon).
 60 The SG_IO ioctl is now found in other parts kernel (e.g. the block layer).
 61 For more information see http://www.torque.net/sg/sg_io.html
 62
 63 The older, version 2 documents discuss the original sg interface in detail:
 64	http://www.torque.net/sg/p/scsi-generic.txt
 65	http://www.torque.net/sg/p/scsi-generic_long.txt
 66 Also available: <kernel_source>/Documentation/scsi/scsi-generic.txt
 67
 68 Utility and test programs are available at the sg web site. They are 
 69 packaged as sg3_utils (for the lk 2.4 and 2.6 series) and sg_utils
 70 (for the lk 2.2 series).
 71*/
 72
 73#ifdef __KERNEL__
 74extern int sg_big_buff; /* for sysctl */
 75#endif
 76
 77/* New interface introduced in the 3.x SG drivers follows */
 78
 79typedef struct sg_iovec /* same structure as used by readv() Linux system */
 80{                       /* call. It defines one scatter-gather element. */
 81    void __user *iov_base;      /* Starting address  */
 82    size_t iov_len;             /* Length in bytes  */
 83} sg_iovec_t;
 84
 85
 86typedef struct sg_io_hdr
 87{
 88    int interface_id;           /* [i] 'S' for SCSI generic (required) */
 89    int dxfer_direction;        /* [i] data transfer direction  */
 90    unsigned char cmd_len;      /* [i] SCSI command length ( <= 16 bytes) */
 91    unsigned char mx_sb_len;    /* [i] max length to write to sbp */
 92    unsigned short iovec_count; /* [i] 0 implies no scatter gather */
 93    unsigned int dxfer_len;     /* [i] byte count of data transfer */
 94    void __user *dxferp;	/* [i], [*io] points to data transfer memory
 95					      or scatter gather list */
 96    unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
 97    void __user *sbp;		/* [i], [*o] points to sense_buffer memory */
 98    unsigned int timeout;       /* [i] MAX_UINT->no timeout (unit: millisec) */
 99    unsigned int flags;         /* [i] 0 -> default, see SG_FLAG... */
100    int pack_id;                /* [i->o] unused internally (normally) */
101    void __user * usr_ptr;      /* [i->o] unused internally */
102    unsigned char status;       /* [o] scsi status */
103    unsigned char masked_status;/* [o] shifted, masked scsi status */
104    unsigned char msg_status;   /* [o] messaging level data (optional) */
105    unsigned char sb_len_wr;    /* [o] byte count actually written to sbp */
106    unsigned short host_status; /* [o] errors from host adapter */
107    unsigned short driver_status;/* [o] errors from software driver */
108    int resid;                  /* [o] dxfer_len - actual_transferred */
109    unsigned int duration;      /* [o] time taken by cmd (unit: millisec) */
110    unsigned int info;          /* [o] auxiliary information */
111} sg_io_hdr_t;  /* 64 bytes long (on i386) */
112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
113#define SG_INTERFACE_ID_ORIG 'S'
114
115/* Use negative values to flag difference from original sg_header structure */
116#define SG_DXFER_NONE (-1)      /* e.g. a SCSI Test Unit Ready command */
117#define SG_DXFER_TO_DEV (-2)    /* e.g. a SCSI WRITE command */
118#define SG_DXFER_FROM_DEV (-3)  /* e.g. a SCSI READ command */
119#define SG_DXFER_TO_FROM_DEV (-4) /* treated like SG_DXFER_FROM_DEV with the
120				   additional property than during indirect
121				   IO the user buffer is copied into the
122				   kernel buffers before the transfer */
123#define SG_DXFER_UNKNOWN (-5)   /* Unknown data direction */
124
125/* following flag values can be "or"-ed together */
126#define SG_FLAG_DIRECT_IO 1     /* default is indirect IO */
127#define SG_FLAG_UNUSED_LUN_INHIBIT 2   /* default is overwrite lun in SCSI */
128				/* command block (when <= SCSI_2) */
129#define SG_FLAG_MMAP_IO 4       /* request memory mapped IO */
130#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
131				/* user space (debug indirect IO) */
 
 
 
132
133/* following 'info' values are "or"-ed together */
134#define SG_INFO_OK_MASK 0x1
135#define SG_INFO_OK 0x0          /* no sense, host nor driver "noise" */
136#define SG_INFO_CHECK 0x1       /* something abnormal happened */
137
138#define SG_INFO_DIRECT_IO_MASK 0x6
139#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */
140#define SG_INFO_DIRECT_IO 0x2   /* direct IO requested and performed */
141#define SG_INFO_MIXED_IO 0x4    /* part direct, part indirect IO */
142
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
144typedef struct sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
145    int host_no;        /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
146    int channel;
147    int scsi_id;        /* scsi id of target device */
148    int lun;
149    int scsi_type;      /* TYPE_... defined in scsi/scsi.h */
150    short h_cmd_per_lun;/* host (adapter) maximum commands per lun */
151    short d_queue_depth;/* device (or adapter) maximum queue length */
152    int unused[2];      /* probably find a good use, set 0 for now */
153} sg_scsi_id_t; /* 32 bytes long on i386 */
154
155typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
156    char req_state;     /* 0 -> not used, 1 -> written, 2 -> ready to read */
157    char orphan;        /* 0 -> normal request, 1 -> from interruped SG_IO */
158    char sg_io_owned;   /* 0 -> complete with read(), 1 -> owned by SG_IO */
159    char problem;       /* 0 -> no problem detected, 1 -> error to report */
160    int pack_id;        /* pack_id associated with request */
161    void __user *usr_ptr;     /* user provided pointer (in new interface) */
162    unsigned int duration; /* millisecs elapsed since written (req_state==1)
163			      or request duration (req_state==2) */
164    int unused;
165} sg_req_info_t; /* 20 bytes long on i386 */
166
167
168/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow.
169 [Those that only apply to the SG 2.x drivers are at the end of the file.]
170 (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */
171
172#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
173
174/* Used to configure SCSI command transformation layer for ATAPI devices */
175/* Only supported by the ide-scsi driver */
176#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */
177		      /* 3rd arg = 0 to disable transform, 1 to enable it */
178#define SG_GET_TRANSFORM 0x2205
179
180#define SG_SET_RESERVED_SIZE 0x2275  /* request a new reserved buffer size */
181#define SG_GET_RESERVED_SIZE 0x2272  /* actual size of reserved buffer */
182
183/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */
184#define SG_GET_SCSI_ID 0x2276   /* Yields fd's bus, chan, dev, lun + type */
185/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */
186
187/* Override host setting and always DMA using low memory ( <16MB on i386) */
188#define SG_SET_FORCE_LOW_DMA 0x2279  /* 0-> use adapter setting, 1-> force */
189#define SG_GET_LOW_DMA 0x227a   /* 0-> use all ram for dma; 1-> low dma ram */
190
191/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which
192   tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
193   If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
194   then pack_id ignored by read() and oldest readable fetched. */
195#define SG_SET_FORCE_PACK_ID 0x227b
196#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */
197
198#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */
199
200/* Yields max scatter gather tablesize allowed by current host adapter */
201#define SG_GET_SG_TABLESIZE 0x227F  /* 0 implies can't do scatter gather */
202
203#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
204
205/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
206#define SG_SCSI_RESET 0x2284
207/* Associated values that can be given to SG_SCSI_RESET follow */
 
 
208#define		SG_SCSI_RESET_NOTHING	0
209#define		SG_SCSI_RESET_DEVICE	1
210#define		SG_SCSI_RESET_BUS	2
211#define		SG_SCSI_RESET_HOST	3
212#define		SG_SCSI_RESET_TARGET	4
 
213
214/* synchronous SCSI command ioctl, (only in version 3 interface) */
215#define SG_IO 0x2285   /* similar effect as write() followed by read() */
216
217#define SG_GET_REQUEST_TABLE 0x2286   /* yields table of active requests */
218
219/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */
220#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */
221#define SG_GET_KEEP_ORPHAN 0x2288
222
223/* yields scsi midlevel's access_count for this SCSI device */
224#define SG_GET_ACCESS_COUNT 0x2289  
225
226
227#define SG_SCATTER_SZ (8 * 4096)
228/* Largest size (in bytes) a single scatter-gather list element can have.
229   The value used by the driver is 'max(SG_SCATTER_SZ, PAGE_SIZE)'.
230   This value should be a power of 2 (and may be rounded up internally).
231   If scatter-gather is not supported by adapter then this value is the
232   largest data block that can be read/written by a single scsi command. */
233
234#define SG_DEFAULT_RETRIES 0
235
236/* Defaults, commented if they differ from original sg driver */
237#define SG_DEF_FORCE_LOW_DMA 0  /* was 1 -> memory below 16MB on i386 */
238#define SG_DEF_FORCE_PACK_ID 0
239#define SG_DEF_KEEP_ORPHAN 0
240#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */
241
242/* maximum outstanding requests, write() yields EDOM if exceeded */
243#define SG_MAX_QUEUE 16
244
245#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE    /* for backward compatibility */
246
247/* Alternate style type names, "..._t" variants preferred */
248typedef struct sg_io_hdr Sg_io_hdr;
249typedef struct sg_io_vec Sg_io_vec;
250typedef struct sg_scsi_id Sg_scsi_id;
251typedef struct sg_req_info Sg_req_info;
252
253
254/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
255/*   The older SG interface based on the 'sg_header' structure follows.   */
256/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
257
258#define SG_MAX_SENSE 16   /* this only applies to the sg_header interface */
259
260struct sg_header
261{
262    int pack_len;    /* [o] reply_len (ie useless), ignored as input */
263    int reply_len;   /* [i] max length of expected reply (inc. sg_header) */
264    int pack_id;     /* [io] id number of packet (use ints >= 0) */
265    int result;      /* [o] 0==ok, else (+ve) Unix errno (best ignored) */
266    unsigned int twelve_byte:1;
267	/* [i] Force 12 byte command length for group 6 & 7 commands  */
268    unsigned int target_status:5;   /* [o] scsi status from target */
269    unsigned int host_status:8;     /* [o] host status (see "DID" codes) */
270    unsigned int driver_status:8;   /* [o] driver status+suggestion */
271    unsigned int other_flags:10;    /* unused */
272    unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] Output in 3 cases:
273	   when target_status is CHECK_CONDITION or
274	   when target_status is COMMAND_TERMINATED or
275	   when (driver_status & DRIVER_SENSE) is true. */
276};      /* This structure is 36 bytes long on i386 */
277
278
279/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t
280	   interface is used. They are kept for backward compatibility with
281	   the original and version 2 drivers. */
282
283#define SG_SET_TIMEOUT 0x2201  /* unit: jiffies (10ms on i386) */
284#define SG_GET_TIMEOUT 0x2202  /* yield timeout as _return_ value */
285
286/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q.
287   Each time a sg_io_hdr_t object is seen on this file descriptor, this
288   command queuing flag is set on (overriding the previous setting). */
289#define SG_GET_COMMAND_Q 0x2270   /* Yields 0 (queuing off) or 1 (on) */
290#define SG_SET_COMMAND_Q 0x2271   /* Change queuing state with 0 or 1 */
291
292/* Turn on/off error sense trace (1 and 0 respectively, default is off).
293   Try using: "# cat /proc/scsi/sg/debug" instead in the v3 driver */
294#define SG_SET_DEBUG 0x227e    /* 0 -> turn off debug */
295
296#define SG_NEXT_CMD_LEN 0x2283  /* override SCSI command length with given
297		   number on the next write() on this file descriptor */
298
299
300/* Defaults, commented if they differ from original sg driver */
301#ifdef __KERNEL__
302#define SG_DEFAULT_TIMEOUT_USER	(60*USER_HZ) /* HZ == 'jiffies in 1 second' */
303#else
304#define SG_DEFAULT_TIMEOUT	(60*HZ)	     /* HZ == 'jiffies in 1 second' */
305#endif
306
307#define SG_DEF_COMMAND_Q 0     /* command queuing is always on when
308				  the new interface is used */
309#define SG_DEF_UNDERRUN_FLAG 0
310
311#endif
v6.2
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _SCSI_GENERIC_H
  3#define _SCSI_GENERIC_H
  4
  5#include <linux/compiler.h>
  6
  7/*
  8 * History:
  9 *  Started: Aug 9 by Lawrence Foard (entropy@world.std.com), to allow user
 10 *   process control of SCSI devices.
 11 *  Development Sponsored by Killy Corp. NY NY
 12 *
 13 * Original driver (sg.h):
 14 *       Copyright (C) 1992 Lawrence Foard
 15 * Version 2 and 3 extensions to driver:
 16 *	Copyright (C) 1998 - 2014 Douglas Gilbert
 17 *
 18 *  Version: 3.5.36 (20140603)
 19 *  This version is for 2.6 and 3 series kernels.
 20 *
 21 * Documentation
 22 * =============
 23 * A web site for the SG device driver can be found at:
 24 *	http://sg.danny.cz/sg  [alternatively check the MAINTAINERS file]
 25 * The documentation for the sg version 3 driver can be found at:
 26 *	http://sg.danny.cz/sg/p/sg_v3_ho.html
 27 * Also see: <kernel_source>/Documentation/scsi/scsi-generic.rst
 28 *
 29 * For utility and test programs see: http://sg.danny.cz/sg/sg3_utils.html
 30 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 31
 
 
 
 
 
 32
 33typedef struct sg_iovec /* same structure as used by readv() Linux system */
 34{                       /* call. It defines one scatter-gather element. */
 35    void __user *iov_base;      /* Starting address  */
 36    size_t iov_len;             /* Length in bytes  */
 37} sg_iovec_t;
 38
 39
 40typedef struct sg_io_hdr
 41{
 42    int interface_id;           /* [i] 'S' for SCSI generic (required) */
 43    int dxfer_direction;        /* [i] data transfer direction  */
 44    unsigned char cmd_len;      /* [i] SCSI command length */
 45    unsigned char mx_sb_len;    /* [i] max length to write to sbp */
 46    unsigned short iovec_count; /* [i] 0 implies no scatter gather */
 47    unsigned int dxfer_len;     /* [i] byte count of data transfer */
 48    void __user *dxferp;	/* [i], [*io] points to data transfer memory
 49					      or scatter gather list */
 50    unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
 51    void __user *sbp;		/* [i], [*o] points to sense_buffer memory */
 52    unsigned int timeout;       /* [i] MAX_UINT->no timeout (unit: millisec) */
 53    unsigned int flags;         /* [i] 0 -> default, see SG_FLAG... */
 54    int pack_id;                /* [i->o] unused internally (normally) */
 55    void __user * usr_ptr;      /* [i->o] unused internally */
 56    unsigned char status;       /* [o] scsi status */
 57    unsigned char masked_status;/* [o] shifted, masked scsi status */
 58    unsigned char msg_status;   /* [o] messaging level data (optional) */
 59    unsigned char sb_len_wr;    /* [o] byte count actually written to sbp */
 60    unsigned short host_status; /* [o] errors from host adapter */
 61    unsigned short driver_status;/* [o] errors from software driver */
 62    int resid;                  /* [o] dxfer_len - actual_transferred */
 63    unsigned int duration;      /* [o] time taken by cmd (unit: millisec) */
 64    unsigned int info;          /* [o] auxiliary information */
 65} sg_io_hdr_t;  /* 64 bytes long (on i386) */
 66
 67#if defined(__KERNEL__)
 68#include <linux/compat.h>
 69
 70struct compat_sg_io_hdr {
 71	compat_int_t interface_id;	/* [i] 'S' for SCSI generic (required) */
 72	compat_int_t dxfer_direction;	/* [i] data transfer direction  */
 73	unsigned char cmd_len;		/* [i] SCSI command length ( <= 16 bytes) */
 74	unsigned char mx_sb_len;	/* [i] max length to write to sbp */
 75	unsigned short iovec_count;	/* [i] 0 implies no scatter gather */
 76	compat_uint_t dxfer_len;	/* [i] byte count of data transfer */
 77	compat_uint_t dxferp;		/* [i], [*io] points to data transfer memory
 78						or scatter gather list */
 79	compat_uptr_t cmdp;		/* [i], [*i] points to command to perform */
 80	compat_uptr_t sbp;		/* [i], [*o] points to sense_buffer memory */
 81	compat_uint_t timeout;		/* [i] MAX_UINT->no timeout (unit: millisec) */
 82	compat_uint_t flags;		/* [i] 0 -> default, see SG_FLAG... */
 83	compat_int_t pack_id;		/* [i->o] unused internally (normally) */
 84	compat_uptr_t usr_ptr;		/* [i->o] unused internally */
 85	unsigned char status;		/* [o] scsi status */
 86	unsigned char masked_status;	/* [o] shifted, masked scsi status */
 87	unsigned char msg_status;	/* [o] messaging level data (optional) */
 88	unsigned char sb_len_wr;	/* [o] byte count actually written to sbp */
 89	unsigned short host_status;	/* [o] errors from host adapter */
 90	unsigned short driver_status;	/* [o] errors from software driver */
 91	compat_int_t resid;		/* [o] dxfer_len - actual_transferred */
 92	compat_uint_t duration;		/* [o] time taken by cmd (unit: millisec) */
 93	compat_uint_t info;		/* [o] auxiliary information */
 94};
 95#endif
 96
 97#define SG_INTERFACE_ID_ORIG 'S'
 98
 99/* Use negative values to flag difference from original sg_header structure */
100#define SG_DXFER_NONE (-1)      /* e.g. a SCSI Test Unit Ready command */
101#define SG_DXFER_TO_DEV (-2)    /* e.g. a SCSI WRITE command */
102#define SG_DXFER_FROM_DEV (-3)  /* e.g. a SCSI READ command */
103#define SG_DXFER_TO_FROM_DEV (-4) /* treated like SG_DXFER_FROM_DEV with the
104				   additional property than during indirect
105				   IO the user buffer is copied into the
106				   kernel buffers before the transfer */
107#define SG_DXFER_UNKNOWN (-5)   /* Unknown data direction */
108
109/* following flag values can be "or"-ed together */
110#define SG_FLAG_DIRECT_IO 1     /* default is indirect IO */
111#define SG_FLAG_UNUSED_LUN_INHIBIT 2   /* default is overwrite lun in SCSI */
112				/* command block (when <= SCSI_2) */
113#define SG_FLAG_MMAP_IO 4       /* request memory mapped IO */
114#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
115				/* user space (debug indirect IO) */
116/* defaults:: for sg driver: Q_AT_HEAD; for block layer: Q_AT_TAIL */
117#define SG_FLAG_Q_AT_TAIL 0x10
118#define SG_FLAG_Q_AT_HEAD 0x20
119
120/* following 'info' values are "or"-ed together */
121#define SG_INFO_OK_MASK 0x1
122#define SG_INFO_OK 0x0          /* no sense, host nor driver "noise" */
123#define SG_INFO_CHECK 0x1       /* something abnormal happened */
124
125#define SG_INFO_DIRECT_IO_MASK 0x6
126#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */
127#define SG_INFO_DIRECT_IO 0x2   /* direct IO requested and performed */
128#define SG_INFO_MIXED_IO 0x4    /* part direct, part indirect IO */
129
130/*
131 * Obsolete DRIVER_SENSE driver byte
132 *
133 * Originally the SCSI midlayer would set the DRIVER_SENSE driver byte when
134 * a sense code was generated and a sense buffer was allocated.
135 * However, as nowadays every scsi command has a sense code allocated this
136 * distinction became moot as one could check the sense buffer directly.
137 * Consequently this byte is not set anymore from the midlayer, but SG will
138 * keep setting this byte to be compatible with previous releases.
139 */
140#define DRIVER_SENSE 0x08
141/* Obsolete driver_byte() declaration */
142#define driver_byte(result) (((result) >> 24) & 0xff)
143
144/*
145 *  Original linux SCSI Status codes. They are shifted 1 bit right
146 *  from those found in the SCSI standards.
147 */
148
149#define GOOD                 0x00
150#define CHECK_CONDITION      0x01
151#define CONDITION_GOOD       0x02
152#define BUSY                 0x04
153#define INTERMEDIATE_GOOD    0x08
154#define INTERMEDIATE_C_GOOD  0x0a
155#define RESERVATION_CONFLICT 0x0c
156#define COMMAND_TERMINATED   0x11
157#define QUEUE_FULL           0x14
158#define ACA_ACTIVE           0x18
159#define TASK_ABORTED         0x20
160
161/* Obsolete status_byte() declaration */
162#define sg_status_byte(result) (((result) >> 1) & 0x7f)
163
164typedef struct sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
165    int host_no;        /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
166    int channel;
167    int scsi_id;        /* scsi id of target device */
168    int lun;
169    int scsi_type;      /* TYPE_... defined in scsi/scsi.h */
170    short h_cmd_per_lun;/* host (adapter) maximum commands per lun */
171    short d_queue_depth;/* device (or adapter) maximum queue length */
172    int unused[2];      /* probably find a good use, set 0 for now */
173} sg_scsi_id_t; /* 32 bytes long on i386 */
174
175typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
176    char req_state;     /* 0 -> not used, 1 -> written, 2 -> ready to read */
177    char orphan;        /* 0 -> normal request, 1 -> from interrupted SG_IO */
178    char sg_io_owned;   /* 0 -> complete with read(), 1 -> owned by SG_IO */
179    char problem;       /* 0 -> no problem detected, 1 -> error to report */
180    int pack_id;        /* pack_id associated with request */
181    void __user *usr_ptr;     /* user provided pointer (in new interface) */
182    unsigned int duration; /* millisecs elapsed since written (req_state==1)
183			      or request duration (req_state==2) */
184    int unused;
185} sg_req_info_t; /* 20 bytes long on i386 */
186
187
188/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow.
189 [Those that only apply to the SG 2.x drivers are at the end of the file.]
190 (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */
191
192#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
193
194/* Used to configure SCSI command transformation layer for ATAPI devices */
195/* Only supported by the ide-scsi driver */
196#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */
197		      /* 3rd arg = 0 to disable transform, 1 to enable it */
198#define SG_GET_TRANSFORM 0x2205
199
200#define SG_SET_RESERVED_SIZE 0x2275  /* request a new reserved buffer size */
201#define SG_GET_RESERVED_SIZE 0x2272  /* actual size of reserved buffer */
202
203/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */
204#define SG_GET_SCSI_ID 0x2276   /* Yields fd's bus, chan, dev, lun + type */
205/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */
206
207/* Override host setting and always DMA using low memory ( <16MB on i386) */
208#define SG_SET_FORCE_LOW_DMA 0x2279  /* 0-> use adapter setting, 1-> force */
209#define SG_GET_LOW_DMA 0x227a   /* 0-> use all ram for dma; 1-> low dma ram */
210
211/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which
212   tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
213   If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
214   then pack_id ignored by read() and oldest readable fetched. */
215#define SG_SET_FORCE_PACK_ID 0x227b
216#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */
217
218#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */
219
220/* Yields max scatter gather tablesize allowed by current host adapter */
221#define SG_GET_SG_TABLESIZE 0x227F  /* 0 implies can't do scatter gather */
222
223#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
224
225/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
226#define SG_SCSI_RESET 0x2284
227/* Associated values that can be given to SG_SCSI_RESET follow.
228 * SG_SCSI_RESET_NO_ESCALATE may be OR-ed to the _DEVICE, _TARGET, _BUS
229 * or _HOST reset value so only that action is attempted. */
230#define		SG_SCSI_RESET_NOTHING	0
231#define		SG_SCSI_RESET_DEVICE	1
232#define		SG_SCSI_RESET_BUS	2
233#define		SG_SCSI_RESET_HOST	3
234#define		SG_SCSI_RESET_TARGET	4
235#define		SG_SCSI_RESET_NO_ESCALATE	0x100
236
237/* synchronous SCSI command ioctl, (only in version 3 interface) */
238#define SG_IO 0x2285   /* similar effect as write() followed by read() */
239
240#define SG_GET_REQUEST_TABLE 0x2286   /* yields table of active requests */
241
242/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */
243#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */
244#define SG_GET_KEEP_ORPHAN 0x2288
245
246/* yields scsi midlevel's access_count for this SCSI device */
247#define SG_GET_ACCESS_COUNT 0x2289  
248
249
250#define SG_SCATTER_SZ (8 * 4096)
251/* Largest size (in bytes) a single scatter-gather list element can have.
252   The value used by the driver is 'max(SG_SCATTER_SZ, PAGE_SIZE)'.
253   This value should be a power of 2 (and may be rounded up internally).
254   If scatter-gather is not supported by adapter then this value is the
255   largest data block that can be read/written by a single scsi command. */
256
257#define SG_DEFAULT_RETRIES 0
258
259/* Defaults, commented if they differ from original sg driver */
 
260#define SG_DEF_FORCE_PACK_ID 0
261#define SG_DEF_KEEP_ORPHAN 0
262#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */
263
264/* maximum outstanding requests, write() yields EDOM if exceeded */
265#define SG_MAX_QUEUE 16
266
267#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE    /* for backward compatibility */
268
269/* Alternate style type names, "..._t" variants preferred */
270typedef struct sg_io_hdr Sg_io_hdr;
271typedef struct sg_io_vec Sg_io_vec;
272typedef struct sg_scsi_id Sg_scsi_id;
273typedef struct sg_req_info Sg_req_info;
274
275
276/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
277/*   The older SG interface based on the 'sg_header' structure follows.   */
278/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
279
280#define SG_MAX_SENSE 16   /* this only applies to the sg_header interface */
281
282struct sg_header
283{
284    int pack_len;    /* [o] reply_len (ie useless), ignored as input */
285    int reply_len;   /* [i] max length of expected reply (inc. sg_header) */
286    int pack_id;     /* [io] id number of packet (use ints >= 0) */
287    int result;      /* [o] 0==ok, else (+ve) Unix errno (best ignored) */
288    unsigned int twelve_byte:1;
289	/* [i] Force 12 byte command length for group 6 & 7 commands  */
290    unsigned int target_status:5;   /* [o] scsi status from target */
291    unsigned int host_status:8;     /* [o] host status (see "DID" codes) */
292    unsigned int driver_status:8;   /* [o] driver status+suggestion */
293    unsigned int other_flags:10;    /* unused */
294    unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] Output in 3 cases:
295	   when target_status is CHECK_CONDITION or
296	   when target_status is COMMAND_TERMINATED or
297	   when (driver_status & DRIVER_SENSE) is true. */
298};      /* This structure is 36 bytes long on i386 */
299
300
301/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t
302	   interface is used. They are kept for backward compatibility with
303	   the original and version 2 drivers. */
304
305#define SG_SET_TIMEOUT 0x2201  /* unit: jiffies (10ms on i386) */
306#define SG_GET_TIMEOUT 0x2202  /* yield timeout as _return_ value */
307
308/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q.
309   Each time a sg_io_hdr_t object is seen on this file descriptor, this
310   command queuing flag is set on (overriding the previous setting). */
311#define SG_GET_COMMAND_Q 0x2270   /* Yields 0 (queuing off) or 1 (on) */
312#define SG_SET_COMMAND_Q 0x2271   /* Change queuing state with 0 or 1 */
313
314/* Turn on/off error sense trace (1 and 0 respectively, default is off).
315   Try using: "# cat /proc/scsi/sg/debug" instead in the v3 driver */
316#define SG_SET_DEBUG 0x227e    /* 0 -> turn off debug */
317
318#define SG_NEXT_CMD_LEN 0x2283  /* override SCSI command length with given
319		   number on the next write() on this file descriptor */
320
321
322/* Defaults, commented if they differ from original sg driver */
323#ifdef __KERNEL__
324#define SG_DEFAULT_TIMEOUT_USER	(60*USER_HZ) /* HZ == 'jiffies in 1 second' */
325#else
326#define SG_DEFAULT_TIMEOUT	(60*HZ)	     /* HZ == 'jiffies in 1 second' */
327#endif
328
329#define SG_DEF_COMMAND_Q 0     /* command queuing is always on when
330				  the new interface is used */
331#define SG_DEF_UNDERRUN_FLAG 0
332
333#endif