diff -urpN --exclude-from=/home/davej/.exclude bk-linus/drivers/scsi/dec_esp.c linux-2.5/drivers/scsi/dec_esp.c --- bk-linus/drivers/scsi/dec_esp.c 2002-11-21 02:17:55.000000000 +0000 +++ linux-2.5/drivers/scsi/dec_esp.c 2002-11-21 18:00:37.000000000 +0000 @@ -46,6 +46,8 @@ #include #include +#include + /* * Once upon a time the pmaz code used to be working but * it hasn't been maintained for quite some time. @@ -101,6 +103,8 @@ volatile unsigned long *ioasic_ssr; volatile unsigned long *scsi_sdr0; volatile unsigned long *scsi_sdr1; +static void scsi_dma_merr_int(int, void *, struct pt_regs *); +static void scsi_dma_err_int(int, void *, struct pt_regs *); static void scsi_dma_int(int, void *, struct pt_regs *); static Scsi_Host_Template driver_template = SCSI_DEC_ESP; @@ -179,7 +183,7 @@ int dec_esp_detect(Scsi_Host_Template * /* get virtual dma address for command buffer */ esp->esp_command_dvma = (__u32) KSEG1ADDR((volatile unsigned char *) cmd_buffer); - esp->irq = SCSI_INT; + esp->irq = dec_interrupt[DEC_IRQ_ASC]; esp->scsi_id = 7; @@ -189,11 +193,20 @@ int dec_esp_detect(Scsi_Host_Template * esp_initialize(esp); if (request_irq(esp->irq, esp_intr, SA_INTERRUPT, - "NCR 53C94 SCSI", esp->ehost)) + "ncr53c94", esp->ehost)) goto err_dealloc; - if (request_irq(SCSI_DMA_INT, scsi_dma_int, SA_INTERRUPT, - "JUNKIO SCSI DMA", esp->ehost)) + if (request_irq(dec_interrupt[DEC_IRQ_ASC_MERR], + scsi_dma_merr_int, SA_INTERRUPT, + "ncr53c94 error", NULL)) goto err_free_irq; + if (request_irq(dec_interrupt[DEC_IRQ_ASC_ERR], + scsi_dma_err_int, SA_INTERRUPT, + "ncr53c94 overrun", NULL)) + goto err_free_irq_merr; + if (request_irq(dec_interrupt[DEC_IRQ_ASC_DMA], + scsi_dma_int, SA_INTERRUPT, + "ncr53c94 dma", NULL)) + goto err_free_irq_err; } @@ -271,41 +284,35 @@ int dec_esp_detect(Scsi_Host_Template * } return 0; - err_free_irq: +err_free_irq_err: + free_irq(dec_interrupt[DEC_IRQ_ASC_ERR], scsi_dma_err_int); +err_free_irq_merr: + free_irq(dec_interrupt[DEC_IRQ_ASC_MERR], scsi_dma_merr_int); +err_free_irq: free_irq(esp->irq, esp_intr); - err_dealloc: +err_dealloc: esp_deallocate(esp); return 0; } /************************************************************* DMA Functions */ -static void scsi_dma_int(int irq, void *dev_id, struct pt_regs *regs) +static void scsi_dma_merr_int(int irq, void *dev_id, struct pt_regs *regs) { - extern volatile unsigned int *isr; - unsigned int dummy; + printk("Got unexpected SCSI DMA Interrupt! < "); + printk("SCSI_DMA_MEMRDERR "); + printk(">\n"); +} - if (*isr & SCSI_PTR_LOADED) { - /* next page */ - *scsi_next_ptr = ((*scsi_dma_ptr + PAGE_SIZE) & PAGE_MASK) << 3; - *isr &= ~SCSI_PTR_LOADED; - } else { - if (*isr & SCSI_PAGOVRRUN) - *isr &= ~SCSI_PAGOVRRUN; - if (*isr & SCSI_DMA_MEMRDERR) { - printk("Got unexpected SCSI DMA Interrupt! < "); - printk("SCSI_DMA_MEMRDERR "); - printk(">\n"); - *isr &= ~SCSI_DMA_MEMRDERR; - } - } +static void scsi_dma_err_int(int irq, void *dev_id, struct pt_regs *regs) +{ + /* empty */ +} - /* - * This routine will only work on IOASIC machines - * so we can avoid an indirect function call here - * and flush the writeback buffer the fast way - */ - dummy = *isr; - dummy = *isr; +static void scsi_dma_int(int irq, void *dev_id, struct pt_regs *regs) +{ + /* next page */ + *scsi_next_ptr = ((*scsi_dma_ptr + PAGE_SIZE) & PAGE_MASK) << 3; + fast_iob(); } static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count) @@ -357,9 +364,6 @@ static void dma_dump_state(struct NCR_ES static void dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length) { - extern volatile unsigned int *isr; - unsigned int dummy; - if (vaddress & 3) panic("dec_efs.c: unable to handle partial word transfers, yet..."); @@ -372,19 +376,11 @@ static void dma_init_read(struct NCR_ESP /* prepare for next page */ *scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3; *ioasic_ssr |= (SCSI_DMA_DIR | SCSI_DMA_EN); - - /* - * see above - */ - dummy = *isr; - dummy = *isr; + fast_iob(); } static void dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length) { - extern volatile unsigned int *isr; - unsigned int dummy; - if (vaddress & 3) panic("dec_efs.c: unable to handle partial word transfers, yet..."); @@ -397,22 +393,17 @@ static void dma_init_write(struct NCR_ES /* prepare for next page */ *scsi_next_ptr = ((vaddress + PAGE_SIZE) & PAGE_MASK) << 3; *ioasic_ssr |= SCSI_DMA_EN; - - /* - * see above - */ - dummy = *isr; - dummy = *isr; + fast_iob(); } static void dma_ints_off(struct NCR_ESP *esp) { - disable_irq(SCSI_DMA_INT); + disable_irq(dec_interrupt[DEC_IRQ_ASC_DMA]); } static void dma_ints_on(struct NCR_ESP *esp) { - enable_irq(SCSI_DMA_INT); + enable_irq(dec_interrupt[DEC_IRQ_ASC_DMA]); } static int dma_irq_p(struct NCR_ESP *esp) @@ -459,12 +450,12 @@ static void dma_mmu_get_scsi_sgl(struct sg[sz].dvma_addr = PHYSADDR(sg[sz].addr); sz--; } - sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dvma_address); + sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dma_address); } static void dma_advance_sg(Scsi_Cmnd * sp) { - sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dvma_address); + sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dma_address); } static void pmaz_dma_drain(struct NCR_ESP *esp) @@ -483,6 +474,8 @@ static void pmaz_dma_init_read(struct NC *dmareg = TC_ESP_DMA_ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE); + iob(); + esp_virt_buffer = vaddress; scsi_current_length = length; } @@ -497,6 +490,7 @@ static void pmaz_dma_init_write(struct N *dmareg = TC_ESP_DMAR_WRITE | TC_ESP_DMA_ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE); + iob(); } static void pmaz_dma_ints_off(struct NCR_ESP *esp)