1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68#include <linux/config.h>
69#include <linux/module.h>
70
71#define NDEBUG (0)
72
73#define NDEBUG_ABORT 0x800000
74#define NDEBUG_TAGS 0x1000000
75#define NDEBUG_MERGING 0x2000000
76
77#define AUTOSENSE
78
79#define REAL_DMA
80
81#define SUPPORT_TAGS
82#define MAX_TAGS 32
83
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>
94
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>
103
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>
112
113#include <linux/stat.h>
114
115#define IS_A_TT() ATARIHW_PRESENT(TT_SCSI)
116
117#define SCSI_DMA_WRITE_P(elt,val) \
118 do { \
119 unsigned long v = val; \
120 tt_scsi_dma.elt##_lo = v & 0xff; \
121 v >>= 8; \
122 tt_scsi_dma.elt##_lmd = v & 0xff; \
123 v >>= 8; \
124 tt_scsi_dma.elt##_hmd = v & 0xff; \
125 v >>= 8; \
126 tt_scsi_dma.elt##_hi = v & 0xff; \
127 } while(0)
128
129#define SCSI_DMA_READ_P(elt) \
130 (((((((unsigned long)tt_scsi_dma.elt##_hi << 8) | \
131 (unsigned long)tt_scsi_dma.elt##_hmd) << 8) | \
132 (unsigned long)tt_scsi_dma.elt##_lmd) << 8) | \
133 (unsigned long)tt_scsi_dma.elt##_lo)
134
135
136static inline void SCSI_DMA_SETADR(unsigned long adr)
137{
138 st_dma.dma_lo = (unsigned char)adr;
139 MFPDELAY();
140 adr >>= 8;
141 st_dma.dma_md = (unsigned char)adr;
142 MFPDELAY();
143 adr >>= 8;
144 st_dma.dma_hi = (unsigned char)adr;
145 MFPDELAY();
146}
147
148static inline unsigned long SCSI_DMA_GETADR(void)
149{
150 unsigned long adr;
151 adr = st_dma.dma_lo;
152 MFPDELAY();
153 adr |= (st_dma.dma_md & 0xff) << 8;
154 MFPDELAY();
155 adr |= (st_dma.dma_hi & 0xff) << 16;
156 MFPDELAY();
157 return adr;
158}
159
160static inline void ENABLE_IRQ(void)
161{
162 if (IS_A_TT())
163 atari_enable_irq(IRQ_TT_MFP_SCSI);
164 else
165 atari_enable_irq(IRQ_MFP_FSCSI);
166}
167
168static inline void DISABLE_IRQ(void)
169{
170 if (IS_A_TT())
171 atari_disable_irq(IRQ_TT_MFP_SCSI);
172 else
173 atari_disable_irq(IRQ_MFP_FSCSI);
174}
175
176
177#define HOSTDATA_DMALEN (((struct NCR5380_hostdata *) \
178 (atari_scsi_host->hostdata))->dma_len)
179
180
181
182
183#ifndef CONFIG_ATARI_SCSI_TOSHIBA_DELAY
184#define AFTER_RESET_DELAY (HZ/2)
185#else
186#define AFTER_RESET_DELAY (5*HZ/2)
187#endif
188
189
190
191#ifdef REAL_DMA
192static int scsi_dma_is_ignored_buserr( unsigned char dma_stat );
193static void atari_scsi_fetch_restbytes( void );
194static long atari_scsi_dma_residual( struct Scsi_Host *instance );
195static int falcon_classify_cmd( Scsi_Cmnd *cmd );
196static unsigned long atari_dma_xfer_len( unsigned long wanted_len,
197 Scsi_Cmnd *cmd, int write_flag );
198#endif
199static void scsi_tt_intr( int irq, void *dummy, struct pt_regs *fp);
200static void scsi_falcon_intr( int irq, void *dummy, struct pt_regs *fp);
201static void falcon_release_lock_if_possible( struct NCR5380_hostdata *
202 hostdata );
203static void falcon_get_lock( void );
204#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
205static void atari_scsi_reset_boot( void );
206#endif
207static unsigned char atari_scsi_tt_reg_read( unsigned char reg );
208static void atari_scsi_tt_reg_write( unsigned char reg, unsigned char value);
209static unsigned char atari_scsi_falcon_reg_read( unsigned char reg );
210static void atari_scsi_falcon_reg_write( unsigned char reg, unsigned char value );
211
212
213
214
215static struct Scsi_Host *atari_scsi_host = NULL;
216static unsigned char (*atari_scsi_reg_read)( unsigned char reg );
217static void (*atari_scsi_reg_write)( unsigned char reg, unsigned char value );
218
219#ifdef REAL_DMA
220static unsigned long atari_dma_residual, atari_dma_startaddr;
221static short atari_dma_active;
222
223static char *atari_dma_buffer = NULL;
224
225static unsigned long atari_dma_phys_buffer;
226
227static char *atari_dma_orig_addr;
228
229
230
231
232
233
234#define STRAM_BUFFER_SIZE (4096)
235
236static unsigned long atari_dma_stram_mask;
237#define STRAM_ADDR(a) (((a) & atari_dma_stram_mask) == 0)
238
239static int atari_read_overruns = 0;
240#endif
241
242static int setup_can_queue = -1;
243MODULE_PARM(setup_can_queue, "i");
244static int setup_cmd_per_lun = -1;
245MODULE_PARM(setup_cmd_per_lun, "i");
246static int setup_sg_tablesize = -1;
247MODULE_PARM(setup_sg_tablesize, "i");
248#ifdef SUPPORT_TAGS
249static int setup_use_tagged_queuing = -1;
250MODULE_PARM(setup_use_tagged_queuing, "i");
251#endif
252static int setup_hostid = -1;
253MODULE_PARM(setup_hostid, "i");
254
255
256#if defined(CONFIG_TT_DMA_EMUL)
257#include "atari_dma_emul.c"
258#endif
259
260#if defined(REAL_DMA)
261
262static int scsi_dma_is_ignored_buserr( unsigned char dma_stat )
263{
264 int i;
265 unsigned long addr = SCSI_DMA_READ_P( dma_addr ), end_addr;
266
267 if (dma_stat & 0x01) {
268
269
270
271
272
273
274 for( i = 0; i < m68k_num_memory; ++i ) {
275 end_addr = m68k_memory[i].addr +
276 m68k_memory[i].size;
277 if (end_addr <= addr && addr <= end_addr + 4)
278 return( 1 );
279 }
280 }
281 return( 0 );
282}
283
284
285#if 0
286
287
288
289
290static void scsi_dma_buserr (int irq, void *dummy, struct pt_regs *fp)
291{
292 unsigned char dma_stat = tt_scsi_dma.dma_ctrl;
293
294
295
296 if (atari_irq_pending( IRQ_TT_MFP_SCSI ))
297 return;
298
299 printk("Bad SCSI DMA interrupt! dma_addr=0x%08lx dma_stat=%02x dma_cnt=%08lx\n",
300 SCSI_DMA_READ_P(dma_addr), dma_stat, SCSI_DMA_READ_P(dma_cnt));
301 if (dma_stat & 0x80) {
302 if (!scsi_dma_is_ignored_buserr( dma_stat ))
303 printk( "SCSI DMA bus error -- bad DMA programming!\n" );
304 }
305 else {
306
307
308
309
310
311 printk( "SCSI DMA intr ?? -- this shouldn't happen!\n" );
312 }
313}
314#endif
315
316#endif
317
318
319static void scsi_tt_intr (int irq, void *dummy, struct pt_regs *fp)
320{
321#ifdef REAL_DMA
322 int dma_stat;
323
324 dma_stat = tt_scsi_dma.dma_ctrl;
325
326 INT_PRINTK("scsi%d: NCR5380 interrupt, DMA status = %02x\n",
327 atari_scsi_host->host_no, dma_stat & 0xff);
328
329
330
331
332 if (dma_stat & 0x80) {
333 if (!scsi_dma_is_ignored_buserr( dma_stat )) {
334 printk(KERN_ERR "SCSI DMA caused bus error near 0x%08lx\n",
335 SCSI_DMA_READ_P(dma_addr));
336 printk(KERN_CRIT "SCSI DMA bus error -- bad DMA programming!");
337 }
338 }
339
340
341
342
343
344
345
346
347
348
349 if ((dma_stat & 0x02) && !(dma_stat & 0x40)) {
350 atari_dma_residual = HOSTDATA_DMALEN - (SCSI_DMA_READ_P( dma_addr ) -
351 atari_dma_startaddr);
352
353 DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n",
354 atari_dma_residual);
355
356 if ((signed int)atari_dma_residual < 0)
357 atari_dma_residual = 0;
358 if ((dma_stat & 1) == 0) {
359
360
361 atari_scsi_fetch_restbytes();
362 }
363 else {
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381 if (atari_dma_residual & 0x1ff) {
382 DMA_PRINTK("SCSI DMA: DMA bug corrected, "
383 "difference %ld bytes\n",
384 512 - (atari_dma_residual & 0x1ff));
385 atari_dma_residual = (atari_dma_residual + 511) & ~0x1ff;
386 }
387 }
388 tt_scsi_dma.dma_ctrl = 0;
389 }
390
391
392 if (dma_stat & 0x40) {
393 atari_dma_residual = 0;
394 if ((dma_stat & 1) == 0)
395 atari_scsi_fetch_restbytes();
396 tt_scsi_dma.dma_ctrl = 0;
397 }
398
399#endif
400
401 NCR5380_intr (0, 0, 0);
402
403#if 0
404
405 atari_enable_irq( IRQ_TT_MFP_SCSI );
406#endif
407}
408
409
410static void scsi_falcon_intr (int irq, void *dummy, struct pt_regs *fp)
411{
412#ifdef REAL_DMA
413 int dma_stat;
414
415
416
417
418 st_dma.dma_mode_status = 0x90;
419 dma_stat = st_dma.dma_mode_status;
420
421
422
423
424 if (!(dma_stat & 0x01)) {
425
426 printk(KERN_CRIT "SCSI DMA error near 0x%08lx!\n", SCSI_DMA_GETADR());
427 }
428
429
430
431
432
433
434 if (atari_dma_active && (dma_stat & 0x02)) {
435 unsigned long transferred;
436
437 transferred = SCSI_DMA_GETADR() - atari_dma_startaddr;
438
439
440
441
442
443 if (transferred & 15)
444 printk(KERN_ERR "SCSI DMA error: %ld bytes lost in "
445 "ST-DMA fifo\n", transferred & 15);
446
447 atari_dma_residual = HOSTDATA_DMALEN - transferred;
448 DMA_PRINTK("SCSI DMA: There are %ld residual bytes.\n",
449 atari_dma_residual);
450 }
451 else
452 atari_dma_residual = 0;
453 atari_dma_active = 0;
454
455 if (atari_dma_orig_addr) {
456
457
458
459 memcpy(atari_dma_orig_addr, phys_to_virt(atari_dma_startaddr),
460 HOSTDATA_DMALEN - atari_dma_residual);
461 atari_dma_orig_addr = NULL;
462 }
463
464#endif
465
466 NCR5380_intr (0, 0, 0);
467}
468
469
470#ifdef REAL_DMA
471static void atari_scsi_fetch_restbytes( void )
472{
473 int nr;
474 char *src, *dst;
475 unsigned long phys_dst;
476
477
478 phys_dst = SCSI_DMA_READ_P(dma_addr);
479 nr = phys_dst & 3;
480 if (nr) {
481
482
483 phys_dst ^= nr;
484 DMA_PRINTK("SCSI DMA: there are %d rest bytes for phys addr 0x%08lx",
485 nr, phys_dst);
486
487 dst = phys_to_virt(phys_dst);
488 DMA_PRINTK(" = virt addr %p\n", dst);
489 for (src = (char *)&tt_scsi_dma.dma_restdata; nr != 0; --nr)
490 *dst++ = *src++;
491 }
492}
493#endif
494
495
496static int falcon_got_lock = 0;
497static DECLARE_WAIT_QUEUE_HEAD(falcon_fairness_wait);
498static int falcon_trying_lock = 0;
499static DECLARE_WAIT_QUEUE_HEAD(falcon_try_wait);
500static int falcon_dont_release = 0;
501
502
503
504
505
506
507
508
509static void
510falcon_release_lock_if_possible( struct NCR5380_hostdata * hostdata )
511{
512 unsigned long oldflags;
513
514 if (IS_A_TT()) return;
515
516 save_flags(oldflags);
517 cli();
518
519 if (falcon_got_lock &&
520 !hostdata->disconnected_queue &&
521 !hostdata->issue_queue &&
522 !hostdata->connected) {
523
524 if (falcon_dont_release) {
525#if 0
526 printk("WARNING: Lock release not allowed. Ignored\n");
527#endif
528 restore_flags(oldflags);
529 return;
530 }
531 falcon_got_lock = 0;
532 stdma_release();
533 wake_up( &falcon_fairness_wait );
534 }
535
536 restore_flags(oldflags);
537}
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554static void falcon_get_lock( void )
555{
556 unsigned long oldflags;
557
558 if (IS_A_TT()) return;
559
560 save_flags(oldflags);
561 cli();
562
563 while( !in_interrupt() && falcon_got_lock && stdma_others_waiting() )
564 sleep_on( &falcon_fairness_wait );
565
566 while (!falcon_got_lock) {
567 if (in_interrupt())
568 panic( "Falcon SCSI hasn't ST-DMA lock in interrupt" );
569 if (!falcon_trying_lock) {
570 falcon_trying_lock = 1;
571 stdma_lock(scsi_falcon_intr, NULL);
572 falcon_got_lock = 1;
573 falcon_trying_lock = 0;
574 wake_up( &falcon_try_wait );
575 }
576 else {
577 sleep_on( &falcon_try_wait );
578 }
579 }
580
581 restore_flags(oldflags);
582 if (!falcon_got_lock)
583 panic("Falcon SCSI: someone stole the lock :-(\n");
584}
585
586
587
588
589
590
591
592#if 0
593int atari_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *))
594{
595
596
597
598
599 return( NCR5380_queue_command( cmd, done ) );
600}
601#endif
602
603
604int atari_scsi_detect (Scsi_Host_Template *host)
605{
606 static int called = 0;
607 struct Scsi_Host *instance;
608
609 if (!MACH_IS_ATARI ||
610 (!ATARIHW_PRESENT(ST_SCSI) && !ATARIHW_PRESENT(TT_SCSI)) ||
611 called)
612 return( 0 );
613
614 host->proc_name = "Atari";
615
616 atari_scsi_reg_read = IS_A_TT() ? atari_scsi_tt_reg_read :
617 atari_scsi_falcon_reg_read;
618 atari_scsi_reg_write = IS_A_TT() ? atari_scsi_tt_reg_write :
619 atari_scsi_falcon_reg_write;
620
621
622 host->can_queue =
623 (setup_can_queue > 0) ? setup_can_queue :
624 IS_A_TT() ? ATARI_TT_CAN_QUEUE : ATARI_FALCON_CAN_QUEUE;
625 host->cmd_per_lun =
626 (setup_cmd_per_lun > 0) ? setup_cmd_per_lun :
627 IS_A_TT() ? ATARI_TT_CMD_PER_LUN : ATARI_FALCON_CMD_PER_LUN;
628
629 host->sg_tablesize =
630 !IS_A_TT() ? ATARI_FALCON_SG_TABLESIZE :
631 (setup_sg_tablesize >= 0) ? setup_sg_tablesize : ATARI_TT_SG_TABLESIZE;
632
633 if (setup_hostid >= 0)
634 host->this_id = setup_hostid;
635 else {
636
637 host->this_id = 7;
638
639 if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) {
640 unsigned char b = nvram_read_byte( 14 );
641
642 if (b & 0x80)
643 host->this_id = b & 7;
644 }
645 }
646
647#ifdef SUPPORT_TAGS
648 if (setup_use_tagged_queuing < 0)
649 setup_use_tagged_queuing = DEFAULT_USE_TAGGED_QUEUING;
650#endif
651#ifdef REAL_DMA
652
653
654
655
656
657 if (MACH_IS_ATARI && ATARIHW_PRESENT(ST_SCSI) &&
658 !ATARIHW_PRESENT(EXTD_DMA) && m68k_num_memory > 1) {
659 atari_dma_buffer = atari_stram_alloc(STRAM_BUFFER_SIZE, "SCSI");
660 if (!atari_dma_buffer) {
661 printk( KERN_ERR "atari_scsi_detect: can't allocate ST-RAM "
662 "double buffer\n" );
663 return( 0 );
664 }
665 atari_dma_phys_buffer = virt_to_phys( atari_dma_buffer );
666 atari_dma_orig_addr = 0;
667 }
668#endif
669 instance = scsi_register (host, sizeof (struct NCR5380_hostdata));
670 if(instance == NULL)
671 {
672 atari_stram_free(atari_dma_buffer);
673 atari_dma_buffer = 0;
674 return 0;
675 }
676 atari_scsi_host = instance;
677
678
679
680
681 instance->irq = 0;
682
683#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
684 atari_scsi_reset_boot();
685#endif
686 NCR5380_init (instance, 0);
687
688 if (IS_A_TT()) {
689
690
691
692
693 if (request_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr, IRQ_TYPE_SLOW,
694 "SCSI NCR5380", scsi_tt_intr)) {
695 printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting",IRQ_TT_MFP_SCSI);
696 scsi_unregister(atari_scsi_host);
697 atari_stram_free(atari_dma_buffer);
698 atari_dma_buffer = 0;
699 return 0;
700 }
701 tt_mfp.active_edge |= 0x80;
702#ifdef REAL_DMA
703 tt_scsi_dma.dma_ctrl = 0;
704 atari_dma_residual = 0;
705#ifdef CONFIG_TT_DMA_EMUL
706 if (MACH_IS_HADES) {
707 if (request_irq(IRQ_AUTO_2, hades_dma_emulator,
708 IRQ_TYPE_PRIO, "Hades DMA emulator",
709 hades_dma_emulator)) {
710 printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting (MACH_IS_HADES)",IRQ_AUTO_2);
711 free_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr);
712 scsi_unregister(atari_scsi_host);
713 atari_stram_free(atari_dma_buffer);
714 atari_dma_buffer = 0;
715 return 0;
716 }
717 }
718#endif
719 if (MACH_IS_MEDUSA || MACH_IS_HADES) {
720
721
722
723
724
725
726
727
728
729
730
731
732 atari_read_overruns = 4;
733 }
734#endif
735 }
736 else {
737
738
739
740
741
742#ifdef REAL_DMA
743 atari_dma_residual = 0;
744 atari_dma_active = 0;
745 atari_dma_stram_mask = (ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000
746 : 0xff000000);
747#endif
748 }
749
750 printk(KERN_INFO "scsi%d: options CAN_QUEUE=%d CMD_PER_LUN=%d SCAT-GAT=%d "
751#ifdef SUPPORT_TAGS
752 "TAGGED-QUEUING=%s "
753#endif
754 "HOSTID=%d",
755 instance->host_no, instance->hostt->can_queue,
756 instance->hostt->cmd_per_lun,
757 instance->hostt->sg_tablesize,
758#ifdef SUPPORT_TAGS
759 setup_use_tagged_queuing ? "yes" : "no",
760#endif
761 instance->hostt->this_id );
762 NCR5380_print_options (instance);
763 printk ("\n");
764
765 called = 1;
766 return( 1 );
767}
768
769#ifdef MODULE
770int atari_scsi_release (struct Scsi_Host *sh)
771{
772 if (IS_A_TT())
773 free_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr);
774 if (atari_dma_buffer)
775 atari_stram_free (atari_dma_buffer);
776 return 1;
777}
778#endif
779
780void __init atari_scsi_setup(char *str, int *ints)
781{
782
783
784
785
786
787
788 if (ints[0] < 1) {
789 printk( "atari_scsi_setup: no arguments!\n" );
790 return;
791 }
792
793 if (ints[0] >= 1) {
794 if (ints[1] > 0)
795
796 setup_can_queue = ints[1];
797 }
798 if (ints[0] >= 2) {
799 if (ints[2] > 0)
800 setup_cmd_per_lun = ints[2];
801 }
802 if (ints[0] >= 3) {
803 if (ints[3] >= 0) {
804 setup_sg_tablesize = ints[3];
805
806 if (setup_sg_tablesize > SG_ALL)
807 setup_sg_tablesize = SG_ALL;
808 }
809 }
810 if (ints[0] >= 4) {
811
812 if (ints[4] >= 0 && ints[4] <= 7)
813 setup_hostid = ints[4];
814 else if (ints[4] > 7)
815 printk( "atari_scsi_setup: invalid host ID %d !\n", ints[4] );
816 }
817#ifdef SUPPORT_TAGS
818 if (ints[0] >= 5) {
819 if (ints[5] >= 0)
820 setup_use_tagged_queuing = !!ints[5];
821 }
822#endif
823}
824
825int atari_scsi_reset( Scsi_Cmnd *cmd, unsigned int reset_flags)
826{
827 int rv;
828 struct NCR5380_hostdata *hostdata =
829 (struct NCR5380_hostdata *)cmd->host->hostdata;
830
831
832
833
834
835
836 if (IS_A_TT()) {
837 atari_turnoff_irq( IRQ_TT_MFP_SCSI );
838#ifdef REAL_DMA
839 tt_scsi_dma.dma_ctrl = 0;
840#endif
841 }
842 else {
843 atari_turnoff_irq( IRQ_MFP_FSCSI );
844#ifdef REAL_DMA
845 st_dma.dma_mode_status = 0x90;
846 atari_dma_active = 0;
847 atari_dma_orig_addr = NULL;
848#endif
849 }
850
851 rv = NCR5380_reset(cmd, reset_flags);
852
853
854 if (IS_A_TT()) {
855 atari_turnon_irq( IRQ_TT_MFP_SCSI );
856 }
857 else {
858 atari_turnon_irq( IRQ_MFP_FSCSI );
859 }
860 if ((rv & SCSI_RESET_ACTION) == SCSI_RESET_SUCCESS)
861 falcon_release_lock_if_possible(hostdata);
862
863 return( rv );
864}
865
866
867#ifdef CONFIG_ATARI_SCSI_RESET_BOOT
868static void __init atari_scsi_reset_boot(void)
869{
870 unsigned long end;
871
872
873
874
875
876
877 printk( "Atari SCSI: resetting the SCSI bus..." );
878
879
880 NCR5380_write( TARGET_COMMAND_REG,
881 PHASE_SR_TO_TCR( NCR5380_read(STATUS_REG) ));
882
883
884 NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_RST );
885
886 udelay( 50 );
887
888 NCR5380_write( INITIATOR_COMMAND_REG, ICR_BASE );
889 NCR5380_read( RESET_PARITY_INTERRUPT_REG );
890
891 end = jiffies + AFTER_RESET_DELAY;
892 while (time_before(jiffies, end))
893 barrier();
894
895 printk( " done\n" );
896}
897#endif
898
899
900const char * atari_scsi_info (struct Scsi_Host *host)
901{
902
903 static const char string[] = "Atari native SCSI";
904 return string;
905}
906
907
908#if defined(REAL_DMA)
909
910unsigned long atari_scsi_dma_setup( struct Scsi_Host *instance, void *data,
911 unsigned long count, int dir )
912{
913 unsigned long addr = virt_to_phys( data );
914
915 DMA_PRINTK("scsi%d: setting up dma, data = %p, phys = %lx, count = %ld, "
916 "dir = %d\n", instance->host_no, data, addr, count, dir);
917
918 if (!IS_A_TT() && !STRAM_ADDR(addr)) {
919
920
921
922
923
924 if (dir)
925 memcpy( atari_dma_buffer, data, count );
926 else
927 atari_dma_orig_addr = data;
928 addr = atari_dma_phys_buffer;
929 }
930
931 atari_dma_startaddr = addr;
932
933
934
935
936
937
938
939
940
941
942 dma_cache_maintenance( addr, count, dir );
943
944 if (count == 0)
945 printk(KERN_NOTICE "SCSI warning: DMA programmed for 0 bytes !\n");
946
947 if (IS_A_TT()) {
948 tt_scsi_dma.dma_ctrl = dir;
949 SCSI_DMA_WRITE_P( dma_addr, addr );
950 SCSI_DMA_WRITE_P( dma_cnt, count );
951 tt_scsi_dma.dma_ctrl = dir | 2;
952 }
953 else {
954
955
956 SCSI_DMA_SETADR( addr );
957
958
959 dir <<= 8;
960 st_dma.dma_mode_status = 0x90 | dir;
961 st_dma.dma_mode_status = 0x90 | (dir ^ 0x100);
962 st_dma.dma_mode_status = 0x90 | dir;
963 udelay(40);
964
965
966 st_dma.fdc_acces_seccount = (count + (dir ? 511 : 0)) >> 9;
967 udelay(40);
968 st_dma.dma_mode_status = 0x10 | dir;
969 udelay(40);
970
971 atari_dma_active = 1;
972 }
973
974 return( count );
975}
976
977
978static long atari_scsi_dma_residual( struct Scsi_Host *instance )
979{
980 return( atari_dma_residual );
981}
982
983
984#define CMD_SURELY_BLOCK_MODE 0
985#define CMD_SURELY_BYTE_MODE 1
986#define CMD_MODE_UNKNOWN 2
987
988static int falcon_classify_cmd( Scsi_Cmnd *cmd )
989{
990 unsigned char opcode = cmd->cmnd[0];
991
992 if (opcode == READ_DEFECT_DATA || opcode == READ_LONG ||
993 opcode == READ_BUFFER)
994 return( CMD_SURELY_BYTE_MODE );
995 else if (opcode == READ_6 || opcode == READ_10 ||
996 opcode == 0xa8 || opcode == READ_REVERSE ||
997 opcode == RECOVER_BUFFERED_DATA) {
998
999
1000
1001 if (cmd->device->type == TYPE_TAPE && !(cmd->cmnd[1] & 1))
1002 return( CMD_SURELY_BYTE_MODE );
1003 else
1004 return( CMD_SURELY_BLOCK_MODE );
1005 }
1006 else
1007 return( CMD_MODE_UNKNOWN );
1008}
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020static unsigned long atari_dma_xfer_len( unsigned long wanted_len,
1021 Scsi_Cmnd *cmd,
1022 int write_flag )
1023{
1024 unsigned long possible_len, limit;
1025#ifndef CONFIG_TT_DMA_EMUL
1026 if (MACH_IS_HADES)
1027
1028 return( 0 );
1029#endif
1030 if (IS_A_TT())
1031
1032 return( wanted_len );
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062 if (write_flag) {
1063
1064
1065
1066
1067 possible_len = wanted_len;
1068 }
1069 else {
1070
1071
1072
1073
1074 if (wanted_len & 0x1ff)
1075 possible_len = 0;
1076 else {
1077
1078
1079 switch( falcon_classify_cmd( cmd )) {
1080 case CMD_SURELY_BLOCK_MODE:
1081 possible_len = wanted_len;
1082 break;
1083 case CMD_SURELY_BYTE_MODE:
1084 possible_len = 0;
1085 break;
1086 case CMD_MODE_UNKNOWN:
1087 default:
1088
1089
1090 possible_len = (wanted_len < 1024) ? 0 : wanted_len;
1091 break;
1092 }
1093 }
1094 }
1095
1096
1097 limit = (atari_dma_buffer && !STRAM_ADDR( virt_to_phys(cmd->SCp.ptr) )) ?
1098 STRAM_BUFFER_SIZE : 255*512;
1099 if (possible_len > limit)
1100 possible_len = limit;
1101
1102 if (possible_len != wanted_len)
1103 DMA_PRINTK("Sorry, must cut DMA transfer size to %ld bytes "
1104 "instead of %ld\n", possible_len, wanted_len);
1105
1106 return( possible_len );
1107}
1108
1109
1110#endif
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120static unsigned char atari_scsi_tt_reg_read( unsigned char reg )
1121{
1122 return( tt_scsi_regp[reg * 2] );
1123}
1124
1125static void atari_scsi_tt_reg_write( unsigned char reg, unsigned char value )
1126{
1127 tt_scsi_regp[reg * 2] = value;
1128}
1129
1130static unsigned char atari_scsi_falcon_reg_read( unsigned char reg )
1131{
1132 dma_wd.dma_mode_status= (u_short)(0x88 + reg);
1133 return( (u_char)dma_wd.fdc_acces_seccount );
1134}
1135
1136static void atari_scsi_falcon_reg_write( unsigned char reg, unsigned char value )
1137{
1138 dma_wd.dma_mode_status = (u_short)(0x88 + reg);
1139 dma_wd.fdc_acces_seccount = (u_short)value;
1140}
1141
1142
1143#include "atari_NCR5380.c"
1144
1145static Scsi_Host_Template driver_template = ATARI_SCSI;
1146#include "scsi_module.c"
1147
1148MODULE_LICENSE("GPL");
1149