Annotation of sys/dev/microcode/aic7xxx/aic7xxx.reg, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: aic7xxx.reg,v 1.11 2007/05/26 00:36:03 krw Exp $ */
2: /*
3: * Aic7xxx register and scratch ram definitions.
4: *
5: * Copyright (c) 1994-2001 Justin T. Gibbs.
6: * Copyright (c) 2000-2001 Adaptec Inc.
7: * All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions, and the following disclaimer,
14: * without modification.
15: * 2. Redistributions in binary form must reproduce at minimum a disclaimer
16: * substantially similar to the "NO WARRANTY" disclaimer below
17: * ("Disclaimer") and any redistribution must be conditioned upon
18: * including a substantially similar Disclaimer requirement for further
19: * binary redistribution.
20: * 3. Neither the names of the above-listed copyright holders nor the names
21: * of any contributors may be used to endorse or promote products derived
22: * from this software without specific prior written permission.
23: *
24: * Alternatively, this software may be distributed under the terms of the
25: * GNU General Public License ("GPL") version 2 as published by the Free
26: * Software Foundation.
27: *
28: * NO WARRANTY
29: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
30: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
31: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
32: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
33: * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
38: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39: * POSSIBILITY OF SUCH DAMAGES.
40: *
41: * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.reg,v 1.46 2003/12/17 00:02:09 gibbs Exp $
42: */
43: VERSION = "$Id: aic7xxx.reg,v 1.11 2007/05/26 00:36:03 krw Exp $"
44:
45: /*
46: * This file is processed by the aic7xxx_asm utility for use in assembling
47: * firmware for the aic7xxx family of SCSI host adapters as well as to generate
48: * a C header file for use in the kernel portion of the Aic7xxx driver.
49: *
50: * All page numbers refer to the Adaptec AIC-7770 Data Book available from
51: * Adaptec's Technical Documents Department 1-800-934-2766
52: */
53:
54: /*
55: * SCSI Sequence Control (p. 3-11).
56: * Each bit, when set starts a specific SCSI sequence on the bus
57: */
58: register SCSISEQ {
59: address 0x000
60: access_mode RW
61: field TEMODE 0x80
62: field ENSELO 0x40
63: field ENSELI 0x20
64: field ENRSELI 0x10
65: field ENAUTOATNO 0x08
66: field ENAUTOATNI 0x04
67: field ENAUTOATNP 0x02
68: field SCSIRSTO 0x01
69: }
70:
71: /*
72: * SCSI Transfer Control 0 Register (pp. 3-13).
73: * Controls the SCSI module data path.
74: */
75: register SXFRCTL0 {
76: address 0x001
77: access_mode RW
78: field DFON 0x80
79: field DFPEXP 0x40
80: field FAST20 0x20
81: field CLRSTCNT 0x10
82: field SPIOEN 0x08
83: field SCAMEN 0x04
84: field CLRCHN 0x02
85: }
86:
87: /*
88: * SCSI Transfer Control 1 Register (pp. 3-14,15).
89: * Controls the SCSI module data path.
90: */
91: register SXFRCTL1 {
92: address 0x002
93: access_mode RW
94: field BITBUCKET 0x80
95: field SWRAPEN 0x40
96: field ENSPCHK 0x20
97: mask STIMESEL 0x18
98: field ENSTIMER 0x04
99: field ACTNEGEN 0x02
100: field STPWEN 0x01 /* Powered Termination */
101: }
102:
103: /*
104: * SCSI Control Signal Read Register (p. 3-15).
105: * Reads the actual state of the SCSI bus pins
106: */
107: register SCSISIGI {
108: address 0x003
109: access_mode RO
110: field CDI 0x80
111: field IOI 0x40
112: field MSGI 0x20
113: field ATNI 0x10
114: field SELI 0x08
115: field BSYI 0x04
116: field REQI 0x02
117: field ACKI 0x01
118: /*
119: * Possible phases in SCSISIGI
120: */
121: mask PHASE_MASK CDI|IOI|MSGI
122: mask P_DATAOUT 0x00
123: mask P_DATAIN IOI
124: mask P_DATAOUT_DT P_DATAOUT|MSGI
125: mask P_DATAIN_DT P_DATAIN|MSGI
126: mask P_COMMAND CDI
127: mask P_MESGOUT CDI|MSGI
128: mask P_STATUS CDI|IOI
129: mask P_MESGIN CDI|IOI|MSGI
130: }
131:
132: /*
133: * SCSI Control Signal Write Register (p. 3-16).
134: * Writing to this register modifies the control signals on the bus. Only
135: * those signals that are allowed in the current mode (Initiator/Target) are
136: * asserted.
137: */
138: register SCSISIGO {
139: address 0x003
140: access_mode WO
141: field CDO 0x80
142: field IOO 0x40
143: field MSGO 0x20
144: field ATNO 0x10
145: field SELO 0x08
146: field BSYO 0x04
147: field REQO 0x02
148: field ACKO 0x01
149: /*
150: * Possible phases to write into SCSISIG0
151: */
152: mask PHASE_MASK CDI|IOI|MSGI
153: mask P_DATAOUT 0x00
154: mask P_DATAIN IOI
155: mask P_COMMAND CDI
156: mask P_MESGOUT CDI|MSGI
157: mask P_STATUS CDI|IOI
158: mask P_MESGIN CDI|IOI|MSGI
159: }
160:
161: /*
162: * SCSI Rate Control (p. 3-17).
163: * Contents of this register determine the Synchronous SCSI data transfer
164: * rate and the maximum synchronous Req/Ack offset. An offset of 0 in the
165: * SOFS (3:0) bits disables synchronous data transfers. Any offset value
166: * greater than 0 enables synchronous transfers.
167: */
168: register SCSIRATE {
169: address 0x004
170: access_mode RW
171: field WIDEXFER 0x80 /* Wide transfer control */
172: field ENABLE_CRC 0x40 /* CRC for D-Phases */
173: field SINGLE_EDGE 0x10 /* Disable DT Transfers */
174: mask SXFR 0x70 /* Sync transfer rate */
175: mask SXFR_ULTRA2 0x0f /* Sync transfer rate */
176: mask SOFS 0x0f /* Sync offset */
177: }
178:
179: /*
180: * SCSI ID (p. 3-18).
181: * Contains the ID of the board and the current target on the
182: * selected channel.
183: */
184: register SCSIID {
185: address 0x005
186: access_mode RW
187: mask TID 0xf0 /* Target ID mask */
188: mask TWIN_TID 0x70
189: field TWIN_CHNLB 0x80
190: mask OID 0x0f /* Our ID mask */
191: /*
192: * SCSI Maximum Offset (p. 4-61 aic7890/91 Data Book)
193: * The aic7890/91 allow an offset of up to 127 transfers in both wide
194: * and narrow mode.
195: */
196: alias SCSIOFFSET
197: mask SOFS_ULTRA2 0x7f /* Sync offset U2 chips */
198: }
199:
200: /*
201: * SCSI Latched Data (p. 3-19).
202: * Read/Write latches used to transfer data on the SCSI bus during
203: * Automatic or Manual PIO mode. SCSIDATH can be used for the
204: * upper byte of a 16bit wide asynchronouse data phase transfer.
205: */
206: register SCSIDATL {
207: address 0x006
208: access_mode RW
209: }
210:
211: register SCSIDATH {
212: address 0x007
213: access_mode RW
214: }
215:
216: /*
217: * SCSI Transfer Count (pp. 3-19,20)
218: * These registers count down the number of bytes transferred
219: * across the SCSI bus. The counter is decremented only once
220: * the data has been safely transferred. SDONE in SSTAT0 is
221: * set when STCNT goes to 0
222: */
223: register STCNT {
224: address 0x008
225: size 3
226: access_mode RW
227: }
228:
229: /* ALT_MODE registers (Ultra2 and Ultra160 chips) */
230: register SXFRCTL2 {
231: address 0x013
232: access_mode RW
233: field AUTORSTDIS 0x10
234: field CMDDMAEN 0x08
235: mask ASYNC_SETUP 0x07
236: }
237:
238: /* ALT_MODE register on Ultra160 chips */
239: register OPTIONMODE {
240: address 0x008
241: access_mode RW
242: field AUTORATEEN 0x80
243: field AUTOACKEN 0x40
244: field ATNMGMNTEN 0x20
245: field BUSFREEREV 0x10
246: field EXPPHASEDIS 0x08
247: field SCSIDATL_IMGEN 0x04
248: field AUTO_MSGOUT_DE 0x02
249: field DIS_MSGIN_DUALEDGE 0x01
250: mask OPTIONMODE_DEFAULTS AUTO_MSGOUT_DE|DIS_MSGIN_DUALEDGE
251: }
252:
253: /* ALT_MODE register on Ultra160 chips */
254: register TARGCRCCNT {
255: address 0x00a
256: size 2
257: access_mode RW
258: }
259:
260: /*
261: * Clear SCSI Interrupt 0 (p. 3-20)
262: * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT0.
263: */
264: register CLRSINT0 {
265: address 0x00b
266: access_mode WO
267: field CLRSELDO 0x40
268: field CLRSELDI 0x20
269: field CLRSELINGO 0x10
270: field CLRSWRAP 0x08
271: field CLRIOERR 0x08 /* Ultra2 Only */
272: field CLRSPIORDY 0x02
273: }
274:
275: /*
276: * SCSI Status 0 (p. 3-21)
277: * Contains one set of SCSI Interrupt codes
278: * These are most likely of interest to the sequencer
279: */
280: register SSTAT0 {
281: address 0x00b
282: access_mode RO
283: field TARGET 0x80 /* Board acting as target */
284: field SELDO 0x40 /* Selection Done */
285: field SELDI 0x20 /* Board has been selected */
286: field SELINGO 0x10 /* Selection In Progress */
287: field SWRAP 0x08 /* 24bit counter wrap */
288: field IOERR 0x08 /* LVD Tranceiver mode changed */
289: field SDONE 0x04 /* STCNT = 0x000000 */
290: field SPIORDY 0x02 /* SCSI PIO Ready */
291: field DMADONE 0x01 /* DMA transfer completed */
292: }
293:
294: /*
295: * Clear SCSI Interrupt 1 (p. 3-23)
296: * Writing a 1 to a bit clears the associated SCSI Interrupt in SSTAT1.
297: */
298: register CLRSINT1 {
299: address 0x00c
300: access_mode WO
301: field CLRSELTIMEO 0x80
302: field CLRATNO 0x40
303: field CLRSCSIRSTI 0x20
304: field CLRBUSFREE 0x08
305: field CLRSCSIPERR 0x04
306: field CLRPHASECHG 0x02
307: field CLRREQINIT 0x01
308: }
309:
310: /*
311: * SCSI Status 1 (p. 3-24)
312: */
313: register SSTAT1 {
314: address 0x00c
315: access_mode RO
316: field SELTO 0x80
317: field ATNTARG 0x40
318: field SCSIRSTI 0x20
319: field PHASEMIS 0x10
320: field BUSFREE 0x08
321: field SCSIPERR 0x04
322: field PHASECHG 0x02
323: field REQINIT 0x01
324: }
325:
326: /*
327: * SCSI Status 2 (pp. 3-25,26)
328: */
329: register SSTAT2 {
330: address 0x00d
331: access_mode RO
332: field OVERRUN 0x80
333: field SHVALID 0x40 /* Shadow Layer non-zero */
334: field EXP_ACTIVE 0x10 /* SCSI Expander Active */
335: field CRCVALERR 0x08 /* CRC doesn't match (U3 only) */
336: field CRCENDERR 0x04 /* No terminal CRC packet (U3 only) */
337: field CRCREQERR 0x02 /* Illegal CRC packet req (U3 only) */
338: field DUAL_EDGE_ERR 0x01 /* Incorrect data phase (U3 only) */
339: mask SFCNT 0x1f
340: }
341:
342: /*
343: * SCSI Status 3 (p. 3-26)
344: */
345: register SSTAT3 {
346: address 0x00e
347: access_mode RO
348: mask SCSICNT 0xf0
349: mask OFFCNT 0x0f
350: mask U2OFFCNT 0x7f
351: }
352:
353: /*
354: * SCSI ID for the aic7890/91 chips
355: */
356: register SCSIID_ULTRA2 {
357: address 0x00f
358: access_mode RW
359: mask TID 0xf0 /* Target ID mask */
360: mask OID 0x0f /* Our ID mask */
361: }
362:
363: /*
364: * SCSI Interrupt Mode 1 (p. 3-28)
365: * Setting any bit will enable the corresponding function
366: * in SIMODE0 to interrupt via the IRQ pin.
367: */
368: register SIMODE0 {
369: address 0x010
370: access_mode RW
371: field ENSELDO 0x40
372: field ENSELDI 0x20
373: field ENSELINGO 0x10
374: field ENSWRAP 0x08
375: field ENIOERR 0x08 /* LVD Tranceiver mode changes */
376: field ENSDONE 0x04
377: field ENSPIORDY 0x02
378: field ENDMADONE 0x01
379: }
380:
381: /*
382: * SCSI Interrupt Mode 1 (pp. 3-28,29)
383: * Setting any bit will enable the corresponding function
384: * in SIMODE1 to interrupt via the IRQ pin.
385: */
386: register SIMODE1 {
387: address 0x011
388: access_mode RW
389: field ENSELTIMO 0x80
390: field ENATNTARG 0x40
391: field ENSCSIRST 0x20
392: field ENPHASEMIS 0x10
393: field ENBUSFREE 0x08
394: field ENSCSIPERR 0x04
395: field ENPHASECHG 0x02
396: field ENREQINIT 0x01
397: }
398:
399: /*
400: * SCSI Data Bus (High) (p. 3-29)
401: * This register reads data on the SCSI Data bus directly.
402: */
403: register SCSIBUSL {
404: address 0x012
405: access_mode RW
406: }
407:
408: register SCSIBUSH {
409: address 0x013
410: access_mode RW
411: }
412:
413: /*
414: * SCSI/Host Address (p. 3-30)
415: * These registers hold the host address for the byte about to be
416: * transferred on the SCSI bus. They are counted up in the same
417: * manner as STCNT is counted down. SHADDR should always be used
418: * to determine the address of the last byte transferred since HADDR
419: * can be skewed by write ahead.
420: */
421: register SHADDR {
422: address 0x014
423: size 4
424: access_mode RO
425: }
426:
427: /*
428: * Selection Timeout Timer (p. 3-30)
429: */
430: register SELTIMER {
431: address 0x018
432: access_mode RW
433: field STAGE6 0x20
434: field STAGE5 0x10
435: field STAGE4 0x08
436: field STAGE3 0x04
437: field STAGE2 0x02
438: field STAGE1 0x01
439: alias TARGIDIN
440: }
441:
442: /*
443: * Selection/Reselection ID (p. 3-31)
444: * Upper four bits are the device id. The ONEBIT is set when the re/selecting
445: * device did not set its own ID.
446: */
447: register SELID {
448: address 0x019
449: access_mode RW
450: mask SELID_MASK 0xf0
451: field ONEBIT 0x08
452: }
453:
454: register SCAMCTL {
455: address 0x01a
456: access_mode RW
457: field ENSCAMSELO 0x80
458: field CLRSCAMSELID 0x40
459: field ALTSTIM 0x20
460: field DFLTTID 0x10
461: mask SCAMLVL 0x03
462: }
463:
464: /*
465: * Target Mode Selecting in ID bitmask (aic7890/91/96/97)
466: */
467: register TARGID {
468: address 0x01b
469: size 2
470: access_mode RW
471: }
472:
473: /*
474: * Serial Port I/O Cabability register (p. 4-95 aic7860 Data Book)
475: * Indicates if external logic has been attached to the chip to
476: * perform the tasks of accessing a serial eeprom, testing termination
477: * strength, and performing cable detection. On the aic7860, most of
478: * these features are handled on chip, but on the aic7855 an attached
479: * aic3800 does the grunt work.
480: */
481: register SPIOCAP {
482: address 0x01b
483: access_mode RW
484: field SOFT1 0x80
485: field SOFT0 0x40
486: field SOFTCMDEN 0x20
487: field EXT_BRDCTL 0x10 /* External Board control */
488: field SEEPROM 0x08 /* External serial eeprom logic */
489: field EEPROM 0x04 /* Writable external BIOS ROM */
490: field ROM 0x02 /* Logic for accessing external ROM */
491: field SSPIOCPS 0x01 /* Termination and cable detection */
492: }
493:
494: register BRDCTL {
495: address 0x01d
496: field BRDDAT7 0x80
497: field BRDDAT6 0x40
498: field BRDDAT5 0x20
499: field BRDSTB 0x10
500: field BRDCS 0x08
501: field BRDRW 0x04
502: field BRDCTL1 0x02
503: field BRDCTL0 0x01
504: /* 7890 Definitions */
505: field BRDDAT4 0x10
506: field BRDDAT3 0x08
507: field BRDDAT2 0x04
508: field BRDRW_ULTRA2 0x02
509: field BRDSTB_ULTRA2 0x01
510: }
511:
512: /*
513: * Serial EEPROM Control (p. 4-92 in 7870 Databook)
514: * Controls the reading and writing of an external serial 1-bit
515: * EEPROM Device. In order to access the serial EEPROM, you must
516: * first set the SEEMS bit that generates a request to the memory
517: * port for access to the serial EEPROM device. When the memory
518: * port is not busy servicing another request, it reconfigures
519: * to allow access to the serial EEPROM. When this happens, SEERDY
520: * gets set high to verify that the memory port access has been
521: * granted.
522: *
523: * After successful arbitration for the memory port, the SEECS bit of
524: * the SEECTL register is connected to the chip select. The SEECK,
525: * SEEDO, and SEEDI are connected to the clock, data out, and data in
526: * lines respectively. The SEERDY bit of SEECTL is useful in that it
527: * gives us an 800 nsec timer. After a write to the SEECTL register,
528: * the SEERDY goes high 800 nsec later. The one exception to this is
529: * when we first request access to the memory port. The SEERDY goes
530: * high to signify that access has been granted and, for this case, has
531: * no implied timing.
532: *
533: * See 93cx6.c for detailed information on the protocol necessary to
534: * read the serial EEPROM.
535: */
536: register SEECTL {
537: address 0x01e
538: field EXTARBACK 0x80
539: field EXTARBREQ 0x40
540: field SEEMS 0x20
541: field SEERDY 0x10
542: field SEECS 0x08
543: field SEECK 0x04
544: field SEEDO 0x02
545: field SEEDI 0x01
546: }
547: /*
548: * SCSI Block Control (p. 3-32)
549: * Controls Bus type and channel selection. In a twin channel configuration
550: * addresses 0x00-0x1e are gated to the appropriate channel based on this
551: * register. SELWIDE allows for the coexistence of 8bit and 16bit devices
552: * on a wide bus.
553: */
554: register SBLKCTL {
555: address 0x01f
556: access_mode RW
557: field DIAGLEDEN 0x80 /* Aic78X0 only */
558: field DIAGLEDON 0x40 /* Aic78X0 only */
559: field AUTOFLUSHDIS 0x20
560: field SELBUSB 0x08
561: field ENAB40 0x08 /* LVD transceiver active */
562: field ENAB20 0x04 /* SE/HVD transceiver active */
563: field SELWIDE 0x02
564: field XCVR 0x01 /* External transceiver active */
565: }
566:
567: /*
568: * Sequencer Control (p. 3-33)
569: * Error detection mode and speed configuration
570: */
571: register SEQCTL {
572: address 0x060
573: access_mode RW
574: field PERRORDIS 0x80
575: field PAUSEDIS 0x40
576: field FAILDIS 0x20
577: field FASTMODE 0x10
578: field BRKADRINTEN 0x08
579: field STEP 0x04
580: field SEQRESET 0x02
581: field LOADRAM 0x01
582: }
583:
584: /*
585: * Sequencer RAM Data (p. 3-34)
586: * Single byte window into the Scratch Ram area starting at the address
587: * specified by SEQADDR0 and SEQADDR1. To write a full word, simply write
588: * four bytes in succession. The SEQADDRs will increment after the most
589: * significant byte is written
590: */
591: register SEQRAM {
592: address 0x061
593: access_mode RW
594: }
595:
596: /*
597: * Sequencer Address Registers (p. 3-35)
598: * Only the first bit of SEQADDR1 holds addressing information
599: */
600: register SEQADDR0 {
601: address 0x062
602: access_mode RW
603: }
604:
605: register SEQADDR1 {
606: address 0x063
607: access_mode RW
608: mask SEQADDR1_MASK 0x01
609: }
610:
611: /*
612: * Accumulator
613: * We cheat by passing arguments in the Accumulator up to the kernel driver
614: */
615: register ACCUM {
616: address 0x064
617: access_mode RW
618: accumulator
619: }
620:
621: register SINDEX {
622: address 0x065
623: access_mode RW
624: sindex
625: }
626:
627: register DINDEX {
628: address 0x066
629: access_mode RW
630: }
631:
632: register ALLONES {
633: address 0x069
634: access_mode RO
635: allones
636: }
637:
638: register ALLZEROS {
639: address 0x06a
640: access_mode RO
641: allzeros
642: }
643:
644: register NONE {
645: address 0x06a
646: access_mode WO
647: none
648: }
649:
650: register FLAGS {
651: address 0x06b
652: access_mode RO
653: field ZERO 0x02
654: field CARRY 0x01
655: }
656:
657: register SINDIR {
658: address 0x06c
659: access_mode RO
660: }
661:
662: register DINDIR {
663: address 0x06d
664: access_mode WO
665: }
666:
667: register FUNCTION1 {
668: address 0x06e
669: access_mode RW
670: }
671:
672: register STACK {
673: address 0x06f
674: access_mode RO
675: }
676:
677: const STACK_SIZE 4
678:
679: /*
680: * Board Control (p. 3-43)
681: */
682: register BCTL {
683: address 0x084
684: access_mode RW
685: field ACE 0x08
686: field ENABLE 0x01
687: }
688:
689: /*
690: * On the aic78X0 chips, Board Control is replaced by the DSCommand
691: * register (p. 4-64)
692: */
693: register DSCOMMAND0 {
694: address 0x084
695: access_mode RW
696: field CACHETHEN 0x80 /* Cache Threshold enable */
697: field DPARCKEN 0x40 /* Data Parity Check Enable */
698: field MPARCKEN 0x20 /* Memory Parity Check Enable */
699: field EXTREQLCK 0x10 /* External Request Lock */
700: /* aic7890/91/96/97 only */
701: field INTSCBRAMSEL 0x08 /* Internal SCB RAM Select */
702: field RAMPS 0x04 /* External SCB RAM Present */
703: field USCBSIZE32 0x02 /* Use 32byte SCB Page Size */
704: field CIOPARCKEN 0x01 /* Internal bus parity error enable */
705: }
706:
707: register DSCOMMAND1 {
708: address 0x085
709: access_mode RW
710: mask DSLATT 0xfc /* PCI latency timer (non-ultra2) */
711: field HADDLDSEL1 0x02 /* Host Address Load Select Bits */
712: field HADDLDSEL0 0x01
713: }
714:
715: /*
716: * Bus On/Off Time (p. 3-44) aic7770 only
717: */
718: register BUSTIME {
719: address 0x085
720: access_mode RW
721: mask BOFF 0xf0
722: mask BON 0x0f
723: }
724:
725: /*
726: * Bus Speed (p. 3-45) aic7770 only
727: */
728: register BUSSPD {
729: address 0x086
730: access_mode RW
731: mask DFTHRSH 0xc0
732: mask STBOFF 0x38
733: mask STBON 0x07
734: mask DFTHRSH_100 0xc0
735: mask DFTHRSH_75 0x80
736: }
737:
738: /* aic7850/55/60/70/80/95 only */
739: register DSPCISTATUS {
740: address 0x086
741: mask DFTHRSH_100 0xc0
742: }
743:
744: /* aic7890/91/96/97 only */
745: register HS_MAILBOX {
746: address 0x086
747: mask HOST_MAILBOX 0xF0
748: mask SEQ_MAILBOX 0x0F
749: mask HOST_TQINPOS 0x80 /* Boundary at either 0 or 128 */
750: }
751:
752: const HOST_MAILBOX_SHIFT 4
753: const SEQ_MAILBOX_SHIFT 0
754:
755: /*
756: * Host Control (p. 3-47) R/W
757: * Overall host control of the device.
758: */
759: register HCNTRL {
760: address 0x087
761: access_mode RW
762: field POWRDN 0x40
763: field SWINT 0x10
764: field IRQMS 0x08
765: field PAUSE 0x04
766: field INTEN 0x02
767: field CHIPRST 0x01
768: field CHIPRSTACK 0x01
769: }
770:
771: /*
772: * Host Address (p. 3-48)
773: * This register contains the address of the byte about
774: * to be transferred across the host bus.
775: */
776: register HADDR {
777: address 0x088
778: size 4
779: access_mode RW
780: }
781:
782: register HCNT {
783: address 0x08c
784: size 3
785: access_mode RW
786: }
787:
788: /*
789: * SCB Pointer (p. 3-49)
790: * Gate one of the SCBs into the SCBARRAY window.
791: */
792: register SCBPTR {
793: address 0x090
794: access_mode RW
795: }
796:
797: /*
798: * Interrupt Status (p. 3-50)
799: * Status for system interrupts
800: */
801: register INTSTAT {
802: address 0x091
803: access_mode RW
804: field BRKADRINT 0x08
805: field SCSIINT 0x04
806: field CMDCMPLT 0x02
807: field SEQINT 0x01
808: mask BAD_PHASE SEQINT /* unknown scsi bus phase */
809: mask SEND_REJECT 0x10|SEQINT /* sending a message reject */
810: mask PROTO_VIOLATION 0x20|SEQINT /* SCSI protocol violation */
811: mask NO_MATCH 0x30|SEQINT /* no cmd match for reconnect */
812: mask IGN_WIDE_RES 0x40|SEQINT /* Complex IGN Wide Res Msg */
813: mask PDATA_REINIT 0x50|SEQINT /*
814: * Returned to data phase
815: * that requires data
816: * transfer pointers to be
817: * recalculated from the
818: * transfer residual.
819: */
820: mask HOST_MSG_LOOP 0x60|SEQINT /*
821: * The bus is ready for the
822: * host to perform another
823: * message transaction. This
824: * mechanism is used for things
825: * like sync/wide negotiation
826: * that require a kernel based
827: * message state engine.
828: */
829: mask BAD_STATUS 0x70|SEQINT /* Bad status from target */
830: mask PERR_DETECTED 0x80|SEQINT /*
831: * Either the phase_lock
832: * or inb_next routine has
833: * noticed a parity error.
834: */
835: mask DATA_OVERRUN 0x90|SEQINT /*
836: * Target attempted to write
837: * beyond the bounds of its
838: * command.
839: */
840: mask MKMSG_FAILED 0xa0|SEQINT /*
841: * Target completed command
842: * without honoring our ATN
843: * request to issue a message.
844: */
845: mask MISSED_BUSFREE 0xb0|SEQINT /*
846: * The sequencer never saw
847: * the bus go free after
848: * either a command complete
849: * or disconnect message.
850: */
851: mask SCB_MISMATCH 0xc0|SEQINT /*
852: * Downloaded SCB's tag does
853: * not match the entry we
854: * intended to download.
855: */
856: mask NO_FREE_SCB 0xd0|SEQINT /*
857: * get_free_or_disc_scb failed.
858: */
859: mask OUT_OF_RANGE 0xe0|SEQINT
860:
861: mask SEQINT_MASK 0xf0|SEQINT /* SEQINT Status Codes */
862: mask INT_PEND (BRKADRINT|SEQINT|SCSIINT|CMDCMPLT)
863: }
864:
865: /*
866: * Hard Error (p. 3-53)
867: * Reporting of catastrophic errors. You usually cannot recover from
868: * these without a full board reset.
869: */
870: register ERROR {
871: address 0x092
872: access_mode RO
873: field CIOPARERR 0x80 /* Ultra2 only */
874: field PCIERRSTAT 0x40 /* PCI only */
875: field MPARERR 0x20 /* PCI only */
876: field DPARERR 0x10 /* PCI only */
877: field SQPARERR 0x08
878: field ILLOPCODE 0x04
879: field ILLSADDR 0x02
880: field ILLHADDR 0x01
881: }
882:
883: /*
884: * Clear Interrupt Status (p. 3-52)
885: */
886: register CLRINT {
887: address 0x092
888: access_mode WO
889: field CLRPARERR 0x10 /* PCI only */
890: field CLRBRKADRINT 0x08
891: field CLRSCSIINT 0x04
892: field CLRCMDINT 0x02
893: field CLRSEQINT 0x01
894: }
895:
896: register DFCNTRL {
897: address 0x093
898: access_mode RW
899: field PRELOADEN 0x80 /* aic7890 only */
900: field WIDEODD 0x40
901: field SCSIEN 0x20
902: field SDMAEN 0x10
903: field SDMAENACK 0x10
904: field HDMAEN 0x08
905: field HDMAENACK 0x08
906: field DIRECTION 0x04
907: field FIFOFLUSH 0x02
908: field FIFORESET 0x01
909: }
910:
911: register DFSTATUS {
912: address 0x094
913: access_mode RO
914: field PRELOAD_AVAIL 0x80
915: field DFCACHETH 0x40
916: field FIFOQWDEMP 0x20
917: field MREQPEND 0x10
918: field HDONE 0x08
919: field DFTHRESH 0x04
920: field FIFOFULL 0x02
921: field FIFOEMP 0x01
922: }
923:
924: register DFWADDR {
925: address 0x95
926: access_mode RW
927: }
928:
929: register DFRADDR {
930: address 0x97
931: access_mode RW
932: }
933:
934: register DFDAT {
935: address 0x099
936: access_mode RW
937: }
938:
939: /*
940: * SCB Auto Increment (p. 3-59)
941: * Byte offset into the SCB Array and an optional bit to allow auto
942: * incrementing of the address during download and upload operations
943: */
944: register SCBCNT {
945: address 0x09a
946: access_mode RW
947: field SCBAUTO 0x80
948: mask SCBCNT_MASK 0x1f
949: }
950:
951: /*
952: * Queue In FIFO (p. 3-60)
953: * Input queue for queued SCBs (commands that the sequencer has yet to start)
954: */
955: register QINFIFO {
956: address 0x09b
957: access_mode RW
958: }
959:
960: /*
961: * Queue In Count (p. 3-60)
962: * Number of queued SCBs
963: */
964: register QINCNT {
965: address 0x09c
966: access_mode RO
967: }
968:
969: /*
970: * Queue Out FIFO (p. 3-61)
971: * Queue of SCBs that have completed and await the host
972: */
973: register QOUTFIFO {
974: address 0x09d
975: access_mode WO
976: }
977:
978: register CRCCONTROL1 {
979: address 0x09d
980: access_mode RW
981: field CRCONSEEN 0x80
982: field CRCVALCHKEN 0x40
983: field CRCENDCHKEN 0x20
984: field CRCREQCHKEN 0x10
985: field TARGCRCENDEN 0x08
986: field TARGCRCCNTEN 0x04
987: }
988:
989:
990: /*
991: * Queue Out Count (p. 3-61)
992: * Number of queued SCBs in the Out FIFO
993: */
994: register QOUTCNT {
995: address 0x09e
996: access_mode RO
997: }
998:
999: register SCSIPHASE {
1000: address 0x09e
1001: access_mode RO
1002: field STATUS_PHASE 0x20
1003: field COMMAND_PHASE 0x10
1004: field MSG_IN_PHASE 0x08
1005: field MSG_OUT_PHASE 0x04
1006: field DATA_IN_PHASE 0x02
1007: field DATA_OUT_PHASE 0x01
1008: mask DATA_PHASE_MASK 0x03
1009: }
1010:
1011: /*
1012: * Special Function
1013: */
1014: register SFUNCT {
1015: address 0x09f
1016: access_mode RW
1017: field ALT_MODE 0x80
1018: }
1019:
1020: /*
1021: * SCB Definition (p. 5-4)
1022: */
1023: scb {
1024: address 0x0a0
1025: size 64
1026:
1027: SCB_CDB_PTR {
1028: size 4
1029: alias SCB_RESIDUAL_DATACNT
1030: alias SCB_CDB_STORE
1031: }
1032: SCB_RESIDUAL_SGPTR {
1033: size 4
1034: }
1035: SCB_SCSI_STATUS {
1036: size 1
1037: }
1038: SCB_TARGET_PHASES {
1039: size 1
1040: }
1041: SCB_TARGET_DATA_DIR {
1042: size 1
1043: }
1044: SCB_TARGET_ITAG {
1045: size 1
1046: }
1047: SCB_DATAPTR {
1048: size 4
1049: }
1050: SCB_DATACNT {
1051: /*
1052: * The last byte is really the high address bits for
1053: * the data address.
1054: */
1055: size 4
1056: field SG_LAST_SEG 0x80 /* In the fourth byte */
1057: mask SG_HIGH_ADDR_BITS 0x7F /* In the fourth byte */
1058: }
1059: SCB_SGPTR {
1060: size 4
1061: field SG_RESID_VALID 0x04 /* In the first byte */
1062: field SG_FULL_RESID 0x02 /* In the first byte */
1063: field SG_LIST_NULL 0x01 /* In the first byte */
1064: }
1065: SCB_CONTROL {
1066: size 1
1067: field TARGET_SCB 0x80
1068: field STATUS_RCVD 0x80
1069: field DISCENB 0x40
1070: field TAG_ENB 0x20
1071: field MK_MESSAGE 0x10
1072: field ULTRAENB 0x08
1073: field DISCONNECTED 0x04
1074: mask SCB_TAG_TYPE 0x03
1075: }
1076: SCB_SCSIID {
1077: size 1
1078: field TWIN_CHNLB 0x80
1079: mask TWIN_TID 0x70
1080: mask TID 0xf0
1081: mask OID 0x0f
1082: }
1083: SCB_LUN {
1084: field SCB_XFERLEN_ODD 0x80
1085: mask LID 0x3f
1086: size 1
1087: }
1088: SCB_TAG {
1089: size 1
1090: }
1091: SCB_CDB_LEN {
1092: size 1
1093: }
1094: SCB_SCSIRATE {
1095: size 1
1096: }
1097: SCB_SCSIOFFSET {
1098: size 1
1099: }
1100: SCB_NEXT {
1101: size 1
1102: }
1103: SCB_64_SPARE {
1104: size 16
1105: }
1106: SCB_64_BTT {
1107: size 16
1108: }
1109: }
1110:
1111: const SCB_UPLOAD_SIZE 32
1112: const SCB_DOWNLOAD_SIZE 32
1113: const SCB_DOWNLOAD_SIZE_64 48
1114:
1115: const SG_SIZEOF 0x08 /* sizeof(struct ahc_dma) */
1116:
1117: /* --------------------- AHA-2840-only definitions -------------------- */
1118:
1119: register SEECTL_2840 {
1120: address 0x0c0
1121: access_mode RW
1122: field CS_2840 0x04
1123: field CK_2840 0x02
1124: field DO_2840 0x01
1125: }
1126:
1127: register STATUS_2840 {
1128: address 0x0c1
1129: access_mode RW
1130: field EEPROM_TF 0x80
1131: mask BIOS_SEL 0x60
1132: mask ADSEL 0x1e
1133: field DI_2840 0x01
1134: }
1135:
1136: /* --------------------- AIC-7870-only definitions -------------------- */
1137:
1138: register CCHADDR {
1139: address 0x0E0
1140: size 8
1141: }
1142:
1143: register CCHCNT {
1144: address 0x0E8
1145: }
1146:
1147: register CCSGRAM {
1148: address 0x0E9
1149: }
1150:
1151: register CCSGADDR {
1152: address 0x0EA
1153: }
1154:
1155: register CCSGCTL {
1156: address 0x0EB
1157: field CCSGDONE 0x80
1158: field CCSGEN 0x08
1159: field SG_FETCH_NEEDED 0x02 /* Bit used for software state */
1160: field CCSGRESET 0x01
1161: }
1162:
1163: register CCSCBCNT {
1164: address 0xEF
1165: }
1166:
1167: register CCSCBCTL {
1168: address 0x0EE
1169: field CCSCBDONE 0x80
1170: field ARRDONE 0x40 /* SCB Array prefetch done */
1171: field CCARREN 0x10
1172: field CCSCBEN 0x08
1173: field CCSCBDIR 0x04
1174: field CCSCBRESET 0x01
1175: }
1176:
1177: register CCSCBADDR {
1178: address 0x0ED
1179: }
1180:
1181: register CCSCBRAM {
1182: address 0xEC
1183: }
1184:
1185: /*
1186: * SCB bank address (7895/7896/97 only)
1187: */
1188: register SCBBADDR {
1189: address 0x0F0
1190: access_mode RW
1191: }
1192:
1193: register CCSCBPTR {
1194: address 0x0F1
1195: }
1196:
1197: register HNSCB_QOFF {
1198: address 0x0F4
1199: }
1200:
1201: register SNSCB_QOFF {
1202: address 0x0F6
1203: }
1204:
1205: register SDSCB_QOFF {
1206: address 0x0F8
1207: }
1208:
1209: register QOFF_CTLSTA {
1210: address 0x0FA
1211: field SCB_AVAIL 0x40
1212: field SNSCB_ROLLOVER 0x20
1213: field SDSCB_ROLLOVER 0x10
1214: mask SCB_QSIZE 0x07
1215: mask SCB_QSIZE_256 0x06
1216: }
1217:
1218: register DFF_THRSH {
1219: address 0x0FB
1220: mask WR_DFTHRSH 0x70
1221: mask RD_DFTHRSH 0x07
1222: mask RD_DFTHRSH_MIN 0x00
1223: mask RD_DFTHRSH_25 0x01
1224: mask RD_DFTHRSH_50 0x02
1225: mask RD_DFTHRSH_63 0x03
1226: mask RD_DFTHRSH_75 0x04
1227: mask RD_DFTHRSH_85 0x05
1228: mask RD_DFTHRSH_90 0x06
1229: mask RD_DFTHRSH_MAX 0x07
1230: mask WR_DFTHRSH_MIN 0x00
1231: mask WR_DFTHRSH_25 0x10
1232: mask WR_DFTHRSH_50 0x20
1233: mask WR_DFTHRSH_63 0x30
1234: mask WR_DFTHRSH_75 0x40
1235: mask WR_DFTHRSH_85 0x50
1236: mask WR_DFTHRSH_90 0x60
1237: mask WR_DFTHRSH_MAX 0x70
1238: }
1239:
1240: register SG_CACHE_PRE {
1241: access_mode WO
1242: address 0x0fc
1243: mask SG_ADDR_MASK 0xf8
1244: field LAST_SEG 0x02
1245: field LAST_SEG_DONE 0x01
1246: }
1247:
1248: register SG_CACHE_SHADOW {
1249: access_mode RO
1250: address 0x0fc
1251: mask SG_ADDR_MASK 0xf8
1252: field LAST_SEG 0x02
1253: field LAST_SEG_DONE 0x01
1254: }
1255: /* ---------------------- Scratch RAM Offsets ------------------------- */
1256: /* These offsets are either to values that are initialized by the board's
1257: * BIOS or are specified by the sequencer code.
1258: *
1259: * The host adapter card (at least the BIOS) uses 20-2f for SCSI
1260: * device information, 32-33 and 5a-5f as well. As it turns out, the
1261: * BIOS trashes 20-2f, writing the synchronous negotiation results
1262: * on top of the BIOS values, so we re-use those for our per-target
1263: * scratchspace (actually a value that can be copied directly into
1264: * SCSIRATE). The kernel driver will enable synchronous negotiation
1265: * for all targets that have a value other than 0 in the lower four
1266: * bits of the target scratch space. This should work regardless of
1267: * whether the bios has been installed.
1268: */
1269:
1270: scratch_ram {
1271: address 0x020
1272: size 58
1273:
1274: /*
1275: * 1 byte per target starting at this address for configuration values
1276: */
1277: BUSY_TARGETS {
1278: alias TARG_SCSIRATE
1279: size 16
1280: }
1281: /*
1282: * Bit vector of targets that have ULTRA enabled as set by
1283: * the BIOS. The Sequencer relies on a per-SCB field to
1284: * control whether to enable Ultra transfers or not. During
1285: * initialization, we read this field and reuse it for 2
1286: * entries in the busy target table.
1287: */
1288: ULTRA_ENB {
1289: alias CMDSIZE_TABLE
1290: size 2
1291: }
1292: /*
1293: * Bit vector of targets that have disconnection disabled as set by
1294: * the BIOS. The Sequencer relies in a per-SCB field to control the
1295: * disconnect priveldge. During initialization, we read this field
1296: * and reuse it for 2 entries in the busy target table.
1297: */
1298: DISC_DSB {
1299: size 2
1300: }
1301: CMDSIZE_TABLE_TAIL {
1302: size 4
1303: }
1304: /*
1305: * Partial transfer past cacheline end to be
1306: * transferred using an extra S/G.
1307: */
1308: MWI_RESIDUAL {
1309: size 1
1310: }
1311: /*
1312: * SCBID of the next SCB to be started by the controller.
1313: */
1314: NEXT_QUEUED_SCB {
1315: size 1
1316: }
1317: /*
1318: * Single byte buffer used to designate the type or message
1319: * to send to a target.
1320: */
1321: MSG_OUT {
1322: size 1
1323: }
1324: /* Parameters for DMA Logic */
1325: DMAPARAMS {
1326: size 1
1327: field PRELOADEN 0x80
1328: field WIDEODD 0x40
1329: field SCSIEN 0x20
1330: field SDMAEN 0x10
1331: field SDMAENACK 0x10
1332: field HDMAEN 0x08
1333: field HDMAENACK 0x08
1334: field DIRECTION 0x04 /* Set indicates PCI->SCSI */
1335: field FIFOFLUSH 0x02
1336: field FIFORESET 0x01
1337: }
1338: SEQ_FLAGS {
1339: size 1
1340: field NOT_IDENTIFIED 0x80
1341: field NO_CDB_SENT 0x40
1342: field TARGET_CMD_IS_TAGGED 0x40
1343: field DPHASE 0x20
1344: /* Target flags */
1345: field TARG_CMD_PENDING 0x10
1346: field CMDPHASE_PENDING 0x08
1347: field DPHASE_PENDING 0x04
1348: field SPHASE_PENDING 0x02
1349: field NO_DISCONNECT 0x01
1350: }
1351: /*
1352: * Temporary storage for the
1353: * target/channel/lun of a
1354: * reconnecting target
1355: */
1356: SAVED_SCSIID {
1357: size 1
1358: }
1359: SAVED_LUN {
1360: size 1
1361: }
1362: /*
1363: * The last bus phase as seen by the sequencer.
1364: */
1365: LASTPHASE {
1366: size 1
1367: field CDI 0x80
1368: field IOI 0x40
1369: field MSGI 0x20
1370: mask PHASE_MASK CDI|IOI|MSGI
1371: mask P_DATAOUT 0x00
1372: mask P_DATAIN IOI
1373: mask P_COMMAND CDI
1374: mask P_MESGOUT CDI|MSGI
1375: mask P_STATUS CDI|IOI
1376: mask P_MESGIN CDI|IOI|MSGI
1377: mask P_BUSFREE 0x01
1378: }
1379: /*
1380: * head of list of SCBs awaiting
1381: * selection
1382: */
1383: WAITING_SCBH {
1384: size 1
1385: }
1386: /*
1387: * head of list of SCBs that are
1388: * disconnected. Used for SCB
1389: * paging.
1390: */
1391: DISCONNECTED_SCBH {
1392: size 1
1393: }
1394: /*
1395: * head of list of SCBs that are
1396: * not in use. Used for SCB paging.
1397: */
1398: FREE_SCBH {
1399: size 1
1400: }
1401: /*
1402: * head of list of SCBs that have
1403: * completed but have not been
1404: * put into the qoutfifo.
1405: */
1406: COMPLETE_SCBH {
1407: size 1
1408: }
1409: /*
1410: * Address of the hardware scb array in the host.
1411: */
1412: HSCB_ADDR {
1413: size 4
1414: }
1415: /*
1416: * Base address of our shared data with the kernel driver in host
1417: * memory. This includes the qoutfifo and target mode
1418: * incoming command queue.
1419: */
1420: SHARED_DATA_ADDR {
1421: size 4
1422: }
1423: KERNEL_QINPOS {
1424: size 1
1425: }
1426: QINPOS {
1427: size 1
1428: }
1429: QOUTPOS {
1430: size 1
1431: }
1432: /*
1433: * Kernel and sequencer offsets into the queue of
1434: * incoming target mode command descriptors. The
1435: * queue is full when the KERNEL_TQINPOS == TQINPOS.
1436: */
1437: KERNEL_TQINPOS {
1438: size 1
1439: }
1440: TQINPOS {
1441: size 1
1442: }
1443: ARG_1 {
1444: size 1
1445: mask SEND_MSG 0x80
1446: mask SEND_SENSE 0x40
1447: mask SEND_REJ 0x20
1448: mask MSGOUT_PHASEMIS 0x10
1449: mask EXIT_MSG_LOOP 0x08
1450: mask CONT_MSG_LOOP 0x04
1451: mask CONT_TARG_SESSION 0x02
1452: alias RETURN_1
1453: }
1454: ARG_2 {
1455: size 1
1456: alias RETURN_2
1457: }
1458:
1459: /*
1460: * Snapshot of MSG_OUT taken after each message is sent.
1461: */
1462: LAST_MSG {
1463: size 1
1464: alias TARG_IMMEDIATE_SCB
1465: }
1466:
1467: /*
1468: * Sequences the kernel driver has okayed for us. This allows
1469: * the driver to do things like prevent initiator or target
1470: * operations.
1471: */
1472: SCSISEQ_TEMPLATE {
1473: size 1
1474: field ENSELO 0x40
1475: field ENSELI 0x20
1476: field ENRSELI 0x10
1477: field ENAUTOATNO 0x08
1478: field ENAUTOATNI 0x04
1479: field ENAUTOATNP 0x02
1480: }
1481: }
1482:
1483: scratch_ram {
1484: address 0x056
1485: size 4
1486: /*
1487: * These scratch ram locations are initialized by the 274X BIOS.
1488: * We reuse them after capturing the BIOS settings during
1489: * initialization.
1490: */
1491:
1492: /*
1493: * The initiator specified tag for this target mode transaction.
1494: */
1495: HA_274_BIOSGLOBAL {
1496: size 1
1497: field HA_274_EXTENDED_TRANS 0x01
1498: alias INITIATOR_TAG
1499: }
1500:
1501: SEQ_FLAGS2 {
1502: size 1
1503: field SCB_DMA 0x01
1504: field TARGET_MSG_PENDING 0x02
1505: }
1506: }
1507:
1508: scratch_ram {
1509: address 0x05a
1510: size 6
1511: /*
1512: * These are reserved registers in the card's scratch ram on the 2742.
1513: * The EISA configuraiton chip is mapped here. On Rev E. of the
1514: * aic7770, the sequencer can use this area for scratch, but the
1515: * host cannot directly access these registers. On later chips, this
1516: * area can be read and written by both the host and the sequencer.
1517: * Even on later chips, many of these locations are initialized by
1518: * the BIOS.
1519: */
1520: SCSICONF {
1521: size 1
1522: field TERM_ENB 0x80
1523: field RESET_SCSI 0x40
1524: field ENSPCHK 0x20
1525: mask HSCSIID 0x07 /* our SCSI ID */
1526: mask HWSCSIID 0x0f /* our SCSI ID if Wide Bus */
1527: }
1528: INTDEF {
1529: address 0x05c
1530: size 1
1531: field EDGE_TRIG 0x80
1532: mask VECTOR 0x0f
1533: }
1534: HOSTCONF {
1535: address 0x05d
1536: size 1
1537: }
1538: HA_274_BIOSCTRL {
1539: address 0x05f
1540: size 1
1541: mask BIOSMODE 0x30
1542: mask BIOSDISABLED 0x30
1543: field CHANNEL_B_PRIMARY 0x08
1544: }
1545: }
1546:
1547: scratch_ram {
1548: address 0x070
1549: size 16
1550:
1551: /*
1552: * Per target SCSI offset values for Ultra2 controllers.
1553: */
1554: TARG_OFFSET {
1555: size 16
1556: }
1557: }
1558:
1559: const TID_SHIFT 4
1560: const SCB_LIST_NULL 0xff
1561: const TARGET_CMD_CMPLT 0xfe
1562:
1563: const CCSGADDR_MAX 0x80
1564: const CCSGRAM_MAXSEGS 16
1565:
1566: /* WDTR Message values */
1567: const BUS_8_BIT 0x00
1568: const BUS_16_BIT 0x01
1569: const BUS_32_BIT 0x02
1570:
1571: /* Offset maximums */
1572: const MAX_OFFSET_8BIT 0x0f
1573: const MAX_OFFSET_16BIT 0x08
1574: const MAX_OFFSET_ULTRA2 0x7f
1575: const MAX_OFFSET 0x7f
1576: const HOST_MSG 0xff
1577:
1578: /* Target mode command processing constants */
1579: const CMD_GROUP_CODE_SHIFT 0x05
1580:
1581: const STATUS_BUSY 0x08
1582: const STATUS_QUEUE_FULL 0x28
1583: const TARGET_DATA_IN 1
1584:
1585: /*
1586: * Downloaded (kernel inserted) constants
1587: */
1588: /* Offsets into the SCBID array where different data is stored */
1589: const QOUTFIFO_OFFSET download
1590: const QINFIFO_OFFSET download
1591: const CACHESIZE_MASK download
1592: const INVERTED_CACHESIZE_MASK download
1593: const SG_PREFETCH_CNT download
1594: const SG_PREFETCH_ALIGN_MASK download
1595: const SG_PREFETCH_ADDR_MASK download
CVSweb