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

unix.superglobalmegacorp.com

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