1 /* 2 * Sun3 SCSI stuff by Erik Verbruggen (erik@bigmama.xtdnet.nl) 3 * 4 * Sun3 DMA additions by Sam Creasey (sammy@sammy.net) 5 * 6 * Adapted from mac_scsinew.h: 7 */ 8 /* 9 * Cumana Generic NCR5380 driver defines 10 * 11 * Copyright 1993, Drew Eckhardt 12 * Visionary Computing 13 * (Unix and Linux consulting and custom programming) 14 * drew@colorado.edu 15 * +1 (303) 440-4894 16 * 17 * ALPHA RELEASE 1. 18 * 19 * For more information, please consult 20 * 21 * NCR 5380 Family 22 * SCSI Protocol Controller 23 * Databook 24 * 25 * NCR Microelectronics 26 * 1635 Aeroplaza Drive 27 * Colorado Springs, CO 80916 28 * 1+ (719) 578-3400 29 * 1+ (800) 334-5454 30 */ 31 32 /* 33 * $Log: cumana_NCR5380.h,v $ 34 */ 35 36 #ifndef SUN3_NCR5380_H 37 #define SUN3_NCR5380_H 38 39 #define SUN3SCSI_PUBLIC_RELEASE 1 40 41 /* 42 * Int: level 2 autovector 43 * IO: type 1, base 0x00140000, 5 bits phys space: A<4..0> 44 */ 45 #define IRQ_SUN3_SCSI 2 46 #define IOBASE_SUN3_SCSI 0x00140000 47 48 #define IOBASE_SUN3_VMESCSI 0xff200000 49 50 static int sun3scsi_abort(struct scsi_cmnd *); 51 static int sun3scsi_detect (struct scsi_host_template *); 52 static const char *sun3scsi_info (struct Scsi_Host *); 53 static int sun3scsi_bus_reset(struct scsi_cmnd *); 54 static int sun3scsi_queue_command(struct scsi_cmnd *, 55 void (*done)(struct scsi_cmnd *)); 56 static int sun3scsi_release (struct Scsi_Host *); 57 58 #ifndef CMD_PER_LUN 59 #define CMD_PER_LUN 2 60 #endif 61 62 #ifndef CAN_QUEUE 63 #define CAN_QUEUE 16 64 #endif 65 66 #ifndef SG_TABLESIZE 67 #define SG_TABLESIZE SG_NONE 68 #endif 69 70 #ifndef MAX_TAGS 71 #define MAX_TAGS 32 72 #endif 73 74 #ifndef USE_TAGGED_QUEUING 75 #define USE_TAGGED_QUEUING 1 76 #endif 77 78 #include <scsi/scsicam.h> 79 80 #ifdef SUN3_SCSI_VME 81 #define SUN3_SCSI_NAME "Sun3 NCR5380 VME SCSI" 82 #else 83 #define SUN3_SCSI_NAME "Sun3 NCR5380 SCSI" 84 #endif 85 86 #ifndef HOSTS_C 87 88 #define NCR5380_implementation_fields \ 89 int port, ctrl 90 91 #define NCR5380_local_declare() \ 92 struct Scsi_Host *_instance 93 94 #define NCR5380_setup(instance) \ 95 _instance = instance 96 97 #define NCR5380_read(reg) sun3scsi_read(reg) 98 #define NCR5380_write(reg, value) sun3scsi_write(reg, value) 99 100 #define NCR5380_intr sun3scsi_intr 101 #define NCR5380_queue_command sun3scsi_queue_command 102 #define NCR5380_bus_reset sun3scsi_bus_reset 103 #define NCR5380_abort sun3scsi_abort 104 #define NCR5380_proc_info sun3scsi_proc_info 105 #define NCR5380_dma_xfer_len(i, cmd, phase) \ 106 sun3scsi_dma_xfer_len(cmd->SCp.this_residual,cmd,((phase) & SR_IO) ? 0 : 1) 107 108 #define NCR5380_dma_write_setup(instance, data, count) sun3scsi_dma_setup(data, count, 1) 109 #define NCR5380_dma_read_setup(instance, data, count) sun3scsi_dma_setup(data, count, 0) 110 #define NCR5380_dma_residual sun3scsi_dma_residual 111 112 #define BOARD_NORMAL 0 113 #define BOARD_NCR53C400 1 114 115 /* additional registers - mainly DMA control regs */ 116 /* these start at regbase + 8 -- directly after the NCR regs */ 117 struct sun3_dma_regs { 118 unsigned short dma_addr_hi; /* vme only */ 119 unsigned short dma_addr_lo; /* vme only */ 120 unsigned short dma_count_hi; /* vme only */ 121 unsigned short dma_count_lo; /* vme only */ 122 unsigned short udc_data; /* udc dma data reg (obio only) */ 123 unsigned short udc_addr; /* uda dma addr reg (obio only) */ 124 unsigned short fifo_data; /* fifo data reg, holds extra byte on 125 odd dma reads */ 126 unsigned short fifo_count; 127 unsigned short csr; /* control/status reg */ 128 unsigned short bpack_hi; /* vme only */ 129 unsigned short bpack_lo; /* vme only */ 130 unsigned short ivect; /* vme only */ 131 unsigned short fifo_count_hi; /* vme only */ 132 }; 133 134 /* ucd chip specific regs - live in dvma space */ 135 struct sun3_udc_regs { 136 unsigned short rsel; /* select regs to load */ 137 unsigned short addr_hi; /* high word of addr */ 138 unsigned short addr_lo; /* low word */ 139 unsigned short count; /* words to be xfer'd */ 140 unsigned short mode_hi; /* high word of channel mode */ 141 unsigned short mode_lo; /* low word of channel mode */ 142 }; 143 144 /* addresses of the udc registers */ 145 #define UDC_MODE 0x38 146 #define UDC_CSR 0x2e /* command/status */ 147 #define UDC_CHN_HI 0x26 /* chain high word */ 148 #define UDC_CHN_LO 0x22 /* chain lo word */ 149 #define UDC_CURA_HI 0x1a /* cur reg A high */ 150 #define UDC_CURA_LO 0x0a /* cur reg A low */ 151 #define UDC_CURB_HI 0x12 /* cur reg B high */ 152 #define UDC_CURB_LO 0x02 /* cur reg B low */ 153 #define UDC_MODE_HI 0x56 /* mode reg high */ 154 #define UDC_MODE_LO 0x52 /* mode reg low */ 155 #define UDC_COUNT 0x32 /* words to xfer */ 156 157 /* some udc commands */ 158 #define UDC_RESET 0 159 #define UDC_CHN_START 0xa0 /* start chain */ 160 #define UDC_INT_ENABLE 0x32 /* channel 1 int on */ 161 162 /* udc mode words */ 163 #define UDC_MODE_HIWORD 0x40 164 #define UDC_MODE_LSEND 0xc2 165 #define UDC_MODE_LRECV 0xd2 166 167 /* udc reg selections */ 168 #define UDC_RSEL_SEND 0x282 169 #define UDC_RSEL_RECV 0x182 170 171 /* bits in csr reg */ 172 #define CSR_DMA_ACTIVE 0x8000 173 #define CSR_DMA_CONFLICT 0x4000 174 #define CSR_DMA_BUSERR 0x2000 175 176 #define CSR_FIFO_EMPTY 0x400 /* fifo flushed? */ 177 #define CSR_SDB_INT 0x200 /* sbc interrupt pending */ 178 #define CSR_DMA_INT 0x100 /* dma interrupt pending */ 179 180 #define CSR_LEFT 0xc0 181 #define CSR_LEFT_3 0xc0 182 #define CSR_LEFT_2 0x80 183 #define CSR_LEFT_1 0x40 184 #define CSR_PACK_ENABLE 0x20 185 186 #define CSR_DMA_ENABLE 0x10 187 188 #define CSR_SEND 0x8 /* 1 = send 0 = recv */ 189 #define CSR_FIFO 0x2 /* reset fifo */ 190 #define CSR_INTR 0x4 /* interrupt enable */ 191 #define CSR_SCSI 0x1 192 193 #define VME_DATA24 0x3d00 194 195 // debugging printk's, taken from atari_scsi.h 196 /* Debugging printk definitions: 197 * 198 * ARB -> arbitration 199 * ASEN -> auto-sense 200 * DMA -> DMA 201 * HSH -> PIO handshake 202 * INF -> information transfer 203 * INI -> initialization 204 * INT -> interrupt 205 * LNK -> linked commands 206 * MAIN -> NCR5380_main() control flow 207 * NDAT -> no data-out phase 208 * NWR -> no write commands 209 * PIO -> PIO transfers 210 * PDMA -> pseudo DMA (unused on Atari) 211 * QU -> queues 212 * RSL -> reselections 213 * SEL -> selections 214 * USL -> usleep cpde (unused on Atari) 215 * LBS -> last byte sent (unused on Atari) 216 * RSS -> restarting of selections 217 * EXT -> extended messages 218 * ABRT -> aborting and resetting 219 * TAG -> queue tag handling 220 * MER -> merging of consec. buffers 221 * 222 */ 223 224 #include "NCR5380.h" 225 226 #if NDEBUG & NDEBUG_ARBITRATION 227 #define ARB_PRINTK(format, args...) \ 228 printk(KERN_DEBUG format , ## args) 229 #else 230 #define ARB_PRINTK(format, args...) 231 #endif 232 #if NDEBUG & NDEBUG_AUTOSENSE 233 #define ASEN_PRINTK(format, args...) \ 234 printk(KERN_DEBUG format , ## args) 235 #else 236 #define ASEN_PRINTK(format, args...) 237 #endif 238 #if NDEBUG & NDEBUG_DMA 239 #define DMA_PRINTK(format, args...) \ 240 printk(KERN_DEBUG format , ## args) 241 #else 242 #define DMA_PRINTK(format, args...) 243 #endif 244 #if NDEBUG & NDEBUG_HANDSHAKE 245 #define HSH_PRINTK(format, args...) \ 246 printk(KERN_DEBUG format , ## args) 247 #else 248 #define HSH_PRINTK(format, args...) 249 #endif 250 #if NDEBUG & NDEBUG_INFORMATION 251 #define INF_PRINTK(format, args...) \ 252 printk(KERN_DEBUG format , ## args) 253 #else 254 #define INF_PRINTK(format, args...) 255 #endif 256 #if NDEBUG & NDEBUG_INIT 257 #define INI_PRINTK(format, args...) \ 258 printk(KERN_DEBUG format , ## args) 259 #else 260 #define INI_PRINTK(format, args...) 261 #endif 262 #if NDEBUG & NDEBUG_INTR 263 #define INT_PRINTK(format, args...) \ 264 printk(KERN_DEBUG format , ## args) 265 #else 266 #define INT_PRINTK(format, args...) 267 #endif 268 #if NDEBUG & NDEBUG_LINKED 269 #define LNK_PRINTK(format, args...) \ 270 printk(KERN_DEBUG format , ## args) 271 #else 272 #define LNK_PRINTK(format, args...) 273 #endif 274 #if NDEBUG & NDEBUG_MAIN 275 #define MAIN_PRINTK(format, args...) \ 276 printk(KERN_DEBUG format , ## args) 277 #else 278 #define MAIN_PRINTK(format, args...) 279 #endif 280 #if NDEBUG & NDEBUG_NO_DATAOUT 281 #define NDAT_PRINTK(format, args...) \ 282 printk(KERN_DEBUG format , ## args) 283 #else 284 #define NDAT_PRINTK(format, args...) 285 #endif 286 #if NDEBUG & NDEBUG_NO_WRITE 287 #define NWR_PRINTK(format, args...) \ 288 printk(KERN_DEBUG format , ## args) 289 #else 290 #define NWR_PRINTK(format, args...) 291 #endif 292 #if NDEBUG & NDEBUG_PIO 293 #define PIO_PRINTK(format, args...) \ 294 printk(KERN_DEBUG format , ## args) 295 #else 296 #define PIO_PRINTK(format, args...) 297 #endif 298 #if NDEBUG & NDEBUG_PSEUDO_DMA 299 #define PDMA_PRINTK(format, args...) \ 300 printk(KERN_DEBUG format , ## args) 301 #else 302 #define PDMA_PRINTK(format, args...) 303 #endif 304 #if NDEBUG & NDEBUG_QUEUES 305 #define QU_PRINTK(format, args...) \ 306 printk(KERN_DEBUG format , ## args) 307 #else 308 #define QU_PRINTK(format, args...) 309 #endif 310 #if NDEBUG & NDEBUG_RESELECTION 311 #define RSL_PRINTK(format, args...) \ 312 printk(KERN_DEBUG format , ## args) 313 #else 314 #define RSL_PRINTK(format, args...) 315 #endif 316 #if NDEBUG & NDEBUG_SELECTION 317 #define SEL_PRINTK(format, args...) \ 318 printk(KERN_DEBUG format , ## args) 319 #else 320 #define SEL_PRINTK(format, args...) 321 #endif 322 #if NDEBUG & NDEBUG_USLEEP 323 #define USL_PRINTK(format, args...) \ 324 printk(KERN_DEBUG format , ## args) 325 #else 326 #define USL_PRINTK(format, args...) 327 #endif 328 #if NDEBUG & NDEBUG_LAST_BYTE_SENT 329 #define LBS_PRINTK(format, args...) \ 330 printk(KERN_DEBUG format , ## args) 331 #else 332 #define LBS_PRINTK(format, args...) 333 #endif 334 #if NDEBUG & NDEBUG_RESTART_SELECT 335 #define RSS_PRINTK(format, args...) \ 336 printk(KERN_DEBUG format , ## args) 337 #else 338 #define RSS_PRINTK(format, args...) 339 #endif 340 #if NDEBUG & NDEBUG_EXTENDED 341 #define EXT_PRINTK(format, args...) \ 342 printk(KERN_DEBUG format , ## args) 343 #else 344 #define EXT_PRINTK(format, args...) 345 #endif 346 #if NDEBUG & NDEBUG_ABORT 347 #define ABRT_PRINTK(format, args...) \ 348 printk(KERN_DEBUG format , ## args) 349 #else 350 #define ABRT_PRINTK(format, args...) 351 #endif 352 #if NDEBUG & NDEBUG_TAGS 353 #define TAG_PRINTK(format, args...) \ 354 printk(KERN_DEBUG format , ## args) 355 #else 356 #define TAG_PRINTK(format, args...) 357 #endif 358 #if NDEBUG & NDEBUG_MERGING 359 #define MER_PRINTK(format, args...) \ 360 printk(KERN_DEBUG format , ## args) 361 #else 362 #define MER_PRINTK(format, args...) 363 #endif 364 365 /* conditional macros for NCR5380_print_{,phase,status} */ 366 367 #define NCR_PRINT(mask) \ 368 ((NDEBUG & (mask)) ? NCR5380_print(instance) : (void)0) 369 370 #define NCR_PRINT_PHASE(mask) \ 371 ((NDEBUG & (mask)) ? NCR5380_print_phase(instance) : (void)0) 372 373 #define NCR_PRINT_STATUS(mask) \ 374 ((NDEBUG & (mask)) ? NCR5380_print_status(instance) : (void)0) 375 376 377 378 #endif /* ndef HOSTS_C */ 379 #endif /* SUN3_NCR5380_H */ 380 381