]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * Sun3 SCSI stuff by Erik Verbruggen ([email protected]) | |
3 | * | |
4 | * Sun3 DMA additions by Sam Creasey ([email protected]) | |
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 | * [email protected] | |
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 | ||
811c9366 | 50 | static int sun3scsi_abort(struct scsi_cmnd *); |
d0be4a7d | 51 | static int sun3scsi_detect (struct scsi_host_template *); |
1da177e4 | 52 | static const char *sun3scsi_info (struct Scsi_Host *); |
811c9366 HK |
53 | static int sun3scsi_bus_reset(struct scsi_cmnd *); |
54 | static int sun3scsi_queue_command(struct scsi_cmnd *, | |
55 | void (*done)(struct scsi_cmnd *)); | |
1da177e4 LT |
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 | ||
c39e7eee | 224 | #include "NCR5380.h" |
1da177e4 LT |
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 |