OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [scsi/] [sg.h] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
#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
11
Original driver (sg.h):
12
*       Copyright (C) 1992 Lawrence Foard
13
Version 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
 
21
Map 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
 
29
Major 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
 
74
/* New interface introduced in the 3.x SG drivers follows */
75
 
76
typedef struct sg_iovec /* same structure as used by readv() Linux system */
77
{                       /* call. It defines one scatter-gather element. */
78
    void __user *iov_base;      /* Starting address  */
79
    size_t iov_len;             /* Length in bytes  */
80
} sg_iovec_t;
81
 
82
 
83
typedef struct sg_io_hdr
84
{
85
    int interface_id;           /* [i] 'S' for SCSI generic (required) */
86
    int dxfer_direction;        /* [i] data transfer direction  */
87
    unsigned char cmd_len;      /* [i] SCSI command length ( <= 16 bytes) */
88
    unsigned char mx_sb_len;    /* [i] max length to write to sbp */
89
    unsigned short iovec_count; /* [i] 0 implies no scatter gather */
90
    unsigned int dxfer_len;     /* [i] byte count of data transfer */
91
    void __user *dxferp;        /* [i], [*io] points to data transfer memory
92
                                              or scatter gather list */
93
    unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
94
    void __user *sbp;           /* [i], [*o] points to sense_buffer memory */
95
    unsigned int timeout;       /* [i] MAX_UINT->no timeout (unit: millisec) */
96
    unsigned int flags;         /* [i] 0 -> default, see SG_FLAG... */
97
    int pack_id;                /* [i->o] unused internally (normally) */
98
    void __user * usr_ptr;      /* [i->o] unused internally */
99
    unsigned char status;       /* [o] scsi status */
100
    unsigned char masked_status;/* [o] shifted, masked scsi status */
101
    unsigned char msg_status;   /* [o] messaging level data (optional) */
102
    unsigned char sb_len_wr;    /* [o] byte count actually written to sbp */
103
    unsigned short host_status; /* [o] errors from host adapter */
104
    unsigned short driver_status;/* [o] errors from software driver */
105
    int resid;                  /* [o] dxfer_len - actual_transferred */
106
    unsigned int duration;      /* [o] time taken by cmd (unit: millisec) */
107
    unsigned int info;          /* [o] auxiliary information */
108
} sg_io_hdr_t;  /* 64 bytes long (on i386) */
109
 
110
#define SG_INTERFACE_ID_ORIG 'S'
111
 
112
/* Use negative values to flag difference from original sg_header structure */
113
#define SG_DXFER_NONE (-1)      /* e.g. a SCSI Test Unit Ready command */
114
#define SG_DXFER_TO_DEV (-2)    /* e.g. a SCSI WRITE command */
115
#define SG_DXFER_FROM_DEV (-3)  /* e.g. a SCSI READ command */
116
#define SG_DXFER_TO_FROM_DEV (-4) /* treated like SG_DXFER_FROM_DEV with the
117
                                   additional property than during indirect
118
                                   IO the user buffer is copied into the
119
                                   kernel buffers before the transfer */
120
#define SG_DXFER_UNKNOWN (-5)   /* Unknown data direction */
121
 
122
/* following flag values can be "or"-ed together */
123
#define SG_FLAG_DIRECT_IO 1     /* default is indirect IO */
124
#define SG_FLAG_UNUSED_LUN_INHIBIT 2   /* default is overwrite lun in SCSI */
125
                                /* command block (when <= SCSI_2) */
126
#define SG_FLAG_MMAP_IO 4       /* request memory mapped IO */
127
#define SG_FLAG_NO_DXFER 0x10000 /* no transfer of kernel buffers to/from */
128
                                /* user space (debug indirect IO) */
129
 
130
/* following 'info' values are "or"-ed together */
131
#define SG_INFO_OK_MASK 0x1
132
#define SG_INFO_OK 0x0          /* no sense, host nor driver "noise" */
133
#define SG_INFO_CHECK 0x1       /* something abnormal happened */
134
 
135
#define SG_INFO_DIRECT_IO_MASK 0x6
136
#define SG_INFO_INDIRECT_IO 0x0 /* data xfer via kernel buffers (or no xfer) */
137
#define SG_INFO_DIRECT_IO 0x2   /* direct IO requested and performed */
138
#define SG_INFO_MIXED_IO 0x4    /* part direct, part indirect IO */
139
 
140
 
141
typedef struct sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
142
    int host_no;        /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
143
    int channel;
144
    int scsi_id;        /* scsi id of target device */
145
    int lun;
146
    int scsi_type;      /* TYPE_... defined in scsi/scsi.h */
