Annotation of Gnu-Mach/linux/dev/drivers/scsi/scsi.h, revision 1.1

1.1     ! root        1: /*
        !             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:  *  <[email protected]>
        !             9:  *
        !            10:  *       Modified by Eric Youngdale [email protected] 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: #ifdef MACH
        !           595: #define SCSI_SLEEP(QUEUE, CONDITION) {             \
        !           596:     if (CONDITION) {                               \
        !           597:        struct wait_queue wait = { NULL, NULL};     \
        !           598:        add_wait_queue(QUEUE, &wait);               \
        !           599:        for(;;) {                                   \
        !           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:     }; }
        !           611: #else /* !MACH */
        !           612: #define SCSI_SLEEP(QUEUE, CONDITION) {             \
        !           613:     if (CONDITION) {                               \
        !           614:        struct wait_queue wait = { current, NULL};  \
        !           615:        add_wait_queue(QUEUE, &wait);               \
        !           616:        for(;;) {                                   \
        !           617:        current->state = TASK_UNINTERRUPTIBLE;      \
        !           618:        if (CONDITION) {                            \
        !           619:             if (intr_count)                        \
        !           620:                panic("scsi: trying to call schedule() in interrupt" \
        !           621:                      ", file %s, line %d.\n", __FILE__, __LINE__);  \
        !           622:            schedule();                 \
        !           623:         }                              \
        !           624:        else                            \
        !           625:            break;                      \
        !           626:        }                               \
        !           627:        remove_wait_queue(QUEUE, &wait);\
        !           628:        current->state = TASK_RUNNING;  \
        !           629:     }; }
        !           630: #endif /* !MACH */
        !           631: #endif
        !           632: 
        !           633: /*
        !           634:  * Overrides for Emacs so that we follow Linus's tabbing style.
        !           635:  * Emacs will notice this stuff at the end of the file and automatically
        !           636:  * adjust the settings for this buffer only.  This must remain at the end
        !           637:  * of the file.
        !           638:  * ---------------------------------------------------------------------------
        !           639:  * Local variables:
        !           640:  * c-indent-level: 4 
        !           641:  * c-brace-imaginary-offset: 0
        !           642:  * c-brace-offset: -4
        !           643:  * c-argdecl-indent: 4
        !           644:  * c-label-offset: -4
        !           645:  * c-continued-statement-offset: 4
        !           646:  * c-continued-brace-offset: 0
        !           647:  * indent-tabs-mode: nil
        !           648:  * tab-width: 8
        !           649:  * End:
        !           650:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.