vserver 1.9.5.x5
[linux-2.6.git] / drivers / scsi / t128.c
index 7e73fc2..6dc2897 100644 (file)
@@ -199,6 +199,7 @@ int __init t128_detect(Scsi_Host_Template * tpnt){
     static int current_override = 0, current_base = 0;
     struct Scsi_Host *instance;
     unsigned long base;
+    void __iomem *p;
     int sig, count;
 
     tpnt->proc_name = "t128";
@@ -206,26 +207,34 @@ int __init t128_detect(Scsi_Host_Template * tpnt){
 
     for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
        base = 0;
+       p = NULL;
 
-       if (overrides[current_override].address)
+       if (overrides[current_override].address) {
            base = overrides[current_override].address;
-       else 
+           p = ioremap(bases[current_base].address, 0x2000);
+           if (!p)
+               base = 0;
+       } else 
            for (; !base && (current_base < NO_BASES); ++current_base) {
 #if (TDEBUG & TDEBUG_INIT)
     printk("scsi-t128 : probing address %08x\n", bases[current_base].address);
 #endif
+               if (bases[current_base].noauto)
+                       continue;
+               p = ioremap(bases[current_base].address, 0x2000);
+               if (!p)
+                       continue;
                for (sig = 0; sig < NO_SIGNATURES; ++sig) 
-                   if (!bases[current_base].noauto && 
-                       isa_check_signature(bases[current_base].address +
-                                       signatures[sig].offset,
+                   if (check_signature(p + signatures[sig].offset,
                                        signatures[sig].string,
                                        strlen(signatures[sig].string))) {
                        base = bases[current_base].address;
 #if (TDEBUG & TDEBUG_INIT)
                        printk("scsi-t128 : detected board.\n");
 #endif
-                       break;
+                       goto found;
                    }
+               iounmap(p);
            }
 
 #if defined(TDEBUG) && (TDEBUG & TDEBUG_INIT)
@@ -235,11 +244,13 @@ int __init t128_detect(Scsi_Host_Template * tpnt){
        if (!base)
            break;
 
+found:
        instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
        if(instance == NULL)
                break;
                
        instance->base = base;
+       ((struct NCR5380_hostdata *)instance->hostdata)->base = p;
 
        NCR5380_init(instance, 0);
 
@@ -282,12 +293,15 @@ int __init t128_detect(Scsi_Host_Template * tpnt){
 
 static int t128_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;
 }
 
@@ -335,28 +349,30 @@ int t128_biosparam(struct scsi_device *sdev, struct block_device *bdev,
 
 static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst,
     int len) {
-    unsigned long reg = instance->base + T_DATA_REG_OFFSET;
+    NCR5380_local_declare();
+    void __iomem *reg;
     unsigned char *d = dst;
     register int i = len;
 
+    NCR5380_setup(instance);
+    reg = base + T_DATA_REG_OFFSET;
 
 #if 0
     for (; i; --i) {
-       while (!(isa_readb(instance->base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
+       while (!(readb(base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
 #else
-    while (!(isa_readb(instance->base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
+    while (!(readb(base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
     for (; i; --i) {
 #endif
-       *d++ = isa_readb(reg);
+       *d++ = readb(reg);
     }
 
-    if (isa_readb(instance->base + T_STATUS_REG_OFFSET) & T_ST_TIM) {
+    if (readb(base + T_STATUS_REG_OFFSET) & T_ST_TIM) {
        unsigned char tmp;
-       unsigned long foo;
-       foo = instance->base + T_CONTROL_REG_OFFSET;
-       tmp = isa_readb(foo);
-       isa_writeb(tmp | T_CR_CT, foo);
-       isa_writeb(tmp, foo);
+       void __iomem *foo = base + T_CONTROL_REG_OFFSET;
+       tmp = readb(foo);
+       writeb(tmp | T_CR_CT, foo);
+       writeb(tmp, foo);
        printk("scsi%d : watchdog timer fired in NCR5380_pread()\n",
            instance->host_no);
        return -1;
@@ -379,27 +395,30 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst,
 
 static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src,
     int len) {
-    unsigned long reg = instance->base + T_DATA_REG_OFFSET;
+    NCR5380_local_declare();
+    void __iomem *reg;
     unsigned char *s = src;
     register int i = len;
 
+    NCR5380_setup(instance);
+    reg = base + T_DATA_REG_OFFSET;
+
 #if 0
     for (; i; --i) {
-       while (!(isa_readb(instance->base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
+       while (!(readb(base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
 #else
-    while (!(isa_readb(instance->base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
+    while (!(readb(base+T_STATUS_REG_OFFSET) & T_ST_RDY)) barrier();
     for (; i; --i) {
 #endif
-       isa_writeb(*s++, reg);
+       writeb(*s++, reg);
     }
 
-    if (isa_readb(instance->base + T_STATUS_REG_OFFSET) & T_ST_TIM) {
+    if (readb(base + T_STATUS_REG_OFFSET) & T_ST_TIM) {
        unsigned char tmp;
-       unsigned long foo;
-       foo = instance->base + T_CONTROL_REG_OFFSET;
-       tmp = isa_readb(foo);
-       isa_writeb(tmp | T_CR_CT, foo);
-       isa_writeb(tmp, foo);
+       void __iomem *foo = base + T_CONTROL_REG_OFFSET;
+       tmp = readb(foo);
+       writeb(tmp | T_CR_CT, foo);
+       writeb(tmp, foo);
        printk("scsi%d : watchdog timer fired in NCR5380_pwrite()\n",
            instance->host_no);
        return -1;