patch-2.4.20 linux-2.4.20/drivers/scsi/dec_esp.c
Next file: linux-2.4.20/drivers/scsi/dpt_i2o.c
Previous file: linux-2.4.20/drivers/scsi/cpqioctl.c
Back to the patch index
Back to the overall index
- Lines: 202
- Date:
Thu Nov 28 15:53:14 2002
- Orig file:
linux-2.4.19/drivers/scsi/dec_esp.c
- Orig date:
Sun Sep 9 10:52:35 2001
diff -urN linux-2.4.19/drivers/scsi/dec_esp.c linux-2.4.20/drivers/scsi/dec_esp.c
@@ -46,6 +46,8 @@
#include <asm/dec/ioasic_ints.h>
#include <asm/dec/machtype.h>
+#include <asm/system.h>
+
/*
* 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 *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 @@
/* 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 @@
esp_initialize(esp);
if (request_irq(esp->irq, esp_intr, SA_INTERRUPT,
- "NCR 53C94 SCSI", NULL))
+ "ncr53c94", NULL))
goto err_dealloc;
- if (request_irq(SCSI_DMA_INT, scsi_dma_int, SA_INTERRUPT,
- "JUNKIO SCSI DMA", NULL))
+ 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 @@
}
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_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 @@
/* 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 @@
/* 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 @@
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 @@
*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 @@
*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)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)