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#include <linux/module.h>
36#include <linux/types.h>
37#include <linux/blkdev.h>
38#include <linux/interrupt.h>
39#include <linux/init.h>
40#include <linux/nvram.h>
41#include <linux/bitops.h>
42#include <linux/wait.h>
43#include <linux/platform_device.h>
44
45#include <asm/setup.h>
46#include <asm/atarihw.h>
47#include <asm/atariints.h>
48#include <asm/atari_stdma.h>
49#include <asm/atari_stram.h>
50#include <asm/io.h>
51
52#include <scsi/scsi_host.h>
53
54#define DMA_MIN_SIZE 32
55
56
57
58#define NCR5380_implementation_fields
59
60static u8 (*atari_scsi_reg_read)(unsigned int);
61static void (*atari_scsi_reg_write)(unsigned int, u8);
62
63#define NCR5380_read(reg) atari_scsi_reg_read(reg)
64#define NCR5380_write(reg, value) atari_scsi_reg_write(reg, value)
65
66#define NCR5380_queue_command atari_scsi_queue_command
67#define NCR5380_abort atari_scsi_abort
68#define NCR5380_info atari_scsi_info
69
70#define NCR5380_dma_xfer_len atari_scsi_dma_xfer_len
71#define NCR5380_dma_recv_setup atari_scsi_dma_recv_setup
72#define NCR5380_dma_send_setup atari_scsi_dma_send_setup
73#define NCR5380_dma_residual atari_scsi_dma_residual
74
75#define NCR5380_acquire_dma_irq(instance) falcon_get_lock(instance)
76#define NCR5380_release_dma_irq(instance) falcon_release_lock()
77
78#include "NCR5380.h"
79
80
81#define IS_A_TT() ATARIHW_PRESENT(TT_SCSI)
82
83#define SCSI_DMA_WRITE_P(elt,val) \
84 do { \
85 unsigned long v = val; \
86 tt_scsi_dma.elt##_lo = v & 0xff; \
87 v >>= 8; \
88 tt_scsi_dma.elt##_lmd = v & 0xff; \
89 v >>= 8; \
90 tt_scsi_dma.elt##_hmd = v & 0xff; \
91 v >>= 8; \
92 tt_scsi_dma.elt##_hi = v & 0xff; \
93 } while(0)
94
95#define SCSI_DMA_READ_P(elt) \
96 (((((((unsigned long)tt_scsi_dma.elt##_hi << 8) | \
97 (unsigned long)tt_scsi_dma.elt##_hmd) << 8) | \
98 (unsigned long)tt_scsi_dma.elt##_lmd) << 8) | \
99 (unsigned long)tt_scsi_dma.elt##_lo)
100
101
102static inline void SCSI_DMA_SETADR(unsigned long adr)
103{
104 st_dma.dma_lo = (unsigned char)adr;
105 MFPDELAY();
106 adr >>= 8;
107 st_dma.dma_md = (unsigned char)adr;
108 MFPDELAY();
109 adr >>= 8;
110 st_dma.dma_hi = (unsigned char)adr;
111 MFPDELAY();
112}
113
114static inline unsigned long SCSI_DMA_GETADR(void)
115{
116 unsigned long adr;
117 adr = st_dma.dma_lo;
118 MFPDELAY();
119 adr |= (st_dma.dma_md & 0xff) << 8;
120 MFPDELAY();
121 adr |= (st_dma.dma_hi & 0xff) << 16;
122 MFPDELAY();
123 return adr;
124}
125
126static void atari_scsi_fetch_restbytes(void);
127
128static unsigned long atari_dma_residual, atari_dma_startaddr;
129static short atari_dma_active;
130
131static char *atari_dma_buffer;
132
133static unsigned long atari_dma_phys_buffer;
134
135static char *atari_dma_orig_addr;
136
137
138
139
140
141
142#define STRAM_BUFFER_SIZE (4096)
143
144static unsigned long atari_dma_stram_mask;
145#define STRAM_ADDR(a) (((a) & atari_dma_stram_mask) == 0)
146
147static int setup_can_queue = -1;
148module_param(setup_can_queue, int, 0);
149static int setup_cmd_per_lun = -1;
150module_param(setup_cmd_per_lun, int, 0);
151static int setup_sg_tablesize = -1;
152module_param(setup_sg_tablesize, int, 0);
153static int setup_hostid = -1;
154module_param(setup_hostid, int, 0);
155static int setup_toshiba_delay = -1;
156module_param(setup_toshiba_delay, int, 0);
157
158
159static int scsi_dma_is_ignored_buserr(unsigned char dma_stat)
160{
161 int i;
162 unsigned long addr = SCSI_DMA_READ_P(dma_addr), end_addr;
163
164 if (dma_stat & 0x01) {
165
166
167
168
169
170
171 for (i = 0; i < m68k_num_memory; ++i) {
172 end_addr = m68k_memory[i].addr + m68k_memory[i].size;
173 if (end_addr <= addr && addr <= end_addr + 4)
174 return 1;
175 }
176 }
177 return 0;
178}
179
180
181static irqreturn_t scsi_tt_intr(int irq, void *dev)
182{
183 struct Scsi_Host *instance = dev;
184 struct NCR5380_hostdata *hostdata = shost_priv(instance);
185 int dma_stat;
186
187 dma_stat = tt_scsi_dma.dma_ctrl;
188
189 dsprintk(NDEBUG_INTR, instance, "NCR5380 interrupt, DMA status = %02x\n",
190 dma_stat & 0xff);
191
192
193
194
195 if (dma_stat & 0x80) {
196 if (!scsi_dma_is_ignored_buserr(dma_stat)) {
197 printk(KERN_ERR "SCSI DMA caused bus error near 0x%08lx\n",
198 SCSI_DMA_READ_P(dma_addr));
199 printk(KERN_CRIT "SCSI DMA bus error -- bad DMA programming!");
200 }
201 }
202
203
204
205
206
207
208
209
210
211
212 if ((dma_stat & 0x02) && !(dma_stat & 0x40)) {
213 atari_dma_residual = hostdata->dma_len -
214 (SCSI_DMA_READ_P(dma_addr) - atari_dma_startaddr);
215
216 dprintk(NDEBUG_DMA, "SCSI DMA: There are %ld residual bytes.\n",
217 atari_dma_residual);
218
219 if ((signed int)atari_dma_residual < 0)
220 atari_dma_residual = 0;
221 if ((dma_stat & 1) == 0) {
222
223
224
225
226 atari_scsi_fetch_restbytes();
227 } else {
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246 if (atari_dma_residual & 0x1ff) {
247 dprintk(NDEBUG_DMA, "SCSI DMA: DMA bug corrected, "
248 "difference %ld bytes\n",
249 512 - (atari_dma_residual & 0x1ff));
250 atari_dma_residual = (atari_dma_residual + 511) & ~0x1ff;
251 }
252 }
253 tt_scsi_dma.dma_ctrl = 0;
254 }
255
256
257 if (dma_stat & 0x40) {
258 atari_dma_residual = 0;
259 if ((dma_stat & 1) == 0)
260 atari_scsi_fetch_restbytes();
261 tt_scsi_dma.dma_ctrl = 0;
262 }
263
264 NCR5380_intr(irq, dev);
265
266 return IRQ_HANDLED;
267}
268
269
270static irqreturn_t scsi_falcon_intr(int irq, void *dev)
271{
272 struct Scsi_Host *instance = dev;
273 struct NCR5380_hostdata *hostdata = shost_priv(instance);
274 int dma_stat;
275
276
277
278
279 st_dma.dma_mode_status = 0x90;
280 dma_stat = st_dma.dma_mode_status;
281
282
283
284
285 if (!(dma_stat & 0x01)) {
286
287 printk(KERN_CRIT "SCSI DMA error near 0x%08lx!\n", SCSI_DMA_GETADR());
288 }
289
290
291
292
293
294
295 if (atari_dma_active && (dma_stat & 0x02)) {
296 unsigned long transferred;
297
298 transferred = SCSI_DMA_GETADR() - atari_dma_startaddr;
299
300
301
302
303
304 if (transferred & 15)
305 printk(KERN_ERR "SCSI DMA error: %ld bytes lost in "
306 "ST-DMA fifo\n", transferred & 15);
307
308 atari_dma_residual = hostdata->dma_len - transferred;
309 dprintk(NDEBUG_DMA, "SCSI DMA: There are %ld residual bytes.\n",
310 atari_dma_residual);
311 } else
312 atari_dma_residual = 0;
313 atari_dma_active = 0;
314
315 if (atari_dma_orig_addr) {
316
317
318
319 memcpy(atari_dma_orig_addr, phys_to_virt(atari_dma_startaddr),
320 hostdata->dma_len - atari_dma_residual);
321 atari_dma_orig_addr = NULL;
322 }
323
324 NCR5380_intr(irq, dev);
325
326 return IRQ_HANDLED;
327}
328
329
330static void atari_scsi_fetch_restbytes(void)
331{
332 int nr;
333 char *src, *dst;
334 unsigned long phys_dst;
335
336
337 phys_dst = SCSI_DMA_READ_P(dma_addr);
338 nr = phys_dst & 3;
339 if (nr) {
340
341
342 phys_dst ^= nr;
343 dprintk(NDEBUG_DMA, "SCSI DMA: there are %d rest bytes for phys addr 0x%08lx",
344 nr, phys_dst);
345
346 dst = phys_to_virt(phys_dst);
347 dprintk(NDEBUG_DMA, " = virt addr %p\n", dst);
348 for (src = (char *)&tt_scsi_dma.dma_restdata; nr != 0; --nr)
349 *dst++ = *src++;
350 }
351}
352
353
354
355
356
357
358static void falcon_release_lock(void)
359{
360 if (IS_A_TT())
361 return;
362
363 if (stdma_is_locked_by(scsi_falcon_intr))
364 stdma_release();
365}
366
367
368
369
370
371
372
373
374static int falcon_get_lock(struct Scsi_Host *instance)
375{
376 if (IS_A_TT())
377 return 1;
378
379 if (stdma_is_locked_by(scsi_falcon_intr) &&
380 instance->hostt->can_queue > 1)
381 return 1;
382
383 if (in_interrupt())
384 return stdma_try_lock(scsi_falcon_intr, instance);
385
386 stdma_lock(scsi_falcon_intr, instance);
387 return 1;
388}
389
390#ifndef MODULE
391static int __init atari_scsi_setup(char *str)
392{
393
394
395
396
397
398 int ints[8];
399
400 get_options(str, ARRAY_SIZE(ints), ints);
401
402 if (ints[0] < 1) {
403 printk("atari_scsi_setup: no arguments!\n");
404 return 0;
405 }
406 if (ints[0] >= 1)
407 setup_can_queue = ints[1];
408 if (ints[0] >= 2)
409 setup_cmd_per_lun = ints[2];
410 if (ints[0] >= 3)
411 setup_sg_tablesize = ints[3];
412 if (ints[0] >= 4)
413 setup_hostid = ints[4];
414
415
416 if (ints[0] >= 7)
417 setup_toshiba_delay = ints[7];
418
419 return 1;
420}
421
422__setup("atascsi=", atari_scsi_setup);
423#endif
424
425static unsigned long atari_scsi_dma_setup(struct NCR5380_hostdata *hostdata,
426 void *data, unsigned long count,
427 int dir)
428{
429 unsigned long addr = virt_to_phys(data);
430
431 dprintk(NDEBUG_DMA, "scsi%d: setting up dma, data = %p, phys = %lx, count = %ld, dir = %d\n",
432 hostdata->host->host_no, data, addr, count, dir);
433
434 if (!IS_A_TT() && !STRAM_ADDR(addr)) {
435
436
437
438
439
440 if (dir)
441 memcpy(atari_dma_buffer, data, count);
442 else
443 atari_dma_orig_addr = data;
444 addr = atari_dma_phys_buffer;
445 }
446
447 atari_dma_startaddr = addr;
448
449
450
451
452
453
454
455
456
457
458 dma_cache_maintenance(addr, count, dir);
459
460 if (IS_A_TT()) {
461 tt_scsi_dma.dma_ctrl = dir;
462 SCSI_DMA_WRITE_P(dma_addr, addr);
463 SCSI_DMA_WRITE_P(dma_cnt, count);
464 tt_scsi_dma.dma_ctrl = dir | 2;
465 } else {
466
467
468 SCSI_DMA_SETADR(addr);
469
470
471 dir <<= 8;
472 st_dma.dma_mode_status = 0x90 | dir;
473 st_dma.dma_mode_status = 0x90 | (dir ^ 0x100);
474 st_dma.dma_mode_status = 0x90 | dir;
475 udelay(40);
476
477
478 st_dma.fdc_acces_seccount = (count + (dir ? 511 : 0)) >> 9;
479 udelay(40);
480 st_dma.dma_mode_status = 0x10 | dir;
481 udelay(40);
482
483 atari_dma_active = 1;
484 }
485
486 return count;
487}
488
489static inline int atari_scsi_dma_recv_setup(struct NCR5380_hostdata *hostdata,
490 unsigned char *data, int count)
491{
492 return atari_scsi_dma_setup(hostdata, data, count, 0);
493}
494
495static inline int atari_scsi_dma_send_setup(struct NCR5380_hostdata *hostdata,
496 unsigned char *data, int count)
497{
498 return atari_scsi_dma_setup(hostdata, data, count, 1);
499}
500
501static int atari_scsi_dma_residual(struct NCR5380_hostdata *hostdata)
502{
503 return atari_dma_residual;
504}
505
506
507#define CMD_SURELY_BLOCK_MODE 0
508#define CMD_SURELY_BYTE_MODE 1
509#define CMD_MODE_UNKNOWN 2
510
511static int falcon_classify_cmd(struct scsi_cmnd *cmd)
512{
513 unsigned char opcode = cmd->cmnd[0];
514
515 if (opcode == READ_DEFECT_DATA || opcode == READ_LONG ||
516 opcode == READ_BUFFER)
517 return CMD_SURELY_BYTE_MODE;
518 else if (opcode == READ_6 || opcode == READ_10 ||
519 opcode == 0xa8 || opcode == READ_REVERSE ||
520 opcode == RECOVER_BUFFERED_DATA) {
521
522
523
524 if (cmd->device->type == TYPE_TAPE && !(cmd->cmnd[1] & 1))
525 return CMD_SURELY_BYTE_MODE;
526 else
527 return CMD_SURELY_BLOCK_MODE;
528 } else
529 return CMD_MODE_UNKNOWN;
530}
531
532
533
534
535
536
537
538
539
540
541
542static int atari_scsi_dma_xfer_len(struct NCR5380_hostdata *hostdata,
543 struct scsi_cmnd *cmd)
544{
545 int wanted_len = cmd->SCp.this_residual;
546 int possible_len, limit;
547
548 if (wanted_len < DMA_MIN_SIZE)
549 return 0;
550
551 if (IS_A_TT())
552
553 return wanted_len;
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583 if (cmd->sc_data_direction == DMA_TO_DEVICE) {
584
585
586
587
588 possible_len = wanted_len;
589 } else {
590
591
592
593
594 if (wanted_len & 0x1ff)
595 possible_len = 0;
596 else {
597
598
599 switch (falcon_classify_cmd(cmd)) {
600 case CMD_SURELY_BLOCK_MODE:
601 possible_len = wanted_len;
602 break;
603 case CMD_SURELY_BYTE_MODE:
604 possible_len = 0;
605 break;
606 case CMD_MODE_UNKNOWN:
607 default:
608
609
610 possible_len = (wanted_len < 1024) ? 0 : wanted_len;
611 break;
612 }
613 }
614 }
615
616
617 limit = (atari_dma_buffer && !STRAM_ADDR(virt_to_phys(cmd->SCp.ptr))) ?
618 STRAM_BUFFER_SIZE : 255*512;
619 if (possible_len > limit)
620 possible_len = limit;
621
622 if (possible_len != wanted_len)
623 dprintk(NDEBUG_DMA, "DMA transfer now %d bytes instead of %d\n",
624 possible_len, wanted_len);
625
626 return possible_len;
627}
628
629
630
631
632
633
634
635
636
637static u8 atari_scsi_tt_reg_read(unsigned int reg)
638{
639 return tt_scsi_regp[reg * 2];
640}
641
642static void atari_scsi_tt_reg_write(unsigned int reg, u8 value)
643{
644 tt_scsi_regp[reg * 2] = value;
645}
646
647static u8 atari_scsi_falcon_reg_read(unsigned int reg)
648{
649 unsigned long flags;
650 u8 result;
651
652 reg += 0x88;
653 local_irq_save(flags);
654 dma_wd.dma_mode_status = (u_short)reg;
655 result = (u8)dma_wd.fdc_acces_seccount;
656 local_irq_restore(flags);
657 return result;
658}
659
660static void atari_scsi_falcon_reg_write(unsigned int reg, u8 value)
661{
662 unsigned long flags;
663
664 reg += 0x88;
665 local_irq_save(flags);
666 dma_wd.dma_mode_status = (u_short)reg;
667 dma_wd.fdc_acces_seccount = (u_short)value;
668 local_irq_restore(flags);
669}
670
671
672#include "NCR5380.c"
673
674static int atari_scsi_host_reset(struct scsi_cmnd *cmd)
675{
676 int rv;
677 unsigned long flags;
678
679 local_irq_save(flags);
680
681
682 if (IS_A_TT()) {
683 tt_scsi_dma.dma_ctrl = 0;
684 } else {
685 if (stdma_is_locked_by(scsi_falcon_intr))
686 st_dma.dma_mode_status = 0x90;
687 atari_dma_active = 0;
688 atari_dma_orig_addr = NULL;
689 }
690
691 rv = NCR5380_host_reset(cmd);
692
693
694
695
696
697
698
699 local_irq_restore(flags);
700
701 return rv;
702}
703
704#define DRV_MODULE_NAME "atari_scsi"
705#define PFX DRV_MODULE_NAME ": "
706
707static struct scsi_host_template atari_scsi_template = {
708 .module = THIS_MODULE,
709 .proc_name = DRV_MODULE_NAME,
710 .name = "Atari native SCSI",
711 .info = atari_scsi_info,
712 .queuecommand = atari_scsi_queue_command,
713 .eh_abort_handler = atari_scsi_abort,
714 .eh_host_reset_handler = atari_scsi_host_reset,
715 .this_id = 7,
716 .cmd_per_lun = 2,
717 .dma_boundary = PAGE_SIZE - 1,
718 .cmd_size = NCR5380_CMD_SIZE,
719};
720
721static int __init atari_scsi_probe(struct platform_device *pdev)
722{
723 struct Scsi_Host *instance;
724 int error;
725 struct resource *irq;
726 int host_flags = 0;
727
728 irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
729 if (!irq)
730 return -ENODEV;
731
732 if (ATARIHW_PRESENT(TT_SCSI)) {
733 atari_scsi_reg_read = atari_scsi_tt_reg_read;
734 atari_scsi_reg_write = atari_scsi_tt_reg_write;
735 } else {
736 atari_scsi_reg_read = atari_scsi_falcon_reg_read;
737 atari_scsi_reg_write = atari_scsi_falcon_reg_write;
738 }
739
740 if (ATARIHW_PRESENT(TT_SCSI)) {
741 atari_scsi_template.can_queue = 16;
742 atari_scsi_template.sg_tablesize = SG_ALL;
743 } else {
744 atari_scsi_template.can_queue = 1;
745 atari_scsi_template.sg_tablesize = 1;
746 }
747
748 if (setup_can_queue > 0)
749 atari_scsi_template.can_queue = setup_can_queue;
750
751 if (setup_cmd_per_lun > 0)
752 atari_scsi_template.cmd_per_lun = setup_cmd_per_lun;
753
754
755 if (ATARIHW_PRESENT(TT_SCSI) && setup_sg_tablesize > 0)
756 atari_scsi_template.sg_tablesize = setup_sg_tablesize;
757
758 if (setup_hostid >= 0) {
759 atari_scsi_template.this_id = setup_hostid & 7;
760 } else if (IS_REACHABLE(CONFIG_NVRAM)) {
761
762 if (ATARIHW_PRESENT(TT_CLK)) {
763 unsigned char b;
764 loff_t offset = 16;
765 ssize_t count = nvram_read(&b, 1, &offset);
766
767
768
769
770 if ((count == 1) && (b & 0x80))
771 atari_scsi_template.this_id = b & 7;
772 }
773 }
774
775
776
777
778
779
780 if (ATARIHW_PRESENT(ST_SCSI) && !ATARIHW_PRESENT(EXTD_DMA) &&
781 m68k_realnum_memory > 1) {
782 atari_dma_buffer = atari_stram_alloc(STRAM_BUFFER_SIZE, "SCSI");
783 if (!atari_dma_buffer) {
784 pr_err(PFX "can't allocate ST-RAM double buffer\n");
785 return -ENOMEM;
786 }
787 atari_dma_phys_buffer = atari_stram_to_phys(atari_dma_buffer);
788 atari_dma_orig_addr = NULL;
789 }
790
791 instance = scsi_host_alloc(&atari_scsi_template,
792 sizeof(struct NCR5380_hostdata));
793 if (!instance) {
794 error = -ENOMEM;
795 goto fail_alloc;
796 }
797
798 instance->irq = irq->start;
799
800 host_flags |= IS_A_TT() ? 0 : FLAG_LATE_DMA_SETUP;
801 host_flags |= setup_toshiba_delay > 0 ? FLAG_TOSHIBA_DELAY : 0;
802
803 error = NCR5380_init(instance, host_flags);
804 if (error)
805 goto fail_init;
806
807 if (IS_A_TT()) {
808 error = request_irq(instance->irq, scsi_tt_intr, 0,
809 "NCR5380", instance);
810 if (error) {
811 pr_err(PFX "request irq %d failed, aborting\n",
812 instance->irq);
813 goto fail_irq;
814 }
815 tt_mfp.active_edge |= 0x80;
816
817 tt_scsi_dma.dma_ctrl = 0;
818 atari_dma_residual = 0;
819
820
821
822
823
824
825
826
827
828
829
830
831
832 if (MACH_IS_MEDUSA) {
833 struct NCR5380_hostdata *hostdata =
834 shost_priv(instance);
835
836 hostdata->read_overruns = 4;
837 }
838 } else {
839
840
841
842 atari_dma_residual = 0;
843 atari_dma_active = 0;
844 atari_dma_stram_mask = (ATARIHW_PRESENT(EXTD_DMA) ? 0x00000000
845 : 0xff000000);
846 }
847
848 NCR5380_maybe_reset_bus(instance);
849
850 error = scsi_add_host(instance, NULL);
851 if (error)
852 goto fail_host;
853
854 platform_set_drvdata(pdev, instance);
855
856 scsi_scan_host(instance);
857 return 0;
858
859fail_host:
860 if (IS_A_TT())
861 free_irq(instance->irq, instance);
862fail_irq:
863 NCR5380_exit(instance);
864fail_init:
865 scsi_host_put(instance);
866fail_alloc:
867 if (atari_dma_buffer)
868 atari_stram_free(atari_dma_buffer);
869 return error;
870}
871
872static int __exit atari_scsi_remove(struct platform_device *pdev)
873{
874 struct Scsi_Host *instance = platform_get_drvdata(pdev);
875
876 scsi_remove_host(instance);
877 if (IS_A_TT())
878 free_irq(instance->irq, instance);
879 NCR5380_exit(instance);
880 scsi_host_put(instance);
881 if (atari_dma_buffer)
882 atari_stram_free(atari_dma_buffer);
883 return 0;
884}
885
886static struct platform_driver atari_scsi_driver = {
887 .remove = __exit_p(atari_scsi_remove),
888 .driver = {
889 .name = DRV_MODULE_NAME,
890 },
891};
892
893module_platform_driver_probe(atari_scsi_driver, atari_scsi_probe);
894
895MODULE_ALIAS("platform:" DRV_MODULE_NAME);
896MODULE_LICENSE("GPL");
897