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#ifndef NCR53C8XX_H
54#define NCR53C8XX_H
55
56#include <scsi/scsi_host.h>
57
58
59
60
61
62
63#define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
64#define SCSI_NCR_DEBUG_INFO_SUPPORT
65
66
67
68
69
70#ifdef CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK
71# define SCSI_NCR_ENABLE_INTEGRITY_CHECK
72#endif
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91#define SCSI_NCR_SETUP_SPECIAL_FEATURES (3)
92
93#define SCSI_NCR_MAX_SYNC (80)
94
95
96
97
98#ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS
99#if CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2
100#define SCSI_NCR_MAX_TAGS (2)
101#elif CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 256
102#define SCSI_NCR_MAX_TAGS (256)
103#else
104#define SCSI_NCR_MAX_TAGS CONFIG_SCSI_NCR53C8XX_MAX_TAGS
105#endif
106#else
107#define SCSI_NCR_MAX_TAGS (8)
108#endif
109
110
111
112
113
114#ifdef CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
115#define SCSI_NCR_SETUP_DEFAULT_TAGS CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
116#elif defined CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE
117#define SCSI_NCR_SETUP_DEFAULT_TAGS SCSI_NCR_MAX_TAGS
118#else
119#define SCSI_NCR_SETUP_DEFAULT_TAGS (0)
120#endif
121
122
123
124
125#if defined(CONFIG_SCSI_NCR53C8XX_IARB)
126#define SCSI_NCR_IARB_SUPPORT
127#endif
128
129
130
131
132
133#ifndef CONFIG_SCSI_NCR53C8XX_SYNC
134#define CONFIG_SCSI_NCR53C8XX_SYNC (20)
135#elif CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC
136#undef CONFIG_SCSI_NCR53C8XX_SYNC
137#define CONFIG_SCSI_NCR53C8XX_SYNC SCSI_NCR_MAX_SYNC
138#endif
139
140#if CONFIG_SCSI_NCR53C8XX_SYNC == 0
141#define SCSI_NCR_SETUP_DEFAULT_SYNC (255)
142#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 5
143#define SCSI_NCR_SETUP_DEFAULT_SYNC (50)
144#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 20
145#define SCSI_NCR_SETUP_DEFAULT_SYNC (250/(CONFIG_SCSI_NCR53C8XX_SYNC))
146#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 33
147#define SCSI_NCR_SETUP_DEFAULT_SYNC (11)
148#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 40
149#define SCSI_NCR_SETUP_DEFAULT_SYNC (10)
150#else
151#define SCSI_NCR_SETUP_DEFAULT_SYNC (9)
152#endif
153
154
155
156
157#ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
158#define SCSI_NCR_SETUP_DISCONNECTION (0)
159#else
160#define SCSI_NCR_SETUP_DISCONNECTION (1)
161#endif
162
163
164
165
166#ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO
167#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1)
168#else
169#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0)
170#endif
171
172
173
174
175#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
176#define SCSI_NCR_SETUP_MASTER_PARITY (0)
177#else
178#define SCSI_NCR_SETUP_MASTER_PARITY (1)
179#endif
180
181
182
183
184#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
185#define SCSI_NCR_SETUP_SCSI_PARITY (0)
186#else
187#define SCSI_NCR_SETUP_SCSI_PARITY (1)
188#endif
189
190
191
192
193#define SCSI_NCR_SETUP_SETTLE_TIME (2)
194
195
196
197
198#ifndef SCSI_NCR_PCIQ_WORK_AROUND_OPT
199#define SCSI_NCR_PCIQ_WORK_AROUND_OPT 1
200#endif
201
202
203
204
205
206
207
208
209
210
211
212#if SCSI_NCR_PCIQ_WORK_AROUND_OPT == 1
213#define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
214#define SCSI_NCR_PCIQ_MAY_REORDER_WRITES
215#define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230#elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 2
231#define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
232#define SCSI_NCR_PCIQ_MAY_REORDER_WRITES
233#define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
234#define SCSI_NCR_PCIQ_BROKEN_INTR
235
236
237
238
239
240
241
242#elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 3
243#define SCSI_NCR_PCIQ_SYNC_ON_INTR
244#endif
245
246
247
248
249
250
251#define SCSI_NCR_ALWAYS_SIMPLE_TAG
252#define SCSI_NCR_MAX_SCATTER (127)
253#define SCSI_NCR_MAX_TARGET (16)
254
255
256
257
258
259
260
261#define SCSI_NCR_CAN_QUEUE (8*SCSI_NCR_MAX_TAGS + 2*SCSI_NCR_MAX_TARGET)
262#define SCSI_NCR_CMD_PER_LUN (SCSI_NCR_MAX_TAGS)
263
264#define SCSI_NCR_SG_TABLESIZE (SCSI_NCR_MAX_SCATTER)
265#define SCSI_NCR_TIMER_INTERVAL (HZ)
266
267#define SCSI_NCR_MAX_LUN (16)
268
269
270
271
272
273
274#ifdef __BIG_ENDIAN
275
276#define inw_l2b inw
277#define inl_l2b inl
278#define outw_b2l outw
279#define outl_b2l outl
280
281#define readb_raw readb
282#define writeb_raw writeb
283
284#if defined(SCSI_NCR_BIG_ENDIAN)
285#define readw_l2b __raw_readw
286#define readl_l2b __raw_readl
287#define writew_b2l __raw_writew
288#define writel_b2l __raw_writel
289#define readw_raw __raw_readw
290#define readl_raw __raw_readl
291#define writew_raw __raw_writew
292#define writel_raw __raw_writel
293#else
294#define readw_l2b readw
295#define readl_l2b readl
296#define writew_b2l writew
297#define writel_b2l writel
298#define readw_raw readw
299#define readl_raw readl
300#define writew_raw writew
301#define writel_raw writel
302#endif
303
304#else
305
306#define inw_raw inw
307#define inl_raw inl
308#define outw_raw outw
309#define outl_raw outl
310
311#define readb_raw readb
312#define readw_raw readw
313#define readl_raw readl
314#define writeb_raw writeb
315#define writew_raw writew
316#define writel_raw writel
317
318#endif
319
320#if !defined(__hppa__) && !defined(__mips__)
321#ifdef SCSI_NCR_BIG_ENDIAN
322#error "The NCR in BIG ENDIAN addressing mode is not (yet) supported"
323#endif
324#endif
325
326#define MEMORY_BARRIER() mb()
327
328
329
330
331
332
333
334
335
336
337#if defined(SCSI_NCR_BIG_ENDIAN)
338
339#define ncr_offb(o) (((o)&~3)+((~((o)&3))&3))
340#define ncr_offw(o) (((o)&~3)+((~((o)&3))&2))
341
342#else
343
344#define ncr_offb(o) (o)
345#define ncr_offw(o) (o)
346
347#endif
348
349
350
351
352
353
354
355
356
357#if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
358
359#define cpu_to_scr(dw) cpu_to_le32(dw)
360#define scr_to_cpu(dw) le32_to_cpu(dw)
361
362#elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
363
364#define cpu_to_scr(dw) cpu_to_be32(dw)
365#define scr_to_cpu(dw) be32_to_cpu(dw)
366
367#else
368
369#define cpu_to_scr(dw) (dw)
370#define scr_to_cpu(dw) (dw)
371
372#endif
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391#define INB_OFF(o) readb_raw((char __iomem *)np->reg + ncr_offb(o))
392#define OUTB_OFF(o, val) writeb_raw((val), (char __iomem *)np->reg + ncr_offb(o))
393
394#if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
395
396#define INW_OFF(o) readw_l2b((char __iomem *)np->reg + ncr_offw(o))
397#define INL_OFF(o) readl_l2b((char __iomem *)np->reg + (o))
398
399#define OUTW_OFF(o, val) writew_b2l((val), (char __iomem *)np->reg + ncr_offw(o))
400#define OUTL_OFF(o, val) writel_b2l((val), (char __iomem *)np->reg + (o))
401
402#elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
403
404#define INW_OFF(o) readw_b2l((char __iomem *)np->reg + ncr_offw(o))
405#define INL_OFF(o) readl_b2l((char __iomem *)np->reg + (o))
406
407#define OUTW_OFF(o, val) writew_l2b((val), (char __iomem *)np->reg + ncr_offw(o))
408#define OUTL_OFF(o, val) writel_l2b((val), (char __iomem *)np->reg + (o))
409
410#else
411
412#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
413
414#define INW_OFF(o) (readb((char __iomem *)np->reg + ncr_offw(o)) << 8 | readb((char __iomem *)np->reg + ncr_offw(o) + 1))
415#else
416#define INW_OFF(o) readw_raw((char __iomem *)np->reg + ncr_offw(o))
417#endif
418#define INL_OFF(o) readl_raw((char __iomem *)np->reg + (o))
419
420#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
421
422#define OUTW_OFF(o, val) do { writeb((char)((val) >> 8), (char __iomem *)np->reg + ncr_offw(o)); writeb((char)(val), (char __iomem *)np->reg + ncr_offw(o) + 1); } while (0)
423#else
424#define OUTW_OFF(o, val) writew_raw((val), (char __iomem *)np->reg + ncr_offw(o))
425#endif
426#define OUTL_OFF(o, val) writel_raw((val), (char __iomem *)np->reg + (o))
427
428#endif
429
430#define INB(r) INB_OFF (offsetof(struct ncr_reg,r))
431#define INW(r) INW_OFF (offsetof(struct ncr_reg,r))
432#define INL(r) INL_OFF (offsetof(struct ncr_reg,r))
433
434#define OUTB(r, val) OUTB_OFF (offsetof(struct ncr_reg,r), (val))
435#define OUTW(r, val) OUTW_OFF (offsetof(struct ncr_reg,r), (val))
436#define OUTL(r, val) OUTL_OFF (offsetof(struct ncr_reg,r), (val))
437
438
439
440
441
442#define OUTONB(r, m) OUTB(r, INB(r) | (m))
443#define OUTOFFB(r, m) OUTB(r, INB(r) & ~(m))
444#define OUTONW(r, m) OUTW(r, INW(r) | (m))
445#define OUTOFFW(r, m) OUTW(r, INW(r) & ~(m))
446#define OUTONL(r, m) OUTL(r, INL(r) | (m))
447#define OUTOFFL(r, m) OUTL(r, INL(r) & ~(m))
448
449
450
451
452
453
454#define OUTL_DSP(v) \
455 do { \
456 MEMORY_BARRIER(); \
457 OUTL (nc_dsp, (v)); \
458 } while (0)
459
460#define OUTONB_STD() \
461 do { \
462 MEMORY_BARRIER(); \
463 OUTONB (nc_dcntl, (STD|NOCOM)); \
464 } while (0)
465
466
467
468
469
470struct ncr_chip {
471 unsigned short revision_id;
472 unsigned char burst_max;
473 unsigned char offset_max;
474 unsigned char nr_divisor;
475 unsigned int features;
476#define FE_LED0 (1<<0)
477#define FE_WIDE (1<<1)
478#define FE_ULTRA (1<<2)
479#define FE_DBLR (1<<4)
480#define FE_QUAD (1<<5)
481#define FE_ERL (1<<6)
482#define FE_CLSE (1<<7)
483#define FE_WRIE (1<<8)
484#define FE_ERMP (1<<9)
485#define FE_BOF (1<<10)
486#define FE_DFS (1<<11)
487#define FE_PFEN (1<<12)
488#define FE_LDSTR (1<<13)
489#define FE_RAM (1<<14)
490#define FE_VARCLK (1<<15)
491#define FE_RAM8K (1<<16)
492#define FE_64BIT (1<<17)
493#define FE_IO256 (1<<18)
494#define FE_NOPM (1<<19)
495#define FE_LEDC (1<<20)
496#define FE_DIFF (1<<21)
497#define FE_66MHZ (1<<23)
498#define FE_DAC (1<<24)
499#define FE_ISTAT1 (1<<25)
500#define FE_DAC_IN_USE (1<<26)
501#define FE_EHP (1<<27)
502#define FE_MUX (1<<28)
503#define FE_EA (1<<29)
504
505#define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
506#define FE_SCSI_SET (FE_WIDE|FE_ULTRA|FE_DBLR|FE_QUAD|F_CLK80)
507#define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM)
508};
509
510
511
512
513
514
515
516
517#define SCSI_NCR_MAX_EXCLUDES 8
518struct ncr_driver_setup {
519 u8 master_parity;
520 u8 scsi_parity;
521 u8 disconnection;
522 u8 special_features;
523 u8 force_sync_nego;
524 u8 reverse_probe;
525 u8 pci_fix_up;
526 u8 use_nvram;
527 u8 verbose;
528 u8 default_tags;
529 u16 default_sync;
530 u16 debug;
531 u8 burst_max;
532 u8 led_pin;
533 u8 max_wide;
534 u8 settle_delay;
535 u8 diff_support;
536 u8 irqm;
537 u8 bus_check;
538 u8 optimize;
539 u8 recovery;
540 u8 host_id;
541 u16 iarb;
542 u32 excludes[SCSI_NCR_MAX_EXCLUDES];
543 char tag_ctrl[100];
544};
545
546
547
548
549
550#define SCSI_NCR_DRIVER_SETUP \
551{ \
552 SCSI_NCR_SETUP_MASTER_PARITY, \
553 SCSI_NCR_SETUP_SCSI_PARITY, \
554 SCSI_NCR_SETUP_DISCONNECTION, \
555 SCSI_NCR_SETUP_SPECIAL_FEATURES, \
556 SCSI_NCR_SETUP_FORCE_SYNC_NEGO, \
557 0, \
558 0, \
559 1, \
560 0, \
561 SCSI_NCR_SETUP_DEFAULT_TAGS, \
562 SCSI_NCR_SETUP_DEFAULT_SYNC, \
563 0x00, \
564 7, \
565 0, \
566 1, \
567 SCSI_NCR_SETUP_SETTLE_TIME, \
568 0, \
569 0, \
570 1, \
571 0, \
572 0, \
573 255, \
574 0x00 \
575}
576
577
578
579
580
581
582#define SCSI_NCR_DRIVER_SAFE_SETUP \
583{ \
584 0, \
585 1, \
586 0, \
587 0, \
588 0, \
589 0, \
590 0, \
591 1, \
592 2, \
593 0, \
594 255, \
595 0x00, \
596 255, \
597 0, \
598 0, \
599 10, \
600 1, \
601 1, \
602 1, \
603 0, \
604 0, \
605 255 \
606}
607
608
609
610
611
612
613
614
615
616
617struct ncr_reg {
618 u8 nc_scntl0;
619
620 u8 nc_scntl1;
621 #define ISCON 0x10
622 #define CRST 0x08
623 #define IARB 0x02
624
625 u8 nc_scntl2;
626 #define SDU 0x80
627 #define CHM 0x40
628 #define WSS 0x08
629 #define WSR 0x01
630
631 u8 nc_scntl3;
632 #define EWS 0x08
633 #define ULTRA 0x80
634
635
636 u8 nc_scid;
637 #define RRE 0x40
638 #define SRE 0x20
639
640 u8 nc_sxfer;
641
642
643 u8 nc_sdid;
644
645 u8 nc_gpreg;
646
647 u8 nc_sfbr;
648
649 u8 nc_socl;
650 #define CREQ 0x80
651 #define CACK 0x40
652 #define CBSY 0x20
653 #define CSEL 0x10
654 #define CATN 0x08
655 #define CMSG 0x04
656 #define CC_D 0x02
657 #define CI_O 0x01
658
659 u8 nc_ssid;
660
661 u8 nc_sbcl;
662
663 u8 nc_dstat;
664 #define DFE 0x80
665 #define MDPE 0x40
666 #define BF 0x20
667 #define ABRT 0x10
668 #define SSI 0x08
669 #define SIR 0x04
670 #define IID 0x01
671
672 u8 nc_sstat0;
673 #define ILF 0x80
674 #define ORF 0x40
675 #define OLF 0x20
676 #define AIP 0x10
677 #define LOA 0x08
678 #define WOA 0x04
679 #define IRST 0x02
680 #define SDP 0x01
681
682 u8 nc_sstat1;
683 #define FF3210 0xf0
684
685 u8 nc_sstat2;
686 #define ILF1 0x80
687 #define ORF1 0x40
688 #define OLF1 0x20
689 #define DM 0x04
690 #define LDSC 0x02
691
692 u8 nc_dsa;
693 u8 nc_dsa1;
694 u8 nc_dsa2;
695 u8 nc_dsa3;
696
697 u8 nc_istat;
698 #define CABRT 0x80
699 #define SRST 0x40
700 #define SIGP 0x20
701 #define SEM 0x10
702 #define CON 0x08
703 #define INTF 0x04
704 #define SIP 0x02
705 #define DIP 0x01
706
707 u8 nc_istat1;
708 #define FLSH 0x04
709 #define SRUN 0x02
710 #define SIRQD 0x01
711
712 u8 nc_mbox0;
713 u8 nc_mbox1;
714
715 u8 nc_ctest0;
716 #define EHP 0x04
717 u8 nc_ctest1;
718
719 u8 nc_ctest2;
720 #define CSIGP 0x40
721
722
723 u8 nc_ctest3;
724 #define FLF 0x08
725 #define CLF 0x04
726 #define FM 0x02
727 #define WRIE 0x01
728
729
730 u32 nc_temp;
731
732 u8 nc_dfifo;
733 u8 nc_ctest4;
734 #define MUX 0x80
735 #define BDIS 0x80
736 #define MPEE 0x08
737
738 u8 nc_ctest5;
739 #define DFS 0x20
740
741 u8 nc_ctest6;
742
743 u32 nc_dbc;
744 u32 nc_dnad;
745 u32 nc_dsp;
746 u32 nc_dsps;
747
748 u8 nc_scratcha;
749 u8 nc_scratcha1;
750 u8 nc_scratcha2;
751 u8 nc_scratcha3;
752
753 u8 nc_dmode;
754 #define BL_2 0x80
755 #define BL_1 0x40
756 #define ERL 0x08
757 #define ERMP 0x04
758 #define BOF 0x02
759
760 u8 nc_dien;
761 u8 nc_sbr;
762
763 u8 nc_dcntl;
764 #define CLSE 0x80
765 #define PFF 0x40
766 #define PFEN 0x20
767 #define EA 0x20
768 #define SSM 0x10
769 #define IRQM 0x08
770 #define STD 0x04
771 #define IRQD 0x02
772 #define NOCOM 0x01
773
774
775 u32 nc_adder;
776
777 u16 nc_sien;
778 u16 nc_sist;
779 #define SBMC 0x1000
780 #define STO 0x0400
781 #define GEN 0x0200
782 #define HTH 0x0100
783 #define MA 0x80
784 #define CMP 0x40
785 #define SEL 0x20
786 #define RSL 0x10
787 #define SGE 0x08
788 #define UDC 0x04
789 #define RST 0x02
790 #define PAR 0x01
791
792 u8 nc_slpar;
793 u8 nc_swide;
794 u8 nc_macntl;
795 u8 nc_gpcntl;
796 u8 nc_stime0;
797 u8 nc_stime1;
798 u16 nc_respid;
799
800 u8 nc_stest0;
801
802 u8 nc_stest1;
803 #define SCLK 0x80
804 #define DBLEN 0x08
805 #define DBLSEL 0x04
806
807
808 u8 nc_stest2;
809 #define ROF 0x40
810 #define DIF 0x20
811 #define EXT 0x02
812
813 u8 nc_stest3;
814 #define TE 0x80
815 #define HSC 0x20
816 #define CSF 0x02
817
818 u16 nc_sidl;
819 u8 nc_stest4;
820 #define SMODE 0xc0
821 #define SMODE_HVD 0x40
822 #define SMODE_SE 0x80
823 #define SMODE_LVD 0xc0
824 #define LCKFRQ 0x20
825
826
827 u8 nc_53_;
828 u16 nc_sodl;
829 u8 nc_ccntl0;
830 #define ENPMJ 0x80
831 #define PMJCTL 0x40
832 #define ENNDJ 0x20
833 #define DISFC 0x10
834 #define DILS 0x02
835 #define DPR 0x01
836
837 u8 nc_ccntl1;
838 #define ZMOD 0x80
839 #define DIC 0x10
840 #define DDAC 0x08
841 #define XTIMOD 0x04
842 #define EXTIBMV 0x02
843 #define EXDBMV 0x01
844
845 u16 nc_sbdl;
846 u16 nc_5a_;
847
848 u8 nc_scr0;
849 u8 nc_scr1;
850 u8 nc_scr2;
851 u8 nc_scr3;
852
853 u8 nc_scrx[64];
854 u32 nc_mmrs;
855 u32 nc_mmws;
856 u32 nc_sfs;
857 u32 nc_drs;
858 u32 nc_sbms;
859 u32 nc_dbms;
860 u32 nc_dnad64;
861 u16 nc_scntl4;
862 #define U3EN 0x80
863 #define AIPEN 0x40
864 #define XCLKH_DT 0x08
865
866 #define XCLKH_ST 0x04
867
868
869 u8 nc_aipcntl0;
870 u8 nc_aipcntl1;
871
872 u32 nc_pmjad1;
873 u32 nc_pmjad2;
874 u8 nc_rbc;
875 u8 nc_rbc1;
876 u8 nc_rbc2;
877 u8 nc_rbc3;
878
879 u8 nc_ua;
880 u8 nc_ua1;
881 u8 nc_ua2;
882 u8 nc_ua3;
883 u32 nc_esa;
884 u8 nc_ia;
885 u8 nc_ia1;
886 u8 nc_ia2;
887 u8 nc_ia3;
888 u32 nc_sbc;
889 u32 nc_csbc;
890
891
892 u16 nc_crcpad;
893 u8 nc_crccntl0;
894 #define SNDCRC 0x10
895 u8 nc_crccntl1;
896 u32 nc_crcdata;
897 u32 nc_e8_;
898 u32 nc_ec_;
899 u16 nc_dfbc;
900
901};
902
903
904
905
906
907
908
909
910#define REGJ(p,r) (offsetof(struct ncr_reg, p ## r))
911#define REG(r) REGJ (nc_, r)
912
913typedef u32 ncrcmd;
914
915
916
917
918
919
920
921
922
923
924#define SCR_DATA_OUT 0x00000000
925#define SCR_DATA_IN 0x01000000
926#define SCR_COMMAND 0x02000000
927#define SCR_STATUS 0x03000000
928#define SCR_DT_DATA_OUT 0x04000000
929#define SCR_DT_DATA_IN 0x05000000
930#define SCR_MSG_OUT 0x06000000
931#define SCR_MSG_IN 0x07000000
932
933#define SCR_ILG_OUT 0x04000000
934#define SCR_ILG_IN 0x05000000
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954#define OPC_MOVE 0x08000000
955
956#define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l))
957#define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l))
958#define SCR_MOVE_TBL (0x10000000 | OPC_MOVE)
959
960#define SCR_CHMOV_ABS(l) ((0x00000000) | (l))
961#define SCR_CHMOV_IND(l) ((0x20000000) | (l))
962#define SCR_CHMOV_TBL (0x10000000)
963
964struct scr_tblmove {
965 u32 size;
966 u32 addr;
967};
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984#define SCR_SEL_ABS 0x40000000
985#define SCR_SEL_ABS_ATN 0x41000000
986#define SCR_SEL_TBL 0x42000000
987#define SCR_SEL_TBL_ATN 0x43000000
988
989
990#ifdef SCSI_NCR_BIG_ENDIAN
991struct scr_tblsel {
992 u8 sel_scntl3;
993 u8 sel_id;
994 u8 sel_sxfer;
995 u8 sel_scntl4;
996};
997#else
998struct scr_tblsel {
999 u8 sel_scntl4;
1000 u8 sel_sxfer;
1001 u8 sel_id;
1002 u8 sel_scntl3;
1003};
1004#endif
1005
1006#define SCR_JMP_REL 0x04000000
1007#define SCR_ID(id) (((u32)(id)) << 16)
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024#define SCR_WAIT_DISC 0x48000000
1025#define SCR_WAIT_RESEL 0x50000000
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040#define SCR_SET(f) (0x58000000 | (f))
1041#define SCR_CLR(f) (0x60000000 | (f))
1042
1043#define SCR_CARRY 0x00000400
1044#define SCR_TRG 0x00000200
1045#define SCR_ACK 0x00000040
1046#define SCR_ATN 0x00000008
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069#define SCR_NO_FLUSH 0x01000000
1070
1071#define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
1072#define SCR_COPY_F(n) (0xc0000000 | (n))
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098#define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80))
1099
1100#define SCR_SFBR_REG(reg,op,data) \
1101 (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
1102
1103#define SCR_REG_SFBR(reg,op,data) \
1104 (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
1105
1106#define SCR_REG_REG(reg,op,data) \
1107 (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
1108
1109
1110#define SCR_LOAD 0x00000000
1111#define SCR_SHL 0x01000000
1112#define SCR_OR 0x02000000
1113#define SCR_XOR 0x03000000
1114#define SCR_AND 0x04000000
1115#define SCR_SHR 0x05000000
1116#define SCR_ADD 0x06000000
1117#define SCR_ADDC 0x07000000
1118
1119#define SCR_SFBR_DATA (0x00800000>>8ul)
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138#define SCR_FROM_REG(reg) \
1139 SCR_REG_SFBR(reg,SCR_OR,0)
1140
1141#define SCR_TO_REG(reg) \
1142 SCR_SFBR_REG(reg,SCR_OR,0)
1143
1144#define SCR_LOAD_REG(reg,data) \
1145 SCR_REG_REG(reg,SCR_LOAD,data)
1146
1147#define SCR_LOAD_SFBR(data) \
1148 (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168#define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul)
1169#define SCR_NO_FLUSH2 0x02000000
1170#define SCR_DSA_REL2 0x10000000
1171
1172#define SCR_LOAD_R(reg, how, n) \
1173 (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
1174
1175#define SCR_STORE_R(reg, how, n) \
1176 (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
1177
1178#define SCR_LOAD_ABS(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2, n)
1179#define SCR_LOAD_REL(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n)
1180#define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n)
1181#define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n)
1182
1183#define SCR_STORE_ABS(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2, n)
1184#define SCR_STORE_REL(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n)
1185#define SCR_STORE_ABS_F(reg, n) SCR_STORE_R(reg, 0, n)
1186#define SCR_STORE_REL_F(reg, n) SCR_STORE_R(reg, SCR_DSA_REL2, n)
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225#define SCR_NO_OP 0x80000000
1226#define SCR_JUMP 0x80080000
1227#define SCR_JUMP64 0x80480000
1228#define SCR_JUMPR 0x80880000
1229#define SCR_CALL 0x88080000
1230#define SCR_CALLR 0x88880000
1231#define SCR_RETURN 0x90080000
1232#define SCR_INT 0x98080000
1233#define SCR_INT_FLY 0x98180000
1234
1235#define IFFALSE(arg) (0x00080000 | (arg))
1236#define IFTRUE(arg) (0x00000000 | (arg))
1237
1238#define WHEN(phase) (0x00030000 | (phase))
1239#define IF(phase) (0x00020000 | (phase))
1240
1241#define DATA(D) (0x00040000 | ((D) & 0xff))
1242#define MASK(D,M) (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
1243
1244#define CARRYSET (0x00200000)
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257#define S_GOOD (0x00)
1258#define S_CHECK_COND (0x02)
1259#define S_COND_MET (0x04)
1260#define S_BUSY (0x08)
1261#define S_INT (0x10)
1262#define S_INT_COND_MET (0x14)
1263#define S_CONFLICT (0x18)
1264#define S_TERMINATED (0x20)
1265#define S_QUEUE_FULL (0x28)
1266#define S_ILLEGAL (0xff)
1267#define S_SENSE (0x80)
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279#define ncr_build_sge(np, data, badd, len) \
1280do { \
1281 (data)->addr = cpu_to_scr(badd); \
1282 (data)->size = cpu_to_scr(len); \
1283} while (0)
1284
1285
1286
1287
1288
1289
1290
1291
1292struct ncr_slot {
1293 u_long base;
1294 u_long base_2;
1295 u_long base_c;
1296 u_long base_2_c;
1297 void __iomem *base_v;
1298 void __iomem *base_2_v;
1299 int irq;
1300
1301 volatile struct ncr_reg __iomem *reg;
1302};
1303
1304
1305
1306
1307
1308
1309
1310
1311struct ncr_device {
1312 struct device *dev;
1313 struct ncr_slot slot;
1314 struct ncr_chip chip;
1315 u_char host_id;
1316 u8 differential;
1317};
1318
1319extern struct Scsi_Host *ncr_attach(struct scsi_host_template *tpnt, int unit, struct ncr_device *device);
1320extern void ncr53c8xx_release(struct Scsi_Host *host);
1321irqreturn_t ncr53c8xx_intr(int irq, void *dev_id);
1322extern int ncr53c8xx_init(void);
1323extern void ncr53c8xx_exit(void);
1324
1325#endif
1326