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