summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFlorian Lohoff <flo@rfc822.org>2000-08-19 23:55:41 +0000
committerFlorian Lohoff <flo@rfc822.org>2000-08-19 23:55:41 +0000
commitc000717cfb212706ad81798fcce0f98b1e756a18 (patch)
treebc12de02825e202e8305feddebad3eaf514ec4a4 /drivers
parentdd458fcabd000a41fdcf52351c8c7cabd79522c9 (diff)
First set of PMAZ-AA fixes - Still not reliable in Multi-PMAZ-AA setups as
still some global vars get used - but a start
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/dec_esp.c73
1 files changed, 27 insertions, 46 deletions
diff --git a/drivers/scsi/dec_esp.c b/drivers/scsi/dec_esp.c
index 25c3cad17..6aaf8c1a4 100644
--- a/drivers/scsi/dec_esp.c
+++ b/drivers/scsi/dec_esp.c
@@ -9,6 +9,12 @@
* Copyright (C) 1997 Thomas Bogendoerfer (tsbogend@alpha.franken.de)
*
* jazz_esp is based on David S. Miller's ESP driver and cyber_esp
+ *
+ * 20000819 - Small PMAZ-AA fixes by Florian Lohoff <flo@rfc822.org>
+ * Be warned the PMAZ-AA works currently as a single card.
+ * Dont try to put multiple cards in one machine - They are
+ * both detected but it may crash under high load garbling your
+ * data.
*/
#include <linux/kernel.h>
@@ -45,8 +51,6 @@
* starting point. #define this an be prepared for tons
* of warnings and errors :)
*/
-#undef PMAZ_A
-
static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count);
static void dma_drain(struct NCR_ESP *esp);
static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd * sp);
@@ -62,7 +66,6 @@ static void dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp);
static void dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp);
static void dma_advance_sg(Scsi_Cmnd * sp);
-#ifdef PMAZ_A
static void pmaz_dma_drain(struct NCR_ESP *esp);
static void pmaz_dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length);
static void pmaz_dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length);
@@ -70,10 +73,6 @@ static void pmaz_dma_ints_off(struct NCR_ESP *esp);
static void pmaz_dma_ints_on(struct NCR_ESP *esp);
static void pmaz_dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write);
static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp);
-static void pmaz_dma_mmu_get_scsi_sgl(struct NCR_ESP *esp, Scsi_Cmnd * sp);
-
-volatile int *scsi_pmaz_dma_ptr_tc;
-#endif
#define TC_ESP_RAM_SIZE 0x20000
#define ESP_TGT_DMA_SIZE ((TC_ESP_RAM_SIZE/7) & ~(sizeof(int)-1))
@@ -83,9 +82,6 @@ volatile int *scsi_pmaz_dma_ptr_tc;
#define TC_ESP_DMAR_WRITE 0x80000000
#define TC_ESP_DMA_ADDR(x) ((unsigned)(x) & TC_ESP_DMAR_MASK)
-volatile unsigned char *scsi_pmaz_dma_ptrs_tc[ESP_NCMD];
-unsigned char scsi_pmaz_dma_buff_used[ESP_NCMD];
-unsigned char scsi_cur_buff = 1; /* Leave space for command buffer */
__u32 esp_virt_buffer;
int scsi_current_length = 0;
@@ -110,11 +106,8 @@ int dec_esp_detect(Scsi_Host_Template * tpnt)
{
struct NCR_ESP *esp;
struct ConfigDev *esp_dev;
-#ifdef PMAZ_A
- int slot, i;
+ int slot;
unsigned long mem_start;
- volatile unsigned char *buffer;
-#endif
if (IOASIC) {
esp_dev = 0;
@@ -156,8 +149,8 @@ int dec_esp_detect(Scsi_Host_Template * tpnt)
/* virtual DMA functions */
esp->dma_mmu_get_scsi_one = &dma_mmu_get_scsi_one;
esp->dma_mmu_get_scsi_sgl = &dma_mmu_get_scsi_sgl;
- esp->dma_mmu_release_scsi_one = 0;
- esp->dma_mmu_release_scsi_sgl = 0;
+ esp->dma_mmu_release_scsi_one = 0;
+ esp->dma_mmu_release_scsi_sgl = 0;
esp->dma_advance_sg = &dma_advance_sg;
@@ -195,15 +188,18 @@ int dec_esp_detect(Scsi_Host_Template * tpnt)
}
-#ifdef PMAZ_A
if (TURBOCHANNEL) {
- while ((slot = search_tc_card("PMAZ_AA")) >= 0) {
+ while ((slot = search_tc_card("PMAZ-AA")) >= 0) {
claim_tc_card(slot);
- mem_start = get_tc_base_addr(slot);
esp_dev = 0;
esp = esp_allocate(tpnt, (void *) esp_dev);
+ mem_start = get_tc_base_addr(slot);
+
+ /* Store base addr into esp struct */
+ esp->slot = mem_start;
+
esp->dregs = 0;
esp->eregs = (struct ESP_regs *) (mem_start + DEC_SCSI_SREG);
esp->do_pio_cmds = 1;
@@ -214,16 +210,6 @@ int dec_esp_detect(Scsi_Host_Template * tpnt)
/* get virtual dma address for command buffer */
esp->esp_command_dvma = (__u32) KSEG0ADDR((volatile unsigned char *) pmaz_cmd_buffer);
- buffer = (volatile unsigned char *) (mem_start + DEC_SCSI_SRAM);
-
- scsi_pmaz_dma_ptr_tc = (volatile int *) (mem_start + DEC_SCSI_DMAREG);
-
- for (i = 0; i < ESP_NCMD; i++) {
- scsi_pmaz_dma_ptrs_tc[i] = (volatile unsigned char *) (buffer + ESP_TGT_DMA_SIZE * i);
- }
-
- scsi_pmaz_dma_buff_used[0] = 1;
-
esp->cfreq = get_tc_speed();
esp->irq = get_tc_irq_nr(slot);
@@ -257,13 +243,12 @@ int dec_esp_detect(Scsi_Host_Template * tpnt)
esp->dma_mmu_release_scsi_sgl = 0;
esp->dma_advance_sg = 0;
- request_irq(esp->irq, esp_intr, SA_INTERRUPT, "PMAZ_AA", NULL);
+ request_irq(esp->irq, esp_intr, SA_INTERRUPT, "PMAZ-AA", NULL);
esp->scsi_id = 7;
esp->diff = 0;
esp_initialize(esp);
}
}
-#endif
if(nesps) {
printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps, esps_in_use);
@@ -462,30 +447,35 @@ static void dma_advance_sg(Scsi_Cmnd * sp)
sp->SCp.ptr = (char *) ((unsigned long) sp->SCp.buffer->dvma_address);
}
-#ifdef PMAZ_A
-
static void pmaz_dma_drain(struct NCR_ESP *esp)
{
memcpy((void *) (KSEG0ADDR(esp_virt_buffer)),
- (void *) scsi_pmaz_dma_ptrs_tc[scsi_cur_buff], scsi_current_length);
+ (void *) ( esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE),
+ scsi_current_length);
}
static void pmaz_dma_init_read(struct NCR_ESP *esp, __u32 vaddress, int length)
{
+ volatile int *dmareg = (volatile int *) (esp->slot + DEC_SCSI_DMAREG);
if (length > ESP_TGT_DMA_SIZE)
length = ESP_TGT_DMA_SIZE;
- *scsi_pmaz_dma_ptr_tc = TC_ESP_DMA_ADDR(scsi_pmaz_dma_ptrs_tc[scsi_cur_buff]);
+ *dmareg = TC_ESP_DMA_ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE);
+
esp_virt_buffer = vaddress;
scsi_current_length = length;
}
static void pmaz_dma_init_write(struct NCR_ESP *esp, __u32 vaddress, int length)
{
- memcpy((void *)scsi_pmaz_dma_ptrs_tc[scsi_cur_buff], KSEG0ADDR((void *) vaddress), length);
+ volatile int *dmareg = (volatile int *) ( esp->slot + DEC_SCSI_DMAREG );
- *scsi_pmaz_dma_ptr_tc = TC_ESP_DMAR_WRITE | TC_ESP_DMA_ADDR(scsi_pmaz_dma_ptrs_tc[scsi_cur_buff]);
+ memcpy((void *) (esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE),
+ KSEG0ADDR((void *) vaddress), length);
+
+ *dmareg = TC_ESP_DMAR_WRITE |
+ TC_ESP_DMA_ADDR(esp->slot + DEC_SCSI_SRAM + ESP_TGT_DMA_SIZE);
}
@@ -510,18 +500,9 @@ static void pmaz_dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write
}
}
-static void pmaz_dma_mmu_release_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp)
-{
- int x;
- for (x = 1; x < 6; x++)
- if (sp->SCp.have_data_in == PHYSADDR(scsi_pmaz_dma_ptrs_tc[x]))
- scsi_pmaz_dma_buff_used[x] = 0;
-}
-
static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP *esp, Scsi_Cmnd * sp)
{
sp->SCp.have_data_in = (int) sp->SCp.ptr =
(char *) KSEG0ADDR((sp->request_buffer));
}
-#endif \ No newline at end of file