147
    short h_cmd_per_lun;/* host (adapter) maximum commands per lun */
148
    short d_queue_depth;/* device (or adapter) maximum queue length */
149
    int unused[2];      /* probably find a good use, set 0 for now */
150
} sg_scsi_id_t; /* 32 bytes long on i386 */
151
 
152
typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
153
    char req_state;     /* 0 -> not used, 1 -> written, 2 -> ready to read */
154
    char orphan;        /* 0 -> normal request, 1 -> from interruped SG_IO */
155
    char sg_io_owned;   /* 0 -> complete with read(), 1 -> owned by SG_IO */
156
    char problem;       /* 0 -> no problem detected, 1 -> error to report */
157
    int pack_id;        /* pack_id associated with request */
158
    void __user *usr_ptr;     /* user provided pointer (in new interface) */
159
    unsigned int duration; /* millisecs elapsed since written (req_state==1)
160
                              or request duration (req_state==2) */
161
    int unused;
162
} sg_req_info_t; /* 20 bytes long on i386 */
163
 
164
 
165
/* IOCTLs: Those ioctls that are relevant to the SG 3.x drivers follow.
166
 [Those that only apply to the SG 2.x drivers are at the end of the file.]
167
 (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated) */
168
 
169
#define SG_EMULATED_HOST 0x2203 /* true for emulated host adapter (ATAPI) */
170
 
171
/* Used to configure SCSI command transformation layer for ATAPI devices */
172
/* Only supported by the ide-scsi driver */
173
#define SG_SET_TRANSFORM 0x2204 /* N.B. 3rd arg is not pointer but value: */
174
                      /* 3rd arg = 0 to disable transform, 1 to enable it */
175
#define SG_GET_TRANSFORM 0x2205
176
 
177
#define SG_SET_RESERVED_SIZE 0x2275  /* request a new reserved buffer size */
178
#define SG_GET_RESERVED_SIZE 0x2272  /* actual size of reserved buffer */
179
 
180
/* The following ioctl has a 'sg_scsi_id_t *' object as its 3rd argument. */
181
#define SG_GET_SCSI_ID 0x2276   /* Yields fd's bus, chan, dev, lun + type */
182
/* SCSI id information can also be obtained from SCSI_IOCTL_GET_IDLUN */
183
 
184
/* Override host setting and always DMA using low memory ( <16MB on i386) */
185
#define SG_SET_FORCE_LOW_DMA 0x2279  /* 0-> use adapter setting, 1-> force */
186
#define SG_GET_LOW_DMA 0x227a   /* 0-> use all ram for dma; 1-> low dma ram */
187
 
188
/* When SG_SET_FORCE_PACK_ID set to 1, pack_id is input to read() which
189
   tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
190
   If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
191
   then pack_id ignored by read() and oldest readable fetched. */
192
#define SG_SET_FORCE_PACK_ID 0x227b
193
#define SG_GET_PACK_ID 0x227c /* Yields oldest readable pack_id (or -1) */
194
 
195
#define SG_GET_NUM_WAITING 0x227d /* Number of commands awaiting read() */
196
 
197
/* Yields max scatter gather tablesize allowed by current host adapter */
198
#define SG_GET_SG_TABLESIZE 0x227F  /* 0 implies can't do scatter gather */
199
 
200
#define SG_GET_VERSION_NUM 0x2282 /* Example: version 2.1.34 yields 20134 */
201
 
202
/* Returns -EBUSY if occupied. 3rd argument pointer to int (see next) */
203
#define SG_SCSI_RESET 0x2284
204
/* Associated values that can be given to SG_SCSI_RESET follow */
205
#define         SG_SCSI_RESET_NOTHING   0
206
#define         SG_SCSI_RESET_DEVICE    1
207
#define         SG_SCSI_RESET_BUS       2
208
#define         SG_SCSI_RESET_HOST      3
209
 
210
/* synchronous SCSI command ioctl, (only in version 3 interface) */
211
#define SG_IO 0x2285   /* similar effect as write() followed by read() */
212
 
213
#define SG_GET_REQUEST_TABLE 0x2286   /* yields table of active requests */
214
 
215
/* How to treat EINTR during SG_IO ioctl(), only in SG 3.x series */
216
#define SG_SET_KEEP_ORPHAN 0x2287 /* 1 -> hold for read(), 0 -> drop (def) */
217
#define SG_GET_KEEP_ORPHAN 0x2288
218
 
219
/* yields scsi midlevel's access_count for this SCSI device */
220
#define SG_GET_ACCESS_COUNT 0x2289  
221
 
222
 
