Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / scsi / dtc.c
index 820ac1f..310d2f4 100644 (file)
@@ -84,7 +84,7 @@
 #include <linux/interrupt.h>
 #include <asm/io.h>
 #include "scsi.h"
-#include "hosts.h"
+#include <scsi/scsi_host.h>
 #include "dtc.h"
 #define AUTOPROBE_IRQ
 #include "NCR5380.h"
 
 #define DTC_PUBLIC_RELEASE 2
 
-/*#define DTCDEBUG 0x1*/
-#define DTCDEBUG_INIT  0x1
-#define DTCDEBUG_TRANSFER 0x2
-
 /*
  * The DTC3180 & 3280 boards are memory mapped.
  * 
@@ -203,7 +199,7 @@ static void __init dtc_setup(char *str, int *ints)
 #endif
 
 /* 
- * Function : int dtc_detect(Scsi_Host_Template * tpnt)
+ * Function : int dtc_detect(struct scsi_host_template * tpnt)
  *
  * Purpose : detects and initializes DTC 3180/3280 controllers
  *     that were autoprobed, overridden on the LILO command line, 
@@ -215,48 +211,62 @@ static void __init dtc_setup(char *str, int *ints)
  *
 */
 
-static int __init dtc_detect(Scsi_Host_Template * tpnt)
+static int __init dtc_detect(struct scsi_host_template * tpnt)
 {
        static int current_override = 0, current_base = 0;
        struct Scsi_Host *instance;
-       unsigned int base;
+       unsigned int addr;
+       void __iomem *base;
        int sig, count;
 
        tpnt->proc_name = "dtc3x80";
        tpnt->proc_info = &dtc_proc_info;
 
        for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
-               base = 0;
-
-               if (overrides[current_override].address)
-                       base = overrides[current_override].address;
-               else
-                       for (; !base && (current_base < NO_BASES); ++current_base) {
+               addr = 0;
+               base = NULL;
+
+               if (overrides[current_override].address) {
+                       addr = overrides[current_override].address;
+                       base = ioremap(addr, 0x2000);
+                       if (!base)
+                               addr = 0;
+               } else
+                       for (; !addr && (current_base < NO_BASES); ++current_base) {
 #if (DTCDEBUG & DTCDEBUG_INIT)
                                printk("scsi-dtc : probing address %08x\n", bases[current_base].address);
 #endif
-                               for (sig = 0; sig < NO_SIGNATURES; ++sig)
-                                       if (!bases[current_base].noauto && isa_check_signature(bases[current_base].address + signatures[sig].offset, signatures[sig].string, strlen(signatures[sig].string))) {
-                                               base = bases[current_base].address;
+                               if (bases[current_base].noauto)
+                                       continue;
+                               base = ioremap(bases[current_base].address, 0x2000);
+                               if (!base)
+                                       continue;
+                               for (sig = 0; sig < NO_SIGNATURES; ++sig) {
+                                       if (check_signature(base + signatures[sig].offset, signatures[sig].string, strlen(signatures[sig].string))) {
+                                               addr = bases[current_base].address;
 #if (DTCDEBUG & DTCDEBUG_INIT)
                                                printk("scsi-dtc : detected board.\n");
 #endif
-                                               break;
+                                               goto found;
                                        }
+                               }
+                               iounmap(base);
                        }
 
 #if defined(DTCDEBUG) && (DTCDEBUG & DTCDEBUG_INIT)
-               printk("scsi-dtc : base = %08x\n", base);
+               printk("scsi-dtc : base = %08x\n", addr);
 #endif
 
-               if (!base)
+               if (!addr)
                        break;
 
+found:
                instance = scsi_register(tpnt, sizeof(struct NCR5380_hostdata));
                if (instance == NULL)
                        break;
 
-               instance->base = base;
+               instance->base = addr;
+               ((struct NCR5380_hostdata *)(instance)->hostdata)->base = base;
 
                NCR5380_init(instance, 0);
 
@@ -372,7 +382,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst,
                while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY)
                        ++i;
                rtrc(3);
-               isa_memcpy_fromio(d, base + DTC_DATA_BUF, 128);
+               memcpy_fromio(d, base + DTC_DATA_BUF, 128);
                d += 128;
                len -= 128;
                rtrc(7);
@@ -423,7 +433,7 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
                while (NCR5380_read(DTC_CONTROL_REG) & CSR_HOST_BUF_NOT_RDY)
                        ++i;
                rtrc(3);
-               isa_memcpy_toio(base + DTC_DATA_BUF, src, 128);
+               memcpy_toio(base + DTC_DATA_BUF, src, 128);
                src += 128;
                len -= 128;
        }
@@ -449,23 +459,25 @@ MODULE_LICENSE("GPL");
 
 static int dtc_release(struct Scsi_Host *shost)
 {
+       NCR5380_local_declare();
+       NCR5380_setup(shost);
        if (shost->irq)
                free_irq(shost->irq, NULL);
+       NCR5380_exit(shost);
        if (shost->io_port && shost->n_io_port)
                release_region(shost->io_port, shost->n_io_port);
        scsi_unregister(shost);
+       iounmap(base);
        return 0;
 }
 
-static Scsi_Host_Template driver_template = {
+static struct scsi_host_template driver_template = {
        .name                           = "DTC 3180/3280 ",
        .detect                         = dtc_detect,
        .release                        = dtc_release,
        .queuecommand                   = dtc_queue_command,
        .eh_abort_handler               = dtc_abort,
        .eh_bus_reset_handler           = dtc_bus_reset,
-       .eh_device_reset_handler        = dtc_device_reset,
-       .eh_host_reset_handler          = dtc_host_reset,
        .bios_param                     = dtc_biosparam,
        .can_queue                      = CAN_QUEUE,
        .this_id                        = 7,