Import 2.3.18pre1
[davej-history.git] / drivers / scsi / atari_scsi.c
bloba5963ad3d9038b98818173a5c496fab62971137f
1 /*
2 * atari_scsi.c -- Device dependent functions for the Atari generic SCSI port
4 * Copyright 1994 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
6 * Loosely based on the work of Robert De Vries' team and added:
7 * - working real DMA
8 * - Falcon support (untested yet!) ++bjoern fixed and now it works
9 * - lots of extensions and bug fixes.
11 * This file is subject to the terms and conditions of the GNU General Public
12 * License. See the file COPYING in the main directory of this archive
13 * for more details.
18 /**************************************************************************/
19 /* */
20 /* Notes for Falcon SCSI: */
21 /* ---------------------- */
22 /* */
23 /* Since the Falcon SCSI uses the ST-DMA chip, that is shared among */
24 /* several device drivers, locking and unlocking the access to this */
25 /* chip is required. But locking is not possible from an interrupt, */
26 /* since it puts the process to sleep if the lock is not available. */
27 /* This prevents "late" locking of the DMA chip, i.e. locking it just */
28 /* before using it, since in case of disconnection-reconnection */
29 /* commands, the DMA is started from the reselection interrupt. */
30 /* */
31 /* Two possible schemes for ST-DMA-locking would be: */
32 /* 1) The lock is taken for each command separately and disconnecting */
33 /* is forbidden (i.e. can_queue = 1). */
34 /* 2) The DMA chip is locked when the first command comes in and */
35 /* released when the last command is finished and all queues are */
36 /* empty. */
37 /* The first alternative would result in bad performance, since the */
38 /* interleaving of commands would not be used. The second is unfair to */
39 /* other drivers using the ST-DMA, because the queues will seldom be */
40 /* totally empty if there is a lot of disk traffic. */
41 /* */
42 /* For this reasons I decided to employ a more elaborate scheme: */
43 /* - First, we give up the lock every time we can (for fairness), this */
44 /* means every time a command finishes and there are no other commands */
45 /* on the disconnected queue. */
46 /* - If there are others waiting to lock the DMA chip, we stop */
47 /* issuing commands, i.e. moving them onto the issue queue. */
48 /* Because of that, the disconnected queue will run empty in a */
49 /* while. Instead we go to sleep on a 'fairness_queue'. */
50 /* - If the lock is released, all processes waiting on the fairness */
51 /* queue will be woken. The first of them tries to re-lock the DMA, */
52 /* the others wait for the first to finish this task. After that, */
53 /* they can all run on and do their commands... */
54 /* This sounds complicated (and it is it :-(), but it seems to be a */
55 /* good compromise between fairness and performance: As long as no one */
56 /* else wants to work with the ST-DMA chip, SCSI can go along as */
57 /* usual. If now someone else comes, this behaviour is changed to a */
58 /* "fairness mode": just already initiated commands are finished and */
59 /* then the lock is released. The other one waiting will probably win */
60 /* the race for locking the DMA, since it was waiting for longer. And */
61 /* after it has finished, SCSI can go ahead again. Finally: I hope I */
62 /* have not produced any deadlock possibilities! */
63 /* */
64 /**************************************************************************/
68 #include <linux/config.h>
69 #include <linux/module.h>
71 #define NDEBUG (0)
73 #define NDEBUG_ABORT 0x800000
74 #define NDEBUG_TAGS 0x1000000
75 #define NDEBUG_MERGING 0x2000000
77 #define AUTOSENSE
78 /* For the Atari version, use only polled IO or REAL_DMA */
79 #define REAL_DMA
80 /* Support tagged queuing? (on devices that are able to... :-) */
81 #define SUPPORT_TAGS
82 #define MAX_TAGS 32
84 #include <linux/types.h>
85 #include <linux/stddef.h>
86 #include <linux/ctype.h>
87 #include <linux/delay.h>
88 #include <linux/mm.h>
89 #include <linux/blk.h>
90 #include <linux/sched.h>
91 #include <linux/interrupt.h>
92 #include <linux/init.h>
93 #include <linux/nvram.h>
95 #include <asm/setup.h>
96 #include <asm/atarihw.h>
97 #include <asm/atariints.h>
98 #include <asm/page.h>
99 #include <asm/pgtable.h>
100 #include <asm/irq.h>
101 #include <asm/traps.h>
102 #include <asm/bitops.h>
104 #include "scsi.h"
105 #include "hosts.h"
106 #include "atari_scsi.h"
107 #include "NCR5380.h"
108 #include "constants.h"
109 #include <asm/atari_stdma.h>
110 #include <asm/atari_stram.h>
111 #include <asm/io.h>
113 #include <linux/stat.h>
115 struct proc_dir_entry proc_scsi_atari = {
116 PROC_SCSI_ATARI, 5, "Atari",
117 S_IFDIR | S_IRUGO | S_IXUGO, 2
120 #define IS_A_TT() ATARIHW_PRESENT(TT_SCSI)
122 #define SCSI_DMA_WRITE_P(elt,val) \
123 do { \
124 unsigned long v = val; \
125 tt_scsi_dma.elt##_lo = v & 0xff; \
126 v >>= 8; \
127 tt_scsi_dma.elt##_lmd = v & 0xff; \
128 v >>= 8; \
129 tt_scsi_dma.elt##_hmd = v & 0xff; \
130 v >>= 8; \
131 tt_scsi_dma.elt##_hi = v & 0xff; \
132 } while(0)
134 #define SCSI_DMA_READ_P(elt) \
135 (((((((unsigned long)tt_scsi_dma.elt##_hi << 8) | \
136 (unsigned long)tt_scsi_dma.elt##_hmd) << 8) | \
137 (unsigned long)tt_scsi_dma.elt##_lmd) << 8) | \
138 (unsigned long)tt_scsi_dma.elt##_lo)
141 static inline void SCSI_DMA_SETADR(unsigned long adr)
143 st_dma.dma_lo = (unsigned char)adr;
144 MFPDELAY();
145 adr >>= 8;
146 st_dma.dma_md = (unsigned char)adr;
147 MFPDELAY();
148 adr >>= 8;
149 st_dma.dma_hi = (unsigned char)adr;
150 MFPDELAY();
153 static inline unsigned long SCSI_DMA_GETADR(void)
155 unsigned long adr;
156 adr = st_dma.dma_lo;
157 MFPDELAY();
158 adr |= (st_dma.dma_md & 0xff) << 8;
159 MFPDELAY();
160 adr |= (st_dma.dma_hi & 0xff) << 16;
161 MFPDELAY();
162 return adr;
165 static inline void ENABLE_IRQ(void)
167 if (IS_A_TT())
168 atari_enable_irq(IRQ_TT_MFP_SCSI);
169 else
170 atari_enable_irq(IRQ_MFP_FSCSI);
173 static inline void DISABLE_IRQ(void)
175 if (IS_A_TT())
176 atari_disable_irq(IRQ_TT_MFP_SCSI);
177 else
178 atari_disable_irq(IRQ_MFP_FSCSI);
182 #define HOSTDATA_DMALEN (((struct NCR5380_hostdata *) \
183 (atari_scsi_host->hostdata))->dma_len)
185 /* Time (in jiffies) to wait after a reset; the SCSI standard calls for 250ms,
186 * we usually do 0.5s to be on the safe side. But Toshiba CD-ROMs once more
187 * need ten times the standard value... */
188 #ifndef CONFIG_ATARI_SCSI_TOSHIBA_DELAY
189 #define AFTER_RESET_DELAY (HZ/2)
190 #else
191 #define AFTER_RESET_DELAY (5*HZ/2)
192 #endif
194 /***************************** Prototypes *****************************/
196 #ifdef REAL_DMA
197 static int scsi_dma_is_ignored_buserr( unsigned char dma_stat );
198 static void atari_scsi_fetch_restbytes( void );
199 static long atari_scsi_dma_residual( struct Scsi_Host *instance );
200 static int falcon_classify_cmd( Scsi_Cmnd *cmd );
201 static unsigned long atari_dma_xfer_len( unsigned long wanted_len,
202 Scsi_Cmnd *cmd, int write_flag );
203 #endif
204 static void scsi_tt_intr( int irq, void *dummy, struct pt_regs *fp);
205 static void scsi_falcon_intr( int irq, void *dummy, struct pt_regs *fp);
206 static void falcon_release_lock_if_possible( struct NCR5380_hostdata *
207 hostdata );
208 static void falcon_get_lock( void );
209 #ifdef CONFIG_ATARI_SCSI_RESET_BOOT
210 static void atari_scsi_reset_boot( void );
211 #endif
212 static unsigned char atari_scsi_tt_reg_read( unsigned char reg );
213 static void atari_scsi_tt_reg_write( unsigned char reg, unsigned char value);
214 static unsigned char atari_scsi_falcon_reg_read( unsigned char reg );
215 static void atari_scsi_falcon_reg_write( unsigned char reg, unsigned char value );
217 /************************* End of Prototypes **************************/
220 static struct Scsi_Host *atari_scsi_host = NULL;
221 static unsigned char (*atari_scsi_reg_read)( unsigned char reg );
222 static void (*atari_scsi_reg_write)( unsigned char reg, unsigned char value );
224 #ifdef REAL_DMA
225 static unsigned long atari_dma_residual, atari_dma_startaddr;
226 static short atari_dma_active;
227 /* pointer to the dribble buffer */
228 static char *atari_dma_buffer = NULL;
229 /* precalculated physical address of the dribble buffer */
230 static unsigned long atari_dma_phys_buffer;
231 /* != 0 tells the Falcon int handler to copy data from the dribble buffer */
232 static char *atari_dma_orig_addr;
233 /* size of the dribble buffer; 4k seems enough, since the Falcon cannot use
234 * scatter-gather anyway, so most transfers are 1024 byte only. In the rare
235 * cases where requests to physical contiguous buffers have been merged, this
236 * request is <= 4k (one page). So I don't think we have to split transfers
237 * just due to this buffer size...
239 #define STRAM_BUFFER_SIZE (4096)
240 /* mask for address bits that can't be used with the ST-DMA */
241 static unsigned long atari_dma_stram_mask;
242 #define STRAM_ADDR(a) (((a) & atari_dma_stram_mask) == 0)
243 /* number of bytes to cut from a transfer to handle NCR overruns */
244 static int atari_read_overruns = 0;
245 #endif
247 static int setup_can_queue = -1;
248 MODULE_PARM(setup_can_queue, "i");
249 static int setup_cmd_per_lun = -1;
250 MODULE_PARM(setup_cmd_per_lun, "i");
251 static int setup_sg_tablesize = -1;
252 MODULE_PARM(setup_sg_tablesize, "i");
253 #ifdef SUPPORT_TAGS
254 static int setup_use_tagged_queuing = -1;
255 MODULE_PARM(setup_use_tagged_queuing, "i");
256 #endif
257 static int setup_hostid = -1;
258 MODULE_PARM(setup_hostid, "i");
261 #if defined(CONFIG_TT_DMA_EMUL)
262 #include "atari_dma_emul.c"
263 #endif
265 #if defined(REAL_DMA)
267 static int scsi_dma_is_ignored_buserr( unsigned char dma_stat )
269 int i;
270 unsigned long addr = SCSI_DMA_READ_P( dma_addr ), end_addr;
272 if (dma_stat & 0x01) {
274 /* A bus error happens when DMA-ing from the last page of a
275 * physical memory chunk (DMA prefetch!), but that doesn't hurt.
276 * Check for this case:
279 for( i = 0; i < m68k_num_memory; ++i ) {
280 end_addr = m68k_memory[i].addr +
281 m68k_memory[i].size;
282 if (end_addr <= addr && addr <= end_addr + 4)
283 return( 1 );
286 return( 0 );
290 #if 0
291 /* Dead code... wasn't called anyway :-) and causes some trouble, because at
292 * end-of-DMA, both SCSI ints are triggered simultaneously, so the NCR int has
293 * to clear the DMA int pending bit before it allows other level 6 interrupts.
295 static void scsi_dma_buserr (int irq, void *dummy, struct pt_regs *fp)
297 unsigned char dma_stat = tt_scsi_dma.dma_ctrl;
299 /* Don't do anything if a NCR interrupt is pending. Probably it's just
300 * masked... */
301 if (atari_irq_pending( IRQ_TT_MFP_SCSI ))
302 return;
304 printk("Bad SCSI DMA interrupt! dma_addr=0x%08lx dma_stat=%02x dma_cnt=%08lx\n",
305 SCSI_DMA_READ_P(dma_addr), dma_stat, SCSI_DMA_READ_P(dma_cnt));
306 if (dma_stat & 0x80) {
307 if (!scsi_dma_is_ignored_buserr( dma_stat ))
308 printk( "SCSI DMA bus error -- bad DMA programming!\n" );
310 else {
311 /* Under normal circumstances we never should get to this point,
312 * since both interrupts are triggered simultaneously and the 5380
313 * int has higher priority. When this irq is handled, that DMA
314 * interrupt is cleared. So a warning message is printed here.
316 printk( "SCSI DMA intr ?? -- this shouldn't happen!\n" );
319 #endif
321 #endif
324 static void scsi_tt_intr (int irq, void *dummy, struct pt_regs *fp)
326 #ifdef REAL_DMA
327 int dma_stat;
329 dma_stat = tt_scsi_dma.dma_ctrl;
331 INT_PRINTK("scsi%d: NCR5380 interrupt, DMA status = %02x\n",
332 atari_scsi_host->host_no, dma_stat & 0xff);
334 /* Look if it was the DMA that has interrupted: First possibility
335 * is that a bus error occurred...
337 if (dma_stat & 0x80) {
338 if (!scsi_dma_is_ignored_buserr( dma_stat )) {
339 printk(KERN_ERR "SCSI DMA caused bus error near 0x%08lx\n",
340 SCSI_DMA_READ_P(dma_addr));
341 printk(KERN_CRIT "SCSI DMA bus error -- bad DMA programming!");
345 /* If the DMA is active but not finished, we have the case
346 * that some other 5380 interrupt occurred within the DMA transfer.
347 * This means we have residual bytes, if the desired end address
348 * is not yet reached. Maybe we have to fetch some bytes from the
349 * rest data register, too. The residual must be calculated from
350 * the address pointer, not the counter register, because only the
351 * addr reg counts bytes not yet written and pending in the rest
352 * data reg!
354 if ((dma_stat & 0x02) && !(dma_stat & 0x40)) {
355 atari_dma_residual = HOSTDATA_DMALEN - (SCSI_DMA_READ_P( dma_addr ) -
356 atari_dma_startaddr);
358 DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n",
359 atari_dma_residual);
361 if ((signed int)atari_dma_residual < 0)
362 atari_dma_residual = 0;
363 if ((dma_stat & 1) == 0) {
364 /* After read operations, we maybe have to
365 transport some rest bytes */
366 atari_scsi_fetch_restbytes();
368 else {
369 /* There seems to be a nasty bug in some SCSI-DMA/NCR
370 combinations: If a target disconnects while a write
371 operation is going on, the address register of the
372 DMA may be a few bytes farer than it actually read.
373 This is probably due to DMA prefetching and a delay
374 between DMA and NCR. Experiments showed that the
375 dma_addr is 9 bytes to high, but this could vary.
376 The problem is, that the residual is thus calculated
377 wrong and the next transfer will start behind where
378 it should. So we round up the residual to the next
379 multiple of a sector size, if it isn't already a
380 multiple and the originally expected transfer size
381 was. The latter condition is there to ensure that
382 the correction is taken only for "real" data
383 transfers and not for, e.g., the parameters of some
384 other command. These shouldn't disconnect anyway.
386 if (atari_dma_residual & 0x1ff) {
387 DMA_PRINTK("SCSI DMA: DMA bug corrected, "
388 "difference %ld bytes\n",
389 512 - (atari_dma_residual & 0x1ff));
390 atari_dma_residual = (atari_dma_residual + 511) & ~0x1ff;
393 tt_scsi_dma.dma_ctrl = 0;
396 /* If the DMA is finished, fetch the rest bytes and turn it off */
397 if (dma_stat & 0x40) {
398 atari_dma_residual = 0;
399 if ((dma_stat & 1) == 0)
400 atari_scsi_fetch_restbytes();
401 tt_scsi_dma.dma_ctrl = 0;
404 #endif /* REAL_DMA */
406 NCR5380_intr (0, 0, 0);
408 #if 0
409 /* To be sure the int is not masked */
410 atari_enable_irq( IRQ_TT_MFP_SCSI );
411 #endif
415 static void scsi_falcon_intr (int irq, void *dummy, struct pt_regs *fp)
417 #ifdef REAL_DMA
418 int dma_stat;
420 /* Turn off DMA and select sector counter register before
421 * accessing the status register (Atari recommendation!)
423 st_dma.dma_mode_status = 0x90;
424 dma_stat = st_dma.dma_mode_status;
426 /* Bit 0 indicates some error in the DMA process... don't know
427 * what happened exactly (no further docu).
429 if (!(dma_stat & 0x01)) {
430 /* DMA error */
431 printk(KERN_CRIT "SCSI DMA error near 0x%08lx!\n", SCSI_DMA_GETADR());
434 /* If the DMA was active, but now bit 1 is not clear, it is some
435 * other 5380 interrupt that finishes the DMA transfer. We have to
436 * calculate the number of residual bytes and give a warning if
437 * bytes are stuck in the ST-DMA fifo (there's no way to reach them!)
439 if (atari_dma_active && (dma_stat & 0x02)) {
440 unsigned long transferred;
442 transferred = SCSI_DMA_GETADR() - atari_dma_startaddr;
443 /* The ST-DMA address is incremented in 2-byte steps, but the
444 * data are written only in 16-byte chunks. If the number of
445 * transferred bytes is not divisible by 16, the remainder is
446 * lost somewhere in outer space.
448 if (transferred & 15)
449 printk(KERN_ERR "SCSI DMA error: %ld bytes lost in "
450 "ST-DMA fifo\n", transferred & 15);
452 atari_dma_residual = HOSTDATA_DMALEN - transferred;
453 DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n",
454 atari_dma_residual);
456 else
457 atari_dma_residual = 0;
458 atari_dma_active = 0;
460 if (atari_dma_orig_addr) {
461 /* If the dribble buffer was used on a read operation, copy the DMA-ed
462 * data to the original destination address.
464 memcpy(atari_dma_orig_addr, phys_to_virt(atari_dma_startaddr),
465 HOSTDATA_DMALEN - atari_dma_residual);
466 atari_dma_orig_addr = NULL;
469 #endif /* REAL_DMA */
471 NCR5380_intr (0, 0, 0);
475 #ifdef REAL_DMA
476 static void atari_scsi_fetch_restbytes( void )
478 int nr;
479 char *src, *dst;
480 unsigned long phys_dst;
482 /* fetch rest bytes in the DMA register */
483 phys_dst = SCSI_DMA_READ_P(dma_addr);
484 nr = phys_dst & 3;
485 if (nr) {
486 /* there are 'nr' bytes left for the last long address
487 before the DMA pointer */
488 phys_dst ^= nr;
489 DMA_PRINTK("SCSI DMA: there are %d rest bytes for phys addr 0x%08lx",
490 nr, phys_dst);
491 /* The content of the DMA pointer is a physical address! */
492 dst = phys_to_virt(phys_dst);
493 DMA_PRINTK(" = virt addr %p\n", dst);
494 for (src = (char *)&tt_scsi_dma.dma_restdata; nr != 0; --nr)
495 *dst++ = *src++;
498 #endif /* REAL_DMA */
501 static int falcon_got_lock = 0;
502 static DECLARE_WAIT_QUEUE_HEAD(falcon_fairness_wait);
503 static int falcon_trying_lock = 0;
504 static DECLARE_WAIT_QUEUE_HEAD(falcon_try_wait);
505 static int falcon_dont_release = 0;
507 /* This function releases the lock on the DMA chip if there is no
508 * connected command and the disconnected queue is empty. On
509 * releasing, instances of falcon_get_lock are awoken, that put
510 * themselves to sleep for fairness. They can now try to get the lock
511 * again (but others waiting longer more probably will win).
514 static void
515 falcon_release_lock_if_possible( struct NCR5380_hostdata * hostdata )
517 unsigned long oldflags;
519 if (IS_A_TT()) return;
521 save_flags(oldflags);
522 cli();
524 if (falcon_got_lock &&
525 !hostdata->disconnected_queue &&
526 !hostdata->issue_queue &&
527 !hostdata->connected) {
529 if (falcon_dont_release) {
530 #if 0
531 printk("WARNING: Lock release not allowed. Ignored\n");
532 #endif
533 restore_flags(oldflags);
534 return;
536 falcon_got_lock = 0;
537 stdma_release();
538 wake_up( &falcon_fairness_wait );
541 restore_flags(oldflags);
544 /* This function manages the locking of the ST-DMA.
545 * If the DMA isn't locked already for SCSI, it tries to lock it by
546 * calling stdma_lock(). But if the DMA is locked by the SCSI code and
547 * there are other drivers waiting for the chip, we do not issue the
548 * command immediately but wait on 'falcon_fairness_queue'. We will be
549 * waked up when the DMA is unlocked by some SCSI interrupt. After that
550 * we try to get the lock again.
551 * But we must be prepared that more than one instance of
552 * falcon_get_lock() is waiting on the fairness queue. They should not
553 * try all at once to call stdma_lock(), one is enough! For that, the
554 * first one sets 'falcon_trying_lock', others that see that variable
555 * set wait on the queue 'falcon_try_wait'.
556 * Complicated, complicated.... Sigh...
559 static void falcon_get_lock( void )
561 unsigned long oldflags;
563 if (IS_A_TT()) return;
565 save_flags(oldflags);
566 cli();
568 while( !in_interrupt() && falcon_got_lock && stdma_others_waiting() )
569 sleep_on( &falcon_fairness_wait );
571 while (!falcon_got_lock) {
572 if (in_interrupt())
573 panic( "Falcon SCSI hasn't ST-DMA lock in interrupt" );
574 if (!falcon_trying_lock) {
575 falcon_trying_lock = 1;
576 stdma_lock(scsi_falcon_intr, NULL);
577 falcon_got_lock = 1;
578 falcon_trying_lock = 0;
579 wake_up( &falcon_try_wait );
581 else {
582 sleep_on( &falcon_try_wait );
586 restore_flags(oldflags);
587 if (!falcon_got_lock)
588 panic("Falcon SCSI: someone stole the lock :-(\n");
592 /* This is the wrapper function for NCR5380_queue_command(). It just
593 * tries to get the lock on the ST-DMA (see above) and then calls the
594 * original function.
597 #if 0
598 int atari_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
600 /* falcon_get_lock();
601 * ++guenther: moved to NCR5380_queue_command() to prevent
602 * race condition, see there for an explanation.
604 return( NCR5380_queue_command( cmd, done ) );
606 #endif
609 int atari_scsi_detect (Scsi_Host_Template *host)
611 static int called = 0;
612 struct Scsi_Host *instance;
614 if (!MACH_IS_ATARI ||
615 (!ATARIHW_PRESENT(ST_SCSI) && !ATARIHW_PRESENT(TT_SCSI)) ||
616 called)
617 return( 0 );
619 host->proc_dir = &proc_scsi_atari;
621 atari_scsi_reg_read = IS_A_TT() ? atari_scsi_tt_reg_read :
622 atari_scsi_falcon_reg_read;
623 atari_scsi_reg_write = IS_A_TT() ? atari_scsi_tt_reg_write :
624 atari_scsi_falcon_reg_write;
626 /* setup variables */
627 host->can_queue =
628 (setup_can_queue > 0) ? setup_can_queue :
629 IS_A_TT() ? ATARI_TT_CAN_QUEUE : ATARI_FALCON_CAN_QUEUE;
630 host->cmd_per_lun =
631 (setup_cmd_per_lun > 0) ? setup_cmd_per_lun :
632 IS_A_TT() ? ATARI_TT_CMD_PER_LUN : ATARI_FALCON_CMD_PER_LUN;
633 /* Force sg_tablesize to 0 on a Falcon! */
634 host->sg_tablesize =
635 !IS_A_TT() ? ATARI_FALCON_SG_TABLESIZE :
636 (setup_sg_tablesize >= 0) ? setup_sg_tablesize : ATARI_TT_SG_TABLESIZE;
638 if (setup_hostid >= 0)
639 host->this_id = setup_hostid;
640 else {
641 /* use 7 as default */
642 host->this_id = 7;
643 /* Test if a host id is set in the NVRam */
644 if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) {
645 unsigned char b = nvram_read_byte( 14 );
646 /* Arbitration enabled? (for TOS) If yes, use configured host ID */
647 if (b & 0x80)
648 host->this_id = b & 7;
652 #ifdef SUPPORT_TAGS
653 if (setup_use_tagged_queuing < 0)
654 setup_use_tagged_queuing = DEFAULT_USE_TAGGED_QUEUING;
655 #endif
656 #ifdef REAL_DMA
657 /* If running on a Falcon and if there's TT-Ram (i.e., more than one
658 * memory block, since there's always ST-Ram in a Falcon), then allocate a
659 * STRAM_BUFFER_SIZE byte dribble buffer for transfers from/to alternative
660 * Ram.
662 if (MACH_IS_ATARI && ATARIHW_PRESENT(ST_SCSI) &&
663 !ATARIHW_PRESENT(EXTD_DMA) && m68k_num_memory > 1) {
664 atari_dma_buffer = atari_stram_alloc( STRAM_BUFFER_SIZE, NULL, "SCSI" );
665 if (!atari_dma_buffer) {
666 printk( KERN_ERR "atari_scsi_detect: can't allocate ST-RAM "
667 "double buffer\n" );
668 return( 0 );
670 atari_dma_phys_buffer = virt_to_phys( atari_dma_buffer );
671 atari_dma_orig_addr = 0;
673 #endif
674 instance = scsi_register (host, sizeof (struct NCR5380_hostdata));
675 atari_scsi_host = instance;
676 /* Set irq to 0, to avoid that the mid-level code disables our interrupt
677 * during queue_command calls. This is completely unnecessary, and even
678 * worse causes bad problems on the Falcon, where the int is shared with
679 * IDE and floppy! */
680 instance->irq = 0;
682 #ifdef CONFIG_ATARI_SCSI_RESET_BOOT
683 atari_scsi_reset_boot();
684 #endif
685 NCR5380_init (instance, 0);
687 if (IS_A_TT()) {
689 /* This int is actually "pseudo-slow", i.e. it acts like a slow
690 * interrupt after having cleared the pending flag for the DMA
691 * interrupt. */
692 request_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr, IRQ_TYPE_SLOW,
693 "SCSI NCR5380", scsi_tt_intr);
694 tt_mfp.active_edge |= 0x80; /* SCSI int on L->H */
695 #ifdef REAL_DMA
696 tt_scsi_dma.dma_ctrl = 0;
697 atari_dma_residual = 0;
698 #endif /* REAL_DMA */
699 #ifdef REAL_DMA
700 #ifdef CONFIG_TT_DMA_EMUL
701 if (MACH_IS_HADES) {
702 request_irq(IRQ_AUTO_2, hades_dma_emulator,
703 IRQ_TYPE_PRIO, "Hades DMA emulator",
704 hades_dma_emulator);
706 #endif
707 if (MACH_IS_MEDUSA || MACH_IS_HADES) {
708 /* While the read overruns (described by Drew Eckhardt in
709 * NCR5380.c) never happened on TTs, they do in fact on the Medusa
710 * (This was the cause why SCSI didn't work right for so long
711 * there.) Since handling the overruns slows down a bit, I turned
712 * the #ifdef's into a runtime condition.
714 * In principle it should be sufficient to do max. 1 byte with
715 * PIO, but there is another problem on the Medusa with the DMA
716 * rest data register. So 'atari_read_overruns' is currently set
717 * to 4 to avoid having transfers that aren't a multiple of 4. If
718 * the rest data bug is fixed, this can be lowered to 1.
720 atari_read_overruns = 4;
722 #endif
725 else { /* ! IS_A_TT */
727 /* Nothing to do for the interrupt: the ST-DMA is initialized
728 * already by atari_init_INTS()
731 #ifdef REAL_DMA
732 atari_dma_residual = 0;
733 atari_dma_active = 0;
734 atari_dma_stram_mask = (ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000
735 : 0xff000000);
736 #endif
739 printk(KERN_INFO "scsi%d: options CAN_QUEUE=%d CMD_PER_LUN=%d SCAT-GAT=%d "
740 #ifdef SUPPORT_TAGS
741 "TAGGED-QUEUING=%s "
742 #endif
743 "HOSTID=%d",
744 instance->host_no, instance->hostt->can_queue,
745 instance->hostt->cmd_per_lun,
746 instance->hostt->sg_tablesize,
747 #ifdef SUPPORT_TAGS
748 setup_use_tagged_queuing ? "yes" : "no",
749 #endif
750 instance->hostt->this_id );
751 NCR5380_print_options (instance);
752 printk ("\n");
754 called = 1;
755 return( 1 );
758 #ifdef MODULE
759 int atari_scsi_release (struct Scsi_Host *sh)
761 if (IS_A_TT())
762 free_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr);
763 if (atari_dma_buffer)
764 atari_stram_free (atari_dma_buffer);
765 return 1;
767 #endif
769 void __init atari_scsi_setup(char *str, int *ints)
771 /* Format of atascsi parameter is:
772 * atascsi=<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
773 * Defaults depend on TT or Falcon, hostid determined at run time.
774 * Negative values mean don't change.
777 if (ints[0] < 1) {
778 printk( "atari_scsi_setup: no arguments!\n" );
779 return;
782 if (ints[0] >= 1) {
783 if (ints[1] > 0)
784 /* no limits on this, just > 0 */
785 setup_can_queue = ints[1];
787 if (ints[0] >= 2) {
788 if (ints[2] > 0)
789 setup_cmd_per_lun = ints[2];
791 if (ints[0] >= 3) {
792 if (ints[3] >= 0) {
793 setup_sg_tablesize = ints[3];
794 /* Must be <= SG_ALL (255) */
795 if (setup_sg_tablesize > SG_ALL)
796 setup_sg_tablesize = SG_ALL;
799 if (ints[0] >= 4) {
800 /* Must be between 0 and 7 */
801 if (ints[4] >= 0 && ints[4] <= 7)
802 setup_hostid = ints[4];
803 else if (ints[4] > 7)
804 printk( "atari_scsi_setup: invalid host ID %d !\n", ints[4] );
806 #ifdef SUPPORT_TAGS
807 if (ints[0] >= 5) {
808 if (ints[5] >= 0)
809 setup_use_tagged_queuing = !!ints[5];
811 #endif
814 int atari_scsi_reset( Scsi_Cmnd *cmd, unsigned int reset_flags)
816 int rv;
817 struct NCR5380_hostdata *hostdata =
818 (struct NCR5380_hostdata *)cmd->host->hostdata;
820 /* For doing the reset, SCSI interrupts must be disabled first,
821 * since the 5380 raises its IRQ line while _RST is active and we
822 * can't disable interrupts completely, since we need the timer.
824 /* And abort a maybe active DMA transfer */
825 if (IS_A_TT()) {
826 atari_turnoff_irq( IRQ_TT_MFP_SCSI );
827 #ifdef REAL_DMA
828 tt_scsi_dma.dma_ctrl = 0;
829 #endif /* REAL_DMA */
831 else {
832 atari_turnoff_irq( IRQ_MFP_FSCSI );
833 #ifdef REAL_DMA
834 st_dma.dma_mode_status = 0x90;
835 atari_dma_active = 0;
836 atari_dma_orig_addr = NULL;
837 #endif /* REAL_DMA */
840 rv = NCR5380_reset(cmd, reset_flags);
842 /* Re-enable ints */
843 if (IS_A_TT()) {
844 atari_turnon_irq( IRQ_TT_MFP_SCSI );
846 else {
847 atari_turnon_irq( IRQ_MFP_FSCSI );
849 if ((rv & SCSI_RESET_ACTION) == SCSI_RESET_SUCCESS)
850 falcon_release_lock_if_possible(hostdata);
852 return( rv );
856 #ifdef CONFIG_ATARI_SCSI_RESET_BOOT
857 static void __init atari_scsi_reset_boot(void)
859 unsigned long end;
862 * Do a SCSI reset to clean up the bus during initialization. No messing
863 * with the queues, interrupts, or locks necessary here.
866 printk( "Atari SCSI: resetting the SCSI bus..." );
868 /* get in phase */
869 NCR5380_write( TARGET_COMMAND_REG,
870 PHASE_SR_TO_TCR( NCR5380_read(STATUS_REG) ));
872 /* assert RST */
873 NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_RST );
874 /* The min. reset hold time is 25us, so 40us should be enough */
875 udelay( 50 );
876 /* reset RST and interrupt */
877 NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE );
878 NCR5380_read( RESET_PARITY_INTERRUPT_REG );
880 end = jiffies + AFTER_RESET_DELAY;
881 while (time_before(jiffies, end))
882 barrier();
884 printk( " done\n" );
886 #endif
889 const char * atari_scsi_info (struct Scsi_Host *host)
891 /* atari_scsi_detect() is verbose enough... */
892 static const char string[] = "Atari native SCSI";
893 return string;
897 #if defined(REAL_DMA)
899 unsigned long atari_scsi_dma_setup( struct Scsi_Host *instance, void *data,
900 unsigned long count, int dir )
902 unsigned long addr = virt_to_phys( data );
904 DMA_PRINTK("scsi%d: setting up dma, data = %p, phys = %lx, count = %ld, "
905 "dir = %d\n", instance->host_no, data, addr, count, dir);
907 if (!IS_A_TT() && !STRAM_ADDR(addr)) {
908 /* If we have a non-DMAable address on a Falcon, use the dribble
909 * buffer; 'orig_addr' != 0 in the read case tells the interrupt
910 * handler to copy data from the dribble buffer to the originally
911 * wanted address.
913 if (dir)
914 memcpy( atari_dma_buffer, data, count );
915 else
916 atari_dma_orig_addr = data;
917 addr = atari_dma_phys_buffer;
920 atari_dma_startaddr = addr; /* Needed for calculating residual later. */
922 /* Cache cleanup stuff: On writes, push any dirty cache out before sending
923 * it to the peripheral. (Must be done before DMA setup, since at least
924 * the ST-DMA begins to fill internal buffers right after setup. For
925 * reads, invalidate any cache, may be altered after DMA without CPU
926 * knowledge.
928 * ++roman: For the Medusa, there's no need at all for that cache stuff,
929 * because the hardware does bus snooping (fine!).
931 dma_cache_maintenance( addr, count, dir );
933 if (count == 0)
934 printk(KERN_NOTICE "SCSI warning: DMA programmed for 0 bytes !\n");
936 if (IS_A_TT()) {
937 tt_scsi_dma.dma_ctrl = dir;
938 SCSI_DMA_WRITE_P( dma_addr, addr );
939 SCSI_DMA_WRITE_P( dma_cnt, count );
940 tt_scsi_dma.dma_ctrl = dir | 2;
942 else { /* ! IS_A_TT */
944 /* set address */
945 SCSI_DMA_SETADR( addr );
947 /* toggle direction bit to clear FIFO and set DMA direction */
948 dir <<= 8;
949 st_dma.dma_mode_status = 0x90 | dir;
950 st_dma.dma_mode_status = 0x90 | (dir ^ 0x100);
951 st_dma.dma_mode_status = 0x90 | dir;
952 udelay(40);
953 /* On writes, round up the transfer length to the next multiple of 512
954 * (see also comment at atari_dma_xfer_len()). */
955 st_dma.fdc_acces_seccount = (count + (dir ? 511 : 0)) >> 9;
956 udelay(40);
957 st_dma.dma_mode_status = 0x10 | dir;
958 udelay(40);
959 /* need not restore value of dir, only boolean value is tested */
960 atari_dma_active = 1;
963 return( count );
967 static long atari_scsi_dma_residual( struct Scsi_Host *instance )
969 return( atari_dma_residual );
973 #define CMD_SURELY_BLOCK_MODE 0
974 #define CMD_SURELY_BYTE_MODE 1
975 #define CMD_MODE_UNKNOWN 2
977 static int falcon_classify_cmd( Scsi_Cmnd *cmd )
979 unsigned char opcode = cmd->cmnd[0];
981 if (opcode == READ_DEFECT_DATA || opcode == READ_LONG ||
982 opcode == READ_BUFFER)
983 return( CMD_SURELY_BYTE_MODE );
984 else if (opcode == READ_6 || opcode == READ_10 ||
985 opcode == 0xa8 /* READ_12 */ || opcode == READ_REVERSE ||
986 opcode == RECOVER_BUFFERED_DATA) {
987 /* In case of a sequential-access target (tape), special care is
988 * needed here: The transfer is block-mode only if the 'fixed' bit is
989 * set! */
990 if (cmd->device->type == TYPE_TAPE && !(cmd->cmnd[1] & 1))
991 return( CMD_SURELY_BYTE_MODE );
992 else
993 return( CMD_SURELY_BLOCK_MODE );
995 else
996 return( CMD_MODE_UNKNOWN );
1000 /* This function calculates the number of bytes that can be transferred via
1001 * DMA. On the TT, this is arbitrary, but on the Falcon we have to use the
1002 * ST-DMA chip. There are only multiples of 512 bytes possible and max.
1003 * 255*512 bytes :-( This means also, that defining READ_OVERRUNS is not
1004 * possible on the Falcon, since that would require to program the DMA for
1005 * n*512 - atari_read_overrun bytes. But it seems that the Falcon doesn't have
1006 * the overrun problem, so this question is academic :-)
1009 static unsigned long atari_dma_xfer_len( unsigned long wanted_len,
1010 Scsi_Cmnd *cmd,
1011 int write_flag )
1013 unsigned long possible_len, limit;
1014 #ifndef CONFIG_TT_DMA_EMUL
1015 if (MACH_IS_HADES)
1016 /* Hades has no SCSI DMA at all :-( Always force use of PIO */
1017 return( 0 );
1018 #endif
1019 if (IS_A_TT())
1020 /* TT SCSI DMA can transfer arbitrary #bytes */
1021 return( wanted_len );
1023 /* ST DMA chip is stupid -- only multiples of 512 bytes! (and max.
1024 * 255*512 bytes, but this should be enough)
1026 * ++roman: Aaargl! Another Falcon-SCSI problem... There are some commands
1027 * that return a number of bytes which cannot be known beforehand. In this
1028 * case, the given transfer length is an "allocation length". Now it
1029 * can happen that this allocation length is a multiple of 512 bytes and
1030 * the DMA is used. But if not n*512 bytes really arrive, some input data
1031 * will be lost in the ST-DMA's FIFO :-( Thus, we have to distinguish
1032 * between commands that do block transfers and those that do byte
1033 * transfers. But this isn't easy... there are lots of vendor specific
1034 * commands, and the user can issue any command via the
1035 * SCSI_IOCTL_SEND_COMMAND.
1037 * The solution: We classify SCSI commands in 1) surely block-mode cmd.s,
1038 * 2) surely byte-mode cmd.s and 3) cmd.s with unknown mode. In case 1)
1039 * and 3), the thing to do is obvious: allow any number of blocks via DMA
1040 * or none. In case 2), we apply some heuristic: Byte mode is assumed if
1041 * the transfer (allocation) length is < 1024, hoping that no cmd. not
1042 * explicitly known as byte mode have such big allocation lengths...
1043 * BTW, all the discussion above applies only to reads. DMA writes are
1044 * unproblematic anyways, since the targets aborts the transfer after
1045 * receiving a sufficient number of bytes.
1047 * Another point: If the transfer is from/to an non-ST-RAM address, we
1048 * use the dribble buffer and thus can do only STRAM_BUFFER_SIZE bytes.
1051 if (write_flag) {
1052 /* Write operation can always use the DMA, but the transfer size must
1053 * be rounded up to the next multiple of 512 (atari_dma_setup() does
1054 * this).
1056 possible_len = wanted_len;
1058 else {
1059 /* Read operations: if the wanted transfer length is not a multiple of
1060 * 512, we cannot use DMA, since the ST-DMA cannot split transfers
1061 * (no interrupt on DMA finished!)
1063 if (wanted_len & 0x1ff)
1064 possible_len = 0;
1065 else {
1066 /* Now classify the command (see above) and decide whether it is
1067 * allowed to do DMA at all */
1068 switch( falcon_classify_cmd( cmd )) {
1069 case CMD_SURELY_BLOCK_MODE:
1070 possible_len = wanted_len;
1071 break;
1072 case CMD_SURELY_BYTE_MODE:
1073 possible_len = 0; /* DMA prohibited */
1074 break;
1075 case CMD_MODE_UNKNOWN:
1076 default:
1077 /* For unknown commands assume block transfers if the transfer
1078 * size/allocation length is >= 1024 */
1079 possible_len = (wanted_len < 1024) ? 0 : wanted_len;
1080 break;
1085 /* Last step: apply the hard limit on DMA transfers */
1086 limit = (atari_dma_buffer && !STRAM_ADDR( virt_to_phys(cmd->SCp.ptr) )) ?
1087 STRAM_BUFFER_SIZE : 255*512;
1088 if (possible_len > limit)
1089 possible_len = limit;
1091 if (possible_len != wanted_len)
1092 DMA_PRINTK("Sorry, must cut DMA transfer size to %ld bytes "
1093 "instead of %ld\n", possible_len, wanted_len);
1095 return( possible_len );
1099 #endif /* REAL_DMA */
1102 /* NCR5380 register access functions
1104 * There are separate functions for TT and Falcon, because the access
1105 * methods are quite different. The calling macros NCR5380_read and
1106 * NCR5380_write call these functions via function pointers.
1109 static unsigned char atari_scsi_tt_reg_read( unsigned char reg )
1111 return( tt_scsi_regp[reg * 2] );
1114 static void atari_scsi_tt_reg_write( unsigned char reg, unsigned char value )
1116 tt_scsi_regp[reg * 2] = value;
1119 static unsigned char atari_scsi_falcon_reg_read( unsigned char reg )
1121 dma_wd.dma_mode_status= (u_short)(0x88 + reg);
1122 return( (u_char)dma_wd.fdc_acces_seccount );
1125 static void atari_scsi_falcon_reg_write( unsigned char reg, unsigned char value )
1127 dma_wd.dma_mode_status = (u_short)(0x88 + reg);
1128 dma_wd.fdc_acces_seccount = (u_short)value;
1132 #include "atari_NCR5380.c"
1134 #ifdef MODULE
1135 Scsi_Host_Template driver_template = ATARI_SCSI;
1137 #include "scsi_module.c"
1138 #endif