xref: /openbsd/sys/dev/ic/iha.h (revision 7380a3a4)
1 /*	$OpenBSD: iha.h,v 1.24 2020/07/22 13:16:04 krw Exp $ */
2 /*-------------------------------------------------------------------------
3  *
4  * Device driver for the INI-9XXXU/UW or INIC-940/950  PCI SCSI Controller.
5  *
6  * Written for 386bsd and FreeBSD by
7  *	Winston Hung		<winstonh@initio.com>
8  *
9  * Copyright (c) 1997-1999 Initio Corp
10  * Copyright (c) 2000-2002 Ken Westerback
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer,
17  *    without modification, immediately at the beginning of the file.
18  * 2. The name of the author may not be used to endorse or promote products
19  *    derived from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31  * THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  *-------------------------------------------------------------------------
34  */
35 
36 #define IHA_MAX_SG_ENTRIES	33
37 #define IHA_MAX_TARGETS		16
38 #define IHA_MAX_SCB		32
39 #define IHA_MAX_EXTENDED_MSG	 4 /* SDTR(3) and WDTR(4) only */
40 
41 /*
42  *   Scatter-Gather Element Structure
43  */
44 struct iha_sg_element {
45 	u_int32_t SG_Addr; /* Physical address of segment */
46 	u_int32_t SG_Len;  /* Length of segment */
47 };
48 
49 /*
50  * iha_scb - SCSI Request structure used by the
51  *	     Tulip (aka inic-940/950). Note that 32
52  *	     bit pointers and ints are assumed!
53  */
54 
55 struct iha_scb {
56 	TAILQ_ENTRY(iha_scb) SCB_ScbList;
57 
58 	bus_dmamap_t	SCB_DataDma;	/* maps xfer buffer	     */
59 	bus_dmamap_t	SCB_SGDma;	/* maps scatter-gather list  */
60 
61 	int	  SCB_Status;		   /* Current status of the SCB	     */
62 #define		      STATUS_QUEUED   0	   /*	   SCB one of Free/Done/Pend */
63 #define		      STATUS_RENT     1	   /*	   SCB allocated, not queued */
64 #define		      STATUS_SELECT   2	   /*	   SCB being selected	     */
65 #define		      STATUS_BUSY     3	   /*	   SCB I/O is active	     */
66 	u_int8_t  SCB_NxtStat;		   /* Next state function to apply   */
67 	int	  SCB_Flags;		   /* SCB Flags (xs->flags + private)*/
68 #define		      FLAG_RSENS      0x00010000 /*	 Request Sense sent  */
69 #define		      FLAG_SG	      0x00020000 /*      Scatter/Gather used */
70 #define		      FLAG_DIR	      (SCSI_DATA_IN | SCSI_DATA_OUT)
71 	u_int8_t  SCB_Target;		   /* Target Id			     */
72 	u_int8_t  SCB_Lun;		   /* Lun			     */
73 	u_int32_t SCB_BufChars;		   /* size of data buf		     */
74 	u_int32_t SCB_BufCharsLeft;	   /* Chars left to xfer to/from buf */
75 	u_int8_t  SCB_HaStat;		   /* Status of Host Adapter	     */
76 #define		      HOST_OK	      0x00 /*	   OK - operation a success  */
77 #define		      HOST_TIMED_OUT  0x01 /*      Request timed out         */
78 #define		      HOST_SPERR      0x10 /*	   SCSI parity error	     */
79 #define		      HOST_SEL_TOUT   0x11 /*	   Selection Timeout	     */
80 #define		      HOST_DO_DU      0x12 /*	   Data Over/Underrun	     */
81 #define		      HOST_BAD_PHAS   0x14 /*	   Unexpected SCSI bus phase */
82 #define		      HOST_SCSI_RST   0x1B /*	   SCSI bus was reset	     */
83 #define		      HOST_DEV_RST    0x1C /*	   Device was reset	     */
84 	u_int8_t  SCB_TaStat;		   /* SCSI Status Byte		     */
85 	u_int8_t  SCB_Ident;		   /* Identity Message		     */
86 	u_int8_t  SCB_TagMsg;		   /* Tag Message		     */
87 	u_int8_t  SCB_TagId;		   /* Queue Tag			     */
88 
89 	u_int8_t  SCB_CDB[12];		   /* SCSI command being executed    */
90 	u_int8_t  SCB_CDBLen;		   /* Length of SCSI command in CDB  */
91 
92 	struct scsi_xfer *SCB_Xs;	   /* xs this SCB is executing	     */
93 
94 	struct iha_sg_element SCB_SGList[IHA_MAX_SG_ENTRIES]; /* SG list     */
95 	u_int16_t SCB_SGCount;		   /* # segments in list             */
96 	u_int16_t SCB_SGIdx;		   /* index to current element       */
97 
98 	struct scsi_sense_data	SCB_ScsiSenseData; /* DMA-able sense buffer  */
99 	struct tcs	       *SCB_Tcs;   	   /* tcs for SCB_Target     */
100 };
101 
102 /*
103  *   Target Device Control Structure
104  */
105 struct tcs {
106 	u_int16_t TCS_Flags;
107 #define		      FLAG_SCSI_RATE	 0x0007 /* Index into tul_rate_tbl[] */
108 #define		      FLAG_EN_DISC	 0x0008 /* Enable disconnect	     */
109 #define		      FLAG_NO_SYNC	 0x0010 /* No sync data transfer     */
110 #define		      FLAG_NO_WIDE	 0x0020 /* No wide data transfer     */
111 #define		      FLAG_1GIGA	 0x0040 /* 255 hd/63 sec (64/32)     */
112 #define		      FLAG_SPINUP	 0x0080 /* Start disk drive	     */
113 #define		      FLAG_WIDE_DONE	 0x0100 /* WDTR msg has been sent    */
114 #define		      FLAG_SYNC_DONE	 0x0200 /* SDTR msg has been sent    */
115 #define		      FLAG_NO_NEG_SYNC   (FLAG_NO_SYNC | FLAG_SYNC_DONE)
116 #define		      FLAG_NO_NEG_WIDE   (FLAG_NO_WIDE | FLAG_WIDE_DONE)
117 	u_int8_t  TCS_JS_Period;
118 #define		      PERIOD_WIDE_SCSI	 0x80	/* Enable Wide SCSI	     */
119 #define		      PERIOD_SYXPD	 0x70	/* Synch. SCSI Xfer rate     */
120 #define		      PERIOD_SYOFS	 0x0f	/* Synch. SCSI Offset	     */
121 	u_int8_t  TCS_SConfig0;
122 	u_int8_t  TCS_TagCnt;
123 
124 	struct iha_scb  *TCS_NonTagScb;
125 };
126 
127 struct iha_softc {
128 	struct device	     sc_dev;
129 
130 	bus_space_tag_t	     sc_iot;
131 	bus_space_handle_t   sc_ioh;
132 
133 	bus_dma_tag_t	     sc_dmat;
134 	bus_dmamap_t	     sc_dmamap;
135 
136 	u_int16_t	     sc_id;
137 	u_int16_t	     sc_maxtargets;
138 
139 	void		    *sc_ih;
140 
141 	/*
142 	 *   Initio specific fields
143 	 */
144 	u_int8_t  HCS_Flags;
145 #define		      FLAG_EXPECT_DISC	     0x01
146 #define		      FLAG_EXPECT_SELECT     0x02
147 #define		      FLAG_EXPECT_RESET	     0x10
148 #define		      FLAG_EXPECT_DONE_DISC  0x20
149 	u_int8_t  HCS_Semaph;
150 #define		      SEMAPH_IN_MAIN	     0x00   /* Already in tulip_main */
151 	u_int8_t  HCS_Phase;			    /* MSG  C/D	 I/O	     */
152 #define		      PHASE_DATA_OUT	     0x00   /*	0    0	  0	     */
153 #define		      PHASE_DATA_IN	     0x01   /*	0    0	  1	     */
154 #define		      PHASE_CMD_OUT	     0x02   /*	0    1	  0	     */
155 #define		      PHASE_STATUS_IN	     0x03   /*	0    1	  1	     */
156 #define		      PHASE_MSG_OUT	     0x06   /*	1    1	  0	     */
157 #define		      PHASE_MSG_IN	     0x07   /*	1    1	  1	     */
158 	u_int8_t  HCS_JSInt;
159 	u_int8_t  HCS_JSStatus0;
160 	u_int8_t  HCS_JSStatus1;
161 	u_int8_t  HCS_SConf1;
162 	u_int8_t  HCS_Msg[IHA_MAX_EXTENDED_MSG];    /* [0] len, [1] Msg Code */
163 
164 	struct iha_scb *HCS_Scb;		    /* SCB array	     */
165 	struct iha_scb *HCS_ActScb;	    /* SCB using SCSI bus    */
166 
167 	TAILQ_HEAD(, iha_scb) HCS_FreeScb, HCS_PendScb, HCS_DoneScb;
168 
169 	struct tcs HCS_Tcs[IHA_MAX_TARGETS];
170 
171 	struct mutex		sc_scb_mtx;	/* scb queue protection */
172 	struct scsi_iopool	sc_iopool;
173 };
174 
175 /*
176  *   EEPROM for one SCSI Channel
177  *
178  */
179 struct iha_nvram_scsi {
180 	u_int8_t  NVM_SCSI_Id;	    /* 0x00 Channel Adapter SCSI Id          */
181 	u_int8_t  NVM_SCSI_Cfg;	    /* 0x01 Channel configuration            */
182 #define		      CFG_SCSI_RESET 0x0001 /*     Reset bus at power up     */
183 #define		      CFG_EN_PAR     0x0002 /*     SCSI parity enable        */
184 #define		      CFG_ACT_TERM1  0x0004 /*     Enable active term 1      */
185 #define		      CFG_ACT_TERM2  0x0008 /*     Enable active term 2      */
186 #define		      CFG_AUTO_TERM  0x0010 /*     Enable auto terminator    */
187 #define		      CFG_EN_PWR     0x0080 /*     Enable power mgmt         */
188 	u_int8_t  NVM_SCSI_CfgByte2;        /* 0x02 Unused Channel Cfg byte 2*/
189 	u_int8_t  NVM_SCSI_Targets;	    /* 0x03 Number of SCSI targets   */
190 					    /* 0x04 Lower bytes of targ flags*/
191 	u_int8_t  NVM_SCSI_TargetFlags[IHA_MAX_TARGETS];
192 };
193 
194 /*
195  * Tulip (aka ini-940/950) Serial EEPROM Layout
196  *
197  */
198 struct iha_nvram {
199 	/* ---------- Header ------------------------------------------------*/
200 	u_int16_t  NVM_Signature;	       /* 0x00 NVRAM Signature	     */
201 #define		       SIGNATURE	0xC925
202 	u_int8_t   NVM_Size;		       /* 0x02 Size of data structure*/
203 	u_int8_t   NVM_Revision;	       /* 0x03 Rev. of data structure*/
204 
205 	/* ---------- Host Adapter Structure --------------------------------*/
206 	u_int8_t   NVM_ModelByte0;	       /* 0x04 Model number (byte 0) */
207 	u_int8_t   NVM_ModelByte1;	       /* 0x05 Model number (byte 1) */
208 	u_int8_t   NVM_ModelInfo;	       /* 0x06 Model information     */
209 	u_int8_t   NVM_NumOfCh;		       /* 0x07 Number of SCSI channel*/
210 	u_int8_t   NVM_BIOSConfig1;	       /* 0x08 BIOS configuration 1  */
211 #define		       BIOSCFG_ENABLE	  0x01 /*      BIOS enable	     */
212 #define		       BIOSCFG_8DRIVE	  0x02 /*      Support > 2 drives    */
213 #define		       BIOSCFG_REMOVABLE  0x04 /*      Support removable drv */
214 #define		       BIOSCFG_INT19	  0x08 /*      Intercept int 19h     */
215 #define		       BIOSCFG_BIOSSCAN	  0x10 /*      Dynamic BIOS scan     */
216 #define		       BIOSCFG_LUNSUPPORT 0x40 /*      Support LUN	     */
217 #define		       BIOSCFG_DEFAULT	  (BIOSCFG_ENABLE)
218 	u_int8_t   NVM_BIOSConfig2;	       /* 0x09 BIOS configuration 2  */
219 	u_int8_t   NVM_HAConfig1;	       /* 0x0a Host adapter config 1 */
220 #define		       HACFG_BOOTIDMASK	  0x0F /*      Boot ID number	     */
221 #define		       HACFG_LUNMASK	  0x70 /*      Boot LUN number	     */
222 #define		       HACFG_CHANMASK	  0x80 /*      Boot Channel number   */
223 	u_int8_t   NVM_HAConfig2;	       /* 0x0b Host adapter config 2 */
224 	struct iha_nvram_scsi NVM_Scsi[2];     /* 0x0c		             */
225 	u_int8_t   NVM_Reserved[10];	       /* 0x34			     */
226 
227 	/* --------- CheckSum -----------------------------------------------*/
228 	u_int16_t  NVM_CheckSum;	       /* 0x3E Checksum of NVRam     */
229 };
230 
231 /*
232  *  Tulip (aka inic-940/950) PCI Configuration Space Initio Specific Registers
233  *
234  *  Offsets 0x00 through 0x3f are the standard PCI Configuration Header
235  *  registers.
236  *
237  *  Offsets 0x40 through 0x4f, 0x51, 0x53, 0x57, 0x5b, 0x5e and 0x5f are
238  *  reserved registers.
239  *
240  *  Registers 0x50 and 0x52 always read as 0.
241  *
242  *  The register offset names and associated bit field names are taken
243  *  from the Inic-950 Data Sheet, Version 2.1, March 1997
244  */
245 #define TUL_GCTRL0	0x54	       /* R/W Global Control 0		     */
246 #define	    EEPRG	    0x04       /*     Enable EEPROM Programming	     */
247 #define TUL_GCTRL1	0x55	       /* R/W Global Control 1		     */
248 #define	    ATDEN	    0x01       /*     Auto Termination Detect Enable */
249 #define TUL_GSTAT	0x56	       /* R/W Global Status - connector type */
250 #define TUL_EPAD0	0x58	       /* R/W External EEPROM Addr (lo byte) */
251 #define TUL_EPAD1	0x59	       /* R/W External EEPROM Addr (hi byte) */
252 #define TUL_PNVPG	0x5A	       /* R/W Data port to external BIOS     */
253 #define TUL_EPDATA	0x5C	       /* R/W EEPROM Data port		     */
254 #define TUL_NVRAM	0x5D	       /* R/W Non-volatile RAM port	     */
255 #define     NVREAD	    0x80       /*     Read from given NVRAM addr     */
256 #define     NVWRITE         0x40       /*     Write to given NVRAM addr	     */
257 #define     NVENABLE_ERASE  0x30       /*     Enable NVRAM Erase/Write       */
258 #define	    NVRCS	    0x08       /*     Select external NVRAM	     */
259 #define	    NVRCK	    0x04       /*     NVRAM Clock		     */
260 #define	    NVRDO	    0x02       /*     NVRAM Write Data		     */
261 #define	    NVRDI	    0x01       /*     NVRAM Read  Data		     */
262 
263 /*
264  *   Tulip (aka inic-940/950) SCSI Registers
265  */
266 #define TUL_STCNT0	0x80	       /* R/W 24 bit SCSI Xfer Count	     */
267 #define	    TCNT	    0x00ffffff /*     SCSI Xfer Transfer Count	     */
268 #define TUL_SFIFOCNT	0x83	       /* R/W  5 bit FIFO counter	     */
269 #define	    FIFOC	    0x1f       /*     SCSI Offset Fifo Count	     */
270 #define TUL_SISTAT	0x84	       /* R   Interrupt Register	     */
271 #define	    RSELED	    0x80       /*     Reselected		     */
272 #define	    STIMEO	    0x40       /*     Selected/Reselected Timeout    */
273 #define	    SBSRV	    0x20       /*     SCSI Bus Service		     */
274 #define	    SRSTD	    0x10       /*     SCSI Reset Detected	     */
275 #define	    DISCD	    0x08       /*     Disconnected Status	     */
276 #define	    SELED	    0x04       /*     Select Interrupt		     */
277 #define	    SCAMSCT	    0x02       /*     SCAM selected		     */
278 #define	    SCMDN	    0x01       /*     Command Complete		     */
279 #define TUL_SIEN	0x84	       /* W   Interrupt enable		     */
280 #define	    ALL_INTERRUPTS  0xff
281 #define TUL_STAT0	0x85	       /* R   Status 0			     */
282 #define	    INTPD	    0x80       /*     Interrupt pending		     */
283 #define	    SQACT	    0x40       /*     Sequencer active		     */
284 #define	    XFCZ	    0x20       /*     Xfer counter zero		     */
285 #define	    SFEMP	    0x10       /*     FIFO empty		     */
286 #define	    SPERR	    0x08       /*     SCSI parity error		     */
287 #define	    PH_MASK	    0x07       /*     SCSI phase mask		     */
288 #define TUL_SCTRL0	0x85	       /* W   Control 0			     */
289 #define	    RSSQC	    0x20       /*     Reset sequence counter	     */
290 #define	    RSFIFO	    0x10       /*     Flush FIFO		     */
291 #define	    CMDAB	    0x04       /*     Abort command (sequence)	     */
292 #define	    RSMOD	    0x02       /*     Reset SCSI Chip		     */
293 #define	    RSCSI	    0x01       /*     Reset SCSI Bus		     */
294 #define TUL_STAT1	0x86	       /* R   Status 1			     */
295 #define	    STRCV	    0x80       /*     Status received		     */
296 #define	    MSGST	    0x40       /*     Message sent		     */
297 #define	    CPDNE	    0x20       /*     Data phase done		     */
298 #define	    DPHDN	    0x10       /*     Data phase done		     */
299 #define	    STSNT	    0x08       /*     Status sent		     */
300 #define	    SXCMP	    0x04       /*     Xfer completed		     */
301 #define	    SLCMP	    0x02       /*     Selection completed	     */
302 #define	    ARBCMP	    0x01       /*     Arbitration completed	     */
303 #define TUL_SCTRL1	0x86	       /* W   Control 1			     */
304 #define	    ENSCAM	    0x80       /*     Enable SCAM		     */
305 #define	    NIDARB	    0x40       /*     No ID for Arbitration	     */
306 #define	    ENLRS	    0x20       /*     Low Level Reselect	     */
307 #define	    PWDN	    0x10       /*     Power down mode		     */
308 #define	    WCPU	    0x08       /*     Wide CPU			     */
309 #define	    EHRSL	    0x04       /*     Enable HW reselect	     */
310 #define	    ESBUSOUT	    0x02       /*     Enable SCSI data bus out latch */
311 #define	    ESBUSIN	    0x01       /*     Enable SCSI data bus in latch  */
312 #define TUL_SSTATUS2	0x87	       /* R   Status 2			     */
313 #define	    SABRT	    0x80       /*     Command aborted		     */
314 #define	    OSCZ	    0x40       /*     Offset counter zero	     */
315 #define	    SFFUL	    0x20       /*     FIFO full			     */
316 #define	    TMCZ	    0x10       /*     Timeout counter zero	     */
317 #define	    BSYGN	    0x08       /*     Busy release		     */
318 #define	    PHMIS	    0x04       /*     Phase mismatch		     */
319 #define	    SBEN	    0x02       /*     SCSI data bus enable	     */
320 #define	    SRST	    0x01       /*     SCSI bus reset in progress     */
321 #define TUL_SCONFIG0	0x87	       /* W   Configuration		     */
322 #define	    PHLAT	    0x80       /*     Enable phase latch	     */
323 #define	    ITMOD	    0x40       /*     Initiator mode		     */
324 #define	    SPCHK	    0x20       /*     Enable SCSI parity	     */
325 #define	    ADMA8	    0x10       /*     Alternate dma 8-bits mode	     */
326 #define	    ADMAW	    0x08       /*     Alternate dma 16-bits mode     */
327 #define	    EDACK	    0x04       /*     Enable DACK in wide SCSI xfer  */
328 #define	    ALTPD	    0x02       /*     Alternate sync period mode     */
329 #define	    DSRST	    0x01       /*     Disable SCSI Reset signal	     */
330 #define	    SCONFIG0DEFAULT (PHLAT | ITMOD | ALTPD | DSRST)
331 #define TUL_SOFSC	0x88	       /* R   Offset			     */
332 #define TUL_SYNCM	0x88	       /* W   Sync. Xfer Period & Offset     */
333 #define TUL_SBID	0x89	       /* R   SCSI BUS ID		     */
334 #define TUL_SID		0x89	       /* W   SCSI ID			     */
335 #define TUL_SALVC	0x8A	       /* R   FIFO Avail Cnt/Identify Msg    */
336 #define TUL_STIMO	0x8A	       /* W   Sel/Resel Time Out Register    */
337 #define TUL_SDATI	0x8B	       /* R   SCSI Bus contents		     */
338 #define TUL_SDAT0	0x8B	       /* W   SCSI Data Out		     */
339 #define TUL_SFIFO	0x8C	       /* R/W FIFO			     */
340 #define TUL_SSIGI	0x90	       /* R   SCSI signal in		     */
341 #define	    REQ		    0x80       /*     REQ signal		     */
342 #define	    ACK		    0x40       /*     ACK signal		     */
343 #define	    BSY		    0x20       /*     BSY signal		     */
344 #define	    SEL		    0x10       /*     SEL signal		     */
345 #define	    ATN		    0x08       /*     ATN signal		     */
346 #define	    MSG		    0x04       /*     MSG signal		     */
347 #define	    CD		    0x02       /*     C/D signal		     */
348 #define	    IO		    0x01       /*     I/O signal		     */
349 #define TUL_SSIGO	0x90	       /* W   SCSI signal out		     */
350 #define TUL_SCMD	0x91	       /* R/W SCSI Command		     */
351 #define	    NO_OP	    0x00       /*     Place Holder for tulip_wait()  */
352 #define	    SEL_NOATN	    0x01       /*     Select w/o ATN Sequence	     */
353 #define	    XF_FIFO_OUT	    0x03       /*     FIFO Xfer Information out	     */
354 #define	    MSG_ACCEPT	    0x0F       /*     Message Accept		     */
355 #define	    SEL_ATN	    0x11       /*     Select w ATN Sequence	     */
356 #define	    SEL_ATNSTOP	    0x12       /*     Select w ATN & Stop Sequence   */
357 #define	    SELATNSTOP	    0x1E       /*     Select w ATN & Stop Sequence   */
358 #define	    SEL_ATN3	    0x31       /*     Select w ATN3 Sequence	     */
359 #define	    XF_DMA_OUT	    0x43       /*     DMA Xfer Information out	     */
360 #define	    EN_RESEL	    0x80       /*     Enable Reselection	     */
361 #define	    XF_FIFO_IN	    0x83       /*     FIFO Xfer Information in	     */
362 #define	    CMD_COMP	    0x84       /*     Command Complete Sequence	     */
363 #define	    XF_DMA_IN	    0xC3       /*     DMA Xfer Information in	     */
364 #define TUL_STEST0	0x92	       /* R/W Test0			     */
365 #define TUL_STEST1	0x93	       /* R/W Test1			     */
366 
367 /*
368  *   Tulip (aka inic-940/950) DMA Registers
369  */
370 #define TUL_DXPA	0xC0	       /* R/W DMA      Xfer Physcl Addr	 0-31*/
371 #define TUL_DXPAE	0xC4	       /* R/W DMA      Xfer Physcl Addr 32-63*/
372 #define TUL_DCXA	0xC8	       /* R   DMA Curr Xfer Physcl Addr	 0-31*/
373 #define TUL_DCXAE	0xCC	       /* R   DMA Curr Xfer Physcl Addr 32-63*/
374 #define TUL_DXC		0xD0	       /* R/W DMA Xfer Counter		     */
375 #define TUL_DCXC	0xD4	       /* R   DMA Current Xfer Counter	     */
376 #define TUL_DCMD	0xD8	       /* R/W DMA Command Register	     */
377 #define	    SGXFR	    0x80       /*     Scatter/Gather Xfer	     */
378 #define	    RSVD	    0x40       /*     Reserved - always reads as 0   */
379 #define	    XDIR	    0x20       /*     Xfer Direction 0/1 = out/in    */
380 #define	    BMTST	    0x10       /*     Bus Master Test		     */
381 #define	    CLFIFO	    0x08       /*     Clear FIFO		     */
382 #define	    ABTXFR	    0x04       /*     Abort Xfer		     */
383 #define	    FRXFR	    0x02       /*     Force Xfer		     */
384 #define	    STRXFR	    0x01       /*     Start Xfer		     */
385 #define	    ST_X_IN	    (XDIR | STRXFR)
386 #define	    ST_X_OUT	    (	    STRXFR)
387 #define	    ST_SG_IN	    (SGXFR | ST_X_IN)
388 #define	    ST_SG_OUT	    (SGXFR | ST_X_OUT)
389 #define TUL_ISTUS0	0xDC	       /* R/W Interrupt Status Register	     */
390 #define	    DGINT	    0x80       /*     DMA Global Interrupt	     */
391 #define	    RSVRD0	    0x40       /*     Reserved			     */
392 #define	    RSVRD1	    0x20       /*     Reserved			     */
393 #define	    SCMP	    0x10       /*     SCSI Complete		     */
394 #define	    PXERR	    0x08       /*     PCI Xfer Error		     */
395 #define	    DABT	    0x04       /*     DMA Xfer Aborted		     */
396 #define	    FXCMP	    0x02       /*     Forced Xfer Complete	     */
397 #define	    XCMP	    0x01       /*     Bus Master Xfer Complete	     */
398 #define TUL_ISTUS1	0xDD	       /* R   DMA status Register	     */
399 #define	    SCBSY	    0x08       /*     SCSI Busy			     */
400 #define	    FFULL	    0x04       /*     FIFO Full			     */
401 #define	    FEMPT	    0x02       /*     FIFO Empty		     */
402 #define	    XPEND	    0x01       /*     Xfer pending		     */
403 #define TUL_IMSK	0xE0	       /* R/W Interrupt Mask Register	     */
404 #define	    MSCMP	    0x10       /*     Mask SCSI Complete	     */
405 #define	    MPXFER	    0x08       /*     Mask PCI Xfer Error	     */
406 #define	    MDABT	    0x04       /*     Mask Bus Master Abort	     */
407 #define	    MFCMP	    0x02       /*     Mask Force Xfer Complete	     */
408 #define	    MXCMP	    0x01       /*     Mask Bus Master Xfer Complete  */
409 #define	    MASK_ALL	    (MXCMP | MFCMP | MDABT | MPXFER | MSCMP)
410 #define TUL_DCTRL0	0xE4	       /* R/W DMA Control Register	     */
411 #define	    SXSTP	    0x80       /*     SCSI Xfer Stop		     */
412 #define	    RPMOD	    0x40       /*     Reset PCI Module		     */
413 #define	    RSVRD2	    0x20       /*     SCSI Xfer Stop		     */
414 #define	    PWDWN	    0x10       /*     Power Down		     */
415 #define	    ENTM	    0x08       /*     Enable SCSI Terminator Low     */
416 #define	    ENTMW	    0x04       /*     Enable SCSI Terminator High    */
417 #define	    DISAFC	    0x02       /*     Disable Auto Clear	     */
418 #define	    LEDCTL	    0x01       /*     LED Control		     */
419 #define TUL_DCTRL1	0xE5	       /* R/W DMA Control Register 1	     */
420 #define	    SDWS	    0x01       /*     SCSI DMA Wait State	     */
421 #define TUL_DFIFO	0xE8	       /* R/W DMA FIFO			     */
422 
423 #define TUL_WCTRL	0xF7	       /* ?/? Bus master wait state control  */
424 #define TUL_DCTRL	0xFB	       /* ?/? DMA delay control		     */
425 
426 /* Functions used by higher SCSI layers, the kernel, or iha.c and iha_pci.c  */
427 
428 void iha_scsi_cmd(struct scsi_xfer *);
429 int  iha_intr(void *);
430 int  iha_init_tulip(struct iha_softc *);
431 
432 
433