1 /* 2 * scsi.h Copyright (C) 1992 Drew Eckhardt 3 * generic SCSI package header file by 4 * Drew Eckhardt 5 * 6 * <drew@colorado.edu> 7 * 8 * Modified by Eric Youngdale eric@tantalus.nrl.navy.mil to 9 * add scatter-gather, multiple outstanding request, and other 10 * enhancements. 11 */ 12
13 #ifndef_SCSI_H 14 #define_SCSI_H 15
16 /* 17 $Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/scsi.h,v 1.3 1993/09/24 12:20:33 drew Exp $ 18
19 For documentation on the OPCODES, MESSAGES, and SENSE values, 20 please consult the SCSI standard. 21
22 */ 23
24 /* 25 SCSI opcodes 26 */ 27
28 #defineTEST_UNIT_READY 0x00
29 #defineREZERO_UNIT 0x01
30 #defineREQUEST_SENSE 0x03
31 #defineFORMAT_UNIT 0x04
32 #defineREAD_BLOCK_LIMITS 0x05
33 #defineREASSIGN_BLOCKS 0x07
34 #defineREAD_6 0x08
35 #defineWRITE_6 0x0a
36 #defineSEEK_6 0x0b
37 #define READ_REVERSE 0x0f
38 #defineWRITE_FILEMARKS 0x10
39 #defineSPACE 0x11
40 #defineINQUIRY 0x12
41 #define RECOVER_BUFFERED_DATA 0x14
42 #defineMODE_SELECT 0x15
43 #defineRESERVE 0x16
44 #define RELEASE 0x17
45 #defineCOPY 0x18
46 #defineERASE 0x19
47 #defineMODE_SENSE 0x1a
48 #defineSTART_STOP 0x1b
49 #define RECEIVE_DIAGNOSTIC 0x1c
50 #defineSEND_DIAGNOSTIC 0x1d
51 #defineALLOW_MEDIUM_REMOVAL 0x1e
52
53 #defineREAD_CAPACITY 0x25
54 #defineREAD_10 0x28
55 #defineWRITE_10 0x2a
56 #defineSEEK_10 0x2b
57 #defineWRITE_VERIFY 0x2e
58 #define VERIFY 0x2f
59 #defineSEARCH_HIGH 0x30
60 #defineSEARCH_EQUAL 0x31
61 #defineSEARCH_LOW 0x32
62 #define SET_LIMITS 0x33
63 #define PRE_FETCH 0x34
64 #defineREAD_POSITION 0x34
65 #define SYNCHRONIZE_CACHE 0x35
66 #define LOCK_UNLOCK_CACHE 0x36
67 #define READ_DEFECT_DATA 0x37
68 #defineCOMPARE 0x39
69 #defineCOPY_VERIFY 0x3a
70 #defineWRITE_BUFFER 0x3b
71 #define READ_BUFFER 0x3c
72 #define READ_LONG 0x3e
73 #defineCHANGE_DEFINITION 0x40
74 #defineLOG_SELECT 0x4c
75 #define LOG_SENSE 0x4d
76 #defineMODE_SELECT_10 0x55
77 #define MODE_SENSE_10 0x5a
78
79 externvolatileintin_scan_scsis;
80 externconstunsignedcharscsi_command_size[8];
81 #defineCOMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7]
82
83 /* 84 MESSAGE CODES 85 */ 86
87 #defineCOMMAND_COMPLETE 0x00
88 #defineEXTENDED_MESSAGE 0x01
89 #defineEXTENDED_MODIFY_DATA_POINTER 0x00
90 #defineEXTENDED_SDTR 0x01
91 #defineEXTENDED_EXTENDED_IDENTIFY 0x02 /* SCSI-I only */ 92 #defineEXTENDED_WDTR 0x03
93 #defineSAVE_POINTERS 0x02
94 #defineRESTORE_POINTERS 0x03
95 #defineDISCONNECT 0x04
96 #define INITIATOR_ERROR 0x05
97 #defineABORT 0x06
98 #defineMESSAGE_REJECT 0x07
99 #defineNOP 0x08
100 #define MSG_PARITY_ERROR 0x09
101 #defineLINKED_CMD_COMPLETE 0x0a
102 #defineLINKED_FLG_CMD_COMPLETE 0x0b
103 #defineBUS_DEVICE_RESET 0x0c
104
105 #defineINITIATE_RECOVERY 0x0f /* SCSI-II only */ 106 #define RELEASE_RECOVERY 0x10 /* SCSI-II only */ 107
108 #defineSIMPLE_QUEUE_TAG 0x20
109 #defineHEAD_OF_QUEUE_TAG 0x21
110 #defineORDERED_QUEUE_TAG 0x22
111
112 #defineIDENTIFY_BASE 0x80
113 #defineIDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\
114 ((can_disconnect) ? 0x40 : 0) |\
115 ((lun) & 0x07))
116
117
118 /* 119 Status codes 120 */ 121
122 #defineGOOD 0x00
123 #defineCHECK_CONDITION 0x01
124 #defineCONDITION_GOOD 0x02
125 #defineBUSY 0x04
126 #defineINTERMEDIATE_GOOD 0x08
127 #defineINTERMEDIATE_C_GOOD 0x0a
128 #defineRESERVATION_CONFLICT 0x0c
129
130 #defineSTATUS_MASK 0x1e
131
132 /* 133 the return of the status word will be in the following format : 134 The low byte is the status returned by the SCSI command, 135 with vendor specific bits masked. 136
137 The next byte is the message which followed the SCSI status. 138 This allows a stos to be used, since the Intel is a little 139 endian machine. 140
141 The final byte is a host return code, which is one of the following. 142
143 IE 144 lsb msb 145 status msg host code 146
147 Our errors returned by OUR driver, NOT SCSI message. Or'd with 148 SCSI message passed back to driver <IF any>. 149 */ 150
151 /* NO error */ 152 #defineDID_OK 0x00
153 /* Couldn't connect before timeout period */ 154 #defineDID_NO_CONNECT 0x01
155 /* BUS stayed busy through time out period */ 156 #defineDID_BUS_BUSY 0x02
157 /* TIMED OUT for other reason */ 158 #defineDID_TIME_OUT 0x03
159 /* BAD target. */ 160 #defineDID_BAD_TARGET 0x04
161 /* Told to abort for some other reason */ 162 #defineDID_ABORT 0x05
163 /* 164 Parity error 165 */ 166 #defineDID_PARITY 0x06
167 /* 168 Internal error 169 */ 170 #defineDID_ERROR 0x07
171 /* 172 Reset by somebody. 173 */ 174 #defineDID_RESET 0x08
175 /* 176 Got an interrupt we weren't expecting. 177 */ 178 #defineDID_BAD_INTR 0x09
179
180 /* 181 Driver status 182 */ 183 #defineDRIVER_OK 0x00
184
185 /* 186 These indicate the error that occurred, and what is available. 187 */ 188
189 #define DRIVER_BUSY 0x01
190 #defineDRIVER_SOFT 0x02
191 #define DRIVER_MEDIA 0x03
192 #defineDRIVER_ERROR 0x04
193
194 #defineDRIVER_INVALID 0x05
195 #defineDRIVER_TIMEOUT 0x06
196 #defineDRIVER_HARD 0x07
197
198 #defineSUGGEST_RETRY 0x10
199 #defineSUGGEST_ABORT 0x20
200 #defineSUGGEST_REMAP 0x30
201 #defineSUGGEST_DIE 0x40
202 #defineSUGGEST_SENSE 0x80
203 #defineSUGGEST_IS_OK 0xff
204
205 #defineDRIVER_SENSE 0x08
206
207 #define DRIVER_MASK 0x0f
208 #defineSUGGEST_MASK 0xf0
209
210 /* 211
212 SENSE KEYS 213 */ 214
215 #defineNO_SENSE 0x00
216 #defineRECOVERED_ERROR 0x01
217 #defineNOT_READY 0x02
218 #defineMEDIUM_ERROR 0x03
219 #defineHARDWARE_ERROR 0x04
220 #defineILLEGAL_REQUEST 0x05
221 #defineUNIT_ATTENTION 0x06
222 #defineDATA_PROTECT 0x07
223 #defineBLANK_CHECK 0x08
224 #defineCOPY_ABORTED 0x0a
225 #defineABORTED_COMMAND 0x0b
226 #defineVOLUME_OVERFLOW 0x0d
227 #defineMISCOMPARE 0x0e
228
229
230 /* 231 DEVICE TYPES 232
233 */ 234
235 #defineTYPE_DISK 0x00
236 #defineTYPE_TAPE 0x01
237 #defineTYPE_WORM 0x04 /* Treated as ROM by our system */ 238 #defineTYPE_ROM 0x05
239 #defineTYPE_MOD 0x07 /* Magneto-optical disk - treated as TYPE_DISK */ 240 #define TYPE_NO_LUN 0x7f
241
242
243 #defineMAX_COMMAND_SIZE 12
244 /* 245 SCSI command sets 246
247 */ 248
249 #define SCSI_UNKNOWN 0
250 #define SCSI_1 1
251 #define SCSI_1_CCS 2
252 #defineSCSI_2 3
253
254 /* 255 Every SCSI command starts with a one byte OP-code. 256 The next byte's high three bits are the LUN of the 257 device. Any multi-byte quantities are stored high byte 258 first, and may have a 5 bit MSB in the same byte 259 as the LUN. 260 */ 261
262 /* 263 Manufacturers list 264 */ 265
266 #defineSCSI_MAN_UNKNOWN 0
267 #defineSCSI_MAN_NEC 1
268 #defineSCSI_MAN_TOSHIBA 2
269
270 /* 271 The scsi_device struct contains what we know about each given scsi 272 device. 273 */ 274
275 typedefstructscsi_device{ 276 structscsi_device * next; /* Used for linked list */ 277 unsignedcharid, lun;
278 unsignedintmanufacturer; /* Manufacturer of device, for using vendor-specific cmd's */ 279 intattached; /* # of high level drivers attached to this */ 280 intaccess_count; /* Count of open channels/mounts */ 281 structwait_queue * device_wait; /* Used to wait if device is busy */ 282 structScsi_Host * host;
283 void (*scsi_request_fn)(void); /* Used to jumpstart things after an ioctl */ 284 void *hostdata; /* available to low-level driver */ 285 chartype;
286 charscsi_level;
287 unsignedwriteable:1;
288 unsignedremovable:1;
289 unsignedrandom:1;
290 unsignedchanged:1; /* Data invalid due to media change */ 291 unsignedbusy:1; /* Used to prevent races */ 292 unsignedlockable:1; /* Able to prevent media removal */ 293 unsignedborken:1; /* Tell the Seagate driver to be 294 painfully slow on this device */ 295 unsignedtagged_supported:1; /* Supports SCSI-II tagged queuing */ 296 unsignedtagged_queue:1; /*SCSI-II tagged queuing enabled */ 297 unsigneddisconnect:1; /* can disconnect */ 298 unsignedsoft_reset:1; /* Uses soft reset option */ 299 unsignedcharcurrent_tag; /* current tag */ 300 unsignedsync:1; /* Negotiate for sync transfers */ 301 unsignedchar sync_min_period; /* Not less than this period */ 302 unsignedchar sync_max_offset; /* Not greater than this offset */ 303 }Scsi_Device;
304 /* 305 Use these to separate status msg and our bytes 306 */ 307
308 #definestatus_byte(result) (((result) >> 1) & 0xf)
309 #definemsg_byte(result) (((result) >> 8) & 0xff)
310 #definehost_byte(result) (((result) >> 16) & 0xff)
311 #definedriver_byte(result) (((result) >> 24) & 0xff)
312 #definesuggestion(result) (driver_byte(result) & SUGGEST_MASK)
313
314 #definesense_class(sense) (((sense) >> 4) & 0x7)
315 #definesense_error(sense) ((sense) & 0xf)
316 #define sense_valid(sense) ((sense) & 0x80);
317
318 /* 319 These are the SCSI devices available on the system. 320 */ 321
322 externScsi_Device * scsi_devices;
323 /* 324 Initializes all SCSI devices. This scans all scsi busses. 325 */ 326
327 externunsignedlongscsi_dev_init (unsignedlong, unsignedlong);
328
329 structscatterlist{ 330 char * address; /* Location data is to be transferred to */ 331 char * alt_address; /* Location of actual if address is a 332 dma indirect buffer. NULL otherwise */ 333 unsignedintlength;
334 };
335
336 #defineISA_DMA_THRESHOLD (0x00ffffff)
337 #defineCONTIGUOUS_BUFFERS(X,Y) ((X->b_data+X->b_size) == Y->b_data)
338
339
340 /* 341 * These are the return codes for the abort and reset functions. The mid-level 342 * code uses these to decide what to do next. Each of the low level abort 343 * and reset functions must correctly indicate what it has done. 344 */ 345
346 /* We did not do anything. Wait 347 some more for this command to complete, and if this does not work, try 348 something more serious. */ 349 #defineSCSI_ABORT_SNOOZE 0
350
351 /* This means that we were able to abort the command. We have already 352 called the mid-level done function, and do not expect an interrupt that will 353 lead to another call to the mid-level done function for this command */ 354 #defineSCSI_ABORT_SUCCESS 1
355
356 /* We called for an abort of this command, and we should get an interrupt 357 when this succeeds. Thus we should not restore the timer for this 358 command in the mid-level abort function. */ 359 #defineSCSI_ABORT_PENDING 2
360
361 /* Unable to abort - command is currently on the bus. Grin and bear it. */ 362 #defineSCSI_ABORT_BUSY 3
363
364 /* The command is not active in the low level code. Command probably 365 finished. */ 366 #defineSCSI_ABORT_NOT_RUNNING 4
367
368 /* Something went wrong. The low level driver will indicate the correct 369 error condition when it calls scsi_done, so the mid-level abort function 370 can simply wait until this comes through */ 371 #defineSCSI_ABORT_ERROR 5
372
373 /* We do not know how to reset the bus, or we do not want to. Bummer. 374 Anyway, just wait a little more for the command in question, and hope that 375 it eventually finishes. If it never finishes, the SCSI device could 376 hang, so use this with caution. */ 377 #defineSCSI_RESET_SNOOZE 0
378
379 /* We do not know how to reset the bus, or we do not want to. Bummer. 380 We have given up on this ever completing. The mid-level code will 381 request sense information to decide how to proceed from here. */ 382 #defineSCSI_RESET_PUNT 1
383
384 /* This means that we were able to reset the bus. We have restarted all of 385 the commands that should be restarted, and we should be able to continue 386 on normally from here. We do not expect any interrupts that will return 387 DID_RESET to any of the other commands in the host_queue, and the mid-level 388 code does not need to do anything special to keep the commands alive. */ 389 #defineSCSI_RESET_SUCCESS 2
390
391 /* We called for an reset of this bus, and we should get an interrupt 392 when this succeeds. Each command should get it's own status 393 passed up to scsi_done, but this has not happened yet. */ 394 #defineSCSI_RESET_PENDING 3
395
396 /* We did a reset, but do not expect an interrupt to signal DID_RESET. 397 This tells the upper level code to request the sense info, and this 398 should keep the command alive. */ 399 #defineSCSI_RESET_WAKEUP 4
400
401 /* Something went wrong, and we do not know how to fix it. */ 402 #defineSCSI_RESET_ERROR 5
403
404 void * scsi_malloc(unsignedint);
405 intscsi_free(void *, unsignedint);
406 externunsignedintdma_free_sectors; /* How much room do we have left */ 407 externunsignedintneed_isa_buffer; /* True if some devices need indirection 408 buffers */ 409
410 /* 411 The Scsi_Cmnd structure is used by scsi.c internally, and for communication with 412 low level drivers that support multiple outstanding commands. 413 */ 414 typedefstruct scsi_pointer { 415 char * ptr; /* data pointer */ 416 intthis_residual; /* left in this buffer */ 417 structscatterlist *buffer; /* which buffer */ 418 intbuffers_residual; /* how many buffers left */ 419
420 volatileintStatus;
421 volatileintMessage;
422 volatileinthave_data_in;
423 volatileintsent_command;
424 volatileintphase;
425 }Scsi_Pointer;
426
427 typedefstructscsi_cmnd{ 428 structScsi_Host * host;
429 Scsi_Device * device;
430 unsignedchartarget, lun;
431 unsignedcharcmd_len;
432 unsignedcharold_cmd_len;
433 structscsi_cmnd *next, *prev;
434
435 /* These elements define the operation we are about to perform */ 436 unsignedcharcmnd[12];
437 unsignedrequest_bufflen; /* Actual request size */ 438
439 void * request_buffer; /* Actual requested buffer */ 440
441 /* These elements define the operation we ultimately want to perform */ 442 unsignedchardata_cmnd[12];
443 unsignedshortold_use_sg; /* We save use_sg here when requesting 444 sense info */ 445 unsignedshortuse_sg; /* Number of pieces of scatter-gather */ 446 unsignedshortsglist_len; /* size of malloc'd scatter-gather list */ 447 unsignedshortabort_reason; /* If the mid-level code requests an 448 abort, this is the reason. */ 449 unsignedbufflen; /* Size of data buffer */ 450 void *buffer; /* Data buffer */ 451
452 unsignedunderflow; /* Return error if less than this amount is 453 transfered */ 454
455 unsignedtransfersize; /* How much we are guaranteed to transfer with 456 each SCSI transfer (ie, between disconnect / 457 reconnects. Probably == sector size */ 458
459
460
461 structrequestrequest; /* A copy of the command we are working on*/ 462
463 unsignedcharsense_buffer[16]; /* Sense for this command, if needed*/ 464
465
466 intretries;
467 intallowed;
468 inttimeout_per_command, timeout_total, timeout;
469 /* 470 * We handle the timeout differently if it happens when a reset, 471 * abort, etc are in process. 472 */ 473
474 unsignedvolatilecharinternal_timeout;
475
476 unsignedflags;
477
478 /* These variables are for the cdrom only. Once we have variable size buffers 479 in the buffer cache, they will go away. */ 480 intthis_count;
481 /* End of special cdrom variables */ 482
483 /* Low-level done function - can be used by low-level driver to point 484 to completion function. Not used by mid/upper level code. */ 485 void (*scsi_done)(structscsi_cmnd *);
486 void (*done)(structscsi_cmnd *); /* Mid-level done function */ 487
488 /* The following fields can be written to by the host specific code. 489 Everything else should be left alone. */ 490
491 Scsi_PointerSCp; /* Scratchpad used by some host adapters */ 492
493 unsignedchar * host_scribble; /* The host adapter is allowed to 494 call scsi_malloc and get some memory 495 and hang it here. The host adapter 496 is also expected to call scsi_free 497 to release this memory. (The memory 498 obtained by scsi_malloc is guaranteed 499 to be at an address < 16Mb). */ 500
501 intresult; /* Status code from lower level driver */ 502
503 unsignedchartag; /* SCSI-II queued command tag */ 504 unsignedlongpid; /* Process ID, starts at 0 */ 505 }Scsi_Cmnd;
506
507 /* 508 scsi_abort aborts the current command that is executing on host host. 509 The error code, if non zero is returned in the host byte, otherwise 510 DID_ABORT is returned in the hostbyte. 511 */ 512
513 externintscsi_abort (Scsi_Cmnd *, intcode, intpid);
514
515 externvoidscsi_do_cmd (Scsi_Cmnd *, constvoid *cmnd ,
516 void *buffer, unsignedbufflen, void (*done)(structscsi_cmnd *),
517 inttimeout, intretries);
518
519
520 externScsi_Cmnd * allocate_device(structrequest **, Scsi_Device *, int);
521
522 externScsi_Cmnd * request_queueable(structrequest *, Scsi_Device *);
523 externintscsi_reset (Scsi_Cmnd *);
524
525 externintmax_scsi_hosts;
526
527 #ifdefined(MAJOR_NR) && (MAJOR_NR != SCSI_TAPE_MAJOR)
528 staticScsi_Cmnd * end_scsi_request(Scsi_Cmnd * SCpnt, intuptodate, intsectors)
/* */ 529 { 530 structrequest * req;
531 structbuffer_head * bh;
532
533 req = &SCpnt->request;
534 req->errors = 0;
535 if (!uptodate) { 536 printk(DEVICE_NAME " I/O error: dev %04x, sector %lu\n",
537 req->dev,req->sector);
538 } 539
540 do{ 541 if ((bh = req->bh) != NULL) { 542 req->bh = bh->b_reqnext;
543 req->nr_sectors -= bh->b_size >> 9;
544 req->sector += bh->b_size >> 9;
545 bh->b_reqnext = NULL;
546 bh->b_uptodate = uptodate;
547 unlock_buffer(bh);
548 sectors -= bh->b_size >> 9;
549 if ((bh = req->bh) != NULL) { 550 req->current_nr_sectors = bh->b_size >> 9;
551 if (req->nr_sectors < req->current_nr_sectors) { 552 req->nr_sectors = req->current_nr_sectors;
553 printk("end_scsi_request: buffer-list destroyed\n");
554 } 555 } 556 } 557 }while(sectors && bh);
558 if (req->bh){ 559 req->buffer = bh->b_data;
560 returnSCpnt;
561 };
562 DEVICE_OFF(req->dev);
563 if (req->sem != NULL) { 564 up(req->sem);
565 } 566 req->dev = -1;
567 wake_up(&wait_for_request);
568 wake_up(&SCpnt->device->device_wait);
569 returnNULL;
570 } 571
572
573 /* This is just like INIT_REQUEST, but we need to be aware of the fact 574 that an interrupt may start another request, so we run this with interrupts 575 turned off */ 576
577 #defineINIT_SCSI_REQUEST \
578 if (!CURRENT) {\
579 CLEAR_INTR; \
580 sti(); \
581 return; \
582 } \
583 if (MAJOR(CURRENT->dev) != MAJOR_NR) \
584 panic(DEVICE_NAME ": request list destroyed"); \
585 if (CURRENT->bh) { \
586 if (!CURRENT->bh->b_lock) \
587 panic(DEVICE_NAME ": block not locked"); \
588 } 589 #endif 590
591 #defineSCSI_SLEEP(QUEUE, CONDITION) { \
592 if (CONDITION) { \
593 structwait_queuewait = {current, NULL}; \
594 add_wait_queue(QUEUE, &wait); \
595 sleep_repeat: \
596 current->state = TASK_UNINTERRUPTIBLE; \
597 if (CONDITION) { \
598 schedule(); \
599 gotosleep_repeat; \
600 } \
601 remove_wait_queue(QUEUE, &wait); \
602 current->state = TASK_RUNNING; \
603 }; } 604
605 #endif