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