]> err.no Git - linux-2.6/commitdiff
[SCSI] remove PCI2000 and PCI2220i drivers
authorJames Bottomley <jejb@mulgrave.(none)>
Fri, 22 Apr 2005 02:50:33 +0000 (22:50 -0400)
committerJames Bottomley <jejb@mulgrave.(none)>
Fri, 20 May 2005 17:53:15 +0000 (12:53 -0500)
From: Christoph Hellwig <hch@lst.de>

Both drivers are marked broken and haven't compiled since very early
2.5.x.  And they're for IDE hardware so they shouldn't have been
written to the SCSI layer at all.

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/Kconfig
drivers/scsi/Makefile
drivers/scsi/pci2000.c [deleted file]
drivers/scsi/pci2220i.c [deleted file]
drivers/scsi/pci2220i.h [deleted file]
drivers/scsi/psi_dale.h [deleted file]
drivers/scsi/psi_roy.h [deleted file]

index 750b11cefd934349480d6237f6df564edf6d297b..2ef5aee86b29ce46ff1bd9f51f00f27e49d5aa6c 100644 (file)
@@ -1192,28 +1192,6 @@ config SCSI_PAS16
          To compile this driver as a module, choose M here: the
          module will be called pas16.
 
-config SCSI_PCI2000
-       tristate "PCI2000 support"
-       depends on PCI && SCSI && BROKEN
-       help
-         This is support for the PCI2000I EIDE interface card which acts as a
-         SCSI host adapter.  Please read the SCSI-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called pci2000.
-
-config SCSI_PCI2220I
-       tristate "PCI2220i support"
-       depends on PCI && SCSI && BROKEN
-       help
-         This is support for the PCI2220i EIDE interface card which acts as a
-         SCSI host adapter.  Please read the SCSI-HOWTO, available from
-         <http://www.tldp.org/docs.html#howto>.
-
-         To compile this driver as a module, choose M here: the
-         module will be called pci2220i.
-
 config SCSI_PSI240I
        tristate "PSI240i support"
        depends on ISA && SCSI
index 9cb9fe7d623aeda983c2e6b2f4cb57bdca796673..51d9c1e1884b286635e3d86ed5967a4d8c65f9b0 100644 (file)
@@ -50,8 +50,6 @@ obj-$(CONFIG_MVME16x_SCSI)    += mvme16x.o    53c7xx.o
 obj-$(CONFIG_BVME6000_SCSI)    += bvme6000.o   53c7xx.o
 obj-$(CONFIG_SCSI_SIM710)      += 53c700.o     sim710.o
 obj-$(CONFIG_SCSI_ADVANSYS)    += advansys.o
-obj-$(CONFIG_SCSI_PCI2000)     += pci2000.o
-obj-$(CONFIG_SCSI_PCI2220I)    += pci2220i.o
 obj-$(CONFIG_SCSI_PSI240I)     += psi240i.o
 obj-$(CONFIG_SCSI_BUSLOGIC)    += BusLogic.o
 obj-$(CONFIG_SCSI_DPT_I2O)     += dpt_i2o.o
