X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fscsi%2Ft128.c;h=6dc2897672a127822954853dfb32a792ce7a039f;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=7e73fc2579cc448390fa567f44e6e0277bcf71bb;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/scsi/t128.c b/drivers/scsi/t128.c index 7e73fc257..6dc289767 100644 --- a/drivers/scsi/t128.c +++ b/drivers/scsi/t128.c @@ -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;