|
|
1.1 root 1: /******************************************************************************
2: ** Device driver for the PCI-SCSI NCR538XX controller family.
3: **
4: ** Copyright (C) 1994 Wolfgang Stanglmeier
5: **
6: ** This program is free software; you can redistribute it and/or modify
7: ** it under the terms of the GNU General Public License as published by
8: ** the Free Software Foundation; either version 2 of the License, or
9: ** (at your option) any later version.
10: **
11: ** This program is distributed in the hope that it will be useful,
12: ** but WITHOUT ANY WARRANTY; without even the implied warranty of
13: ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: ** GNU General Public License for more details.
15: **
16: ** You should have received a copy of the GNU General Public License
17: ** along with this program; if not, write to the Free Software
18: ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19: **
20: **-----------------------------------------------------------------------------
21: **
22: ** This driver has been ported to Linux from the FreeBSD NCR53C8XX driver
23: ** and is currently maintained by
24: **
25: ** Gerard Roudier <[email protected]>
26: **
27: ** Being given that this driver originates from the FreeBSD version, and
28: ** in order to keep synergy on both, any suggested enhancements and corrections
29: ** received on Linux are automatically a potential candidate for the FreeBSD
30: ** version.
31: **
32: ** The original driver has been written for 386bsd and FreeBSD by
33: ** Wolfgang Stanglmeier <[email protected]>
34: ** Stefan Esser <[email protected]>
35: **
36: ** And has been ported to NetBSD by
37: ** Charles M. Hannum <[email protected]>
38: **
39: *******************************************************************************
40: */
41:
42: #ifndef NCR53C8XX_H
43: #define NCR53C8XX_H
44:
45: /*
46: ** Name and revision of the driver
47: */
48: #define SCSI_NCR_DRIVER_NAME "ncr53c8xx - revision 2.5f.1"
49:
50: /*
51: ** Check supported Linux versions
52: */
53:
54: #if !defined(LINUX_VERSION_CODE)
55: #include <linux/version.h>
56: #endif
57: #include <linux/config.h>
58:
59: /*
60: ** During make dep of linux-1.2.13, LINUX_VERSION_CODE is undefined
61: ** Under linux-1.3.X, all seems to be OK.
62: ** So, we have only to define it under 1.2.13
63: */
64:
65: #define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
66:
67: #if !defined(LINUX_VERSION_CODE)
68: #define LINUX_VERSION_CODE LinuxVersionCode(1,2,13)
69: #endif
70:
71: /*
72: ** Normal IO or memory mapped IO.
73: **
74: ** Memory mapped IO only works with linux-1.3.X
75: ** If your motherboard does not work with memory mapped IO,
76: ** define SCSI_NCR_IOMAPPED for PATCHLEVEL 3 too.
77: */
78:
79: #if LINUX_VERSION_CODE < LinuxVersionCode(1,3,0)
80: # define SCSI_NCR_IOMAPPED
81: #endif
82:
83: #if LINUX_VERSION_CODE >= LinuxVersionCode(1,3,0)
1.1.1.2 ! root 84: //# define SCSI_NCR_PROC_INFO_SUPPORT
1.1 root 85: #endif
86:
87: #if LINUX_VERSION_CODE >= LinuxVersionCode(1,3,72)
88: # define SCSI_NCR_SHARE_IRQ
89: #endif
90:
91: /*
92: ** If you want a driver as small as possible, donnot define the
93: ** following options.
94: */
95:
96: #define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT
97: #define SCSI_NCR_DEBUG_INFO_SUPPORT
98: #define SCSI_NCR_PCI_FIX_UP_SUPPORT
99: #ifdef SCSI_NCR_PROC_INFO_SUPPORT
100: # define SCSI_NCR_PROFILE_SUPPORT
101: # define SCSI_NCR_USER_COMMAND_SUPPORT
102: # define SCSI_NCR_USER_INFO_SUPPORT
103: /* # define SCSI_NCR_DEBUG_ERROR_RECOVERY_SUPPORT */
104: #endif
105:
106: /*==========================================================
107: **
108: ** nvram settings - #define SCSI_NCR_NVRAM_SUPPORT to enable
109: **
110: **==========================================================
111: */
112:
113: #ifdef CONFIG_SCSI_NCR53C8XX_NVRAM_DETECT
114: #define SCSI_NCR_NVRAM_SUPPORT
115: /* #define SCSI_NCR_DEBUG_NVRAM */
116: #endif
117:
118: /* ---------------------------------------------------------------------
119: ** Take into account kernel configured parameters.
120: ** Most of these options can be overridden at startup by a command line.
121: ** ---------------------------------------------------------------------
122: */
123:
124: /*
125: * For Ultra2 SCSI support option, use special features and allow 40Mhz
126: * synchronous data transfers.
127: */
128: #define SCSI_NCR_SETUP_SPECIAL_FEATURES (3)
129: #define SCSI_NCR_SETUP_ULTRA_SCSI (2)
130: #define SCSI_NCR_MAX_SYNC (40)
131:
132: /*
133: * Allow tags from 2 to 12, default 4
134: */
135: #ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS
136: #if CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2
137: #define SCSI_NCR_MAX_TAGS (2)
138: #elif CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 12
139: #define SCSI_NCR_MAX_TAGS (12)
140: #else
141: #define SCSI_NCR_MAX_TAGS CONFIG_SCSI_NCR53C8XX_MAX_TAGS
142: #endif
143: #else
144: #define SCSI_NCR_MAX_TAGS (4)
145: #endif
146:
147: /*
148: * Allow tagged command queuing support if configured with default number
149: * of tags set to max (see above).
150: */
151: #ifdef CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE
152: #define SCSI_NCR_SETUP_DEFAULT_TAGS SCSI_NCR_MAX_TAGS
153: #else
154: #define SCSI_NCR_SETUP_DEFAULT_TAGS (0)
155: #endif
156:
157: /*
158: * Use normal IO if configured. Forced for alpha and ppc.
159: */
160: #if defined(CONFIG_SCSI_NCR53C8XX_IOMAPPED)
161: #define SCSI_NCR_IOMAPPED
162: #elif defined(__alpha__) || defined(__powerpc__)
163: #define SCSI_NCR_IOMAPPED
164: #endif
165:
166: /*
167: * Sync transfer frequency at startup.
168: * Allow from 5Mhz to 40Mhz default 10 Mhz.
169: */
170: #ifndef CONFIG_SCSI_NCR53C8XX_SYNC
171: #define CONFIG_SCSI_NCR53C8XX_SYNC (5)
172: #elif CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC
173: #define SCSI_NCR_SETUP_DEFAULT_SYNC SCSI_NCR_MAX_SYNC
174: #endif
175:
176: #if CONFIG_SCSI_NCR53C8XX_SYNC == 0
177: #define SCSI_NCR_SETUP_DEFAULT_SYNC (255)
178: #elif CONFIG_SCSI_NCR53C8XX_SYNC <= 5
179: #define SCSI_NCR_SETUP_DEFAULT_SYNC (50)
180: #elif CONFIG_SCSI_NCR53C8XX_SYNC <= 20
181: #define SCSI_NCR_SETUP_DEFAULT_SYNC (250/(CONFIG_SCSI_NCR53C8XX_SYNC))
182: #elif CONFIG_SCSI_NCR53C8XX_SYNC <= 33
183: #define SCSI_NCR_SETUP_DEFAULT_SYNC (11)
184: #else
185: #define SCSI_NCR_SETUP_DEFAULT_SYNC (10)
186: #endif
187:
188: /*
189: * Disallow disconnections at boot-up
190: */
191: #ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT
192: #define SCSI_NCR_SETUP_DISCONNECTION (0)
193: #else
194: #define SCSI_NCR_SETUP_DISCONNECTION (1)
195: #endif
196:
197: /*
198: * Force synchronous negotiation for all targets
199: */
200: #ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO
201: #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1)
202: #else
203: #define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0)
204: #endif
205:
206: /*
207: * Disable master parity checking (flawed hardwares need that)
208: */
209: #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK
210: #define SCSI_NCR_SETUP_MASTER_PARITY (0)
211: #else
212: #define SCSI_NCR_SETUP_MASTER_PARITY (1)
213: #endif
214:
215: /*
216: * Disable scsi parity checking (flawed devices may need that)
217: */
218: #ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK
219: #define SCSI_NCR_SETUP_SCSI_PARITY (0)
220: #else
221: #define SCSI_NCR_SETUP_SCSI_PARITY (1)
222: #endif
223:
224: /*
225: * Vendor specific stuff
226: */
227: #ifdef CONFIG_SCSI_NCR53C8XX_SYMBIOS_COMPAT
228: #define SCSI_NCR_SETUP_LED_PIN (1)
229: #define SCSI_NCR_SETUP_DIFF_SUPPORT (3)
230: #else
231: #define SCSI_NCR_SETUP_LED_PIN (0)
232: #define SCSI_NCR_SETUP_DIFF_SUPPORT (0)
233: #endif
234:
235: /*
236: * Settle time after reset at boot-up
237: */
238: #define SCSI_NCR_SETUP_SETTLE_TIME (2)
239:
240: /*
241: ** Other parameters not configurable with "make config"
242: ** Avoid to change these constants, unless you know what you are doing.
243: */
244:
245: #define SCSI_NCR_ALWAYS_SIMPLE_TAG
246: #define SCSI_NCR_MAX_SCATTER (127)
247: #define SCSI_NCR_MAX_TARGET (16)
248: #define SCSI_NCR_MAX_HOST (2)
249: #define SCSI_NCR_TIMEOUT_ALERT (3*HZ)
250:
251: #define SCSI_NCR_CAN_QUEUE (7*SCSI_NCR_MAX_TAGS)
252: #define SCSI_NCR_CMD_PER_LUN (SCSI_NCR_MAX_TAGS)
253: #define SCSI_NCR_SG_TABLESIZE (SCSI_NCR_MAX_SCATTER)
254:
255: #define SCSI_NCR_TIMER_INTERVAL ((HZ+5-1)/5)
256:
257: #if 1 /* defined CONFIG_SCSI_MULTI_LUN */
258: #define SCSI_NCR_MAX_LUN (8)
259: #else
260: #define SCSI_NCR_MAX_LUN (1)
261: #endif
262:
263: /*
264: ** Define Scsi_Host_Template parameters
265: **
266: ** Used by hosts.c and ncr53c8xx.c with module configuration.
267: */
268:
269: #if defined(HOSTS_C) || defined(MODULE)
270:
271: #if LINUX_VERSION_CODE >= LinuxVersionCode(1,3,98)
272: #include <scsi/scsicam.h>
273: #else
274: #include <linux/scsicam.h>
275: #endif
276:
277: int ncr53c8xx_abort(Scsi_Cmnd *);
278: int ncr53c8xx_detect(Scsi_Host_Template *tpnt);
279: int ncr53c8xx_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
280:
281: #if LINUX_VERSION_CODE >= LinuxVersionCode(1,3,98)
282: int ncr53c8xx_reset(Scsi_Cmnd *, unsigned int);
283: #else
284: int ncr53c8xx_reset(Scsi_Cmnd *);
285: #endif
286:
287: #ifdef MODULE
288: int ncr53c8xx_release(struct Scsi_Host *);
289: #else
290: #define ncr53c8xx_release NULL
291: #endif
292:
293: #if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,75)
294:
295: #define NCR53C8XX { name: SCSI_NCR_DRIVER_NAME, \
296: detect: ncr53c8xx_detect, \
297: release: ncr53c8xx_release, \
298: queuecommand: ncr53c8xx_queue_command,\
299: abort: ncr53c8xx_abort, \
300: reset: ncr53c8xx_reset, \
301: bios_param: scsicam_bios_param, \
302: can_queue: SCSI_NCR_CAN_QUEUE, \
303: this_id: 7, \
304: sg_tablesize: SCSI_NCR_SG_TABLESIZE, \
305: cmd_per_lun: SCSI_NCR_CMD_PER_LUN, \
306: use_clustering: DISABLE_CLUSTERING}
307:
308: #elif LINUX_VERSION_CODE >= LinuxVersionCode(1,3,0)
309:
310: #define NCR53C8XX { NULL, NULL, NULL, NULL, \
311: SCSI_NCR_DRIVER_NAME, ncr53c8xx_detect, \
312: ncr53c8xx_release, NULL, NULL, \
313: ncr53c8xx_queue_command,ncr53c8xx_abort, \
314: ncr53c8xx_reset, NULL, scsicam_bios_param, \
315: SCSI_NCR_CAN_QUEUE, 7, \
316: SCSI_NCR_SG_TABLESIZE, SCSI_NCR_CMD_PER_LUN, \
317: 0, 0, DISABLE_CLUSTERING}
318:
319: #else
320:
321: #define NCR53C8XX { NULL, NULL, \
322: SCSI_NCR_DRIVER_NAME, ncr53c8xx_detect, \
323: ncr53c8xx_release, NULL, NULL, \
324: ncr53c8xx_queue_command,ncr53c8xx_abort, \
325: ncr53c8xx_reset, NULL, scsicam_bios_param, \
326: SCSI_NCR_CAN_QUEUE, 7, \
327: SCSI_NCR_SG_TABLESIZE, SCSI_NCR_CMD_PER_LUN, \
328: 0, 0, DISABLE_CLUSTERING}
329:
330: #endif /* LINUX_VERSION_CODE */
331:
332: #endif /* defined(HOSTS_C) || defined(MODULE) */
333:
334:
335: #ifndef HOSTS_C
336:
337: /*
338: ** IO functions definition for big/little endian support.
339: ** For now, the NCR is only supported in little endian addressing mode,
340: ** and big endian byte ordering is only supported for the PPC.
341: ** MMIO is not used on PPC.
342: */
343:
344: #ifdef __BIG_ENDIAN
345:
346: #if LINUX_VERSION_CODE < LinuxVersionCode(2,1,0)
347: #error "BIG ENDIAN byte ordering needs kernel version >= 2.1.0"
348: #endif
349:
350: #ifdef __powerpc__
351: #define inw_l2b inw
352: #define inl_l2b inl
353: #define outw_b2l outw
354: #define outl_b2l outl
355: #else
356: #error "Support for BIG ENDIAN is only available for the PowerPC"
357: #endif
358:
359: #else /* Assumed x86 or alpha */
360:
361: #define inw_raw inw
362: #define inl_raw inl
363: #define outw_raw outw
364: #define outl_raw outl
365: #define readw_raw readw
366: #define readl_raw readl
367: #define writew_raw writew
368: #define writel_raw writel
369:
370: #endif
371:
372: #ifdef SCSI_NCR_BIG_ENDIAN
373: #error "The NCR in BIG ENDIAN adressing mode is not (yet) supported"
374: #endif
375:
376: /*
377: ** NCR53C8XX Device Ids
378: */
379:
380: #ifndef PCI_DEVICE_ID_NCR_53C810
381: #define PCI_DEVICE_ID_NCR_53C810 1
382: #endif
383:
384: #ifndef PCI_DEVICE_ID_NCR_53C810AP
385: #define PCI_DEVICE_ID_NCR_53C810AP 5
386: #endif
387:
388: #ifndef PCI_DEVICE_ID_NCR_53C815
389: #define PCI_DEVICE_ID_NCR_53C815 4
390: #endif
391:
392: #ifndef PCI_DEVICE_ID_NCR_53C820
393: #define PCI_DEVICE_ID_NCR_53C820 2
394: #endif
395:
396: #ifndef PCI_DEVICE_ID_NCR_53C825
397: #define PCI_DEVICE_ID_NCR_53C825 3
398: #endif
399:
400: #ifndef PCI_DEVICE_ID_NCR_53C860
401: #define PCI_DEVICE_ID_NCR_53C860 6
402: #endif
403:
404: #ifndef PCI_DEVICE_ID_NCR_53C875
405: #define PCI_DEVICE_ID_NCR_53C875 0xf
406: #endif
407:
408: #ifndef PCI_DEVICE_ID_NCR_53C875J
409: #define PCI_DEVICE_ID_NCR_53C875J 0x8f
410: #endif
411:
412: #ifndef PCI_DEVICE_ID_NCR_53C885
413: #define PCI_DEVICE_ID_NCR_53C885 0xd
414: #endif
415:
416: #ifndef PCI_DEVICE_ID_NCR_53C895
417: #define PCI_DEVICE_ID_NCR_53C895 0xc
418: #endif
419:
420: #ifndef PCI_DEVICE_ID_NCR_53C896
421: #define PCI_DEVICE_ID_NCR_53C896 0xb
422: #endif
423:
424: /*
425: ** NCR53C8XX devices features table.
426: */
427: typedef struct {
428: unsigned short device_id;
429: unsigned short revision_id;
430: char *name;
431: unsigned char burst_max;
432: unsigned char offset_max;
433: unsigned char nr_divisor;
434: unsigned int features;
435: #define FE_LED0 (1<<0)
436: #define FE_WIDE (1<<1)
437: #define FE_ULTRA (1<<2)
438: #define FE_ULTRA2 (1<<3)
439: #define FE_DBLR (1<<4)
440: #define FE_QUAD (1<<5)
441: #define FE_ERL (1<<6)
442: #define FE_CLSE (1<<7)
443: #define FE_WRIE (1<<8)
444: #define FE_ERMP (1<<9)
445: #define FE_BOF (1<<10)
446: #define FE_DFS (1<<11)
447: #define FE_PFEN (1<<12)
448: #define FE_LDSTR (1<<13)
449: #define FE_RAM (1<<14)
450: #define FE_CLK80 (1<<15)
451: #define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP)
452: #define FE_SCSI_SET (FE_WIDE|FE_ULTRA|FE_ULTRA2|FE_DBLR|FE_QUAD|F_CLK80)
453: #define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM)
454: } ncr_chip;
455:
456: /*
457: ** DEL 397 - 53C875 Rev 3 - Part Number 609-0392410 - ITEM 3.
458: ** Memory Read transaction terminated by a retry followed by
459: ** Memory Read Line command.
460: */
461: #define FE_CACHE0_SET (FE_CACHE_SET & ~FE_ERL)
462:
463: /*
464: ** DEL 397 - 53C875 Rev 3 - Part Number 609-0392410 - ITEM 5.
465: ** On paper, this errata is harmless. But it is a good reason for
466: ** using a shorter programmed burst length (64 DWORDS instead of 128).
467: */
468:
469: #define SCSI_NCR_CHIP_TABLE \
470: { \
471: {PCI_DEVICE_ID_NCR_53C810, 0x0f, "810", 4, 8, 4, \
472: FE_ERL} \
473: , \
474: {PCI_DEVICE_ID_NCR_53C810, 0xff, "810a", 4, 8, 4, \
475: FE_CACHE_SET|FE_LDSTR|FE_PFEN|FE_BOF} \
476: , \
477: {PCI_DEVICE_ID_NCR_53C815, 0xff, "815", 4, 8, 4, \
478: FE_ERL|FE_BOF} \
479: , \
480: {PCI_DEVICE_ID_NCR_53C820, 0xff, "820", 4, 8, 4, \
481: FE_WIDE|FE_ERL} \
482: , \
483: {PCI_DEVICE_ID_NCR_53C825, 0x0f, "825", 4, 8, 4, \
484: FE_WIDE|FE_ERL|FE_BOF} \
485: , \
486: {PCI_DEVICE_ID_NCR_53C825, 0xff, "825a", 6, 8, 4, \
487: FE_WIDE|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM} \
488: , \
489: {PCI_DEVICE_ID_NCR_53C860, 0xff, "860", 4, 8, 5, \
490: FE_ULTRA|FE_CLK80|FE_CACHE_SET|FE_BOF|FE_LDSTR|FE_PFEN} \
491: , \
492: {PCI_DEVICE_ID_NCR_53C875, 0x01, "875", 6, 16, 5, \
493: FE_WIDE|FE_ULTRA|FE_CLK80|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
494: , \
495: {PCI_DEVICE_ID_NCR_53C875, 0xff, "875", 6, 16, 5, \
496: FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
497: , \
498: {PCI_DEVICE_ID_NCR_53C875J,0xff, "875J", 6, 16, 5, \
499: FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
500: , \
501: {PCI_DEVICE_ID_NCR_53C885, 0xff, "885", 6, 16, 5, \
502: FE_WIDE|FE_ULTRA|FE_DBLR|FE_CACHE0_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
503: , \
504: {PCI_DEVICE_ID_NCR_53C895, 0xff, "895", 7, 31, 7, \
505: FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
506: , \
507: {PCI_DEVICE_ID_NCR_53C896, 0xff, "896", 7, 31, 7, \
508: FE_WIDE|FE_ULTRA2|FE_QUAD|FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM}\
509: }
510:
511: /*
512: * List of supported NCR chip ids
513: */
514: #define SCSI_NCR_CHIP_IDS \
515: { \
516: PCI_DEVICE_ID_NCR_53C810, \
517: PCI_DEVICE_ID_NCR_53C815, \
518: PCI_DEVICE_ID_NCR_53C820, \
519: PCI_DEVICE_ID_NCR_53C825, \
520: PCI_DEVICE_ID_NCR_53C860, \
521: PCI_DEVICE_ID_NCR_53C875, \
522: PCI_DEVICE_ID_NCR_53C875J, \
523: PCI_DEVICE_ID_NCR_53C885, \
524: PCI_DEVICE_ID_NCR_53C895, \
525: PCI_DEVICE_ID_NCR_53C896 \
526: }
527:
528: /*
529: ** Initial setup.
530: ** Can be overriden at startup by a command line.
531: */
532: #define SCSI_NCR_DRIVER_SETUP \
533: { \
534: SCSI_NCR_SETUP_MASTER_PARITY, \
535: SCSI_NCR_SETUP_SCSI_PARITY, \
536: SCSI_NCR_SETUP_DISCONNECTION, \
537: SCSI_NCR_SETUP_SPECIAL_FEATURES, \
538: SCSI_NCR_SETUP_ULTRA_SCSI, \
539: SCSI_NCR_SETUP_FORCE_SYNC_NEGO, \
540: 0, \
541: 0, \
542: 1, \
543: 1, \
544: SCSI_NCR_SETUP_DEFAULT_TAGS, \
545: SCSI_NCR_SETUP_DEFAULT_SYNC, \
546: 0x00, \
547: 7, \
548: SCSI_NCR_SETUP_LED_PIN, \
549: 1, \
550: SCSI_NCR_SETUP_SETTLE_TIME, \
551: SCSI_NCR_SETUP_DIFF_SUPPORT, \
552: 0, \
553: 1 \
554: }
555:
556: /*
557: ** Boot fail safe setup.
558: ** Override initial setup from boot command line:
559: ** ncr53c8xx=safe:y
560: */
561: #define SCSI_NCR_DRIVER_SAFE_SETUP \
562: { \
563: 0, \
564: 1, \
565: 0, \
566: 0, \
567: 0, \
568: 0, \
569: 0, \
570: 0, \
571: 1, \
572: 2, \
573: 0, \
574: 255, \
575: 0x00, \
576: 255, \
577: 0, \
578: 0, \
579: 10, \
580: 1, \
581: 1, \
582: 1 \
583: }
584:
585: /*
586: ** Define the table of target capabilities by host and target
587: **
588: ** If you have problems with a scsi device, note the host unit and the
589: ** corresponding target number.
590: **
591: ** Edit the corresponding entry of the table below and try successively:
592: ** NQ7_Questionnable
593: ** NQ7_IdeLike
594: **
595: ** This bitmap is anded with the byte 7 of inquiry data on completion of
596: ** INQUIRY command.
597: ** The driver never see the zeroed bits and will ignore the corresponding
598: ** capabilities of the target.
599: */
600:
601: #define INQ7_SftRe 1
602: #define INQ7_CmdQueue (1<<1) /* Tagged Command */
603: #define INQ7_Reserved (1<<2)
604: #define INQ7_Linked (1<<3)
605: #define INQ7_Sync (1<<4) /* Synchronous Negotiation */
606: #define INQ7_WBus16 (1<<5)
607: #define INQ7_WBus32 (1<<6)
608: #define INQ7_RelAdr (1<<7)
609:
610: #define INQ7_IdeLike 0
611: #define INQ7_Scsi1Like INQ7_IdeLike
612: #define INQ7_Perfect 0xff
613: #define INQ7_Questionnable ~(INQ7_CmdQueue|INQ7_Sync)
614: #define INQ7_VeryQuestionnable \
615: ~(INQ7_CmdQueue|INQ7_Sync|INQ7_WBus16|INQ7_WBus32)
616:
617: #define INQ7_Default INQ7_Perfect
618:
619: #define NCR53C8XX_TARGET_CAPABILITIES \
620: /* Host 0 */ \
621: { \
622: { \
623: /* Target 0 */ INQ7_Default, \
624: /* Target 1 */ INQ7_Default, \
625: /* Target 2 */ INQ7_Default, \
626: /* Target 3 */ INQ7_Default, \
627: /* Target 4 */ INQ7_Default, \
628: /* Target 5 */ INQ7_Default, \
629: /* Target 6 */ INQ7_Default, \
630: /* Target 7 */ INQ7_Default, \
631: /* Target 8 */ INQ7_Default, \
632: /* Target 9 */ INQ7_Default, \
633: /* Target 10 */ INQ7_Default, \
634: /* Target 11 */ INQ7_Default, \
635: /* Target 12 */ INQ7_Default, \
636: /* Target 13 */ INQ7_Default, \
637: /* Target 14 */ INQ7_Default, \
638: /* Target 15 */ INQ7_Default, \
639: } \
640: }, \
641: /* Host 1 */ \
642: { \
643: { \
644: /* Target 0 */ INQ7_Default, \
645: /* Target 1 */ INQ7_Default, \
646: /* Target 2 */ INQ7_Default, \
647: /* Target 3 */ INQ7_Default, \
648: /* Target 4 */ INQ7_Default, \
649: /* Target 5 */ INQ7_Default, \
650: /* Target 6 */ INQ7_Default, \
651: /* Target 7 */ INQ7_Default, \
652: /* Target 8 */ INQ7_Default, \
653: /* Target 9 */ INQ7_Default, \
654: /* Target 10 */ INQ7_Default, \
655: /* Target 11 */ INQ7_Default, \
656: /* Target 12 */ INQ7_Default, \
657: /* Target 13 */ INQ7_Default, \
658: /* Target 14 */ INQ7_Default, \
659: /* Target 15 */ INQ7_Default, \
660: } \
661: }
662:
663: /*
664: ** Replace the proc_dir_entry of the standard ncr driver.
665: */
666:
667: #if LINUX_VERSION_CODE >= LinuxVersionCode(1,3,0)
668: #if defined(CONFIG_SCSI_NCR53C7xx) || !defined(CONFIG_SCSI_NCR53C8XX)
669: #define PROC_SCSI_NCR53C8XX PROC_SCSI_NCR53C7xx
670: #endif
671: #endif
672:
673: /**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/
674:
675: /*-----------------------------------------------------------------
676: **
677: ** The ncr 53c810 register structure.
678: **
679: **-----------------------------------------------------------------
680: */
681:
682: struct ncr_reg {
683: /*00*/ u_char nc_scntl0; /* full arb., ena parity, par->ATN */
684:
685: /*01*/ u_char nc_scntl1; /* no reset */
686: #define ISCON 0x10 /* connected to scsi */
687: #define CRST 0x08 /* force reset */
688:
689: /*02*/ u_char nc_scntl2; /* no disconnect expected */
690: #define SDU 0x80 /* cmd: disconnect will raise error */
691: #define CHM 0x40 /* sta: chained mode */
692: #define WSS 0x08 /* sta: wide scsi send [W]*/
693: #define WSR 0x01 /* sta: wide scsi received [W]*/
694:
695: /*03*/ u_char nc_scntl3; /* cnf system clock dependent */
696: #define EWS 0x08 /* cmd: enable wide scsi [W]*/
697: #define ULTRA 0x80 /* cmd: ULTRA enable */
698:
699: /*04*/ u_char nc_scid; /* cnf host adapter scsi address */
700: #define RRE 0x40 /* r/w:e enable response to resel. */
701: #define SRE 0x20 /* r/w:e enable response to select */
702:
703: /*05*/ u_char nc_sxfer; /* ### Sync speed and count */
704:
705: /*06*/ u_char nc_sdid; /* ### Destination-ID */
706:
707: /*07*/ u_char nc_gpreg; /* ??? IO-Pins */
708:
709: /*08*/ u_char nc_sfbr; /* ### First byte in phase */
710:
711: /*09*/ u_char nc_socl;
712: #define CREQ 0x80 /* r/w: SCSI-REQ */
713: #define CACK 0x40 /* r/w: SCSI-ACK */
714: #define CBSY 0x20 /* r/w: SCSI-BSY */
715: #define CSEL 0x10 /* r/w: SCSI-SEL */
716: #define CATN 0x08 /* r/w: SCSI-ATN */
717: #define CMSG 0x04 /* r/w: SCSI-MSG */
718: #define CC_D 0x02 /* r/w: SCSI-C_D */
719: #define CI_O 0x01 /* r/w: SCSI-I_O */
720:
721: /*0a*/ u_char nc_ssid;
722:
723: /*0b*/ u_char nc_sbcl;
724:
725: /*0c*/ u_char nc_dstat;
726: #define DFE 0x80 /* sta: dma fifo empty */
727: #define MDPE 0x40 /* int: master data parity error */
728: #define BF 0x20 /* int: script: bus fault */
729: #define ABRT 0x10 /* int: script: command aborted */
730: #define SSI 0x08 /* int: script: single step */
731: #define SIR 0x04 /* int: script: interrupt instruct. */
732: #define IID 0x01 /* int: script: illegal instruct. */
733:
734: /*0d*/ u_char nc_sstat0;
735: #define ILF 0x80 /* sta: data in SIDL register lsb */
736: #define ORF 0x40 /* sta: data in SODR register lsb */
737: #define OLF 0x20 /* sta: data in SODL register lsb */
738: #define AIP 0x10 /* sta: arbitration in progress */
739: #define LOA 0x08 /* sta: arbitration lost */
740: #define WOA 0x04 /* sta: arbitration won */
741: #define IRST 0x02 /* sta: scsi reset signal */
742: #define SDP 0x01 /* sta: scsi parity signal */
743:
744: /*0e*/ u_char nc_sstat1;
745: #define FF3210 0xf0 /* sta: bytes in the scsi fifo */
746:
747: /*0f*/ u_char nc_sstat2;
748: #define ILF1 0x80 /* sta: data in SIDL register msb[W]*/
749: #define ORF1 0x40 /* sta: data in SODR register msb[W]*/
750: #define OLF1 0x20 /* sta: data in SODL register msb[W]*/
751: #define DM 0x04 /* sta: DIFFSENS mismatch (895/6 only) */
752: #define LDSC 0x02 /* sta: disconnect & reconnect */
753:
754: /*10*/ u_int32 nc_dsa; /* --> Base page */
755:
756: /*14*/ u_char nc_istat; /* --> Main Command and status */
757: #define CABRT 0x80 /* cmd: abort current operation */
758: #define SRST 0x40 /* mod: reset chip */
759: #define SIGP 0x20 /* r/w: message from host to ncr */
760: #define SEM 0x10 /* r/w: message between host + ncr */
761: #define CON 0x08 /* sta: connected to scsi */
762: #define INTF 0x04 /* sta: int on the fly (reset by wr)*/
763: #define SIP 0x02 /* sta: scsi-interrupt */
764: #define DIP 0x01 /* sta: host/script interrupt */
765:
766: /*15*/ u_char nc_15_;
767: /*16*/ u_char nc_16_;
768: /*17*/ u_char nc_17_;
769:
770: /*18*/ u_char nc_ctest0;
771: /*19*/ u_char nc_ctest1;
772:
773: /*1a*/ u_char nc_ctest2;
774: #define CSIGP 0x40
775:
776: /*1b*/ u_char nc_ctest3;
777: #define FLF 0x08 /* cmd: flush dma fifo */
778: #define CLF 0x04 /* cmd: clear dma fifo */
779: #define FM 0x02 /* mod: fetch pin mode */
780: #define WRIE 0x01 /* mod: write and invalidate enable */
781:
782: /*1c*/ u_int32 nc_temp; /* ### Temporary stack */
783:
784: /*20*/ u_char nc_dfifo;
785: /*21*/ u_char nc_ctest4;
786: #define BDIS 0x80 /* mod: burst disable */
787: #define MPEE 0x08 /* mod: master parity error enable */
788:
789: /*22*/ u_char nc_ctest5;
790: #define DFS 0x20 /* mod: dma fifo size */
791: /*23*/ u_char nc_ctest6;
792:
793: /*24*/ u_int32 nc_dbc; /* ### Byte count and command */
794: /*28*/ u_int32 nc_dnad; /* ### Next command register */
795: /*2c*/ u_int32 nc_dsp; /* --> Script Pointer */
796: /*30*/ u_int32 nc_dsps; /* --> Script pointer save/opcode#2 */
797: /*34*/ u_int32 nc_scratcha; /* ??? Temporary register a */
798:
799: /*38*/ u_char nc_dmode;
800: #define BL_2 0x80 /* mod: burst length shift value +2 */
801: #define BL_1 0x40 /* mod: burst length shift value +1 */
802: #define ERL 0x08 /* mod: enable read line */
803: #define ERMP 0x04 /* mod: enable read multiple */
804: #define BOF 0x02 /* mod: burst op code fetch */
805:
806: /*39*/ u_char nc_dien;
807: /*3a*/ u_char nc_dwt;
808:
809: /*3b*/ u_char nc_dcntl; /* --> Script execution control */
810:
811: #define CLSE 0x80 /* mod: cache line size enable */
812: #define PFF 0x40 /* cmd: pre-fetch flush */
813: #define PFEN 0x20 /* mod: pre-fetch enable */
814: #define SSM 0x10 /* mod: single step mode */
815: #define IRQM 0x08 /* mod: irq mode (1 = totem pole !) */
816: #define STD 0x04 /* cmd: start dma mode */
817: #define IRQD 0x02 /* mod: irq disable */
818: #define NOCOM 0x01 /* cmd: protect sfbr while reselect */
819:
820: /*3c*/ u_int32 nc_adder;
821:
822: /*40*/ u_short nc_sien; /* -->: interrupt enable */
823: /*42*/ u_short nc_sist; /* <--: interrupt status */
824: #define SBMC 0x1000/* sta: SCSI Bus Mode Change (895/6 only) */
825: #define STO 0x0400/* sta: timeout (select) */
826: #define GEN 0x0200/* sta: timeout (general) */
827: #define HTH 0x0100/* sta: timeout (handshake) */
828: #define MA 0x80 /* sta: phase mismatch */
829: #define CMP 0x40 /* sta: arbitration complete */
830: #define SEL 0x20 /* sta: selected by another device */
831: #define RSL 0x10 /* sta: reselected by another device*/
832: #define SGE 0x08 /* sta: gross error (over/underflow)*/
833: #define UDC 0x04 /* sta: unexpected disconnect */
834: #define RST 0x02 /* sta: scsi bus reset detected */
835: #define PAR 0x01 /* sta: scsi parity error */
836:
837: /*44*/ u_char nc_slpar;
838: /*45*/ u_char nc_swide;
839: /*46*/ u_char nc_macntl;
840: /*47*/ u_char nc_gpcntl;
841: /*48*/ u_char nc_stime0; /* cmd: timeout for select&handshake*/
842: /*49*/ u_char nc_stime1; /* cmd: timeout user defined */
843: /*4a*/ u_short nc_respid; /* sta: Reselect-IDs */
844:
845: /*4c*/ u_char nc_stest0;
846:
847: /*4d*/ u_char nc_stest1;
848: #define DBLEN 0x08 /* clock doubler running */
849: #define DBLSEL 0x04 /* clock doubler selected */
850:
851:
852: /*4e*/ u_char nc_stest2;
853: #define ROF 0x40 /* reset scsi offset (after gross error!) */
854: #define EXT 0x02 /* extended filtering */
855:
856: /*4f*/ u_char nc_stest3;
857: #define TE 0x80 /* c: tolerAnt enable */
858: #define HSC 0x20 /* c: Halt SCSI Clock */
859: #define CSF 0x02 /* c: clear scsi fifo */
860:
861: /*50*/ u_short nc_sidl; /* Lowlevel: latched from scsi data */
862: /*52*/ u_char nc_stest4;
863: #define SMODE 0xc0 /* SCSI bus mode (895/6 only) */
864: #define SMODE_HVD 0x40 /* High Voltage Differential */
865: #define SMODE_SE 0x80 /* Single Ended */
866: #define SMODE_LVD 0xc0 /* Low Voltage Differential */
867: #define LCKFRQ 0x20 /* Frequency Lock (895/6 only) */
868:
869: /*53*/ u_char nc_53_;
870: /*54*/ u_short nc_sodl; /* Lowlevel: data out to scsi data */
871: /*56*/ u_short nc_56_;
872: /*58*/ u_short nc_sbdl; /* Lowlevel: data from scsi data */
873: /*5a*/ u_short nc_5a_;
874: /*5c*/ u_char nc_scr0; /* Working register B */
875: /*5d*/ u_char nc_scr1; /* */
876: /*5e*/ u_char nc_scr2; /* */
877: /*5f*/ u_char nc_scr3; /* */
878: /*60*/
879: };
880:
881: /*-----------------------------------------------------------
882: **
883: ** Utility macros for the script.
884: **
885: **-----------------------------------------------------------
886: */
887:
888: #define REGJ(p,r) (offsetof(struct ncr_reg, p ## r))
889: #define REG(r) REGJ (nc_, r)
890:
891: #ifndef TARGET_MODE
892: #define TARGET_MODE 0
893: #endif
894:
895: typedef u_int32 ncrcmd;
896:
897: /*-----------------------------------------------------------
898: **
899: ** SCSI phases
900: **
901: **-----------------------------------------------------------
902: */
903:
904: #define SCR_DATA_OUT 0x00000000
905: #define SCR_DATA_IN 0x01000000
906: #define SCR_COMMAND 0x02000000
907: #define SCR_STATUS 0x03000000
908: #define SCR_ILG_OUT 0x04000000
909: #define SCR_ILG_IN 0x05000000
910: #define SCR_MSG_OUT 0x06000000
911: #define SCR_MSG_IN 0x07000000
912:
913: /*-----------------------------------------------------------
914: **
915: ** Data transfer via SCSI.
916: **
917: **-----------------------------------------------------------
918: **
919: ** MOVE_ABS (LEN)
920: ** <<start address>>
921: **
922: ** MOVE_IND (LEN)
923: ** <<dnad_offset>>
924: **
925: ** MOVE_TBL
926: ** <<dnad_offset>>
927: **
928: **-----------------------------------------------------------
929: */
930:
931: #define SCR_MOVE_ABS(l) ((0x08000000 ^ (TARGET_MODE << 1ul)) | (l))
932: #define SCR_MOVE_IND(l) ((0x28000000 ^ (TARGET_MODE << 1ul)) | (l))
933: #define SCR_MOVE_TBL (0x18000000 ^ (TARGET_MODE << 1ul))
934:
935: struct scr_tblmove {
936: u_int32 size;
937: u_int32 addr;
938: };
939:
940: /*-----------------------------------------------------------
941: **
942: ** Selection
943: **
944: **-----------------------------------------------------------
945: **
946: ** SEL_ABS | SCR_ID (0..7) [ | REL_JMP]
947: ** <<alternate_address>>
948: **
949: ** SEL_TBL | << dnad_offset>> [ | REL_JMP]
950: ** <<alternate_address>>
951: **
952: **-----------------------------------------------------------
953: */
954:
955: #define SCR_SEL_ABS 0x40000000
956: #define SCR_SEL_ABS_ATN 0x41000000
957: #define SCR_SEL_TBL 0x42000000
958: #define SCR_SEL_TBL_ATN 0x43000000
959:
960: struct scr_tblsel {
961: u_char sel_0;
962: u_char sel_sxfer;
963: u_char sel_id;
964: u_char sel_scntl3;
965: };
966:
967: #define SCR_JMP_REL 0x04000000
968: #define SCR_ID(id) (((u_int32)(id)) << 16)
969:
970: /*-----------------------------------------------------------
971: **
972: ** Waiting for Disconnect or Reselect
973: **
974: **-----------------------------------------------------------
975: **
976: ** WAIT_DISC
977: ** dummy: <<alternate_address>>
978: **
979: ** WAIT_RESEL
980: ** <<alternate_address>>
981: **
982: **-----------------------------------------------------------
983: */
984:
985: #define SCR_WAIT_DISC 0x48000000
986: #define SCR_WAIT_RESEL 0x50000000
987:
988: /*-----------------------------------------------------------
989: **
990: ** Bit Set / Reset
991: **
992: **-----------------------------------------------------------
993: **
994: ** SET (flags {|.. })
995: **
996: ** CLR (flags {|.. })
997: **
998: **-----------------------------------------------------------
999: */
1000:
1001: #define SCR_SET(f) (0x58000000 | (f))
1002: #define SCR_CLR(f) (0x60000000 | (f))
1003:
1004: #define SCR_CARRY 0x00000400
1005: #define SCR_TRG 0x00000200
1006: #define SCR_ACK 0x00000040
1007: #define SCR_ATN 0x00000008
1008:
1009:
1010:
1011:
1012: /*-----------------------------------------------------------
1013: **
1014: ** Memory to memory move
1015: **
1016: **-----------------------------------------------------------
1017: **
1018: ** COPY (bytecount)
1019: ** << source_address >>
1020: ** << destination_address >>
1021: **
1022: ** SCR_COPY sets the NO FLUSH option by default.
1023: ** SCR_COPY_F does not set this option.
1024: **
1025: ** For chips which do not support this option,
1026: ** ncr_copy_and_bind() will remove this bit.
1027: **-----------------------------------------------------------
1028: */
1029:
1030: #define SCR_NO_FLUSH 0x01000000
1031:
1032: #define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n))
1033: #define SCR_COPY_F(n) (0xc0000000 | (n))
1034:
1035: /*-----------------------------------------------------------
1036: **
1037: ** Register move and binary operations
1038: **
1039: **-----------------------------------------------------------
1040: **
1041: ** SFBR_REG (reg, op, data) reg = SFBR op data
1042: ** << 0 >>
1043: **
1044: ** REG_SFBR (reg, op, data) SFBR = reg op data
1045: ** << 0 >>
1046: **
1047: ** REG_REG (reg, op, data) reg = reg op data
1048: ** << 0 >>
1049: **
1050: **-----------------------------------------------------------
1051: */
1052:
1053: #define SCR_REG_OFS(ofs) ((ofs) << 16ul)
1054:
1055: #define SCR_SFBR_REG(reg,op,data) \
1056: (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
1057:
1058: #define SCR_REG_SFBR(reg,op,data) \
1059: (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
1060:
1061: #define SCR_REG_REG(reg,op,data) \
1062: (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | ((data)<<8ul))
1063:
1064:
1065: #define SCR_LOAD 0x00000000
1066: #define SCR_SHL 0x01000000
1067: #define SCR_OR 0x02000000
1068: #define SCR_XOR 0x03000000
1069: #define SCR_AND 0x04000000
1070: #define SCR_SHR 0x05000000
1071: #define SCR_ADD 0x06000000
1072: #define SCR_ADDC 0x07000000
1073:
1074: /*-----------------------------------------------------------
1075: **
1076: ** FROM_REG (reg) reg = SFBR
1077: ** << 0 >>
1078: **
1079: ** TO_REG (reg) SFBR = reg
1080: ** << 0 >>
1081: **
1082: ** LOAD_REG (reg, data) reg = <data>
1083: ** << 0 >>
1084: **
1085: ** LOAD_SFBR(data) SFBR = <data>
1086: ** << 0 >>
1087: **
1088: **-----------------------------------------------------------
1089: */
1090:
1091: #define SCR_FROM_REG(reg) \
1092: SCR_REG_SFBR(reg,SCR_OR,0)
1093:
1094: #define SCR_TO_REG(reg) \
1095: SCR_SFBR_REG(reg,SCR_OR,0)
1096:
1097: #define SCR_LOAD_REG(reg,data) \
1098: SCR_REG_REG(reg,SCR_LOAD,data)
1099:
1100: #define SCR_LOAD_SFBR(data) \
1101: (SCR_REG_SFBR (gpreg, SCR_LOAD, data))
1102:
1103: /*-----------------------------------------------------------
1104: **
1105: ** Waiting for Disconnect or Reselect
1106: **
1107: **-----------------------------------------------------------
1108: **
1109: ** JUMP [ | IFTRUE/IFFALSE ( ... ) ]
1110: ** <<address>>
1111: **
1112: ** JUMPR [ | IFTRUE/IFFALSE ( ... ) ]
1113: ** <<distance>>
1114: **
1115: ** CALL [ | IFTRUE/IFFALSE ( ... ) ]
1116: ** <<address>>
1117: **
1118: ** CALLR [ | IFTRUE/IFFALSE ( ... ) ]
1119: ** <<distance>>
1120: **
1121: ** RETURN [ | IFTRUE/IFFALSE ( ... ) ]
1122: ** <<dummy>>
1123: **
1124: ** INT [ | IFTRUE/IFFALSE ( ... ) ]
1125: ** <<ident>>
1126: **
1127: ** INT_FLY [ | IFTRUE/IFFALSE ( ... ) ]
1128: ** <<ident>>
1129: **
1130: ** Conditions:
1131: ** WHEN (phase)
1132: ** IF (phase)
1133: ** CARRY
1134: ** DATA (data, mask)
1135: **
1136: **-----------------------------------------------------------
1137: */
1138:
1139: #define SCR_NO_OP 0x80000000
1140: #define SCR_JUMP 0x80080000
1141: #define SCR_JUMPR 0x80880000
1142: #define SCR_CALL 0x88080000
1143: #define SCR_CALLR 0x88880000
1144: #define SCR_RETURN 0x90080000
1145: #define SCR_INT 0x98080000
1146: #define SCR_INT_FLY 0x98180000
1147:
1148: #define IFFALSE(arg) (0x00080000 | (arg))
1149: #define IFTRUE(arg) (0x00000000 | (arg))
1150:
1151: #define WHEN(phase) (0x00030000 | (phase))
1152: #define IF(phase) (0x00020000 | (phase))
1153:
1154: #define DATA(D) (0x00040000 | ((D) & 0xff))
1155: #define MASK(D,M) (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff))
1156:
1157: #define CARRYSET (0x00200000)
1158:
1159: /*-----------------------------------------------------------
1160: **
1161: ** SCSI constants.
1162: **
1163: **-----------------------------------------------------------
1164: */
1165:
1166: /*
1167: ** Messages
1168: */
1169:
1170: #define M_COMPLETE (0x00)
1171: #define M_EXTENDED (0x01)
1172: #define M_SAVE_DP (0x02)
1173: #define M_RESTORE_DP (0x03)
1174: #define M_DISCONNECT (0x04)
1175: #define M_ID_ERROR (0x05)
1176: #define M_ABORT (0x06)
1177: #define M_REJECT (0x07)
1178: #define M_NOOP (0x08)
1179: #define M_PARITY (0x09)
1180: #define M_LCOMPLETE (0x0a)
1181: #define M_FCOMPLETE (0x0b)
1182: #define M_RESET (0x0c)
1183: #define M_ABORT_TAG (0x0d)
1184: #define M_CLEAR_QUEUE (0x0e)
1185: #define M_INIT_REC (0x0f)
1186: #define M_REL_REC (0x10)
1187: #define M_TERMINATE (0x11)
1188: #define M_SIMPLE_TAG (0x20)
1189: #define M_HEAD_TAG (0x21)
1190: #define M_ORDERED_TAG (0x22)
1191: #define M_IGN_RESIDUE (0x23)
1192: #define M_IDENTIFY (0x80)
1193:
1194: #define M_X_MODIFY_DP (0x00)
1195: #define M_X_SYNC_REQ (0x01)
1196: #define M_X_WIDE_REQ (0x03)
1197:
1198: /*
1199: ** Status
1200: */
1201:
1202: #define S_GOOD (0x00)
1203: #define S_CHECK_COND (0x02)
1204: #define S_COND_MET (0x04)
1205: #define S_BUSY (0x08)
1206: #define S_INT (0x10)
1207: #define S_INT_COND_MET (0x14)
1208: #define S_CONFLICT (0x18)
1209: #define S_TERMINATED (0x20)
1210: #define S_QUEUE_FULL (0x28)
1211: #define S_ILLEGAL (0xff)
1212: #define S_SENSE (0x80)
1213:
1214: /*
1215: * End of ncrreg from FreeBSD
1216: */
1217:
1218: #endif /* !defined HOSTS_C */
1219:
1220: #endif /* defined NCR53C8XX_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.