223
#define SG_SCATTER_SZ (8 * 4096)
224
/* Largest size (in bytes) a single scatter-gather list element can have.
225
   The value used by the driver is 'max(SG_SCATTER_SZ, PAGE_SIZE)'.
226
   This value should be a power of 2 (and may be rounded up internally).
227
   If scatter-gather is not supported by adapter then this value is the
228
   largest data block that can be read/written by a single scsi command. */
229
 
230
#define SG_DEFAULT_RETRIES 0
231
 
232
/* Defaults, commented if they differ from original sg driver */
233
#define SG_DEF_FORCE_LOW_DMA 0  /* was 1 -> memory below 16MB on i386 */
234
#define SG_DEF_FORCE_PACK_ID 0
235
#define SG_DEF_KEEP_ORPHAN 0
236
#define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ /* load time option */
237
 
238
/* maximum outstanding requests, write() yields EDOM if exceeded */
239
#define SG_MAX_QUEUE 16
240
 
241
#define SG_BIG_BUFF SG_DEF_RESERVED_SIZE    /* for backward compatibility */
242
 
243
/* Alternate style type names, "..._t" variants preferred */
244
typedef struct sg_io_hdr Sg_io_hdr;
245
typedef struct sg_io_vec Sg_io_vec;
246
typedef struct sg_scsi_id Sg_scsi_id;
247
typedef struct sg_req_info Sg_req_info;
248
 
249
 
250
/* vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv */
251
/*   The older SG interface based on the 'sg_header' structure follows.   */
252
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
253
 
254
#define SG_MAX_SENSE 16   /* this only applies to the sg_header interface */
255
 
256
struct sg_header
257
{
258
    int pack_len;    /* [o] reply_len (ie useless), ignored as input */
259
    int reply_len;   /* [i] max length of expected reply (inc. sg_header) */
260
    int pack_id;     /* [io] id number of packet (use ints >= 0) */
261
    int result;      /* [o] 0==ok, else (+ve) Unix errno (best ignored) */
262
    unsigned int twelve_byte:1;
263
        /* [i] Force 12 byte command length for group 6 & 7 commands  */
264
    unsigned int target_status:5;   /* [o] scsi status from target */
265
    unsigned int host_status:8;     /* [o] host status (see "DID" codes) */
266
    unsigned int driver_status:8;   /* [o] driver status+suggestion */
267
    unsigned int other_flags:10;    /* unused */
268
    unsigned char sense_buffer[SG_MAX_SENSE]; /* [o] Output in 3 cases:
269
           when target_status is CHECK_CONDITION or
270
           when target_status is COMMAND_TERMINATED or
271
           when (driver_status & DRIVER_SENSE) is true. */
272
};      /* This structure is 36 bytes long on i386 */
273
 
274
 
275
/* IOCTLs: The following are not required (or ignored) when the sg_io_hdr_t
276
           interface is used. They are kept for backward compatibility with
277
           the original and version 2 drivers. */
278
 
279
#define SG_SET_TIMEOUT 0x2201  /* unit: jiffies (10ms on i386) */
280
#define SG_GET_TIMEOUT 0x2202  /* yield timeout as _return_ value */
281
 
282
/* Get/set command queuing state per fd (default is SG_DEF_COMMAND_Q.
283
   Each time a sg_io_hdr_t object is seen on this file descriptor, this
284
   command queuing flag is set on (overriding the previous setting). */
285
#define SG_GET_COMMAND_Q 0x2270   /* Yields 0 (queuing off) or 1 (on) */
286
#define SG_SET_COMMAND_Q 0x2271   /* Change queuing state with 0 or 1 */
287
 
288
/* Turn on/off error sense trace (1 and 0 respectively, default is off).
289
   Try using: "# cat /proc/scsi/sg/debug" instead in the v3 driver */
290
#define SG_SET_DEBUG 0x227e    /* 0 -> turn off debug */
291
 
292
#define SG_NEXT_CMD_LEN 0x2283  /* override SCSI command length with given
293
                   number on the next write() on this file descriptor */
294
 
295
 
296
/* Defaults, commented if they differ from original sg driver */
297
#ifdef __KERNEL__
298
#define SG_DEFAULT_TIMEOUT_USER (60*USER_HZ) /* HZ == 'jiffies in 1 second' */
299
#else
300
#define SG_DEFAULT_TIMEOUT      (60*HZ)      /* HZ == 'jiffies in 1 second' */
301
#endif
302
 
303
#define SG_DEF_COMMAND_Q 0     /* command queuing is always on when
304
                                  the new interface is used */
305
#define SG_DEF_UNDERRUN_FLAG 0
306
 
307
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.