diff options
| -rw-r--r-- | drivers/scsi/a3000.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/drivers/scsi/a3000.c b/drivers/scsi/a3000.c index ae9b25a3e3e7..eabc41b65dad 100644 --- a/drivers/scsi/a3000.c +++ b/drivers/scsi/a3000.c | |||
| @@ -22,22 +22,21 @@ | |||
| 22 | #include <linux/stat.h> | 22 | #include <linux/stat.h> |
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | static struct Scsi_Host *a3000_host = NULL; | ||
| 26 | |||
| 27 | static int a3000_release(struct Scsi_Host *instance); | 25 | static int a3000_release(struct Scsi_Host *instance); |
| 28 | 26 | ||
| 29 | static irqreturn_t a3000_intr(int irq, void *dummy) | 27 | static irqreturn_t a3000_intr(int irq, void *data) |
| 30 | { | 28 | { |
| 31 | a3000_scsiregs *regs = (a3000_scsiregs *)(a3000_host->base); | 29 | struct Scsi_Host *instance = data; |
| 30 | a3000_scsiregs *regs = (a3000_scsiregs *)(instance->base); | ||
| 32 | unsigned int status = regs->ISTR; | 31 | unsigned int status = regs->ISTR; |
| 33 | unsigned long flags; | 32 | unsigned long flags; |
| 34 | 33 | ||
| 35 | if (!(status & ISTR_INT_P)) | 34 | if (!(status & ISTR_INT_P)) |
| 36 | return IRQ_NONE; | 35 | return IRQ_NONE; |
| 37 | if (status & ISTR_INTS) { | 36 | if (status & ISTR_INTS) { |
| 38 | spin_lock_irqsave(a3000_host->host_lock, flags); | 37 | spin_lock_irqsave(instance->host_lock, flags); |
| 39 | wd33c93_intr(a3000_host); | 38 | wd33c93_intr(instance); |
| 40 | spin_unlock_irqrestore(a3000_host->host_lock, flags); | 39 | spin_unlock_irqrestore(instance->host_lock, flags); |
| 41 | return IRQ_HANDLED; | 40 | return IRQ_HANDLED; |
| 42 | } | 41 | } |
| 43 | printk("Non-serviced A3000 SCSI-interrupt? ISTR = %02x\n", status); | 42 | printk("Non-serviced A3000 SCSI-interrupt? ISTR = %02x\n", status); |
| @@ -46,8 +45,9 @@ static irqreturn_t a3000_intr(int irq, void *dummy) | |||
| 46 | 45 | ||
| 47 | static int dma_setup(struct scsi_cmnd *cmd, int dir_in) | 46 | static int dma_setup(struct scsi_cmnd *cmd, int dir_in) |
| 48 | { | 47 | { |
| 49 | struct WD33C93_hostdata *hdata = shost_priv(a3000_host); | 48 | struct Scsi_Host *instance = cmd->device->host; |
| 50 | a3000_scsiregs *regs = (a3000_scsiregs *)(a3000_host->base); | 49 | struct WD33C93_hostdata *hdata = shost_priv(instance); |
| 50 | a3000_scsiregs *regs = (a3000_scsiregs *)(instance->base); | ||
| 51 | unsigned short cntr = CNTR_PDMD | CNTR_INTEN; | 51 | unsigned short cntr = CNTR_PDMD | CNTR_INTEN; |
| 52 | unsigned long addr = virt_to_bus(cmd->SCp.ptr); | 52 | unsigned long addr = virt_to_bus(cmd->SCp.ptr); |
| 53 | 53 | ||
| @@ -164,6 +164,7 @@ static void dma_stop(struct Scsi_Host *instance, struct scsi_cmnd *SCpnt, | |||
| 164 | 164 | ||
| 165 | static int __init a3000_detect(struct scsi_host_template *tpnt) | 165 | static int __init a3000_detect(struct scsi_host_template *tpnt) |
| 166 | { | 166 | { |
| 167 | struct Scsi_Host *instance; | ||
| 167 | wd33c93_regs wdregs; | 168 | wd33c93_regs wdregs; |
| 168 | a3000_scsiregs *regs; | 169 | a3000_scsiregs *regs; |
| 169 | struct WD33C93_hostdata *hdata; | 170 | struct WD33C93_hostdata *hdata; |
| @@ -176,31 +177,30 @@ static int __init a3000_detect(struct scsi_host_template *tpnt) | |||
| 176 | tpnt->proc_name = "A3000"; | 177 | tpnt->proc_name = "A3000"; |
| 177 | tpnt->proc_info = &wd33c93_proc_info; | 178 | tpnt->proc_info = &wd33c93_proc_info; |
| 178 | 179 | ||
| 179 | a3000_host = scsi_register(tpnt, sizeof(struct WD33C93_hostdata)); | 180 | instance = scsi_register(tpnt, sizeof(struct WD33C93_hostdata)); |
| 180 | if (a3000_host == NULL) | 181 | if (instance == NULL) |
| 181 | goto fail_register; | 182 | goto fail_register; |
| 182 | 183 | ||
| 183 | a3000_host->base = ZTWO_VADDR(0xDD0000); | 184 | instance->base = ZTWO_VADDR(0xDD0000); |
| 184 | a3000_host->irq = IRQ_AMIGA_PORTS; | 185 | instance->irq = IRQ_AMIGA_PORTS; |
| 185 | regs = (a3000_scsiregs *)(a3000_host->base); | 186 | regs = (a3000_scsiregs *)(instance->base); |
| 186 | regs->DAWR = DAWR_A3000; | 187 | regs->DAWR = DAWR_A3000; |
| 187 | wdregs.SASR = ®s->SASR; | 188 | wdregs.SASR = ®s->SASR; |
| 188 | wdregs.SCMD = ®s->SCMD; | 189 | wdregs.SCMD = ®s->SCMD; |
| 189 | hdata = shost_priv(a3000_host); | 190 | hdata = shost_priv(instance); |
| 190 | hdata->no_sync = 0xff; | 191 | hdata->no_sync = 0xff; |
| 191 | hdata->fast = 0; | 192 | hdata->fast = 0; |
| 192 | hdata->dma_mode = CTRL_DMA; | 193 | hdata->dma_mode = CTRL_DMA; |
| 193 | wd33c93_init(a3000_host, wdregs, dma_setup, dma_stop, | 194 | wd33c93_init(instance, wdregs, dma_setup, dma_stop, WD33C93_FS_12_15); |
| 194 | WD33C93_FS_12_15); | ||
| 195 | if (request_irq(IRQ_AMIGA_PORTS, a3000_intr, IRQF_SHARED, "A3000 SCSI", | 195 | if (request_irq(IRQ_AMIGA_PORTS, a3000_intr, IRQF_SHARED, "A3000 SCSI", |
| 196 | a3000_intr)) | 196 | instance)) |
| 197 | goto fail_irq; | 197 | goto fail_irq; |
| 198 | regs->CNTR = CNTR_PDMD | CNTR_INTEN; | 198 | regs->CNTR = CNTR_PDMD | CNTR_INTEN; |
| 199 | 199 | ||
| 200 | return 1; | 200 | return 1; |
| 201 | 201 | ||
| 202 | fail_irq: | 202 | fail_irq: |
| 203 | scsi_unregister(a3000_host); | 203 | scsi_unregister(instance); |
| 204 | fail_register: | 204 | fail_register: |
| 205 | release_mem_region(0xDD0000, 256); | 205 | release_mem_region(0xDD0000, 256); |
| 206 | return 0; | 206 | return 0; |
