1 |
1626 |
jcastillo |
/*
|
2 |
|
|
* scsi.h Copyright (C) 1992 Drew Eckhardt
|
3 |
|
|
* Copyright (C) 1993, 1994, 1995 Eric Youngdale
|
4 |
|
|
* generic SCSI package header file by
|
5 |
|
|
* Initial versions: Drew Eckhardt
|
6 |
|
|
* Subsequent revisions: Eric Youngdale
|
7 |
|
|
*
|
8 |
|
|
* <drew@colorado.edu>
|
9 |
|
|
*
|
10 |
|
|
* Modified by Eric Youngdale eric@aib.com to
|
11 |
|
|
* add scatter-gather, multiple outstanding request, and other
|
12 |
|
|
* enhancements.
|
13 |
|
|
*/
|
14 |
|
|
|
15 |
|
|
#ifndef _SCSI_H
|
16 |
|
|
#define _SCSI_H
|
17 |
|
|
|
18 |
|
|
/*
|
19 |
|
|
* Some of the public constants are being moved to this file.
|
20 |
|
|
* We include it here so that what came from where is transparent.
|
21 |
|
|
*/
|
22 |
|
|
#include <scsi/scsi.h>
|
23 |
|
|
|
24 |
|
|
#include <linux/random.h>
|
25 |
|
|
|
26 |
|
|
|
27 |
|
|
/*
|
28 |
|
|
* Some defs, in case these are not defined elsewhere.
|
29 |
|
|
*/
|
30 |
|
|
#ifndef TRUE
|
31 |
|
|
# define TRUE 1
|
32 |
|
|
#endif
|
33 |
|
|
#ifndef FALSE
|
34 |
|
|
# define FALSE 0
|
35 |
|
|
#endif
|
36 |
|
|
|
37 |
|
|
|
38 |
|
|
extern void scsi_make_blocked_list(void);
|
39 |
|
|
extern volatile int in_scan_scsis;
|
40 |
|
|
extern const unsigned char scsi_command_size[8];
|
41 |
|
|
#define COMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7]
|
42 |
|
|
#define IDENTIFY_BASE 0x80
|
43 |
|
|
#define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\
|
44 |
|
|
((can_disconnect) ? 0x40 : 0) |\
|
45 |
|
|
((lun) & 0x07))
|
46 |
|
|
#define MAX_SCSI_DEVICE_CODE 10
|
47 |
|
|
extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
|
48 |
|
|
|
49 |
|
|
|
50 |
|
|
|
51 |
|
|
/*
|
52 |
|
|
* the return of the status word will be in the following format :
|
53 |
|
|
* The low byte is the status returned by the SCSI command,
|
54 |
|
|
* with vendor specific bits masked.
|
55 |
|
|
*
|
56 |
|
|
* The next byte is the message which followed the SCSI status.
|
57 |
|
|
* This allows a stos to be used, since the Intel is a little
|
58 |
|
|
* endian machine.
|
59 |
|
|
*
|
60 |
|
|
* The final byte is a host return code, which is one of the following.
|
61 |
|
|
*
|
62 |
|
|
* IE
|
63 |
|
|
* lsb msb
|
64 |
|
|
* status msg host code
|
65 |
|
|
*
|
66 |
|
|
* Our errors returned by OUR driver, NOT SCSI message. Or'd with
|
67 |
|
|
* SCSI message passed back to driver <IF any>.
|
68 |
|
|
*/
|
69 |
|
|
|
70 |
|
|
|
71 |
|
|
#define DID_OK 0x00 /* NO error */
|
72 |
|
|
#define DID_NO_CONNECT 0x01 /* Couldn't connect before timeout period */
|
73 |
|
|
#define DID_BUS_BUSY 0x02 /* BUS stayed busy through time out period */
|
74 |
|
|
#define DID_TIME_OUT 0x03 /* TIMED OUT for other reason */
|
75 |
|
|
#define DID_BAD_TARGET 0x04 /* BAD target. */
|
76 |
|
|
#define DID_ABORT 0x05 /* Told to abort for some other reason */
|
77 |
|
|
#define DID_PARITY 0x06 /* Parity error */
|
78 |
|
|
#define DID_ERROR 0x07 /* Internal error */
|
79 |
|
|
#define DID_RESET 0x08 /* Reset by somebody. */
|
80 |
|
|
#define DID_BAD_INTR 0x09 /* Got an interrupt we weren't expecting. */
|
81 |
|
|
#define DRIVER_OK 0x00 /* Driver status */
|
82 |
|
|
|
83 |
|
|
/*
|
84 |
|
|
* These indicate the error that occurred, and what is available.
|
85 |
|
|
*/
|
86 |
|
|
|
87 |
|
|
#define DRIVER_BUSY 0x01
|
88 |
|
|
#define DRIVER_SOFT 0x02
|
89 |
|
|
#define DRIVER_MEDIA 0x03
|
90 |
|
|
#define DRIVER_ERROR 0x04
|
91 |
|
|
|
92 |
|
|
#define DRIVER_INVALID 0x05
|
93 |
|
|
#define DRIVER_TIMEOUT 0x06
|
94 |
|
|
#define DRIVER_HARD 0x07
|
95 |
|
|
#define DRIVER_SENSE 0x08
|
96 |
|
|
|
97 |
|
|
#define SUGGEST_RETRY 0x10
|
98 |
|
|
#define SUGGEST_ABORT 0x20
|
99 |
|
|
#define SUGGEST_REMAP 0x30
|
100 |
|
|
#define SUGGEST_DIE 0x40
|
101 |
|
|
#define SUGGEST_SENSE 0x80
|
102 |
|
|
#define SUGGEST_IS_OK 0xff
|
103 |
|
|
|
104 |
|
|
#define DRIVER_MASK 0x0f
|
105 |
|
|
#define SUGGEST_MASK 0xf0
|
106 |
|
|
|
107 |
|
|
#define MAX_COMMAND_SIZE 12
|
108 |
|
|
|
109 |
|
|
/*
|
110 |
|
|
* SCSI command sets
|
111 |
|
|
*/
|
112 |
|
|
|
113 |
|
|
#define SCSI_UNKNOWN 0
|
114 |
|
|
#define SCSI_1 1
|
115 |
|
|
#define SCSI_1_CCS 2
|
116 |
|
|
#define SCSI_2 3
|
117 |
|
|
|
118 |
|
|
/*
|
119 |
|
|
* Every SCSI command starts with a one byte OP-code.
|
120 |
|
|
* The next byte's high three bits are the LUN of the
|
121 |
|
|
* device. Any multi-byte quantities are stored high byte
|
122 |
|
|
* first, and may have a 5 bit MSB in the same byte
|
123 |
|
|
* as the LUN.
|
124 |
|
|
*/
|
125 |
|
|
|
126 |
|
|
/*
|
127 |
|
|
* Manufacturers list
|
128 |
|
|
*/
|
129 |
|
|
|
130 |
|
|
#define SCSI_MAN_UNKNOWN 0
|
131 |
|
|
#define SCSI_MAN_NEC 1
|
132 |
|
|
#define SCSI_MAN_TOSHIBA 2
|
133 |
|
|
#define SCSI_MAN_NEC_OLDCDR 3
|
134 |
|
|
#define SCSI_MAN_SONY 4
|
135 |
|
|
#define SCSI_MAN_PIONEER 5
|
136 |
|
|
|
137 |
|
|
/*
|
138 |
|
|
* As the scsi do command functions are intelligent, and may need to
|
139 |
|
|
* redo a command, we need to keep track of the last command
|
140 |
|
|
* executed on each one.
|
141 |
|
|
*/
|
142 |
|
|
|
143 |
|
|
#define WAS_RESET 0x01
|
144 |
|
|
#define WAS_TIMEDOUT 0x02
|
145 |
|
|
#define WAS_SENSE 0x04
|
146 |
|
|
#define IS_RESETTING 0x08
|
147 |
|
|
#define IS_ABORTING 0x10
|
148 |
|
|
#define ASKED_FOR_SENSE 0x20
|
149 |
|
|
|
150 |
|
|
/*
|
151 |
|
|
* The scsi_device struct contains what we know about each given scsi
|
152 |
|
|
* device.
|
153 |
|
|
*/
|
154 |
|
|
|
155 |
|
|
typedef struct scsi_device {
|
156 |
|
|
struct scsi_device * next; /* Used for linked list */
|
157 |
|
|
|
158 |
|
|
unsigned char id, lun, channel;
|
159 |
|
|
|
160 |
|
|
unsigned int manufacturer; /* Manufacturer of device, for using
|
161 |
|
|
* vendor-specific cmd's */
|
162 |
|
|
int attached; /* # of high level drivers attached to
|
163 |
|
|
* this */
|
164 |
|
|
int access_count; /* Count of open channels/mounts */
|
165 |
|
|
struct wait_queue * device_wait;/* Used to wait if device is busy */
|
166 |
|
|
struct Scsi_Host * host;
|
167 |
|
|
void (*scsi_request_fn)(void); /* Used to jumpstart things after an
|
168 |
|
|
* ioctl */
|
169 |
|
|
struct scsi_cmnd *device_queue; /* queue of SCSI Command structures */
|
170 |
|
|
void *hostdata; /* available to low-level driver */
|
171 |
|
|
char type;
|
172 |
|
|
char scsi_level;
|
173 |
|
|
char vendor[8], model[16], rev[4];
|
174 |
|
|
unsigned char current_tag; /* current tag */
|
175 |
|
|
unsigned char sync_min_period; /* Not less than this period */
|
176 |
|
|
unsigned char sync_max_offset; /* Not greater than this offset */
|
177 |
|
|
unsigned char queue_depth; /* How deep a queue to use */
|
178 |
|
|
|
179 |
|
|
unsigned writeable:1;
|
180 |
|
|
unsigned removable:1;
|
181 |
|
|
unsigned random:1;
|
182 |
|
|
unsigned has_cmdblocks:1;
|
183 |
|
|
unsigned changed:1; /* Data invalid due to media change */
|
184 |
|
|
unsigned busy:1; /* Used to prevent races */
|
185 |
|
|
unsigned lockable:1; /* Able to prevent media removal */
|
186 |
|
|
unsigned borken:1; /* Tell the Seagate driver to be
|
187 |
|
|
* painfully slow on this device */
|
188 |
|
|
unsigned tagged_supported:1; /* Supports SCSI-II tagged queuing */
|
189 |
|
|
unsigned tagged_queue:1; /* SCSI-II tagged queuing enabled */
|
190 |
|
|
unsigned disconnect:1; /* can disconnect */
|
191 |
|
|
unsigned soft_reset:1; /* Uses soft reset option */
|
192 |
|
|
unsigned sync:1; /* Negotiate for sync transfers */
|
193 |
|
|
unsigned single_lun:1; /* Indicates we should only allow I/O to
|
194 |
|
|
* one of the luns for the device at a
|
195 |
|
|
* time. */
|
196 |
|
|
unsigned was_reset:1; /* There was a bus reset on the bus for
|
197 |
|
|
* this device */
|
198 |
|
|
unsigned expecting_cc_ua:1; /* Expecting a CHECK_CONDITION/UNIT_ATTN
|
199 |
|
|
* because we did a bus reset. */
|
200 |
|
|
} Scsi_Device;
|
201 |
|
|
|
202 |
|
|
/*
|
203 |
|
|
* Use these to separate status msg and our bytes
|
204 |
|
|
*/
|
205 |
|
|
|
206 |
|
|
#define status_byte(result) (((result) >> 1) & 0x1f)
|
207 |
|
|
#define msg_byte(result) (((result) >> 8) & 0xff)
|
208 |
|
|
#define host_byte(result) (((result) >> 16) & 0xff)
|
209 |
|
|
#define driver_byte(result) (((result) >> 24) & 0xff)
|
210 |
|
|
#define suggestion(result) (driver_byte(result) & SUGGEST_MASK)
|
211 |
|
|
|
212 |
|
|
#define sense_class(sense) (((sense) >> 4) & 0x7)
|
213 |
|
|
#define sense_error(sense) ((sense) & 0xf)
|
214 |
|
|
#define sense_valid(sense) ((sense) & 0x80);
|
215 |
|
|
|
216 |
|
|
/*
|
217 |
|
|
* These are the SCSI devices available on the system.
|
218 |
|
|
*/
|
219 |
|
|
|
220 |
|
|
extern Scsi_Device * scsi_devices;
|
221 |
|
|
|
222 |
|
|
extern struct hd_struct * sd;
|
223 |
|
|
|
224 |
|
|
#if defined(MAJOR_NR) && (MAJOR_NR == SCSI_DISK_MAJOR)
|
225 |
|
|
extern struct hd_struct * sd;
|
226 |
|
|
#endif
|
227 |
|
|
|
228 |
|
|
/*
|
229 |
|
|
* Initializes all SCSI devices. This scans all scsi busses.
|
230 |
|
|
*/
|
231 |
|
|
|
232 |
|
|
extern int scsi_dev_init (void);
|
233 |
|
|
|
234 |
|
|
struct scatterlist {
|
235 |
|
|
char * address; /* Location data is to be transferred to */
|
236 |
|
|
char * alt_address; /* Location of actual if address is a
|
237 |
|
|
* dma indirect buffer. NULL otherwise */
|
238 |
|
|
unsigned int length;
|
239 |
|
|
};
|
240 |
|
|
|
241 |
|
|
#ifdef __alpha__
|
242 |
|
|
# define ISA_DMA_THRESHOLD (~0UL)
|
243 |
|
|
#else
|
244 |
|
|
# define ISA_DMA_THRESHOLD (0x00ffffff)
|
245 |
|
|
#endif
|
246 |
|
|
#define CONTIGUOUS_BUFFERS(X,Y) ((X->b_data+X->b_size) == Y->b_data)
|
247 |
|
|
|
248 |
|
|
|
249 |
|
|
/*
|
250 |
|
|
* These are the return codes for the abort and reset functions. The mid-level
|
251 |
|
|
* code uses these to decide what to do next. Each of the low level abort
|
252 |
|
|
* and reset functions must correctly indicate what it has done.
|
253 |
|
|
* The descriptions are written from the point of view of the mid-level code,
|
254 |
|
|
* so that the return code is telling the mid-level drivers exactly what
|
255 |
|
|
* the low level driver has already done, and what remains to be done.
|
256 |
|
|
*/
|
257 |
|
|
|
258 |
|
|
/* We did not do anything.
|
259 |
|
|
* Wait some more for this command to complete, and if this does not work,
|
260 |
|
|
* try something more serious. */
|
261 |
|
|
#define SCSI_ABORT_SNOOZE 0
|
262 |
|
|
|
263 |
|
|
/* This means that we were able to abort the command. We have already
|
264 |
|
|
* called the mid-level done function, and do not expect an interrupt that
|
265 |
|
|
* will lead to another call to the mid-level done function for this command */
|
266 |
|
|
#define SCSI_ABORT_SUCCESS 1
|
267 |
|
|
|
268 |
|
|
/* We called for an abort of this command, and we should get an interrupt
|
269 |
|
|
* when this succeeds. Thus we should not restore the timer for this
|
270 |
|
|
* command in the mid-level abort function. */
|
271 |
|
|
#define SCSI_ABORT_PENDING 2
|
272 |
|
|
|
273 |
|
|
/* Unable to abort - command is currently on the bus. Grin and bear it. */
|
274 |
|
|
#define SCSI_ABORT_BUSY 3
|
275 |
|
|
|
276 |
|
|
/* The command is not active in the low level code. Command probably
|
277 |
|
|
* finished. */
|
278 |
|
|
#define SCSI_ABORT_NOT_RUNNING 4
|
279 |
|
|
|
280 |
|
|
/* Something went wrong. The low level driver will indicate the correct
|
281 |
|
|
* error condition when it calls scsi_done, so the mid-level abort function
|
282 |
|
|
* can simply wait until this comes through */
|
283 |
|
|
#define SCSI_ABORT_ERROR 5
|
284 |
|
|
|
285 |
|
|
/* We do not know how to reset the bus, or we do not want to. Bummer.
|
286 |
|
|
* Anyway, just wait a little more for the command in question, and hope that
|
287 |
|
|
* it eventually finishes. If it never finishes, the SCSI device could
|
288 |
|
|
* hang, so use this with caution. */
|
289 |
|
|
#define SCSI_RESET_SNOOZE 0
|
290 |
|
|
|
291 |
|
|
/* We do not know how to reset the bus, or we do not want to. Bummer.
|
292 |
|
|
* We have given up on this ever completing. The mid-level code will
|
293 |
|
|
* request sense information to decide how to proceed from here. */
|
294 |
|
|
#define SCSI_RESET_PUNT 1
|
295 |
|
|
|
296 |
|
|
/* This means that we were able to reset the bus. We have restarted all of
|
297 |
|
|
* the commands that should be restarted, and we should be able to continue
|
298 |
|
|
* on normally from here. We do not expect any interrupts that will return
|
299 |
|
|
* DID_RESET to any of the other commands in the host_queue, and the mid-level
|
300 |
|
|
* code does not need to do anything special to keep the commands alive.
|
301 |
|
|
* If a hard reset was performed then all outstanding commands on the
|
302 |
|
|
* bus have been restarted. */
|
303 |
|
|
#define SCSI_RESET_SUCCESS 2
|
304 |
|
|
|
305 |
|
|
/* We called for a reset of this bus, and we should get an interrupt
|
306 |
|
|
* when this succeeds. Each command should get its own status
|
307 |
|
|
* passed up to scsi_done, but this has not happened yet.
|
308 |
|
|
* If a hard reset was performed, then we expect an interrupt
|
309 |
|
|
* for *each* of the outstanding commands that will have the
|
310 |
|
|
* effect of restarting the commands.
|
311 |
|
|
*/
|
312 |
|
|
#define SCSI_RESET_PENDING 3
|
313 |
|
|
|
314 |
|
|
/* We did a reset, but do not expect an interrupt to signal DID_RESET.
|
315 |
|
|
* This tells the upper level code to request the sense info, and this
|
316 |
|
|
* should keep the command alive. */
|
317 |
|
|
#define SCSI_RESET_WAKEUP 4
|
318 |
|
|
|
319 |
|
|
/* The command is not active in the low level code. Command probably
|
320 |
|
|
finished. */
|
321 |
|
|
#define SCSI_RESET_NOT_RUNNING 5
|
322 |
|
|
|
323 |
|
|
/* Something went wrong, and we do not know how to fix it. */
|
324 |
|
|
#define SCSI_RESET_ERROR 6
|
325 |
|
|
|
326 |
|
|
#define SCSI_RESET_SYNCHRONOUS 0x01
|
327 |
|
|
#define SCSI_RESET_ASYNCHRONOUS 0x02
|
328 |
|
|
#define SCSI_RESET_SUGGEST_BUS_RESET 0x04
|
329 |
|
|
#define SCSI_RESET_SUGGEST_HOST_RESET 0x08
|
330 |
|
|
/*
|
331 |
|
|
* This is a bitmask that is ored with one of the above codes.
|
332 |
|
|
* It tells the mid-level code that we did a hard reset.
|
333 |
|
|
*/
|
334 |
|
|
#define SCSI_RESET_BUS_RESET 0x100
|
335 |
|
|
/*
|
336 |
|
|
* This is a bitmask that is ored with one of the above codes.
|
337 |
|
|
* It tells the mid-level code that we did a host adapter reset.
|
338 |
|
|
*/
|
339 |
|
|
#define SCSI_RESET_HOST_RESET 0x200
|
340 |
|
|
/*
|
341 |
|
|
* Used to mask off bits and to obtain the basic action that was
|
342 |
|
|
* performed.
|
343 |
|
|
*/
|
344 |
|
|
#define SCSI_RESET_ACTION 0xff
|
345 |
|
|
|
346 |
|
|
void * scsi_malloc(unsigned int);
|
347 |
|
|
int scsi_free(void *, unsigned int);
|
348 |
|
|
extern unsigned int dma_free_sectors; /* How much room do we have left */
|
349 |
|
|
extern unsigned int need_isa_buffer; /* True if some devices need indirection
|
350 |
|
|
* buffers */
|
351 |
|
|
|
352 |
|
|
/*
|
353 |
|
|
* The Scsi_Cmnd structure is used by scsi.c internally, and for communication
|
354 |
|
|
* with low level drivers that support multiple outstanding commands.
|
355 |
|
|
*/
|
356 |
|
|
typedef struct scsi_pointer {
|
357 |
|
|
char * ptr; /* data pointer */
|
358 |
|
|
int this_residual; /* left in this buffer */
|
359 |
|
|
struct scatterlist *buffer; /* which buffer */
|
360 |
|
|
int buffers_residual; /* how many buffers left */
|
361 |
|
|
|
362 |
|
|
volatile int Status;
|
363 |
|
|
volatile int Message;
|
364 |
|
|
volatile int have_data_in;
|
365 |
|
|
volatile int sent_command;
|
366 |
|
|
volatile int phase;
|
367 |
|
|
} Scsi_Pointer;
|
368 |
|
|
|
369 |
|
|
typedef struct scsi_cmnd {
|
370 |
|
|
struct Scsi_Host * host;
|
371 |
|
|
Scsi_Device * device;
|
372 |
|
|
unsigned char target, lun, channel;
|
373 |
|
|
unsigned char cmd_len;
|
374 |
|
|
unsigned char old_cmd_len;
|
375 |
|
|
struct scsi_cmnd *next, *prev, *device_next, *reset_chain;
|
376 |
|
|
|
377 |
|
|
/* These elements define the operation we are about to perform */
|
378 |
|
|
unsigned char cmnd[12];
|
379 |
|
|
unsigned request_bufflen; /* Actual request size */
|
380 |
|
|
|
381 |
|
|
void * request_buffer; /* Actual requested buffer */
|
382 |
|
|
|
383 |
|
|
/* These elements define the operation we ultimately want to perform */
|
384 |
|
|
unsigned char data_cmnd[12];
|
385 |
|
|
unsigned short old_use_sg; /* We save use_sg here when requesting
|
386 |
|
|
* sense info */
|
387 |
|
|
unsigned short use_sg; /* Number of pieces of scatter-gather */
|
388 |
|
|
unsigned short sglist_len; /* size of malloc'd scatter-gather list */
|
389 |
|
|
unsigned short abort_reason;/* If the mid-level code requests an
|
390 |
|
|
* abort, this is the reason. */
|
391 |
|
|
unsigned bufflen; /* Size of data buffer */
|
392 |
|
|
void *buffer; /* Data buffer */
|
393 |
|
|
|
394 |
|
|
unsigned underflow; /* Return error if less than this amount is
|
395 |
|
|
* transfered */
|
396 |
|
|
|
397 |
|
|
unsigned transfersize; /* How much we are guaranteed to transfer with
|
398 |
|
|
* each SCSI transfer (ie, between disconnect /
|
399 |
|
|
* reconnects. Probably == sector size */
|
400 |
|
|
|
401 |
|
|
|
402 |
|
|
struct request request; /* A copy of the command we are working on */
|
403 |
|
|
|
404 |
|
|
unsigned char sense_buffer[16]; /* Sense for this command, if needed */
|
405 |
|
|
|
406 |
|
|
/*
|
407 |
|
|
A SCSI Command is assigned a nonzero serial_number when internal_cmnd
|
408 |
|
|
passes it to the driver's queue command function. The serial_number
|
409 |
|
|
is cleared when scsi_done is entered indicating that the command has
|
410 |
|
|
been completed. If a timeout occurs, the serial number at the moment
|
411 |
|
|
of timeout is copied into serial_number_at_timeout. By subsequently
|
412 |
|
|
comparing the serial_number and serial_number_at_timeout fields
|
413 |
|
|
during abort or reset processing, we can detect whether the command
|
414 |
|
|
has already completed. This also detects cases where the command has
|
415 |
|
|
completed and the SCSI Command structure has already being reused
|
416 |
|
|
for another command, so that we can avoid incorrectly aborting or
|
417 |
|
|
resetting the new command.
|
418 |
|
|
*/
|
419 |
|
|
|
420 |
|
|
unsigned long serial_number;
|
421 |
|
|
unsigned long serial_number_at_timeout;
|
422 |
|
|
|
423 |
|
|
int retries;
|
424 |
|
|
int allowed;
|
425 |
|
|
int timeout_per_command, timeout_total, timeout;
|
426 |
|
|
|
427 |
|
|
/*
|
428 |
|
|
* We handle the timeout differently if it happens when a reset,
|
429 |
|
|
* abort, etc are in process.
|
430 |
|
|
*/
|
431 |
|
|
unsigned volatile char internal_timeout;
|
432 |
|
|
|
433 |
|
|
unsigned flags;
|
434 |
|
|
|
435 |
|
|
/* These variables are for the cdrom only. Once we have variable size
|
436 |
|
|
* buffers in the buffer cache, they will go away. */
|
437 |
|
|
int this_count;
|
438 |
|
|
/* End of special cdrom variables */
|
439 |
|
|
|
440 |
|
|
/* Low-level done function - can be used by low-level driver to point
|
441 |
|
|
* to completion function. Not used by mid/upper level code. */
|
442 |
|
|
void (*scsi_done)(struct scsi_cmnd *);
|
443 |
|
|
void (*done)(struct scsi_cmnd *); /* Mid-level done function */
|
444 |
|
|
|
445 |
|
|
/*
|
446 |
|
|
* The following fields can be written to by the host specific code.
|
447 |
|
|
* Everything else should be left alone.
|
448 |
|
|
*/
|
449 |
|
|
|
450 |
|
|
Scsi_Pointer SCp; /* Scratchpad used by some host adapters */
|
451 |
|
|
|
452 |
|
|
unsigned char * host_scribble; /* The host adapter is allowed to
|
453 |
|
|
* call scsi_malloc and get some memory
|
454 |
|
|
* and hang it here. The host adapter
|
455 |
|
|
* is also expected to call scsi_free
|
456 |
|
|
* to release this memory. (The memory
|
457 |
|
|
* obtained by scsi_malloc is guaranteed
|
458 |
|
|
* to be at an address < 16Mb). */
|
459 |
|
|
|
460 |
|
|
int result; /* Status code from lower level driver */
|
461 |
|
|
|
462 |
|
|
unsigned char tag; /* SCSI-II queued command tag */
|
463 |
|
|
unsigned long pid; /* Process ID, starts at 0 */
|
464 |
|
|
} Scsi_Cmnd;
|
465 |
|
|
|
466 |
|
|
/*
|
467 |
|
|
* scsi_abort aborts the current command that is executing on host host.
|
468 |
|
|
* The error code, if non zero is returned in the host byte, otherwise
|
469 |
|
|
* DID_ABORT is returned in the hostbyte.
|
470 |
|
|
*/
|
471 |
|
|
|
472 |
|
|
extern int scsi_abort (Scsi_Cmnd *, int code);
|
473 |
|
|
|
474 |
|
|
extern void scsi_do_cmd (Scsi_Cmnd *, const void *cmnd ,
|
475 |
|
|
void *buffer, unsigned bufflen,
|
476 |
|
|
void (*done)(struct scsi_cmnd *),
|
477 |
|
|
int timeout, int retries);
|
478 |
|
|
|
479 |
|
|
|
480 |
|
|
extern Scsi_Cmnd * allocate_device(struct request **, Scsi_Device *, int);
|
481 |
|
|
|
482 |
|
|
extern Scsi_Cmnd * request_queueable(struct request *, Scsi_Device *);
|
483 |
|
|
extern int scsi_reset (Scsi_Cmnd *, unsigned int);
|
484 |
|
|
|
485 |
|
|
extern int max_scsi_hosts;
|
486 |
|
|
|
487 |
|
|
extern void proc_print_scsidevice(Scsi_Device *, char *, int *, int);
|
488 |
|
|
|
489 |
|
|
extern void print_command(unsigned char *);
|
490 |
|
|
extern void print_sense(const char *, Scsi_Cmnd *);
|
491 |
|
|
extern void print_driverbyte(int scsiresult);
|
492 |
|
|
extern void print_hostbyte(int scsiresult);
|
493 |
|
|
|
494 |
|
|
extern void scsi_mark_host_reset(struct Scsi_Host *Host);
|
495 |
|
|
extern void scsi_mark_bus_reset(struct Scsi_Host *Host, int channel);
|
496 |
|
|
|
497 |
|
|
#if defined(MAJOR_NR) && (MAJOR_NR != SCSI_TAPE_MAJOR)
|
498 |
|
|
#include "hosts.h"
|
499 |
|
|
|
500 |
|
|
static Scsi_Cmnd * end_scsi_request(Scsi_Cmnd * SCpnt, int uptodate, int sectors)
|
501 |
|
|
{
|
502 |
|
|
struct request * req;
|
503 |
|
|
struct buffer_head * bh;
|
504 |
|
|
|
505 |
|
|
req = &SCpnt->request;
|
506 |
|
|
req->errors = 0;
|
507 |
|
|
if (!uptodate) {
|
508 |
|
|
#if defined(MAJOR_NR) && (MAJOR_NR == SCSI_DISK_MAJOR)
|
509 |
|
|
printk(DEVICE_NAME " I/O error: dev %s, sector %lu, absolute sector %lu\n",
|
510 |
|
|
kdevname(req->rq_dev), req->sector,
|
511 |
|
|
req->sector + sd[MINOR(SCpnt->request.rq_dev)].start_sect);
|
512 |
|
|
#else
|
513 |
|
|
printk(DEVICE_NAME " I/O error: dev %s, sector %lu\n",
|
514 |
|
|
kdevname(req->rq_dev), req->sector);
|
515 |
|
|
#endif
|
516 |
|
|
}
|
517 |
|
|
|
518 |
|
|
do {
|
519 |
|
|
if ((bh = req->bh) != NULL) {
|
520 |
|
|
req->bh = bh->b_reqnext;
|
521 |
|
|
req->nr_sectors -= bh->b_size >> 9;
|
522 |
|
|
req->sector += bh->b_size >> 9;
|
523 |
|
|
bh->b_reqnext = NULL;
|
524 |
|
|
/*
|
525 |
|
|
* This is our 'MD IO has finished' event handler.
|
526 |
|
|
* note that b_state should be cached in a register
|
527 |
|
|
* anyways, so the overhead if this checking is almost
|
528 |
|
|
* zero. But anyways .. we never get OO for free :)
|
529 |
|
|
*/
|
530 |
|
|
if (test_bit(BH_MD, &bh->b_state)) {
|
531 |
|
|
struct md_personality * pers=(struct md_personality *)bh->personality;
|
532 |
|
|
pers->end_request(bh,uptodate);
|
533 |
|
|
}
|
534 |
|
|
/*
|
535 |
|
|
* the normal (nonmirrored and no RAID5) case:
|
536 |
|
|
*/
|
537 |
|
|
else {
|
538 |
|
|
mark_buffer_uptodate(bh, uptodate);
|
539 |
|
|
unlock_buffer(bh);
|
540 |
|
|
}
|
541 |
|
|
sectors -= bh->b_size >> 9;
|
542 |
|
|
if ((bh = req->bh) != NULL) {
|
543 |
|
|
req->current_nr_sectors = bh->b_size >> 9;
|
544 |
|
|
if (req->nr_sectors < req->current_nr_sectors) {
|
545 |
|
|
req->nr_sectors = req->current_nr_sectors;
|
546 |
|
|
printk("end_scsi_request: buffer-list destroyed\n");
|
547 |
|
|
}
|
548 |
|
|
}
|
549 |
|
|
}
|
550 |
|
|
} while(sectors && bh);
|
551 |
|
|
if (req->bh){
|
552 |
|
|
req->buffer = bh->b_data;
|
553 |
|
|
return SCpnt;
|
554 |
|
|
}
|
555 |
|
|
DEVICE_OFF(req->rq_dev);
|
556 |
|
|
if (req->sem != NULL) {
|
557 |
|
|
up(req->sem);
|
558 |
|
|
}
|
559 |
|
|
add_blkdev_randomness(MAJOR(req->rq_dev));
|
560 |
|
|
|
561 |
|
|
if (SCpnt->host->block) {
|
562 |
|
|
struct Scsi_Host * next;
|
563 |
|
|
|
564 |
|
|
for (next = SCpnt->host->block; next != SCpnt->host;
|
565 |
|
|
next = next->block)
|
566 |
|
|
wake_up(&next->host_wait);
|
567 |
|
|
}
|
568 |
|
|
|
569 |
|
|
req->rq_status = RQ_INACTIVE;
|
570 |
|
|
wake_up(&wait_for_request);
|
571 |
|
|
wake_up(&SCpnt->device->device_wait);
|
572 |
|
|
return NULL;
|
573 |
|
|
}
|
574 |
|
|
|
575 |
|
|
|
576 |
|
|
/* This is just like INIT_REQUEST, but we need to be aware of the fact
|
577 |
|
|
* that an interrupt may start another request, so we run this with interrupts
|
578 |
|
|
* turned off
|
579 |
|
|
*/
|
580 |
|
|
#define INIT_SCSI_REQUEST \
|
581 |
|
|
if (!CURRENT) { \
|
582 |
|
|
CLEAR_INTR; \
|
583 |
|
|
restore_flags(flags); \
|
584 |
|
|
return; \
|
585 |
|
|
} \
|
586 |
|
|
if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \
|
587 |
|
|
panic(DEVICE_NAME ": request list destroyed");\
|
588 |
|
|
if (CURRENT->bh) { \
|
589 |
|
|
if (!buffer_locked(CURRENT->bh)) \
|
590 |
|
|
panic(DEVICE_NAME ": block not locked"); \
|
591 |
|
|
}
|
592 |
|
|
#endif
|
593 |
|
|
|
594 |
|
|
#define SCSI_SLEEP(QUEUE, CONDITION) { \
|
595 |
|
|
if (CONDITION) { \
|
596 |
|
|
struct wait_queue wait = { current, NULL}; \
|
597 |
|
|
add_wait_queue(QUEUE, &wait); \
|
598 |
|
|
for(;;) { \
|
599 |
|
|
current->state = TASK_UNINTERRUPTIBLE; \
|
600 |
|
|
if (CONDITION) { \
|
601 |
|
|
if (intr_count) \
|
602 |
|
|
panic("scsi: trying to call schedule() in interrupt" \
|
603 |
|
|
", file %s, line %d.\n", __FILE__, __LINE__); \
|
604 |
|
|
schedule(); \
|
605 |
|
|
} \
|
606 |
|
|
else \
|
607 |
|
|
break; \
|
608 |
|
|
} \
|
609 |
|
|
remove_wait_queue(QUEUE, &wait);\
|
610 |
|
|
current->state = TASK_RUNNING; \
|
611 |
|
|
}; }
|
612 |
|
|
|
613 |
|
|
#endif
|
614 |
|
|
|
615 |
|
|
/*
|
616 |
|
|
* Overrides for Emacs so that we follow Linus's tabbing style.
|
617 |
|
|
* Emacs will notice this stuff at the end of the file and automatically
|
618 |
|
|
* adjust the settings for this buffer only. This must remain at the end
|
619 |
|
|
* of the file.
|
620 |
|
|
* ---------------------------------------------------------------------------
|
621 |
|
|
* Local variables:
|
622 |
|
|
* c-indent-level: 4
|
623 |
|
|
* c-brace-imaginary-offset: 0
|
624 |
|
|
* c-brace-offset: -4
|
625 |
|
|
* c-argdecl-indent: 4
|
626 |
|
|
* c-label-offset: -4
|
627 |
|
|
* c-continued-statement-offset: 4
|
628 |
|
|
* c-continued-brace-offset: 0
|
629 |
|
|
* indent-tabs-mode: nil
|
630 |
|
|
* tab-width: 8
|
631 |
|
|
* End:
|
632 |
|
|
*/
|