diff --git a/drivers/scsi/pci2000.c b/drivers/scsi/pci2000.c
deleted file mode 100644 (file)
index 377a466..0000000
+++ /dev/null
@@ -1,836 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
- *
- * pci2000.c - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- *
- *     Revisions       1.10    Jan-21-1999
- *             - Fixed sign on message to reflect proper controller name.
- *             - Added support for RAID status monitoring and control.
- *
- *  Revisions  1.11    Mar-22-1999
- *             - Fixed control timeout to not lock up the entire system if
- *               controller goes offline completely.
- *
- *     Revisions 1.12          Mar-26-1999
- *             - Fixed spinlock and PCI configuration.
- *
- *     Revisions 1.20          Mar-27-2000
- *             - Added support for dynamic DMA
- *
- ****************************************************************************/
-#define PCI2000_VERSION                "1.20"
-
-#include <linux/blkdev.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/pci.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/sched.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <linux/spinlock.h>
-
-#include <asm/dma.h>
-#include <asm/system.h>
-#include <asm/io.h>
-
-#include "scsi.h"
-#include <scsi/scsi_host.h>
-#include "pci2000.h"
-#include "psi_roy.h"
-
-
-//#define DEBUG 1
-
-#ifdef DEBUG
-#define DEB(x) x
-#define STOP_HERE      {int st;for(st=0;st<100;st++){st=1;}}
-#else
-#define DEB(x)
-#define STOP_HERE
-#endif
-
-typedef struct
-       {
-       unsigned int    address;
-       unsigned int    length;
-       }       SCATGATH, *PSCATGATH;
-
-typedef struct
-       {
-       Scsi_Cmnd               *SCpnt;
-       PSCATGATH                scatGath;
-       dma_addr_t               scatGathDma;
-       UCHAR                   *cdb;
-       dma_addr_t               cdbDma; 
-       UCHAR                    tag;
-       }       DEV2000, *PDEV2000;
-
-typedef struct
-       {
-       ULONG                    basePort;
-       ULONG                    mb0;
-       ULONG                    mb1;
-       ULONG                    mb2;
-       ULONG                    mb3;
-       ULONG                    mb4;
-       ULONG                    cmd;
-       ULONG                    tag;
-       ULONG                    irqOwned;
-       struct pci_dev  *pdev;
-       DEV2000                  dev[MAX_BUS][MAX_UNITS];
-       }       ADAPTER2000, *PADAPTER2000;
-
-#define HOSTDATA(host) ((PADAPTER2000)&host->hostdata)
-#define consistentLen (MAX_BUS * MAX_UNITS * (16 * sizeof (SCATGATH) + MAX_COMMAND_SIZE))
-
-
-static struct  Scsi_Host          *PsiHost[MAXADAPTER] = {NULL,};  // One for each adapter
-static                 int                             NumAdapters = 0;
-/****************************************************************
- *     Name:                   WaitReady       :LOCAL
- *
- *     Description:    Wait for controller ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE on not ready.
- *
- ****************************************************************/
-static int WaitReady (PADAPTER2000 padapter)
-       {
-       ULONG   z;
-
-       for ( z = 0;  z < (TIMEOUT_COMMAND * 4);  z++ )
-               {
-               if ( !inb_p (padapter->cmd) )
-                       return FALSE;
-               udelay (250);
-               };                                                              
-       return TRUE;
-       }
-/****************************************************************
- *     Name:                   WaitReadyLong   :LOCAL
- *
- *     Description:    Wait for controller ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE on not ready.
- *
- ****************************************************************/
-static int WaitReadyLong (PADAPTER2000 padapter)
-       {
-       ULONG   z;
-
-       for ( z = 0;  z < (5000 * 4);  z++ )
-               {
-               if ( !inb_p (padapter->cmd) )
-                       return FALSE;
-               udelay (250);
-               };                                                              
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   OpDone  :LOCAL
- *
- *     Description:    Clean up operation and issue done to caller.
- *
- *     Parameters:             SCpnt   - Pointer to SCSI command structure.
- *                                     status  - Caller status.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void OpDone (Scsi_Cmnd *SCpnt, ULONG status)
-       {
-       SCpnt->result = status;
-       SCpnt->scsi_done (SCpnt);
-       }
-/****************************************************************
- *     Name:   Command         :LOCAL
- *
- *     Description:    Issue queued command to the PCI-2000.
- *
- *     Parameters:             padapter - Pointer to adapter information structure.
- *                                     cmd              - PCI-2000 command byte.
- *
- *     Returns:                Non-zero command tag if operation is accepted.
- *
- ****************************************************************/
-static UCHAR Command (PADAPTER2000 padapter, UCHAR cmd)
-       {
-       outb_p (cmd, padapter->cmd);
-       if ( WaitReady (padapter) )
-               return 0;
-
-       if ( inw_p (padapter->mb0) )
-               return 0;
-
-       return inb_p (padapter->mb1);
-       }
-/****************************************************************
- *     Name:   BuildSgList             :LOCAL
- *
- *     Description:    Build the scatter gather list for controller.
- *
- *     Parameters:             SCpnt    - Pointer to SCSI command structure.
- *                                     padapter - Pointer to adapter information structure.
- *                                     pdev     - Pointer to adapter device structure.
- *
- *     Returns:                Non-zero in not scatter gather.
- *
- ****************************************************************/
-static int BuildSgList (Scsi_Cmnd *SCpnt, PADAPTER2000 padapter, PDEV2000 pdev)
-       {
-       int                                      z;
-       int                                      zc;
-       struct scatterlist      *sg;
-
-       if ( SCpnt->use_sg )
-               {
-               sg = (struct scatterlist *)SCpnt->request_buffer;
-               zc = pci_map_sg (padapter->pdev, sg, SCpnt->use_sg, SCpnt->sc_data_direction);
-               for ( z = 0;  z < zc;  z++ )
-                       {
-                       pdev->scatGath[z].address = cpu_to_le32 (sg_dma_address (sg));
-                       pdev->scatGath[z].length = cpu_to_le32 (sg_dma_len (sg++));
-                       }
-               outl (pdev->scatGathDma, padapter->mb2);
-               outl ((zc << 24) | SCpnt->request_bufflen, padapter->mb3);
-               return FALSE;
-               }
-       if ( !SCpnt->request_bufflen)
-               {
-               outl (0, padapter->mb2);
-               outl (0, padapter->mb3);
-               return TRUE;
-               }
-       SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev,
-                       SCpnt->request_buffer, SCpnt->request_bufflen,
-                       SCpnt->sc_data_direction);
-       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-       outl (SCpnt->request_bufflen, padapter->mb3);
-       return TRUE;
-       }
-/*********************************************************************
- *     Name:   PsiRaidCmd
- *
- *     Description:    Execute a simple command.
- *
- *     Parameters:             padapter - Pointer to adapter control structure.
- *                                     cmd              - Roy command byte.
- *
- *     Returns:                Return error status.
- *
- ********************************************************************/
-static int PsiRaidCmd (PADAPTER2000 padapter, char cmd)
-       {
-       if ( WaitReady (padapter) )                                             // test for command register ready
-               return DID_TIME_OUT;
-       outb_p (cmd, padapter->cmd);                                    // issue command
-       if ( WaitReadyLong (padapter) )                                 // wait for adapter ready
-               return DID_TIME_OUT;
-       return DID_OK;
-       }
-/****************************************************************
- *     Name:   Irq_Handler     :LOCAL
- *
- *     Description:    Interrupt handler.
- *
- *     Parameters:             irq             - Hardware IRQ number.
- *                                     dev_id  -
- *                                     regs    -
- *
- *     Returns:                TRUE if drive is not ready in time.
- *
- ****************************************************************/
-static irqreturn_t Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
-       {
-       struct Scsi_Host   *shost = NULL;       // Pointer to host data block
-       PADAPTER2000            padapter;               // Pointer to adapter control structure
-       PDEV2000                        pdev;
-       Scsi_Cmnd                  *SCpnt;
-       UCHAR                           tag = 0;
-       UCHAR                           tag0;
-       ULONG                           error;
-       int                                     pun;
-       int                                     bus;
-       int                                     z;
-    unsigned long              flags;
-    int handled = 0;
-
-       DEB(printk ("\npci2000 received interrupt "));
-       for ( z = 0; z < NumAdapters;  z++ )                                                                            // scan for interrupt to process
-               {
-               if ( PsiHost[z]->irq == (UCHAR)(irq & 0xFF) )
-                       {
-                       tag = inb_p (HOSTDATA(PsiHost[z])->tag);
-                       if (  tag )
-                               {
-                               shost = PsiHost[z];
-                               break;
-                               }
-                       }
-               }
-
-       if ( !shost )
-               {
-               DEB (printk ("\npci2000: not my interrupt"));
-               goto out;
-               }
-
-    handled = 1;
-       spin_lock_irqsave(shost->host_lock, flags);
-       padapter = HOSTDATA(shost);
-
-       tag0 = tag & 0x7F;                                                                                                                      // mask off the error bit
-       for ( bus = 0;  bus < MAX_BUS;  bus++ )                                                                         // scan the busses
-       {
-               for ( pun = 0;  pun < MAX_UNITS;  pun++ )                                                               // scan the targets
-               {
-                       pdev = &padapter->dev[bus][pun];
-                       if ( !pdev->tag )
-                       continue;
-                       if ( pdev->tag == tag0 )                                                                                        // is this it?
-                               {
-                               pdev->tag = 0;
-                               SCpnt = pdev->SCpnt;
-                               goto unmapProceed;
-                       }
-                       }
-       }
-
-       outb_p (0xFF, padapter->tag);                                                                                           // clear the op interrupt
-       outb_p (CMD_DONE, padapter->cmd);                                                                                       // complete the op
-       goto irq_return;                                                                                                                        // done, but, with what?
-
-unmapProceed:;
-       if ( !bus )
-               {
-               switch ( SCpnt->cmnd[0] )
-                       {
-                       case SCSIOP_TEST_UNIT_READY:
-                               pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, sizeof (SCpnt->sense_buffer), PCI_DMA_FROMDEVICE);
-                               goto irqProceed;
-                       case SCSIOP_READ_CAPACITY:
-                               pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, 8, PCI_DMA_FROMDEVICE);
-                               goto irqProceed;
-                       case SCSIOP_VERIFY:
-                       case SCSIOP_START_STOP_UNIT:
-                       case SCSIOP_MEDIUM_REMOVAL:
-                               goto irqProceed;
-                       }
-               }
-       if ( SCpnt->SCp.have_data_in )
-               pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, SCpnt->request_bufflen, SCpnt->sc_data_direction);
-       else 
-               {
-               if ( SCpnt->use_sg )
-                       pci_unmap_sg (padapter->pdev, (struct scatterlist *)SCpnt->request_buffer, SCpnt->use_sg, SCpnt->sc_data_direction);
-               }
-
-irqProceed:;
-       if ( tag & ERR08_TAGGED )                                                                                               // is there an error here?
-               {
-               if ( WaitReady (padapter) )
-                       {
-                       OpDone (SCpnt, DID_TIME_OUT << 16);
-                       goto irq_return;
-                       }
-
-               outb_p (tag0, padapter->mb0);                                                                           // get real error code
-               outb_p (CMD_ERROR, padapter->cmd);
-               if ( WaitReady (padapter) )                                                                                     // wait for controller to suck up the op
-                       {
-                       OpDone (SCpnt, DID_TIME_OUT << 16);
-                       goto irq_return;
-                       }
-
-               error = inl (padapter->mb0);                                                                            // get error data
-               outb_p (0xFF, padapter->tag);                                                                           // clear the op interrupt
-               outb_p (CMD_DONE, padapter->cmd);                                                                       // complete the op
-
-               DEB (printk ("status: %lX ", error));
-               if ( error == 0x00020002 )                                                                                      // is this error a check condition?
-                       {
-                       if ( bus )                                                                                                              // are we doint SCSI commands?
-                               {
-                               OpDone (SCpnt, (DID_OK << 16) | 2);
-                               goto irq_return;
-                               }
-                       if ( *SCpnt->cmnd == SCSIOP_TEST_UNIT_READY )
-                               OpDone (SCpnt, (DRIVER_SENSE << 24) | (DID_OK << 16) | 2);      // test caller we have sense data too
-                       else
-                               OpDone (SCpnt, DID_ERROR << 16);
-                       goto irq_return;
-                       }
-               OpDone (SCpnt, DID_ERROR << 16);
-               goto irq_return;
-               }
-
-       outb_p (0xFF, padapter->tag);                                                                                   // clear the op interrupt
-       outb_p (CMD_DONE, padapter->cmd);                                                                               // complete the op
-       OpDone (SCpnt, DID_OK << 16);
-
-irq_return:
-    spin_unlock_irqrestore(shost->host_lock, flags);
-out:
-    return IRQ_RETVAL(handled);
-}
-/****************************************************************
- *     Name:   Pci2000_QueueCommand
- *
- *     Description:    Process a queued command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     done  - Pointer to done function to call.
- *
- *     Returns:                Status code.
- *
- ****************************************************************/
-int Pci2000_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
-       {
-       UCHAR              *cdb = (UCHAR *)SCpnt->cmnd;                                 // Pointer to SCSI CDB
-       PADAPTER2000    padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       int                             rc               = -1;                                                          // command return code
-       UCHAR                   bus              = SCpnt->device->channel;
-       UCHAR                   pun              = SCpnt->device->id;
-       UCHAR                   lun              = SCpnt->device->lun;
-       UCHAR                   cmd;
-       PDEV2000                pdev     = &padapter->dev[bus][pun];
-
-       if ( !done )
-               {
-               printk("pci2000_queuecommand: %02X: done can't be NULL\n", *cdb);
-               return 0;
-               }
-
-       SCpnt->scsi_done = done;
-       SCpnt->SCp.have_data_in = 0;
-       pdev->SCpnt = SCpnt;                                                                    // Save this command data
-
-       if ( WaitReady (padapter) )
-               {
-               rc = DID_ERROR;
-               goto finished;
-               }
-
-       outw_p (pun | (lun << 8), padapter->mb0);
-
-       if ( bus )
-               {
-               DEB (if(*cdb) printk ("\nCDB: %X-  %X %X %X %X %X %X %X %X %X %X ", SCpnt->cmd_len, cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7], cdb[8], cdb[9]));
-               DEB (if(*cdb) printk ("\ntimeout_per_command: %d, timeout_total: %d, timeout: %d", SCpnt->timeout_per_command,
-                                                         SCpnt->timeout_total, SCpnt->timeout));
-               outl (SCpnt->timeout_per_command, padapter->mb1);
-               outb_p (CMD_SCSI_TIMEOUT, padapter->cmd);
-               if ( WaitReady (padapter) )
-                       {
-                       rc = DID_ERROR;
-                       goto finished;
-                       }
-
-               outw_p (pun | (lun << 8), padapter->mb0);
-               outw_p (SCpnt->cmd_len << 8, padapter->mb0 + 2);
-               memcpy (pdev->cdb, cdb, MAX_COMMAND_SIZE);
-
-               outl (pdev->cdbDma, padapter->mb1);
-               if ( BuildSgList (SCpnt, padapter, pdev) )
-                       cmd = CMD_SCSI_THRU;
-               else
-                       cmd = CMD_SCSI_THRU_SG;
-               if ( (pdev->tag = Command (padapter, cmd)) == 0 )
-                       rc = DID_TIME_OUT;
-               goto finished;
-               }
-       else
-               {
-               if ( lun )
-                       {
-                       rc = DID_BAD_TARGET;
-                       goto finished;
-                       }
-               }
-
-       switch ( *cdb )
-               {
-               case SCSIOP_INQUIRY:                                    // inquiry CDB
-                       if ( cdb[2] == SC_MY_RAID )
-                               {
-                               switch ( cdb[3] ) 
-                                       {
-                                       case MY_SCSI_REBUILD:
-                                               OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_REBUILD) << 16);
-                                               return 0;
-                                       case MY_SCSI_ALARMMUTE:
-                                               OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_MUTE) << 16);
-                                               return 0;
-                                       case MY_SCSI_DEMOFAIL:
-                                               OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_FAIL) << 16);
-                                               return 0;
-                                       default:
-                                               if ( SCpnt->use_sg )
-                                                       {
-                                                       rc = DID_ERROR;
-                                                       goto finished;
-                                                       }
-                                               else
-                                                       {
-                                                       SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer, SCpnt->request_bufflen,
-                                                                                                         SCpnt->sc_data_direction);
-                                                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                                                       }
-                                               outl (cdb[5], padapter->mb0);
-                                               outl (cdb[3], padapter->mb3);
-                                               cmd = CMD_DASD_RAID_RQ;
-                                               break;
-                                       }
-                               break;
-                               }
-                       
-                       if ( SCpnt->use_sg )
-                               {
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev,
-                                                                         ((struct scatterlist *)SCpnt->request_buffer)->address,
-                                                                         SCpnt->request_bufflen,
-                                                                         SCpnt->sc_data_direction);
-                               }
-                       else
-                               {
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer,
-                                                                         SCpnt->request_bufflen,
-                                                                         SCpnt->sc_data_direction);
-                               }
-                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                       outl (SCpnt->request_bufflen, padapter->mb3);
-                       cmd = CMD_DASD_SCSI_INQ;
-                       break;
-
-               case SCSIOP_TEST_UNIT_READY:                    // test unit ready CDB
-                       SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->sense_buffer, sizeof (SCpnt->sense_buffer), PCI_DMA_FROMDEVICE);
-                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                       outl (sizeof (SCpnt->sense_buffer), padapter->mb3);
-                       cmd = CMD_TEST_READY;
-                       break;
-
-               case SCSIOP_READ_CAPACITY:                              // read capacity CDB
-                       if ( SCpnt->use_sg )
-                               {
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, ((struct scatterlist *)(SCpnt->request_buffer))->address,
-                                                                                 8, PCI_DMA_FROMDEVICE);
-                               }
-                       else
-                               SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer, 8, PCI_DMA_FROMDEVICE);
-                       outl (SCpnt->SCp.have_data_in, padapter->mb2);
-                       outl (8, padapter->mb3);
-                       cmd = CMD_DASD_CAP;
-                       break;
-               case SCSIOP_VERIFY:                                             // verify CDB
-                       outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
-                       outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
-                       cmd = CMD_READ_SG;
-                       break;
-               case SCSIOP_READ:                                               // read10 CDB
-                       outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
-                       outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_READ;
-                       else
-                               cmd = CMD_READ_SG;
-                       break;
-               case SCSIOP_READ6:                                              // read6  CDB
-                       outw_p (cdb[4], padapter->mb0 + 2);
-                       outl ((SCSI2LONG (&cdb[1])) & 0x001FFFFF, padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_READ;
-                       else
-                               cmd = CMD_READ_SG;
-                       break;
-               case SCSIOP_WRITE:                                              // write10 CDB
-                       outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
-                       outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_WRITE;
-                       else
-                               cmd = CMD_WRITE_SG;
-                       break;
-               case SCSIOP_WRITE6:                                             // write6  CDB
-                       outw_p (cdb[4], padapter->mb0 + 2);
-                       outl ((SCSI2LONG (&cdb[1])) & 0x001FFFFF, padapter->mb1);
-                       if ( BuildSgList (SCpnt, padapter, pdev) )
-                               cmd = CMD_WRITE;
-                       else
-                               cmd = CMD_WRITE_SG;
-                       break;
-               case SCSIOP_START_STOP_UNIT:
-                       cmd = CMD_EJECT_MEDIA;
-                       break;
-               case SCSIOP_MEDIUM_REMOVAL:
-                       switch ( cdb[4] )
-                               {
-                               case 0:
-                                       cmd = CMD_UNLOCK_DOOR;
-                                       break;
-                               case 1:
-                                       cmd = CMD_LOCK_DOOR;
-                                       break;
-                               default:
-                                       cmd = 0;
-                                       break;
-                               }
-                       if ( cmd )
-                               break;
-               default:
-                       DEB (printk ("pci2000_queuecommand: Unsupported command %02X\n", *cdb));
-                       OpDone (SCpnt, DID_ERROR << 16);
-                       return 0;
-               }
-
-       if ( (pdev->tag = Command (padapter, cmd)) == 0 )
-               rc = DID_TIME_OUT;
-finished:;
-       if ( rc != -1 )
-               OpDone (SCpnt, rc << 16);
-       return 0;
-       }
-/****************************************************************
- *     Name:   Pci2000_Detect
- *
- *     Description:    Detect and initialize our boards.
- *
- *     Parameters:             tpnt - Pointer to SCSI host template structure.
- *
- *     Returns:                Number of adapters installed.
- *
- ****************************************************************/
-int Pci2000_Detect (Scsi_Host_Template *tpnt)
-       {
-       int                                     found = 0;
-       int                                     installed = 0;
-       struct Scsi_Host   *pshost;
-       PADAPTER2000        padapter;
-       int                                     z, zz;
-       int                                     setirq;
-       struct pci_dev     *pdev = NULL;
-       UCHAR                      *consistent;
-       dma_addr_t                      consistentDma;
-
-       while ( (pdev = pci_find_device (VENDOR_PSI, DEVICE_ROY_1, pdev)) != NULL )
-               {
-               if (pci_enable_device(pdev))
-                       continue;
-               pshost = scsi_register (tpnt, sizeof(ADAPTER2000));
-               if(pshost == NULL)
-                       continue;
-               padapter = HOSTDATA(pshost);
-
-               padapter->basePort = pci_resource_start (pdev, 1);
-               DEB (printk ("\nBase Regs = %#04X", padapter->basePort));                       // get the base I/O port address
-               padapter->mb0   = padapter->basePort + RTR_MAILBOX;                                     // get the 32 bit mail boxes
-               padapter->mb1   = padapter->basePort + RTR_MAILBOX + 4;
-               padapter->mb2   = padapter->basePort + RTR_MAILBOX + 8;
-               padapter->mb3   = padapter->basePort + RTR_MAILBOX + 12;
-               padapter->mb4   = padapter->basePort + RTR_MAILBOX + 16;
-               padapter->cmd   = padapter->basePort + RTR_LOCAL_DOORBELL;                      // command register
-               padapter->tag   = padapter->basePort + RTR_PCI_DOORBELL;                        // tag/response register
-               padapter->pdev = pdev;
-
-               if ( WaitReady (padapter) )
-                       goto unregister;
-               outb_p (0x84, padapter->mb0);
-               outb_p (CMD_SPECIFY, padapter->cmd);
-               if ( WaitReady (padapter) )
-                       goto unregister;
-
-               consistent = pci_alloc_consistent (pdev, consistentLen, &consistentDma);
-               if ( !consistent )
-                       {
-                       printk ("Unable to allocate DMA memory for PCI-2000 controller.\n");
-                       goto unregister;
-                       }
-               
-               scsi_set_device(pshost, &pdev->dev);
-               pshost->irq = pdev->irq;
-               setirq = 1;
-               padapter->irqOwned = 0;
-               for ( z = 0;  z < installed;  z++ )                                                                     // scan for shared interrupts
-                       {
-                       if ( PsiHost[z]->irq == pshost->irq )                                                   // if shared then, don't posses
-                               setirq = 0;
-                       }
-               if ( setirq )                                                                                           // if not shared, posses
-                       {
-                       if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2000", padapter) < 0 )
-                               {
-                               if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2000", padapter) < 0 )
-                                       {
-                                       printk ("Unable to allocate IRQ for PCI-2000 controller.\n");
-                                       pci_free_consistent (pdev, consistentLen, consistent, consistentDma);
-                                       goto unregister;
-                                       }
-                               }
-                       padapter->irqOwned = pshost->irq;                                               // set IRQ as owned
-                       }
-               PsiHost[installed]      = pshost;                                                                               // save SCSI_HOST pointer
-
-               pshost->io_port         = padapter->basePort;
-               pshost->n_io_port       = 0xFF;
-               pshost->unique_id       = padapter->basePort;
-               pshost->max_id          = 16;
-               pshost->max_channel     = 1;
-
-               for ( zz = 0;  zz < MAX_BUS;  zz++ )
-                       for ( z = 0; z < MAX_UNITS;  z++ )
-                               {
-                               padapter->dev[zz][z].tag = 0;
-                               padapter->dev[zz][z].scatGath = (PSCATGATH)consistent;
-                               padapter->dev[zz][z].scatGathDma = consistentDma;
-                               consistent += 16 * sizeof (SCATGATH);
-                               consistentDma += 16 * sizeof (SCATGATH);
-                               padapter->dev[zz][z].cdb = (UCHAR *)consistent;
-                               padapter->dev[zz][z].cdbDma = consistentDma;
-                               consistent += MAX_COMMAND_SIZE;
-                               consistentDma += MAX_COMMAND_SIZE;
-                               }
-                       
-               printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %lX  IRQ = %d\n", padapter->basePort, pshost->irq);
-               printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION,  __DATE__, __TIME__);
-               found++;
-               if ( ++installed < MAXADAPTER )
-                       continue;
-               break;
-unregister:;
-               scsi_unregister (pshost);
-               found++;
-               }
-       NumAdapters = installed;
-       return installed;
-       }
-/****************************************************************
- *     Name:   Pci2000_Abort
- *
- *     Description:    Process the Abort command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *
- *     Returns:                Allways snooze.
- *
- ****************************************************************/
-int Pci2000_Abort (Scsi_Cmnd *SCpnt)
-       {
-       DEB (printk ("pci2000_abort\n"));
-       return SCSI_ABORT_SNOOZE;
-       }
-/****************************************************************
- *     Name:   Pci2000_Reset
- *
- *     Description:    Process the Reset command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     flags - Flags about the reset command
- *
- *     Returns:                No active command at this time, so this means
- *                                     that each time we got some kind of response the
- *                                     last time through.  Tell the mid-level code to
- *                                     request sense information in order to decide what
- *                                     to do next.
- *
- ****************************************************************/
-int Pci2000_Reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags)
-       {
-       return SCSI_RESET_PUNT;
-       }
-/****************************************************************
- *     Name:   Pci2000_Release
- *
- *     Description:    Release resources allocated for a single each adapter.
- *
- *     Parameters:             pshost - Pointer to SCSI command structure.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2000_Release (struct Scsi_Host *pshost)
-       {
-    PADAPTER2000       padapter = HOSTDATA (pshost);
-
-       if ( padapter->irqOwned )
-               free_irq (pshost->irq, padapter);
-       pci_free_consistent (padapter->pdev, consistentLen, padapter->dev[0][0].scatGath, padapter->dev[0][0].scatGathDma);
-       release_region (pshost->io_port, pshost->n_io_port);
-    scsi_unregister(pshost);
-    return 0;
-       }
-
-/****************************************************************
- *     Name:   Pci2000_BiosParam
- *
- *     Description:    Process the biosparam request from the SCSI manager to
- *                                     return C/H/S data.
- *
- *     Parameters:             disk - Pointer to SCSI disk structure.
- *                                     dev      - Major/minor number from kernel.
- *                                     geom - Pointer to integer array to place geometry data.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2000_BiosParam (struct scsi_device *sdev, struct block_device *dev,
-               sector_t capacity, int geom[])
-       {
-       PADAPTER2000        padapter;
-
-       padapter = HOSTDATA(sdev->host);
-
-       if ( WaitReady (padapter) )
-               return 0;
-       outb_p (sdev->id, padapter->mb0);
-       outb_p (CMD_GET_PARMS, padapter->cmd);
-       if ( WaitReady (padapter) )
-               return 0;
-
-       geom[0] = inb_p (padapter->mb2 + 3);
-       geom[1] = inb_p (padapter->mb2 + 2);
-       geom[2] = inw_p (padapter->mb2);
-       return 0;
-       }
-
-
-MODULE_LICENSE("Dual BSD/GPL");
-
-static Scsi_Host_Template driver_template = {
-       .proc_name      = "pci2000",
-       .name           = "PCI-2000 SCSI Intelligent Disk Controller",
-       .detect         = Pci2000_Detect,
-       .release        = Pci2000_Release,
-       .queuecommand   = Pci2000_QueueCommand,
-       .abort          = Pci2000_Abort,
-       .reset          = Pci2000_Reset,
-       .bios_param     = Pci2000_BiosParam,
-       .can_queue      = 16,
-       .this_id        = -1,
-       .sg_tablesize   = 16,
-       .cmd_per_lun    = 1,
-       .use_clustering = DISABLE_CLUSTERING,
-};
-#include "scsi_module.c"
diff --git a/drivers/scsi/pci2220i.c b/drivers/scsi/pci2220i.c
deleted file mode 100644 (file)
index e395e42..0000000
+++ /dev/null
@@ -1,2915 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
- *
- * pci2220i.c - Linux Host Driver for PCI-2220I EIDE RAID Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- *
- *     Revisions 1.10          Mar-26-1999
- *             - Updated driver for RAID and hot reconstruct support.
- *
- *     Revisions 1.11          Mar-26-1999
- *             - Fixed spinlock and PCI configuration.
- *
- *     Revision 2.00           December-1-1999
- *             - Added code for the PCI-2240I controller
- *             - Added code for ATAPI devices.
- *             - Double buffer for scatter/gather support
- *
- *     Revision 2.10           March-27-2000
- *             - Added support for dynamic DMA
- *
- ****************************************************************************/
-
-#error Convert me to understand page+offset based scatterlists
-
-//#define DEBUG 1
-
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/slab.h>
-#include <linux/pci.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/sched.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-#include <linux/blkdev.h>
-#include <linux/timer.h>
-#include <linux/spinlock.h>
-
-#include <asm/dma.h>
-#include <asm/system.h>
-#include <asm/io.h>
-
-#include "scsi.h"
-#include <scsi/scsi_host.h>
-#include "pci2220i.h"
-#include "psi_dale.h"
-
-
-#define        PCI2220I_VERSION                "2.10"
-#define        READ_CMD                                IDE_CMD_READ_MULTIPLE
-#define        WRITE_CMD                               IDE_CMD_WRITE_MULTIPLE
-#define        MAX_BUS_MASTER_BLOCKS   SECTORSXFER             // This is the maximum we can bus master
-
-#ifdef DEBUG
-#define DEB(x) x
-#define STOP_HERE()    {int st;for(st=0;st<100;st++){st=1;}}
-#else
-#define DEB(x)
-#define STOP_HERE()
-#endif
-
-#define MAXADAPTER 4                                   // Increase this and the sizes of the arrays below, if you need more.
-
-
-typedef struct
-       {
-       UCHAR                   byte6;                          // device select register image
-       UCHAR                   spigot;                         // spigot number
-       UCHAR                   spigots[2];                     // RAID spigots
-       UCHAR                   deviceID[2];            // device ID codes
-       USHORT                  sectors;                        // number of sectors per track
-       USHORT                  heads;                          // number of heads
-       USHORT                  cylinders;                      // number of cylinders for this device
-       USHORT                  spareword;                      // placeholder
-       ULONG                   blocks;                         // number of blocks on device
-       DISK_MIRROR             DiskMirror[2];          // RAID status and control
-       ULONG                   lastsectorlba[2];       // last addressable sector on the drive
-       USHORT                  raid;                           // RAID active flag
-       USHORT                  mirrorRecon;
-       UCHAR                   reconOn;
-       USHORT                  reconCount;
-       USHORT                  reconIsStarting;        // indicate hot reconstruct is starting
-       UCHAR                   cmdDrqInt;                      // flag for command interrupt
-       UCHAR                   packet;                         // command packet size in bytes
-       }       OUR_DEVICE, *POUR_DEVICE;       
-
-typedef struct
-       {
-       USHORT           bigD;                                  // identity is a PCI-2240I if true, otherwise a PCI-2220I
-       USHORT           atapi;                                 // this interface is for ATAPI devices only
-       ULONG            regDmaDesc;                    // address of the DMA discriptor register for direction of transfer
-       ULONG            regDmaCmdStat;                 // Byte #1 of DMA command status register
-       ULONG            regDmaAddrPci;                 // 32 bit register for PCI address of DMA
-       ULONG            regDmaAddrLoc;                 // 32 bit register for local bus address of DMA
-       ULONG            regDmaCount;                   // 32 bit register for DMA transfer count
-       ULONG            regDmaMode;                    // 32 bit register for DMA mode control
-       ULONG            regRemap;                              // 32 bit local space remap
-       ULONG            regDesc;                               // 32 bit local region descriptor
-       ULONG            regRange;                              // 32 bit local range
-       ULONG            regIrqControl;                 // 16 bit Interrupt enable/disable and status
-       ULONG            regScratchPad;                 // scratch pad I/O base address
-       ULONG            regBase;                               // Base I/O register for data space
-       ULONG            regData;                               // data register I/O address
-       ULONG            regError;                              // error register I/O address
-       ULONG            regSectCount;                  // sector count register I/O address
-       ULONG            regLba0;                               // least significant byte of LBA
-       ULONG            regLba8;                               // next least significant byte of LBA
-       ULONG            regLba16;                              // next most significan byte of LBA
-       ULONG            regLba24;                              // head and most 4 significant bits of LBA
-       ULONG            regStatCmd;                    // status on read and command on write register
-       ULONG            regStatSel;                    // board status on read and spigot select on write register
-       ULONG            regFail;                               // fail bits control register
-       ULONG            regAltStat;                    // alternate status and drive control register
-       ULONG            basePort;                              // PLX base I/O port
-       USHORT           timingMode;                    // timing mode currently set for adapter
-       USHORT           timingPIO;                             // TRUE if PIO timing is active
-       struct pci_dev  *pcidev;
-       ULONG            timingAddress;                 // address to use on adapter for current timing mode
-       ULONG            irqOwned;                              // owned IRQ or zero if shared
-       UCHAR            numberOfDrives;                // saved number of drives on this controller
-       UCHAR            failRegister;                  // current inverted data in fail register
-       OUR_DEVICE       device[BIGD_MAXDRIVES];
-       DISK_MIRROR     *raidData[BIGD_MAXDRIVES];
-       ULONG            startSector;
-       USHORT           sectorCount;
-       ULONG            readCount;
-       UCHAR           *currentSgBuffer;
-       ULONG            currentSgCount;
-       USHORT           nextSg;
-       UCHAR            cmd;
-       Scsi_Cmnd       *SCpnt;
-       POUR_DEVICE      pdev;                                  // current device opearating on
-       USHORT           devInReconIndex;
-       USHORT           expectingIRQ;
-       USHORT           reconOn;                               // Hot reconstruct is to be done.
-       USHORT           reconPhase;                    // Hot reconstruct operation is in progress.
-       ULONG            reconSize;
-       USHORT           demoFail;                              // flag for RAID failure demonstration
-       USHORT           survivor;
-       USHORT           failinprog;
-       struct timer_list       reconTimer;     
-       struct timer_list       timer;
-       UCHAR           *kBuffer;
-       dma_addr_t       kBufferDma;
-       UCHAR            reqSense;
-       UCHAR            atapiCdb[16];
-       UCHAR            atapiSpecial;
-       }       ADAPTER2220I, *PADAPTER2220I;
-
-#define HOSTDATA(host) ((PADAPTER2220I)&host->hostdata)
-
-#define        RECON_PHASE_READY               0x01
-#define        RECON_PHASE_COPY                0x02
-#define        RECON_PHASE_UPDATE              0x03
-#define        RECON_PHASE_LAST                0x04
-#define        RECON_PHASE_END                 0x07    
-#define        RECON_PHASE_MARKING             0x80
-#define        RECON_PHASE_FAILOVER    0xFF
-
-static struct  Scsi_Host          *PsiHost[MAXADAPTER] = {NULL,};  // One for each adapter
-static                 int                             NumAdapters = 0;
-static                 int                             Installed = 0;
-static                 SETUP                   DaleSetup;
-static                 DISK_MIRROR             DiskMirror[BIGD_MAXDRIVES];
-static                 ULONG                   ModeArray[] = {DALE_DATA_MODE2, DALE_DATA_MODE3, DALE_DATA_MODE4, DALE_DATA_MODE5};
-static                 ULONG                   ModeArray2[] = {BIGD_DATA_MODE2, BIGD_DATA_MODE3, BIGD_DATA_MODE4, BIGD_DATA_MODE5};
-
-static void ReconTimerExpiry (unsigned long data);
-
-/*******************************************************************************************************
- *     Name:                   Alarm
- *
- *     Description:    Sound the for the given device
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     device   - Device number.
- *     
- *     Returns:                Nothing.
- *
- ******************************************************************************************************/
-static void Alarm (PADAPTER2220I padapter, UCHAR device)
-       {
-       UCHAR   zc;
-
-       if ( padapter->bigD )
-               {
-               zc = device | (FAIL_ANY | FAIL_AUDIBLE);
-               if ( padapter->failRegister & FAIL_ANY ) 
-                       zc |= FAIL_MULTIPLE;
-               
-               padapter->failRegister = zc;
-               outb_p (~zc, padapter->regFail);
-               }
-       else
-               outb_p (0x3C | (1 << device), padapter->regFail);                       // sound alarm and set fail light               
-       }
-/****************************************************************
- *     Name:   MuteAlarm       :LOCAL
- *
- *     Description:    Mute the audible alarm.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static void MuteAlarm (PADAPTER2220I padapter)
-       {
-       UCHAR   old;
-
-       if ( padapter->bigD )
-               {
-               padapter->failRegister &= ~FAIL_AUDIBLE;
-               outb_p (~padapter->failRegister, padapter->regFail);
-               }
-       else
-               {
-               old = (inb_p (padapter->regStatSel) >> 3) | (inb_p (padapter->regStatSel) & 0x83);
-               outb_p (old | 0x40, padapter->regFail);
-               }
-       }
-/****************************************************************
- *     Name:   WaitReady       :LOCAL
- *
- *     Description:    Wait for device ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WaitReady (PADAPTER2220I padapter)
-       {
-       ULONG   z;
-       UCHAR   status;
-
-       for ( z = 0;  z < (TIMEOUT_READY * 4);  z++ )
-               {
-               status = inb_p (padapter->regStatCmd);
-               if ( (status & (IDE_STATUS_DRDY | IDE_STATUS_BUSY)) == IDE_STATUS_DRDY )
-                       return 0;
-               udelay (250);
-               }
-       return status;
-       }
-/****************************************************************
- *     Name:   WaitReadyReset  :LOCAL
- *
- *     Description:    Wait for device ready.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WaitReadyReset (PADAPTER2220I padapter)
-       {
-       ULONG   z;
-       UCHAR   status;
-
-       for ( z = 0;  z < (125 * 16);  z++ )                            // wait up to 1/4 second
-               {
-               status = inb_p (padapter->regStatCmd);
-               if ( (status & (IDE_STATUS_DRDY | IDE_STATUS_BUSY)) == IDE_STATUS_DRDY )
-                       {
-                       DEB (printk ("\nPCI2220I:  Reset took %ld mSec to be ready", z / 8));
-                       return 0;
-                       }
-               udelay (125);
-               }
-       DEB (printk ("\nPCI2220I:  Reset took more than 2 Seconds to come ready, Disk Failure"));
-       return status;
-       }
-/****************************************************************
- *     Name:   WaitDrq :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WaitDrq (PADAPTER2220I padapter)
-       {
-       ULONG   z;
-       UCHAR   status;
-
-       for ( z = 0;  z < (TIMEOUT_DRQ * 4);  z++ )
-               {
-               status = inb_p (padapter->regStatCmd);
-               if ( status & IDE_STATUS_DRQ )
-                       return 0;
-               udelay (250);
-               }
-       return status;
-       }
-/****************************************************************
- *     Name:   AtapiWaitReady  :LOCAL
- *
- *     Description:    Wait for device busy and DRQ to be cleared.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     msec     - Number of milliseconds to wait.
- *
- *     Returns:                TRUE if drive does not clear busy in time.
- *
- ****************************************************************/
-static int AtapiWaitReady (PADAPTER2220I padapter, int msec)
-       {
-       int z;
-
-       for ( z = 0;  z < (msec * 16);  z++ )
-               {
-               if ( !(inb_p (padapter->regStatCmd) & (IDE_STATUS_BUSY | IDE_STATUS_DRQ)) )
-                       return FALSE;
-               udelay (125);
-               }
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   AtapiWaitDrq    :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     msec     - Number of milliseconds to wait.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int AtapiWaitDrq (PADAPTER2220I padapter, int msec)
-       {
-       ULONG   z;
-
-       for ( z = 0;  z < (msec * 16);  z++ )
-               {
-               if ( inb_p (padapter->regStatCmd) & IDE_STATUS_DRQ )
-                       return 0;
-               udelay (128);
-               }
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   HardReset       :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     spigot   - Spigot number.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int HardReset (PADAPTER2220I padapter, POUR_DEVICE pdev, UCHAR spigot)
-       {
-       DEB (printk ("\npci2220i:RESET  spigot = %X  devices = %d, %d", spigot, pdev->deviceID[0], pdev->deviceID[1]));
-       mdelay (100);                                                                           // just wait 100 mSec to let drives flush       
-       SelectSpigot (padapter, spigot | SEL_IRQ_OFF);
-       
-       outb_p (0x0E, padapter->regAltStat);                                    // reset the suvivor
-       udelay (100);                                                                                   // wait a little        
-       outb_p (0x08, padapter->regAltStat);                                    // clear the reset
-       udelay (100);
-
-       outb_p (0xA0, padapter->regLba24);                                              // select the master drive
-       if ( WaitReadyReset (padapter) )
-               {
-               DEB (printk ("\npci2220i: master not ready after reset"));
-               return TRUE;
-               }
-       outb_p (0xB0, padapter->regLba24);                                              // try the slave drive
-       if ( (inb_p (padapter->regStatCmd) & (IDE_STATUS_DRDY | IDE_STATUS_BUSY)) == IDE_STATUS_DRDY ) 
-               {
-               DEB (printk ("\nPCI2220I: initializing slave drive on spigot %X", spigot));
-               outb_p (SECTORSXFER, padapter->regSectCount);
-               WriteCommand (padapter, IDE_CMD_SET_MULTIPLE);  
-               if ( WaitReady (padapter) )
-                       {
-                       DEB (printk ("\npci2220i: slave not ready after set multiple"));
-                       return TRUE;
-                       }
-               }
-       
-       outb_p (0xA0, padapter->regLba24);                              // select the drive
-       outb_p (SECTORSXFER, padapter->regSectCount);
-       WriteCommand (padapter, IDE_CMD_SET_MULTIPLE);  
-       if ( WaitReady (padapter) )
-               {
-               DEB (printk ("\npci2220i: master not ready after set multiple"));
-               return TRUE;
-               }
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   AtapiReset      :LOCAL
- *
- *     Description:    Wait for device ready for data transfer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *
- *     Returns:                TRUE if drive does not come ready.
- *
- ****************************************************************/
-static int AtapiReset (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       SelectSpigot (padapter, pdev->spigot);
-       AtapiDevice (padapter, pdev->byte6);
-       AtapiCountLo (padapter, 0);
-       AtapiCountHi (padapter, 0);
-       WriteCommand (padapter, IDE_COMMAND_ATAPI_RESET);
-       udelay (125);
-       if ( AtapiWaitReady (padapter, 1000) )
-               return TRUE;
-       if ( inb_p (padapter->regStatCmd) || (inb_p (padapter->regLba8) != 0x14) || (inb_p (padapter->regLba16) != 0xEB) )
-               return TRUE;
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   WalkScatGath    :LOCAL
- *
- *     Description:    Transfer data to/from scatter/gather buffers.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     datain   - TRUE if data read.
- *                                     length   - Number of bytes to transfer.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void WalkScatGath (PADAPTER2220I padapter, UCHAR datain, ULONG length)
-       {
-       ULONG    count;
-       UCHAR   *buffer = padapter->kBuffer;
-
-       while ( length )
-               {
-               count = ( length > padapter->currentSgCount ) ? padapter->currentSgCount : length; 
-               
-               if ( datain )
-                       memcpy (padapter->currentSgBuffer, buffer, count);
-               else
-                       memcpy (buffer, padapter->currentSgBuffer, count);
-
-               padapter->currentSgCount -= count;
-               if ( !padapter->currentSgCount )
-                       {
-                       if ( padapter->nextSg < padapter->SCpnt->use_sg )
-                               {
-                               padapter->currentSgBuffer = ((struct scatterlist *)padapter->SCpnt->request_buffer)[padapter->nextSg].address;
-                               padapter->currentSgCount = ((struct scatterlist *)padapter->SCpnt->request_buffer)[padapter->nextSg].length;
-                               padapter->nextSg++;
-                               }
-                       }
-               else
-                       padapter->currentSgBuffer += count;
-
-               length -= count;
-               buffer += count;
-               }
-       }
-/****************************************************************
- *     Name:   BusMaster       :LOCAL
- *
- *     Description:    Do a bus master I/O.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     datain   - TRUE if data read.
- *                                     irq              - TRUE if bus master interrupt expected.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void BusMaster (PADAPTER2220I padapter, UCHAR datain, UCHAR irq)
-       {
-       ULONG zl;
-       
-       zl = ( padapter->sectorCount > MAX_BUS_MASTER_BLOCKS ) ? MAX_BUS_MASTER_BLOCKS : padapter->sectorCount;
-       padapter->sectorCount -= zl;
-       zl *= (ULONG)BYTES_PER_SECTOR;
-
-       if ( datain )
-               {
-               padapter->readCount = zl;
-               outb_p (8, padapter->regDmaDesc);                                                       // read operation
-               if ( padapter->bigD )
-                       {
-                       if ( irq && !padapter->sectorCount )
-                               outb_p (0x0C, padapter->regDmaMode);                            // interrupt on
-                       else
-                               outb_p (0x08, padapter->regDmaMode);                            // no interrupt
-                       }
-               else 
-                       {
-                       if ( irq && !padapter->sectorCount )
-                               outb_p (0x05, padapter->regDmaMode);                            // interrupt on
-                       else
-                               outb_p (0x01, padapter->regDmaMode);                            // no interrupt
-                       }
-               }
-       else
-               {
-               outb_p (0x00, padapter->regDmaDesc);                                            // write operation
-               if ( padapter->bigD )
-                       outb_p (0x08, padapter->regDmaMode);                                    // no interrupt                                         
-               else
-                       outb_p (0x01, padapter->regDmaMode);                                    // no interrupt
-               WalkScatGath (padapter, FALSE, zl);     
-               }
-       
-       outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-       outl (padapter->kBufferDma, padapter->regDmaAddrPci);
-       outl (zl, padapter->regDmaCount);
-       outb_p (0x03, padapter->regDmaCmdStat);                                                 // kick the DMA engine in gear
-       }
-/****************************************************************
- *     Name:   AtapiBusMaster  :LOCAL
- *
- *     Description:    Do a bus master I/O.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     datain   - TRUE if data read.
- *                                     length   - Number of bytes to transfer.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void AtapiBusMaster (PADAPTER2220I padapter, UCHAR datain, ULONG length)
-       {
-       outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-       outl (padapter->kBufferDma, padapter->regDmaAddrPci);
-       outl (length, padapter->regDmaCount);
-       if ( datain )
-               {
-               if ( padapter->readCount )
-                               WalkScatGath (padapter, TRUE, padapter->readCount);
-               outb_p (0x08, padapter->regDmaDesc);                                            // read operation
-               outb_p (0x08, padapter->regDmaMode);                                            // no interrupt
-               padapter->readCount = length;
-               }
-       else
-               {
-               outb_p (0x00, padapter->regDmaDesc);                                            // write operation
-               outb_p (0x08, padapter->regDmaMode);                                            // no interrupt                                         
-               if ( !padapter->atapiSpecial )
-                       WalkScatGath (padapter, FALSE, length); 
-               }
-       outb_p (0x03, padapter->regDmaCmdStat);                                                 // kick the DMA engine in gear
-       }
-/****************************************************************
- *     Name:   WriteData       :LOCAL
- *
- *     Description:    Write data to device.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *
- *     Returns:                TRUE if drive does not assert DRQ in time.
- *
- ****************************************************************/
-static int WriteData (PADAPTER2220I padapter)
-       {
-       ULONG   zl;
-       
-       if ( !WaitDrq (padapter) )
-               {
-               if ( padapter->timingPIO )
-                       {
-                       zl = (padapter->sectorCount > MAX_BUS_MASTER_BLOCKS) ? MAX_BUS_MASTER_BLOCKS : padapter->sectorCount;
-                       WalkScatGath (padapter, FALSE, zl * BYTES_PER_SECTOR);
-                       outsw (padapter->regData, padapter->kBuffer, zl * (BYTES_PER_SECTOR / 2));
-                       padapter->sectorCount -= zl;
-                       }
-               else
-                       BusMaster (padapter, 0, 0);
-               return 0;
-               }
-       padapter->cmd = 0;                                                                                              // null out the command byte
-       return 1;
-       }
-/****************************************************************
- *     Name:   WriteDataBoth   :LOCAL
- *
- *     Description:    Write data to device.
- *
- *     Parameters:             padapter - Pointer to adapter structure.
- *                                     pdev     - Pointer to device structure
- *
- *     Returns:                Index + 1 of drive not failed or zero for OK.
- *
- ****************************************************************/
-static int WriteDataBoth (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       ULONG   zl;
-       UCHAR   status0, status1;
-
-       SelectSpigot (padapter, pdev->spigots[0]);
-       status0 = WaitDrq (padapter);
-       if ( !status0 )
-               {
-               SelectSpigot (padapter, pdev->spigots[1]);
-               status1 = WaitDrq (padapter);
-               if ( !status1 )
-                       {
-                       SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1] | padapter->bigD);
-                       if ( padapter->timingPIO )
-                               {
-                               zl = (padapter->sectorCount > MAX_BUS_MASTER_BLOCKS) ? MAX_BUS_MASTER_BLOCKS : padapter->sectorCount;
-                               WalkScatGath (padapter, FALSE, zl * BYTES_PER_SECTOR);
-                               outsw (padapter->regData, padapter->kBuffer, zl * (BYTES_PER_SECTOR / 2));
-                               padapter->sectorCount -= zl;
-                               }
-                       else
-                               BusMaster (padapter, 0, 0);
-                       return 0;
-                       }
-               }
-       padapter->cmd = 0;                                                                                              // null out the command byte
-       if ( status0 )
-               return 2;
-       return 1;
-       }
-/****************************************************************
- *     Name:   IdeCmd  :LOCAL
- *
- *     Description:    Process an IDE command.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *
- *     Returns:                Zero if no error or status register contents on error.
- *
- ****************************************************************/
-static UCHAR IdeCmd (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       UCHAR   status;
-
-       SelectSpigot (padapter, pdev->spigot | padapter->bigD);                                                 // select the spigot
-       outb_p (pdev->byte6 | ((UCHAR *)(&padapter->startSector))[3], padapter->regLba24);                      // select the drive
-       status = WaitReady (padapter);
-       if ( !status )
-               {
-               outb_p (padapter->sectorCount, padapter->regSectCount);
-               outb_p (((UCHAR *)(&padapter->startSector))[0], padapter->regLba0);
-               outb_p (((UCHAR *)(&padapter->startSector))[1], padapter->regLba8);
-               outb_p (((UCHAR *)(&padapter->startSector))[2], padapter->regLba16);
-               padapter->expectingIRQ = TRUE;
-               WriteCommand (padapter, padapter->cmd);
-               return 0;
-               }
-
-       padapter->cmd = 0;                                                                      // null out the command byte
-       return status;
-       }
-/****************************************************************
- *     Name:   IdeCmdBoth      :LOCAL
- *
- *     Description:    Process an IDE command to both drivers.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device structure
- *
- *     Returns:                Index + 1 of drive not failed or zero for OK.
- *
- ****************************************************************/
-static UCHAR IdeCmdBoth (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       UCHAR   status0;
-       UCHAR   status1;
-
-       SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1]);                                                           // select the spigots
-       outb_p (padapter->pdev->byte6 | ((UCHAR *)(&padapter->startSector))[3], padapter->regLba24);// select the drive
-       SelectSpigot (padapter, pdev->spigots[0]);
-       status0 = WaitReady (padapter);
-       if ( !status0 )
-               {
-               SelectSpigot (padapter, pdev->spigots[1]);
-               status1 = WaitReady (padapter);
-               if ( !status1 )
-                       {
-                       SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1] | padapter->bigD);
-                       outb_p (padapter->sectorCount, padapter->regSectCount);
-                       outb_p (((UCHAR *)(&padapter->startSector))[0], padapter->regLba0);
-                       outb_p (((UCHAR *)(&padapter->startSector))[1], padapter->regLba8);
-                       outb_p (((UCHAR *)(&padapter->startSector))[2], padapter->regLba16);
-                       padapter->expectingIRQ = TRUE;
-                       WriteCommand (padapter, padapter->cmd);
-                       return 0;
-                       }
-               }
-       padapter->cmd = 0;                                                                      // null out the command byte
-       if ( status0 )
-               return 2;
-       return 1;
-       }
-/****************************************************************
- *     Name:   OpDone  :LOCAL
- *
- *     Description:    Complete an operatoin done sequence.
- *
- *     Parameters:             padapter - Pointer to host data block.
- *                                     spigot   - Spigot select code.
- *                                     device   - Device byte code.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void OpDone (PADAPTER2220I padapter, ULONG result)
-       {
-       Scsi_Cmnd          *SCpnt = padapter->SCpnt;
-       
-       if ( padapter->reconPhase )
-               {
-               padapter->reconPhase = 0;
-               if ( padapter->SCpnt )
-                       {
-                       Pci2220i_QueueCommand (SCpnt, SCpnt->scsi_done);
-                       }
-               else
-                       {
-                       if ( padapter->reconOn )
-                               {
-                               ReconTimerExpiry ((unsigned long)padapter);
-                               }
-                       }
-               }
-       else
-               {
-               padapter->cmd = 0;
-               padapter->SCpnt = NULL; 
-               padapter->pdev = NULL;
-               SCpnt->result = result;
-               SCpnt->scsi_done (SCpnt);
-               if ( padapter->reconOn && !padapter->reconTimer.data )
-                       {
-                       padapter->reconTimer.expires = jiffies + (HZ / 4);      // start in 1/4 second
-                       padapter->reconTimer.data = (unsigned long)padapter;
-                       add_timer (&padapter->reconTimer);
-                       }
-               }
-       }
-/****************************************************************
- *     Name:   InlineIdentify  :LOCAL
- *
- *     Description:    Do an intline inquiry on a drive.
- *
- *     Parameters:             padapter - Pointer to host data block.
- *                                     spigot   - Spigot select code.
- *                                     device   - Device byte code.
- *
- *     Returns:                Last addressable sector or zero if none.
- *
- ****************************************************************/
-static ULONG InlineIdentify (PADAPTER2220I padapter, UCHAR spigot, UCHAR device)
-       {
-       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)padapter->kBuffer;
-
-       SelectSpigot (padapter, spigot | SEL_IRQ_OFF);                                  // select the spigot
-       outb_p ((device << 4) | 0xA0, padapter->regLba24);                              // select the drive
-       if ( WaitReady (padapter) )
-               return 0;
-       WriteCommand (padapter, IDE_COMMAND_IDENTIFY);  
-       if ( WaitDrq (padapter) )
-               return 0;
-       insw (padapter->regData, padapter->kBuffer, sizeof (IDENTIFY_DATA) >> 1);
-       return (pid->LBATotalSectors - 1);
-       }
-/****************************************************************
- *     Name:   AtapiIdentify   :LOCAL
- *
- *     Description:    Do an intline inquiry on a drive.
- *
- *     Parameters:             padapter - Pointer to host data block.
- *                                     pdev     - Pointer to device table.
- *
- *     Returns:                TRUE on error.
- *
- ****************************************************************/
-static ULONG AtapiIdentify (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       ATAPI_GENERAL_0         ag0;
-       USHORT                          zs;
-       int                                     z;
-
-       AtapiDevice (padapter, pdev->byte6);    
-       WriteCommand (padapter, IDE_COMMAND_ATAPI_IDENTIFY);    
-       if ( AtapiWaitDrq (padapter, 3000) )
-               return TRUE;
-
-       *(USHORT *)&ag0 = inw_p (padapter->regData);
-       for ( z = 0;  z < 255;  z++ )
-               zs = inw_p (padapter->regData);
-
-       if ( ag0.ProtocolType == 2 )
-               {
-               if ( ag0.CmdDrqType == 1 )
-                       pdev->cmdDrqInt = TRUE;
-               switch ( ag0.CmdPacketSize )
-                       {
-                       case 0:
-                               pdev->packet = 6;
-                               break;
-                       case 1:
-                               pdev->packet = 8;
-                               break;
-                       default:
-                               pdev->packet = 6;
-                               break;
-                       }
-               return FALSE;
-               }
-       return TRUE;
-       }
-/****************************************************************
- *     Name:   Atapi2Scsi
- *
- *     Description:    Convert ATAPI data to SCSI data.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     SCpnt    - Pointer to SCSI command structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-void Atapi2Scsi (PADAPTER2220I padapter, Scsi_Cmnd *SCpnt)
-       {
-       UCHAR   *buff = padapter->currentSgBuffer;
-       switch ( SCpnt->cmnd[0] )
-               {
-               case SCSIOP_MODE_SENSE:
-                       buff[0] = padapter->kBuffer[1];
-                       buff[1] = padapter->kBuffer[2];
-                       buff[2] = padapter->kBuffer[3];
-                       buff[3] = padapter->kBuffer[7];
-                       memcpy (&buff[4], &padapter->kBuffer[8], padapter->atapiCdb[8] - 8);
-                       break;
-               case SCSIOP_INQUIRY:
-                       padapter->kBuffer[2] = 2;
-                       memcpy (buff, padapter->kBuffer, padapter->currentSgCount);
-                       break;          
-               default:
-                       if ( padapter->readCount )
-                               WalkScatGath (padapter, TRUE, padapter->readCount);
-                       break;
-               }
-       }
-/****************************************************************
- *     Name:   Scsi2Atapi
- *
- *     Description:    Convert SCSI packet command to Atapi packet command.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     SCpnt    - Pointer to SCSI command structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void Scsi2Atapi (PADAPTER2220I padapter, Scsi_Cmnd *SCpnt)
-       {
-       UCHAR   *cdb = SCpnt->cmnd;
-       UCHAR   *buff = padapter->currentSgBuffer;
-
-       switch (cdb[0]) 
-               {
-               case SCSIOP_READ6:
-            padapter->atapiCdb[0] = SCSIOP_READ;
-                       padapter->atapiCdb[1] = cdb[1] & 0xE0;
-            padapter->atapiCdb[3] = cdb[1] & 0x1F;
-                       padapter->atapiCdb[4] = cdb[2];
-                       padapter->atapiCdb[5] = cdb[3];
-                       padapter->atapiCdb[8] = cdb[4];
-                       padapter->atapiCdb[9] = cdb[5];
-                       break;
-               case SCSIOP_WRITE6:
-            padapter->atapiCdb[0] = SCSIOP_WRITE;
-                       padapter->atapiCdb[1] = cdb[1] & 0xE0;
-            padapter->atapiCdb[3] = cdb[1] & 0x1F;
-                       padapter->atapiCdb[4] = cdb[2];
-                       padapter->atapiCdb[5] = cdb[3];
-                       padapter->atapiCdb[8] = cdb[4];
-                       padapter->atapiCdb[9] = cdb[5];
-                       break;
-        case SCSIOP_MODE_SENSE: 
-            padapter->atapiCdb[0] = SCSIOP_MODE_SENSE10;
-                       padapter->atapiCdb[2] = cdb[2];
-                       padapter->atapiCdb[8] = cdb[4] + 4;
-            break;
-
-        case SCSIOP_MODE_SELECT: 
-                       padapter->atapiSpecial = TRUE;
-                       padapter->atapiCdb[0] = SCSIOP_MODE_SELECT10;
-                       padapter->atapiCdb[1] = cdb[1] | 0x10;
-                       memcpy (padapter->kBuffer, buff, 4);
-                       padapter->kBuffer[4] = padapter->kBuffer[5] = 0;
-                       padapter->kBuffer[6] = padapter->kBuffer[7] = 0;
-                       memcpy (&padapter->kBuffer[8], &buff[4], cdb[4] - 4);
-                       padapter->atapiCdb[8] = cdb[4] + 4;
-                       break;
-           }
-       }
-/****************************************************************
- *     Name:   AtapiSendCdb
- *
- *     Description:    Send the CDB packet to the device.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     cdb              - Pointer to 16 byte SCSI cdb.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void AtapiSendCdb (PADAPTER2220I padapter, POUR_DEVICE pdev, CHAR *cdb)
-       {
-       DEB (printk ("\nPCI2242I: CDB: %X %X %X %X %X %X %X %X %X %X %X %X", cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7], cdb[8], cdb[9], cdb[10], cdb[11]));
-       outsw (padapter->regData, cdb, pdev->packet);
-       }
-/****************************************************************
- *     Name:   AtapiRequestSense
- *
- *     Description:    Send the CDB packet to the device.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     SCpnt    - Pointer to SCSI command structure.
- *                                     pass     - If true then this is the second pass to send cdb.
- *
- *     Returns:                TRUE on error.
- *
- ****************************************************************/
-static int AtapiRequestSense (PADAPTER2220I padapter, POUR_DEVICE pdev, Scsi_Cmnd *SCpnt, UCHAR pass)
-       {
-       UCHAR   cdb[16] = {SCSIOP_REQUEST_SENSE,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0};                
-       
-       DEB (printk ("\nPCI2242I: AUTO REQUEST SENSE"));
-       cdb[4] = (UCHAR)(sizeof (SCpnt->sense_buffer));
-       if ( !pass )
-               {
-               padapter->reqSense = TRUE;
-               AtapiCountLo (padapter, cdb[4]);                                                
-               AtapiCountHi (padapter, 0);                                             
-               outb_p (0, padapter->regError);                                         
-               WriteCommand (padapter, IDE_COMMAND_ATAPI_PACKET);
-               if ( pdev->cmdDrqInt )
-                       return FALSE;
-
-               if ( AtapiWaitDrq (padapter, 500) )
-                       return TRUE;
-               }
-       AtapiSendCdb (padapter, pdev, cdb);     
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   InlineReadSignature     :LOCAL
- *
- *     Description:    Do an inline read RAID sigature.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to device.
- *                                     index    - index of data to read.
- *
- *     Returns:                Zero if no error or status register contents on error.
- *
- ****************************************************************/
-static UCHAR InlineReadSignature (PADAPTER2220I padapter, POUR_DEVICE pdev, int index)
-       {
-       UCHAR   status;
-       ULONG   zl = pdev->lastsectorlba[index];
-
-       SelectSpigot (padapter, pdev->spigots[index] | SEL_IRQ_OFF);    // select the spigot without interrupts
-       outb_p (pdev->byte6 | ((UCHAR *)&zl)[3], padapter->regLba24);           
-       status = WaitReady (padapter);
-       if ( !status )
-               {
-               outb_p (((UCHAR *)&zl)[2], padapter->regLba16);
-               outb_p (((UCHAR *)&zl)[1], padapter->regLba8); 
-               outb_p (((UCHAR *)&zl)[0], padapter->regLba0);
-               outb_p (1, padapter->regSectCount);
-               WriteCommand (padapter, IDE_COMMAND_READ);
-               status = WaitDrq (padapter);
-               if ( !status )
-                       {
-                       insw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
-                       ((ULONG *)(&pdev->DiskMirror[index]))[0] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0];
-                       ((ULONG *)(&pdev->DiskMirror[index]))[1] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1];
-                       // some drives assert DRQ before IRQ so let's make sure we clear the IRQ
-                       WaitReady (padapter);
-                       return 0;                       
-                       }
-               }
-       return status;
-       }
-/****************************************************************
- *     Name:   DecodeError     :LOCAL
- *
- *     Description:    Decode and process device errors.
- *
- *     Parameters:             padapter - Pointer to adapter data.
- *                                     status - Status register code.
- *
- *     Returns:                The driver status code.
- *
- ****************************************************************/
-static ULONG DecodeError (PADAPTER2220I        padapter, UCHAR status)
-       {
-       UCHAR                   error;
-
-       padapter->expectingIRQ = 0;
-       if ( status & IDE_STATUS_WRITE_FAULT )
-               {
-               return DID_PARITY << 16;
-               }
-       if ( status & IDE_STATUS_BUSY )
-               return DID_BUS_BUSY << 16;
-
-       error = inb_p (padapter->regError);
-       DEB(printk ("\npci2220i error register: %x", error));
-       switch ( error )
-               {
-               case IDE_ERROR_AMNF:
-               case IDE_ERROR_TKONF:
-               case IDE_ERROR_ABRT:
-               case IDE_ERROR_IDFN:
-               case IDE_ERROR_UNC:
-               case IDE_ERROR_BBK:
-               default:
-                       return DID_ERROR << 16;
-               }
-       return DID_ERROR << 16;
-       }
-/****************************************************************
- *     Name:   StartTimer      :LOCAL
- *
- *     Description:    Start the timer.
- *
- *     Parameters:             ipadapter - Pointer adapter data structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void StartTimer (PADAPTER2220I padapter)
-       {
-       padapter->timer.expires = jiffies + TIMEOUT_DATA;
-       add_timer (&padapter->timer);
-       }
-/****************************************************************
- *     Name:   WriteSignature  :LOCAL
- *
- *     Description:    Start the timer.
- *
- *     Parameters:             padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to our device.
- *                                     spigot   - Selected spigot.
- *                                     index    - index of mirror signature on device.
- *
- *     Returns:                TRUE on any error.
- *
- ****************************************************************/
-static int WriteSignature (PADAPTER2220I padapter, POUR_DEVICE pdev, UCHAR spigot, int index)
-       {
-       ULONG   zl;
-
-       SelectSpigot (padapter, spigot);
-       zl = pdev->lastsectorlba[index];
-       outb_p (pdev->byte6 | ((UCHAR *)&zl)[3], padapter->regLba24);           
-       outb_p (((UCHAR *)&zl)[2], padapter->regLba16);
-       outb_p (((UCHAR *)&zl)[1], padapter->regLba8);
-       outb_p (((UCHAR *)&zl)[0], padapter->regLba0);
-       outb_p (1, padapter->regSectCount);
-
-       WriteCommand (padapter, IDE_COMMAND_WRITE);     
-       if ( WaitDrq (padapter) )
-               return TRUE;
-       StartTimer (padapter);  
-       padapter->expectingIRQ = TRUE;
-       
-       ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0] = ((ULONG *)(&pdev->DiskMirror[index]))[0];
-       ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1] = ((ULONG *)(&pdev->DiskMirror[index]))[1];
-       outsw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
-       return FALSE;
-       }
-/*******************************************************************************************************
- *     Name:                   InitFailover
- *
- *     Description:    This is the beginning of the failover routine
- *
- *     Parameters:             SCpnt    - Pointer to SCSI command structure.
- *                                     padapter - Pointer adapter data structure.
- *                                     pdev     - Pointer to our device.
- *     
- *     Returns:                TRUE on error.
- *
- ******************************************************************************************************/
-static int InitFailover (PADAPTER2220I padapter, POUR_DEVICE pdev)
-       {
-       UCHAR   spigot;
-       
-       DEB (printk ("\npci2220i:  Initialize failover process - survivor = %d", pdev->deviceID[padapter->survivor]));
-       pdev->raid = FALSE;                                                                     //initializes system for non raid mode
-       pdev->reconOn = FALSE;
-       spigot = pdev->spigots[padapter->survivor];     
-
-       if ( pdev->DiskMirror[padapter->survivor].status & UCBF_REBUILD )
-               {
-               DEB (printk ("\n         failed, is survivor"));
-               return (TRUE); 
-               }
-
-       if ( HardReset (padapter, pdev, spigot) )
-               {
-               DEB (printk ("\n         failed, reset"));
-               return TRUE;
-               }
-
-       Alarm (padapter, pdev->deviceID[padapter->survivor ^ 1]);
-       pdev->DiskMirror[padapter->survivor].status = UCBF_MIRRORED | UCBF_SURVIVOR;    //clear present status
-       
-       if ( WriteSignature (padapter, pdev, spigot, padapter->survivor) )
-               {
-               DEB (printk ("\n         failed, write signature"));
-               return TRUE;
-               }
-       padapter->failinprog = TRUE;
-       return FALSE;
-       }
-/****************************************************************
- *     Name:   TimerExpiry     :LOCAL
- *
- *     Description:    Timer expiry routine.
- *
- *     Parameters:             data - Pointer adapter data structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void TimerExpiry (unsigned long data)
-       {
-       PADAPTER2220I   padapter = (PADAPTER2220I)data;
-       struct Scsi_Host *host = padapter->SCpnt->device->host;
-       POUR_DEVICE             pdev = padapter->pdev;
-       UCHAR                   status = IDE_STATUS_BUSY;
-       UCHAR                   temp, temp1;
-    unsigned long              flags;
-
-    /*
-     * Disable interrupts, if they aren't already disabled and acquire
-     * the I/O spinlock.
-     */
-    spin_lock_irqsave (host->host_lock, flags);
-       DEB (printk ("\nPCI2220I: Timeout expired "));
-
-       if ( padapter->failinprog )
-               {
-               DEB (printk ("in failover process"));
-               OpDone (padapter, DecodeError (padapter, inb_p (padapter->regStatCmd)));
-               goto timerExpiryDone;
-               }
-       
-       while ( padapter->reconPhase )
-               {
-               DEB (printk ("in recon phase %X", padapter->reconPhase));
-               switch ( padapter->reconPhase )
-                       {
-                       case RECON_PHASE_MARKING:
-                       case RECON_PHASE_LAST:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 1 : 0;
-                               DEB (printk ("\npci2220i: FAILURE 1"));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-                       
-                       case RECON_PHASE_READY:
-                               OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-
-                       case RECON_PHASE_COPY:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 2"));
-                               DEB (printk ("\n       spig/stat = %X", inb_p (padapter->regStatSel));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-
-                       case RECON_PHASE_UPDATE:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 3")));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-
-                       case RECON_PHASE_END:
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 4"));
-                               if ( InitFailover (padapter, pdev) )
-                                       OpDone (padapter, DID_ERROR << 16);
-                               goto timerExpiryDone;
-                       
-                       default:
-                               goto timerExpiryDone;
-                       }
-               }
-       
-       while ( padapter->cmd )
-               {
-               outb_p (0x08, padapter->regDmaCmdStat);                                 // cancel interrupt from DMA engine
-               if ( pdev->raid )
-                       {
-                       if ( padapter->cmd == WRITE_CMD )
-                               {
-                               DEB (printk ("in RAID write operation"));
-                               temp = ( pdev->spigot & (SEL_1 | SEL_2) ) ? SEL_1 : SEL_3;
-                               if ( inb_p (padapter->regStatSel) & temp )
-                                       {
-                                       DEB (printk ("\npci2220i: Determined A OK"));
-                                       SelectSpigot (padapter, temp | SEL_IRQ_OFF); // Masking the interrupt during spigot select
-                                       temp = inb_p (padapter->regStatCmd);
-                                       }
-                               else
-                                       temp = IDE_STATUS_BUSY;
-
-                               temp1 = ( pdev->spigot & (SEL_1 | SEL_2) ) ? SEL_2 : SEL_4;
-                               if ( inb (padapter->regStatSel) & temp1 )
-                                       {
-                                       DEB (printk ("\npci2220i: Determined B OK"));
-                                       SelectSpigot (padapter, temp1 | SEL_IRQ_OFF); // Masking the interrupt during spigot select
-                                       temp1 = inb_p (padapter->regStatCmd);
-                                       }
-                               else
-                                       temp1 = IDE_STATUS_BUSY;
-                       
-                               if ( (temp & IDE_STATUS_BUSY) || (temp1 & IDE_STATUS_BUSY) )
-                                       {
-                                       DEB (printk ("\npci2220i: Status A: %X   B: %X", temp & 0xFF, temp1 & 0xFF));
-                                       if ( (temp & IDE_STATUS_BUSY) && (temp1 & IDE_STATUS_BUSY) ) 
-                                               {
-                                               status = temp;
-                                               break;
-                                               }               
-                                       else    
-                                               {
-                                               if ( temp & IDE_STATUS_BUSY )
-                                                       padapter->survivor = 1;
-                                               else
-                                                       padapter->survivor = 0;
-                                               if ( InitFailover (padapter, pdev) )
-                                                       {
-                                                       status = inb_p (padapter->regStatCmd);
-                                                       break;
-                                                       }
-                                               goto timerExpiryDone;
-                                               }
-                                       }
-                               }
-                       else
-                               {
-                               DEB (printk ("in RAID read operation"));
-                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                               DEB (printk ("\npci2220i: FAILURE 6"));
-                               if ( InitFailover (padapter, pdev) )
-                                       {
-                                       status = inb_p (padapter->regStatCmd);
-                                       break;
-                                       }
-                               goto timerExpiryDone;
-                               }
-                       }
-               else
-                       {
-                       DEB (printk ("in I/O operation"));
-                       status = inb_p (padapter->regStatCmd);
-                       }
-               break;
-               }
-       
-       OpDone (padapter, DecodeError (padapter, status));
-
-timerExpiryDone:;
-    /*
-     * Release the I/O spinlock and restore the original flags
-     * which will enable interrupts if and only if they were
-     * enabled on entry.
-     */
-    spin_unlock_irqrestore (host->host_lock, flags);
-       }
-/****************************************************************
- *     Name:                   SetReconstruct  :LOCAL
- *
- *     Description:    Set the reconstruct up.
- *
- *     Parameters:             pdev    - Pointer to device structure.
- *                                     index   - Mirror index number.
- *
- *     Returns:                Number of sectors on new disk required.
- *
- ****************************************************************/
-static LONG SetReconstruct (POUR_DEVICE pdev, int index)
-       {
-       pdev->DiskMirror[index].status = UCBF_MIRRORED;                                                 // setup the flags
-       pdev->DiskMirror[index ^ 1].status = UCBF_MIRRORED | UCBF_REBUILD;
-       pdev->DiskMirror[index ^ 1].reconstructPoint = 0;                                               // start the reconstruct
-       pdev->reconCount = 1990;                                                                                                // mark target drive early
-       return pdev->DiskMirror[index].reconstructPoint;
-       }
-/****************************************************************
- *     Name:   ReconTimerExpiry        :LOCAL
- *
- *     Description:    Reconstruct timer expiry routine.
- *
- *     Parameters:             data - Pointer adapter data structure.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static void ReconTimerExpiry (unsigned long data)
-       {
-       PADAPTER2220I   padapter = (PADAPTER2220I)data;
-       struct Scsi_Host *host = padapter->SCpnt->device->host;
-       POUR_DEVICE             pdev;
-       ULONG                   testsize = 0;
-       PIDENTIFY_DATA  pid;
-       USHORT                  minmode;
-       ULONG                   zl;
-       UCHAR                   zc;
-       USHORT                  z;
-    unsigned long      flags;
-
-    /*
-     * Disable interrupts, if they aren't already disabled and acquire
-     * the I/O spinlock.
-     */
-    spin_lock_irqsave(host->host_lock, flags);
-
-       if ( padapter->SCpnt )
-               goto reconTimerExpiry;
-
-       padapter->reconTimer.data = 0;
-       for ( z = padapter->devInReconIndex + 1;  z < BIGD_MAXDRIVES;  z++ )
-               {
-               if ( padapter->device[z].reconOn )
-                       break;
-               }
-       if ( z < BIGD_MAXDRIVES )
-               pdev = &padapter->device[z];
-       else
-               {
-               for ( z = 0;  z < BIGD_MAXDRIVES;  z++ )
-                       {
-                       if ( padapter->device[z].reconOn )
-                               break;
-                       }
-               if ( z < BIGD_MAXDRIVES )
-                       pdev = &padapter->device[z];
-               else
-                       {
-                       padapter->reconOn = FALSE;
-                       goto reconTimerExpiry;
-                       }
-               }
-
-       padapter->devInReconIndex = z;
-       pid = (PIDENTIFY_DATA)padapter->kBuffer;
-       padapter->pdev = pdev;
-       if ( pdev->reconIsStarting )
-               {
-               pdev->reconIsStarting = FALSE;
-               pdev->reconOn = FALSE;
-
-               while ( (pdev->DiskMirror[0].signature == SIGNATURE) && (pdev->DiskMirror[1].signature == SIGNATURE) &&
-                        (pdev->DiskMirror[0].pairIdentifier == (pdev->DiskMirror[1].pairIdentifier ^ 1)) )
-                       {
-                       if ( (pdev->DiskMirror[0].status & UCBF_MATCHED) && (pdev->DiskMirror[1].status & UCBF_MATCHED) )
-                               break;
-
-                       if ( pdev->DiskMirror[0].status & UCBF_SURVIVOR )                               // is first drive survivor?
-                               testsize = SetReconstruct (pdev, 0);
-                       else
-                               if ( pdev->DiskMirror[1].status & UCBF_SURVIVOR )                       // is second drive survivor?
-                                       testsize = SetReconstruct (pdev, 1);
-
-                       if ( (pdev->DiskMirror[0].status & UCBF_REBUILD) || (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                               {
-                               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                       pdev->mirrorRecon = 0;
-                               else
-                                       pdev->mirrorRecon = 1;
-                               pdev->reconOn = TRUE;
-                               }
-                       break;
-                       }
-
-               if ( !pdev->reconOn )
-                       goto reconTimerExpiry;
-
-               if ( padapter->bigD )
-                       {
-                       padapter->failRegister = 0;
-                       outb_p (~padapter->failRegister, padapter->regFail);
-                       }
-               else
-                       {
-                       zc = ((inb_p (padapter->regStatSel) >> 3) | inb_p (padapter->regStatSel)) & 0x83;               // mute the alarm
-                       outb_p (0xFF, padapter->regFail);
-                       }
-
-               while ( 1 )
-                       {
-                       DEB (printk ("\npci2220i: hard reset issue"));
-                       if ( HardReset (padapter, pdev, pdev->spigots[pdev->mirrorRecon]) )
-                               {
-                               DEB (printk ("\npci2220i: sub 1"));
-                               break;
-                               }
-
-                       pdev->lastsectorlba[pdev->mirrorRecon] = InlineIdentify (padapter, pdev->spigots[pdev->mirrorRecon], pdev->deviceID[pdev->mirrorRecon] & 1);
-
-                       if ( pdev->lastsectorlba[pdev->mirrorRecon] < testsize )
-                               {
-                               DEB (printk ("\npci2220i: sub 2 %ld %ld", pdev->lastsectorlba[pdev->mirrorRecon], testsize));
-                               break;
-                               }
-
-               // test LBA and multiper sector transfer compatibility
-                       if (!pid->SupportLBA || (pid->NumSectorsPerInt < SECTORSXFER) || !pid->Valid_64_70 )
-                               {
-                               DEB (printk ("\npci2220i: sub 3"));
-                               break;
-                               }
-
-               // test PIO/bus matering mode compatibility
-                       if ( (pid->MinPIOCycleWithoutFlow > 240) && !pid->SupportIORDYDisable && !padapter->timingPIO )
-                               {
-                               DEB (printk ("\npci2220i: sub 4"));
-                               break;
-                               }
-
-                       if ( pid->MinPIOCycleWithoutFlow <= 120 )       // setup timing mode of drive
-                               minmode = 5;
-                       else
-                               {
-                               if ( pid->MinPIOCylceWithFlow <= 150 )
-                                       minmode = 4;
-                               else
-                                       {
-                                       if ( pid->MinPIOCylceWithFlow <= 180 )
-                                               minmode = 3;
-                                       else
-                                               {
-                                               if ( pid->MinPIOCylceWithFlow <= 240 )
-                                                       minmode = 2;
-                                               else
-                                                       {
-                                                       DEB (printk ("\npci2220i: sub 5"));
-                                                       break;
-                                                       }
-                                               }
-                                       }
-                               }
-
-                       if ( padapter->timingMode > minmode )                                                                   // set minimum timing mode
-                               padapter->timingMode = minmode;
-                       if ( padapter->timingMode >= 2 )
-                               padapter->timingAddress = ModeArray[padapter->timingMode - 2];
-                       else
-                               padapter->timingPIO = TRUE;
-
-                       padapter->reconOn = TRUE;
-                       break;
-                       }
-
-               if ( !pdev->reconOn )
-                       {               
-                       padapter->survivor = pdev->mirrorRecon ^ 1;
-                       padapter->reconPhase = RECON_PHASE_FAILOVER;
-                       DEB (printk ("\npci2220i: FAILURE 7"));
-                       InitFailover (padapter, pdev);
-                       goto reconTimerExpiry;
-                       }
-
-               pdev->raid = TRUE;
-       
-               if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-                       goto reconTimerExpiry;
-               padapter->reconPhase = RECON_PHASE_MARKING;
-               goto reconTimerExpiry;
-               }
-
-       //**********************************
-       // reconstruct copy starts here 
-       //**********************************
-       if ( pdev->reconCount++ > 2000 )
-               {
-               pdev->reconCount = 0;
-               if ( WriteSignature (padapter, pdev, pdev->spigots[pdev->mirrorRecon], pdev->mirrorRecon) )
-                       {
-                       padapter->survivor = pdev->mirrorRecon ^ 1;
-                       padapter->reconPhase = RECON_PHASE_FAILOVER;
-                       DEB (printk ("\npci2220i: FAILURE 8"));
-                       InitFailover (padapter, pdev);
-                       goto reconTimerExpiry;
-                       }
-               padapter->reconPhase = RECON_PHASE_UPDATE;
-               goto reconTimerExpiry;
-               }
-
-       zl = pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint;      
-       padapter->reconSize = pdev->DiskMirror[pdev->mirrorRecon ^ 1].reconstructPoint - zl;
-       if ( padapter->reconSize > MAX_BUS_MASTER_BLOCKS )
-               padapter->reconSize = MAX_BUS_MASTER_BLOCKS;
-
-       if ( padapter->reconSize )
-               {
-               SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1]);   // select the spigots
-               outb_p (pdev->byte6 | ((UCHAR *)(&zl))[3], padapter->regLba24); // select the drive
-               SelectSpigot (padapter, pdev->spigot);
-               if ( WaitReady (padapter) )
-                       goto reconTimerExpiry;
-
-               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon]);
-               if ( WaitReady (padapter) )
-                       {
-                       padapter->survivor = pdev->mirrorRecon ^ 1;
-                       padapter->reconPhase = RECON_PHASE_FAILOVER;
-                       DEB (printk ("\npci2220i: FAILURE 9"));
-                       InitFailover (padapter, pdev);
-                       goto reconTimerExpiry;
-                       }
-       
-               SelectSpigot (padapter, pdev->spigots[0] | pdev->spigots[1]);
-               outb_p (padapter->reconSize & 0xFF, padapter->regSectCount);
-               outb_p (((UCHAR *)(&zl))[0], padapter->regLba0);
-               outb_p (((UCHAR *)(&zl))[1], padapter->regLba8);
-               outb_p (((UCHAR *)(&zl))[2], padapter->regLba16);
-               padapter->expectingIRQ = TRUE;
-               padapter->reconPhase = RECON_PHASE_READY;
-               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon]);
-               WriteCommand (padapter, WRITE_CMD);
-               StartTimer (padapter);
-               SelectSpigot (padapter, pdev->spigot);
-               WriteCommand (padapter, READ_CMD);
-               goto reconTimerExpiry;
-               }
-
-       pdev->DiskMirror[pdev->mirrorRecon].status = UCBF_MIRRORED | UCBF_MATCHED;
-       pdev->DiskMirror[pdev->mirrorRecon ^ 1].status = UCBF_MIRRORED | UCBF_MATCHED;
-       if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-               goto reconTimerExpiry;
-       padapter->reconPhase = RECON_PHASE_LAST;
-
-reconTimerExpiry:;
-    /*
-     * Release the I/O spinlock and restore the original flags
-     * which will enable interrupts if and only if they were
-     * enabled on entry.
-     */
-    spin_unlock_irqrestore(host->host_lock, flags);
-       }
-/****************************************************************
- *     Name:   Irq_Handler     :LOCAL
- *
- *     Description:    Interrupt handler.
- *
- *     Parameters:             irq             - Hardware IRQ number.
- *                                     dev_id  -
- *                                     regs    -
- *
- *     Returns:                TRUE if drive is not ready in time.
- *
- ****************************************************************/
-static irqreturn_t Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
-       {
-       struct Scsi_Host   *shost = NULL;       // Pointer to host data block
-       PADAPTER2220I           padapter;               // Pointer to adapter control structure
-       POUR_DEVICE                     pdev;
-       Scsi_Cmnd                  *SCpnt;
-       UCHAR                           status;
-       UCHAR                           status1;
-       ATAPI_STATUS            statusa;
-       ATAPI_REASON            reasona;
-       ATAPI_ERROR                     errora;
-       int                                     z;
-       ULONG                           zl;
-    unsigned long              flags;
-    int handled = 0;
-
-//     DEB (printk ("\npci2220i received interrupt\n"));
-
-       for ( z = 0; z < NumAdapters;  z++ )                                                            // scan for interrupt to process
-               {
-               if ( PsiHost[z]->irq == (UCHAR)(irq & 0xFF) )
-                       {
-                       if ( inw_p (HOSTDATA(PsiHost[z])->regIrqControl) & 0x8000 )
-                               {
-                               shost = PsiHost[z];
-                               break;
-                               }
-                       }
-               }
-
-       if ( !shost )
-               {
-               DEB (printk ("\npci2220i: not my interrupt"));
-               goto out;
-               }
-
-       handled = 1;
-       spin_lock_irqsave(shost->host_lock, flags);
-       padapter = HOSTDATA(shost);
-       pdev = padapter->pdev;
-       SCpnt = padapter->SCpnt;
-       outb_p (0x08, padapter->regDmaCmdStat);                                                                 // cancel interrupt from DMA engine
-
-       if ( padapter->atapi && SCpnt )
-               {
-               *(char *)&statusa = inb_p (padapter->regStatCmd);                                               // read the device status
-               *(char *)&reasona = inb_p (padapter->regSectCount);                                             // read the device interrupt reason
-       
-               if ( !statusa.bsy )
-                       {
-                       if ( statusa.drq )                                                                                                      // test for transfer phase
-                               {
-                               if ( !reasona.cod )                                                                                             // test for data phase
-                                       {
-                                       z = (ULONG)inb_p (padapter->regLba8) | (ULONG)(inb_p (padapter->regLba16) << 8);
-                                       if ( padapter->reqSense )
-                                               insw (padapter->regData, SCpnt->sense_buffer, z / 2);
-                                       else
-                                               AtapiBusMaster (padapter, reasona.io, z);
-                                       goto irq_return;
-                                       }
-                               if ( reasona.cod && !reasona.io )                                                               // test for command packet phase
-                                       {
-                                       if ( padapter->reqSense )
-                                               AtapiRequestSense (padapter, pdev, SCpnt, TRUE);
-                                       else
-                                               AtapiSendCdb (padapter, pdev, padapter->atapiCdb);
-                                       goto irq_return;
-                                       }
-                               }
-                       else
-                               {
-                               if ( reasona.io && statusa.drdy )                                                               // test for status phase
-                                       {
-                                       Atapi2Scsi (padapter, SCpnt);
-                                       if ( statusa.check )
-                                               {
-                                               *(UCHAR *)&errora = inb_p (padapter->regError);                 // read the device error
-                                               if ( errora.senseKey )
-                                                       {
-                                                       if ( padapter->reqSense || AtapiRequestSense (padapter, pdev, SCpnt, FALSE) )
-                                                               OpDone (padapter, DID_ERROR << 16);
-                                                       }
-                                               else
-                                                       {
-                                                       if ( errora.ili || errora.abort )
-                                                               OpDone (padapter, DID_ERROR << 16);
-                                                       else
-                                                               OpDone (padapter, DID_OK << 16);        
-                                                       }
-                                               }
-                                       else
-                                               if ( padapter->reqSense )
-                                                       {
-                                                       DEB (printk ("PCI2242I: Sense codes - %X %X %X ", ((UCHAR *)SCpnt->sense_buffer)[0], ((UCHAR *)SCpnt->sense_buffer)[12], ((UCHAR *)SCpnt->sense_buffer)[13]));
-                                                       OpDone (padapter, (DRIVER_SENSE << 24) | (DID_OK << 16) | 2);
-                                                       }
-                                               else
-                                                       OpDone (padapter, DID_OK << 16);        
-                                       }
-                               }
-                       }               
-               goto irq_return;
-               }
-       
-       if ( !padapter->expectingIRQ || !(SCpnt || padapter->reconPhase) )
-               {
-               DEB(printk ("\npci2220i Unsolicited interrupt\n"));
-               STOP_HERE ();
-               goto irq_return;
-               }
-       padapter->expectingIRQ = 0;
-
-       if ( padapter->failinprog )
-               {
-               DEB (printk ("\npci2220i interrupt failover complete"));
-               padapter->failinprog = FALSE;
-               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                       {
-                       DEB (printk ("\npci2220i: interrupt failover error from drive %X", status));
-                       padapter->cmd = 0;
-                       }
-               else
-                       {
-                       DEB (printk ("\npci2220i: restarting failed opertation."));
-                       pdev->spigot = (padapter->survivor) ? pdev->spigots[1] : pdev->spigots[0];
-                       del_timer (&padapter->timer);
-                       if ( padapter->reconPhase )
-                               OpDone (padapter, DID_OK << 16);
-                       else
-                               Pci2220i_QueueCommand (SCpnt, SCpnt->scsi_done);
-                       goto irq_return;                
-                       }
-               }
-
-       if ( padapter->reconPhase )
-               {
-               switch ( padapter->reconPhase )
-                       {
-                       case RECON_PHASE_MARKING:
-                       case RECON_PHASE_LAST:
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               del_timer (&padapter->timer);
-                               if ( padapter->reconPhase == RECON_PHASE_LAST )
-                                       {
-                                       if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                               {
-                                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 1 : 0;
-                                               DEB (printk ("\npci2220i: FAILURE 10"));
-                                               if ( InitFailover (padapter, pdev) )
-                                                       OpDone (padapter, DecodeError (padapter, status));
-                                               goto irq_return;
-                                               }
-                                       if ( WriteSignature (padapter, pdev, pdev->spigots[pdev->mirrorRecon], pdev->mirrorRecon) )
-                                               {
-                                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                               DEB (printk ("\npci2220i: FAILURE 11"));
-                                               if ( InitFailover (padapter, pdev) )
-                                                       OpDone (padapter, DecodeError (padapter, status));
-                                               goto irq_return;
-                                               }
-                                       padapter->reconPhase = RECON_PHASE_END; 
-                                       goto irq_return;
-                                       }
-                               OpDone (padapter, DID_OK << 16);
-                               goto irq_return;
-
-                       case RECON_PHASE_READY:
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       del_timer (&padapter->timer);
-                                       OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon]);
-                               if ( WaitDrq (padapter) )
-                                       {
-                                       del_timer (&padapter->timer);
-                                       padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                       DEB (printk ("\npci2220i: FAILURE 12"));
-                                       if ( InitFailover (padapter, pdev) )
-                                               OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               SelectSpigot (padapter, pdev->spigot | SEL_COPY | padapter->bigD);
-                               padapter->reconPhase = RECON_PHASE_COPY;
-                               padapter->expectingIRQ = TRUE;
-                               if ( padapter->timingPIO )
-                                       {
-                                       insw (padapter->regData, padapter->kBuffer, padapter->reconSize * (BYTES_PER_SECTOR / 2));
-                                       }
-                               else
-                                       {
-                                       if ( (padapter->timingMode > 3) )
-                                               {
-                                               if ( padapter->bigD )
-                                                       outl (BIGD_DATA_MODE3, padapter->regDmaAddrLoc);
-                                               else
-                                                       outl (DALE_DATA_MODE3, padapter->regDmaAddrLoc);
-                                               }
-                                       else
-                                               outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-                                       outl (padapter->kBufferDma, padapter->regDmaAddrPci);
-                                       outl (padapter->reconSize * BYTES_PER_SECTOR, padapter->regDmaCount);
-                                       outb_p (8, padapter->regDmaDesc);                                               // read operation
-                                       if ( padapter->bigD )
-                                               outb_p (8, padapter->regDmaMode);                                       // no interrupt
-                                       else
-                                               outb_p (1, padapter->regDmaMode);                                       // no interrupt
-                                       outb_p (0x03, padapter->regDmaCmdStat);                                 // kick the DMA engine in gear
-                                       }
-                               goto irq_return;
-
-                       case RECON_PHASE_COPY:
-                               pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint += padapter->reconSize;
-
-                       case RECON_PHASE_UPDATE:
-                               SelectSpigot (padapter, pdev->spigots[pdev->mirrorRecon] | SEL_IRQ_OFF);
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               del_timer (&padapter->timer);
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                       DEB (printk ("\npci2220i: FAILURE 13"));
-                                       DEB (printk ("\n  status register = %X   error = %X", status, inb_p (padapter->regError)));
-                                       if ( InitFailover (padapter, pdev) )
-                                               OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               OpDone (padapter, DID_OK << 16);
-                               goto irq_return;
-
-                       case RECON_PHASE_END:
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               del_timer (&padapter->timer);
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 0 : 1;
-                                       DEB (printk ("\npci2220i: FAILURE 14"));
-                                       if ( InitFailover (padapter, pdev) )
-                                               OpDone (padapter, DecodeError (padapter, status));
-                                       goto irq_return;
-                                       }
-                               pdev->reconOn = 0;
-                               if ( padapter->bigD )
-                                       {
-                                       for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                                               {
-                                               if ( padapter->device[z].DiskMirror[0].status & UCBF_SURVIVOR )
-                                                       {
-                                                       Alarm (padapter, padapter->device[z].deviceID[0] ^ 2);
-                                                       MuteAlarm (padapter);
-                                                       }
-                                               if ( padapter->device[z].DiskMirror[1].status & UCBF_SURVIVOR )
-                                                       {
-                                                       Alarm (padapter, padapter->device[z].deviceID[1] ^ 2);
-                                                       MuteAlarm (padapter);
-                                                       }
-                                               }
-                                       }
-                               OpDone (padapter, DID_OK << 16);
-                               goto irq_return;
-
-                       default:
-                               goto irq_return;
-                       }
-               }
-               
-       switch ( padapter->cmd )                                                                                                // decide how to handle the interrupt
-               {
-               case READ_CMD:
-                       if ( padapter->sectorCount )
-                               {
-                               status = inb_p (padapter->regStatCmd);                                          // read the device status
-                               if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {
-                                       if ( pdev->raid )
-                                               {
-                                               padapter->survivor = ( pdev->spigot == pdev->spigots[0] ) ? 1 : 0;
-                                               del_timer (&padapter->timer);
-                                               DEB (printk ("\npci2220i: FAILURE 15"));
-                                               if ( !InitFailover (padapter, pdev) )
-                                                       goto irq_return;
-                                               }
-                                       break;  
-                                       }
-                               if ( padapter->timingPIO )
-                                       {
-                                       insw (padapter->regData, padapter->kBuffer, padapter->readCount / 2);
-                                       padapter->sectorCount -= padapter->readCount / BYTES_PER_SECTOR;
-                                       WalkScatGath (padapter, TRUE, padapter->readCount);
-                                       if ( !padapter->sectorCount )
-                                               {
-                                               status = 0;
-                                               break;
-                                               }
-                                       }
-                               else
-                                       {
-                                       if ( padapter->readCount )
-                                               WalkScatGath (padapter, TRUE, padapter->readCount);
-                                       BusMaster (padapter, 1, 1);
-                                       }
-                               padapter->expectingIRQ = TRUE;
-                               goto irq_return;
-                               }
-                       if ( padapter->readCount && !padapter->timingPIO )
-                               WalkScatGath (padapter, TRUE, padapter->readCount);
-                       status = 0;
-                       break;
-
-               case WRITE_CMD:
-                       if ( pdev->raid )
-                               {
-                               SelectSpigot (padapter, pdev->spigots[0] | SEL_IRQ_OFF);                                
-                               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-                               SelectSpigot (padapter, pdev->spigots[1] | SEL_IRQ_OFF);                                
-                               status1 = inb_p (padapter->regStatCmd);                                                         // read the device status
-                               }
-                       else
-                               SelectSpigot (padapter, pdev->spigot | SEL_IRQ_OFF);                            
-                               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-                               status1 = 0;
-               
-                       if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                               {       
-                               if ( pdev->raid && !(status1 & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT)) )
-                                       {
-                                       padapter->survivor = 1;
-                                       del_timer (&padapter->timer);
-                                       SelectSpigot (padapter, pdev->spigot | SEL_IRQ_OFF);
-                                       DEB (printk ("\npci2220i: FAILURE 16  status = %X  error = %X", status, inb_p (padapter->regError)));
-                                       if ( !InitFailover (padapter, pdev) )
-                                               goto irq_return;
-                                       }
-                               break;
-                               }
-                       if ( pdev->raid )
-                               {
-                               if ( status1 & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
-                                       {       
-                                       padapter->survivor = 0;
-                                       del_timer (&padapter->timer);
-                                       DEB (printk ("\npci2220i: FAILURE 17  status = %X  error = %X", status1, inb_p (padapter->regError)));
-                                       if ( !InitFailover (padapter, pdev) )
-                                               goto irq_return;
-                                       status = status1;
-                                       break;
-                                       }
-                               if ( padapter->sectorCount )
-                                       {
-                                       status = WriteDataBoth (padapter, pdev);
-                                       if ( status )
-                                               {
-                                               padapter->survivor = status >> 1;
-                                               del_timer (&padapter->timer);
-                                               DEB (printk ("\npci2220i: FAILURE 18"));
-                                               if ( !InitFailover (padapter, pdev) )
-                                                       goto irq_return;
-                                               SelectSpigot (padapter, pdev->spigots[status] | SEL_IRQ_OFF);                           
-                                               status = inb_p (padapter->regStatCmd);                                                          // read the device status
-                                               break;
-                                               }
-                                       padapter->expectingIRQ = TRUE;
-                                       goto irq_return;
-                                       }
-                               status = 0;
-                               break;
-                               }
-                       if ( padapter->sectorCount )    
-                               {       
-                               SelectSpigot (padapter, pdev->spigot | padapter->bigD);
-                               status = WriteData (padapter);
-                               if ( status )
-                                       break;
-                               padapter->expectingIRQ = TRUE;
-                               goto irq_return;
-                               }
-                       status = 0;
-                       break;
-
-               case IDE_COMMAND_IDENTIFY:
-                       {
-                       PINQUIRYDATA    pinquiryData  = SCpnt->request_buffer;
-                       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)padapter->kBuffer;
-
-                       status = inb_p (padapter->regStatCmd);
-                       if ( status & IDE_STATUS_DRQ )
-                               {
-                               insw (padapter->regData, pid, sizeof (IDENTIFY_DATA) >> 1);
-
-                               memset (pinquiryData, 0, SCpnt->request_bufflen);               // Zero INQUIRY data structure.
-                               pinquiryData->DeviceType = 0;
-                               pinquiryData->Versions = 2;
-                               pinquiryData->AdditionalLength = 35 - 4;
-
-                               // Fill in vendor identification fields.
-                               for ( z = 0;  z < 20;  z += 2 )
-                                       {
-                                       pinquiryData->VendorId[z]         = ((UCHAR *)pid->ModelNumber)[z + 1];
-                                       pinquiryData->VendorId[z + 1] = ((UCHAR *)pid->ModelNumber)[z];
-                                       }
-
-                               // Initialize unused portion of product id.
-                               for ( z = 0;  z < 4;  z++ )
-                                       pinquiryData->ProductId[12 + z] = ' ';
-
-                               // Move firmware revision from IDENTIFY data to
-                               // product revision in INQUIRY data.
-                               for ( z = 0;  z < 4;  z += 2 )
-                                       {
-                                       pinquiryData->ProductRevisionLevel[z]    = ((UCHAR *)pid->FirmwareRevision)[z + 1];
-                                       pinquiryData->ProductRevisionLevel[z + 1] = ((UCHAR *)pid->FirmwareRevision)[z];
-                                       }
-                               if ( pdev == padapter->device )
-                                       *((USHORT *)(&pinquiryData->VendorSpecific)) = DEVICE_DALE_1;
-                               
-                               status = 0;
-                               }
-                       break;
-                       }
-
-               default:
-                       status = 0;
-                       break;
-               }
-
-       del_timer (&padapter->timer);
-       if ( status )
-               {
-               DEB (printk ("\npci2220i Interrupt handler return error"));
-               zl = DecodeError (padapter, status);
-               }
-       else
-               zl = DID_OK << 16;
-
-       OpDone (padapter, zl);
-irq_return:
-    spin_unlock_irqrestore(shost->host_lock, flags);
-out:
-       return IRQ_RETVAL(handled);
-}
-
-/****************************************************************
- *     Name:   Pci2220i_QueueCommand
- *
- *     Description:    Process a queued command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     done  - Pointer to done function to call.
- *
- *     Returns:                Status code.
- *
- ****************************************************************/
-int Pci2220i_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
-       {
-       UCHAR              *cdb = (UCHAR *)SCpnt->cmnd;                                 // Pointer to SCSI CDB
-       PADAPTER2220I   padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       POUR_DEVICE             pdev     = &padapter->device[SCpnt->device->id];// Pointer to device information
-       UCHAR                   rc;                                                                                     // command return code
-       int                             z; 
-       PDEVICE_RAID1   pdr;
-
-       SCpnt->scsi_done = done;
-       padapter->SCpnt = SCpnt;                                                                        // Save this command data
-       padapter->readCount = 0;
-
-       if ( SCpnt->use_sg )
-               {
-               padapter->currentSgBuffer = ((struct scatterlist *)SCpnt->request_buffer)[0].address;
-               padapter->currentSgCount = ((struct scatterlist *)SCpnt->request_buffer)[0].length;
-               }
-       else
-               {
-               padapter->currentSgBuffer = SCpnt->request_buffer;
-               padapter->currentSgCount = SCpnt->request_bufflen;
-               }
-       padapter->nextSg = 1;
-
-       if ( !done )
-               {
-               printk("pci2220i_queuecommand: %02X: done can't be NULL\n", *cdb);
-               return 0;
-               }
-       
-       if ( padapter->atapi )
-               {
-               UCHAR                   zlo, zhi;
-
-               DEB (printk ("\nPCI2242I: ID %d, LUN %d opcode %X ", SCpnt->device->id, SCpnt->device->lun, *cdb));
-               padapter->pdev = pdev;
-               if ( !pdev->byte6 || SCpnt->device->lun )
-                       {
-                       OpDone (padapter, DID_BAD_TARGET << 16);
-                       return 0;
-                       }
-       
-               padapter->atapiSpecial = FALSE;
-               padapter->reqSense = FALSE;
-               memset (padapter->atapiCdb, 0, 16);
-               SelectSpigot (padapter, pdev->spigot);                                                                  // select the spigot
-               AtapiDevice (padapter, pdev->byte6);                                                                    // select the drive
-               if ( AtapiWaitReady (padapter, 100) )
-                       {
-                       OpDone (padapter, DID_NO_CONNECT << 16);
-                       return 0;
-                       }
-
-               switch ( cdb[0] ) 
-                       {
-                       case SCSIOP_MODE_SENSE:
-                       case SCSIOP_MODE_SELECT:
-                               Scsi2Atapi (padapter, SCpnt);
-                               z = SCpnt->request_bufflen + 4;
-                               break;
-                       case SCSIOP_READ6:
-                       case SCSIOP_WRITE6:
-                               Scsi2Atapi (padapter, SCpnt);
-                               z = SCpnt->request_bufflen;
-                               break;
-                       default:
-                               memcpy (padapter->atapiCdb, cdb, SCpnt->cmd_len);
-                               z = SCpnt->request_bufflen;
-                               break;
-                       }
-               if ( z > ATAPI_TRANSFER )
-                       z = ATAPI_TRANSFER;
-           zlo = (UCHAR)(z & 0xFF);
-           zhi = (UCHAR)(z >> 8);
-
-               AtapiCountLo (padapter, zlo);                                           
-               AtapiCountHi (padapter, zhi);                                           
-               outb_p (0, padapter->regError);                                         
-               WriteCommand (padapter, IDE_COMMAND_ATAPI_PACKET);
-               if ( pdev->cmdDrqInt )
-                       return 0;
-
-               if ( AtapiWaitDrq (padapter, 500) )
-                       {
-                       OpDone (padapter, DID_ERROR << 16);
-                       return 0;
-                       }
-               AtapiSendCdb (padapter, pdev, padapter->atapiCdb);      
-               return 0;
-               }
-       
-       if ( padapter->reconPhase )
-               return 0;
-       if ( padapter->reconTimer.data )
-               {
-               del_timer (&padapter->reconTimer);
-               padapter->reconTimer.data = 0;
-               }
-               
-       if ( (SCpnt->device->id >= padapter->numberOfDrives) || SCpnt->device->lun )
-               {
-               OpDone (padapter, DID_BAD_TARGET << 16);
-               return 0;
-               }
-       
-       switch ( *cdb )
-               {
-               case SCSIOP_INQUIRY:                                    // inquiry CDB
-                       {
-                       if ( cdb[2] == SC_MY_RAID )
-                               {
-                               switch ( cdb[3] ) 
-                                       {
-                                       case MY_SCSI_REBUILD:
-                                               for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                                                       {
-                                                       pdev = &padapter->device[z];
-                                                       if ( ((pdev->DiskMirror[0].status & UCBF_SURVIVOR) && (pdev->DiskMirror[1].status & UCBF_MIRRORED)) ||
-                                                                ((pdev->DiskMirror[1].status & UCBF_SURVIVOR) && (pdev->DiskMirror[0].status & UCBF_MIRRORED)) )
-                                                               {
-                                                               padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                                                               }
-                                                       }
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       case MY_SCSI_ALARMMUTE:
-                                               MuteAlarm (padapter);
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       case MY_SCSI_DEMOFAIL:
-                                               padapter->demoFail = TRUE;                              
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       default:
-                                               z = cdb[5];                             // get index
-                                               pdr = (PDEVICE_RAID1)SCpnt->request_buffer;
-                                               if ( padapter->raidData[z] )
-                                                       {
-                                                       memcpy (&pdr->DiskRaid1, padapter->raidData[z], sizeof (DISK_MIRROR));
-                                                       if ( padapter->raidData[z]->reconstructPoint > padapter->raidData[z ^ 2]->reconstructPoint )
-                                                               pdr->TotalSectors = padapter->raidData[z]->reconstructPoint;
-                                                       else
-                                                               pdr->TotalSectors = padapter->raidData[z ^ 2]->reconstructPoint;
-                                                       }
-                                               else
-                                                       memset (pdr, 0, sizeof (DEVICE_RAID1));
-                                               OpDone (padapter, DID_OK << 16);
-                                               break;
-                                       }       
-                               return 0;
-                               }
-                       padapter->cmd = IDE_COMMAND_IDENTIFY;
-                       break;
-                       }
-
-               case SCSIOP_TEST_UNIT_READY:                    // test unit ready CDB
-                       OpDone (padapter, DID_OK << 16);
-                       return 0;
-               case SCSIOP_READ_CAPACITY:                              // read capctiy CDB
-                       {
-                       PREAD_CAPACITY_DATA     pdata = (PREAD_CAPACITY_DATA)SCpnt->request_buffer;
-
-                       pdata->blksiz = 0x20000;
-                       XANY2SCSI ((UCHAR *)&pdata->blks, pdev->blocks);
-                       OpDone (padapter, DID_OK << 16);
-                       return 0;
-                       }
-               case SCSIOP_VERIFY:                                             // verify CDB
-                       padapter->startSector = XSCSI2LONG (&cdb[2]);
-                       padapter->sectorCount = (UCHAR)((USHORT)cdb[8] | ((USHORT)cdb[7] << 8));
-                       padapter->cmd = IDE_COMMAND_VERIFY;
-                       break;
-               case SCSIOP_READ:                                               // read10 CDB
-                       padapter->startSector = XSCSI2LONG (&cdb[2]);
-                       padapter->sectorCount = (USHORT)cdb[8] | ((USHORT)cdb[7] << 8);
-                       padapter->cmd = READ_CMD;
-                       break;
-               case SCSIOP_READ6:                                              // read6  CDB
-                       padapter->startSector = SCSI2LONG (&cdb[1]);
-                       padapter->sectorCount = cdb[4];
-                       padapter->cmd = READ_CMD;
-                       break;
-               case SCSIOP_WRITE:                                              // write10 CDB
-                       padapter->startSector = XSCSI2LONG (&cdb[2]);
-                       padapter->sectorCount = (USHORT)cdb[8] | ((USHORT)cdb[7] << 8);
-                       padapter->cmd = WRITE_CMD;
-                       break;
-               case SCSIOP_WRITE6:                                             // write6  CDB
-                       padapter->startSector = SCSI2LONG (&cdb[1]);
-                       padapter->sectorCount = cdb[4];
-                       padapter->cmd = WRITE_CMD;
-                       break;
-               default:
-                       DEB (printk ("pci2220i_queuecommand: Unsupported command %02X\n", *cdb));
-                       OpDone (padapter, DID_ERROR << 16);
-                       return 0;
-               }
-
-       if ( padapter->reconPhase )
-               return 0;
-       
-       padapter->pdev = pdev;
-
-       while ( padapter->demoFail )
-               {
-               pdev = padapter->pdev = &padapter->device[0];
-               padapter->demoFail = FALSE;
-               if ( !pdev->raid || 
-                        (pdev->DiskMirror[0].status & UCBF_SURVIVOR) || 
-                        (pdev->DiskMirror[1].status & UCBF_SURVIVOR) )
-                       {
-                       break;
-                       }
-               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                       padapter->survivor = 1;
-               else
-                       padapter->survivor = 0;
-                               DEB (printk ("\npci2220i: FAILURE 19"));
-               if ( InitFailover (padapter, pdev) )
-                       break;
-               return 0;
-               }
-
-       StartTimer (padapter);
-       if ( pdev->raid && (padapter->cmd == WRITE_CMD) )
-               {
-               rc = IdeCmdBoth (padapter, pdev);
-               if ( !rc )
-                       rc = WriteDataBoth (padapter, pdev);
-               if ( rc )
-                       {
-                       del_timer (&padapter->timer);
-                       padapter->expectingIRQ = 0;
-                       padapter->survivor = rc >> 1;
-                               DEB (printk ("\npci2220i: FAILURE 20"));
-                       if ( InitFailover (padapter, pdev) )
-                               {
-                               OpDone (padapter, DID_ERROR << 16);
-                               return 0;
-                               }
-                       }
-               }
-       else
-               {
-               rc = IdeCmd (padapter, pdev);
-               if ( (padapter->cmd == WRITE_CMD) && !rc )
-                       rc = WriteData (padapter);
-               if ( rc )
-                       {
-                       del_timer (&padapter->timer);
-                       padapter->expectingIRQ = 0;
-                       if ( pdev->raid )
-                               {
-                               padapter->survivor = (pdev->spigot ^ 3) >> 1;
-                               DEB (printk ("\npci2220i: FAILURE 21"));
-                               if ( !InitFailover (padapter, pdev) )
-                                       return 0;
-                               }
-                       OpDone (padapter, DID_ERROR << 16);
-                       return 0;
-                       }
-               }
-       return 0;
-       }
-/****************************************************************
- *     Name:                   ReadFlash
- *
- *     Description:    Read information from controller Flash memory.
- *
- *     Parameters:             padapter - Pointer to host interface data structure.
- *                                     pdata    - Pointer to data structures.
- *                                     base     - base address in Flash.
- *                                     length   - lenght of data space in bytes.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-static VOID ReadFlash (PADAPTER2220I padapter, VOID *pdata, ULONG base, ULONG length)
-       {
-       ULONG    oldremap;
-       UCHAR    olddesc;
-       ULONG    z;
-       UCHAR   *pd = (UCHAR *)pdata;
-
-       oldremap = inl (padapter->regRemap);                                                    // save values to restore later
-       olddesc  = inb_p (padapter->regDesc);
-
-       outl (base | 1, padapter->regRemap);                                                    // remap to Flash space as specified
-       outb_p (0x40, padapter->regDesc);                                                               // describe remap region as 8 bit
-       for ( z = 0;  z < length;  z++)                                                                 // get "length" data count
-               *pd++ = inb_p (padapter->regBase + z);                                          // read in the data
-
-       outl (oldremap, padapter->regRemap);                                                    // restore remap register values
-       outb_p (olddesc, padapter->regDesc);
-       }
-/****************************************************************
- *     Name:                   GetRegs
- *
- *     Description:    Initialize the regester information.
- *
- *     Parameters:             pshost            - Pointer to SCSI host data structure.
- *                                     bigd              - PCI-2240I identifier
- *                                     pcidev            - Pointer to device data structure.
- *
- *     Returns:                TRUE if failure to install.
- *
- ****************************************************************/
-static USHORT GetRegs (struct Scsi_Host *pshost, BOOL bigd, struct pci_dev *pcidev)
-       {
-       PADAPTER2220I   padapter;
-       int                             setirq;
-       int                             z;
-       USHORT                  zr, zl;
-       UCHAR              *consistent;
-       dma_addr_t              consistentDma;
-
-       padapter = HOSTDATA(pshost);
-       memset (padapter, 0, sizeof (ADAPTER2220I));
-       memset (&DaleSetup, 0, sizeof (DaleSetup));
-       memset (DiskMirror, 0, sizeof (DiskMirror));
-
-       zr = pci_resource_start (pcidev, 1);
-       zl = pci_resource_start (pcidev, 2);
-
-       padapter->basePort = zr;
-       padapter->regRemap              = zr + RTR_LOCAL_REMAP;                                 // 32 bit local space remap
-       padapter->regDesc               = zr + RTR_REGIONS;                                             // 32 bit local region descriptor
-       padapter->regRange              = zr + RTR_LOCAL_RANGE;                                 // 32 bit local range
-       padapter->regIrqControl = zr + RTR_INT_CONTROL_STATUS;                  // 16 bit interrupt control and status
-       padapter->regScratchPad = zr + RTR_MAILBOX;                                             // 16 byte scratchpad I/O base address
-
-       padapter->regBase               = zl;
-       padapter->regData               = zl + REG_DATA;                                                // data register I/O address
-       padapter->regError              = zl + REG_ERROR;                                               // error register I/O address
-       padapter->regSectCount  = zl + REG_SECTOR_COUNT;                                // sector count register I/O address
-       padapter->regLba0               = zl + REG_LBA_0;                                               // least significant byte of LBA
-       padapter->regLba8               = zl + REG_LBA_8;                                               // next least significant byte of LBA
-       padapter->regLba16              = zl + REG_LBA_16;                                              // next most significan byte of LBA
-       padapter->regLba24              = zl + REG_LBA_24;                                              // head and most 4 significant bits of LBA
-       padapter->regStatCmd    = zl + REG_STAT_CMD;                                    // status on read and command on write register
-       padapter->regStatSel    = zl + REG_STAT_SEL;                                    // board status on read and spigot select on write register
-       padapter->regFail               = zl + REG_FAIL;
-       padapter->regAltStat    = zl + REG_ALT_STAT;
-       padapter->pcidev                = pcidev;
-
-       if ( bigd )
-               {
-               padapter->regDmaDesc    = zr + RTR_DMA0_DESC_PTR;                       // address of the DMA discriptor register for direction of transfer
-               padapter->regDmaCmdStat = zr + RTR_DMA_COMMAND_STATUS;          // Byte #0 of DMA command status register
-               padapter->regDmaAddrPci = zr + RTR_DMA0_PCI_ADDR;                       // 32 bit register for PCI address of DMA
-               padapter->regDmaAddrLoc = zr + RTR_DMA0_LOCAL_ADDR;                     // 32 bit register for local bus address of DMA
-               padapter->regDmaCount   = zr + RTR_DMA0_COUNT;                          // 32 bit register for DMA transfer count
-               padapter->regDmaMode    = zr + RTR_DMA0_MODE + 1;                       // 32 bit register for DMA mode control
-               padapter->bigD                  = SEL_NEW_SPEED_1;                                      // set spigot speed control bit
-               }
-       else
-               {
-               padapter->regDmaDesc    = zl + RTL_DMA1_DESC_PTR;                       // address of the DMA discriptor register for direction of transfer
-               padapter->regDmaCmdStat = zl + RTL_DMA_COMMAND_STATUS + 1;      // Byte #1 of DMA command status register
-               padapter->regDmaAddrPci = zl + RTL_DMA1_PCI_ADDR;                       // 32 bit register for PCI address of DMA
-               padapter->regDmaAddrLoc = zl + RTL_DMA1_LOCAL_ADDR;                     // 32 bit register for local bus address of DMA
-               padapter->regDmaCount   = zl + RTL_DMA1_COUNT;                          // 32 bit register for DMA transfer count
-               padapter->regDmaMode    = zl + RTL_DMA1_MODE + 1;                       // 32 bit register for DMA mode control
-               }
-
-       padapter->numberOfDrives = inb_p (padapter->regScratchPad + BIGD_NUM_DRIVES);
-       if ( !bigd && !padapter->numberOfDrives )                                               // if no devices on this board
-               return TRUE;
-
-       pshost->irq = pcidev->irq;
-       setirq = 1;
-       for ( z = 0;  z < Installed;  z++ )                                                             // scan for shared interrupts
-               {
-               if ( PsiHost[z]->irq == pshost->irq )                                           // if shared then, don't posses
-                       setirq = 0;
-               }
-       if ( setirq )                                                                                                   // if not shared, posses
-               {
-               if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2220i", padapter) < 0 )
-                       {
-                       if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2220i", padapter) < 0 )
-                               {
-                               printk ("Unable to allocate IRQ for PCI-2220I controller.\n");
-                               return TRUE;
-                               }
-                       }
-               padapter->irqOwned = pshost->irq;                                                       // set IRQ as owned
-               }
-
-       if ( padapter->numberOfDrives )
-               consistent = pci_alloc_consistent (pcidev, SECTORSXFER * BYTES_PER_SECTOR, &consistentDma);
-       else
-               consistent = pci_alloc_consistent (pcidev, ATAPI_TRANSFER, &consistentDma);
-       if ( !consistent )
-               {
-               printk ("Unable to allocate DMA buffer for PCI-2220I controller.\n");
-               free_irq (pshost->irq, padapter);
-               return TRUE;
-               }
-       padapter->kBuffer = consistent;
-       padapter->kBufferDma = consistentDma;
-
-       PsiHost[Installed]      = pshost;                                                                       // save SCSI_HOST pointer
-       pshost->io_port         = padapter->basePort;
-       pshost->n_io_port       = 0xFF;
-       pshost->unique_id       = padapter->regBase;
-
-       outb_p (0x01, padapter->regRange);                                                              // fix our range register because other drivers want to tromp on it
-
-       padapter->timingMode = inb_p (padapter->regScratchPad + DALE_TIMING_MODE);
-       if ( padapter->timingMode >= 2 )
-               {
-               if ( bigd )
-                       padapter->timingAddress = ModeArray2[padapter->timingMode - 2];
-               else
-                       padapter->timingAddress = ModeArray[padapter->timingMode - 2];
-               }
-       else
-               padapter->timingPIO = TRUE;
-
-       ReadFlash (padapter, &DaleSetup, DALE_FLASH_SETUP, sizeof (SETUP));
-       ReadFlash (padapter, &DiskMirror, DALE_FLASH_RAID, sizeof (DiskMirror));
-
-       return FALSE;
-       }
-/****************************************************************
- *     Name:                   SetupFinish
- *
- *     Description:    Complete the driver initialization process for a card
- *
- *     Parameters:             padapter  - Pointer to SCSI host data structure.
- *                                     str               - Pointer to board type string.
- *
- *     Returns:                Nothing.
- *
- ****************************************************************/
-VOID SetupFinish (PADAPTER2220I padapter, char *str, int irq)
-       {
-       init_timer (&padapter->timer);
-       padapter->timer.function = TimerExpiry;
-       padapter->timer.data = (unsigned long)padapter;
-       init_timer (&padapter->reconTimer);
-       padapter->reconTimer.function = ReconTimerExpiry;
-       padapter->reconTimer.data = (unsigned long)padapter;
-       printk("\nPCI-%sI EIDE CONTROLLER: at I/O = %lX/%lX  IRQ = %d\n", str, padapter->basePort, padapter->regBase, irq);
-       printk("Version %s, Compiled %s %s\n\n", PCI2220I_VERSION, __DATE__, __TIME__);
-       }       
-/****************************************************************
- *     Name:   Pci2220i_Detect
- *
- *     Description:    Detect and initialize our boards.
- *
- *     Parameters:             tpnt - Pointer to SCSI host template structure.
- *
- *     Returns:                Number of adapters installed.
- *
- ****************************************************************/
-int Pci2220i_Detect (Scsi_Host_Template *tpnt)
-       {
-       struct Scsi_Host   *pshost;
-       PADAPTER2220I       padapter;
-       POUR_DEVICE                     pdev;
-       int                                     unit;
-       int                                     z;
-       USHORT                          raidon;
-       UCHAR                           spigot1, spigot2;
-       UCHAR                           device;
-       struct pci_dev     *pcidev = NULL;
-
-       while ( (pcidev = pci_find_device (VENDOR_PSI, DEVICE_DALE_1, pcidev)) != NULL )
-               {
-               if (pci_enable_device(pcidev))
-                       continue;
-               pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
-               if(pshost==NULL)
-                       continue;
-                       
-               padapter = HOSTDATA(pshost);
-
-               if ( GetRegs (pshost, FALSE, pcidev) )
-                       goto unregister;
-
-               scsi_set_device(pshost, &pcidev->dev);
-               pshost->max_id = padapter->numberOfDrives;
-               for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                       {
-                       unit = inb_p (padapter->regScratchPad + DALE_CHANNEL_DEVICE_0 + z) & 0x0F;
-                       pdev = &padapter->device[z];
-                       pdev->byte6             = (UCHAR)(((unit & 1) << 4) | 0xE0);
-                       pdev->spigot    = (UCHAR)(1 << (unit >> 1));
-                       pdev->sectors   = DaleSetup.setupDevice[unit].sectors;
-                       pdev->heads             = DaleSetup.setupDevice[unit].heads;
-                       pdev->cylinders = DaleSetup.setupDevice[unit].cylinders;
-                       pdev->blocks    = DaleSetup.setupDevice[unit].blocks;
-
-                       if ( !z )
-                               {
-                               DiskMirror[0].status = inb_p (padapter->regScratchPad + DALE_RAID_0_STATUS);            
-                               DiskMirror[1].status = inb_p (padapter->regScratchPad + DALE_RAID_1_STATUS);            
-                               if ( (DiskMirror[0].signature == SIGNATURE) && (DiskMirror[1].signature == SIGNATURE) &&
-                                    (DiskMirror[0].pairIdentifier == (DiskMirror[1].pairIdentifier ^ 1)) )
-                                       {                        
-                                       raidon = TRUE;
-                                       if ( unit > (unit ^ 2) )
-                                               unit = unit ^ 2;
-                                       }       
-                               else
-                                       raidon = FALSE;
-
-                               memcpy (pdev->DiskMirror, DiskMirror, sizeof (DiskMirror));
-                               padapter->raidData[0] = &pdev->DiskMirror[0];
-                               padapter->raidData[2] = &pdev->DiskMirror[1];
-                               
-                               spigot1 = spigot2 = FALSE;
-                               pdev->spigots[0] = 1;
-                               pdev->spigots[1] = 2;
-                               pdev->lastsectorlba[0] = InlineIdentify (padapter, 1, 0);
-                               pdev->lastsectorlba[1] = InlineIdentify (padapter, 2, 0);
-                                               
-                               if ( !(pdev->DiskMirror[1].status & UCBF_SURVIVOR) && pdev->lastsectorlba[0] )
-                                       spigot1 = TRUE;
-                               if ( !(pdev->DiskMirror[0].status & UCBF_SURVIVOR) && pdev->lastsectorlba[1] )
-                                       spigot2 = TRUE;
-                               if ( pdev->DiskMirror[0].status & DiskMirror[1].status & UCBF_SURVIVOR )
-                                       spigot1 = TRUE;
-
-                               if ( spigot1 && (pdev->DiskMirror[0].status & UCBF_REBUILD) )
-                                       InlineReadSignature (padapter, pdev, 0);
-                               if ( spigot2 && (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                                       InlineReadSignature (padapter, pdev, 1);
-
-                               if ( spigot1 && spigot2 && raidon )
-                                       {
-                                       pdev->raid = 1;
-                                       if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                               pdev->spigot = 2;
-                                       else
-                                               pdev->spigot = 1;
-                                       if ( (pdev->DiskMirror[0].status & UCBF_REBUILD) || (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                                               padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                                       }
-                               else
-                                       {
-                                       if ( spigot1 )
-                                               {
-                                               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                                       goto unregister;
-                                               pdev->DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                               pdev->spigot = 1;
-                                               }
-                                       else
-                                               {
-                                               if ( pdev->DiskMirror[1].status & UCBF_REBUILD )
-                                                       goto unregister;
-                                               pdev->DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                               pdev->spigot = 2;
-                                               }
-                                       if ( DaleSetup.rebootRebuild && raidon )
-                                               padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                                       }
-                       
-                               if ( raidon )
-                                       break;
-                               }
-                       }
-
-               SetupFinish (padapter, "2220", pshost->irq);
-       
-               if ( ++Installed < MAXADAPTER )
-                       continue;
-               break;
-unregister:;
-               scsi_unregister (pshost);
-               }
-
-       while ( (pcidev = pci_find_device (VENDOR_PSI, DEVICE_BIGD_1, pcidev)) != NULL )
-               {
-               pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
-               padapter = HOSTDATA(pshost);
-
-               if ( GetRegs (pshost, TRUE, pcidev) )
-                       goto unregister1;
-
-               for ( z = 0;  z < BIGD_MAXDRIVES;  z++ )
-                       DiskMirror[z].status = inb_p (padapter->regScratchPad + BIGD_RAID_0_STATUS + z);                
-
-               scsi_set_pci_device(pshost, pcidev);
-               pshost->max_id = padapter->numberOfDrives;
-               padapter->failRegister = inb_p (padapter->regScratchPad + BIGD_ALARM_IMAGE);
-               for ( z = 0;  z < padapter->numberOfDrives;  z++ )
-                       {
-                       unit = inb_p (padapter->regScratchPad + BIGD_DEVICE_0 + z);
-                       pdev = &padapter->device[z];
-                       pdev->byte6             = (UCHAR)(((unit & 1) << 4) | 0xE0);
-                       pdev->spigot    = (UCHAR)(1 << (unit >> 1));
-                       pdev->sectors   = DaleSetup.setupDevice[unit].sectors;
-                       pdev->heads             = DaleSetup.setupDevice[unit].heads;
-                       pdev->cylinders = DaleSetup.setupDevice[unit].cylinders;
-                       pdev->blocks    = DaleSetup.setupDevice[unit].blocks;
-                       
-                       if ( (DiskMirror[unit].signature == SIGNATURE) && (DiskMirror[unit ^ 2].signature == SIGNATURE) &&
-                            (DiskMirror[unit].pairIdentifier == (DiskMirror[unit ^ 2].pairIdentifier ^ 1)) )
-                               {                        
-                               raidon = TRUE;
-                               if ( unit > (unit ^ 2) )
-                                       unit = unit ^ 2;
-                               }       
-                       else
-                               raidon = FALSE;
-                               
-                       spigot1 = spigot2 = FALSE;
-                       memcpy (&pdev->DiskMirror[0], &DiskMirror[unit], sizeof (DISK_MIRROR));
-                       memcpy (&pdev->DiskMirror[1], &DiskMirror[unit ^ 2], sizeof (DISK_MIRROR));
-                       padapter->raidData[unit]         = &pdev->DiskMirror[0];
-                       padapter->raidData[unit ^ 2] = &pdev->DiskMirror[1];
-                       pdev->spigots[0] = 1 << (unit >> 1);
-                       pdev->spigots[1] = 1 << ((unit ^ 2) >> 1);
-                       pdev->deviceID[0] = unit;
-                       pdev->deviceID[1] = unit ^ 2;
-                       pdev->lastsectorlba[0] = InlineIdentify (padapter, pdev->spigots[0], unit & 1);
-                       pdev->lastsectorlba[1] = InlineIdentify (padapter, pdev->spigots[1], unit & 1);
-
-                       if ( !(pdev->DiskMirror[1].status & UCBF_SURVIVOR) && pdev->lastsectorlba[0] )
-                               spigot1 = TRUE;
-                       if ( !(pdev->DiskMirror[0].status & UCBF_SURVIVOR) && pdev->lastsectorlba[1] )
-                               spigot2 = TRUE;
-                       if ( pdev->DiskMirror[0].status & pdev->DiskMirror[1].status & UCBF_SURVIVOR )
-                               spigot1 = TRUE;
-
-                       if ( spigot1 && (pdev->DiskMirror[0].status & UCBF_REBUILD) )
-                               InlineReadSignature (padapter, pdev, 0);
-                       if ( spigot2 && (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                               InlineReadSignature (padapter, pdev, 1);
-
-                       if ( spigot1 && spigot2 && raidon )
-                               {
-                               pdev->raid = 1;
-                               if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                       pdev->spigot = pdev->spigots[1];
-                               else
-                                       pdev->spigot = pdev->spigots[0];
-                               if ( (pdev->DiskMirror[0].status & UCBF_REBUILD) || (pdev->DiskMirror[1].status & UCBF_REBUILD) )
-                                       padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                               }
-                       else
-                               {
-                               if ( spigot1 )
-                                       {
-                                       if ( pdev->DiskMirror[0].status & UCBF_REBUILD )
-                                               goto unregister1;
-                                       pdev->DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                       pdev->spigot = pdev->spigots[0];
-                                       }
-                               else
-                                       {
-                                       if ( pdev->DiskMirror[1].status & UCBF_REBUILD )
-                                               goto unregister;
-                                       pdev->DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                       pdev->spigot = pdev->spigots[1];
-                                       }
-                               if ( DaleSetup.rebootRebuild && raidon )
-                                       padapter->reconOn = pdev->reconOn = pdev->reconIsStarting = TRUE;
-                               }
-                       }
-               
-               if ( !padapter->numberOfDrives )                                                                        // If no ATA devices then scan ATAPI
-                       {
-                       unit = 0;
-                       for ( spigot1 = 0;  spigot1 < 4;  spigot1++ )
-                               {
-                               for ( device = 0;  device < 2;  device++ )
-                                       {
-                                       DEB (printk ("\nPCI2242I: scanning for ID %d ", (spigot1 * 2) + device));
-                                       pdev = &(padapter->device[(spigot1 * 2) + device]);
-                                       pdev->byte6 = 0x0A | (device << 4);
-                                       pdev->spigot = 1 << spigot1;
-                                       if ( !AtapiReset (padapter, pdev) )
-                                               {
-                                               DEB (printk (" Device found "));
-                                               if ( !AtapiIdentify (padapter, pdev) )
-                                                       {
-                                                       DEB (printk (" Device verified"));
-                                                       unit++;
-                                                       continue;
-                                                       }
-                                               }
-                                       pdev->spigot = pdev->byte6 = 0;
-                                       }
-                               }
-
-                       if ( unit )
-                               {
-                               padapter->atapi = TRUE;
-                               padapter->timingAddress = DALE_DATA_MODE3;
-                               outw_p (0x0900, padapter->regIrqControl);                                       // Turn our interrupts on
-                               outw_p (0x0C41, padapter->regDmaMode - 1);                                      // setup for 16 bits, ready enabled, done IRQ enabled, no incriment
-                               outb_p (0xFF, padapter->regFail);                                                       // all fail lights and alarm off
-                               pshost->max_id = 8;
-                               }
-                       }
-               SetupFinish (padapter, "2240", pshost->irq);
-               
-               if ( ++Installed < MAXADAPTER )
-                       continue;
-               break;
-unregister1:;
-               scsi_unregister (pshost);
-               }
-
-       NumAdapters = Installed;
-       return Installed;
-       }
-/****************************************************************
- *     Name:   Pci2220i_Abort
- *
- *     Description:    Process the Abort command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *
- *     Returns:                Allways snooze.
- *
- ****************************************************************/
-int Pci2220i_Abort (Scsi_Cmnd *SCpnt)
-       {
-       PADAPTER2220I   padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       POUR_DEVICE             pdev     = &padapter->device[SCpnt->device->id];// Pointer to device information
-
-       if ( !padapter->SCpnt )
-               return SCSI_ABORT_NOT_RUNNING;
-       
-       if ( padapter->atapi )
-               {
-               if ( AtapiReset (padapter, pdev) )
-                       return SCSI_ABORT_ERROR;
-               OpDone (padapter, DID_ABORT << 16);
-               return SCSI_ABORT_SUCCESS;
-               }
-       return SCSI_ABORT_SNOOZE;
-       }
-/****************************************************************
- *     Name:   Pci2220i_Reset
- *
- *     Description:    Process the Reset command from the SCSI manager.
- *
- *     Parameters:             SCpnt - Pointer to SCSI command structure.
- *                                     flags - Flags about the reset command
- *
- *     Returns:                No active command at this time, so this means
- *                                     that each time we got some kind of response the
- *                                     last time through.  Tell the mid-level code to
- *                                     request sense information in order to decide what
- *                                     to do next.
- *
- ****************************************************************/
-int Pci2220i_Reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags)
-       {
-       PADAPTER2220I   padapter = HOSTDATA(SCpnt->device->host);                       // Pointer to adapter control structure
-       POUR_DEVICE             pdev     = &padapter->device[SCpnt->device->id];// Pointer to device information
-
-       if ( padapter->atapi )
-               {
-               if ( AtapiReset (padapter, pdev) )
-                       return SCSI_RESET_ERROR;
-               return SCSI_RESET_SUCCESS;
-               }
-       return SCSI_RESET_PUNT;
-       }
-/****************************************************************
- *     Name:   Pci2220i_Release
- *
- *     Description:    Release resources allocated for a single each adapter.
- *
- *     Parameters:             pshost - Pointer to SCSI command structure.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2220i_Release (struct Scsi_Host *pshost)
-       {
-    PADAPTER2220I      padapter = HOSTDATA (pshost);
-       USHORT                  z;
-
-       if ( padapter->reconOn )
-               {
-               padapter->reconOn = FALSE;                                              // shut down the hot reconstruct
-               if ( padapter->reconPhase )
-                       mdelay (300);
-               if ( padapter->reconTimer.data )                                // is the timer running?
-                       {
-                       del_timer (&padapter->reconTimer);
-                       padapter->reconTimer.data = 0;
-                       }
-               }
-
-       // save RAID status on the board
-       if ( padapter->bigD )
-               {
-               outb_p (padapter->failRegister, padapter->regScratchPad + BIGD_ALARM_IMAGE);
-               for ( z = 0;  z < BIGD_MAXDRIVES;  z++ )
-                       {
-                       if ( padapter->raidData )
-                               outb_p (padapter->raidData[z]->status, padapter->regScratchPad + BIGD_RAID_0_STATUS + z);       
-                       else
-                               outb_p (0, padapter->regScratchPad + BIGD_RAID_0_STATUS);       
-                       }
-               }
-       else
-               {
-               outb_p (padapter->device[0].DiskMirror[0].status, padapter->regScratchPad + DALE_RAID_0_STATUS);                
-               outb_p (padapter->device[0].DiskMirror[1].status, padapter->regScratchPad + DALE_RAID_1_STATUS);                
-               }
-
-       if ( padapter->irqOwned )
-               free_irq (pshost->irq, padapter);
-    release_region (pshost->io_port, pshost->n_io_port);
-       if ( padapter->numberOfDrives )
-               pci_free_consistent (padapter->pcidev, SECTORSXFER * BYTES_PER_SECTOR, padapter->kBuffer, padapter->kBufferDma);
-       else    
-               pci_free_consistent (padapter->pcidev, ATAPI_TRANSFER, padapter->kBuffer, padapter->kBufferDma);
-    scsi_unregister(pshost);
-    return 0;
-       }
-
-/****************************************************************
- *     Name:   Pci2220i_BiosParam
- *
- *     Description:    Process the biosparam request from the SCSI manager to
- *                                     return C/H/S data.
- *
- *     Parameters:             disk - Pointer to SCSI disk structure.
- *                                     dev      - Major/minor number from kernel.
- *                                     geom - Pointer to integer array to place geometry data.
- *
- *     Returns:                zero.
- *
- ****************************************************************/
-int Pci2220i_BiosParam (struct scsi_device *sdev, struct block_device *dev,
-               sector_t capacity, int geom[])
-       {
-       POUR_DEVICE     pdev;
-
-       if ( !(HOSTDATA(sdev->host))->atapi )
-               {
-               pdev = &(HOSTDATA(sdev->host)->device[sdev->id]);
-
-               geom[0] = pdev->heads;
-               geom[1] = pdev->sectors;
-               geom[2] = pdev->cylinders;
-               }
-       return 0;
-       }
-
-MODULE_LICENSE("Dual BSD/GPL");
-
-static Scsi_Host_Template driver_template = {
-       .proc_name              = "pci2220i",
-       .name                   = "PCI-2220I/PCI-2240I",
-       .detect                 = Pci2220i_Detect,
-       .release                = Pci2220i_Release,
-       .queuecommand           = Pci2220i_QueueCommand,
-       .abort                  = Pci2220i_Abort,
-       .reset                  = Pci2220i_Reset,
-       .bios_param             = Pci2220i_BiosParam,
-       .can_queue              = 1,
-       .this_id                = -1,
-       .sg_tablesize           = SG_ALL,
-       .cmd_per_lun            = 1,
-       .use_clustering         = DISABLE_CLUSTERING,
-};
-#include "scsi_module.c"
diff --git a/drivers/scsi/pci2220i.h b/drivers/scsi/pci2220i.h
deleted file mode 100644 (file)
index 6926056..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
- *
- * pci2220i.h - Linux Host Driver for PCI-2220i EIDE Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- ****************************************************************************/
-#ifndef _PCI2220I_H
-#define _PCI2220I_H
-
-#ifndef LINUX_VERSION_CODE
-#include <linux/version.h>
-#endif 
-#define        LINUXVERSION(v,p,s)    (((v)<<16) + ((p)<<8) + (s))
-
-// function prototypes
-int Pci2220i_Detect                    (Scsi_Host_Template *tpnt);
-int Pci2220i_Command           (Scsi_Cmnd *SCpnt);
-int Pci2220i_QueueCommand      (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
-int Pci2220i_Abort                     (Scsi_Cmnd *SCpnt);
-int Pci2220i_Reset                     (Scsi_Cmnd *SCpnt, unsigned int flags);
-int Pci2220i_Release           (struct Scsi_Host *pshost);
-int Pci2220i_BiosParam         (struct scsi_device *sdev,
-                                       struct block_device *dev,
-                                       sector_t capacity, int geom[]);
-#endif
diff --git a/drivers/scsi/psi_dale.h b/drivers/scsi/psi_dale.h
deleted file mode 100644 (file)
index d672e3b..0000000
+++ /dev/null
@@ -1,564 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
- *
- * psi_dalei.h - Linux Host Driver for PCI-2220i EIDE Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- ****************************************************************************/
-
-/************************************************/
-/*             Some defines that we like                               */
-/************************************************/
-#define        CHAR            char
-#define        UCHAR           unsigned char
-#define        SHORT           short
-#define        USHORT          unsigned short
-#define        BOOL            unsigned short
-#define        LONG            long
-#define        ULONG           unsigned long
-#define        VOID            void
-
-/************************************************/
-/*             Dale PCI setup                                                  */
-/************************************************/
-#define        VENDOR_PSI                      0x1256
-#define        DEVICE_DALE_1           0x4401          /* 'D1' */
-#define        DEVICE_BIGD_1           0x4201          /* 'B1' */
-#define        DEVICE_BIGD_2           0x4202          /* 'B2' */
-
-/************************************************/
-/*             Misc konstants                                                  */
-/************************************************/
-#define        DALE_MAXDRIVES                  4
-#define        BIGD_MAXDRIVES                  8
-#define        SECTORSXFER                             8
-#define        ATAPI_TRANSFER                  8192
-#define        BYTES_PER_SECTOR                512
-#define        DEFAULT_TIMING_MODE             5
-
-/************************************************/
-/*             EEPROM locations                                                */
-/************************************************/
-#define        DALE_FLASH_PAGE_SIZE    128                             // number of bytes per page
-#define        DALE_FLASH_SIZE                 65536L
-
-#define        DALE_FLASH_BIOS                 0x00080000L             // BIOS base address
-#define        DALE_FLASH_SETUP                0x00088000L             // SETUP PROGRAM base address offset from BIOS
-#define        DALE_FLASH_RAID                 0x00088400L             // RAID signature storage
-#define        DALE_FLASH_FACTORY              0x00089000L             // FACTORY data base address offset from BIOS
-
-#define        DALE_FLASH_BIOS_SIZE    32768U                  // size of FLASH BIOS REGION
-
-/************************************************/
-/*             DALE Register address offsets                   */
-/************************************************/
-#define        REG_DATA                                        0x80
-#define        REG_ERROR                                       0x84
-#define        REG_SECTOR_COUNT                        0x88
-#define        REG_LBA_0                                       0x8C
-#define        REG_LBA_8                                       0x90
-#define        REG_LBA_16                                      0x94
-#define        REG_LBA_24                                      0x98
-#define        REG_STAT_CMD                            0x9C
-#define        REG_STAT_SEL                            0xA0
-#define        REG_FAIL                                        0xB0
-#define        REG_ALT_STAT                            0xB8
-#define        REG_DRIVE_ADRS                          0xBC
-
-#define        DALE_DATA_SLOW                          0x00040000L
-#define        DALE_DATA_MODE2                         0x00040000L
-#define        DALE_DATA_MODE3                         0x00050000L
-#define        DALE_DATA_MODE4                         0x00060000L
-#define        DALE_DATA_MODE5                         0x00070000L
-
-#define        BIGD_DATA_SLOW                          0x00000000L
-#define        BIGD_DATA_MODE0                         0x00000000L
-#define        BIGD_DATA_MODE2                         0x00000000L
-#define        BIGD_DATA_MODE3                         0x00000008L
-#define        BIGD_DATA_MODE4                         0x00000010L
-#define        BIGD_DATA_MODE5                         0x00000020L
-
-#define RTR_LOCAL_RANGE                                0x000
-#define RTR_LOCAL_REMAP                                0x004
-#define RTR_EXP_RANGE                          0x010
-#define RTR_EXP_REMAP                          0x014
-#define RTR_REGIONS                                    0x018
-#define RTR_DM_MASK                                    0x01C
-#define RTR_DM_LOCAL_BASE                      0x020
-#define RTR_DM_IO_BASE                         0x024
-#define RTR_DM_PCI_REMAP                       0x028
-#define RTR_DM_IO_CONFIG                       0x02C
-#define RTR_MAILBOX                                    0x040
-#define RTR_LOCAL_DOORBELL                     0x060
-#define RTR_PCI_DOORBELL                       0x064
-#define RTR_INT_CONTROL_STATUS                 0x068
-#define RTR_EEPROM_CONTROL_STATUS      0x06C
-
-#define RTR_DMA0_MODE                          0x0080
-#define RTR_DMA0_PCI_ADDR                      0x0084
-#define RTR_DMA0_LOCAL_ADDR                    0x0088
-#define RTR_DMA0_COUNT                         0x008C
-#define RTR_DMA0_DESC_PTR                      0x0090
-#define RTR_DMA1_MODE                          0x0094
-#define RTR_DMA1_PCI_ADDR                      0x0098
-#define RTR_DMA1_LOCAL_ADDR                    0x009C
-#define RTR_DMA1_COUNT                         0x00A0
-#define RTR_DMA1_DESC_PTR                      0x00A4
-#define RTR_DMA_COMMAND_STATUS         0x00A8
-#define RTR_DMA_ARB0                           0x00AC
-#define RTR_DMA_ARB1                           0x00B0
-
-#define RTL_DMA0_MODE                          0x00
-#define RTL_DMA0_PCI_ADDR                      0x04
-#define RTL_DMA0_LOCAL_ADDR                    0x08
-#define RTL_DMA0_COUNT                         0x0C
-#define RTL_DMA0_DESC_PTR                      0x10
-#define RTL_DMA1_MODE                          0x14
-#define RTL_DMA1_PCI_ADDR                      0x18
-#define RTL_DMA1_LOCAL_ADDR                    0x1C
-#define RTL_DMA1_COUNT                         0x20
-#define RTL_DMA1_DESC_PTR                      0x24
-#define RTL_DMA_COMMAND_STATUS         0x28
-#define RTL_DMA_ARB0                           0x2C
-#define RTL_DMA_ARB1                           0x30
-
-/************************************************/
-/*             Dale Scratchpad locations                               */
-/************************************************/
-#define        DALE_CHANNEL_DEVICE_0           0               // device channel locations
-#define        DALE_CHANNEL_DEVICE_1           1
-#define        DALE_CHANNEL_DEVICE_2           2
-#define        DALE_CHANNEL_DEVICE_3           3
-
-#define        DALE_SCRATCH_DEVICE_0           4               // device type codes
-#define        DALE_SCRATCH_DEVICE_1           5
-#define DALE_SCRATCH_DEVICE_2          6
-#define        DALE_SCRATCH_DEVICE_3           7
-
-#define        DALE_RAID_0_STATUS                      8
-#define DALE_RAID_1_STATUS                     9
-
-#define        DALE_TIMING_MODE                        12              // bus master timing mode (2, 3, 4, 5)
-#define        DALE_NUM_DRIVES                         13              // number of addressable drives on this board
-#define        DALE_RAID_ON                            14              // RAID status On
-#define        DALE_LAST_ERROR                         15              // Last error code from BIOS
-
-/************************************************/
-/*             BigD Scratchpad locations                               */
-/************************************************/
-#define        BIGD_DEVICE_0                   0               // device channel locations
-#define        BIGD_DEVICE_1                   1
-#define        BIGD_DEVICE_2                   2
-#define        BIGD_DEVICE_3                   3
-
-#define        BIGD_DEVICE_4                   4               // device type codes
-#define        BIGD_DEVICE_5                   5
-#define BIGD_DEVICE_6                  6
-#define        BIGD_DEVICE_7                   7
-
-#define        BIGD_ALARM_IMAGE                11              // ~image of alarm fail register                
-#define        BIGD_TIMING_MODE                12              // bus master timing mode (2, 3, 4, 5)
-#define        BIGD_NUM_DRIVES                 13              // number of addressable drives on this board
-#define        BIGD_RAID_ON                    14              // RAID status is on for the whole board
-#define        BIGD_LAST_ERROR                 15              // Last error code from BIOS
-
-#define        BIGD_RAID_0_STATUS              16
-#define BIGD_RAID_1_STATUS             17
-#define        BIGD_RAID_2_STATUS              18
-#define        BIGD_RAID_3_STATUS              19
-#define        BIGD_RAID_4_STATUS              20
-#define BIGD_RAID_5_STATUS             21
-#define        BIGD_RAID_6_STATUS              22
-#define        BIGD_RAID_7_STATUS              23
-
-/************************************************/
-/*             Dale cable select bits                                  */
-/************************************************/
-#define        SEL_NONE                                        0x00
-#define        SEL_1                                           0x01
-#define        SEL_2                                           0x02
-#define        SEL_3                                           0x04
-#define        SEL_4                                           0x08
-#define        SEL_NEW_SPEED_1                         0x20
-#define        SEL_COPY                                        0x40
-#define        SEL_IRQ_OFF                                     0x80
-
-/************************************************/
-/*             Device/Geometry controls                                */
-/************************************************/
-#define GEOMETRY_NONE                          0x0                             // No device
-#define GEOMETRY_SET                           0x1                             // Geometry set
-#define        GEOMETRY_LBA                            0x2                             // Geometry set in default LBA mode
-#define        GEOMETRY_PHOENIX                        0x3                             // Geometry set in Pheonix BIOS compatibility mode
-
-#define        DEVICE_NONE                                     0x0                             // No device present
-#define        DEVICE_INACTIVE                         0x1                             // device present but not registered active
-#define        DEVICE_ATAPI                            0x2                             // ATAPI device (CD_ROM, Tape, Etc...)
-#define        DEVICE_DASD_NONLBA                      0x3                             // Non LBA incompatible device
-#define        DEVICE_DASD_LBA                         0x4                             // LBA compatible device
-
-/************************************************/
-/*             BigD fail register bits                                 */
-/************************************************/
-#define        FAIL_NONE                               0x00
-#define        FAIL_0                                  0x01
-#define        FAIL_1                                  0x02
-#define        FAIL_2                                  0x04
-#define        FAIL_MULTIPLE                   0x08
-#define        FAIL_GOOD                               0x20
-#define        FAIL_AUDIBLE                    0x40
-#define        FAIL_ANY                                0x80
-
-/************************************************/
-/*             Setup Structure Definitions                             */
-/************************************************/
-typedef struct         // device setup parameters
-       {
-       UCHAR   geometryControl;        // geometry control flags
-       UCHAR   device;                         // device code
-       USHORT  sectors;                        // number of sectors per track
-       USHORT  heads;                          // number of heads
-       USHORT  cylinders;                      // number of cylinders for this device
-       ULONG   blocks;                         // number of blocks on device
-       ULONG   realCapacity;           // number of real blocks on this device for drive changed testing
-       } SETUP_DEVICE, *PSETUP_DEVICE;
-
-typedef struct         // master setup structure
-       {
-       USHORT                  startupDelay;
-       BOOL                    promptBIOS;
-       BOOL                    fastFormat;
-       BOOL                    shareInterrupt;
-       BOOL                    rebootRebuild;
-       USHORT                  timingMode;
-       USHORT                  spare5;
-       USHORT                  spare6;
-       SETUP_DEVICE    setupDevice[BIGD_MAXDRIVES];
-       }       SETUP, *PSETUP;
-
-/************************************************/
-/*             RAID Structure Definitions                              */
-/************************************************/
-typedef        struct
-       {
-       UCHAR   signature;                      // 0x55 our mirror signature
-       UCHAR   status;                         // current status bits
-       UCHAR   pairIdentifier;         // unique identifier for pair
-       ULONG   reconstructPoint;       // recontruction point for hot reconstruct
-       }       DISK_MIRROR;
-
-typedef struct DEVICE_RAID1
-       {
-       long            TotalSectors;
-       DISK_MIRROR DiskRaid1;
-       }       DEVICE_RAID1, *PDEVICE_RAID1;
-
-#define        DISK_MIRROR_POSITION    0x01A8
-#define        SIGNATURE                               0x55
-
-#define        MASK_SERIAL_NUMBER      0x0FFE                  // mask for serial number matching
-#define        MASK_SERIAL_UNIT        0x0001                  // mask for unit portion of serial number
-
-// Status bits
-#define        UCBF_MIRRORED           0x0010                                                          // drive has a pair
-#define        UCBF_MATCHED            0x0020                                                          // drive pair is matched
-#define        UCBF_SURVIVOR           0x0040                                                          // this unit is a survivor of a pair
-#define        UCBF_REBUILD            0x0080                                                          // rebuild in progress on this device
-
-// SCSI controls for RAID
-#define        SC_MY_RAID                      0xBF                    // our special CDB command byte for Win95... interface
-#define        MY_SCSI_QUERY1          0x32                    // byte 1 subcommand to query driver for RAID 1 informatation
-#define        MY_SCSI_REBUILD         0x40                    // byte 1 subcommand to reconstruct a mirrored pair
-#define MY_SCSI_DEMOFAIL       0x54                    // byte 1 subcommand for RAID failure demonstration
-#define        MY_SCSI_ALARMMUTE       0x60                    // byte 1 subcommand to mute any alarm currently on
-
-/************************************************/
-/*             Timeout konstants                                               */
-/************************************************/
-#define        TIMEOUT_READY                           100                     // 100 mSec
-#define        TIMEOUT_DRQ                                     300                     // 300 mSec
-#define        TIMEOUT_DATA                            (3 * HZ)        // 3 seconds
-
-/************************************************/
-/*             Misc. macros                                                    */
-/************************************************/
-#define ANY2SCSI(up, p)                                        \
-((UCHAR *)up)[0] = (((ULONG)(p)) >> 8);        \
-((UCHAR *)up)[1] = ((ULONG)(p));
-
-#define SCSI2LONG(up)                                  \
-( (((long)*(((UCHAR *)up))) << 16)             \
-+ (((long)(((UCHAR *)up)[1])) << 8)            \
-+ ((long)(((UCHAR *)up)[2])) )
-
-#define XANY2SCSI(up, p)                               \
-((UCHAR *)up)[0] = ((long)(p)) >> 24;  \
-((UCHAR *)up)[1] = ((long)(p)) >> 16;  \
-((UCHAR *)up)[2] = ((long)(p)) >> 8;   \
-((UCHAR *)up)[3] = ((long)(p));
-
-#define XSCSI2LONG(up)                                 \
-( (((long)(((UCHAR *)up)[0])) << 24)   \
-+ (((long)(((UCHAR *)up)[1])) << 16)   \
-+ (((long)(((UCHAR *)up)[2])) <<  8)   \
-+ ((long)(((UCHAR *)up)[3])) )
-
-#define        SelectSpigot(padapter,spigot)   outb_p (spigot, padapter->regStatSel)
-#define WriteCommand(padapter,cmd)             outb_p (cmd, padapter->regStatCmd)
-#define        AtapiDevice(padapter,b)                 outb_p (b, padapter->regLba24);
-#define        AtapiCountLo(padapter,b)                outb_p (b, padapter->regLba8)
-#define        AtapiCountHi(padapter,b)                outb_p (b, padapter->regLba16)
-
-/************************************************/
-/*             SCSI CDB operation codes                                */
-/************************************************/
-#define SCSIOP_TEST_UNIT_READY         0x00
-#define SCSIOP_REZERO_UNIT                     0x01
-#define SCSIOP_REWIND                          0x01
-#define SCSIOP_REQUEST_BLOCK_ADDR      0x02
-#define SCSIOP_REQUEST_SENSE           0x03
-#define SCSIOP_FORMAT_UNIT                     0x04
-#define SCSIOP_READ_BLOCK_LIMITS       0x05
-#define SCSIOP_REASSIGN_BLOCKS         0x07
-#define SCSIOP_READ6                           0x08
-#define SCSIOP_RECEIVE                         0x08
-#define SCSIOP_WRITE6                          0x0A
-#define SCSIOP_PRINT                           0x0A
-#define SCSIOP_SEND                                    0x0A
-#define SCSIOP_SEEK6                           0x0B
-#define SCSIOP_TRACK_SELECT                    0x0B
-#define SCSIOP_SLEW_PRINT                      0x0B
-#define SCSIOP_SEEK_BLOCK                      0x0C
-#define SCSIOP_PARTITION                       0x0D
-#define SCSIOP_READ_REVERSE                    0x0F
-#define SCSIOP_WRITE_FILEMARKS         0x10
-#define SCSIOP_FLUSH_BUFFER                    0x10
-#define SCSIOP_SPACE                           0x11
-#define SCSIOP_INQUIRY                         0x12
-#define SCSIOP_VERIFY6                         0x13
-#define SCSIOP_RECOVER_BUF_DATA                0x14
-#define SCSIOP_MODE_SELECT                     0x15
-#define SCSIOP_RESERVE_UNIT                    0x16
-#define SCSIOP_RELEASE_UNIT                    0x17
-#define SCSIOP_COPY                                    0x18
-#define SCSIOP_ERASE                           0x19
-#define SCSIOP_MODE_SENSE                      0x1A
-#define SCSIOP_START_STOP_UNIT         0x1B
-#define SCSIOP_STOP_PRINT                      0x1B
-#define SCSIOP_LOAD_UNLOAD                     0x1B
-#define SCSIOP_RECEIVE_DIAGNOSTIC      0x1C
-#define SCSIOP_SEND_DIAGNOSTIC         0x1D
-#define SCSIOP_MEDIUM_REMOVAL          0x1E
-#define SCSIOP_READ_CAPACITY           0x25
-#define SCSIOP_READ                                    0x28
-#define SCSIOP_WRITE                           0x2A
-#define SCSIOP_SEEK                                    0x2B
-#define SCSIOP_LOCATE                          0x2B
-#define SCSIOP_WRITE_VERIFY                    0x2E
-#define SCSIOP_VERIFY                          0x2F
-#define SCSIOP_SEARCH_DATA_HIGH                0x30
-#define SCSIOP_SEARCH_DATA_EQUAL       0x31
-#define SCSIOP_SEARCH_DATA_LOW         0x32
-#define SCSIOP_SET_LIMITS                      0x33
-#define SCSIOP_READ_POSITION           0x34
-#define SCSIOP_SYNCHRONIZE_CACHE       0x35
-#define SCSIOP_COMPARE                         0x39
-#define SCSIOP_COPY_COMPARE                    0x3A
-#define SCSIOP_WRITE_DATA_BUFF         0x3B
-#define SCSIOP_READ_DATA_BUFF          0x3C
-#define SCSIOP_CHANGE_DEFINITION       0x40
-#define SCSIOP_READ_SUB_CHANNEL                0x42
-#define SCSIOP_READ_TOC                                0x43
-#define SCSIOP_READ_HEADER                     0x44
-#define SCSIOP_PLAY_AUDIO                      0x45
-#define SCSIOP_PLAY_AUDIO_MSF          0x47
-#define SCSIOP_PLAY_TRACK_INDEX                0x48
-#define SCSIOP_PLAY_TRACK_RELATIVE     0x49
-#define SCSIOP_PAUSE_RESUME                    0x4B
-#define SCSIOP_LOG_SELECT                      0x4C
-#define SCSIOP_LOG_SENSE                       0x4D
-#define SCSIOP_MODE_SELECT10           0x55
-#define SCSIOP_MODE_SENSE10                    0x5A
-#define SCSIOP_LOAD_UNLOAD_SLOT                0xA6
-#define SCSIOP_MECHANISM_STATUS                0xBD
-#define SCSIOP_READ_CD                         0xBE
-
-// IDE command definitions
-#define IDE_COMMAND_ATAPI_RESET                0x08
-#define IDE_COMMAND_READ                       0x20
-#define IDE_COMMAND_WRITE                      0x30
-#define IDE_COMMAND_RECALIBRATE                0x10
-#define IDE_COMMAND_SEEK                       0x70
-#define IDE_COMMAND_SET_PARAMETERS     0x91
-#define IDE_COMMAND_VERIFY                     0x40
-#define IDE_COMMAND_ATAPI_PACKET       0xA0
-#define IDE_COMMAND_ATAPI_IDENTIFY     0xA1
-#define        IDE_CMD_READ_MULTIPLE           0xC4
-#define        IDE_CMD_WRITE_MULTIPLE          0xC5
-#define        IDE_CMD_SET_MULTIPLE            0xC6
-#define IDE_COMMAND_IDENTIFY           0xEC
-
-// IDE status definitions
-#define IDE_STATUS_ERROR                       0x01
-#define IDE_STATUS_INDEX                       0x02
-#define IDE_STATUS_CORRECTED_ERROR     0x04
-#define IDE_STATUS_DRQ                         0x08
-#define IDE_STATUS_DSC                         0x10
-#define        IDE_STATUS_WRITE_FAULT          0x20
-#define IDE_STATUS_DRDY                                0x40
-#define IDE_STATUS_BUSY                                0x80
-
-typedef struct _ATAPI_STATUS
-       {
-       CHAR    check           :1;
-       CHAR    reserved1       :1;
-       CHAR    corr            :1;
-       CHAR    drq                     :1;
-       CHAR    dsc                     :1;
-       CHAR    reserved2       :1;
-       CHAR    drdy            :1;
-       CHAR    bsy                     :1;
-       }       ATAPI_STATUS;
-
-typedef struct _ATAPI_REASON
-       {
-       CHAR    cod                     :1;
-       CHAR    io                      :1;
-       CHAR    reserved1       :6;
-       }       ATAPI_REASON;
-
-typedef struct _ATAPI_ERROR
-       {
-       CHAR    ili                     :1;
-       CHAR    eom                     :1;
-       CHAR    abort           :1;
-       CHAR    mcr                     :1;
-       CHAR    senseKey        :4;
-       }       ATAPI_ERROR;
-
-// IDE error definitions
-#define        IDE_ERROR_AMNF                          0x01
-#define        IDE_ERROR_TKONF                         0x02
-#define        IDE_ERROR_ABRT                          0x04
-#define        IDE_ERROR_MCR                           0x08
-#define        IDE_ERROR_IDFN                          0x10
-#define        IDE_ERROR_MC                            0x20
-#define        IDE_ERROR_UNC                           0x40
-#define        IDE_ERROR_BBK                           0x80
-
-// SCSI read capacity structure
-typedef        struct _READ_CAPACITY_DATA
-       {
-       ULONG blks;                             /* total blocks (converted to little endian) */
-       ULONG blksiz;                   /* size of each (converted to little endian) */
-       }       READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
-
-// SCSI inquiry data
-typedef struct _INQUIRYDATA
-       {
-       UCHAR DeviceType                        :5;
-       UCHAR DeviceTypeQualifier       :3;
-       UCHAR DeviceTypeModifier        :7;
-       UCHAR RemovableMedia            :1;
-    UCHAR Versions;
-    UCHAR ResponseDataFormat;
-    UCHAR AdditionalLength;
-    UCHAR Reserved[2];
-       UCHAR SoftReset                         :1;
-       UCHAR CommandQueue                      :1;
-       UCHAR Reserved2                         :1;
-       UCHAR LinkedCommands            :1;
-       UCHAR Synchronous                       :1;
-       UCHAR Wide16Bit                         :1;
-       UCHAR Wide32Bit                         :1;
-       UCHAR RelativeAddressing        :1;
-    UCHAR VendorId[8];
-    UCHAR ProductId[16];
-    UCHAR ProductRevisionLevel[4];
-    UCHAR VendorSpecific[20];
-    UCHAR Reserved3[40];
-       }       INQUIRYDATA, *PINQUIRYDATA;
-
-// IDE IDENTIFY data
-#pragma pack (1)
-typedef struct _IDENTIFY_DATA
-       {
-    USHORT     GeneralConfiguration;           //  0
-    USHORT     NumberOfCylinders;                      //  1
-    USHORT     Reserved1;                                      //  2
-    USHORT     NumberOfHeads;                          //  3
-    USHORT     UnformattedBytesPerTrack;       //  4
-    USHORT     UnformattedBytesPerSector;      //  5
-    USHORT     SectorsPerTrack;                        //  6
-       USHORT  NumBytesISG;                            //  7 Byte Len - inter-sector gap
-       USHORT  NumBytesSync;                           //  8          - sync field
-       USHORT  NumWordsVUS;                            //  9 Len - Vendor Unique Info
-    USHORT     SerialNumber[10];                       // 10
-    USHORT     BufferType;                                     // 20
-    USHORT     BufferSectorSize;                       // 21
-    USHORT     NumberOfEccBytes;                       // 22
-    USHORT     FirmwareRevision[4];            // 23
-    USHORT     ModelNumber[20];                        // 27
-       USHORT  NumSectorsPerInt        :8;             // 47 Multiple Mode - Sec/Blk
-       USHORT  Reserved2                       :8;             // 47
-       USHORT  DoubleWordMode;                         // 48 flag for double word mode capable
-       USHORT  VendorUnique1           :8;             // 49
-       USHORT  SupportDMA                      :1;             // 49 DMA supported
-       USHORT  SupportLBA                      :1;             // 49 LBA supported
-       USHORT  SupportIORDYDisable     :1;             // 49 IORDY can be disabled
-       USHORT  SupportIORDY            :1;             // 49 IORDY supported
-       USHORT  ReservedPsuedoDMA       :1;             // 49 reserved for pseudo DMA mode support
-       USHORT  Reserved3                       :3;             // 49
-       USHORT  Reserved4;                                      // 50
-       USHORT  Reserved5                       :8;             // 51 Transfer Cycle Timing - PIO
-       USHORT  PIOCycleTime            :8;             // 51 Transfer Cycle Timing - PIO
-       USHORT  Reserved6                       :8;             // 52                       - DMA
-       USHORT  DMACycleTime            :8;             // 52                       - DMA
-       USHORT  Valid_54_58                     :1;             // 53 words 54 - 58 are valid
-       USHORT  Valid_64_70                     :1;             // 53 words 64 - 70 are valid
-       USHORT  Reserved7                       :14;    // 53
-       USHORT  LogNumCyl;                                      // 54 Current Translation - Num Cyl
-       USHORT  LogNumHeads;                            // 55                       Num Heads
-       USHORT  LogSectorsPerTrack;                     // 56                       Sec/Trk
-       ULONG   LogTotalSectors;                        // 57                       Total Sec
-       USHORT  CurrentNumSecPerInt     :8;             // 59 current setting for number of sectors per interrupt
-       USHORT  ValidNumSecPerInt       :1;             // 59 Current setting is valid for number of sectors per interrupt
-       USHORT  Reserved8                       :7;             // 59
-       ULONG   LBATotalSectors;                        // 60 LBA Mode - Sectors
-       USHORT  DMASWordFlags;                          // 62
-       USHORT  DMAMWordFlags;                          // 63
-       USHORT  AdvancedPIOSupport  :8;         // 64 Flow control PIO transfer modes supported
-       USHORT  Reserved9                       :8;             // 64
-       USHORT  MinMultiDMACycle;                       // 65 minimum multiword DMA transfer cycle time per word
-       USHORT  RecomendDMACycle;                       // 66 Manufacturer's recommende multiword DMA transfer cycle time
-       USHORT  MinPIOCycleWithoutFlow;         // 67 Minimum PIO transfer cycle time without flow control
-       USHORT  MinPIOCylceWithFlow;            // 68 Minimum PIO transfer cycle time with IORDY flow control
-       USHORT  ReservedSpace[256-69];          // 69
-       }       IDENTIFY_DATA, *PIDENTIFY_DATA;
-
-// ATAPI configuration bits
-typedef struct _ATAPI_GENERAL_0
-       {
-       USHORT  CmdPacketSize           :2;             // Command packet size
-       USHORT  Reserved1                       :3;
-       USHORT  CmdDrqType                      :2;
-       USHORT  Removable                       :1;
-       USHORT  DeviceType                      :5;
-       USHORT  Reserved2                       :1;
-       USHORT  ProtocolType            :2;
-       }       ATAPI_GENERAL_0;
-
-#pragma pack ()
diff --git a/drivers/scsi/psi_roy.h b/drivers/scsi/psi_roy.h
deleted file mode 100644 (file)
index c55b9c0..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-/****************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
- *
- * psi_roy.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
- *
- * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
- * All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that redistributions of source
- * code retain the above copyright notice and this comment without
- * modification.
- *
- * Technical updates and product information at:
- *  http://www.psidisk.com
- *
- * Please send questions, comments, bug reports to:
- *  tech@psidisk.com Technical Support
- *
- ****************************************************************************/
-
-#ifndef        ROY_HOST
-#define        ROY_HOST
-
-/************************************************/
-/*             PCI setup                                                               */
-/************************************************/
-#define        VENDOR_PSI                      0x1256
-#define        DEVICE_ROY_1            0x5201          /* 'R1' */
-
-/************************************************/
-/*             controller constants                                    */
-/************************************************/
-#define MAXADAPTER                     4                       // Increase this and the sizes of the arrays below, if you need more.
-#define        MAX_BUS                         2
-#define        MAX_UNITS                       16
-#define        TIMEOUT_COMMAND         400                     // number of milliSecondos for command busy timeout
-
-/************************************************/
-/*             I/O address offsets                                             */
-/************************************************/
-#define RTR_MAILBOX                                            0x040
-#define RTR_LOCAL_DOORBELL                             0x060
-#define RTR_PCI_DOORBELL                               0x064
-
-/************************************************/
-/*                                                                                             */
-/*                     Host command codes                                      */
-/*                                                                                             */
-/************************************************/
-#define        CMD_READ_CHS            0x01            /* read sectors as specified (CHS mode) */
-#define        CMD_READ                        0x02            /* read sectors as specified (RBA mode) */
-#define        CMD_READ_SG                     0x03            /* read sectors using scatter/gather list */
-#define        CMD_WRITE_CHS           0x04            /* write sectors as specified (CHS mode) */
-#define        CMD_WRITE                       0x05            /* write sectors as specified (RBA mode) */
-#define        CMD_WRITE_SG            0x06            /* write sectors using scatter/gather list (LBA mode) */
-#define        CMD_READ_CHS_SG         0x07            /* read sectors using scatter/gather list (CHS mode) */
-#define        CMD_WRITE_CHS_SG        0x08            /* write sectors using scatter/gather list (CHS mode) */
-#define        CMD_VERIFY_CHS          0x09            /* verify data on sectors as specified (CHS mode) */
-#define        CMD_VERIFY                      0x0A            /* verify data on sectors as specified (RBA mode) */
-#define        CMD_DASD_CDB            0x0B            /* process CDB for a DASD device */
-#define        CMD_DASD_CDB_SG         0x0C            /* process CDB for a DASD device with scatter/gather */
-
-#define        CMD_READ_ABS            0x10            /* read absolute disk */
-#define        CMD_WRITE_ABS           0x11            /* write absolute disk */
-#define        CMD_VERIFY_ABS          0x12            /* verify absolute disk */
-#define        CMD_TEST_READY          0x13            /* test unit ready and return status code */
-#define        CMD_LOCK_DOOR           0x14            /* lock device door */
-#define        CMD_UNLOCK_DOOR         0x15            /* unlock device door */
-#define        CMD_EJECT_MEDIA         0x16            /* eject the media */
-#define        CMD_UPDATE_CAP          0x17            /* update capacity information */
-#define        CMD_TEST_PRIV           0x18            /* test and setup private format media */
-
-
-#define        CMD_SCSI_THRU           0x30            /* SCSI pass through CDB */
-#define        CMD_SCSI_THRU_SG        0x31            /* SCSI pass through CDB with scatter/gather */
-#define        CMD_SCSI_REQ_SENSE      0x32            /* SCSI pass through request sense after check condition */
-
-#define        CMD_DASD_RAID_RQ        0x35            /* request DASD RAID drive data */
-#define        CMD_DASD_RAID_RQ0       0x31                    /* byte 1 subcommand to query for RAID 0 informatation */
-#define        CMD_DASD_RAID_RQ1       0x32                    /* byte 1 subcommand to query for RAID 1 informatation */
-#define        CMD_DASD_RAID_RQ5       0x33                    /* byte 1 subcommand to query for RAID 5 informatation */
-
-#define        CMD_DASD_SCSI_INQ       0x36            /* do DASD inquire and return in SCSI format */
-#define        CMD_DASD_CAP            0x37            /* read DASD capacity */
-#define        CMD_DASD_INQ            0x38            /* do DASD inquire for type data and return SCSI/EIDE inquiry */
-#define        CMD_SCSI_INQ            0x39            /* do SCSI inquire */
-#define        CMD_READ_SETUP          0x3A            /* Get setup structures from controller */
-#define        CMD_WRITE_SETUP         0x3B            /* Put setup structures in controller and burn in flash */
-#define        CMD_READ_CONFIG         0x3C            /* Get the entire configuration and setup structures */
-#define        CMD_WRITE_CONFIG        0x3D            /* Put the entire configuration and setup structures in flash */
-
-#define        CMD_TEXT_DEVICE         0x3E            /* obtain device text */
-#define        CMD_TEXT_SIGNON         0x3F            /* get sign on banner */
-
-#define        CMD_QUEUE                       0x40            /* any command below this generates a queue tag interrupt to host*/
-
-#define        CMD_PREFETCH            0x40            /* prefetch sectors as specified */
-#define        CMD_TEST_WRITE          0x41            /* Test a device for write protect */
-#define        CMD_LAST_STATUS         0x42            /* get last command status and error data*/
-#define        CMD_ABORT                       0x43            /* abort command as specified */
-#define        CMD_ERROR                       0x44            /* fetch error code from a tagged op */
-#define        CMD_DONE                        0x45            /* done with operation */
-#define        CMD_DIAGNOSTICS         0x46            /* execute controller diagnostics and wait for results */
-#define        CMD_FEATURE_MODE        0x47            /* feature mode control word */
-#define        CMD_DASD_INQUIRE        0x48            /* inquire as to DASD SCSI device (32 possible) */
-#define        CMD_FEATURE_QUERY       0x49            /* query the feature control word */
-#define        CMD_DASD_EJECT          0x4A            /* Eject removable media for DASD type */
-#define        CMD_DASD_LOCK           0x4B            /* Lock removable media for DASD type */
-#define        CMD_DASD_TYPE           0x4C            /* obtain DASD device type */
-#define        CMD_NUM_DEV                     0x4D            /* obtain the number of devices connected to the controller */
-#define        CMD_GET_PARMS           0x4E            /* obtain device parameters */
-#define        CMD_SPECIFY                     0x4F            /* specify operating system for scatter/gather operations */
-
-#define        CMD_RAID_GET_DEV        0x50            /* read RAID device geometry */
-#define CMD_RAID_READ          0x51            /* read RAID 1 parameter block */
-#define        CMD_RAID_WRITE          0x52            /* write RAID 1 parameter block */
-#define        CMD_RAID_LITEUP         0x53            /* Light up the drive light for identification */
-#define        CMD_RAID_REBUILD        0x54            /* issue a RAID 1 pair rebuild */
-#define        CMD_RAID_MUTE           0x55            /* mute RAID failure alarm */
-#define        CMD_RAID_FAIL           0x56            /* induce a RAID failure */
-#define        CMD_RAID_STATUS         0x57            /* get status of RAID pair */
-#define        CMD_RAID_STOP           0x58            /* stop any reconstruct in progress */
-#define CMD_RAID_START         0x59            /* start reconstruct */
-#define        CMD_RAID0_READ          0x5A            /* read RAID 0 parameter block */
-#define        CMD_RAID0_WRITE         0x5B            /* write RAID 0 parameter block */
-#define        CMD_RAID5_READ          0x5C            /* read RAID 5 parameter block */
-#define        CMD_RAID5_WRITE         0x5D            /* write RAID 5 parameter block */
-
-#define        CMD_ERASE_TABLES        0x5F            /* erase partition table and RAID signatutures */
-
-#define        CMD_SCSI_GET            0x60            /* get SCSI pass through devices */
-#define        CMD_SCSI_TIMEOUT        0x61            /* set SCSI pass through timeout */
-#define        CMD_SCSI_ERROR          0x62            /* get SCSI pass through request sense length and residual data count */
-#define        CMD_GET_SPARMS          0x63            /* get SCSI bus and user parms */
-#define        CMD_SCSI_ABORT          0x64            /* abort by setting time-out to zero */
-
-#define        CMD_CHIRP_CHIRP         0x77            /* make a chirp chirp sound */
-#define        CMD_GET_LAST_DONE       0x78            /* get tag of last done in progress */
-#define        CMD_GET_FEATURES        0x79            /* get feature code and ESN */
-#define CMD_CLEAR_CACHE                0x7A            /* Clear cache on specified device */
-#define        CMD_BIOS_TEST           0x7B            /* Test whether or not to load BIOS */
-#define        CMD_WAIT_FLUSH          0x7C            /* wait for cache flushed and invalidate read cache */
-#define        CMD_RESET_BUS           0x7D            /* reset the SCSI bus */
-#define        CMD_STARTUP_QRY         0x7E            /* startup in progress query */
-#define        CMD_RESET                       0x7F            /* reset the controller */
-
-#define        CMD_RESTART_RESET       0x80            /* reload and restart the controller at any reset issued */
-#define        CMD_SOFT_RESET          0x81            /* do a soft reset NOW! */
-
-/************************************************/
-/*                                                                                             */
-/*                             Host return errors                              */
-/*                                                                                             */
-/************************************************/
-#define        ERR08_TAGGED            0x80            /* doorbell error ored with tag */
-
-#define        ERR16_NONE                      0x0000          /* no errors */
-#define        ERR16_SC_COND_MET       0x0004          /* SCSI status - Condition Met */
-#define        ERR16_CMD                       0x0101          /* command error */
-#define        ERR16_SC_CHECK_COND     0x0002          /* SCSI status - Check Condition */
-#define        ERR16_CMD_NOT           0x0201          /* command not supported */
-#define ERR16_NO_DEVICE     0x0301             /* invalid device selection */
-#define        ERR16_SECTOR            0x0202          /* bad sector */
-#define        ERR16_PROTECT           0x0303          /* write protected */
-#define        ERR16_NOSECTOR          0x0404          /* sector not found */
-#define        ERR16_MEDIA                     0x0C0C          /* invalid media */
-#define        ERR16_CONTROL           0x2020          /* controller error */
-#define        ERR16_CONTROL_DMA       0x2120          /* controller DMA engine error */
-#define        ERR16_NO_ALARM          0x2220          /* alarm is not active */
-#define        ERR16_OP_BUSY           0x2320          /* operation busy */
-#define        ERR16_SEEK                      0x4040          /* seek failure */
-#define        ERR16_DEVICE_FAIL       0x4140          /* device has failed */
-#define ERR16_TIMEOUT          0x8080          /* timeout error */
-#define        ERR16_DEV_NOT_READY     0xAAAA          /* drive not ready */
-#define        ERR16_UNDEFINED         0xBBBB          /* undefined error */
-#define        ERR16_WRITE_FAULT       0xCCCC          /* write fault */
-#define ERR16_INVALID_DEV      0x4001          /* invalid device access */
-#define        ERR16_DEVICE_BUSY       0x4002          /* device is busy */
-#define        ERR16_MEMORY            0x4003          /* device pass thru requires too much memory */
-#define        ERR16_NO_FEATURE        0x40FA          /* feature no implemented */
-#define        ERR16_NOTAG                     0x40FD          /* no tag space available */
-#define        ERR16_NOT_READY         0x40FE          /* controller not ready error */
-#define        ERR16_SETUP_FLASH       0x5050          /* error when writing setup to flash memory */
-#define        ERR16_SETUP_SIZE        0x5051          /* setup block size error */
-#define        ERR16_SENSE                     0xFFFF          /* sense opereration failed */
-#define        ERR16_SC_BUSY           0x0008          /* SCSI status - Busy */
-#define        ERR16_SC_RES_CONFL      0x0018          /* SCSI status - Reservation Conflict */
-#define        ERR16_SC_CMD_TERM       0x0022          /* SCSI status - Command Terminated */
-#define        ERR16_SC_OTHER          0x00FF          /* SCSI status - not recognized (any value masked) */
-#define        ERR16_MEDIA_CHANGED     0x8001          /* devices media has been changed */
-
-#define        ERR32_NONE                      0x00000000      /* no errors */
-#define        ERR32_SC_COND_MET       0x00000004      /* SCSI status - Condition Met */
-#define        ERR32_CMD                       0x00010101      /* command error */
-#define        ERR32_SC_CHECK_COND     0x00020002      /* SCSI status - Check Condition */
-#define        ERR32_CMD_NOT           0x00030201      /* command not supported */
-#define ERR32_NO_DEVICE     0x00040301 /* invalid device selection */
-#define        ERR32_SECTOR            0x00050202      /* bad sector */
-#define        ERR32_PROTECT           0x00060303      /* write protected */
-#define        ERR32_NOSECTOR          0x00070404      /* sector not found */
-#define        ERR32_MEDIA                     0x00080C0C      /* invalid media */
-#define        ERR32_CONTROL           0x00092020      /* controller error */
-#define        ERR32_CONTROL_DMA       0x000A2120      /* Controller DMA error */
-#define        ERR32_NO_ALARM          0x000B2220      /* alarm is not active */
-#define        ERR32_OP_BUSY           0x000C2320      /* operation busy */
-#define        ERR32_SEEK                      0x000D4040      /* seek failure */
-#define        ERR32_DEVICE_FAIL       0x000E4140      /* device has failed */
-#define ERR32_TIMEOUT          0x000F8080      /* timeout error */
-#define        ERR32_DEV_NOT_READY     0x0010AAAA      /* drive not ready */
-#define        ERR32_UNDEFINED         0x0011BBBB      /* undefined error */
-#define        ERR32_WRITE_FAULT       0x0012CCCC      /* write fault */
-#define ERR32_INVALID_DEV      0x00134001      /* invalid device access */
-#define        ERR32_DEVICE_BUSY       0x00144002      /* device is busy */
-#define        ERR32_MEMORY            0x00154003      /* device pass thru requires too much memory */
-#define        ERR32_NO_FEATURE        0x001640FA      /* feature no implemented */
-#define        ERR32_NOTAG                     0x001740FD      /* no tag space available */
-#define        ERR32_NOT_READY         0x001840FE      /* controller not ready error */
-#define        ERR32_SETUP_FLASH       0x00195050      /* error when writing setup to flash memory */
-#define        ERR32_SETUP_SIZE        0x001A5051      /* setup block size error */
-#define        ERR32_SENSE                     0x001BFFFF      /* sense opereration failed */
-#define        ERR32_SC_BUSY           0x001C0008      /* SCSI status - Busy */
-#define        ERR32_SC_RES_CONFL      0x001D0018      /* SCSI status - Reservation Conflict */
-#define        ERR32_SC_CMD_TERM       0x001E0022      /* SCSI status - Command Terminated */
-#define        ERR32_SC_OTHER          0x001F00FF      /* SCSI status - not recognized (any value masked) */
-#define        ERR32_MEDIA_CHANGED     0x00208001      /* devices media has been changed */
-
-/************************************************/
-/*                                                                                             */
-/*     Host Operating System specification codes       */
-/*                                                                                             */
-/************************************************/
-#define        SPEC_INTERRUPT          0x80            /* specification requires host interrupt */
-#define        SPEC_BACKWARD_SG        0x40            /* specification requires scatter/gather items reversed */
-#define        SPEC_DOS_BLOCK          0x01            /* DOS DASD blocking on pass through */
-#define        SPEC_OS2_V3                     0x02            /* OS/2 Warp */
-#define        SPCE_SCO_3242           0x04            /* SCO 3.4.2.2 */
-#define        SPEC_QNX_4X                     0x05            /* QNX 4.XX */
-#define        SPEC_NOVELL_NWPA        0x08            /* Novell NWPA scatter/gather support */
-
-/************************************************/
-/*                                                                                             */
-/*     Inquire structures                                                      */
-/*                                                                                             */
-/************************************************/
-typedef        struct  _CNT_SCSI_INQ
-       {
-       UCHAR   devt;                                           /* 00: device type */
-       UCHAR   devtm;                                          /* 01: device type modifier */
-       UCHAR   svers;                                          /* 02: SCSI version */
-       UCHAR   rfmt;                                           /* 03: response data format */
-       UCHAR   adlen;                                          /* 04: additional length of data */
-       UCHAR   res1;                                           /* 05: */
-       UCHAR   res2;                                           /* 06: */
-       UCHAR   fncs;                                           /* 07: functional capabilities */
-       UCHAR   vid[8];                                         /* 08: vendor ID */
-       UCHAR   pid[16];                                        /* 10: product ID */
-       UCHAR   rev[4];                                         /* 20: product revision */
-       }       CNT_SCSI_INQ;
-
-typedef        struct  _CNT_IDE_INQ
-       {
-       USHORT  GeneralConfiguration;           /* 00 */
-       USHORT  NumberOfCylinders;                      /* 02 */
-       USHORT  Reserved1;                                      /* 04 */
-       USHORT  NumberOfHeads;                          /* 06 */
-       USHORT  UnformattedBytesPerTrack;       /* 08 */
-       USHORT  UnformattedBytesPerSector;      /* 0A */
-       USHORT  SectorsPerTrack;                        /* 0C */
-       USHORT  VendorUnique1[3];                       /* 0E */
-       USHORT  SerialNumber[10];                       /* 14 */
-       USHORT  BufferType;                                     /* 28 */
-       USHORT  BufferSectorSize;                       /* 2A */
-       USHORT  NumberOfEccBytes;                       /* 2C */
-       USHORT  FirmwareRevision[4];            /* 2E */
-       USHORT  ModelNumber[20];                        /* 36 */
-       UCHAR   MaximumBlockTransfer;           /* 5E */
-       UCHAR   VendorUnique2;                          /* 5F */
-       USHORT  DoubleWordIo;                           /* 60 */
-       USHORT  Capabilities;                           /* 62 */
-       USHORT  Reserved2;                                      /* 64 */
-       UCHAR   VendorUnique3;                          /* 66 */
-       UCHAR   PioCycleTimingMode;                     /* 67 */
-       UCHAR   VendorUnique4;                          /* 68 */
-       UCHAR   DmaCycleTimingMode;                     /* 69 */
-       USHORT  TranslationFieldsValid;         /* 6A */
-       USHORT  NumberOfCurrentCylinders;       /* 6C */
-       USHORT  NumberOfCurrentHeads;           /* 6E */
-       USHORT  CurrentSectorsPerTrack;         /* 70 */
-       ULONG   CurrentSectorCapacity;          /* 72 */
-       }       CNT_IDE_INQ;
-
-typedef struct _DASD_INQUIRE
-       {
-       ULONG   type;                                           /* 0 = SCSI, 1 = IDE */
-       union
-               {
-               CNT_SCSI_INQ    scsi;                   /* SCSI inquire data */
-               CNT_IDE_INQ             ide;                    /* IDE inquire data */
-               }       inq;
-       }       DASD_INQUIRE;
-
-/************************************************/
-/*                                                                                             */
-/*     Device Codes                                                            */
-/*                                                                                             */
-/************************************************/
-#define DEVC_DASD                      0x00            /* Direct-access Storage Device */
-#define DEVC_SEQACESS          0x01            /* Sequential-access device */
-#define DEVC_PRINTER           0x02            /* Printer device */
-#define DEVC_PROCESSOR         0x03            /* Processor device */
-#define DEVC_WRITEONCE         0x04            /* Write-once device */
-#define DEVC_CDROM                     0x05            /* CD-ROM device */
-#define DEVC_SCANNER           0x06            /* Scanner device */
-#define DEVC_OPTICAL           0x07            /* Optical memory device */
-#define DEVC_MEDCHGR           0x08            /* Medium changer device */
-#define        DEVC_DASD_REMOVABLE     0x80            /* Direct-access storage device, Removable */
-#define        DEVC_NONE                       0xFF            /* no device */
-
-// SCSI controls for RAID
-#define        SC_MY_RAID                      0xBF                    // our special CDB command byte for Win95... interface
-#define        MY_SCSI_QUERY0          0x31                    // byte 1 subcommand to query driver for RAID 0 informatation
-#define        MY_SCSI_QUERY1          0x32                    // byte 1 subcommand to query driver for RAID 1 informatation
-#define        MY_SCSI_QUERY5          0x33                    // byte 1 subcommand to query driver for RAID 5 informatation
-#define        MY_SCSI_REBUILD         0x40                    // byte 1 subcommand to reconstruct a mirrored pair
-#define MY_SCSI_DEMOFAIL       0x54                    // byte 1 subcommand for RAID failure demonstration
-#define        MY_SCSI_ALARMMUTE       0x60                    // byte 1 subcommand to mute any alarm currently on
-
-
-#endif
-