Annotation of Gnu-Mach/linux/src/drivers/scsi/aha1542.c, revision 1.1.1.2

1.1       root        1: /* $Id: aha1542.c,v 1.1 1999/04/26 05:54:11 tb Exp $
                      2:  *  linux/kernel/aha1542.c
                      3:  *
                      4:  *  Copyright (C) 1992  Tommy Thorn
                      5:  *  Copyright (C) 1993, 1994, 1995 Eric Youngdale
                      6:  *
                      7:  *  Modified by Eric Youngdale
                      8:  *        Use request_irq and request_dma to help prevent unexpected conflicts
                      9:  *        Set up on-board DMA controller, such that we do not have to
                     10:  *        have the bios enabled to use the aha1542.
                     11:  *  Modified by David Gentzel
                     12:  *       Don't call request_dma if dma mask is 0 (for BusLogic BT-445S VL-Bus
                     13:  *        controller).
                     14:  *  Modified by Matti Aarnio
                     15:  *        Accept parameters from LILO cmd-line. -- 1-Oct-94
                     16:  *  Modified by Mike McLagan <[email protected]>
                     17:  *        Recognise extended mode on AHA1542CP, different bit than 1542CF
                     18:  *        1-Jan-97
                     19:  *  Modified by Bjorn L. Thordarson and Einar Thor Einarsson
                     20:  *        Recognize that DMA0 is valid DMA channel -- 13-Jul-98
                     21:  */
                     22: 
                     23: #include <linux/module.h>
                     24: 
                     25: #include <linux/kernel.h>
                     26: #include <linux/head.h>
                     27: #include <linux/types.h>
                     28: #include <linux/string.h>
                     29: #include <linux/ioport.h>
                     30: #include <linux/delay.h>
                     31: #include <linux/sched.h>
                     32: #include <linux/proc_fs.h>
                     33: #include <asm/dma.h>
                     34: #include <asm/system.h>
                     35: #include <asm/io.h>
                     36: #include <linux/blk.h>
                     37: #include "scsi.h"
                     38: #include "hosts.h"
                     39: 
                     40: 
                     41: #include "aha1542.h"
                     42: 
                     43: #include<linux/stat.h>
                     44: 
                     45: struct proc_dir_entry proc_scsi_aha1542 = {
                     46:     PROC_SCSI_AHA1542, 7, "aha1542",
                     47:     S_IFDIR | S_IRUGO | S_IXUGO, 2
                     48: };
                     49: 
                     50: #ifdef DEBUG
                     51: #define DEB(x) x
                     52: #else
                     53: #define DEB(x)
                     54: #endif
                     55: /*
1.1.1.2 ! root       56: static const char RCSid[] = "$Header: /cvs/gnumach/linux/src/drivers/scsi/aha1542.c,v 1.1 1999/04/26 05:54:11 tb Exp $";
1.1       root       57: */
                     58: 
                     59: /* The adaptec can be configured for quite a number of addresses, but
                     60: I generally do not want the card poking around at random.  We allow
                     61: two addresses - this allows people to use the Adaptec with a Midi
                     62: card, which also used 0x330 -- can be overridden with LILO! */
                     63: 
                     64: #define MAXBOARDS 2    /* Increase this and the sizes of the
                     65:                           arrays below, if you need more.. */
                     66: 
                     67: static unsigned int bases[MAXBOARDS]={0x330, 0x334};
                     68: 
                     69: /* set by aha1542_setup according to the command line */
                     70: static int setup_called[MAXBOARDS]   = {0,0};
                     71: static int setup_buson[MAXBOARDS]    = {0,0};
                     72: static int setup_busoff[MAXBOARDS]   = {0,0};
                     73: static int setup_dmaspeed[MAXBOARDS] = {-1,-1};
                     74: 
                     75: static char *setup_str[MAXBOARDS] = {(char *)NULL,(char *)NULL};
                     76: 
                     77: /*
                     78:  * LILO params:  aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]
                     79:  *
                     80:  * Where:  <PORTBASE> is any of the valid AHA addresses:
                     81:  *                     0x130, 0x134, 0x230, 0x234, 0x330, 0x334
                     82:  *        <BUSON>  is the time (in microsecs) that AHA spends on the AT-bus
                     83:  *                 when transferring data.  1542A power-on default is 11us,
                     84:  *                 valid values are in range: 2..15 (decimal)
                     85:  *        <BUSOFF> is the time that AHA spends OFF THE BUS after while
                     86:  *                 it is transferring data (not to monopolize the bus).
                     87:  *                 Power-on default is 4us, valid range: 1..64 microseconds.
                     88:  *        <DMASPEED> Default is jumper selected (1542A: on the J1),
                     89:  *                 but experimenter can alter it with this.
                     90:  *                 Valid values: 5, 6, 7, 8, 10 (MB/s)
                     91:  *                 Factory default is 5 MB/s.
                     92:  */
                     93: 
                     94: #define BIOS_TRANSLATION_1632 0  /* Used by some old 1542A boards */
                     95: #define BIOS_TRANSLATION_6432 1 /* Default case these days */
                     96: #define BIOS_TRANSLATION_25563 2 /* Big disk case */
                     97: 
                     98: struct aha1542_hostdata{
                     99:        /* This will effectively start both of them at the first mailbox */
                    100:        int bios_translation;   /* Mapping bios uses - for compatibility */
                    101:        int aha1542_last_mbi_used;
                    102:        int aha1542_last_mbo_used;
                    103:        Scsi_Cmnd * SCint[AHA1542_MAILBOXES];
                    104:        struct mailbox mb[2*AHA1542_MAILBOXES];
                    105:        struct ccb ccb[AHA1542_MAILBOXES];
                    106: };
                    107: 
                    108: #define HOSTDATA(host) ((struct aha1542_hostdata *) &host->hostdata)
                    109: 
                    110: static struct Scsi_Host * aha_host[7] = {NULL,};  /* One for each IRQ level (9-15) */
                    111: 
                    112: 
                    113: 
                    114: 
                    115: #define WAITnexttimeout 3000000
                    116: 
                    117: static void setup_mailboxes(int base_io, struct Scsi_Host * shpnt);
                    118: static int aha1542_restart(struct Scsi_Host * shost);
                    119: 
                    120: #define aha1542_intr_reset(base)  outb(IRST, CONTROL(base))
                    121: 
                    122: #define WAIT(port, mask, allof, noneof)                                        \
                    123:  { register WAITbits;                                                  \
                    124:    register WAITtimeout = WAITnexttimeout;                             \
                    125:    while (1) {                                                         \
                    126:      WAITbits = inb(port) & (mask);                                    \
                    127:      if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
                    128:        break;                                                          \
                    129:      if (--WAITtimeout == 0) goto fail;                                        \
                    130:    }                                                                   \
                    131:  }
                    132: 
                    133: /* Similar to WAIT, except we use the udelay call to regulate the
                    134:    amount of time we wait.  */
                    135: #define WAITd(port, mask, allof, noneof, timeout)                      \
                    136:  { register WAITbits;                                                  \
                    137:    register WAITtimeout = timeout;                                     \
                    138:    while (1) {                                                         \
                    139:      WAITbits = inb(port) & (mask);                                    \
                    140:      if ((WAITbits & (allof)) == (allof) && ((WAITbits & (noneof)) == 0)) \
                    141:        break;                                                          \
                    142:      udelay(1000);                                                     \
                    143:      if (--WAITtimeout == 0) goto fail;                                        \
                    144:    }                                                                   \
                    145:  }
                    146: 
                    147: static void aha1542_stat(void)
                    148: {
                    149: /*    int s = inb(STATUS), i = inb(INTRFLAGS);
                    150:   printk("status=%x intrflags=%x\n", s, i, WAITnexttimeout-WAITtimeout); */
                    151: }
                    152: 
                    153: /* This is a bit complicated, but we need to make sure that an interrupt
                    154:    routine does not send something out while we are in the middle of this.
                    155:    Fortunately, it is only at boot time that multi-byte messages
                    156:    are ever sent. */
                    157: static int aha1542_out(unsigned int base, unchar *cmdp, int len)
                    158: {
                    159:   unsigned long flags = 0;
                    160:   
                    161:   save_flags(flags);
                    162:   if(len == 1) {
                    163:     while(1==1){
                    164:        WAIT(STATUS(base), CDF, 0, CDF);
                    165:        cli();
                    166:        if(inb(STATUS(base)) & CDF) {restore_flags(flags); continue;}
                    167:        outb(*cmdp, DATA(base));
                    168:        restore_flags(flags);
                    169:        return 0;
                    170:       }
                    171:   } else {
                    172:     cli();
                    173:     while (len--)
                    174:       {
                    175:        WAIT(STATUS(base), CDF, 0, CDF);
                    176:        outb(*cmdp++, DATA(base));
                    177:       }
                    178:     restore_flags(flags);
                    179:   }
                    180:     return 0;
                    181:   fail:
                    182:     restore_flags(flags);
                    183:     printk("aha1542_out failed(%d): ", len+1); aha1542_stat();
                    184:     return 1;
                    185: }
                    186: 
                    187: /* Only used at boot time, so we do not need to worry about latency as much
                    188:    here */
                    189: static int aha1542_in(unsigned int base, unchar *cmdp, int len)
                    190: {
                    191:     unsigned long flags;
                    192: 
                    193:     save_flags(flags);
                    194:     cli();
                    195:     while (len--)
                    196:       {
                    197:          WAIT(STATUS(base), DF, DF, 0);
                    198:          *cmdp++ = inb(DATA(base));
                    199:       }
                    200:     restore_flags(flags);
                    201:     return 0;
                    202:   fail:
                    203:     restore_flags(flags);
                    204:     printk("aha1542_in failed(%d): ", len+1); aha1542_stat();
                    205:     return 1;
                    206: }
                    207: 
                    208: /* Similar to aha1542_in, except that we wait a very short period of time.
                    209:    We use this if we know the board is alive and awake, but we are not sure
                    210:    if the board will respond to the command we are about to send or not */
                    211: static int aha1542_in1(unsigned int base, unchar *cmdp, int len)
                    212: {
                    213:     unsigned long flags;
                    214:     
                    215:     save_flags(flags);
                    216:     cli();
                    217:     while (len--)
                    218:       {
                    219:          WAITd(STATUS(base), DF, DF, 0, 100);
                    220:          *cmdp++ = inb(DATA(base));
                    221:       }
                    222:     restore_flags(flags);
                    223:     return 0;
                    224:   fail:
                    225:     restore_flags(flags);
                    226:     return 1;
                    227: }
                    228: 
                    229: static int makecode(unsigned hosterr, unsigned scsierr)
                    230: {
                    231:     switch (hosterr) {
                    232:       case 0x0:
                    233:       case 0xa: /* Linked command complete without error and linked normally */
                    234:       case 0xb: /* Linked command complete without error, interrupt generated */
                    235:        hosterr = 0;
                    236:        break;
                    237: 
                    238:       case 0x11: /* Selection time out-The initiator selection or target
                    239:                    reselection was not complete within the SCSI Time out period */
                    240:        hosterr = DID_TIME_OUT;
                    241:        break;
                    242: 
                    243:       case 0x12: /* Data overrun/underrun-The target attempted to transfer more data
                    244:                    than was allocated by the Data Length field or the sum of the
                    245:                    Scatter / Gather Data Length fields. */
                    246: 
                    247:       case 0x13: /* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
                    248: 
                    249:       case 0x15: /* MBO command was not 00, 01 or 02-The first byte of the CB was
                    250:                    invalid. This usually indicates a software failure. */
                    251: 
                    252:       case 0x16: /* Invalid CCB Operation Code-The first byte of the CCB was invalid.
                    253:                    This usually indicates a software failure. */
                    254: 
                    255:       case 0x17: /* Linked CCB does not have the same LUN-A subsequent CCB of a set
                    256:                    of linked CCB's does not specify the same logical unit number as
                    257:                    the first. */
                    258:       case 0x18: /* Invalid Target Direction received from Host-The direction of a
                    259:                    Target Mode CCB was invalid. */
                    260: 
                    261:       case 0x19: /* Duplicate CCB Received in Target Mode-More than once CCB was
                    262:                    received to service data transfer between the same target LUN
                    263:                    and initiator SCSI ID in the same direction. */
                    264: 
                    265:       case 0x1a: /* Invalid CCB or Segment List Parameter-A segment list with a zero
                    266:                    length segment or invalid segment list boundaries was received.
                    267:                    A CCB parameter was invalid. */
                    268:        DEB(printk("Aha1542: %x %x\n", hosterr, scsierr));
                    269:        hosterr = DID_ERROR; /* Couldn't find any better */
                    270:        break;
                    271: 
                    272:       case 0x14: /* Target bus phase sequence failure-An invalid bus phase or bus
                    273:                    phase sequence was requested by the target. The host adapter
                    274:                    will generate a SCSI Reset Condition, notifying the host with
                    275:                    a SCRD interrupt */
                    276:        hosterr = DID_RESET;
                    277:        break;
                    278:       default:
                    279:        printk("makecode: unknown hoststatus %x\n", hosterr);
                    280:        break;
                    281:     }
                    282:     return scsierr|(hosterr << 16);
                    283: }
                    284: 
                    285: static int aha1542_test_port(int bse, struct Scsi_Host * shpnt)
                    286: {
                    287:     int i;
                    288:     unchar inquiry_cmd[] = {CMD_INQUIRY };
                    289:     unchar inquiry_result[4];
                    290:     unchar *cmdp;
                    291:     int len;
                    292:     volatile int debug = 0;
                    293:     
                    294:     /* Quick and dirty test for presence of the card. */
                    295:     if(inb(STATUS(bse)) == 0xff) return 0;
                    296: 
                    297:     /* Reset the adapter. I ought to make a hard reset, but it's not really necessary */
                    298:     
                    299:     /*  DEB(printk("aha1542_test_port called \n")); */
                    300: 
                    301:     /* In case some other card was probing here, reset interrupts */
                    302:     aha1542_intr_reset(bse);     /* reset interrupts, so they don't block */   
                    303: 
                    304:     outb(SRST|IRST/*|SCRST*/, CONTROL(bse));
                    305: 
                    306:     i = jiffies + 2;
                    307:     while (i>jiffies); /* Wait a little bit for things to settle down. */
                    308:     
                    309:     debug = 1;
                    310:     /* Expect INIT and IDLE, any of the others are bad */
                    311:     WAIT(STATUS(bse), STATMASK, INIT|IDLE, STST|DIAGF|INVDCMD|DF|CDF);
                    312:     
                    313:     debug = 2;
                    314:     /* Shouldn't have generated any interrupts during reset */
                    315:     if (inb(INTRFLAGS(bse))&INTRMASK) goto fail;
                    316: 
                    317: 
                    318:     /* Perform a host adapter inquiry instead so we do not need to set
                    319:        up the mailboxes ahead of time */
                    320: 
                    321:     aha1542_out(bse, inquiry_cmd, 1);
                    322: 
                    323:     debug = 3;
                    324:     len = 4;
                    325:     cmdp = &inquiry_result[0];
                    326: 
                    327:     while (len--)
                    328:       {
                    329:          WAIT(STATUS(bse), DF, DF, 0);
                    330:          *cmdp++ = inb(DATA(bse));
                    331:       }
                    332:     
                    333:     debug = 8;
                    334:     /* Reading port should reset DF */
                    335:     if (inb(STATUS(bse)) & DF) goto fail;
                    336:     
                    337:     debug = 9;
                    338:     /* When HACC, command is completed, and we're though testing */
                    339:     WAIT(INTRFLAGS(bse), HACC, HACC, 0);
                    340:     /* now initialize adapter */
                    341:     
                    342:     debug = 10;
                    343:     /* Clear interrupts */
                    344:     outb(IRST, CONTROL(bse));
                    345:     
                    346:     debug = 11;
                    347: 
                    348:     return debug;                              /* 1 = ok */
                    349:   fail:
                    350:     return 0;                                  /* 0 = not ok */
                    351: }
                    352: 
                    353: /* A "high" level interrupt handler */
                    354: static void aha1542_intr_handle(int irq, void *dev_id, struct pt_regs *regs)
                    355: {
                    356:     void (*my_done)(Scsi_Cmnd *) = NULL;
                    357:     int errstatus, mbi, mbo, mbistatus;
                    358:     int number_serviced;
                    359:     unsigned int flags;
                    360:     struct Scsi_Host * shost;
                    361:     Scsi_Cmnd * SCtmp;
                    362:     int flag;
                    363:     int needs_restart;
                    364:     struct mailbox * mb;
                    365:     struct ccb  *ccb;
                    366: 
                    367:     shost = aha_host[irq - 9];
                    368:     if(!shost) panic("Splunge!");
                    369: 
                    370:     mb = HOSTDATA(shost)->mb;
                    371:     ccb = HOSTDATA(shost)->ccb;
                    372: 
                    373: #ifdef DEBUG
                    374:     {
                    375:     flag = inb(INTRFLAGS(shost->io_port));
                    376:     printk("aha1542_intr_handle: ");
                    377:     if (!(flag&ANYINTR)) printk("no interrupt?");
                    378:     if (flag&MBIF) printk("MBIF ");
                    379:     if (flag&MBOA) printk("MBOF ");
                    380:     if (flag&HACC) printk("HACC ");
                    381:     if (flag&SCRD) printk("SCRD ");
                    382:     printk("status %02x\n", inb(STATUS(shost->io_port)));
                    383:   };
                    384: #endif
                    385:     number_serviced = 0;
                    386:     needs_restart = 0;
                    387: 
                    388:     while(1==1){
                    389:       flag = inb(INTRFLAGS(shost->io_port));
                    390: 
                    391:       /* Check for unusual interrupts.  If any of these happen, we should
                    392:         probably do something special, but for now just printing a message
                    393:         is sufficient.  A SCSI reset detected is something that we really
                    394:         need to deal with in some way. */
                    395:       if (flag & ~MBIF) {
                    396:        if (flag&MBOA) printk("MBOF ");
                    397:        if (flag&HACC) printk("HACC ");
                    398:        if (flag&SCRD) {
                    399:          needs_restart = 1;
                    400:          printk("SCRD ");
                    401:        }
                    402:       }
                    403: 
                    404:       aha1542_intr_reset(shost->io_port);
                    405: 
                    406:       save_flags(flags);
                    407:       cli();
                    408:       mbi = HOSTDATA(shost)->aha1542_last_mbi_used + 1;
                    409:       if (mbi >= 2*AHA1542_MAILBOXES) mbi = AHA1542_MAILBOXES;
                    410:       
                    411:       do{
                    412:        if(mb[mbi].status != 0) break;
                    413:        mbi++;
                    414:        if (mbi >= 2*AHA1542_MAILBOXES) mbi = AHA1542_MAILBOXES;
                    415:       } while (mbi != HOSTDATA(shost)->aha1542_last_mbi_used);
                    416:       
                    417:       if(mb[mbi].status == 0){
                    418:        restore_flags(flags);
                    419:        /* Hmm, no mail.  Must have read it the last time around */
                    420:        if (!number_serviced && !needs_restart)
                    421:          printk("aha1542.c: interrupt received, but no mail.\n");
                    422:        /* We detected a reset.  Restart all pending commands for
                    423:           devices that use the hard reset option */
                    424:        if(needs_restart) aha1542_restart(shost);
                    425:        return;
                    426:       };
                    427: 
                    428:       mbo = (scsi2int(mb[mbi].ccbptr) - ((unsigned int) &ccb[0])) / sizeof(struct ccb);
                    429:       mbistatus = mb[mbi].status;
                    430:       mb[mbi].status = 0;
                    431:       HOSTDATA(shost)->aha1542_last_mbi_used = mbi;
                    432:       restore_flags(flags);
                    433:       
                    434: #ifdef DEBUG
                    435:       {
                    436:        if (ccb[mbo].tarstat|ccb[mbo].hastat)
                    437:          printk("aha1542_command: returning %x (status %d)\n", 
                    438:                 ccb[mbo].tarstat + ((int) ccb[mbo].hastat << 16), mb[mbi].status);
                    439:       };
                    440: #endif
                    441: 
                    442:       if(mbistatus == 3) continue; /* Aborted command not found */
                    443: 
                    444: #ifdef DEBUG
                    445:       printk("...done %d %d\n",mbo, mbi);
                    446: #endif
                    447:       
                    448:       SCtmp = HOSTDATA(shost)->SCint[mbo];
                    449: 
                    450:       if (!SCtmp || !SCtmp->scsi_done) {
                    451:        printk("aha1542_intr_handle: Unexpected interrupt\n");
                    452:        printk("tarstat=%x, hastat=%x idlun=%x ccb#=%d \n", ccb[mbo].tarstat, 
                    453:               ccb[mbo].hastat, ccb[mbo].idlun, mbo);
                    454:        return;
                    455:       }
                    456:       
                    457:       my_done = SCtmp->scsi_done;
                    458:       if (SCtmp->host_scribble) scsi_free(SCtmp->host_scribble, 512);
                    459:       
                    460:       /* Fetch the sense data, and tuck it away, in the required slot.  The
                    461:         Adaptec automatically fetches it, and there is no guarantee that
                    462:         we will still have it in the cdb when we come back */
                    463:       if (ccb[mbo].tarstat == 2)
                    464:        memcpy(SCtmp->sense_buffer, &ccb[mbo].cdb[ccb[mbo].cdblen], 
                    465:               sizeof(SCtmp->sense_buffer));
                    466:       
                    467:       
                    468:       /* is there mail :-) */
                    469:       
                    470:       /* more error checking left out here */
                    471:       if (mbistatus != 1)
                    472:        /* This is surely wrong, but I don't know what's right */
                    473:        errstatus = makecode(ccb[mbo].hastat, ccb[mbo].tarstat);
                    474:       else
                    475:        errstatus = 0;
                    476:       
                    477: #ifdef DEBUG
                    478:       if(errstatus) printk("(aha1542 error:%x %x %x) ",errstatus, 
                    479:                           ccb[mbo].hastat, ccb[mbo].tarstat);
                    480: #endif
                    481: 
                    482:       if (ccb[mbo].tarstat == 2) {
                    483: #ifdef DEBUG
                    484:        int i;
                    485: #endif
                    486:        DEB(printk("aha1542_intr_handle: sense:"));
                    487: #ifdef DEBUG
                    488:        for (i = 0; i < 12; i++)
                    489:          printk("%02x ", ccb[mbo].cdb[ccb[mbo].cdblen+i]);
                    490:        printk("\n");
                    491: #endif
                    492:        /*
                    493:          DEB(printk("aha1542_intr_handle: buf:"));
                    494:          for (i = 0; i < bufflen; i++)
                    495:          printk("%02x ", ((unchar *)buff)[i]);
                    496:          printk("\n");
                    497:          */
                    498:       }
                    499:       DEB(if (errstatus) printk("aha1542_intr_handle: returning %6x\n", errstatus));
                    500:       SCtmp->result = errstatus;
                    501:       HOSTDATA(shost)->SCint[mbo] = NULL;  /* This effectively frees up the mailbox slot, as
                    502:                             far as queuecommand is concerned */
                    503:       my_done(SCtmp);
                    504:       number_serviced++;
                    505:     };
                    506: }
                    507: 
                    508: int aha1542_queuecommand(Scsi_Cmnd * SCpnt, void (*done)(Scsi_Cmnd *))
                    509: {
                    510:     unchar ahacmd = CMD_START_SCSI;
                    511:     unchar direction;
                    512:     unchar *cmd = (unchar *) SCpnt->cmnd;
                    513:     unchar target = SCpnt->target;
                    514:     unchar lun = SCpnt->lun;
                    515:     unsigned long flags;
                    516:     void *buff = SCpnt->request_buffer;
                    517:     int bufflen = SCpnt->request_bufflen;
                    518:     int mbo;
                    519:     struct mailbox * mb;
                    520:     struct ccb  *ccb;
                    521: 
                    522:     DEB(int i);
                    523: 
                    524:     mb = HOSTDATA(SCpnt->host)->mb;
                    525:     ccb = HOSTDATA(SCpnt->host)->ccb;
                    526: 
                    527:     DEB(if (target > 1) {
                    528:       SCpnt->result = DID_TIME_OUT << 16;
                    529:       done(SCpnt); return 0;});
                    530:     
                    531:     if(*cmd == REQUEST_SENSE){
                    532: #ifndef DEBUG
                    533:       if (bufflen != sizeof(SCpnt->sense_buffer)) {
                    534:        printk("Wrong buffer length supplied for request sense (%d)\n",bufflen);
                    535:       };
                    536: #endif
                    537:       SCpnt->result = 0;
                    538:       done(SCpnt); 
                    539:       return 0;
                    540:     };
                    541: 
                    542: #ifdef DEBUG
                    543:     if (*cmd == READ_10 || *cmd == WRITE_10)
                    544:       i = xscsi2int(cmd+2);
                    545:     else if (*cmd == READ_6 || *cmd == WRITE_6)
                    546:       i = scsi2int(cmd+2);
                    547:     else
                    548:       i = -1;
                    549:     if (done)
                    550:       printk("aha1542_queuecommand: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
                    551:     else
                    552:       printk("aha1542_command: dev %d cmd %02x pos %d len %d ", target, *cmd, i, bufflen);
                    553:     aha1542_stat();
                    554:     printk("aha1542_queuecommand: dumping scsi cmd:");
                    555:     for (i = 0; i < SCpnt->cmd_len; i++) printk("%02x ", cmd[i]);
                    556:     printk("\n");
                    557:     if (*cmd == WRITE_10 || *cmd == WRITE_6)
                    558:       return 0; /* we are still testing, so *don't* write */
                    559: #endif
                    560: /* Use the outgoing mailboxes in a round-robin fashion, because this
                    561:    is how the host adapter will scan for them */
                    562: 
                    563:     save_flags(flags);
                    564:     cli();
                    565:     mbo = HOSTDATA(SCpnt->host)->aha1542_last_mbo_used + 1;
                    566:     if (mbo >= AHA1542_MAILBOXES) mbo = 0;
                    567: 
                    568:     do{
                    569:       if(mb[mbo].status == 0 && HOSTDATA(SCpnt->host)->SCint[mbo] == NULL)
                    570:        break;
                    571:       mbo++;
                    572:       if (mbo >= AHA1542_MAILBOXES) mbo = 0;
                    573:     } while (mbo != HOSTDATA(SCpnt->host)->aha1542_last_mbo_used);
                    574: 
                    575:     if(mb[mbo].status || HOSTDATA(SCpnt->host)->SCint[mbo])
                    576:       panic("Unable to find empty mailbox for aha1542.\n");
                    577: 
                    578:     HOSTDATA(SCpnt->host)->SCint[mbo] = SCpnt;  /* This will effectively prevent someone else from
                    579:                            screwing with this cdb. */
                    580: 
                    581:     HOSTDATA(SCpnt->host)->aha1542_last_mbo_used = mbo;    
                    582:     restore_flags(flags);
                    583: 
                    584: #ifdef DEBUG
                    585:     printk("Sending command (%d %x)...",mbo, done);
                    586: #endif
                    587: 
                    588:     any2scsi(mb[mbo].ccbptr, &ccb[mbo]); /* This gets trashed for some reason*/
                    589: 
                    590:     memset(&ccb[mbo], 0, sizeof(struct ccb));
                    591: 
                    592:     ccb[mbo].cdblen = SCpnt->cmd_len;
                    593: 
                    594:     direction = 0;
                    595:     if (*cmd == READ_10 || *cmd == READ_6)
                    596:        direction = 8;
                    597:     else if (*cmd == WRITE_10 || *cmd == WRITE_6)
                    598:        direction = 16;
                    599: 
                    600:     memcpy(ccb[mbo].cdb, cmd, ccb[mbo].cdblen);
                    601: 
                    602:     if (SCpnt->use_sg) {
                    603:       struct scatterlist * sgpnt;
                    604:       struct chain * cptr;
                    605: #ifdef DEBUG
                    606:       unsigned char * ptr;
                    607: #endif
                    608:       int i;
                    609:       ccb[mbo].op = 2;       /* SCSI Initiator Command  w/scatter-gather*/
                    610:       SCpnt->host_scribble = (unsigned char *) scsi_malloc(512);
                    611:       sgpnt = (struct scatterlist *) SCpnt->request_buffer;
                    612:       cptr = (struct chain *) SCpnt->host_scribble; 
                    613:       if (cptr == NULL) panic("aha1542.c: unable to allocate DMA memory\n");
                    614:       for(i=0; i<SCpnt->use_sg; i++) {
                    615:        if(sgpnt[i].length == 0 || SCpnt->use_sg > 16 || 
                    616:           (((int)sgpnt[i].address) & 1) || (sgpnt[i].length & 1)){
                    617:          unsigned char * ptr;
                    618:          printk("Bad segment list supplied to aha1542.c (%d, %d)\n",SCpnt->use_sg,i);
                    619:          for(i=0;i<SCpnt->use_sg;i++){
                    620:            printk("%d: %x %x %d\n",i,(unsigned int) sgpnt[i].address, (unsigned int) sgpnt[i].alt_address,
                    621:                   sgpnt[i].length);
                    622:          };
                    623:          printk("cptr %x: ",(unsigned int) cptr);
                    624:          ptr = (unsigned char *) &cptr[i];
                    625:          for(i=0;i<18;i++) printk("%02x ", ptr[i]);
                    626:          panic("Foooooooood fight!");
                    627:        };
                    628:        any2scsi(cptr[i].dataptr, sgpnt[i].address);
                    629:        if(((unsigned  int) sgpnt[i].address) & 0xff000000) goto baddma;
                    630:        any2scsi(cptr[i].datalen, sgpnt[i].length);
                    631:       };
                    632:       any2scsi(ccb[mbo].datalen, SCpnt->use_sg * sizeof(struct chain));
                    633:       any2scsi(ccb[mbo].dataptr, cptr);
                    634: #ifdef DEBUG
                    635:       printk("cptr %x: ",cptr);
                    636:       ptr = (unsigned char *) cptr;
                    637:       for(i=0;i<18;i++) printk("%02x ", ptr[i]);
                    638: #endif
                    639:     } else {
                    640:       ccb[mbo].op = 0;       /* SCSI Initiator Command */
                    641:       SCpnt->host_scribble = NULL;
                    642:       any2scsi(ccb[mbo].datalen, bufflen);
                    643:       if(((unsigned int) buff & 0xff000000)) goto baddma;
                    644:       any2scsi(ccb[mbo].dataptr, buff);
                    645:     };
                    646:     ccb[mbo].idlun = (target&7)<<5 | direction | (lun & 7); /*SCSI Target Id*/
                    647:     ccb[mbo].rsalen = 16;
                    648:     ccb[mbo].linkptr[0] = ccb[mbo].linkptr[1] = ccb[mbo].linkptr[2] = 0;
                    649:     ccb[mbo].commlinkid = 0;
                    650: 
                    651: #ifdef DEBUG
                    652:     { int i;
                    653:     printk("aha1542_command: sending.. ");
                    654:     for (i = 0; i < sizeof(ccb[mbo])-10; i++)
                    655:       printk("%02x ", ((unchar *)&ccb[mbo])[i]);
                    656:     };
                    657: #endif
                    658:     
                    659:     if (done) {
                    660:        DEB(printk("aha1542_queuecommand: now waiting for interrupt "); aha1542_stat());
                    661:        SCpnt->scsi_done = done;
                    662:        mb[mbo].status = 1;
                    663:        aha1542_out(SCpnt->host->io_port, &ahacmd, 1);          /* start scsi command */
                    664:        DEB(aha1542_stat());
                    665:     }
                    666:     else
                    667:       printk("aha1542_queuecommand: done can't be NULL\n");
                    668:     
                    669:     return 0;
                    670:  baddma:
                    671:     panic("Buffer at address  > 16Mb used for 1542B");
                    672: }
                    673: 
                    674: static void internal_done(Scsi_Cmnd * SCpnt)
                    675: {
                    676:        SCpnt->SCp.Status++;
                    677: }
                    678: 
                    679: int aha1542_command(Scsi_Cmnd * SCpnt)
                    680: {
                    681:     DEB(printk("aha1542_command: ..calling aha1542_queuecommand\n"));
                    682: 
                    683:     aha1542_queuecommand(SCpnt, internal_done);
                    684: 
                    685:     SCpnt->SCp.Status = 0;
                    686:     while (!SCpnt->SCp.Status)
                    687:        barrier();
                    688:     return SCpnt->result;
                    689: }
                    690: 
                    691: /* Initialize mailboxes */
                    692: static void setup_mailboxes(int bse, struct Scsi_Host * shpnt)
                    693: {
                    694:     int i;
                    695:     struct mailbox * mb;
                    696:     struct ccb  *ccb;
                    697: 
                    698:     unchar cmd[5] = {CMD_MBINIT, AHA1542_MAILBOXES, 0, 0, 0};
                    699: 
                    700:     mb = HOSTDATA(shpnt)->mb;
                    701:     ccb = HOSTDATA(shpnt)->ccb;
                    702: 
                    703:     for(i=0; i<AHA1542_MAILBOXES; i++){
                    704:       mb[i].status = mb[AHA1542_MAILBOXES+i].status = 0;
                    705:       any2scsi(mb[i].ccbptr, &ccb[i]);
                    706:     };
                    707:     aha1542_intr_reset(bse);     /* reset interrupts, so they don't block */   
                    708:     any2scsi((cmd+2), mb);
                    709:     aha1542_out(bse, cmd, 5);
                    710:     WAIT(INTRFLAGS(bse), INTRMASK, HACC, 0);
                    711:     while (0) {
                    712:       fail:
                    713:        printk("aha1542_detect: failed setting up mailboxes\n");
                    714:     }
                    715:     aha1542_intr_reset(bse);
                    716: }
                    717: 
                    718: static int aha1542_getconfig(int base_io, unsigned char * irq_level, unsigned char * dma_chan, unsigned char * scsi_id)
                    719: {
                    720:   unchar inquiry_cmd[] = {CMD_RETCONF };
                    721:   unchar inquiry_result[3];
                    722:   int i;
                    723:   i = inb(STATUS(base_io));
                    724:   if (i & DF) {
                    725:     i = inb(DATA(base_io));
                    726:   };
                    727:   aha1542_out(base_io, inquiry_cmd, 1);
                    728:   aha1542_in(base_io, inquiry_result, 3);
                    729:   WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
                    730:   while (0) {
                    731:   fail:
                    732:     printk("aha1542_detect: query board settings\n");
                    733:   }
                    734:   aha1542_intr_reset(base_io);
                    735:   switch(inquiry_result[0]){
                    736:   case 0x80:
                    737:     *dma_chan = 7;
                    738:     break;
                    739:   case 0x40:
                    740:     *dma_chan = 6;
                    741:     break;
                    742:   case 0x20:
                    743:     *dma_chan = 5;
                    744:     break;
                    745:   case 0x01:
                    746:     *dma_chan = 0;
                    747:     break;
                    748:   case 0:
                    749:     /* This means that the adapter, although Adaptec 1542 compatible, doesn't use a DMA channel.
                    750:        Currently only aware of the BusLogic BT-445S VL-Bus adapter which needs this. */
                    751:     *dma_chan = 0xFF;
                    752:     break;
                    753:   default:
                    754:     printk("Unable to determine Adaptec DMA priority.  Disabling board\n");
                    755:     return -1;
                    756:   };
                    757:   switch(inquiry_result[1]){
                    758:   case 0x40:
                    759:     *irq_level = 15;
                    760:     break;
                    761:   case 0x20:
                    762:     *irq_level = 14;
                    763:     break;
                    764:   case 0x8:
                    765:     *irq_level = 12;
                    766:     break;
                    767:   case 0x4:
                    768:     *irq_level = 11;
                    769:     break;
                    770:   case 0x2:
                    771:     *irq_level = 10;
                    772:     break;
                    773:   case 0x1:
                    774:     *irq_level = 9;
                    775:     break;
                    776:   default:
                    777:     printk("Unable to determine Adaptec IRQ level.  Disabling board\n");
                    778:     return -1;
                    779:   };
                    780:   *scsi_id=inquiry_result[2] & 7;
                    781:   return 0;
                    782: }
                    783: 
                    784: /* This function should only be called for 1542C boards - we can detect
                    785:    the special firmware settings and unlock the board */
                    786: 
                    787: static int aha1542_mbenable(int base)
                    788: {
                    789:   static unchar mbenable_cmd[3];
                    790:   static unchar mbenable_result[2];
                    791:   int retval;
                    792:   
                    793:   retval = BIOS_TRANSLATION_6432;
                    794: 
                    795:   mbenable_cmd[0]=CMD_EXTBIOS;
                    796:   aha1542_out(base,mbenable_cmd,1);
                    797:   if(aha1542_in1(base,mbenable_result,2))
                    798:     return retval;
                    799:   WAITd(INTRFLAGS(base),INTRMASK,HACC,0,100);
                    800:   aha1542_intr_reset(base);
                    801:   
                    802:   if ((mbenable_result[0] & 0x08) || mbenable_result[1]) {
                    803:      mbenable_cmd[0]=CMD_MBENABLE;
                    804:      mbenable_cmd[1]=0;
                    805:      mbenable_cmd[2]=mbenable_result[1];
                    806: 
                    807:      if((mbenable_result[0] & 0x08) && (mbenable_result[1] & 0x03)) retval = BIOS_TRANSLATION_25563;
                    808: 
                    809:      aha1542_out(base,mbenable_cmd,3);
                    810:      WAIT(INTRFLAGS(base),INTRMASK,HACC,0);
                    811:   };
                    812:   while(0) {
                    813: fail:
                    814:     printk("aha1542_mbenable: Mailbox init failed\n");
                    815:   }
                    816: aha1542_intr_reset(base);
                    817: return retval;
                    818: }
                    819: 
                    820: /* Query the board to find out if it is a 1542 or a 1740, or whatever. */
                    821: static int aha1542_query(int base_io, int * transl)
                    822: {
                    823:   unchar inquiry_cmd[] = {CMD_INQUIRY };
                    824:   unchar inquiry_result[4];
                    825:   int i;
                    826:   i = inb(STATUS(base_io));
                    827:   if (i & DF) {
                    828:     i = inb(DATA(base_io));
                    829:   };
                    830:   aha1542_out(base_io, inquiry_cmd, 1);
                    831:   aha1542_in(base_io, inquiry_result, 4);
                    832:   WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
                    833:   while (0) {
                    834:   fail:
                    835:     printk("aha1542_detect: query card type\n");
                    836:   }
                    837:   aha1542_intr_reset(base_io);
                    838: 
                    839:   *transl = BIOS_TRANSLATION_6432; /* Default case */
                    840: 
                    841: /* For an AHA1740 series board, we ignore the board since there is a
                    842:    hardware bug which can lead to wrong blocks being returned if the board
                    843:    is operating in the 1542 emulation mode.  Since there is an extended mode
                    844:    driver, we simply ignore the board and let the 1740 driver pick it up.
                    845: */
                    846: 
                    847:   if (inquiry_result[0] == 0x43) {
                    848:     printk("aha1542.c: Emulation mode not supported for AHA 174N hardware.\n");
                    849:     return 1;
                    850:   };
                    851: 
                    852:   /* Always call this - boards that do not support extended bios translation
                    853:      will ignore the command, and we will set the proper default */
                    854: 
                    855:   *transl = aha1542_mbenable(base_io);
                    856: 
                    857:   return 0;
                    858: }
                    859: 
                    860: /* called from init/main.c */
                    861: void aha1542_setup( char *str, int *ints)
                    862: {
                    863:     const char *ahausage = "aha1542: usage: aha1542=<PORTBASE>[,<BUSON>,<BUSOFF>[,<DMASPEED>]]\n";
                    864:     static int setup_idx = 0;
                    865:     int setup_portbase;
                    866: 
                    867:     if(setup_idx >= MAXBOARDS)
                    868:       {
                    869:        printk("aha1542: aha1542_setup called too many times! Bad LILO params ?\n");
                    870:        printk("   Entryline 1: %s\n",setup_str[0]);
                    871:        printk("   Entryline 2: %s\n",setup_str[1]);
                    872:        printk("   This line:   %s\n",str);
                    873:        return;
                    874:       }
                    875:     if (ints[0] < 1 || ints[0] > 4)
                    876:       {
                    877:        printk("aha1542: %s\n", str );
                    878:        printk(ahausage);
                    879:        printk("aha1542: Wrong parameters may cause system malfunction.. We try anyway..\n");
                    880:       }
                    881: 
                    882:     setup_called[setup_idx]=ints[0];
                    883:     setup_str[setup_idx]=str;
                    884: 
                    885:     setup_portbase             = ints[0] >= 1 ? ints[1] : 0; /* Preserve the default value.. */
                    886:     setup_buson   [setup_idx]  = ints[0] >= 2 ? ints[2] : 7;
                    887:     setup_busoff  [setup_idx]  = ints[0] >= 3 ? ints[3] : 5;
                    888:     if (ints[0] >= 4) {
                    889:       int atbt = -1;
                    890:       switch (ints[4]) {
                    891:        case 5:
                    892:            atbt = 0x00;
                    893:            break;
                    894:        case 6:
                    895:            atbt = 0x04;
                    896:            break;
                    897:        case 7:
                    898:            atbt = 0x01;
                    899:            break;
                    900:        case 8:
                    901:            atbt = 0x02;
                    902:            break;
                    903:        case 10:
                    904:            atbt = 0x03;
                    905:            break;
                    906:        default:
                    907:            printk("aha1542: %s\n", str );
                    908:            printk(ahausage);
                    909:            printk("aha1542: Valid values for DMASPEED are 5-8, 10 MB/s.  Using jumper defaults.\n");
                    910:            break;
                    911:       }
                    912:       setup_dmaspeed[setup_idx]  = atbt;
                    913:     }
                    914: 
                    915:     if (setup_portbase != 0)
                    916:       bases[setup_idx] = setup_portbase;
                    917: 
                    918:     ++setup_idx;
                    919: }
                    920: 
                    921: /* return non-zero on detection */
                    922: int aha1542_detect(Scsi_Host_Template * tpnt)
                    923: {
                    924:     unsigned char dma_chan;
                    925:     unsigned char irq_level;
                    926:     unsigned char scsi_id;
                    927:     unsigned long flags;
                    928:     unsigned int base_io;
                    929:     int trans;
                    930:     struct Scsi_Host * shpnt = NULL;
                    931:     int count = 0;
                    932:     int indx;
                    933: 
                    934:     DEB(printk("aha1542_detect: \n"));
                    935: 
                    936:     tpnt->proc_dir = &proc_scsi_aha1542;
                    937: 
                    938:     for(indx = 0; indx < sizeof(bases)/sizeof(bases[0]); indx++)
                    939:            if(bases[indx] != 0 && !check_region(bases[indx], 4)) { 
                    940:                    shpnt = scsi_register(tpnt,
                    941:                                          sizeof(struct aha1542_hostdata));
                    942: 
                    943:                    /* For now we do this - until kmalloc is more intelligent
                    944:                       we are resigned to stupid hacks like this */
                    945:                    if ((unsigned int) shpnt > 0xffffff) {
                    946:                      printk("Invalid address for shpnt with 1542.\n");
                    947:                      goto unregister;
                    948:                    }
                    949: 
                    950:                    if(!aha1542_test_port(bases[indx], shpnt)) goto unregister;
                    951: 
                    952: 
                    953:                    base_io = bases[indx];
                    954:                    
                    955:                    /* Set the Bus on/off-times as not to ruin floppy performance */
                    956:            {
                    957:                    unchar oncmd[] = {CMD_BUSON_TIME, 7};
                    958:                    unchar offcmd[] = {CMD_BUSOFF_TIME, 5};
                    959: 
                    960:                    if(setup_called[indx])
                    961:                      {
                    962:                        oncmd[1]  = setup_buson[indx];
                    963:                        offcmd[1] = setup_busoff[indx];
                    964:                      }
                    965:                    
                    966:                    aha1542_intr_reset(base_io);
                    967:                    aha1542_out(base_io, oncmd, 2);
                    968:                    WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
                    969:                    aha1542_intr_reset(base_io);
                    970:                    aha1542_out(base_io, offcmd, 2);
                    971:                    WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
                    972:                    if (setup_dmaspeed[indx] >= 0)
                    973:                      {
                    974:                        unchar dmacmd[] = {CMD_DMASPEED, 0};
                    975:                        dmacmd[1] = setup_dmaspeed[indx];
                    976:                        aha1542_intr_reset(base_io);
                    977:                        aha1542_out(base_io, dmacmd, 2);
                    978:                        WAIT(INTRFLAGS(base_io), INTRMASK, HACC, 0);
                    979:                      }
                    980:                    while (0) {
                    981:                    fail:
                    982:                            printk("aha1542_detect: setting bus on/off-time failed\n");
                    983:                    }
                    984:                    aha1542_intr_reset(base_io);
                    985:            }
                    986:                    if(aha1542_query(base_io, &trans))  goto unregister;
                    987:                    
                    988:                    if (aha1542_getconfig(base_io, &irq_level, &dma_chan, &scsi_id) == -1)  goto unregister;
                    989:                    
                    990:                    printk("Configuring Adaptec (SCSI-ID %d) at IO:%x, IRQ %d", scsi_id, base_io, irq_level);
                    991:                    if (dma_chan != 0xFF)
                    992:                            printk(", DMA priority %d", dma_chan);
                    993:                    printk("\n");
                    994:                    
                    995:                    DEB(aha1542_stat());
                    996:                    setup_mailboxes(base_io, shpnt);
                    997:                    
                    998:                    DEB(aha1542_stat());
                    999:                    
                   1000:                    DEB(printk("aha1542_detect: enable interrupt channel %d\n", irq_level));
                   1001:                    save_flags(flags);
                   1002:                    cli();
                   1003:                    if (request_irq(irq_level,aha1542_intr_handle, 0, "aha1542", NULL)) {
                   1004:                            printk("Unable to allocate IRQ for adaptec controller.\n");
                   1005:                            restore_flags(flags);
                   1006:                            goto unregister;
                   1007:                    }
                   1008:                    
                   1009:                    if (dma_chan != 0xFF) {
                   1010:                            if (request_dma(dma_chan,"aha1542")) {
                   1011:                                    printk("Unable to allocate DMA channel for Adaptec.\n");
                   1012:                                    free_irq(irq_level, NULL);
                   1013:                                    restore_flags(flags);
                   1014:                                    goto unregister;
                   1015:                            }
                   1016:                            
                   1017:                            if (dma_chan == 0 || dma_chan >= 5) {
                   1018:                                    set_dma_mode(dma_chan, DMA_MODE_CASCADE);
                   1019:                                    enable_dma(dma_chan);
                   1020:                            }
                   1021:                    }
                   1022:                    aha_host[irq_level - 9] = shpnt;
                   1023:                    shpnt->this_id = scsi_id;
                   1024:                    shpnt->unique_id = base_io;
                   1025:                    shpnt->io_port = base_io;
                   1026:                    shpnt->n_io_port = 4;  /* Number of bytes of I/O space used */
                   1027:                    shpnt->dma_channel = dma_chan;
                   1028:                    shpnt->irq = irq_level;
                   1029:                    HOSTDATA(shpnt)->bios_translation  = trans;
                   1030:                    if(trans == BIOS_TRANSLATION_25563) 
                   1031:                      printk("aha1542.c: Using extended bios translation\n");
                   1032:                    HOSTDATA(shpnt)->aha1542_last_mbi_used  = (2*AHA1542_MAILBOXES - 1);
                   1033:                    HOSTDATA(shpnt)->aha1542_last_mbo_used  = (AHA1542_MAILBOXES - 1);
                   1034:                    memset(HOSTDATA(shpnt)->SCint, 0, sizeof(HOSTDATA(shpnt)->SCint));
                   1035:                    restore_flags(flags);
                   1036: #if 0
                   1037:                    DEB(printk(" *** READ CAPACITY ***\n"));
                   1038:                    
                   1039:            {
                   1040:                    unchar buf[8];
                   1041:                    static unchar cmd[] = {     READ_CAPACITY, 0, 0, 0, 0, 0, 0, 0, 0, 0};
                   1042:                    int i;
                   1043:                    
                   1044:                    for (i = 0; i < sizeof(buf); ++i) buf[i] = 0x87;
                   1045:                    for (i = 0; i < 2; ++i)
                   1046:                            if (!aha1542_command(i, cmd, buf, sizeof(buf))) {
                   1047:                                    printk("aha_detect: LU %d sector_size %d device_size %d\n",
                   1048:                                           i, xscsi2int(buf+4), xscsi2int(buf));
                   1049:                            }
                   1050:            }
                   1051:                    
                   1052:                    DEB(printk(" *** NOW RUNNING MY OWN TEST *** \n"));
                   1053:                    
                   1054:                    for (i = 0; i < 4; ++i)
                   1055:                    {
                   1056:                            unsigned char cmd[10];
                   1057:                            static buffer[512];
                   1058:                            
                   1059:                            cmd[0] = READ_10;
                   1060:                            cmd[1] = 0;
                   1061:                            xany2scsi(cmd+2, i);
                   1062:                            cmd[6] = 0;
                   1063:                            cmd[7] = 0;
                   1064:                            cmd[8] = 1;
                   1065:                            cmd[9] = 0;
                   1066:                            aha1542_command(0, cmd, buffer, 512);
                   1067:                    }
                   1068: #endif    
                   1069:                    request_region(bases[indx], 4,"aha1542");  /* Register the IO ports that we use */
                   1070:                    count++;
                   1071:                    continue;
                   1072:            unregister:
                   1073:                    scsi_unregister(shpnt);
                   1074:                    continue;
                   1075:                    
                   1076:            };
                   1077:        
                   1078:     return count;
                   1079: }
                   1080: 
                   1081: static int aha1542_restart(struct Scsi_Host * shost)
                   1082: {
                   1083:   int i;
                   1084:   int count = 0;
                   1085: #if 0
                   1086:   unchar ahacmd = CMD_START_SCSI;
                   1087: #endif
                   1088: 
                   1089:   for(i=0; i< AHA1542_MAILBOXES; i++)
                   1090:    if(HOSTDATA(shost)->SCint[i] && 
                   1091:       !(HOSTDATA(shost)->SCint[i]->device->soft_reset))
                   1092:      {
                   1093: #if 0
                   1094:        HOSTDATA(shost)->mb[i].status = 1; /* Indicate ready to restart... */
                   1095: #endif
                   1096:        count++;
                   1097:      }     
                   1098: 
                   1099:   printk("Potential to restart %d stalled commands...\n", count);
                   1100: #if 0
                   1101:   /* start scsi command */
                   1102:   if (count) aha1542_out(shost->io_port, &ahacmd, 1);
                   1103: #endif
                   1104:   return 0;
                   1105: }
                   1106: 
                   1107: /* The abort command does not leave the device in a clean state where
                   1108:    it is available to be used again.  Until this gets worked out, we will
                   1109:    leave it commented out.  */
                   1110: 
                   1111: int aha1542_abort(Scsi_Cmnd * SCpnt)
                   1112: {
                   1113: #if 0
                   1114:   unchar ahacmd = CMD_START_SCSI;
                   1115:   unsigned long flags;
                   1116:   struct mailbox * mb;
                   1117:   int mbi, mbo, i;
                   1118: 
                   1119:   printk("In aha1542_abort: %x %x\n",
                   1120:         inb(STATUS(SCpnt->host->io_port)),
                   1121:         inb(INTRFLAGS(SCpnt->host->io_port)));
                   1122: 
                   1123:   save_flags(flags);
                   1124:   cli();
                   1125:   mb = HOSTDATA(SCpnt->host)->mb;
                   1126:   mbi = HOSTDATA(SCpnt->host)->aha1542_last_mbi_used + 1;
                   1127:   if (mbi >= 2*AHA1542_MAILBOXES) mbi = AHA1542_MAILBOXES;
                   1128:   
                   1129:   do{
                   1130:     if(mb[mbi].status != 0) break;
                   1131:     mbi++;
                   1132:     if (mbi >= 2*AHA1542_MAILBOXES) mbi = AHA1542_MAILBOXES;
                   1133:   } while (mbi != HOSTDATA(SCpnt->host)->aha1542_last_mbi_used);
                   1134:   restore_flags(flags);
                   1135: 
                   1136:   if(mb[mbi].status) {
                   1137:     printk("Lost interrupt discovered on irq %d - attempting to recover\n", 
                   1138:           SCpnt->host->irq);
                   1139:     aha1542_intr_handle(SCpnt->host->irq, NULL);
                   1140:     return 0;
                   1141:   }
                   1142: 
                   1143:   /* OK, no lost interrupt.  Try looking to see how many pending commands
                   1144:      we think we have. */
                   1145: 
                   1146:   for(i=0; i< AHA1542_MAILBOXES; i++)
                   1147:    if(HOSTDATA(SCpnt->host)->SCint[i])
                   1148:      {
                   1149:        if(HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
                   1150:         printk("Timed out command pending for %s\n",
                   1151:                kdevname(SCpnt->request.rq_dev));
                   1152:         if (HOSTDATA(SCpnt->host)->mb[i].status) {
                   1153:           printk("OGMB still full - restarting\n");
                   1154:           aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
                   1155:         };
                   1156:        } else
                   1157:         printk("Other pending command %s\n",
                   1158:                kdevname(SCpnt->request.rq_dev));
                   1159:      }
                   1160: 
                   1161: #endif
                   1162: 
                   1163:     DEB(printk("aha1542_abort\n"));
                   1164: #if 0
                   1165:     save_flags(flags);
                   1166:     cli();
                   1167:     for(mbo = 0; mbo < AHA1542_MAILBOXES; mbo++)
                   1168:       if (SCpnt == HOSTDATA(SCpnt->host)->SCint[mbo]){
                   1169:        mb[mbo].status = 2;  /* Abort command */
                   1170:        aha1542_out(SCpnt->host->io_port, &ahacmd, 1); /* start scsi command */
                   1171:        restore_flags(flags);
                   1172:        break;
                   1173:       };
                   1174: #endif
                   1175:     return SCSI_ABORT_SNOOZE;
                   1176: }
                   1177: 
                   1178: /* We do not implement a reset function here, but the upper level code
                   1179:    assumes that it will get some kind of response for the command in
                   1180:    SCpnt.  We must oblige, or the command will hang the scsi system.
                   1181:    For a first go, we assume that the 1542 notifies us with all of the
                   1182:    pending commands (it does implement soft reset, after all). */
                   1183: 
                   1184: int aha1542_reset(Scsi_Cmnd * SCpnt, unsigned int reset_flags)
                   1185: {
                   1186:     unchar ahacmd = CMD_START_SCSI;
                   1187:     int i;
                   1188: 
                   1189:     /*
                   1190:      * See if a bus reset was suggested.
                   1191:      */
                   1192:     if( reset_flags & SCSI_RESET_SUGGEST_BUS_RESET )
                   1193:       {
                   1194:        /* 
                   1195:         * This does a scsi reset for all devices on the bus.
                   1196:         * In principle, we could also reset the 1542 - should
                   1197:         * we do this?  Try this first, and we can add that later
                   1198:         * if it turns out to be useful.
                   1199:         */
                   1200:        outb(HRST | SCRST, CONTROL(SCpnt->host->io_port));
                   1201: 
                   1202:        /*
                   1203:         * Wait for the thing to settle down a bit.  Unfortunately
                   1204:         * this is going to basically lock up the machine while we
                   1205:         * wait for this to complete.  To be 100% correct, we need to
                   1206:         * check for timeout, and if we are doing something like this
                   1207:         * we are pretty desperate anyways.
                   1208:         */
                   1209:        WAIT(STATUS(SCpnt->host->io_port), 
                   1210:             STATMASK, INIT|IDLE, STST|DIAGF|INVDCMD|DF|CDF);
                   1211: 
                   1212:        /*
                   1213:         * We need to do this too before the 1542 can interact with
                   1214:         * us again.
                   1215:         */
                   1216:        setup_mailboxes(SCpnt->host->io_port, SCpnt->host);
                   1217: 
                   1218:        /*
                   1219:         * Now try to pick up the pieces.  Restart all commands
                   1220:         * that are currently active on the bus, and reset all of
                   1221:         * the datastructures.  We have some time to kill while
                   1222:         * things settle down, so print a nice message.
                   1223:         */
                   1224:        printk("Sent BUS RESET to scsi host %d\n", SCpnt->host->host_no);
                   1225: 
                   1226:        for(i=0; i< AHA1542_MAILBOXES; i++)
                   1227:          if(HOSTDATA(SCpnt->host)->SCint[i] != NULL)
                   1228:            {
                   1229:              Scsi_Cmnd * SCtmp;
                   1230:              SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
                   1231:              SCtmp->result = DID_RESET << 16;
                   1232:              if (SCtmp->host_scribble) scsi_free(SCtmp->host_scribble, 512);
                   1233:              printk("Sending DID_RESET for target %d\n", SCpnt->target);
                   1234:              SCtmp->scsi_done(SCpnt);
                   1235:              
                   1236:              HOSTDATA(SCpnt->host)->SCint[i] = NULL;
                   1237:              HOSTDATA(SCpnt->host)->mb[i].status = 0;
                   1238:            }
                   1239:        /*
                   1240:         * Now tell the mid-level code what we did here.  Since
                   1241:         * we have restarted all of the outstanding commands,
                   1242:         * then report SUCCESS.
                   1243:         */
                   1244:        return (SCSI_RESET_SUCCESS | SCSI_RESET_BUS_RESET);
                   1245: fail:
                   1246:        printk("aha1542.c: Unable to perform hard reset.\n");
                   1247:        printk("Power cycle machine to reset\n");
                   1248:        return (SCSI_RESET_ERROR | SCSI_RESET_BUS_RESET);
                   1249: 
                   1250: 
                   1251:       }
                   1252:     else
                   1253:       {
                   1254:        /* This does a selective reset of just the one device */
                   1255:        /* First locate the ccb for this command */
                   1256:        for(i=0; i< AHA1542_MAILBOXES; i++)
                   1257:          if(HOSTDATA(SCpnt->host)->SCint[i] == SCpnt)
                   1258:            {
                   1259:              HOSTDATA(SCpnt->host)->ccb[i].op = 0x81;  /* BUS DEVICE RESET */
                   1260:              /* Now tell the 1542 to flush all pending commands for this target */
                   1261:              aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
                   1262:              
                   1263:              /* Here is the tricky part.  What to do next.  Do we get an interrupt
                   1264:                 for the commands that we aborted with the specified target, or
                   1265:                 do we generate this on our own?  Try it without first and see
                   1266:                 what happens */
                   1267:              printk("Sent BUS DEVICE RESET to target %d\n", SCpnt->target);
                   1268:              
                   1269:              /* If the first does not work, then try the second.  I think the
                   1270:                 first option is more likely to be correct. Free the command
                   1271:                 block for all commands running on this target... */
                   1272:              for(i=0; i< AHA1542_MAILBOXES; i++)
                   1273:                if(HOSTDATA(SCpnt->host)->SCint[i] &&
                   1274:                   HOSTDATA(SCpnt->host)->SCint[i]->target == SCpnt->target)
                   1275:                  {
                   1276:                    Scsi_Cmnd * SCtmp;
                   1277:                    SCtmp = HOSTDATA(SCpnt->host)->SCint[i];
                   1278:                    SCtmp->result = DID_RESET << 16;
                   1279:                    if (SCtmp->host_scribble) scsi_free(SCtmp->host_scribble, 512);
                   1280:                    printk("Sending DID_RESET for target %d\n", SCpnt->target);
                   1281:                    SCtmp->scsi_done(SCpnt);
                   1282:                    
                   1283:                    HOSTDATA(SCpnt->host)->SCint[i] = NULL;
                   1284:                    HOSTDATA(SCpnt->host)->mb[i].status = 0;
                   1285:                  }
                   1286:              return SCSI_RESET_SUCCESS;
                   1287:            }
                   1288:       }
                   1289:     /* No active command at this time, so this means that each time we got
                   1290:        some kind of response the last time through.  Tell the mid-level code
                   1291:        to request sense information in order to decide what to do next. */
                   1292:     return SCSI_RESET_PUNT;
                   1293: }
                   1294: 
                   1295: #include "sd.h"
                   1296: 
                   1297: int aha1542_biosparam(Scsi_Disk * disk, kdev_t dev, int * ip)
                   1298: {
                   1299:   int translation_algorithm;
                   1300:   int size = disk->capacity;
                   1301: 
                   1302:   translation_algorithm = HOSTDATA(disk->device->host)->bios_translation;
                   1303: 
                   1304:   if((size>>11) > 1024 && translation_algorithm == BIOS_TRANSLATION_25563) {
                   1305:     /* Please verify that this is the same as what DOS returns */
                   1306:     ip[0] = 255;
                   1307:     ip[1] = 63;
                   1308:     ip[2] = size /255/63;
                   1309:   } else {
                   1310:     ip[0] = 64;
                   1311:     ip[1] = 32;
                   1312:     ip[2] = size >> 11;
                   1313:   }
                   1314: 
                   1315:   return 0;
                   1316: }
                   1317: 
                   1318: 
                   1319: #ifdef MODULE
                   1320: /* Eventually this will go into an include file, but this will be later */
                   1321: Scsi_Host_Template driver_template = AHA1542;
                   1322: 
                   1323: #include "scsi_module.c"
                   1324: #endif
                   1325: 

unix.superglobalmegacorp.com

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