2 * dec_esp.c: Driver for SCSI chips on IOASIC based TURBOchannel DECstations
3 * and TURBOchannel PMAZ-A cards
5 * TURBOchannel changes by Harald Koerfgen
6 * PMAZ-A support by David Airlie
9 * Copyright (C) 1997 Thomas Bogendoerfer (tsbogend@alpha.franken.de)
11 * jazz_esp is based on David S. Miller's ESP driver and cyber_esp
13 * 20000819 - Small PMAZ-AA fixes by Florian Lohoff <flo@rfc822.org>
14 * Be warned the PMAZ-AA works currently as a single card.
15 * Dont try to put multiple cards in one machine - They are
16 * both detected but it may crash under high load garbling your
18 * 20001005 - Initialization fixes for 2.4.0-test9
19 * Florian Lohoff <flo@rfc822.org>
22 #include <linux/kernel.h>
23 #include <linux/delay.h>
24 #include <linux/types.h>
25 #include <linux/string.h>
26 #include <linux/slab.h>
27 #include <linux/blkdev.h>
28 #include <linux/proc_fs.h>
29 #include <linux/stat.h>
32 #include <scsi/scsi_host.h>
37 #include <asm/jazzdma.h>
40 #include <asm/pgtable.h>
42 #include <asm/dec/tc.h>
43 #include <asm/dec/interrupts.h>
44 #include <asm/dec/ioasic_addrs.h>
45 #include <asm/dec/ioasic_ints.h>
46 #include <asm/dec/machtype.h>
48 #define DEC_SCSI_SREG 0
49 #define DEC_SCSI_DMAREG 0x40000
50 #define DEC_SCSI_SRAM 0x80000
51 #define DEC_SCSI_DIAG 0xC0000
54 * Once upon a time the pmaz code used to be working but
55 * it hasn't been maintained for quite some time.
56 * It isn't working anymore but I'll leave here as a
57 * starting point. #define this an be prepared for tons
58 * of warnings and errors :)
60 static int dma_bytes_sent(struct NCR_ESP
*esp
, int fifo_count
);
61 static void dma_drain(struct NCR_ESP
*esp
);
62 static int dma_can_transfer(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
);
63 static void dma_dump_state(struct NCR_ESP
*esp
);
64 static void dma_init_read(struct NCR_ESP
*esp
, __u32 vaddress
, int length
);
65 static void dma_init_write(struct NCR_ESP
*esp
, __u32 vaddress
, int length
);
66 static void dma_ints_off(struct NCR_ESP
*esp
);
67 static void dma_ints_on(struct NCR_ESP
*esp
);
68 static int dma_irq_p(struct NCR_ESP
*esp
);
69 static int dma_ports_p(struct NCR_ESP
*esp
);
70 static void dma_setup(struct NCR_ESP
*esp
, __u32 addr
, int count
, int write
);
71 static void dma_mmu_get_scsi_one(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
);
72 static void dma_mmu_get_scsi_sgl(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
);
73 static void dma_advance_sg(Scsi_Cmnd
* sp
);
75 static void pmaz_dma_drain(struct NCR_ESP
*esp
);
76 static void pmaz_dma_init_read(struct NCR_ESP
*esp
, __u32 vaddress
, int length
);
77 static void pmaz_dma_init_write(struct NCR_ESP
*esp
, __u32 vaddress
, int length
);
78 static void pmaz_dma_ints_off(struct NCR_ESP
*esp
);
79 static void pmaz_dma_ints_on(struct NCR_ESP
*esp
);
80 static void pmaz_dma_setup(struct NCR_ESP
*esp
, __u32 addr
, int count
, int write
);
81 static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
);
83 #define TC_ESP_RAM_SIZE 0x20000
84 #define ESP_TGT_DMA_SIZE ((TC_ESP_RAM_SIZE/7) & ~(sizeof(int)-1))
87 #define TC_ESP_DMAR_MASK 0x1ffff
88 #define TC_ESP_DMAR_WRITE 0x80000000
89 #define TC_ESP_DMA_ADDR(x) ((unsigned)(x) & TC_ESP_DMAR_MASK)
91 __u32 esp_virt_buffer
;
92 int scsi_current_length
;
94 volatile unsigned char cmd_buffer
[16];
95 volatile unsigned char pmaz_cmd_buffer
[16];
96 /* This is where all commands are put
97 * before they are trasfered to the ESP chip
101 volatile unsigned long *scsi_dma_ptr
;
102 volatile unsigned long *scsi_next_ptr
;
103 volatile unsigned long *scsi_scr
;
104 volatile unsigned long *ioasic_ssr
;
105 volatile unsigned long *scsi_sdr0
;
106 volatile unsigned long *scsi_sdr1
;
108 static void scsi_dma_int(int, void *, struct pt_regs
*);
110 int dec_esp_detect(Scsi_Host_Template
* tpnt
);
112 static int dec_esp_release(struct Scsi_Host
*shost
)
115 free_irq(shost
->irq
, NULL
);
116 if (shost
->io_port
&& shost
->n_io_port
)
117 release_region(shost
->io_port
, shost
->n_io_port
);
118 scsi_unregister(shost
);
122 static Scsi_Host_Template driver_template
= {
124 .proc_info
= &esp_proc_info
,
126 .detect
= dec_esp_detect
,
127 .slave_alloc
= esp_slave_alloc
,
128 .slave_destroy
= esp_slave_destroy
,
129 .release
= dec_esp_release
,
131 .queuecommand
= esp_queue
,
132 .eh_abort_handler
= esp_abort
,
133 .eh_bus_reset_handler
= esp_reset
,
136 .sg_tablesize
= SG_ALL
,
138 .use_clustering
= DISABLE_CLUSTERING
,
142 #include "scsi_module.c"
144 /***************************************************************** Detection */
145 int dec_esp_detect(Scsi_Host_Template
* tpnt
)
148 struct ConfigDev
*esp_dev
;
150 unsigned long mem_start
;
154 esp
= esp_allocate(tpnt
, (void *) esp_dev
);
156 scsi_dma_ptr
= (unsigned long *) (system_base
+ IOCTL
+ SCSI_DMA_P
);
157 scsi_next_ptr
= (unsigned long *) (system_base
+ IOCTL
+ SCSI_DMA_BP
);
158 scsi_scr
= (unsigned long *) (system_base
+ IOCTL
+ SCSI_SCR
);
159 ioasic_ssr
= (unsigned long *) (system_base
+ IOCTL
+ SSR
);
160 scsi_sdr0
= (unsigned long *) (system_base
+ IOCTL
+ SCSI_SDR0
);
161 scsi_sdr1
= (unsigned long *) (system_base
+ IOCTL
+ SCSI_SDR1
);
163 /* Do command transfer with programmed I/O */
164 esp
->do_pio_cmds
= 1;
166 /* Required functions */
167 esp
->dma_bytes_sent
= &dma_bytes_sent
;
168 esp
->dma_can_transfer
= &dma_can_transfer
;
169 esp
->dma_dump_state
= &dma_dump_state
;
170 esp
->dma_init_read
= &dma_init_read
;
171 esp
->dma_init_write
= &dma_init_write
;
172 esp
->dma_ints_off
= &dma_ints_off
;
173 esp
->dma_ints_on
= &dma_ints_on
;
174 esp
->dma_irq_p
= &dma_irq_p
;
175 esp
->dma_ports_p
= &dma_ports_p
;
176 esp
->dma_setup
= &dma_setup
;
178 /* Optional functions */
179 esp
->dma_barrier
= 0;
180 esp
->dma_drain
= &dma_drain
;
181 esp
->dma_invalidate
= 0;
182 esp
->dma_irq_entry
= 0;
183 esp
->dma_irq_exit
= 0;
186 esp
->dma_led_off
= 0;
189 /* virtual DMA functions */
190 esp
->dma_mmu_get_scsi_one
= &dma_mmu_get_scsi_one
;
191 esp
->dma_mmu_get_scsi_sgl
= &dma_mmu_get_scsi_sgl
;
192 esp
->dma_mmu_release_scsi_one
= 0;
193 esp
->dma_mmu_release_scsi_sgl
= 0;
194 esp
->dma_advance_sg
= &dma_advance_sg
;
197 /* SCSI chip speed */
198 esp
->cfreq
= 25000000;
201 * we don't give the address of DMA channel, but the number
202 * of DMA channel, so we can use the jazz DMA functions
205 esp
->dregs
= JAZZ_SCSI_DMA
;
207 /* ESP register base */
208 esp
->eregs
= (struct ESP_regs
*) (system_base
+ SCSI
);
210 /* Set the command buffer */
211 esp
->esp_command
= (volatile unsigned char *) cmd_buffer
;
213 /* get virtual dma address for command buffer */
214 esp
->esp_command_dvma
= (__u32
) KSEG1ADDR((volatile unsigned char *) cmd_buffer
);
220 /* Check for differential SCSI-bus */
225 if (request_irq(esp
->irq
, esp_intr
, SA_INTERRUPT
,
226 "NCR 53C94 SCSI", esp
->ehost
))
228 if (request_irq(SCSI_DMA_INT
, scsi_dma_int
, SA_INTERRUPT
,
229 "JUNKIO SCSI DMA", esp
->ehost
))
235 while ((slot
= search_tc_card("PMAZ-AA")) >= 0) {
239 esp
= esp_allocate(tpnt
, (void *) esp_dev
);
241 mem_start
= get_tc_base_addr(slot
);
243 /* Store base addr into esp struct */
244 esp
->slot
= mem_start
;
247 esp
->eregs
= (struct ESP_regs
*) (mem_start
+ DEC_SCSI_SREG
);
248 esp
->do_pio_cmds
= 1;
250 /* Set the command buffer */
251 esp
->esp_command
= (volatile unsigned char *) pmaz_cmd_buffer
;
253 /* get virtual dma address for command buffer */
254 esp
->esp_command_dvma
= (__u32
) KSEG0ADDR((volatile unsigned char *) pmaz_cmd_buffer
);
256 esp
->cfreq
= get_tc_speed();
258 esp
->irq
= get_tc_irq_nr(slot
);
260 /* Required functions */
261 esp
->dma_bytes_sent
= &dma_bytes_sent
;
262 esp
->dma_can_transfer
= &dma_can_transfer
;
263 esp
->dma_dump_state
= &dma_dump_state
;
264 esp
->dma_init_read
= &pmaz_dma_init_read
;
265 esp
->dma_init_write
= &pmaz_dma_init_write
;
266 esp
->dma_ints_off
= &pmaz_dma_ints_off
;
267 esp
->dma_ints_on
= &pmaz_dma_ints_on
;
268 esp
->dma_irq_p
= &dma_irq_p
;
269 esp
->dma_ports_p
= &dma_ports_p
;
270 esp
->dma_setup
= &pmaz_dma_setup
;
272 /* Optional functions */
273 esp
->dma_barrier
= 0;
274 esp
->dma_drain
= &pmaz_dma_drain
;
275 esp
->dma_invalidate
= 0;
276 esp
->dma_irq_entry
= 0;
277 esp
->dma_irq_exit
= 0;
280 esp
->dma_led_off
= 0;
283 esp
->dma_mmu_get_scsi_one
= pmaz_dma_mmu_get_scsi_one
;
284 esp
->dma_mmu_get_scsi_sgl
= 0;
285 esp
->dma_mmu_release_scsi_one
= 0;
286 esp
->dma_mmu_release_scsi_sgl
= 0;
287 esp
->dma_advance_sg
= 0;
289 if (request_irq(esp
->irq
, esp_intr
, SA_INTERRUPT
,
290 "PMAZ_AA", esp
->ehost
)) {
292 release_tc_card(slot
);
302 printk("ESP: Total of %d ESP hosts found, %d actually in use.\n", nesps
, esps_in_use
);
303 esps_running
= esps_in_use
;
309 free_irq(esp
->irq
, esp_intr
);
315 /************************************************************* DMA Functions */
316 static void scsi_dma_int(int irq
, void *dev_id
, struct pt_regs
*regs
)
318 extern volatile unsigned int *isr
;
321 if (*isr
& SCSI_PTR_LOADED
) {
323 *scsi_next_ptr
= ((*scsi_dma_ptr
+ PAGE_SIZE
) & PAGE_MASK
) << 3;
324 *isr
&= ~SCSI_PTR_LOADED
;
326 if (*isr
& SCSI_PAGOVRRUN
)
327 *isr
&= ~SCSI_PAGOVRRUN
;
328 if (*isr
& SCSI_DMA_MEMRDERR
) {
329 printk("Got unexpected SCSI DMA Interrupt! < ");
330 printk("SCSI_DMA_MEMRDERR ");
332 *isr
&= ~SCSI_DMA_MEMRDERR
;
337 * This routine will only work on IOASIC machines
338 * so we can avoid an indirect function call here
339 * and flush the writeback buffer the fast way
345 static int dma_bytes_sent(struct NCR_ESP
*esp
, int fifo_count
)
350 static void dma_drain(struct NCR_ESP
*esp
)
352 unsigned long nw
= *scsi_scr
;
353 unsigned short *p
= (unsigned short *)KSEG1ADDR((*scsi_dma_ptr
) >> 3);
356 * Is there something in the dma buffers left?
361 *p
= (unsigned short) *scsi_sdr0
;
364 *p
++ = (unsigned short) (*scsi_sdr0
);
365 *p
= (unsigned short) ((*scsi_sdr0
) >> 16);
368 *p
++ = (unsigned short) (*scsi_sdr0
);
369 *p
++ = (unsigned short) ((*scsi_sdr0
) >> 16);
370 *p
= (unsigned short) (*scsi_sdr1
);
373 printk("Strange: %d words in dma buffer left\n", (int) nw
);
379 static int dma_can_transfer(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
)
381 return sp
->SCp
.this_residual
;
384 static void dma_dump_state(struct NCR_ESP
*esp
)
387 ESPLOG(("esp%d: dma -- enable <%08x> residue <%08x\n",
388 esp->esp_id, vdma_get_enable((int)esp->dregs), vdma_get_resdiue((int)esp->dregs)));
392 static void dma_init_read(struct NCR_ESP
*esp
, __u32 vaddress
, int length
)
394 extern volatile unsigned int *isr
;
398 panic("dec_efs.c: unable to handle partial word transfers, yet...");
400 dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress
), length
);
402 *ioasic_ssr
&= ~SCSI_DMA_EN
;
404 *scsi_dma_ptr
= vaddress
<< 3;
406 /* prepare for next page */
407 *scsi_next_ptr
= ((vaddress
+ PAGE_SIZE
) & PAGE_MASK
) << 3;
408 *ioasic_ssr
|= (SCSI_DMA_DIR
| SCSI_DMA_EN
);
417 static void dma_init_write(struct NCR_ESP
*esp
, __u32 vaddress
, int length
)
419 extern volatile unsigned int *isr
;
423 panic("dec_efs.c: unable to handle partial word transfers, yet...");
425 dma_cache_wback_inv((unsigned long) phys_to_virt(vaddress
), length
);
427 *ioasic_ssr
&= ~(SCSI_DMA_DIR
| SCSI_DMA_EN
);
429 *scsi_dma_ptr
= vaddress
<< 3;
431 /* prepare for next page */
432 *scsi_next_ptr
= ((vaddress
+ PAGE_SIZE
) & PAGE_MASK
) << 3;
433 *ioasic_ssr
|= SCSI_DMA_EN
;
442 static void dma_ints_off(struct NCR_ESP
*esp
)
444 disable_irq(SCSI_DMA_INT
);
447 static void dma_ints_on(struct NCR_ESP
*esp
)
449 enable_irq(SCSI_DMA_INT
);
452 static int dma_irq_p(struct NCR_ESP
*esp
)
454 return (esp
->eregs
->esp_status
& ESP_STAT_INTR
);
457 static int dma_ports_p(struct NCR_ESP
*esp
)
460 * FIXME: what's this good for?
465 static void dma_setup(struct NCR_ESP
*esp
, __u32 addr
, int count
, int write
)
468 * On the Sparc, DMA_ST_WRITE means "move data from device to memory"
469 * so when (write) is true, it actually means READ!
472 dma_init_read(esp
, addr
, count
);
474 dma_init_write(esp
, addr
, count
);
479 * These aren't used yet
481 static void dma_mmu_get_scsi_one(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
)
483 sp
->SCp
.ptr
= (char *)PHYSADDR(sp
->SCp
.buffer
);
486 static void dma_mmu_get_scsi_sgl(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
)
488 int sz
= sp
->SCp
.buffers_residual
;
489 struct mmu_sglist
*sg
= (struct mmu_sglist
*) sp
->SCp
.buffer
;
492 sg
[sz
].dvma_addr
= PHYSADDR(sg
[sz
].addr
);
495 sp
->SCp
.ptr
= (char *) ((unsigned long) sp
->SCp
.buffer
->dvma_address
);
498 static void dma_advance_sg(Scsi_Cmnd
* sp
)
500 sp
->SCp
.ptr
= (char *) ((unsigned long) sp
->SCp
.buffer
->dvma_address
);
503 static void pmaz_dma_drain(struct NCR_ESP
*esp
)
505 memcpy((void *) (KSEG0ADDR(esp_virt_buffer
)),
506 (void *) ( esp
->slot
+ DEC_SCSI_SRAM
+ ESP_TGT_DMA_SIZE
),
507 scsi_current_length
);
510 static void pmaz_dma_init_read(struct NCR_ESP
*esp
, __u32 vaddress
, int length
)
512 volatile int *dmareg
= (volatile int *) (esp
->slot
+ DEC_SCSI_DMAREG
);
514 if (length
> ESP_TGT_DMA_SIZE
)
515 length
= ESP_TGT_DMA_SIZE
;
517 *dmareg
= TC_ESP_DMA_ADDR(esp
->slot
+ DEC_SCSI_SRAM
+ ESP_TGT_DMA_SIZE
);
519 esp_virt_buffer
= vaddress
;
520 scsi_current_length
= length
;
523 static void pmaz_dma_init_write(struct NCR_ESP
*esp
, __u32 vaddress
, int length
)
525 volatile int *dmareg
= (volatile int *) ( esp
->slot
+ DEC_SCSI_DMAREG
);
527 memcpy((void *)(esp
->slot
+ DEC_SCSI_SRAM
+ ESP_TGT_DMA_SIZE
),
528 (void *)KSEG0ADDR(vaddress
), length
);
530 *dmareg
= TC_ESP_DMAR_WRITE
|
531 TC_ESP_DMA_ADDR(esp
->slot
+ DEC_SCSI_SRAM
+ ESP_TGT_DMA_SIZE
);
535 static void pmaz_dma_ints_off(struct NCR_ESP
*esp
)
539 static void pmaz_dma_ints_on(struct NCR_ESP
*esp
)
543 static void pmaz_dma_setup(struct NCR_ESP
*esp
, __u32 addr
, int count
, int write
)
546 * On the Sparc, DMA_ST_WRITE means "move data from device to memory"
547 * so when (write) is true, it actually means READ!
550 pmaz_dma_init_read(esp
, addr
, count
);
552 pmaz_dma_init_write(esp
, addr
, count
);
556 static void pmaz_dma_mmu_get_scsi_one(struct NCR_ESP
*esp
, Scsi_Cmnd
* sp
)
558 sp
->SCp
.ptr
= (char *)KSEG0ADDR((sp
->request_buffer
));