diff options
author | Florian Lohoff <flo@rfc822.org> | 2000-08-19 23:55:41 +0000 |
---|---|---|
committer | Florian Lohoff <flo@rfc822.org> | 2000-08-19 23:55:41 +0000 |
commit | c000717cfb212706ad81798fcce0f98b1e756a18 (patch) | |
tree | bc12de02825e202e8305feddebad3eaf514ec4a4 /drivers | |
parent | dd458fcabd000a41fdcf52351c8c7cabd79522c9 (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.c | 73 |
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 |