Annotation of Gnu-Mach/linux/dev/drivers/scsi/seagate.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     seagate.c Copyright (C) 1992, 1993 Drew Eckhardt 
                      3:  *     low level scsi driver for ST01/ST02, Future Domain TMC-885, 
                      4:  *     TMC-950  by
                      5:  *
                      6:  *             Drew Eckhardt 
                      7:  *
                      8:  *     <[email protected]>
                      9:  *
                     10:  *     Note : TMC-880 boards don't work because they have two bits in 
                     11:  *             the status register flipped, I'll fix this "RSN"
                     12:  *
                     13:  *      This card does all the I/O via memory mapped I/O, so there is no need
                     14:  *      to check or allocate a region of the I/O address space.
                     15:  */
                     16: 
                     17: /*
                     18:  * Configuration : 
                     19:  * To use without BIOS -DOVERRIDE=base_address -DCONTROLLER=FD or SEAGATE
                     20:  * -DIRQ will override the default of 5.
                     21:  * Note: You can now set these options from the kernel's "command line".
                     22:  * The syntax is:
                     23:  *
                     24:  *     st0x=ADDRESS,IRQ                (for a Seagate controller)
                     25:  * or:
                     26:  *     tmc8xx=ADDRESS,IRQ              (for a TMC-8xx or TMC-950 controller)
                     27:  * eg:
                     28:  *     tmc8xx=0xC8000,15
                     29:  *
                     30:  * will configure the driver for a TMC-8xx style controller using IRQ 15
                     31:  * with a base address of 0xC8000.
                     32:  * 
                     33:  * -DFAST or -DFAST32 will use blind transfers where possible
                     34:  *
                     35:  * -DARBITRATE will cause the host adapter to arbitrate for the 
                     36:  *     bus for better SCSI-II compatibility, rather than just 
                     37:  *     waiting for BUS FREE and then doing its thing.  Should
                     38:  *     let us do one command per Lun when I integrate my 
                     39:  *     reorganization changes into the distribution sources.
                     40:  *
                     41:  * -DSLOW_HANDSHAKE will allow compatibility with broken devices that don't 
                     42:  *     handshake fast enough (ie, some CD ROM's) for the Seagate
                     43:  *     code.
                     44:  *
                     45:  * -DSLOW_RATE=x, x some number will let you specify a default 
                     46:  *     transfer rate if handshaking isn't working correctly.
                     47:  */
                     48: 
                     49: #ifdef MACH
                     50: #define ARBITRATE
                     51: #define SLOW_HANDSHAKE
                     52: #define FAST32
                     53: #endif
                     54: 
                     55: #include <linux/module.h>
                     56: 
                     57: #include <asm/io.h>
                     58: #include <asm/system.h>
                     59: #include <linux/signal.h>
                     60: #include <linux/sched.h>
                     61: #include <linux/string.h>
                     62: #include <linux/config.h>
                     63: #include <linux/proc_fs.h>
                     64: 
                     65: #include <linux/blk.h>
                     66: #include "scsi.h"
                     67: #include "hosts.h"
                     68: #include "seagate.h"
                     69: #include "constants.h"
                     70: #include<linux/stat.h>
                     71: 
                     72: struct proc_dir_entry proc_scsi_seagate = {
                     73:     PROC_SCSI_SEAGATE, 7, "seagate",
                     74:     S_IFDIR | S_IRUGO | S_IXUGO, 2
                     75: };
                     76: 
                     77: 
                     78: #ifndef IRQ
                     79: #define IRQ 5
                     80: #endif
                     81: 
                     82: #if (defined(FAST32) && !defined(FAST))
                     83: #define FAST
                     84: #endif
                     85: 
                     86: #if defined(SLOW_RATE) && !defined(SLOW_HANDSHAKE)
                     87: #define SLOW_HANDSHAKE
                     88: #endif
                     89: 
                     90: #if defined(SLOW_HANDSHAKE) && !defined(SLOW_RATE)
                     91: #define SLOW_RATE 50
                     92: #endif
                     93: 
                     94: 
                     95: #if defined(LINKED)
                     96: #undef LINKED          /* Linked commands are currently broken ! */
                     97: #endif
                     98: 
                     99: static int internal_command(unsigned char target, unsigned char lun,
                    100:                            const void *cmnd,
                    101:                         void *buff, int bufflen, int reselect);
                    102: 
                    103: static int incommand;                  /*
                    104:                                                set if arbitration has finished and we are 
                    105:                                                in some command phase.
                    106:                                        */
                    107: 
                    108: static const void *base_address = NULL;        /*
                    109:                                                Where the card ROM starts,
                    110:                                                used to calculate memory mapped
                    111:                                                register location.
                    112:                                        */
                    113: #ifdef notyet
                    114: static volatile int abort_confirm = 0;
                    115: #endif
                    116: 
                    117: static volatile void *st0x_cr_sr;       /*
                    118:                                                control register write,
                    119:                                                status register read.
                    120:                                                256 bytes in length.
                    121: 
                    122:                                                Read is status of SCSI BUS,
                    123:                                                as per STAT masks.
                    124: 
                    125:                                        */
                    126: 
                    127: 
                    128: static volatile void *st0x_dr;         /*
                    129:                                                data register, read write
                    130:                                                256 bytes in length.
                    131:                                        */
                    132: 
                    133: 
                    134: static volatile int st0x_aborted=0;    /* 
                    135:                                                set when we are aborted, ie by a time out, etc.
                    136:                                        */
                    137: 
                    138: static unsigned char controller_type = 0; /* set to SEAGATE for ST0x boards or FD for TMC-8xx boards */
                    139: static unsigned char irq = IRQ;
                    140:                        
                    141: #define retcode(result) (((result) << 16) | (message << 8) | status)                   
                    142: #define STATUS (*(volatile unsigned char *) st0x_cr_sr)
                    143: #define CONTROL STATUS 
                    144: #define DATA (*(volatile unsigned char *) st0x_dr)
                    145: 
                    146: void st0x_setup (char *str, int *ints) {
                    147:     controller_type = SEAGATE;
                    148:     base_address = (void *) ints[1];
                    149:     irq = ints[2];
                    150: }
                    151: 
                    152: void tmc8xx_setup (char *str, int *ints) {
                    153:     controller_type = FD;
                    154:     base_address = (void *) ints[1];
                    155:     irq = ints[2];
                    156: }
                    157:     
                    158: 
                    159: #ifndef OVERRIDE               
                    160: static const char *  seagate_bases[] = {
                    161:        (char *) 0xc8000, (char *) 0xca000, (char *) 0xcc000,
                    162:        (char *) 0xce000, (char *) 0xdc000, (char *) 0xde000
                    163: };
                    164: 
                    165: typedef struct {
                    166:        const char *signature ;
                    167:        unsigned offset;
                    168:        unsigned length;
                    169:        unsigned char type;
                    170: } Signature;
                    171:        
                    172: static const Signature signatures[] = {
                    173: #ifdef CONFIG_SCSI_SEAGATE
                    174: {"ST01 v1.7  (C) Copyright 1987 Seagate", 15, 37, SEAGATE},
                    175: {"SCSI BIOS 2.00  (C) Copyright 1987 Seagate", 15, 40, SEAGATE},
                    176: 
                    177: /*
                    178:  * The following two lines are NOT mistakes.  One detects ROM revision 
                    179:  * 3.0.0, the other 3.2.  Since seagate has only one type of SCSI adapter, 
                    180:  * and this is not going to change, the "SEAGATE" and "SCSI" together
                    181:  * are probably "good enough"
                    182:  */
                    183: 
                    184: {"SEAGATE SCSI BIOS ",16, 17, SEAGATE},
                    185: {"SEAGATE SCSI BIOS ",17, 17, SEAGATE},
                    186: 
                    187: /*
                    188:  * However, future domain makes several incompatible SCSI boards, so specific
                    189:  * signatures must be used.
                    190:  */
                    191: 
                    192: {"FUTURE DOMAIN CORP. (C) 1986-1989 V5.0C2/14/89", 5, 46, FD},
                    193: {"FUTURE DOMAIN CORP. (C) 1986-1989 V6.0A7/28/89", 5, 46, FD},
                    194: {"FUTURE DOMAIN CORP. (C) 1986-1990 V6.0105/31/90",5, 47, FD},
                    195: {"FUTURE DOMAIN CORP. (C) 1986-1990 V6.0209/18/90",5, 47, FD},
                    196: {"FUTURE DOMAIN CORP. (C) 1986-1990 V7.009/18/90", 5, 46, FD},
                    197: {"FUTURE DOMAIN CORP. (C) 1992 V8.00.004/02/92",   5, 44, FD},
                    198: {"IBM F1 BIOS V1.1004/30/92",                     5, 25, FD},
                    199: {"FUTURE DOMAIN TMC-950",                        5, 21, FD},
                    200: #endif /* CONFIG_SCSI_SEAGATE */
                    201: }
                    202: ;
                    203: 
                    204: #define NUM_SIGNATURES (sizeof(signatures) / sizeof(Signature))
                    205: #endif /* n OVERRIDE */
                    206: 
                    207: /*
                    208:  * hostno stores the hostnumber, as told to us by the init routine.
                    209:  */
                    210: 
                    211: static int hostno = -1;
                    212: static void seagate_reconnect_intr(int, void *, struct pt_regs *);
                    213: 
                    214: #ifdef FAST
                    215: static int fast = 1;
                    216: #endif 
                    217: 
                    218: #ifdef SLOW_HANDSHAKE
                    219: /* 
                    220:  * Support for broken devices : 
                    221:  * The Seagate board has a handshaking problem.  Namely, a lack 
                    222:  * thereof for slow devices.  You can blast 600K/second through 
                    223:  * it if you are polling for each byte, more if you do a blind 
                    224:  * transfer.  In the first case, with a fast device, REQ will 
                    225:  * transition high-low or high-low-high before your loop restarts 
                    226:  * and you'll have no problems.  In the second case, the board 
                    227:  * will insert wait states for up to 13.2 usecs for REQ to 
                    228:  * transition low->high, and everything will work.
                    229:  *
                    230:  * However, there's nothing in the state machine that says 
                    231:  * you *HAVE* to see a high-low-high set of transitions before
                    232:  * sending the next byte, and slow things like the Trantor CD ROMS
                    233:  * will break because of this.
                    234:  * 
                    235:  * So, we need to slow things down, which isn't as simple as it 
                    236:  * seems.  We can't slow things down period, because then people
                    237:  * who don't recompile their kernels will shoot me for ruining 
                    238:  * their performance.  We need to do it on a case per case basis.
                    239:  *
                    240:  * The best for performance will be to, only for borken devices 
                    241:  * (this is stored on a per-target basis in the scsi_devices array)
                    242:  * 
                    243:  * Wait for a low->high transition before continuing with that 
                    244:  * transfer.  If we timeout, continue anyways.  We don't need 
                    245:  * a long timeout, because REQ should only be asserted until the 
                    246:  * corresponding ACK is received and processed.
                    247:  *
                    248:  * Note that we can't use the system timer for this, because of 
                    249:  * resolution, and we *really* can't use the timer chip since 
                    250:  * gettimeofday() and the beeper routines use that.  So,
                    251:  * the best thing for us to do will be to calibrate a timing
                    252:  * loop in the initialization code using the timer chip before
                    253:  * gettimeofday() can screw with it.
                    254:  */
                    255: 
                    256: static int borken_calibration = 0;
                    257: static void borken_init (void) {
                    258:   register int count = 0, start = jiffies + 1, stop = start + 25;
                    259: 
                    260:   while (jiffies < start);
                    261:   for (;jiffies < stop; ++count);
                    262: 
                    263: /* 
                    264:  * Ok, we now have a count for .25 seconds.  Convert to a 
                    265:  * count per second and divide by transfer rate in K.
                    266:  */
                    267: 
                    268:   borken_calibration =  (count * 4) / (SLOW_RATE*1024);
                    269: 
                    270:   if (borken_calibration < 1)
                    271:        borken_calibration = 1;
                    272: #if (DEBUG & DEBUG_BORKEN)
                    273:   printk("scsi%d : borken calibrated to %dK/sec, %d cycles per transfer\n", 
                    274:        hostno, BORKEN_RATE, borken_calibration);
                    275: #endif
                    276: }
                    277: 
                    278: static inline void borken_wait(void) {
                    279:   register int count;
                    280:   for (count = borken_calibration; count && (STATUS & STAT_REQ); 
                    281:        --count);
                    282: #if (DEBUG & DEBUG_BORKEN) 
                    283:   if (count)
                    284:        printk("scsi%d : borken timeout\n", hostno);
                    285: #endif 
                    286: }
                    287: 
                    288: #endif /* def SLOW_HANDSHAKE */
                    289: 
                    290: int seagate_st0x_detect (Scsi_Host_Template * tpnt)
                    291:        {
                    292:      struct Scsi_Host *instance;
                    293: #ifndef OVERRIDE
                    294:        int i,j;
                    295: #endif 
                    296: 
                    297:      tpnt->proc_dir = &proc_scsi_seagate;
                    298: /*
                    299:  *     First, we try for the manual override.
                    300:  */
                    301: #ifdef DEBUG 
                    302:        printk("Autodetecting ST0x / TMC-8xx\n");
                    303: #endif
                    304:        
                    305:        if (hostno != -1)
                    306:                {
                    307:                printk ("ERROR : seagate_st0x_detect() called twice.\n");
                    308:                return 0;
                    309:                }
                    310: 
                    311:       /* If the user specified the controller type from the command line,
                    312:         controller_type will be non-zero, so don't try to detect one */
                    313: 
                    314:        if (!controller_type) {
                    315: #ifdef OVERRIDE
                    316:        base_address = (void *) OVERRIDE;
                    317: 
                    318: /* CONTROLLER is used to override controller (SEAGATE or FD). PM: 07/01/93 */
                    319: #ifdef CONTROLLER
                    320:        controller_type = CONTROLLER;
                    321: #else
                    322: #error Please use -DCONTROLLER=SEAGATE or -DCONTROLLER=FD to override controller type
                    323: #endif /* CONTROLLER */
                    324: #ifdef DEBUG
                    325:        printk("Base address overridden to %x, controller type is %s\n",
                    326:                base_address,controller_type == SEAGATE ? "SEAGATE" : "FD");
                    327: #endif 
                    328: #else /* OVERRIDE */   
                    329: /*
                    330:  *     To detect this card, we simply look for the signature
                    331:  *     from the BIOS version notice in all the possible locations
                    332:  *     of the ROM's.  This has a nice side effect of not trashing
                    333:  *     any register locations that might be used by something else.
                    334:  *
                    335:  * XXX - note that we probably should be probing the address
                    336:  * space for the on-board RAM instead.
                    337:  */
                    338: 
                    339:        for (i = 0; i < (sizeof (seagate_bases) / sizeof (char  * )); ++i)
                    340:                for (j = 0; !base_address && j < NUM_SIGNATURES; ++j)
                    341:                if (!memcmp ((const void *) (seagate_bases[i] +
                    342:                    signatures[j].offset), (const void *) signatures[j].signature,
                    343:                    signatures[j].length)) {
                    344:                        base_address = (const void *) seagate_bases[i];
                    345:                        controller_type = signatures[j].type;
                    346:                }
                    347: #endif /* OVERRIDE */
                    348:        } /* (! controller_type) */
                    349:  
                    350:        tpnt->this_id = (controller_type == SEAGATE) ? 7 : 6;
                    351:        tpnt->name = (controller_type == SEAGATE) ? ST0X_ID_STR : FD_ID_STR;
                    352: 
                    353:        if (base_address)
                    354:                {
                    355:                st0x_cr_sr =(void *) (((const unsigned char *) base_address) + (controller_type == SEAGATE ? 0x1a00 : 0x1c00)); 
                    356:                st0x_dr = (void *) (((const unsigned char *) base_address ) + (controller_type == SEAGATE ? 0x1c00 : 0x1e00));
                    357: #ifdef DEBUG
                    358:                printk("%s detected. Base address = %x, cr = %x, dr = %x\n", tpnt->name, base_address, st0x_cr_sr, st0x_dr);
                    359: #endif
                    360: /*
                    361:  *     At all times, we will use IRQ 5.  Should also check for IRQ3 if we 
                    362:  *     loose our first interrupt.
                    363:  */
                    364:                instance = scsi_register(tpnt, 0);
                    365:                hostno = instance->host_no;
                    366:                if (request_irq((int) irq, seagate_reconnect_intr, SA_INTERRUPT,
                    367:                   (controller_type == SEAGATE) ? "seagate" : "tmc-8xx", NULL)) {
                    368:                        printk("scsi%d : unable to allocate IRQ%d\n",
                    369:                                hostno, (int) irq);
                    370:                        return 0;
                    371:                }
                    372:                instance->irq = irq;
                    373:                instance->io_port = (unsigned int) base_address;
                    374: #ifdef SLOW_HANDSHAKE
                    375:                borken_init();
                    376: #endif
                    377:                
                    378:                printk("%s options:"
                    379: #ifdef ARBITRATE
                    380:                " ARBITRATE"
                    381: #endif
                    382: #ifdef SLOW_HANDSHAKE
                    383:                " SLOW_HANDSHAKE"
                    384: #endif
                    385: #ifdef FAST
                    386: #ifdef FAST32
                    387:                " FAST32"
                    388: #else
                    389:                " FAST"
                    390: #endif
                    391: #endif
                    392: #ifdef LINKED
                    393:                " LINKED"
                    394: #endif
                    395:              "\n", tpnt->name);
                    396:                return 1;
                    397:                }
                    398:        else
                    399:                {
                    400: #ifdef DEBUG
                    401:                printk("ST0x / TMC-8xx not detected.\n");
                    402: #endif
                    403:                return 0;
                    404:                }
                    405:        }
                    406:         
                    407: const char *seagate_st0x_info(struct Scsi_Host * shpnt) {
                    408:       static char buffer[64];
                    409:        sprintf(buffer, "%s at irq %d, address 0x%05X", 
                    410:                (controller_type == SEAGATE) ? ST0X_ID_STR : FD_ID_STR,
                    411:                irq, (unsigned int)base_address);
                    412:        return buffer;
                    413: }
                    414: 
                    415: int seagate_st0x_proc_info(char *buffer, char **start, off_t offset,
                    416:                                int length, int hostno, int inout)
                    417: {
                    418:        const char *info = seagate_st0x_info(NULL);
                    419:        int len;
                    420:        int pos;
                    421:        int begin;
                    422: 
                    423:        if (inout) return(-ENOSYS);
                    424: 
                    425:        begin = 0;
                    426:        strcpy(buffer,info);
                    427:        strcat(buffer,"\n");
                    428: 
                    429:        pos = len = strlen(buffer);
                    430: 
                    431:        if (pos<offset) {
                    432:                len = 0;
                    433:                begin = pos;
                    434:                }
                    435: 
                    436:        *start = buffer + (offset - begin);
                    437:        len -= (offset - begin);
                    438:        if ( len > length ) len = length;
                    439:        return(len);
                    440: }
                    441: 
                    442: /*
                    443:  * These are our saved pointers for the outstanding command that is 
                    444:  * waiting for a reconnect
                    445:  */
                    446: 
                    447: static unsigned char current_target, current_lun;
                    448: static unsigned char *current_cmnd, *current_data;
                    449: static int current_nobuffs;
                    450: static struct scatterlist *current_buffer;
                    451: static int current_bufflen;
                    452: 
                    453: #ifdef LINKED
                    454: 
                    455: /* 
                    456:  * linked_connected indicates whether or not we are currently connected to 
                    457:  * linked_target, linked_lun and in an INFORMATION TRANSFER phase,
                    458:  * using linked commands.
                    459:  */
                    460: 
                    461: static int linked_connected = 0;
                    462: static unsigned char linked_target, linked_lun;
                    463: #endif
                    464: 
                    465: 
                    466: static void (*done_fn)(Scsi_Cmnd *) = NULL;
                    467: static Scsi_Cmnd * SCint = NULL;
                    468: 
                    469: /*
                    470:  * These control whether or not disconnect / reconnect will be attempted,
                    471:  * or are being attempted.
                    472:  */
                    473: 
                    474: #define NO_RECONNECT   0
                    475: #define RECONNECT_NOW  1
                    476: #define CAN_RECONNECT  2
                    477: 
                    478: #ifdef LINKED
                    479: 
                    480: /*
                    481:  * LINKED_RIGHT indicates that we are currently connected to the correct target
                    482:  * for this command, LINKED_WRONG indicates that we are connected to the wrong 
                    483:  * target.  Note that these imply CAN_RECONNECT.
                    484:  */
                    485: 
                    486: #define LINKED_RIGHT   3
                    487: #define LINKED_WRONG   4
                    488: #endif
                    489: 
                    490: /*
                    491:  * This determines if we are expecting to reconnect or not.
                    492:  */
                    493: 
                    494: static int should_reconnect = 0;
                    495: 
                    496: /*
                    497:  * The seagate_reconnect_intr routine is called when a target reselects the 
                    498:  * host adapter.  This occurs on the interrupt triggered by the target 
                    499:  * asserting SEL.
                    500:  */
                    501: 
                    502: static void seagate_reconnect_intr(int irq, void *dev_id, struct pt_regs *regs)
                    503:        {
                    504:        int temp;
                    505:        Scsi_Cmnd * SCtmp;
                    506: 
                    507: /* enable all other interrupts. */     
                    508:        sti();
                    509: #if (DEBUG & PHASE_RESELECT)
                    510:        printk("scsi%d : seagate_reconnect_intr() called\n", hostno);
                    511: #endif
                    512: 
                    513:        if (!should_reconnect)
                    514:            printk("scsi%d: unexpected interrupt.\n", hostno);
                    515:        else {
                    516:                 should_reconnect = 0;
                    517: 
                    518: #if (DEBUG & PHASE_RESELECT)
                    519:                printk("scsi%d : internal_command("
                    520:                       "%d, %08x, %08x, %d, RECONNECT_NOW\n", hostno, 
                    521:                        current_target, current_data, current_bufflen);
                    522: #endif
                    523:        
                    524:                temp =  internal_command (current_target, current_lun,
                    525:                        current_cmnd, current_data, current_bufflen,
                    526:                        RECONNECT_NOW);
                    527: 
                    528:                if (msg_byte(temp) != DISCONNECT) {
                    529:                        if (done_fn) {
                    530: #if (DEBUG & PHASE_RESELECT)
                    531:                                printk("scsi%d : done_fn(%d,%08x)", hostno, 
                    532:                                hostno, temp);
                    533: #endif
                    534:                                if(!SCint) panic("SCint == NULL in seagate");
                    535:                                SCtmp = SCint;
                    536:                                SCint = NULL;
                    537:                                SCtmp->result = temp;
                    538:                                done_fn (SCtmp);
                    539:                        } else
                    540:                                printk("done_fn() not defined.\n");
                    541:                        }
                    542:                }
                    543:        } 
                    544: 
                    545: /* 
                    546:  * The seagate_st0x_queue_command() function provides a queued interface
                    547:  * to the seagate SCSI driver.  Basically, it just passes control onto the
                    548:  * seagate_command() function, after fixing it so that the done_fn()
                    549:  * is set to the one passed to the function.  We have to be very careful,
                    550:  * because there are some commands on some devices that do not disconnect,
                    551:  * and if we simply call the done_fn when the command is done then another
                    552:  * command is started and queue_command is called again...  We end up
                    553:  * overflowing the kernel stack, and this tends not to be such a good idea.
                    554:  */
                    555: 
                    556: static int recursion_depth = 0;
                    557: 
                    558: int seagate_st0x_queue_command (Scsi_Cmnd * SCpnt,  void (*done)(Scsi_Cmnd *))
                    559:        {
                    560:        int result, reconnect;
                    561:        Scsi_Cmnd * SCtmp;
                    562: 
                    563:        done_fn = done;
                    564:        current_target = SCpnt->target;
                    565:        current_lun = SCpnt->lun;
                    566:        (const void *) current_cmnd = SCpnt->cmnd;
                    567:        current_data = (unsigned char *) SCpnt->request_buffer;
                    568:        current_bufflen = SCpnt->request_bufflen;
                    569:        SCint = SCpnt;
                    570:        if(recursion_depth) {
                    571:          return 0;
                    572:        };
                    573:        recursion_depth++;
                    574:        do{
                    575: #ifdef LINKED
                    576: /*
                    577:  * Set linked command bit in control field of SCSI command.
                    578:  */
                    579: 
                    580:          current_cmnd[SCpnt->cmd_len] |= 0x01;
                    581:          if (linked_connected) {
                    582: #if (DEBUG & DEBUG_LINKED) 
                    583:            printk("scsi%d : using linked commands, current I_T_L nexus is ",
                    584:              hostno);
                    585: #endif
                    586:            if ((linked_target == current_target) && 
                    587:              (linked_lun == current_lun)) {
                    588: #if (DEBUG & DEBUG_LINKED) 
                    589:            printk("correct\n");
                    590: #endif
                    591:              reconnect = LINKED_RIGHT;
                    592:            } else {
                    593: #if (DEBUG & DEBUG_LINKED) 
                    594:            printk("incorrect\n");
                    595: #endif
                    596:              reconnect = LINKED_WRONG;
                    597:            }
                    598:          } else 
                    599: #endif /* LINKED */
                    600:            reconnect = CAN_RECONNECT;
                    601: 
                    602: 
                    603: 
                    604: 
                    605: 
                    606:          result = internal_command (SCint->target, SCint->lun, SCint->cmnd, SCint->request_buffer,
                    607:                                     SCint->request_bufflen, 
                    608:                                     reconnect);
                    609:          if (msg_byte(result) == DISCONNECT)  break;
                    610:          SCtmp = SCint;
                    611:          SCint = NULL;
                    612:          SCtmp->result = result;
                    613:          done_fn (SCtmp);
                    614:        } while(SCint);
                    615:        recursion_depth--;
                    616:        return 0;
                    617:       }
                    618: 
                    619: int seagate_st0x_command (Scsi_Cmnd * SCpnt) {
                    620:        return internal_command (SCpnt->target, SCpnt->lun, SCpnt->cmnd, SCpnt->request_buffer,
                    621:                                 SCpnt->request_bufflen, 
                    622:                                 (int) NO_RECONNECT);
                    623: }
                    624:        
                    625: static int internal_command(unsigned char target, unsigned char lun, const void *cmnd,
                    626:                         void *buff, int bufflen, int reselect) {
                    627:        int len = 0;
                    628:        unsigned char *data = NULL;     
                    629:        struct scatterlist *buffer = NULL;
                    630:        int nobuffs = 0;
                    631:        int clock;                      
                    632:        int temp;
                    633: #ifdef SLOW_HANDSHAKE
                    634:        int borken;     /* Does the current target require Very Slow I/O ? */
                    635: #endif
                    636: 
                    637: 
                    638: #if (DEBUG & PHASE_DATAIN) || (DEBUG & PHASE_DATOUT) 
                    639:        int transfered = 0;
                    640: #endif
                    641: 
                    642: #if (((DEBUG & PHASE_ETC) == PHASE_ETC) || (DEBUG & PRINT_COMMAND) || \
                    643:        (DEBUG & PHASE_EXIT))   
                    644:        int i;
                    645: #endif
                    646: 
                    647: #if ((DEBUG & PHASE_ETC) == PHASE_ETC)
                    648:        int phase=0, newphase;
                    649: #endif
                    650: 
                    651:        int done = 0;
                    652:        unsigned char status = 0;       
                    653:        unsigned char message = 0;
                    654:        register unsigned char status_read;
                    655: 
                    656:        unsigned transfersize = 0, underflow = 0;
                    657: 
                    658:        incommand = 0;
                    659:        st0x_aborted = 0;
                    660: 
                    661: #ifdef SLOW_HANDSHAKE
                    662:        borken = (int) SCint->device->borken;
                    663: #endif
                    664: 
                    665: #if (DEBUG & PRINT_COMMAND)
                    666:        printk ("scsi%d : target = %d, command = ", hostno, target);
                    667:        print_command((unsigned char *) cmnd);
                    668:        printk("\n");
                    669: #endif
                    670: 
                    671: #if (DEBUG & PHASE_RESELECT)
                    672:        switch (reselect) {
                    673:        case RECONNECT_NOW :
                    674:                printk("scsi%d : reconnecting\n", hostno);
                    675:                break;
                    676: #ifdef LINKED
                    677:        case LINKED_RIGHT : 
                    678:                printk("scsi%d : connected, can reconnect\n", hostno);
                    679:                break;
                    680:        case LINKED_WRONG :
                    681:                printk("scsi%d : connected to wrong target, can reconnect\n",
                    682:                        hostno);
                    683:                break;          
                    684: #endif
                    685:        case CAN_RECONNECT :
                    686:                printk("scsi%d : allowed to reconnect\n", hostno);
                    687:                break;
                    688:        default :
                    689:                printk("scsi%d : not allowed to reconnect\n", hostno);
                    690:        }
                    691: #endif
                    692:        
                    693: 
                    694:        if (target == (controller_type == SEAGATE ? 7 : 6))
                    695:                return DID_BAD_TARGET;
                    696: 
                    697: /*
                    698:  *     We work it differently depending on if this is "the first time,"
                    699:  *     or a reconnect.  If this is a reselect phase, then SEL will 
                    700:  *     be asserted, and we must skip selection / arbitration phases.
                    701:  */
                    702: 
                    703:        switch (reselect) {
                    704:        case RECONNECT_NOW:
                    705: #if (DEBUG & PHASE_RESELECT)
                    706:                printk("scsi%d : phase RESELECT \n", hostno);
                    707: #endif
                    708: 
                    709: /*
                    710:  *     At this point, we should find the logical or of our ID and the original
                    711:  *     target's ID on the BUS, with BSY, SEL, and I/O signals asserted.
                    712:  *
                    713:  *     After ARBITRATION phase is completed, only SEL, BSY, and the 
                    714:  *     target ID are asserted.  A valid initiator ID is not on the bus
                    715:  *     until IO is asserted, so we must wait for that.
                    716:  */
                    717:                clock = jiffies + 10;
                    718:                for (;;) {
                    719:                        temp = STATUS;
                    720:                        if ((temp & STAT_IO) && !(temp & STAT_BSY))
                    721:                                break;
                    722: 
                    723:                        if (jiffies > clock) {
                    724: #if (DEBUG & PHASE_RESELECT)
                    725:                                printk("scsi%d : RESELECT timed out while waiting for IO .\n",
                    726:                                        hostno);
                    727: #endif
                    728:                                return (DID_BAD_INTR << 16);
                    729:                        }
                    730:                }
                    731: 
                    732: /* 
                    733:  *     After I/O is asserted by the target, we can read our ID and its
                    734:  *     ID off of the BUS.
                    735:  */
                    736:  
                    737:                if (!((temp = DATA) & (controller_type == SEAGATE ? 0x80 : 0x40)))
                    738:                        {
                    739: #if (DEBUG & PHASE_RESELECT)
                    740:                        printk("scsi%d : detected reconnect request to different target.\n" 
                    741:                               "\tData bus = %d\n", hostno, temp);
                    742: #endif
                    743:                        return (DID_BAD_INTR << 16);
                    744:                        }
                    745: 
                    746:                if (!(temp & (1 << current_target)))
                    747:                        {
                    748:                        printk("scsi%d : Unexpected reselect interrupt.  Data bus = %d\n",
                    749:                                hostno, temp);
                    750:                        return (DID_BAD_INTR << 16);
                    751:                        }
                    752: 
                    753:                buffer=current_buffer;  
                    754:                cmnd=current_cmnd;      /* WDE add */
                    755:                data=current_data;      /* WDE add */
                    756:                len=current_bufflen;    /* WDE add */
                    757:                nobuffs=current_nobuffs;
                    758: 
                    759: /*
                    760:  *     We have determined that we have been selected.  At this point, 
                    761:  *     we must respond to the reselection by asserting BSY ourselves
                    762:  */
                    763: 
                    764: #if 1
                    765:                CONTROL = (BASE_CMD | CMD_DRVR_ENABLE | CMD_BSY);
                    766: #else
                    767:                CONTROL = (BASE_CMD | CMD_BSY);
                    768: #endif
                    769: 
                    770: /*
                    771:  *     The target will drop SEL, and raise BSY, at which time we must drop
                    772:  *     BSY.
                    773:  */
                    774: 
                    775:                for (clock = jiffies + 10; (jiffies < clock) &&  (STATUS & STAT_SEL););
                    776: 
                    777:                if (jiffies >= clock)
                    778:                        { 
                    779:                        CONTROL = (BASE_CMD | CMD_INTR);
                    780: #if (DEBUG & PHASE_RESELECT)
                    781:                        printk("scsi%d : RESELECT timed out while waiting for SEL.\n",
                    782:                                hostno);
                    783: #endif
                    784:                        return (DID_BAD_INTR << 16);                             
                    785:                        }
                    786: 
                    787:                CONTROL = BASE_CMD;
                    788: 
                    789: /*
                    790:  *     At this point, we have connected with the target and can get 
                    791:  *     on with our lives.
                    792:  */     
                    793:                break;
                    794:        case CAN_RECONNECT:
                    795: 
                    796: #ifdef LINKED
                    797: /*
                    798:  * This is a bletcherous hack, just as bad as the Unix #! interpreter stuff.
                    799:  * If it turns out we are using the wrong I_T_L nexus, the easiest way to deal
                    800:  * with it is to go into our INFORMATION TRANSFER PHASE code, send a ABORT 
                    801:  * message on MESSAGE OUT phase, and then loop back to here.
                    802:  */
                    803:   
                    804: connect_loop :
                    805: 
                    806: #endif
                    807: 
                    808: #if (DEBUG & PHASE_BUS_FREE)
                    809:                printk ("scsi%d : phase = BUS FREE \n", hostno);
                    810: #endif
                    811: 
                    812: /*
                    813:  *     BUS FREE PHASE
                    814:  *
                    815:  *     On entry, we make sure that the BUS is in a BUS FREE
                    816:  *     phase, by insuring that both BSY and SEL are low for
                    817:  *     at least one bus settle delay.  Several reads help
                    818:  *     eliminate wire glitch.
                    819:  */
                    820: 
                    821:                clock = jiffies + ST0X_BUS_FREE_DELAY;  
                    822: 
                    823: #if !defined (ARBITRATE) 
                    824:                while (((STATUS |  STATUS | STATUS) & 
                    825:                         (STAT_BSY | STAT_SEL)) && 
                    826:                         (!st0x_aborted) && (jiffies < clock));
                    827: 
                    828:                if (jiffies > clock)
                    829:                        return retcode(DID_BUS_BUSY);
                    830:                else if (st0x_aborted)
                    831:                        return retcode(st0x_aborted);
                    832: #endif
                    833: 
                    834: #if (DEBUG & PHASE_SELECTION)
                    835:                printk("scsi%d : phase = SELECTION\n", hostno);
                    836: #endif
                    837: 
                    838:                clock = jiffies + ST0X_SELECTION_DELAY;
                    839: 
                    840: /*
                    841:  * Arbitration/selection procedure : 
                    842:  * 1.  Disable drivers
                    843:  * 2.  Write HOST adapter address bit
                    844:  * 3.  Set start arbitration.
                    845:  * 4.  We get either ARBITRATION COMPLETE or SELECT at this
                    846:  *     point.
                    847:  * 5.  OR our ID and targets on bus.
                    848:  * 6.  Enable SCSI drivers and asserted SEL and ATTN
                    849:  */
                    850:                
                    851: #if defined(ARBITRATE) 
                    852:        cli();
                    853:        CONTROL = 0;
                    854:        DATA = (controller_type == SEAGATE) ? 0x80 : 0x40;
                    855:        CONTROL = CMD_START_ARB; 
                    856:        sti();
                    857:        while (!((status_read = STATUS) & (STAT_ARB_CMPL | STAT_SEL)) &&
                    858:                (jiffies < clock) && !st0x_aborted);
                    859: 
                    860:        if (!(status_read & STAT_ARB_CMPL)) {
                    861: #if (DEBUG & PHASE_SELECTION)
                    862:                if (status_read & STAT_SEL) 
                    863:                        printk("scsi%d : arbitration lost\n", hostno);
                    864:                else
                    865:                        printk("scsi%d : arbitration timeout.\n", hostno);
                    866: #endif
                    867:                CONTROL = BASE_CMD;
                    868:                return retcode(DID_NO_CONNECT);
                    869:        };
                    870: 
                    871: #if (DEBUG & PHASE_SELECTION)
                    872:        printk("scsi%d : arbitration complete\n", hostno);
                    873: #endif
                    874: #endif
                    875: 
                    876: 
                    877: /*
                    878:  *     When the SCSI device decides that we're gawking at it, it will 
                    879:  *     respond by asserting BUSY on the bus.
                    880:  *
                    881:  *     Note : the Seagate ST-01/02 product manual says that we should 
                    882:  *     twiddle the DATA register before the control register.  However,
                    883:  *     this does not work reliably so we do it the other way around.
                    884:  *
                    885:  *     Probably could be a problem with arbitration too, we really should
                    886:  *     try this with a SCSI protocol or logic analyzer to see what is 
                    887:  *     going on.
                    888:  */
                    889:        cli();
                    890:        DATA = (unsigned char) ((1 << target) | (controller_type == SEAGATE ? 0x80 : 0x40));
                    891:        CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | 
                    892:                (reselect ? CMD_ATTN : 0);
                    893:        sti();
                    894:                while (!((status_read = STATUS) & STAT_BSY) && 
                    895:                        (jiffies < clock) && !st0x_aborted)
                    896: 
                    897: #if 0 && (DEBUG & PHASE_SELECTION)
                    898:                {
                    899:                temp = clock - jiffies;
                    900: 
                    901:                if (!(jiffies % 5))
                    902:                        printk("seagate_st0x_timeout : %d            \r",temp);
                    903:        
                    904:                }
                    905:                printk("Done.                                             \n");
                    906:                printk("scsi%d : status = %02x, seagate_st0x_timeout = %d, aborted = %02x \n", 
                    907:                        hostno, status_read, temp, st0x_aborted);
                    908: #else
                    909:                ;
                    910: #endif
                    911:        
                    912: 
                    913:                if ((jiffies >= clock)  && !(status_read & STAT_BSY))
                    914:                        {
                    915: #if (DEBUG & PHASE_SELECTION)
                    916:                        printk ("scsi%d : NO CONNECT with target %d, status = %x \n", 
                    917:                                hostno, target, STATUS);
                    918: #endif
                    919:                        return retcode(DID_NO_CONNECT);
                    920:                        }
                    921: 
                    922: /*
                    923:  *     If we have been aborted, and we have a command in progress, IE the 
                    924:  *     target still has BSY asserted, then we will reset the bus, and 
                    925:  *     notify the midlevel driver to expect sense.
                    926:  */
                    927: 
                    928:                if (st0x_aborted) {
                    929:                        CONTROL = BASE_CMD;
                    930:                        if (STATUS & STAT_BSY) {
                    931:                                printk("scsi%d : BST asserted after we've been aborted.\n",
                    932:                                        hostno);
                    933:                                seagate_st0x_reset(NULL, 0);
                    934:                                return retcode(DID_RESET);
                    935:                        }
                    936:                        return retcode(st0x_aborted);
                    937:                }       
                    938: 
                    939: /* Establish current pointers.  Take into account scatter / gather */
                    940: 
                    941:        if ((nobuffs = SCint->use_sg)) {
                    942: #if (DEBUG & DEBUG_SG)
                    943:        {
                    944:        int i;
                    945:        printk("scsi%d : scatter gather requested, using %d buffers.\n",
                    946:                hostno, nobuffs);
                    947:        for (i = 0; i < nobuffs; ++i)
                    948:                printk("scsi%d : buffer %d address = %08x length = %d\n",
                    949:                        hostno, i, buffer[i].address, buffer[i].length);
                    950:        }
                    951: #endif
                    952:                
                    953:                buffer = (struct scatterlist *) SCint->buffer;
                    954:                len = buffer->length;
                    955:                data = (unsigned char *) buffer->address;
                    956:        } else {
                    957: #if (DEBUG & DEBUG_SG)
                    958:        printk("scsi%d : scatter gather not requested.\n", hostno);
                    959: #endif
                    960:                buffer = NULL;
                    961:                len = SCint->request_bufflen;
                    962:                data = (unsigned char *) SCint->request_buffer;
                    963:        }
                    964: 
                    965: #if (DEBUG & (PHASE_DATAIN | PHASE_DATAOUT))
                    966:        printk("scsi%d : len = %d\n", hostno, len);
                    967: #endif
                    968: 
                    969:                break;
                    970: #ifdef LINKED
                    971:        case LINKED_RIGHT:
                    972:                break;
                    973:        case LINKED_WRONG:
                    974:                break;
                    975: #endif
                    976:        }
                    977: 
                    978: /*
                    979:  *     There are several conditions under which we wish to send a message : 
                    980:  *     1.  When we are allowing disconnect / reconnect, and need to establish
                    981:  *         the I_T_L nexus via an IDENTIFY with the DiscPriv bit set.
                    982:  *
                    983:  *     2.  When we are doing linked commands, are have the wrong I_T_L nexus
                    984:  *         established and want to send an ABORT message.
                    985:  */
                    986: 
                    987:        
                    988:        CONTROL = BASE_CMD | CMD_DRVR_ENABLE | 
                    989:                (((reselect == CAN_RECONNECT)
                    990: #ifdef LINKED 
                    991:                || (reselect == LINKED_WRONG)
                    992: #endif 
                    993:                )  ? CMD_ATTN : 0) ;
                    994:        
                    995: /*
                    996:  *     INFORMATION TRANSFER PHASE
                    997:  *
                    998:  *     The nasty looking read / write inline assembler loops we use for 
                    999:  *     DATAIN and DATAOUT phases are approximately 4-5 times as fast as 
                   1000:  *     the 'C' versions - since we're moving 1024 bytes of data, this
                   1001:  *     really adds up.
                   1002:  */
                   1003: 
                   1004: #if ((DEBUG & PHASE_ETC) == PHASE_ETC)
                   1005:        printk("scsi%d : phase = INFORMATION TRANSFER\n", hostno);
                   1006: #endif  
                   1007: 
                   1008:        incommand = 1;
                   1009:        transfersize = SCint->transfersize;
                   1010:        underflow = SCint->underflow;
                   1011: 
                   1012: 
                   1013: /*
                   1014:  *     Now, we poll the device for status information,
                   1015:  *     and handle any requests it makes.  Note that since we are unsure of 
                   1016:  *     how much data will be flowing across the system, etc and cannot 
                   1017:  *     make reasonable timeouts, that we will instead have the midlevel
                   1018:  *     driver handle any timeouts that occur in this phase.
                   1019:  */
                   1020: 
                   1021:        while (((status_read = STATUS) & STAT_BSY) && !st0x_aborted && !done) 
                   1022:                {
                   1023: #ifdef PARITY
                   1024:                if (status_read & STAT_PARITY)
                   1025:                        {
                   1026:                        printk("scsi%d : got parity error\n", hostno);
                   1027:                        st0x_aborted = DID_PARITY;
                   1028:                        }       
                   1029: #endif
                   1030: 
                   1031:                if (status_read & STAT_REQ)
                   1032:                        {
                   1033: #if ((DEBUG & PHASE_ETC) == PHASE_ETC)
                   1034:                        if ((newphase = (status_read & REQ_MASK)) != phase)
                   1035:                                {
                   1036:                                phase = newphase;
                   1037:                                switch (phase)
                   1038:                                {
                   1039:                                case REQ_DATAOUT: 
                   1040:                                        printk("scsi%d : phase = DATA OUT\n",
                   1041:                                                hostno); 
                   1042:                                        break;
                   1043:                                case REQ_DATAIN : 
                   1044:                                        printk("scsi%d : phase = DATA IN\n",
                   1045:                                                hostno); 
                   1046:                                        break;
                   1047:                                case REQ_CMDOUT : 
                   1048:                                        printk("scsi%d : phase = COMMAND OUT\n",
                   1049:                                                hostno); 
                   1050:                                        break;
                   1051:                                case REQ_STATIN :
                   1052:                                         printk("scsi%d : phase = STATUS IN\n",
                   1053:                                                hostno); 
                   1054:                                        break;
                   1055:                                case REQ_MSGOUT :
                   1056:                                        printk("scsi%d : phase = MESSAGE OUT\n",
                   1057:                                                hostno); 
                   1058:                                        break;
                   1059:                                case REQ_MSGIN :
                   1060:                                        printk("scsi%d : phase = MESSAGE IN\n",
                   1061:                                                hostno);
                   1062:                                        break;
                   1063:                                default : 
                   1064:                                        printk("scsi%d : phase = UNKNOWN\n",
                   1065:                                                hostno); 
                   1066:                                        st0x_aborted = DID_ERROR; 
                   1067:                                }       
                   1068:                                }
                   1069: #endif
                   1070:                switch (status_read & REQ_MASK)
                   1071:                {                       
                   1072:                case REQ_DATAOUT : 
                   1073: /*
                   1074:  * If we are in fast mode, then we simply splat the data out
                   1075:  * in word-sized chunks as fast as we can.
                   1076:  */
                   1077: 
                   1078: #ifdef FAST 
                   1079: if (!len) {
                   1080: #if 0 
                   1081:        printk("scsi%d: underflow to target %d lun %d \n", 
                   1082:                hostno, target, lun);
                   1083:        st0x_aborted = DID_ERROR;
                   1084:        fast = 0;
                   1085: #endif
                   1086:        break;
                   1087: }
                   1088: 
                   1089: if (fast && transfersize && !(len % transfersize) && (len >= transfersize)
                   1090: #ifdef FAST32
                   1091:        && !(transfersize % 4)
                   1092: #endif
                   1093:        ) {
                   1094: #if (DEBUG & DEBUG_FAST) 
                   1095:        printk("scsi%d : FAST transfer, underflow = %d, transfersize = %d\n"
                   1096:               "         len = %d, data = %08x\n", hostno, SCint->underflow, 
                   1097:               SCint->transfersize, len, data);
                   1098: #endif
                   1099: 
                   1100:        __asm__("
                   1101:        cld;
                   1102: "
                   1103: #ifdef FAST32
                   1104: "      shr $2, %%ecx;
                   1105: 1:     lodsl;
                   1106:        movl %%eax, (%%edi);
                   1107: "
                   1108: #else
                   1109: "1:    lodsb;
                   1110:        movb %%al, (%%edi);
                   1111: "
                   1112: #endif
                   1113: "      loop 1b;" : :
                   1114:        /* input */
                   1115:        "D" (st0x_dr), "S" (data), "c" (SCint->transfersize) :
                   1116:        /* clobbered */
                   1117:        "eax", "ecx", "esi" );
                   1118: 
                   1119:        len -= transfersize;
                   1120:        data += transfersize;
                   1121: 
                   1122: #if (DEBUG & DEBUG_FAST)
                   1123:        printk("scsi%d : FAST transfer complete len = %d data = %08x\n", 
                   1124:                hostno, len, data);
                   1125: #endif
                   1126: 
                   1127: 
                   1128: } else 
                   1129: #endif
                   1130: 
                   1131: {
                   1132: /*
                   1133:  *     We loop as long as we are in a data out phase, there is data to send, 
                   1134:  *     and BSY is still active.
                   1135:  */
                   1136:                __asm__ (
                   1137: 
                   1138: /*
                   1139:        Local variables : 
                   1140:        len = ecx
                   1141:        data = esi
                   1142:        st0x_cr_sr = ebx
                   1143:        st0x_dr =  edi
                   1144: 
                   1145:        Test for any data here at all.
                   1146: */
                   1147:        "\torl %%ecx, %%ecx
                   1148:        jz 2f
                   1149: 
                   1150:        cld
                   1151: 
                   1152:        movl " SYMBOL_NAME_STR(st0x_cr_sr) ", %%ebx
                   1153:        movl " SYMBOL_NAME_STR(st0x_dr) ", %%edi
                   1154:        
                   1155: 1:     movb (%%ebx), %%al\n"
                   1156: /*
                   1157:        Test for BSY
                   1158: */
                   1159: 
                   1160:        "\ttest $1, %%al
                   1161:        jz 2f\n"
                   1162: 
                   1163: /*
                   1164:        Test for data out phase - STATUS & REQ_MASK should be REQ_DATAOUT, which is 0.
                   1165: */
                   1166:        "\ttest $0xe, %%al
                   1167:        jnz 2f  \n"
                   1168: /*
                   1169:        Test for REQ
                   1170: */     
                   1171:        "\ttest $0x10, %%al
                   1172:        jz 1b
                   1173:        lodsb
                   1174:        movb %%al, (%%edi) 
                   1175:        loop 1b
                   1176: 
                   1177: 2: 
                   1178:                                                                        ":
                   1179: /* output */
                   1180: "=S" (data), "=c" (len) :
                   1181: /* input */
                   1182: "0" (data), "1" (len) :
                   1183: /* clobbered */
                   1184: "eax", "ebx", "edi"); 
                   1185: }
                   1186: 
                   1187:                        if (!len && nobuffs) {
                   1188:                                --nobuffs;
                   1189:                                ++buffer;
                   1190:                                len = buffer->length;
                   1191:                                data = (unsigned char *) buffer->address;
                   1192: #if (DEBUG & DEBUG_SG)
                   1193:        printk("scsi%d : next scatter-gather buffer len = %d address = %08x\n",
                   1194:                hostno, len, data);
                   1195: #endif
                   1196:                        }
                   1197:                        break;
                   1198: 
                   1199:                case REQ_DATAIN : 
                   1200: #ifdef SLOW_HANDSHAKE
                   1201:        if (borken) {
                   1202: #if (DEBUG & (PHASE_DATAIN))
                   1203:                transfered += len;
                   1204: #endif
                   1205:                for (; len && (STATUS & (REQ_MASK | STAT_REQ)) == (REQ_DATAIN |
                   1206:                        STAT_REQ); --len) {
                   1207:                                *data++ = DATA;
                   1208:                                borken_wait();
                   1209: }
                   1210: #if (DEBUG & (PHASE_DATAIN))
                   1211:                transfered -= len;
                   1212: #endif
                   1213:        } else
                   1214: #endif
                   1215: #ifdef FAST
                   1216: if (fast && transfersize && !(len % transfersize) && (len >= transfersize)
                   1217: #ifdef FAST32
                   1218:        && !(transfersize % 4)
                   1219: #endif
                   1220:        ) {
                   1221: #if (DEBUG & DEBUG_FAST) 
                   1222:        printk("scsi%d : FAST transfer, underflow = %d, transfersize = %d\n"
                   1223:               "         len = %d, data = %08x\n", hostno, SCint->underflow, 
                   1224:               SCint->transfersize, len, data);
                   1225: #endif
                   1226:        __asm__("
                   1227:        cld;
                   1228: "
                   1229: #ifdef FAST32
                   1230: "      shr $2, %%ecx;
                   1231: 1:     movl (%%esi), %%eax;
                   1232:        stosl;
                   1233: "
                   1234: #else
                   1235: "1:    movb (%%esi), %%al;
                   1236:        stosb;
                   1237: "
                   1238: #endif
                   1239: 
                   1240: "      loop 1b;" : :
                   1241:        /* input */
                   1242:        "S" (st0x_dr), "D" (data), "c" (SCint->transfersize) :
                   1243:        /* clobbered */
                   1244:        "eax", "ecx", "edi");
                   1245: 
                   1246:        len -= transfersize;
                   1247:        data += transfersize;
                   1248: 
                   1249: #if (DEBUG & PHASE_DATAIN)
                   1250:        printk("scsi%d: transfered += %d\n", hostno, transfersize);
                   1251:        transfered += transfersize;
                   1252: #endif
                   1253: 
                   1254: #if (DEBUG & DEBUG_FAST)
                   1255:        printk("scsi%d : FAST transfer complete len = %d data = %08x\n", 
                   1256:                hostno, len, data);
                   1257: #endif
                   1258: 
                   1259: } else
                   1260: #endif
                   1261: {
                   1262: 
                   1263: #if (DEBUG & PHASE_DATAIN)
                   1264:        printk("scsi%d: transfered += %d\n", hostno, len);
                   1265:        transfered += len;      /* Assume we'll transfer it all, then
                   1266:                                   subtract what we *didn't* transfer */
                   1267: #endif
                   1268:        
                   1269: /*
                   1270:  *     We loop as long as we are in a data in phase, there is room to read, 
                   1271:  *     and BSY is still active
                   1272:  */
                   1273:  
                   1274:                        __asm__ (
                   1275: /*
                   1276:        Local variables : 
                   1277:        ecx = len
                   1278:        edi = data
                   1279:        esi = st0x_cr_sr
                   1280:        ebx = st0x_dr
                   1281: 
                   1282:        Test for room to read
                   1283: */
                   1284:        "\torl %%ecx, %%ecx
                   1285:        jz 2f
                   1286: 
                   1287:        cld
                   1288:        movl " SYMBOL_NAME_STR(st0x_cr_sr) ", %%esi
                   1289:        movl " SYMBOL_NAME_STR(st0x_dr) ", %%ebx
                   1290: 
                   1291: 1:     movb (%%esi), %%al\n"
                   1292: /*
                   1293:        Test for BSY
                   1294: */
                   1295: 
                   1296:        "\ttest $1, %%al 
                   1297:        jz 2f\n"
                   1298: 
                   1299: /*
                   1300:        Test for data in phase - STATUS & REQ_MASK should be REQ_DATAIN, = STAT_IO, which is 4.
                   1301: */
                   1302:        "\tmovb $0xe, %%ah      
                   1303:        andb %%al, %%ah
                   1304:        cmpb $0x04, %%ah
                   1305:        jne 2f\n"
                   1306:                
                   1307: /*
                   1308:        Test for REQ
                   1309: */     
                   1310:        "\ttest $0x10, %%al
                   1311:        jz 1b
                   1312: 
                   1313:        movb (%%ebx), %%al      
                   1314:        stosb   
                   1315:        loop 1b\n"
                   1316: 
                   1317: "2:\n"
                   1318:                                                                        :
                   1319: /* output */
                   1320: "=D" (data), "=c" (len) :
                   1321: /* input */
                   1322: "0" (data), "1" (len) :
                   1323: /* clobbered */
                   1324: "eax","ebx", "esi"); 
                   1325: 
                   1326: #if (DEBUG & PHASE_DATAIN)
                   1327:        printk("scsi%d: transfered -= %d\n", hostno, len);
                   1328:        transfered -= len;              /* Since we assumed all of Len got 
                   1329:                                         * transfered, correct our mistake */
                   1330: #endif
                   1331: }
                   1332:        
                   1333:                        if (!len && nobuffs) {
                   1334:                                --nobuffs;
                   1335:                                ++buffer;
                   1336:                                len = buffer->length;
                   1337:                                data = (unsigned char *) buffer->address;
                   1338: #if (DEBUG & DEBUG_SG)
                   1339:        printk("scsi%d : next scatter-gather buffer len = %d address = %08x\n",
                   1340:                hostno, len, data);
                   1341: #endif
                   1342:                        }
                   1343: 
                   1344:                        break;
                   1345: 
                   1346:                case REQ_CMDOUT : 
                   1347:                        while (((status_read = STATUS) & STAT_BSY) && 
                   1348:                               ((status_read & REQ_MASK) == REQ_CMDOUT))
                   1349:                                if (status_read & STAT_REQ) {
                   1350:                                        DATA = *(const unsigned char *) cmnd;
                   1351:                                        cmnd = 1+(const unsigned char *) cmnd;
                   1352: #ifdef SLOW_HANDSHAKE
                   1353:                                        if (borken) 
                   1354:                                                borken_wait();
                   1355: #endif
                   1356:                                }
                   1357:                        break;
                   1358:        
                   1359:                case REQ_STATIN : 
                   1360:                        status = DATA;
                   1361:                        break;
                   1362:                                
                   1363:                case REQ_MSGOUT : 
                   1364: /*
                   1365:  *     We can only have sent a MSG OUT if we requested to do this 
                   1366:  *     by raising ATTN.  So, we must drop ATTN.
                   1367:  */
                   1368: 
                   1369:                        CONTROL = BASE_CMD | CMD_DRVR_ENABLE;
                   1370: /*
                   1371:  *     If we are reconnecting, then we must send an IDENTIFY message in 
                   1372:  *      response  to MSGOUT.
                   1373:  */
                   1374:                        switch (reselect) {
                   1375:                        case CAN_RECONNECT:
                   1376:                                DATA = IDENTIFY(1, lun);
                   1377: 
                   1378: #if (DEBUG & (PHASE_RESELECT | PHASE_MSGOUT)) 
                   1379:                                printk("scsi%d : sent IDENTIFY message.\n", hostno);
                   1380: #endif
                   1381:                                break;
                   1382: #ifdef LINKED
                   1383:                        case LINKED_WRONG:
                   1384:                                DATA = ABORT;
                   1385:                                linked_connected = 0;
                   1386:                                reselect = CAN_RECONNECT;
                   1387:                                goto connect_loop;
                   1388: #if (DEBUG & (PHASE_MSGOUT | DEBUG_LINKED))
                   1389:                                printk("scsi%d : sent ABORT message to cancel incorrect I_T_L nexus.\n", hostno);
                   1390: #endif
                   1391: #endif /* LINKED */
                   1392: #if (DEBUG & DEBUG_LINKED) 
                   1393:            printk("correct\n");
                   1394: #endif
                   1395:                        default:
                   1396:                                DATA = NOP;
                   1397:                                printk("scsi%d : target %d requested MSGOUT, sent NOP message.\n", hostno, target);
                   1398:                        }
                   1399:                        break;
                   1400:                                        
                   1401:                case REQ_MSGIN : 
                   1402:                        switch (message = DATA) {
                   1403:                        case DISCONNECT :
                   1404:                                should_reconnect = 1;
                   1405:                                current_data = data;    /* WDE add */
                   1406:                                current_buffer = buffer;
                   1407:                                current_bufflen = len;  /* WDE add */
                   1408:                                current_nobuffs = nobuffs;
                   1409: #ifdef LINKED
                   1410:                                linked_connected = 0;
                   1411: #endif
                   1412:                                done=1;
                   1413: #if (DEBUG & (PHASE_RESELECT | PHASE_MSGIN))
                   1414:                                printk("scsi%d : disconnected.\n", hostno);
                   1415: #endif
                   1416:                                break;
                   1417: 
                   1418: #ifdef LINKED
                   1419:                        case LINKED_CMD_COMPLETE:
                   1420:                        case LINKED_FLG_CMD_COMPLETE:
                   1421: #endif
                   1422:                        case COMMAND_COMPLETE :
                   1423: /*
                   1424:  * Note : we should check for underflow here.   
                   1425:  */
                   1426: #if (DEBUG & PHASE_MSGIN)      
                   1427:                                printk("scsi%d : command complete.\n", hostno);
                   1428: #endif
                   1429:                                done = 1;
                   1430:                                break;
                   1431:                        case ABORT :
                   1432: #if (DEBUG & PHASE_MSGIN)
                   1433:                                printk("scsi%d : abort message.\n", hostno);
                   1434: #endif
                   1435:                                done=1;
                   1436:                                break;
                   1437:                        case SAVE_POINTERS :
                   1438:                                current_buffer = buffer;
                   1439:                                current_bufflen = len;  /* WDE add */
                   1440:                                current_data = data;    /* WDE mod */
                   1441:                                current_nobuffs = nobuffs;
                   1442: #if (DEBUG & PHASE_MSGIN)
                   1443:                                printk("scsi%d : pointers saved.\n", hostno);
                   1444: #endif 
                   1445:                                break;
                   1446:                        case RESTORE_POINTERS:
                   1447:                                buffer=current_buffer;
                   1448:                                cmnd=current_cmnd;
                   1449:                                data=current_data;      /* WDE mod */
                   1450:                                len=current_bufflen;
                   1451:                                nobuffs=current_nobuffs;
                   1452: #if (DEBUG & PHASE_MSGIN)
                   1453:                                printk("scsi%d : pointers restored.\n", hostno);
                   1454: #endif
                   1455:                                break;
                   1456:                        default:
                   1457: 
                   1458: /*
                   1459:  *     IDENTIFY distinguishes itself from the other messages by setting the
                   1460:  *     high byte.
                   1461:  *     
                   1462:  *     Note : we need to handle at least one outstanding command per LUN,
                   1463:  *     and need to hash the SCSI command for that I_T_L nexus based on the 
                   1464:  *     known ID (at this point) and LUN.
                   1465:  */
                   1466: 
                   1467:                                if (message & 0x80) {
                   1468: #if (DEBUG & PHASE_MSGIN)
                   1469:                                        printk("scsi%d : IDENTIFY message received from id %d, lun %d.\n",
                   1470:                                                hostno, target, message & 7);
                   1471: #endif
                   1472:                                } else {
                   1473: 
                   1474: /*
                   1475:  *      We should go into a MESSAGE OUT phase, and send  a MESSAGE_REJECT 
                   1476:  *     if we run into a message that we don't like.  The seagate driver 
                   1477:  *     needs some serious restructuring first though.
                   1478:  */
                   1479: 
                   1480: #if (DEBUG & PHASE_MSGIN)
                   1481:                                        printk("scsi%d : unknown message %d from target %d.\n",
                   1482:                                                hostno,  message,   target);
                   1483: #endif 
                   1484:                                }
                   1485:                        }
                   1486:                        break;
                   1487: 
                   1488:                default : 
                   1489:                        printk("scsi%d : unknown phase.\n", hostno); 
                   1490:                        st0x_aborted = DID_ERROR; 
                   1491:                }       
                   1492: 
                   1493: #ifdef SLOW_HANDSHAKE
                   1494: /*
                   1495:  * I really don't care to deal with borken devices in each single 
                   1496:  * byte transfer case (ie, message in, message out, status), so
                   1497:  * I'll do the wait here if necessary.
                   1498:  */
                   1499:                if (borken)
                   1500:                        borken_wait();
                   1501: #endif
                   1502:  
                   1503:                } /* if ends */
                   1504:                } /* while ends */
                   1505: 
                   1506: #if (DEBUG & (PHASE_DATAIN | PHASE_DATAOUT | PHASE_EXIT))
                   1507:        printk("scsi%d : Transfered %d bytes\n", hostno, transfered);
                   1508: #endif
                   1509: 
                   1510: #if (DEBUG & PHASE_EXIT)
                   1511: #if 0          /* Doesn't work for scatter / gather */
                   1512:        printk("Buffer : \n");
                   1513:        for (i = 0; i < 20; ++i) 
                   1514:                printk ("%02x  ", ((unsigned char *) data)[i]); /* WDE mod */
                   1515:        printk("\n");
                   1516: #endif
                   1517:        printk("scsi%d : status = ", hostno);
                   1518:        print_status(status);
                   1519:        printk("message = %02x\n", message);
                   1520: #endif
                   1521: 
                   1522: 
                   1523: /* We shouldn't reach this until *after* BSY has been deasserted */
                   1524: #ifdef notyet
                   1525:        if (st0x_aborted) {
                   1526:                if (STATUS & STAT_BSY) {        
                   1527:                        seagate_st0x_reset(NULL);
                   1528:                        st0x_aborted = DID_RESET;
                   1529:                } 
                   1530:                abort_confirm = 1;
                   1531:        } 
                   1532: #endif
                   1533: 
                   1534: #ifdef LINKED
                   1535: else {
                   1536: /*
                   1537:  * Fix the message byte so that unsuspecting high level drivers don't 
                   1538:  * puke when they see a LINKED COMMAND message in place of the COMMAND 
                   1539:  * COMPLETE they may be expecting.  Shouldn't be necessary, but it's 
                   1540:  * better to be on the safe side. 
                   1541:  *
                   1542:  * A non LINKED* message byte will indicate that the command completed, 
                   1543:  * and we are now disconnected.
                   1544:  */
                   1545: 
                   1546:                switch (message) {
                   1547:                case LINKED_CMD_COMPLETE :
                   1548:                case LINKED_FLG_CMD_COMPLETE : 
                   1549:                        message = COMMAND_COMPLETE;
                   1550:                        linked_target = current_target;
                   1551:                        linked_lun = current_lun;
                   1552:                        linked_connected = 1;
                   1553: #if (DEBUG & DEBUG_LINKED)
                   1554:                        printk("scsi%d : keeping I_T_L nexus established for linked command.\n", 
                   1555:                                hostno);
                   1556: #endif
                   1557: /*
                   1558:  * We also will need to adjust status to accommodate intermediate conditions.
                   1559:  */
                   1560:                        if ((status == INTERMEDIATE_GOOD) ||
                   1561:                                (status == INTERMEDIATE_C_GOOD))
                   1562:                                status = GOOD;
                   1563:                        
                   1564:                        break;
                   1565: /*
                   1566:  * We should also handle what are "normal" termination messages 
                   1567:  * here (ABORT, BUS_DEVICE_RESET?, and COMMAND_COMPLETE individually, 
                   1568:  * and flake if things aren't right.
                   1569:  */
                   1570: 
                   1571:                default :
                   1572: #if (DEBUG & DEBUG_LINKED)
                   1573:                        printk("scsi%d : closing I_T_L nexus.\n", hostno);
                   1574: #endif
                   1575:                        linked_connected = 0;
                   1576:                }
                   1577:        }
                   1578: #endif /* LINKED */
                   1579: 
                   1580: 
                   1581: 
                   1582: 
                   1583:        if (should_reconnect) {
                   1584: #if (DEBUG & PHASE_RESELECT)
                   1585:                printk("scsi%d : exiting seagate_st0x_queue_command() with reconnect enabled.\n",
                   1586:                        hostno);
                   1587: #endif
                   1588:                CONTROL = BASE_CMD | CMD_INTR ;
                   1589:        } else 
                   1590:                CONTROL = BASE_CMD;
                   1591: 
                   1592:        return retcode (st0x_aborted);
                   1593:        }
                   1594: 
                   1595: int seagate_st0x_abort (Scsi_Cmnd * SCpnt)
                   1596:        {
                   1597:          st0x_aborted = DID_ABORT;
                   1598:          
                   1599:          return SCSI_ABORT_PENDING;
                   1600:        }
                   1601: 
                   1602: /*
                   1603:        the seagate_st0x_reset function resets the SCSI bus
                   1604: */
                   1605:        
                   1606: int seagate_st0x_reset (Scsi_Cmnd * SCpnt, unsigned int reset_flags)
                   1607:        {
                   1608:        unsigned clock;
                   1609:        /*
                   1610:                No timeouts - this command is going to fail because 
                   1611:                it was reset.
                   1612:        */
                   1613: 
                   1614: #ifdef DEBUG
                   1615:        printk("In seagate_st0x_reset()\n");
                   1616: #endif
                   1617: 
                   1618: 
                   1619:        /* assert  RESET signal on SCSI bus.  */
                   1620:                
                   1621:        CONTROL = BASE_CMD  | CMD_RST;
                   1622:        clock=jiffies+2;
                   1623: 
                   1624:        
                   1625:        /* Wait.  */
                   1626:        
                   1627:        while (jiffies < clock);
                   1628: 
                   1629:        CONTROL = BASE_CMD;
                   1630:        
                   1631:        st0x_aborted = DID_RESET;
                   1632: 
                   1633: #ifdef DEBUG
                   1634:        printk("SCSI bus reset.\n");
                   1635: #endif
                   1636:        return SCSI_RESET_WAKEUP;
                   1637:        }
                   1638: 
                   1639: #include <asm/segment.h>
                   1640: #include "sd.h"
                   1641: #include <scsi/scsi_ioctl.h>
                   1642: 
                   1643: int seagate_st0x_biosparam(Disk * disk, kdev_t dev, int* ip) {
                   1644:   unsigned char buf[256 + sizeof(int) * 2], cmd[6], *data, *page;
                   1645:   int *sizes, result, formatted_sectors, total_sectors;
                   1646:   int cylinders, heads, sectors;
                   1647:   int capacity;
                   1648: 
                   1649: /*
                   1650:  * Only SCSI-I CCS drives and later implement the necessary mode sense 
                   1651:  * pages.  
                   1652:  */
                   1653: 
                   1654:   if (disk->device->scsi_level < 2) 
                   1655:        return -1;
                   1656: 
                   1657:   sizes = (int *) buf;
                   1658:   data = (unsigned char *) (sizes + 2);
                   1659: 
                   1660:   cmd[0] = MODE_SENSE;
                   1661:   cmd[1] = (disk->device->lun << 5) & 0xe5;
                   1662:   cmd[2] = 0x04; /* Read page 4, rigid disk geometry page current values */
                   1663:   cmd[3] = 0;
                   1664:   cmd[4] = 255;
                   1665:   cmd[5] = 0;
                   1666: 
                   1667: /*
                   1668:  * We are transferring 0 bytes in the out direction, and expect to get back
                   1669:  * 24 bytes for each mode page.
                   1670:  */
                   1671: 
                   1672:   sizes[0] = 0;
                   1673:   sizes[1] = 256;
                   1674: 
                   1675:   memcpy (data, cmd, 6);
                   1676: 
                   1677:   if (!(result = kernel_scsi_ioctl (disk->device, SCSI_IOCTL_SEND_COMMAND, (void *) buf))) {
                   1678: /*
                   1679:  * The mode page lies beyond the MODE SENSE header, with length 4, and 
                   1680:  * the BLOCK DESCRIPTOR, with length header[3].
                   1681:  */
                   1682: 
                   1683:     page = data + 4 + data[3];
                   1684:     heads = (int) page[5];
                   1685:     cylinders = (page[2] << 16) | (page[3] << 8) | page[4];
                   1686: 
                   1687:     cmd[2] = 0x03; /* Read page 3, format page current values */
                   1688:     memcpy (data, cmd, 6);
                   1689: 
                   1690:     if (!(result = kernel_scsi_ioctl (disk->device, SCSI_IOCTL_SEND_COMMAND, (void *) buf))) {
                   1691:       page = data + 4 + data[3];
                   1692:       sectors = (page[10] << 8) | page[11];    
                   1693: 
                   1694:        
                   1695: /*
                   1696:  * Get the total number of formatted sectors from the block descriptor, 
                   1697:  * so we can tell how many are being used for alternates.  
                   1698:  */
                   1699: 
                   1700:       formatted_sectors = (data[4 + 1] << 16) | (data[4 + 2] << 8) |
                   1701:        data[4 + 3] ;
                   1702: 
                   1703:       total_sectors = (heads * cylinders * sectors);
                   1704: 
                   1705: /*
                   1706:  * Adjust the real geometry by subtracting 
                   1707:  * (spare sectors / (heads * tracks)) cylinders from the number of cylinders.
                   1708:  *
                   1709:  * It appears that the CE cylinder CAN be a partial cylinder.
                   1710:  */
                   1711: 
                   1712:      
                   1713: printk("scsi%d : heads = %d cylinders = %d sectors = %d total = %d formatted = %d\n",
                   1714:     hostno, heads, cylinders, sectors, total_sectors, formatted_sectors);
                   1715: 
                   1716:       if (!heads || !sectors || !cylinders)
                   1717:        result = -1;
                   1718:       else
                   1719:        cylinders -= ((total_sectors - formatted_sectors) / (heads * sectors));
                   1720: 
                   1721: /*
                   1722:  * Now, we need to do a sanity check on the geometry to see if it is 
                   1723:  * BIOS compatible.  The maximum BIOS geometry is 1024 cylinders * 
                   1724:  * 256 heads * 64 sectors. 
                   1725:  */
                   1726: 
                   1727:       if ((cylinders > 1024) || (sectors > 64)) {
                   1728:        /* The Seagate's seem to have some mapping
                   1729:         * Multiple heads * sectors * cyl to get capacity
                   1730:         * Then start rounding down. */
                   1731:        capacity = heads * sectors * cylinders;
                   1732:        sectors = 17;   /* Old MFM Drives use this, so does the Seagate */
                   1733:        heads = 2;
                   1734:        capacity = capacity / sectors;
                   1735:        while (cylinders > 1024)
                   1736:        {
                   1737:                heads *= 2;     /* For some reason, they go in multiples */
                   1738:                cylinders = capacity / heads;
                   1739:        }
                   1740:       }
                   1741:       ip[0] = heads;
                   1742:       ip[1] = sectors;
                   1743:       ip[2] = cylinders;
                   1744: 
                   1745: /* 
                   1746:  * There should be an alternate mapping for things the seagate doesn't
                   1747:  * understand, but I couldn't say what it is with reasonable certainty.
                   1748:  */
                   1749: 
                   1750:       }
                   1751:     }
                   1752:     
                   1753:   return result;
                   1754: }
                   1755: 
                   1756: #ifdef MODULE
                   1757: /* Eventually this will go into an include file, but this will be later */
                   1758: Scsi_Host_Template driver_template = SEAGATE_ST0X;
                   1759: 
                   1760: #include "scsi_module.c"
                   1761: #endif

unix.superglobalmegacorp.com

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