0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041 #ifndef NCR53C8XX_H
0042 #define NCR53C8XX_H
0043
0044 #include <scsi/scsi_host.h>
0045
0046
0047
0048
0049
0050
0051 #define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
0052 #define SCSI_NCR_DEBUG_INFO_SUPPORT
0053
0054
0055
0056
0057
0058 #ifdef CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK
0059 # define SCSI_NCR_ENABLE_INTEGRITY_CHECK
0060 #endif
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079 #define SCSI_NCR_SETUP_SPECIAL_FEATURES (3)
0080
0081 #define SCSI_NCR_MAX_SYNC (80)
0082
0083
0084
0085
0086 #ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS
0087 #if CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2
0088 #define SCSI_NCR_MAX_TAGS (2)
0089 #elif CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 256
0090 #define SCSI_NCR_MAX_TAGS (256)
0091 #else
0092 #define SCSI_NCR_MAX_TAGS CONFIG_SCSI_NCR53C8XX_MAX_TAGS
0093 #endif
0094 #else
0095 #define SCSI_NCR_MAX_TAGS (8)
0096 #endif
0097
0098
0099
0100
0101
0102 #ifdef CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
0103 #define SCSI_NCR_SETUP_DEFAULT_TAGS CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS
0104 #elif defined CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE
0105 #define SCSI_NCR_SETUP_DEFAULT_TAGS SCSI_NCR_MAX_TAGS
0106 #else
0107 #define SCSI_NCR_SETUP_DEFAULT_TAGS (0)
0108 #endif
0109
0110
0111
0112
0113 #if defined(CONFIG_SCSI_NCR53C8XX_IARB)
0114 #define SCSI_NCR_IARB_SUPPORT
0115 #endif
0116
0117
0118
0119
0120
0121 #ifndef CONFIG_SCSI_NCR53C8XX_SYNC
0122 #define CONFIG_SCSI_NCR53C8XX_SYNC (20)
0123 #elif CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC
0124 #undef CONFIG_SCSI_NCR53C8XX_SYNC
0125 #define CONFIG_SCSI_NCR53C8XX_SYNC SCSI_NCR_MAX_SYNC
0126 #endif
0127
0128 #if CONFIG_SCSI_NCR53C8XX_SYNC == 0
0129 #define SCSI_NCR_SETUP_DEFAULT_SYNC (255)
0130 #elif CONFIG_SCSI_NCR53C8XX_SYNC <= 5
0131 #define SCSI_NCR_SETUP_DEFAULT_SYNC (50)
0132 #elif CONFIG_SCSI_NCR53C8XX_SYNC <= 20
0133 #define SCSI_NCR_SETUP_DEFAULT_SYNC (250/(CONFIG_SCSI_NCR53C8XX_SYNC))
0134 #elif CONFIG_SCSI_NCR53C8XX_SYNC <= 33
0135 #define SCSI_NCR_SETUP_DEFAULT_SYNC (11)
0136 #elif CONFIG_SCSI_NCR53C8XX_SYNC <= 40
0137 #define SCSI_NCR_SETUP_DEFAULT_SYNC (10)
0138 #else
0139 #define SCSI_NCR_SETUP_DEFAULT_SYNC (9)
0140 #endif
0141
0142
0143
0144
0145 #ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
0146 #define SCSI_NCR_SETUP_DISCONNECTION (0)
0147 #else
0148 #define SCSI_NCR_SETUP_DISCONNECTION (1)
0149 #endif
0150
0151
0152
0153
0154 #ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO
0155 #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1)
0156 #else
0157 #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0)
0158 #endif
0159
0160
0161
0162
0163 #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
0164 #define SCSI_NCR_SETUP_MASTER_PARITY (0)
0165 #else
0166 #define SCSI_NCR_SETUP_MASTER_PARITY (1)
0167 #endif
0168
0169
0170
0171
0172 #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
0173 #define SCSI_NCR_SETUP_SCSI_PARITY (0)
0174 #else
0175 #define SCSI_NCR_SETUP_SCSI_PARITY (1)
0176 #endif
0177
0178
0179
0180
0181 #define SCSI_NCR_SETUP_SETTLE_TIME (2)
0182
0183
0184
0185
0186 #ifndef SCSI_NCR_PCIQ_WORK_AROUND_OPT
0187 #define SCSI_NCR_PCIQ_WORK_AROUND_OPT 1
0188 #endif
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200 #if SCSI_NCR_PCIQ_WORK_AROUND_OPT == 1
0201 #define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
0202 #define SCSI_NCR_PCIQ_MAY_REORDER_WRITES
0203 #define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218 #elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 2
0219 #define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM
0220 #define SCSI_NCR_PCIQ_MAY_REORDER_WRITES
0221 #define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS
0222 #define SCSI_NCR_PCIQ_BROKEN_INTR
0223
0224
0225
0226
0227
0228
0229
0230 #elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 3
0231 #define SCSI_NCR_PCIQ_SYNC_ON_INTR
0232 #endif
0233
0234
0235
0236
0237
0238
0239 #define SCSI_NCR_ALWAYS_SIMPLE_TAG
0240 #define SCSI_NCR_MAX_SCATTER (127)
0241 #define SCSI_NCR_MAX_TARGET (16)
0242
0243
0244
0245
0246
0247
0248
0249 #define SCSI_NCR_CAN_QUEUE (8*SCSI_NCR_MAX_TAGS + 2*SCSI_NCR_MAX_TARGET)
0250 #define SCSI_NCR_CMD_PER_LUN (SCSI_NCR_MAX_TAGS)
0251
0252 #define SCSI_NCR_SG_TABLESIZE (SCSI_NCR_MAX_SCATTER)
0253 #define SCSI_NCR_TIMER_INTERVAL (HZ)
0254
0255 #define SCSI_NCR_MAX_LUN (16)
0256
0257
0258
0259
0260
0261
0262 #ifdef __BIG_ENDIAN
0263
0264 #define inw_l2b inw
0265 #define inl_l2b inl
0266 #define outw_b2l outw
0267 #define outl_b2l outl
0268
0269 #define readb_raw readb
0270 #define writeb_raw writeb
0271
0272 #if defined(SCSI_NCR_BIG_ENDIAN)
0273 #define readw_l2b __raw_readw
0274 #define readl_l2b __raw_readl
0275 #define writew_b2l __raw_writew
0276 #define writel_b2l __raw_writel
0277 #define readw_raw __raw_readw
0278 #define readl_raw __raw_readl
0279 #define writew_raw __raw_writew
0280 #define writel_raw __raw_writel
0281 #else
0282 #define readw_l2b readw
0283 #define readl_l2b readl
0284 #define writew_b2l writew
0285 #define writel_b2l writel
0286 #define readw_raw readw
0287 #define readl_raw readl
0288 #define writew_raw writew
0289 #define writel_raw writel
0290 #endif
0291
0292 #else
0293
0294 #define inw_raw inw
0295 #define inl_raw inl
0296 #define outw_raw outw
0297 #define outl_raw outl
0298
0299 #define readb_raw readb
0300 #define readw_raw readw
0301 #define readl_raw readl
0302 #define writeb_raw writeb
0303 #define writew_raw writew
0304 #define writel_raw writel
0305
0306 #endif
0307
0308 #if !defined(__hppa__) && !defined(__mips__)
0309 #ifdef SCSI_NCR_BIG_ENDIAN
0310 #error "The NCR in BIG ENDIAN addressing mode is not (yet) supported"
0311 #endif
0312 #endif
0313
0314 #define MEMORY_BARRIER() mb()
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324
0325 #if defined(SCSI_NCR_BIG_ENDIAN)
0326
0327 #define ncr_offb(o) (((o)&~3)+((~((o)&3))&3))
0328 #define ncr_offw(o) (((o)&~3)+((~((o)&3))&2))
0329
0330 #else
0331
0332 #define ncr_offb(o) (o)
0333 #define ncr_offw(o) (o)
0334
0335 #endif
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345 #if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
0346
0347 #define cpu_to_scr(dw) cpu_to_le32(dw)
0348 #define scr_to_cpu(dw) le32_to_cpu(dw)
0349
0350 #elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
0351
0352 #define cpu_to_scr(dw) cpu_to_be32(dw)
0353 #define scr_to_cpu(dw) be32_to_cpu(dw)
0354
0355 #else
0356
0357 #define cpu_to_scr(dw) (dw)
0358 #define scr_to_cpu(dw) (dw)
0359
0360 #endif
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379 #define INB_OFF(o) readb_raw((char __iomem *)np->reg + ncr_offb(o))
0380 #define OUTB_OFF(o, val) writeb_raw((val), (char __iomem *)np->reg + ncr_offb(o))
0381
0382 #if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN)
0383
0384 #define INW_OFF(o) readw_l2b((char __iomem *)np->reg + ncr_offw(o))
0385 #define INL_OFF(o) readl_l2b((char __iomem *)np->reg + (o))
0386
0387 #define OUTW_OFF(o, val) writew_b2l((val), (char __iomem *)np->reg + ncr_offw(o))
0388 #define OUTL_OFF(o, val) writel_b2l((val), (char __iomem *)np->reg + (o))
0389
0390 #elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN)
0391
0392 #define INW_OFF(o) readw_b2l((char __iomem *)np->reg + ncr_offw(o))
0393 #define INL_OFF(o) readl_b2l((char __iomem *)np->reg + (o))
0394
0395 #define OUTW_OFF(o, val) writew_l2b((val), (char __iomem *)np->reg + ncr_offw(o))
0396 #define OUTL_OFF(o, val) writel_l2b((val), (char __iomem *)np->reg + (o))
0397
0398 #else
0399
0400 #ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
0401
0402 #define INW_OFF(o) (readb((char __iomem *)np->reg + ncr_offw(o)) << 8 | readb((char __iomem *)np->reg + ncr_offw(o) + 1))
0403 #else
0404 #define INW_OFF(o) readw_raw((char __iomem *)np->reg + ncr_offw(o))
0405 #endif
0406 #define INL_OFF(o) readl_raw((char __iomem *)np->reg + (o))
0407
0408 #ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS
0409
0410 #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)
0411 #else
0412 #define OUTW_OFF(o, val) writew_raw((val), (char __iomem *)np->reg + ncr_offw(o))
0413 #endif
0414 #define OUTL_OFF(o, val) writel_raw((val), (char __iomem *)np->reg + (o))
0415
0416 #endif
0417
0418 #define INB(r) INB_OFF (offsetof(struct ncr_reg,r))
0419 #define INW(r) INW_OFF (offsetof(struct ncr_reg,r))
0420 #define INL(r) INL_OFF (offsetof(struct ncr_reg,r))
0421
0422 #define OUTB(r, val) OUTB_OFF (offsetof(struct ncr_reg,r), (val))
0423 #define OUTW(r, val) OUTW_OFF (offsetof(struct ncr_reg,r), (val))
0424 #define OUTL(r, val) OUTL_OFF (offsetof(struct ncr_reg,r), (val))
0425
0426
0427
0428
0429
0430 #define OUTONB(r, m) OUTB(r, INB(r) | (m))
0431 #define OUTOFFB(r, m) OUTB(r, INB(r) & ~(m))
0432 #define OUTONW(r, m) OUTW(r, INW(r) | (m))
0433 #define OUTOFFW(r, m) OUTW(r, INW(r) & ~(m))
0434 #define OUTONL(r, m) OUTL(r, INL(r) | (m))
0435 #define OUTOFFL(r, m) OUTL(r, INL(r) & ~(m))
0436
0437
0438
0439
0440
0441
0442 #define OUTL_DSP(v) \
0443 do { \
0444 MEMORY_BARRIER(); \
0445 OUTL (nc_dsp, (v)); \
0446 } while (0)
0447
0448 #define OUTONB_STD() \
0449 do { \
0450 MEMORY_BARRIER(); \
0451 OUTONB (nc_dcntl, (STD|NOCOM)); \
0452 } while (0)
0453
0454
0455
0456
0457
0458 struct ncr_chip {
0459 unsigned short revision_id;
0460 unsigned char burst_max;
0461 unsigned char offset_max;
0462 unsigned char nr_divisor;
0463 unsigned int features;
0464 #define FE_LED0 (1<<0)
0465 #define FE_WIDE (1<<1)
0466 #define FE_ULTRA (1<<2)
0467 #define FE_DBLR (1<<4)
0468 #define FE_QUAD (1<<5)
0469 #define FE_ERL (1<<6)
0470 #define FE_CLSE (1<<7)
0471 #define FE_WRIE (1<<8)
0472 #define FE_ERMP (1<<9)
0473 #define FE_BOF (1<<10)
0474 #define FE_DFS (1<<11)
0475 #define FE_PFEN (1<<12)
0476 #define FE_LDSTR (1<<13)
0477 #define FE_RAM (1<<14)
0478 #define FE_VARCLK (1<<15)
0479 #define FE_RAM8K (1<<16)
0480 #define FE_64BIT (1<<17)
0481 #define FE_IO256 (1<<18)
0482 #define FE_NOPM (1<<19)
0483 #define FE_LEDC (1<<20)
0484 #define FE_DIFF (1<<21)
0485 #define FE_66MHZ (1<<23)
0486 #define FE_DAC (1<<24)
0487 #define FE_ISTAT1 (1<<25)
0488 #define FE_DAC_IN_USE (1<<26)
0489 #define FE_EHP (1<<27)
0490 #define FE_MUX (1<<28)
0491 #define FE_EA (1<<29)
0492
0493 #define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
0494 #define FE_SCSI_SET (FE_WIDE|FE_ULTRA|FE_DBLR|FE_QUAD|F_CLK80)
0495 #define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM)
0496 };
0497
0498
0499
0500
0501
0502
0503
0504
0505 #define SCSI_NCR_MAX_EXCLUDES 8
0506 struct ncr_driver_setup {
0507 u8 master_parity;
0508 u8 scsi_parity;
0509 u8 disconnection;
0510 u8 special_features;
0511 u8 force_sync_nego;
0512 u8 reverse_probe;
0513 u8 pci_fix_up;
0514 u8 use_nvram;
0515 u8 verbose;
0516 u8 default_tags;
0517 u16 default_sync;
0518 u16 debug;
0519 u8 burst_max;
0520 u8 led_pin;
0521 u8 max_wide;
0522 u8 settle_delay;
0523 u8 diff_support;
0524 u8 irqm;
0525 u8 bus_check;
0526 u8 optimize;
0527 u8 recovery;
0528 u8 host_id;
0529 u16 iarb;
0530 u32 excludes[SCSI_NCR_MAX_EXCLUDES];
0531 char tag_ctrl[100];
0532 };
0533
0534
0535
0536
0537
0538 #define SCSI_NCR_DRIVER_SETUP \
0539 { \
0540 SCSI_NCR_SETUP_MASTER_PARITY, \
0541 SCSI_NCR_SETUP_SCSI_PARITY, \
0542 SCSI_NCR_SETUP_DISCONNECTION, \
0543 SCSI_NCR_SETUP_SPECIAL_FEATURES, \
0544 SCSI_NCR_SETUP_FORCE_SYNC_NEGO, \
0545 0, \
0546 0, \
0547 1, \
0548 0, \
0549 SCSI_NCR_SETUP_DEFAULT_TAGS, \
0550 SCSI_NCR_SETUP_DEFAULT_SYNC, \
0551 0x00, \
0552 7, \
0553 0, \
0554 1, \
0555 SCSI_NCR_SETUP_SETTLE_TIME, \
0556 0, \
0557 0, \
0558 1, \
0559 0, \
0560 0, \
0561 255, \
0562 0x00 \
0563 }
0564
0565
0566
0567
0568
0569
0570 #define SCSI_NCR_DRIVER_SAFE_SETUP \
0571 { \
0572 0, \
0573 1, \
0574 0, \
0575 0, \
0576 0, \
0577 0, \
0578 0, \
0579 1, \
0580 2, \
0581 0, \
0582 255, \
0583 0x00, \
0584 255, \
0585 0, \
0586 0, \
0587 10, \
0588 1, \
0589 1, \
0590 1, \
0591 0, \
0592 0, \
0593 255 \
0594 }
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605 struct ncr_reg {
0606 u8 nc_scntl0;
0607
0608 u8 nc_scntl1;
0609 #define ISCON 0x10
0610 #define CRST 0x08
0611 #define IARB 0x02
0612
0613 u8 nc_scntl2;
0614 #define SDU 0x80
0615 #define CHM 0x40
0616 #define WSS 0x08
0617 #define WSR 0x01
0618
0619 u8 nc_scntl3;
0620 #define EWS 0x08
0621 #define ULTRA 0x80
0622
0623
0624 u8 nc_scid;
0625 #define RRE 0x40
0626 #define SRE 0x20
0627
0628 u8 nc_sxfer;
0629
0630
0631 u8 nc_sdid;
0632
0633 u8 nc_gpreg;
0634
0635 u8 nc_sfbr;
0636
0637 u8 nc_socl;
0638 #define CREQ 0x80
0639 #define CACK 0x40
0640 #define CBSY 0x20
0641 #define CSEL 0x10
0642 #define CATN 0x08
0643 #define CMSG 0x04
0644 #define CC_D 0x02
0645 #define CI_O 0x01
0646
0647 u8 nc_ssid;
0648
0649 u8 nc_sbcl;
0650
0651 u8 nc_dstat;
0652 #define DFE 0x80
0653 #define MDPE 0x40
0654 #define BF 0x20
0655 #define ABRT 0x10
0656 #define SSI 0x08
0657 #define SIR 0x04
0658 #define IID 0x01
0659
0660 u8 nc_sstat0;
0661 #define ILF 0x80
0662 #define ORF 0x40
0663 #define OLF 0x20
0664 #define AIP 0x10
0665 #define LOA 0x08
0666 #define WOA 0x04
0667 #define IRST 0x02
0668 #define SDP 0x01
0669
0670 u8 nc_sstat1;
0671 #define FF3210 0xf0
0672
0673 u8 nc_sstat2;
0674 #define ILF1 0x80
0675 #define ORF1 0x40
0676 #define OLF1 0x20
0677 #define DM 0x04
0678 #define LDSC 0x02
0679
0680 u8 nc_dsa;
0681 u8 nc_dsa1;
0682 u8 nc_dsa2;
0683 u8 nc_dsa3;
0684
0685 u8 nc_istat;
0686 #define CABRT 0x80
0687 #define SRST 0x40
0688 #define SIGP 0x20
0689 #define SEM 0x10
0690 #define CON 0x08
0691 #define INTF 0x04
0692 #define SIP 0x02
0693 #define DIP 0x01
0694
0695 u8 nc_istat1;
0696 #define FLSH 0x04
0697 #define SRUN 0x02
0698 #define SIRQD 0x01
0699
0700 u8 nc_mbox0;
0701 u8 nc_mbox1;
0702
0703 u8 nc_ctest0;
0704 #define EHP 0x04
0705 u8 nc_ctest1;
0706
0707 u8 nc_ctest2;
0708 #define CSIGP 0x40
0709
0710
0711 u8 nc_ctest3;
0712 #define FLF 0x08
0713 #define CLF 0x04
0714 #define FM 0x02
0715 #define WRIE 0x01
0716
0717
0718 u32 nc_temp;
0719
0720 u8 nc_dfifo;
0721 u8 nc_ctest4;
0722 #define MUX 0x80
0723 #define BDIS 0x80
0724 #define MPEE 0x08
0725
0726 u8 nc_ctest5;
0727 #define DFS 0x20
0728
0729 u8 nc_ctest6;
0730
0731 u32 nc_dbc;
0732 u32 nc_dnad;
0733 u32 nc_dsp;
0734 u32 nc_dsps;
0735
0736 u8 nc_scratcha;
0737 u8 nc_scratcha1;
0738 u8 nc_scratcha2;
0739 u8 nc_scratcha3;
0740
0741 u8 nc_dmode;
0742 #define BL_2 0x80
0743 #define BL_1 0x40
0744 #define ERL 0x08
0745 #define ERMP 0x04
0746 #define BOF 0x02
0747
0748 u8 nc_dien;
0749 u8 nc_sbr;
0750
0751 u8 nc_dcntl;
0752 #define CLSE 0x80
0753 #define PFF 0x40
0754 #define PFEN 0x20
0755 #define EA 0x20
0756 #define SSM 0x10
0757 #define IRQM 0x08
0758 #define STD 0x04
0759 #define IRQD 0x02
0760 #define NOCOM 0x01
0761
0762
0763 u32 nc_adder;
0764
0765 u16 nc_sien;
0766 u16 nc_sist;
0767 #define SBMC 0x1000
0768 #define STO 0x0400
0769 #define GEN 0x0200
0770 #define HTH 0x0100
0771 #define MA 0x80
0772 #define CMP 0x40
0773 #define SEL 0x20
0774 #define RSL 0x10
0775 #define SGE 0x08
0776 #define UDC 0x04
0777 #define RST 0x02
0778 #define PAR 0x01
0779
0780 u8 nc_slpar;
0781 u8 nc_swide;
0782 u8 nc_macntl;
0783 u8 nc_gpcntl;
0784 u8 nc_stime0;
0785 u8 nc_stime1;
0786 u16 nc_respid;
0787
0788 u8 nc_stest0;
0789
0790 u8 nc_stest1;
0791 #define SCLK 0x80
0792 #define DBLEN 0x08
0793 #define DBLSEL 0x04
0794
0795
0796 u8 nc_stest2;
0797 #define ROF 0x40
0798 #define DIF 0x20
0799 #define EXT 0x02
0800
0801 u8 nc_stest3;
0802 #define TE 0x80
0803 #define HSC 0x20
0804 #define CSF 0x02
0805
0806 u16 nc_sidl;
0807 u8 nc_stest4;
0808 #define SMODE 0xc0
0809 #define SMODE_HVD 0x40
0810 #define SMODE_SE 0x80
0811 #define SMODE_LVD 0xc0
0812 #define LCKFRQ 0x20
0813
0814
0815 u8 nc_53_;
0816 u16 nc_sodl;
0817 u8 nc_ccntl0;
0818 #define ENPMJ 0x80
0819 #define PMJCTL 0x40
0820 #define ENNDJ 0x20
0821 #define DISFC 0x10
0822 #define DILS 0x02
0823 #define DPR 0x01
0824
0825 u8 nc_ccntl1;
0826 #define ZMOD 0x80
0827 #define DIC 0x10
0828 #define DDAC 0x08
0829 #define XTIMOD 0x04
0830 #define EXTIBMV 0x02
0831 #define EXDBMV 0x01
0832
0833 u16 nc_sbdl;
0834 u16 nc_5a_;
0835
0836 u8 nc_scr0;
0837 u8 nc_scr1;
0838 u8 nc_scr2;
0839 u8 nc_scr3;
0840
0841 u8 nc_scrx[64];
0842 u32 nc_mmrs;
0843 u32 nc_mmws;
0844 u32 nc_sfs;
0845 u32 nc_drs;
0846 u32 nc_sbms;
0847 u32 nc_dbms;
0848 u32 nc_dnad64;
0849 u16 nc_scntl4;
0850 #define U3EN 0x80
0851 #define AIPEN 0x40
0852 #define XCLKH_DT 0x08
0853
0854 #define XCLKH_ST 0x04
0855
0856
0857 u8 nc_aipcntl0;
0858 u8 nc_aipcntl1;
0859
0860 u32 nc_pmjad1;
0861 u32 nc_pmjad2;
0862 u8 nc_rbc;
0863 u8 nc_rbc1;
0864 u8 nc_rbc2;
0865 u8 nc_rbc3;
0866
0867 u8 nc_ua;
0868 u8 nc_ua1;
0869 u8 nc_ua2;
0870 u8 nc_ua3;
0871 u32 nc_esa;
0872 u8 nc_ia;
0873 u8 nc_ia1;
0874 u8 nc_ia2;
0875 u8 nc_ia3;
0876 u32 nc_sbc;
0877 u32 nc_csbc;
0878
0879
0880 u16 nc_crcpad;
0881 u8 nc_crccntl0;
0882 #define SNDCRC 0x10
0883 u8 nc_crccntl1;
0884 u32 nc_crcdata;
0885 u32 nc_e8_;
0886 u32 nc_ec_;
0887 u16 nc_dfbc;
0888
0889 };
0890
0891
0892
0893
0894
0895
0896
0897
0898 #define REGJ(p,r) (offsetof(struct ncr_reg, p ## r))
0899 #define REG(r) REGJ (nc_, r)
0900
0901 typedef u32 ncrcmd;
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912 #define SCR_DATA_OUT 0x00000000
0913 #define SCR_DATA_IN 0x01000000
0914 #define SCR_COMMAND 0x02000000
0915 #define SCR_STATUS 0x03000000
0916 #define SCR_DT_DATA_OUT 0x04000000
0917 #define SCR_DT_DATA_IN 0x05000000
0918 #define SCR_MSG_OUT 0x06000000
0919 #define SCR_MSG_IN 0x07000000
0920
0921 #define SCR_ILG_OUT 0x04000000
0922 #define SCR_ILG_IN 0x05000000
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942 #define OPC_MOVE 0x08000000
0943
0944 #define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l))
0945 #define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l))
0946 #define SCR_MOVE_TBL (0x10000000 | OPC_MOVE)
0947
0948 #define SCR_CHMOV_ABS(l) ((0x00000000) | (l))
0949 #define SCR_CHMOV_IND(l) ((0x20000000) | (l))
0950 #define SCR_CHMOV_TBL (0x10000000)
0951
0952 struct scr_tblmove {
0953 u32 size;
0954 u32 addr;
0955 };
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972 #define SCR_SEL_ABS 0x40000000
0973 #define SCR_SEL_ABS_ATN 0x41000000
0974 #define SCR_SEL_TBL 0x42000000
0975 #define SCR_SEL_TBL_ATN 0x43000000
0976
0977
0978 #ifdef SCSI_NCR_BIG_ENDIAN
0979 struct scr_tblsel {
0980 u8 sel_scntl3;
0981 u8 sel_id;
0982 u8 sel_sxfer;
0983 u8 sel_scntl4;
0984 };
0985 #else
0986 struct scr_tblsel {
0987 u8 sel_scntl4;
0988 u8 sel_sxfer;
0989 u8 sel_id;
0990 u8 sel_scntl3;
0991 };
0992 #endif
0993
0994 #define SCR_JMP_REL 0x04000000
0995 #define SCR_ID(id) (((u32)(id)) << 16)
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012 #define SCR_WAIT_DISC 0x48000000
1013 #define SCR_WAIT_RESEL 0x50000000
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028 #define SCR_SET(f) (0x58000000 | (f))
1029 #define SCR_CLR(f) (0x60000000 | (f))
1030
1031 #define SCR_CARRY 0x00000400
1032 #define SCR_TRG 0x00000200
1033 #define SCR_ACK 0x00000040
1034 #define SCR_ATN 0x00000008
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057 #define SCR_NO_FLUSH 0x01000000
1058
1059 #define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
1060 #define SCR_COPY_F(n) (0xc0000000 | (n))
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086 #define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80))
1087
1088 #define SCR_SFBR_REG(reg,op,data) \
1089 (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
1090
1091 #define SCR_REG_SFBR(reg,op,data) \
1092 (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
1093
1094 #define SCR_REG_REG(reg,op,data) \
1095 (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul))
1096
1097
1098 #define SCR_LOAD 0x00000000
1099 #define SCR_SHL 0x01000000
1100 #define SCR_OR 0x02000000
1101 #define SCR_XOR 0x03000000
1102 #define SCR_AND 0x04000000
1103 #define SCR_SHR 0x05000000
1104 #define SCR_ADD 0x06000000
1105 #define SCR_ADDC 0x07000000
1106
1107 #define SCR_SFBR_DATA (0x00800000>>8ul)
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126 #define SCR_FROM_REG(reg) \
1127 SCR_REG_SFBR(reg,SCR_OR,0)
1128
1129 #define SCR_TO_REG(reg) \
1130 SCR_SFBR_REG(reg,SCR_OR,0)
1131
1132 #define SCR_LOAD_REG(reg,data) \
1133 SCR_REG_REG(reg,SCR_LOAD,data)
1134
1135 #define SCR_LOAD_SFBR(data) \
1136 (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156 #define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul)
1157 #define SCR_NO_FLUSH2 0x02000000
1158 #define SCR_DSA_REL2 0x10000000
1159
1160 #define SCR_LOAD_R(reg, how, n) \
1161 (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
1162
1163 #define SCR_STORE_R(reg, how, n) \
1164 (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n))
1165
1166 #define SCR_LOAD_ABS(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2, n)
1167 #define SCR_LOAD_REL(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n)
1168 #define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n)
1169 #define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n)
1170
1171 #define SCR_STORE_ABS(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2, n)
1172 #define SCR_STORE_REL(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n)
1173 #define SCR_STORE_ABS_F(reg, n) SCR_STORE_R(reg, 0, n)
1174 #define SCR_STORE_REL_F(reg, n) SCR_STORE_R(reg, SCR_DSA_REL2, n)
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
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 #define SCR_NO_OP 0x80000000
1214 #define SCR_JUMP 0x80080000
1215 #define SCR_JUMP64 0x80480000
1216 #define SCR_JUMPR 0x80880000
1217 #define SCR_CALL 0x88080000
1218 #define SCR_CALLR 0x88880000
1219 #define SCR_RETURN 0x90080000
1220 #define SCR_INT 0x98080000
1221 #define SCR_INT_FLY 0x98180000
1222
1223 #define IFFALSE(arg) (0x00080000 | (arg))
1224 #define IFTRUE(arg) (0x00000000 | (arg))
1225
1226 #define WHEN(phase) (0x00030000 | (phase))
1227 #define IF(phase) (0x00020000 | (phase))
1228
1229 #define DATA(D) (0x00040000 | ((D) & 0xff))
1230 #define MASK(D,M) (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
1231
1232 #define CARRYSET (0x00200000)
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251 #define ncr_build_sge(np, data, badd, len) \
1252 do { \
1253 (data)->addr = cpu_to_scr(badd); \
1254 (data)->size = cpu_to_scr(len); \
1255 } while (0)
1256
1257
1258
1259
1260
1261
1262
1263
1264 struct ncr_slot {
1265 u_long base;
1266 u_long base_2;
1267 u_long base_c;
1268 u_long base_2_c;
1269 void __iomem *base_v;
1270 void __iomem *base_2_v;
1271 int irq;
1272
1273 volatile struct ncr_reg __iomem *reg;
1274 };
1275
1276
1277
1278
1279
1280
1281
1282
1283 struct ncr_device {
1284 struct device *dev;
1285 struct ncr_slot slot;
1286 struct ncr_chip chip;
1287 u_char host_id;
1288 u8 differential;
1289 };
1290
1291
1292 struct ncr_cmd_priv {
1293 int data_mapped;
1294 int data_mapping;
1295 };
1296
1297 extern struct Scsi_Host *ncr_attach(struct scsi_host_template *tpnt, int unit, struct ncr_device *device);
1298 extern void ncr53c8xx_release(struct Scsi_Host *host);
1299 irqreturn_t ncr53c8xx_intr(int irq, void *dev_id);
1300 extern int ncr53c8xx_init(void);
1301 extern void ncr53c8xx_exit(void);
1302
1303 #endif