Annotation of linux/kernel/blk_drv/scsi/scsi.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     scsi.c Copyright (C) 1992 Drew Eckhardt 
                      3:  *     generic mid-level SCSI driver by
                      4:  *             Drew Eckhardt 
                      5:  *
                      6:  *     <[email protected]>
                      7:  */
                      8: #include <linux/config.h>
                      9: 
                     10: #ifdef CONFIG_SCSI
                     11: #include <asm/system.h>
                     12: #include <linux/sched.h>
                     13: #include <linux/timer.h>
                     14: #include <linux/string.h>
                     15: 
                     16: #include "scsi.h"
                     17: #include "hosts.h"
                     18: 
                     19: #ifdef CONFIG_BLK_DEV_SD
                     20: #include "sd.h"
                     21: #endif
                     22: 
                     23: #ifdef CONFIG_BLK_DEV_ST
                     24: #include "st.h"
                     25: #endif
                     26: 
                     27: /*
                     28: static const char RCSid[] = "$Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/scsi.c,v 1.1 1992/04/24 18:01:50 root Exp root $";
                     29: */
                     30: 
                     31: #define INTERNAL_ERROR (printk ("Internal error in file %s, line %s.\n", __FILE__, __LINE__), panic(""))
                     32: 
                     33: static void scsi_done (int host, int result);
                     34: static void update_timeout (void);
                     35: 
                     36: static int time_start;
                     37: static int time_elapsed;
                     38: 
                     39: /*
                     40:        global variables : 
                     41:        NR_SCSI_DEVICES is the number of SCSI devices we have detected, 
                     42:        scsi_devices an array of these specifing the address for each 
                     43:        (host, id, LUN)
                     44: */
                     45:        
                     46: int NR_SCSI_DEVICES=0;
                     47: Scsi_Device scsi_devices[MAX_SCSI_DEVICE];
                     48: 
                     49: #define SENSE_LENGTH 255
                     50: /*
                     51:        As the scsi do command functions are inteligent, and may need to 
                     52:        redo a command, we need to keep track of the last command 
                     53:        executed on each one.
                     54: */
                     55: 
                     56: #define WAS_RESET      0x01
                     57: #define WAS_TIMEDOUT   0x02
                     58: #define WAS_SENSE      0x04
                     59: #define IS_RESETTING   0x08
                     60: 
                     61: static Scsi_Cmnd last_cmnd[MAX_SCSI_HOSTS];
                     62: static int last_reset[MAX_SCSI_HOSTS];
                     63: 
                     64: /*
                     65:        This is the number  of clock ticks we should wait before we time out 
                     66:        and abort the command.  This is for  where the scsi.c module generates 
                     67:        the command, not where it originates from a higher level, in which
                     68:        case the timeout is specified there.
                     69:        
                     70: 
                     71:        ABORT_TIMEOUT and RESET_TIMEOUT are the timeouts for RESET and ABORT
                     72:        respectively.
                     73: */
                     74: #ifdef DEBUG
                     75:        #define SCSI_TIMEOUT 500
                     76: #else
                     77:        #define SCSI_TIMEOUT 100
                     78: #endif
                     79: #ifdef DEBUG
                     80:        #define SENSE_TIMEOUT SCSI_TIMEOUT
                     81:        #define ABORT_TIMEOUT SCSI_TIMEOUT
                     82:        #define RESET_TIMEOUT SCSI_TIMEOUT
                     83: #else
                     84: 
                     85:        #define SENSE_TIMEOUT 50
                     86:        #define RESET_TIMEOUT 50
                     87:        #define ABORT_TIMEOUT 50
                     88:        #define MIN_RESET_DELAY 25
                     89: 
                     90: #endif
                     91: /*
                     92:        As the actual SCSI command runs in the background, we must set up a 
                     93:        flag that tells scan_scsis() when the result it has is valid.  
                     94:        scan_scsis can set the_result to -1, and watch for it to become the 
                     95:        actual return code for that call.  the scan_scsis_done function() is 
                     96:        our user specified completion function that is passed on to the  
                     97:        scsi_do_cmd() function.
                     98: */
                     99: 
                    100: static int the_result;
                    101: static unsigned char sense_buffer[SENSE_LENGTH];
                    102: static void scan_scsis_done (int host, int result)
                    103:        {
                    104:        
                    105: #ifdef DEBUG
                    106:        printk ("scan_scsis_done(%d, %06x\n\r", host, result);
                    107: #endif 
                    108:        the_result = result;
                    109:        }
                    110: /*
                    111:        Detecting SCSI devices :        
                    112:        We scan all present host adapter's busses,  from ID 0 to ID 6.  
                    113:        We use the INQUIRY command, determine device type, and pass the ID / 
                    114:        lun address of all sequential devices to the tape driver, all random 
                    115:        devices to the disk driver.
                    116: */
                    117: 
                    118: static void scan_scsis (void)
                    119:        {
                    120:         int host_nr , dev, lun, type, maxed;
                    121:        static unsigned char scsi_cmd [12];
                    122:        static unsigned char scsi_result [256];
                    123: 
                    124:         for (host_nr = 0; host_nr < MAX_SCSI_HOSTS; ++host_nr)
                    125:                 if (scsi_hosts[host_nr].present)
                    126:                        {
                    127:                        for (dev = 0; dev < 7; ++dev)
                    128:                                if (scsi_hosts[host_nr].this_id != dev)
                    129:                                 #ifdef MULTI_LUN
                    130:                                for (lun = 0; lun < 8; ++lun)
                    131:                                        {
                    132:                                #else
                    133:                                        {
                    134:                                        lun = 0;
                    135:                                #endif
                    136:                                        /* Build an INQUIRY command block.  */
                    137: 
                    138:                                        scsi_cmd[0] = INQUIRY;
                    139:                                        scsi_cmd[1] = (lun << 5) & 0xe0;
                    140:                                        scsi_cmd[2] = 0;
                    141:                                        scsi_cmd[3] = 0;
                    142:                                        scsi_cmd[4] = 255;
                    143:                                        scsi_cmd[5] = 0;
                    144:                                        the_result = -1;        
                    145: #ifdef DEBUG
                    146:        memset ((void *) scsi_result , 0, 255);
                    147: #endif 
                    148:                                        scsi_do_cmd (host_nr, dev, (void *)  scsi_cmd, (void *)                                                             
                    149:                                                 scsi_result, 256,  scan_scsis_done, 
                    150:                                                 SCSI_TIMEOUT, sense_buffer, 3);
                    151:                                        
                    152:                                        /* Wait for valid result */
                    153: 
                    154:                                        while (the_result < 0);
                    155:        
                    156: 
                    157:                                         if (!the_result)
                    158:                                                {
                    159:                                                 scsi_devices[NR_SCSI_DEVICES].
                    160:                                                        host_no = host_nr;
                    161:                                                 scsi_devices[NR_SCSI_DEVICES].
                    162:                                                        id = dev;
                    163:                                                 scsi_devices[NR_SCSI_DEVICES].
                    164:                                                        lun = lun;
                    165:                                                 scsi_devices[NR_SCSI_DEVICES].
                    166:                                                        removable = (0x80 & 
                    167:                                                        scsi_result[1]) >> 7;
                    168: 
                    169: 
                    170: 
                    171: /* 
                    172:        Currently, all sequential devices are assumed to be tapes,
                    173:        all random devices disk, with the appropriate read only 
                    174:        flags set for ROM / WORM treated as RO.
                    175: */ 
                    176: 
                    177:                                                 switch (type = scsi_result[0])
                    178:                                                        {
                    179:                                                         case TYPE_TAPE:
                    180:                                                         case TYPE_DISK:
                    181:                                                                scsi_devices[NR_SCSI_DEVICES].writeable = 1;
                    182:                                                                 break;
                    183:                                                         case TYPE_WORM:
                    184:                                                         case TYPE_ROM:
                    185:                                                                scsi_devices[NR_SCSI_DEVICES].writeable = 0;
                    186:                                                                 break;
                    187:                                                         default:
                    188:                                                                 type = -1;
                    189:                                                         }
                    190: 
                    191:                                                 scsi_devices[NR_SCSI_DEVICES].random = (type == TYPE_TAPE) ? 0 : 1;
                    192: 
                    193:                                                 maxed = 0;
                    194:                                                 switch (type)
                    195:                                                        {
                    196:                                                         case -1:
                    197:                                                                break;
                    198:                                                         case TYPE_TAPE:
                    199:                                                                printk("Detected scsi tape at host %d, ID  %d, lun %d \n", host_nr, dev, lun);
                    200: #ifdef CONFIG_BLK_DEV_ST
                    201:                                                                 if (!(maxed = (NR_ST == MAX_ST)))
                    202:                                                                                 scsi_tapes[NR_ST].device = &scsi_devices[NR_SCSI_DEVICES];
                    203: #endif
                    204:                                                         default:
                    205:                                                                printk("Detected scsi disk at host %d, ID  %d, lun %d \n", host_nr, dev, lun);
                    206: #ifdef CONFIG_BLK_DEV_SD
                    207:                                                                        if (!(maxed = (NR_SD >= MAX_SD)))
                    208:                                                                                rscsi_disks[NR_SD].device = &scsi_devices[NR_SCSI_DEVICES];
                    209: #endif
                    210:                                                                 }
                    211: 
                    212:                                                         if (maxed)
                    213:                                                                 {
                    214:                                                                 printk ("Already have detected maximum number of SCSI %ss Unable to \n"
                    215:                                                                         "add drive at SCSI host %s, ID %d, LUN %d\n\r", (type == TYPE_TAPE) ?
                    216:                                                                         "tape" : "disk", scsi_hosts[host_nr].name,
                    217:                                                                         dev, lun);
                    218:                                                                 type = -1;
                    219:                                                                 break;
                    220:                                                                 }
                    221: 
                    222:                                                         else if (type != -1)
                    223:                                                                 {
                    224:                                                                 if (type == TYPE_TAPE)
                    225: #ifdef CONFIG_BLK_DEV_ST
                    226:                                                                        ++NR_ST;
                    227: #else
                    228: ;
                    229: #endif
                    230: 
                    231:                                                                 else
                    232: #ifdef CONFIG_BLK_DEV_SD
                    233:                                                                         ++NR_SD;
                    234: #else
                    235: ;
                    236: #endif
                    237:                                                                 }
                    238:                                                        ++NR_SCSI_DEVICES;
                    239:                                                         }       /* if result == DID_OK ends */
                    240:                                         }       /* for lun ends */
                    241:                         }              /* if present */  
                    242: 
                    243:        printk("Detected "
                    244: #ifdef CONFIG_BLK_DEV_SD
                    245: "%d disk%s "
                    246: #endif
                    247: 
                    248: #ifdef CONFIG_BLK_DEV_ST
                    249: "%d tape%s "
                    250: #endif
                    251: 
                    252: "total.\n",  
                    253: 
                    254: #ifdef CONFIG_BLK_DEV_SD
                    255: NR_SD, (NR_SD != 1) ? "s" : ""
                    256: #ifdef CONFIG_BLK_DEV_ST 
                    257: ,
                    258: #endif
                    259: #endif
                    260: 
                    261: #ifdef CONFIG_BLK_DEV_ST
                    262: NR_ST, (NR_ST != 1) ? "s" : ""
                    263: #endif
                    264: );
                    265:         }       /* scan_scsis  ends */
                    266: 
                    267: /*
                    268:        We handle the timeout differently if it happens when a reset, 
                    269:        abort, etc are in process. 
                    270: */
                    271: 
                    272: static unsigned char internal_timeout[MAX_SCSI_HOSTS];
                    273: 
                    274: /* Flag bits for the internal_timeout array */
                    275: 
                    276: #define NORMAL_TIMEOUT 0
                    277: #define IN_ABORT 1
                    278: #define IN_RESET 2
                    279: /*
                    280:        This is our time out function, called when the timer expires for a 
                    281:        given host adapter.  It will attempt to abort the currently executing 
                    282:        command, that failing perform a kernel panic.
                    283: */ 
                    284: 
                    285: static void scsi_times_out (int host)
                    286:        {
                    287:        
                    288:        switch (internal_timeout[host] & (IN_ABORT | IN_RESET))
                    289:                {
                    290:                case NORMAL_TIMEOUT:
                    291:                        printk("SCSI host %d timed out - aborting command \r\n",
                    292:                                host);
                    293:                        
                    294:                        if (!scsi_abort (host, DID_TIME_OUT))
                    295:                                return;                         
                    296:                case IN_ABORT:
                    297:                        printk("SCSI host %d abort() timed out - reseting \r\n",
                    298:                                host);
                    299:                        if (!scsi_reset (host)) 
                    300:                                return;
                    301:                case IN_RESET:
                    302:                case (IN_ABORT | IN_RESET):
                    303:                        printk("Unable to reset scsi host %d\r\n",host);
                    304:                        panic("");
                    305:                default:
                    306:                        INTERNAL_ERROR;
                    307:                }
                    308:                                        
                    309:        }
                    310: 
                    311: /*
                    312:        This is inline because we have stack problemes if we recurse to deeply.
                    313: */
                    314:                         
                    315: static void internal_cmnd (int host,  unsigned char target, const void *cmnd , 
                    316:                  void *buffer, unsigned bufflen, void (*done)(int,int))
                    317:        {
                    318:        int temp;
                    319: 
                    320: #ifdef DEBUG_DELAY     
                    321:        int clock;
                    322: #endif
                    323: 
                    324:        if ((host < 0) ||  (host > MAX_SCSI_HOSTS))
                    325:                panic ("Host number in internal_cmnd() is out of range.\n");
                    326: 
                    327: 
                    328: /*
                    329:        We will wait MIN_RESET_DELAY clock ticks after the last reset so 
                    330:        we can avoid the drive not being ready.
                    331: */ 
                    332: temp = last_reset[host];
                    333: while (jiffies < temp);
                    334: 
                    335: host_timeout[host] = last_cmnd[host].timeout_per_command;
                    336: update_timeout();
                    337: 
                    338: /*
                    339:        We will use a queued command if possible, otherwise we will emulate the
                    340:        queing and calling of completion function ourselves. 
                    341: */
                    342: #ifdef DEBUG
                    343:        printk("internal_cmnd (host = %d, target = %d, command = %08x, buffer =  %08x, \n"
                    344:                "bufflen = %d, done = %08x)\n", host, target, cmnd, buffer, bufflen, done);
                    345: #endif
                    346: 
                    347:        
                    348:         if (scsi_hosts[host].can_queue)
                    349:                {
                    350: #ifdef DEBUG
                    351:        printk("queuecommand : routine at %08x\n", 
                    352:                scsi_hosts[host].queuecommand);
                    353: #endif
                    354:                 scsi_hosts[host].queuecommand (target, cmnd, buffer, bufflen, 
                    355:                                               done);
                    356:                }
                    357:        else
                    358:                {
                    359: 
                    360: #ifdef DEBUG
                    361:        printk("command() :  routine at %08x\n", scsi_hosts[host].command);
                    362: #endif
                    363:                temp=scsi_hosts[host].command (target, cmnd, buffer, bufflen);
                    364: 
                    365: #ifdef DEBUG_DELAY
                    366:        clock = jiffies + 400;
                    367:        while (jiffies < clock);
                    368:        printk("done(host = %d, result = %04x) : routine at %08x\n", host, temp, done);
                    369: #endif
                    370:                done(host, temp);
                    371:                }       
                    372: #ifdef DEBUG
                    373:        printk("leaving internal_cmnd()\n");
                    374: #endif
                    375:        }       
                    376: 
                    377: static void scsi_request_sense (int host, unsigned char target, 
                    378:                                        unsigned char lun)
                    379:        {
                    380:        cli();
                    381:        host_timeout[host] = SENSE_TIMEOUT;
                    382:        update_timeout();
                    383:        last_cmnd[host].flags |= WAS_SENSE;
                    384:        sti();
                    385:        
                    386:        last_cmnd[host].sense_cmnd[1] = lun << 5;       
                    387: 
                    388:        internal_cmnd (host, target, (void *) last_cmnd[host].sense_cmnd, 
                    389:                       (void *) last_cmnd[host].sense_buffer, SENSE_LENGTH,
                    390:                       scsi_done);
                    391:        }
                    392: 
                    393: 
                    394: 
                    395: 
                    396: 
                    397: /*
                    398:        scsi_do_cmd sends all the commands out to the low-level driver.  It 
                    399:        handles the specifics required for each low level driver - ie queued 
                    400:        or non queud.  It also prevents conflicts when different high level 
                    401:        drivers go for the same host at the same time.
                    402: */
                    403: 
                    404: void scsi_do_cmd (int host,  unsigned char target, const void *cmnd , 
                    405:                  void *buffer, unsigned bufflen, void (*done)(int,int),
                    406:                  int timeout, unsigned  char *sense_buffer, int retries 
                    407:                   )
                    408:         {
                    409:        int ok = 0;
                    410: 
                    411: #ifdef DEBUG
                    412:        int i;  
                    413:        printk ("scsi_do_cmd (host = %d, target = %d, buffer =%08x, "
                    414:                "bufflen = %d, done = %08x, timeout = %d, retries = %d)\n"
                    415:                "command : " , host, target, buffer, bufflen, done, timeout, retries);
                    416:        for (i = 0; i < 10; ++i)
                    417:                printk ("%02x  ", ((unsigned char *) cmnd)[i]); 
                    418:        printk("\n");
                    419: #endif
                    420:        
                    421:        if ((host  >= MAX_SCSI_HOSTS) || !scsi_hosts[host].present)
                    422:                {
                    423:                printk ("Invalid or not present host number. %d\n", host);
                    424:                panic("");
                    425:                }
                    426: 
                    427:        
                    428: /*
                    429:        We must prevent reentrancy to the lowlevel host driver.  This prevents 
                    430:        it - we enter a loop until the host we want to talk to is not busy.   
                    431:        Race conditions are prevented, as interrupts are disabled inbetween the
                    432:        time we check for the host being not busy, and the time we mark it busy
                    433:        ourselves.
                    434: */
                    435: 
                    436:        do      {
                    437:                cli();
                    438:                if (host_busy[host])
                    439:                        {
                    440:                        sti();
                    441: #ifdef DEBUG
                    442:                        printk("Host %d is busy.\n"     );
                    443: #endif
                    444:                        while (host_busy[host]);
                    445: #ifdef DEBUG
                    446:                        printk("Host %d is no longer busy.");
                    447: #endif
                    448:                        }
                    449:                else
                    450:                        {
                    451:                        host_busy[host] = 1;
                    452:                        ok = 1;
                    453:                        sti();
                    454:                        }
                    455:                } while (!ok);
                    456:                
                    457: 
                    458: /*
                    459:        Our own function scsi_done (which marks the host as not busy, disables 
                    460:        the timeout counter, etc) will be called by us or by the 
                    461:        scsi_hosts[host].queuecommand() function needs to also call
                    462:        the completion function for the high level driver.
                    463: 
                    464: */
                    465: 
                    466:        memcpy ((void *) last_cmnd[host].cmnd , (void *) cmnd, 10);
                    467:        last_cmnd[host].host = host;
                    468:        last_cmnd[host].target = target;
                    469:        last_cmnd[host].lun = (last_cmnd[host].cmnd[1] >> 5);
                    470:        last_cmnd[host].bufflen = bufflen;
                    471:        last_cmnd[host].buffer = buffer;
                    472:        last_cmnd[host].sense_buffer = sense_buffer;
                    473:        last_cmnd[host].flags=0;
                    474:        last_cmnd[host].retries=0;
                    475:        last_cmnd[host].allowed=retries;
                    476:        last_cmnd[host].done = done;
                    477:        last_cmnd[host].timeout_per_command = timeout;
                    478:                                
                    479:        /* Start the timer ticking.  */
                    480: 
                    481:        internal_timeout[host] = 0;
                    482:        internal_cmnd (host,  target, cmnd , buffer, bufflen, scsi_done);
                    483: 
                    484: #ifdef DEBUG
                    485:        printk ("Leaving scsi_do_cmd()\n");
                    486: #endif
                    487:         }
                    488: 
                    489: 
                    490: /*
                    491:        The scsi_done() function disables the timeout timer for the scsi host, 
                    492:        marks the host as not busy, and calls the user specified completion 
                    493:        function for that host's current command.
                    494: */
                    495: 
                    496: static void reset (int host)
                    497:        {
                    498:        #ifdef DEBUG
                    499:                printk("reset(%d)\n", host);
                    500:        #endif
                    501: 
                    502:        last_cmnd[host].flags |= (WAS_RESET | IS_RESETTING);
                    503:        scsi_reset(host);
                    504: 
                    505:        #ifdef DEBUG
                    506:                printk("performing request sense\n");
                    507:        #endif
                    508: 
                    509:        scsi_request_sense (host, last_cmnd[host].target, last_cmnd[host].lun);
                    510:        }
                    511:        
                    512:        
                    513: 
                    514: static int check_sense (int host)
                    515:        {
                    516:        if (((sense_buffer[0] & 0x70) >> 4) == 7)
                    517:                switch (sense_buffer[2] & 0xf)
                    518:                {
                    519:                case NO_SENSE:
                    520:                case RECOVERED_ERROR:
                    521:                        return 0;
                    522: 
                    523:                case ABORTED_COMMAND:
                    524:                case NOT_READY:
                    525:                case UNIT_ATTENTION:    
                    526:                        return SUGGEST_RETRY;   
                    527:        
                    528:                /* these three are not supported */     
                    529:                case COPY_ABORTED:
                    530:                case VOLUME_OVERFLOW:
                    531:                case MISCOMPARE:
                    532:        
                    533:                case MEDIUM_ERROR:
                    534:                        return SUGGEST_REMAP;
                    535:                case BLANK_CHECK:
                    536:                case DATA_PROTECT:
                    537:                case HARDWARE_ERROR:
                    538:                case ILLEGAL_REQUEST:
                    539:                default:
                    540:                        return SUGGEST_ABORT;
                    541:                }
                    542:        else
                    543:                return SUGGEST_RETRY;   
                    544:        }       
                    545: 
                    546: static void scsi_done (int host, int result)
                    547:        {
                    548:        int status=0;
                    549:        int exit=0;
                    550:        int checked;
                    551:        int oldto;
                    552:        oldto = host_timeout[host];
                    553:        host_timeout[host] = 0;
                    554:        update_timeout();
                    555: 
                    556: #define FINISHED 0
                    557: #define MAYREDO  1
                    558: #define REDO    3
                    559: 
                    560: #ifdef DEBUG
                    561:        printk("In scsi_done(host = %d, result = %06x)\n", host, result);
                    562: #endif
                    563:        if (host > MAX_SCSI_HOSTS || host  < 0) 
                    564:                {
                    565:                host_timeout[host] = 0;
                    566:                update_timeout();
                    567:                panic("scsi_done() called with invalid host number.\n");
                    568:                }
                    569: 
                    570:        switch (host_byte(result))      
                    571:        {
                    572:        case DID_OK:
                    573:                if (last_cmnd[host].flags & IS_RESETTING)
                    574:                        {
                    575:                        last_cmnd[host].flags &= ~IS_RESETTING;
                    576:                        status = REDO;
                    577:                        break;
                    578:                        }
                    579: 
                    580:                if (status_byte(result) && (last_cmnd[host].flags & 
                    581:                    WAS_SENSE)) 
                    582:                        {
                    583:                        last_cmnd[host].flags &= ~WAS_SENSE;
                    584:                        cli();
                    585:                        internal_timeout[host] &= ~SENSE_TIMEOUT;
                    586:                        sti();
                    587: 
                    588:                        if (!(last_cmnd[host].flags & WAS_RESET)) 
                    589:                                reset(host);
                    590:                        else
                    591:                                {
                    592:                                exit = (DRIVER_HARD | SUGGEST_ABORT);
                    593:                                status = FINISHED;
                    594:                                }
                    595:                        }
                    596:                else switch(msg_byte(result))
                    597:                        {
                    598:                        case COMMAND_COMPLETE:
                    599:                        switch (status_byte(result))
                    600:                        {
                    601:                        case GOOD:
                    602:                                if (last_cmnd[host].flags & WAS_SENSE)
                    603:                                        {
                    604: #ifdef DEBUG
                    605:        printk ("In scsi_done, GOOD status, COMMAND COMPLETE, parsing sense information.\n");
                    606: #endif
                    607: 
                    608:                                        last_cmnd[host].flags &= ~WAS_SENSE;
                    609:                                        cli();
                    610:                                        internal_timeout[host] &= ~SENSE_TIMEOUT;
                    611:                                        sti();
                    612:        
                    613:                                        switch (checked = check_sense(host))
                    614:                                        {
                    615:                                        case 0: 
                    616: #ifdef DEBUG
                    617:        printk("NO SENSE.  status = REDO\n");
                    618: #endif
                    619: 
                    620:                                                host_timeout[host] = oldto;
                    621:                                                update_timeout();
                    622:                                                status = REDO;
                    623:                                                break;
                    624:                                        case SUGGEST_REMAP:                     
                    625:                                        case SUGGEST_RETRY: 
                    626: #ifdef DEBUG
                    627:        printk("SENSE SUGGEST REMAP or SUGGEST RETRY - status = MAYREDO\n");
                    628: #endif
                    629: 
                    630:                                                status = MAYREDO;
                    631:                                                exit = SUGGEST_RETRY;
                    632:                                                break;
                    633:                                        case SUGGEST_ABORT:
                    634: #ifdef DEBUG
                    635:        printk("SENSE SUGGEST ABORT - status = FINISHED");
                    636: #endif
                    637: 
                    638:                                                status = FINISHED;
                    639:                                                exit =  DRIVER_SENSE;
                    640:                                                break;
                    641:                                        default:
                    642:                                                printk ("Internal error %s %s \n", __FILE__, 
                    643:                                                        __LINE__);
                    644:                                        }                          
                    645:                                        }       
                    646:                                else
                    647:                                        {
                    648: #ifdef DEBUG
                    649:        printk("COMMAND COMPLETE message returned, status = FINISHED. \n");
                    650: #endif
                    651: 
                    652:                                        exit =  DRIVER_OK;
                    653:                                        status = FINISHED;
                    654:                                        }
                    655:                                break;  
                    656: 
                    657:                        case CHECK_CONDITION:
                    658: 
                    659: #ifdef DEBUG
                    660:        printk("CHECK CONDITION message returned, performing request sense.\n");
                    661: #endif
                    662: 
                    663:                                scsi_request_sense (host, last_cmnd[host].target, last_cmnd[host].lun);
                    664:                                break;          
                    665:                        
                    666:                        case CONDITION_GOOD:
                    667:                        case INTERMEDIATE_GOOD:
                    668:                        case INTERMEDIATE_C_GOOD:
                    669: #ifdef DEBUG
                    670:        printk("CONDITION GOOD, INTERMEDIATE GOOD, or INTERMEDIATE CONDITION GOOD recieved and ignored. \n");
                    671: #endif
                    672:                                break;
                    673:                                
                    674:                        case BUSY:
                    675: #ifdef DEBUG
                    676:        printk("BUSY message returned, performing REDO");
                    677: #endif
                    678:                                host_timeout[host] = oldto;
                    679:                                update_timeout();
                    680:                                status = REDO;
                    681:                                break;
                    682: 
                    683:                        case RESERVATION_CONFLICT:
                    684:                                reset(host);
                    685:                                exit = DRIVER_SOFT | SUGGEST_ABORT;
                    686:                                status = MAYREDO;
                    687:                                break;
                    688:                        default:
                    689:                                printk ("Internal error %s %s \n"
                    690:                                        "status byte = %d \n", __FILE__, 
                    691:                                        __LINE__, status_byte(result));
                    692:                                
                    693:                        }
                    694:                        break;
                    695:                        default:
                    696:                                panic ("unsupported message byte recieved.");
                    697:                        }
                    698:                        break;
                    699:        case DID_TIME_OUT:      
                    700: #ifdef DEBUG
                    701:        printk("Host returned DID_TIME_OUT - ");
                    702: #endif
                    703: 
                    704:                if (last_cmnd[host].flags & WAS_TIMEDOUT)       
                    705:                        {
                    706: #ifdef DEBUG
                    707:        printk("Aborting\n");
                    708: #endif 
                    709:                        exit = (DRIVER_TIMEOUT | SUGGEST_ABORT);
                    710:                        }               
                    711:                else 
                    712:                        {
                    713: #ifdef DEBUG
                    714:                        printk ("Retrying.\n");
                    715: #endif
                    716:                        last_cmnd[host].flags  |= WAS_TIMEDOUT;
                    717:                        status = REDO;
                    718:                        }
                    719:                break;
                    720:        case DID_BUS_BUSY:
                    721:        case DID_PARITY:
                    722:                status = REDO;
                    723:                break;
                    724:        case DID_NO_CONNECT:
                    725: #ifdef DEBUG
                    726:                printk("Couldn't connect.\n");
                    727: #endif
                    728:                exit  = (DRIVER_HARD | SUGGEST_ABORT);
                    729:                break;
                    730:        case DID_ERROR: 
                    731:                status = MAYREDO;
                    732:                exit = (DRIVER_HARD | SUGGEST_ABORT);
                    733:                break;
                    734:        case DID_BAD_TARGET:
                    735:        case DID_ABORT:
                    736:                exit = (DRIVER_INVALID | SUGGEST_ABORT);
                    737:                break;  
                    738:        default :               
                    739:                exit = (DRIVER_ERROR | SUGGEST_DIE);
                    740:        }
                    741: 
                    742:        switch (status) 
                    743:                {
                    744:                case FINISHED:
                    745:                        break;
                    746:                case MAYREDO:
                    747: 
                    748: #ifdef DEBUG
                    749:        printk("In MAYREDO, allowing %d retries, have %d\n\r",
                    750:               last_cmnd[host].allowed, last_cmnd[host].retries);
                    751: #endif
                    752: 
                    753:                        if ((++last_cmnd[host].retries) < last_cmnd[host].allowed)
                    754:                        {
                    755:                        if ((last_cmnd[host].retries >= (last_cmnd[host].allowed >> 1)) 
                    756:                            && !(last_cmnd[host].flags & WAS_RESET))
                    757:                                reset(host);
                    758:                                break;
                    759:                        
                    760:                        }
                    761:                        else
                    762:                                {
                    763:                                status = FINISHED;
                    764:                                break;
                    765:                                }
                    766:                        /* fall through to REDO */
                    767: 
                    768:                case REDO:
                    769:                        if (last_cmnd[host].flags & WAS_SENSE)                  
                    770:                                scsi_request_sense (host, last_cmnd[host].target,       
                    771:                               last_cmnd[host].lun);    
                    772:                        else    
                    773:                                internal_cmnd (host, last_cmnd[host].target,    
                    774:                                last_cmnd[host].cmnd,  
                    775:                                last_cmnd[host].buffer,   
                    776:                                last_cmnd[host].bufflen, scsi_done);                    
                    777:                        break;  
                    778:                default: 
                    779:                        INTERNAL_ERROR;
                    780:                }
                    781: 
                    782:        if (status == FINISHED) 
                    783:                {
                    784:                #ifdef DEBUG
                    785:                        printk("Calling done function - at address %08x\n", last_cmnd[host].done);
                    786:                #endif
                    787:                last_cmnd[host].done (host, (result | ((exit & 0xff) << 24)));
                    788:                host_busy[host] = 0;
                    789:                }
                    790: 
                    791: 
                    792: #undef FINISHED
                    793: #undef REDO
                    794: #undef MAYREDO
                    795:                
                    796:        }
                    797: 
                    798: /*
                    799:        The scsi_abort function interfaces with the abort() function of the host
                    800:        we are aborting, and causes the current command to not complete.  The 
                    801:        caller should deal with any error messages or status returned on the 
                    802:        next call.
                    803:        
                    804:        This will not be called rentrantly for a given host.
                    805: */
                    806:        
                    807: /*
                    808:        Since we're nice guys and specified that abort() and reset()
                    809:        can be non-reentrant.  The internal_timeout flags are used for
                    810:        this.
                    811: */
                    812: 
                    813: 
                    814: int scsi_abort (int host, int why)
                    815:        {
                    816:        int temp, oldto;
                    817:        
                    818:        while(1)        
                    819:                {
                    820:                cli();
                    821:                if (internal_timeout[host] & IN_ABORT) 
                    822:                        {
                    823:                        sti();
                    824:                        while (internal_timeout[host] & IN_ABORT);
                    825:                        }
                    826:                else
                    827:                        {       
                    828:                        internal_timeout[host] |= IN_ABORT;
                    829:                        host_timeout[host] = ABORT_TIMEOUT;     
                    830:                        update_timeout();
                    831: 
                    832:                        oldto = host_timeout[host];
                    833:                        
                    834:                        sti();
                    835:                        if (!host_busy[host] || !scsi_hosts[host].abort(why))
                    836:                                temp =  0;
                    837:                        else
                    838:                                temp = 1;
                    839:                        
                    840:                        cli();
                    841:                        internal_timeout[host] &= ~IN_ABORT;
                    842:                        host_timeout[host]=oldto;
                    843:                        update_timeout();
                    844:                        sti();
                    845:                        return temp;
                    846:                        }
                    847:                }       
                    848:        }
                    849: 
                    850: int scsi_reset (int host)
                    851:        {
                    852:        int temp, oldto;
                    853:        
                    854:        while (1) {
                    855:                cli();  
                    856:                if (internal_timeout[host] & IN_RESET)
                    857:                        {
                    858:                        sti();
                    859:                        while (internal_timeout[host] & IN_RESET);
                    860:                        }
                    861:                else
                    862:                        {
                    863:                        oldto = host_timeout[host];     
                    864:                        host_timeout[host] = RESET_TIMEOUT;     
                    865:                        update_timeout();       
                    866:                        internal_timeout[host] |= IN_RESET;
                    867:                                        
                    868:                        if (host_busy[host])
                    869:                                {       
                    870:                                sti();
                    871:                                if (!(last_cmnd[host].flags & IS_RESETTING) && !(internal_timeout[host] & IN_ABORT))
                    872:                                        scsi_abort(host, DID_RESET);
                    873: 
                    874:                                temp = scsi_hosts[host].reset();                        
                    875:                                }                               
                    876:                        else
                    877:                                {
                    878:                                host_busy[host]=1;
                    879:        
                    880:                                sti();
                    881:                                temp = scsi_hosts[host].reset();
                    882:                                last_reset[host] = jiffies;
                    883:                                host_busy[host]=0;
                    884:                                }
                    885:        
                    886:                        cli();
                    887:                        host_timeout[host] = oldto;             
                    888:                        update_timeout();
                    889:                        internal_timeout[host] &= ~IN_RESET;
                    890:                        sti();
                    891:                        return temp;    
                    892:                        }
                    893:                }
                    894:        }
                    895:                         
                    896: 
                    897: static void scsi_main_timeout(void)
                    898:        {
                    899:        /*
                    900:                We must not enter update_timeout with a timeout condition still pending.
                    901:        */
                    902: 
                    903:        int i, timed_out;
                    904: 
                    905:        do      {       
                    906:                cli();
                    907: 
                    908:        /*
                    909:                Find all timers such that they have 0 or negative (shouldn't happen)
                    910:                time remaining on them.
                    911:        */
                    912:                        
                    913:                for (i = timed_out = 0; i < MAX_SCSI_HOSTS; ++i)
                    914:                        if (host_timeout[i] != 0 && host_timeout[i] <= time_elapsed)
                    915:                                {
                    916:                                sti();
                    917:                                host_timeout[i] = 0;
                    918:                                scsi_times_out(i);
                    919:                                ++timed_out; 
                    920:                                }
                    921: 
                    922:                update_timeout();                               
                    923:                } while (timed_out);    
                    924:        sti();
                    925:        }
                    926: 
                    927: /*
                    928:        These are used to keep track of things. 
                    929: */
                    930: 
                    931: static int time_start, time_elapsed;
                    932: 
                    933: /*
                    934:        The strategy is to cause the timer code to call scsi_times_out()
                    935:        when the soonest timeout is pending.  
                    936: */
                    937:        
                    938: static void update_timeout(void)
                    939:        {
                    940:        int i, least, used;
                    941: 
                    942:        cli();
                    943: 
                    944: /* 
                    945:        Figure out how much time has passed since the last time the timeouts 
                    946:        were updated 
                    947: */
                    948:        used = (time_start) ? (jiffies - time_start) : 0;
                    949: 
                    950: /*
                    951:        Find out what is due to timeout soonest, and adjust all timeouts for
                    952:        the amount of time that has passed since the last time we called 
                    953:        update_timeout. 
                    954: */
                    955:        
                    956:        for (i = 0, least = 0xffffffff; i < MAX_SCSI_HOSTS; ++i)        
                    957:                if (host_timeout[i] > 0 && (host_timeout[i] -= used) < least)
                    958:                        least = host_timeout[i]; 
                    959: 
                    960: /*
                    961:        If something is due to timeout again, then we will set the next timeout 
                    962:        interrupt to occur.  Otherwise, timeouts are disabled.
                    963: */
                    964:        
                    965:        if (least != 0xffffffff)
                    966:                {
                    967:                time_start = jiffies;   
                    968:                timer_table[SCSI_TIMER].expires = (time_elapsed = least) + jiffies;     
                    969:                timer_active |= 1 << SCSI_TIMER;
                    970:                }
                    971:        else
                    972:                {
                    973:                timer_table[SCSI_TIMER].expires = time_start = time_elapsed = 0;
                    974:                timer_active &= ~(1 << SCSI_TIMER);
                    975:                }       
                    976:        sti();
                    977:        }               
                    978: /*
                    979:        scsi_dev_init() is our initialization routine, which inturn calls host 
                    980:        initialization, bus scanning, and sd/st initialization routines.  It 
                    981:        should be called from main().
                    982: */
                    983: 
                    984: static unsigned char generic_sense[6] = {REQUEST_SENSE, 0,0,0, 255, 0};                
                    985: void scsi_dev_init (void)
                    986:        {
                    987:        int i;
                    988: #ifdef FOO_ON_YOU
                    989:        return;
                    990: #endif 
                    991:        timer_table[SCSI_TIMER].fn = scsi_main_timeout;
                    992:        timer_table[SCSI_TIMER].expires = 0;
                    993: 
                    994:        scsi_init();            /* initialize all hosts */
                    995:        /*
                    996:                Set up sense command in each host structure.
                    997:        */
                    998: 
                    999:        for (i = 0; i < MAX_SCSI_HOSTS; ++i)
                   1000:                {
                   1001:                memcpy ((void *) last_cmnd[i].sense_cmnd, (void *) generic_sense,
                   1002:                        6);
                   1003:                last_reset[i] = 0;
                   1004:                }
                   1005:                                
                   1006:         scan_scsis();           /* scan for scsi devices */
                   1007: 
                   1008: #ifdef CONFIG_BLK_DEV_SD
                   1009:        sd_init();              /* init scsi disks */
                   1010: #endif
                   1011: 
                   1012: #ifdef CONFIG_BLK_DEV_ST
                   1013:         st_init();              /* init scsi tapes */
                   1014: #endif
                   1015:        }
                   1016: #endif

unix.superglobalmegacorp.com

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