1139749Simp/*-
2105059Scognet *	File Name : trm.h
3105059Scognet *
4105059Scognet *	Tekram DC395U/UW/F ,DC315/U
5105059Scognet *   PCI SCSI Bus Master Host Adapter Device Driver
6105059Scognet *   (SCSI chip set used Tekram ASIC TRM-S1040)
7105059Scognet *
8139749Simp * (C)Copyright 1995-2001 Tekram Technology Co.,Ltd.
9139749Simp *
10105059Scognet * Redistribution and use in source and binary forms, with or without
11105059Scognet * modification, are permitted provided that the following conditions
12105059Scognet * are met:
13105059Scognet * 1. Redistributions of source code must retain the above copyright
14105059Scognet *    notice, this list of conditions and the following disclaimer.
15105059Scognet * 2. Redistributions in binary form must reproduce the above copyright
16105059Scognet *    notice, this list of conditions and the following disclaimer in the
17105059Scognet *    documentation and/or other materials provided with the distribution.
18105059Scognet * 3. The name of the author may not be used to endorse or promote products
19105059Scognet *    derived from this software without specific prior written permission.
20105059Scognet *
21105059Scognet * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22105059Scognet * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23105059Scognet * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24105059Scognet * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25105059Scognet * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26105059Scognet * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27105059Scognet * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28105059Scognet * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29105059Scognet * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30105059Scognet * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31105059Scognet *
32105059Scognet * $FreeBSD$
33105059Scognet */
34105059Scognet
35105059Scognet#ifndef trm_H
36105059Scognet#define trm_H
37105059Scognet
38105059Scognet/* SCSI CAM */
39105059Scognet
40105059Scognet#define TRM_TRANS_CUR		0x01	/* Modify current neogtiation status */
41105059Scognet#define TRM_TRANS_ACTIVE	0x03	/* Assume this is the active target */
42105059Scognet#define TRM_TRANS_GOAL		0x04	/* Modify negotiation goal */
43105059Scognet#define TRM_TRANS_USER		0x08	/* Modify user negotiation settings */
44105059Scognet
45105059Scognetstruct trm_transinfo {
46105059Scognet	u_int8_t width;
47105059Scognet	u_int8_t period;
48105059Scognet	u_int8_t offset;
49105059Scognet};
50105059Scognet
51105059Scognetstruct trm_target_info {
52105059Scognet	u_int8_t	 		disc_tag;   /* bits define..... */
53105059Scognet#define TRM_CUR_DISCENB	0x01 /* current setting disconnect enable */
54105059Scognet#define TRM_CUR_TAGENB 0x02  /* current setting tag command Q enable */
55105059Scognet#define TRM_USR_DISCENB	0x04 /* user adapter device setting disconnect enable */
56105059Scognet#define TRM_USR_TAGENB 0x08  /* user adapter device setting tag command Q enable*/
57105059Scognet	struct trm_transinfo	current; /* info of current */
58105059Scognet	struct trm_transinfo 	goal;    /* info of after negotiating */
59105059Scognet	struct trm_transinfo 	user;    /* info of user adapter device setting  */
60105059Scognet};
61105059Scognet/*
62105059Scognet * SCSI CAM  **
63105059Scognet */
64105059Scognet
65105059Scognet/*
66105059Scognet *	bus_dma_segment_t
67105059Scognet *
68105059Scognet *	Describes a single contiguous DMA transaction.  Values
69105059Scognet *	are suitable for programming into DMA registers.
70105059Scognet *
71105059Scognet *typedef struct bus_dma_segment
72105059Scognet *{
73105059Scognet *	bus_addr_t	ds_addr;	// DMA address
74105059Scognet *	bus_size_t	ds_len;		// length of transfer
75105059Scognet *} bus_dma_segment_t;
76105059Scognet */
77105059Scognet
78105059Scognet/*;----------------------Segment Entry------------------------------------*/
79105059Scognettypedef  struct  _SGentry {
80111158Scognet       u_int32_t	address;
81111158Scognet       u_int32_t	length;
82105059Scognet} SGentry, *PSEG;
83105059Scognet/*
84105059Scognet *-----------------------------------------------------------------------
85105059Scognet *     feature of chip set MAX value
86105059Scognet *-----------------------------------------------------------------------
87105059Scognet */
88105059Scognet
89111158Scognet#define TRM_MAX_ADAPTER_NUM    	4
90111158Scognet#define TRM_MAX_DEVICES	      	16
91111158Scognet#define TRM_MAX_SG_LISTENTRY   	32
92111158Scognet#define TRM_MAX_TARGETS	       	16
93111158Scognet#define TRM_MAX_TAGS_CMD_QUEUE  256 /* MAX_CMD_QUEUE	20*/
94111158Scognet#define TRM_MAX_CMD_PER_LUN    	32
95111158Scognet#define TRM_MAX_SRB_CNT	       	256
96111158Scognet#define TRM_MAX_START_JOB       256
97195534Sscottl#define TRM_MAXPHYS		(128 * 1024)
98195534Sscottl#define TRM_NSEG	        (btoc(TRM_MAXPHYS) + 1)
99105059Scognet#define TRM_MAXTRANSFER_SIZE    0xFFFFFF /* restricted by 24 bit counter */
100105059Scognet#define PAGELEN 	       	4096
101105059Scognet
102105059Scognet#define SEL_TIMEOUT	    	153	/* 250 ms selection timeout (@ 40MHz) */
103105059Scognet
104105059Scognet/*
105105059Scognet *  CAM ccb
106105059Scognet * Union of all CCB types for kernel space allocation.  This union should
107105059Scognet * never be used for manipulating CCBs - its only use is for the allocation
108105059Scognet * and deallocation of raw CCB space and is the return type of xpt_ccb_alloc
109105059Scognet * and the argument to xpt_ccb_free.
110105059Scognet *
111105059Scognet *union ccb {
112105059Scognet *	struct	ccb_hdr		   	    ccb_h;	// For convenience
113105059Scognet *	struct	ccb_scsiio	        csio;
114105059Scognet *	struct	ccb_getdev	        cgd;
115105059Scognet *	struct	ccb_getdevlist  	cgdl;
116105059Scognet *	struct	ccb_pathinq		    cpi;
117105059Scognet *	struct	ccb_relsim	    	crs;
118105059Scognet *	struct	ccb_setasync		csa;
119105059Scognet *	struct	ccb_setdev	    	csd;
120105059Scognet *	struct	ccb_dev_match		cdm;
121105059Scognet *	struct	ccb_trans_settings	cts;
122105059Scognet *	struct	ccb_calc_geometry	ccg;
123105059Scognet *	struct	ccb_abort	    	cab;
124105059Scognet *	struct	ccb_resetbus		crb;
125105059Scognet *	struct	ccb_resetdev		crd;
126105059Scognet *	struct	ccb_termio	    	tio;
127105059Scognet *	struct	ccb_accept_tio		atio;
128105059Scognet *	struct	ccb_scsiio	    	ctio;
129105059Scognet *	struct	ccb_en_lun	    	cel;
130105059Scognet *	struct	ccb_immed_notify	cin;
131105059Scognet *	struct	ccb_notify_ack		cna;
132105059Scognet *	struct	ccb_eng_inq	    	cei;
133105059Scognet *	struct	ccb_eng_exec		cee;
134105059Scognet *	struct 	ccb_rescan	    	crcn;
135105059Scognet *	struct  ccb_debug	    	cdbg;
136105059Scognet *  };
137105059Scognet */
138105059Scognet
139105059Scognet/*
140105059Scognet *-----------------------------------------------------------------------
141105059Scognet *               SCSI Request Block
142105059Scognet *-----------------------------------------------------------------------
143105059Scognet */
144105059Scognetstruct	_SRB {
145105059Scognet	u_int8_t	CmdBlock[12];
146105059Scognet	u_long		Segment0[2];
147105059Scognet	u_long		Segment1[2];
148105059Scognet	struct _SRB	*pNextSRB;
149105059Scognet	struct _DCB	*pSRBDCB;
150105059Scognet	SGentry		SgSenseTemp;
151111158Scognet
152111158Scognet	PSEG		pSRBSGL;	/* scatter gather list */
153111158Scognet
154111158Scognet	u_int32_t	SRBSGPhyAddr;	/* a segment starting address */
155111158Scognet	u_int32_t	SRBTotalXferLength;
156111158Scognet
157105059Scognet	/*
158105059Scognet	 *	          CAM ccb
159105059Scognet	 */
160111158Scognet	union  ccb      *pccb;
161111158Scognet	bus_dmamap_t	sg_dmamap;
162105059Scognet	bus_dmamap_t	 dmamap;
163105059Scognet	u_int16_t	SRBState;
164105059Scognet	u_int8_t *	pMsgPtr;
165105059Scognet
166105059Scognet    	u_int8_t	SRBSGCount;
167105059Scognet	u_int8_t	SRBSGIndex;
168105059Scognet	u_int8_t	MsgInBuf[6];
169105059Scognet	u_int8_t	MsgOutBuf[6];
170105059Scognet
171105059Scognet	u_int8_t	AdaptStatus;
172105059Scognet	u_int8_t	TargetStatus;
173105059Scognet	u_int8_t	MsgCnt;
174105059Scognet	u_int8_t	TagNumber;
175105059Scognet
176105059Scognet	u_int8_t	SRBStatus;
177105059Scognet	u_int8_t	RetryCnt;
178105059Scognet	u_int8_t	SRBFlag;
179105059Scognet	u_int8_t	ScsiCmdLen;
180105059Scognet	u_int8_t	ScsiPhase;
181105059Scognet	u_int8_t	Reserved[3]; /*;for dword alignment */
182105059Scognet};
183105059Scognettypedef struct _SRB	TRM_SRB, *PSRB;
184105059Scognet
185105059Scognet/*
186105059Scognet *-----------------------------------------------------------------------
187105059Scognet *                   Device Control Block
188105059Scognet *-----------------------------------------------------------------------
189105059Scognet */
190105059Scognetstruct	_DCB
191105059Scognet{
192105059Scognet	PSRB		pWaitingSRB;
193111158Scognet	PSRB		pWaitingLastSRB;
194105059Scognet
195105059Scognet	PSRB		pGoingSRB;
196105059Scognet	PSRB		pGoingLastSRB;
197105059Scognet
198105059Scognet	PSRB		pActiveSRB;
199105059Scognet
200105059Scognet	u_int16_t	GoingSRBCnt;
201111158Scognet	u_int16_t	MaxActiveCommandCnt;
202105059Scognet
203111158Scognet	u_int8_t	TargetID;	/*; SCSI Target ID  (SCSI Only) */
204111158Scognet	u_int8_t	TargetLUN;      /*; SCSI Log.  Unit (SCSI Only) */
205105059Scognet	u_int8_t	DCBFlag;
206105059Scognet	u_int8_t	DevType;
207105059Scognet
208105059Scognet	u_int8_t	SyncMode;   	/* mode ? (1 sync):(0 async)  */
209105059Scognet	u_int8_t	MaxNegoPeriod; 	/* for nego. */
210105059Scognet	u_int8_t	SyncPeriod; 	/* for reg. */
211105059Scognet	u_int8_t	SyncOffset;   	/* for reg. and nego.(low nibble) */
212105059Scognet
213105059Scognet	u_int8_t	DevMode;
214105059Scognet	u_int8_t	AdpMode;
215105059Scognet
216105059Scognet	u_int8_t	IdentifyMsg;
217111158Scognet	u_int8_t	DCBstatus;	/* DCB status */
218111158Scognet	/*u_int8_t	Reserved[3];	for dword alignment */
219111158Scognet	struct		trm_target_info tinfo; /* 10 bytes */
220111158Scognet	struct _DCB	*pNextDCB;
221105059Scognet};
222105059Scognettypedef struct _DCB	TRM_DCB, *PDCB;
223105059Scognet
224105059Scognet/*
225105059Scognet *-----------------------------------------------------------------------
226105059Scognet *                  Adapter Control Block
227105059Scognet *-----------------------------------------------------------------------
228105059Scognet */
229105059Scognetstruct	_ACB
230105059Scognet{
231111158Scognet	device_t		dev;
232111158Scognet
233105059Scognet	bus_space_tag_t		tag;
234105059Scognet	bus_space_handle_t	bsh;
235111158Scognet	bus_dma_tag_t		parent_dmat;
236105059Scognet	bus_dma_tag_t		buffer_dmat;   /* dmat for buffer I/O */
237111158Scognet	bus_dma_tag_t		srb_dmat;
238111158Scognet	bus_dma_tag_t		sense_dmat; /* dmat for sense buffer */
239126725Scognet	bus_dma_tag_t		sg_dmat;
240111158Scognet	bus_dmamap_t		sense_dmamap;
241111158Scognet	bus_dmamap_t		srb_dmamap;
242111158Scognet	bus_addr_t		sense_busaddr;
243111158Scognet	struct scsi_sense_data	*sense_buffers;
244107928Scognet	struct resource		*iores, *irq;
245107928Scognet	void			*ih;
246105059Scognet    /*
247105059Scognet     *	          CAM SIM/XPT
248105059Scognet     */
249105059Scognet	struct	   	 	cam_sim  *psim;
250105059Scognet	struct	    		cam_path *ppath;
251105059Scognet
252111158Scognet	TRM_SRB			TmpSRB;
253111158Scognet	TRM_DCB			DCBarray[16][8];
254105059Scognet
255111158Scognet	u_int32_t		srb_physbase;
256111158Scognet
257105059Scognet	PSRB	    		pFreeSRB;
258105059Scognet	PDCB	    		pActiveDCB;
259105059Scognet
260105059Scognet	PDCB	    		pLinkDCB;
261105059Scognet	PDCB	    		pDCBRunRobin;
262105059Scognet
263105059Scognet	u_int16_t    		max_id;
264105059Scognet	u_int16_t   	 	max_lun;
265105059Scognet
266105059Scognet	u_int8_t    		msgin123[4];
267105059Scognet
268105059Scognet	u_int8_t    		scan_devices[16][8];
269105059Scognet
270105059Scognet	u_int8_t    		AdaptSCSIID;	/*; Adapter SCSI Target ID */
271105059Scognet	u_int8_t    		AdaptSCSILUN;	/*; Adapter SCSI LUN */
272105059Scognet	u_int8_t    		DeviceCnt;
273105059Scognet	u_int8_t    		ACBFlag;
274105059Scognet
275105059Scognet	u_int8_t    		TagMaxNum;
276105059Scognet	u_int8_t           	Config;
277111158Scognet	u_int8_t		AdaptType;
278111158Scognet	u_int8_t		AdapterUnit;	/* nth Adapter this driver */
279105059Scognet};
280105059Scognettypedef struct  _ACB		 TRM_ACB, *PACB;
281105059Scognet/*
282105059Scognet *   ----SRB State machine definition
283105059Scognet */
284105059Scognet#define SRB_FREE                  	0x0000
285105059Scognet#define SRB_WAIT                  	0x0001
286105059Scognet#define SRB_READY                	0x0002
287105059Scognet#define SRB_MSGOUT                	0x0004	/*arbitration+msg_out 1st byte*/
288105059Scognet#define SRB_MSGIN                 	0x0008
289105059Scognet#define SRB_EXTEND_MSGIN         	0x0010
290105059Scognet#define SRB_COMMAND             	0x0020
291105059Scognet#define SRB_START_                	0x0040	/*arbitration+msg_out+command_out*/
292105059Scognet#define SRB_DISCONNECT            	0x0080
293105059Scognet#define SRB_DATA_XFER             	0x0100
294105059Scognet#define SRB_XFERPAD              	0x0200
295105059Scognet#define SRB_STATUS              	0x0400
296105059Scognet#define SRB_COMPLETED             	0x0800
297105059Scognet#define SRB_ABORT_SENT           	0x1000
298105059Scognet#define SRB_DO_SYNC_NEGO           	0x2000
299105059Scognet#define SRB_DO_WIDE_NEGO        	0x4000
300105059Scognet#define SRB_UNEXPECT_RESEL         	0x8000
301105059Scognet/*
302105059Scognet *
303105059Scognet *      ACB Config
304105059Scognet *
305105059Scognet */
306105059Scognet#define HCC_WIDE_CARD	        	0x20
307105059Scognet#define HCC_SCSI_RESET	        	0x10
308105059Scognet#define HCC_PARITY	            	0x08
309105059Scognet#define HCC_AUTOTERM	        	0x04
310105059Scognet#define HCC_LOW8TERM	        	0x02
311105059Scognet#define HCC_UP8TERM		        0x01
312105059Scognet/*
313105059Scognet *   ---ACB Flag
314105059Scognet */
315105059Scognet#define RESET_DEV       		0x00000001
316105059Scognet#define RESET_DETECT    		0x00000002
317105059Scognet#define RESET_DONE      		0x00000004
318105059Scognet
319105059Scognet/*
320105059Scognet *   ---DCB Flag
321105059Scognet */
322105059Scognet#define ABORT_DEV_      		0x00000001
323105059Scognet
324105059Scognet/*
325111158Scognet *   ---DCB status
326111158Scognet */
327111158Scognet#define DS_IN_QUEUE			0x00000001
328111158Scognet
329111158Scognet/*
330105059Scognet *   ---SRB status
331105059Scognet */
332105059Scognet#define SRB_OK	        		0x00000001
333105059Scognet#define ABORTION        		0x00000002
334105059Scognet#define OVER_RUN        		0x00000004
335105059Scognet#define UNDER_RUN       		0x00000008
336105059Scognet#define PARITY_ERROR    		0x00000010
337105059Scognet#define SRB_ERROR    		   	0x00000020
338105059Scognet
339105059Scognet/*
340105059Scognet *   ---SRB Flag
341105059Scognet */
342105059Scognet#define DATAOUT         		0x00000080
343105059Scognet#define DATAIN	        		0x00000040
344105059Scognet#define RESIDUAL_VALID   		0x00000020
345105059Scognet#define ENABLE_TIMER    		0x00000010
346105059Scognet#define RESET_DEV0      		0x00000004
347105059Scognet#define ABORT_DEV       		0x00000002
348105059Scognet#define AUTO_REQSENSE    		0x00000001
349105059Scognet
350105059Scognet/*
351105059Scognet *   ---Adapter status
352105059Scognet */
353105059Scognet#define H_STATUS_GOOD   		0x00
354105059Scognet#define H_SEL_TIMEOUT   		0x11
355105059Scognet#define H_OVER_UNDER_RUN    		0x12
356105059Scognet#define H_UNEXP_BUS_FREE    		0x13
357105059Scognet#define H_TARGET_PHASE_F		0x14
358105059Scognet#define H_INVALID_CCB_OP		0x16
359105059Scognet#define H_LINK_CCB_BAD			0x17
360105059Scognet#define H_BAD_TARGET_DIR		0x18
361105059Scognet#define H_DUPLICATE_CCB			0x19
362105059Scognet#define H_BAD_CCB_OR_SG			0x1A
363105059Scognet#define H_ABORT				0x0FF
364105059Scognet
365105059Scognet/*
366105059Scognet *   ---SCSI Status byte codes
367105059Scognet */
368105059Scognet#define SCSI_STAT_GOOD	        	0x00 	/*;  Good status */
369105059Scognet#define SCSI_STAT_CHECKCOND     	0x02	/*;  SCSI Check Condition */
370105059Scognet#define SCSI_STAT_CONDMET       	0x04	/*;  Condition Met */
371105059Scognet#define SCSI_STAT_BUSY	        	0x08	/*;  Target busy status */
372105059Scognet#define SCSI_STAT_INTER         	0x10	/*;  Intermediate status */
373105059Scognet#define SCSI_STAT_INTERCONDMET   	0x14	/*;  Intermediate condition met */
374105059Scognet#define SCSI_STAT_RESCONFLICT   	0x18	/*;  Reservation conflict */
375105059Scognet#define SCSI_STAT_CMDTERM       	0x22	/*;  Command Terminated */
376105059Scognet#define SCSI_STAT_QUEUEFULL      	0x28	/*;  Queue Full */
377105059Scognet#define SCSI_STAT_UNEXP_BUS_F    	0xFD	/*;  Unexpect Bus Free */
378105059Scognet#define SCSI_STAT_BUS_RST_DETECT	0xFE	/*;  Scsi Bus Reset detected */
379105059Scognet#define SCSI_STAT_SEL_TIMEOUT   	0xFF	/*;  Selection Time out */
380105059Scognet
381105059Scognet/*
382105059Scognet *   ---Sync_Mode
383105059Scognet */
384105059Scognet#define SYNC_WIDE_TAG_ATNT_DISABLE 	0x00000000
385105059Scognet#define SYNC_NEGO_ENABLE         	0x00000001
386105059Scognet#define SYNC_NEGO_DONE           	0x00000002
387105059Scognet#define WIDE_NEGO_ENABLE  	        0x00000004
388105059Scognet#define WIDE_NEGO_DONE    	        0x00000008
389105059Scognet#define EN_TAG_QUEUING          	0x00000010
390105059Scognet#define EN_ATN_STOP             	0x00000020
391105059Scognet
392105059Scognet#define SYNC_NEGO_OFFSET            	15
393105059Scognet/*
394105059Scognet *    ---SCSI bus phase
395105059Scognet */
396105059Scognet#define SCSI_DATA_OUT_  		0
397105059Scognet#define SCSI_DATA_IN_   		1
398105059Scognet#define SCSI_COMMAND    		2
399105059Scognet#define SCSI_STATUS_    		3
400105059Scognet#define SCSI_NOP0       		4
401105059Scognet#define SCSI_NOP1       		5
402105059Scognet#define SCSI_MSG_OUT     		6
403105059Scognet#define SCSI_MSG_IN     		7
404105059Scognet
405105059Scognet/*
406105059Scognet *     ----SCSI MSG u_int8_t
407105059Scognet */
408105059Scognet#define MSG_COMPLETE	    		0x00
409105059Scognet#define MSG_EXTENDED	    		0x01
410105059Scognet#define MSG_SAVE_PTR	   	 	0x02
411105059Scognet#define MSG_RESTORE_PTR     		0x03
412105059Scognet#define MSG_DISCONNECT	    		0x04
413105059Scognet#define MSG_INITIATOR_ERROR  		0x05
414105059Scognet#define MSG_ABORT		        0x06
415105059Scognet#define MSG_REJECT_	        	0x07
416105059Scognet#define MSG_NOP 	        	0x08
417105059Scognet#define MSG_PARITY_ERROR 	   	0x09
418105059Scognet#define MSG_LINK_CMD_COMPL   		0x0A
419105059Scognet#define MSG_LINK_CMD_COMPL_FLG		0x0B
420105059Scognet#define MSG_BUS_RESET	    		0x0C
421111158Scognet/* #define MSG_ABORT_TAG	    	0x0D */
422105059Scognet#define MSG_SIMPLE_QTAG   	  	0x20
423105059Scognet#define MSG_HEAD_QTAG	    		0x21
424105059Scognet#define MSG_ORDER_QTAG	    		0x22
425105059Scognet#define MSG_IGNOREWIDE	    		0x23
426111158Scognet/* #define MSG_IDENTIFY	    		0x80 */
427105059Scognet#define MSG_HOST_ID	        	0xC0
428105059Scognet/*     bus wide length     */
429105059Scognet#define MSG_EXT_WDTR_BUS_8_BIT		0x00
430105059Scognet#define MSG_EXT_WDTR_BUS_16_BIT		0x01
431105059Scognet#define MSG_EXT_WDTR_BUS_32_BIT		0x02
432105059Scognet/*
433105059Scognet *     ----SCSI STATUS u_int8_t
434105059Scognet */
435105059Scognet#define STATUS_GOOD	        	0x00
436105059Scognet#define CHECK_CONDITION_  	  	0x02
437105059Scognet#define STATUS_BUSY	        	0x08
438105059Scognet#define STATUS_INTERMEDIATE  		0x10
439105059Scognet#define RESERVE_CONFLICT    		0x18
440105059Scognet
441105059Scognet/*
442105059Scognet *     ---- cmd->result
443105059Scognet */
444105059Scognet#define STATUS_MASK_			0xFF
445105059Scognet#define MSG_MASK	    		0xFF00
446105059Scognet#define RETURN_MASK	    		0xFF0000
447105059Scognet
448105059Scognet/*
449105059Scognet *  Inquiry Data format
450105059Scognet */
451105059Scognet
452105059Scognettypedef struct	_SCSIInqData { /* INQ */
453105059Scognet
454105059Scognet	u_int8_t 	 DevType;	/* Periph Qualifier & Periph Dev Type */
455105059Scognet	u_int8_t	 RMB_TypeMod;	/* rem media bit & Dev Type Modifier  */
456105059Scognet	u_int8_t	 Vers;		/* ISO, ECMA, & ANSI versions	      */
457105059Scognet	u_int8_t	 RDF;		/* AEN, TRMIOP, & response data format*/
458105059Scognet	u_int8_t	 AddLen;	/* length of additional data	      */
459105059Scognet	u_int8_t	 Res1;		/* reserved	                      */
460105059Scognet	u_int8_t	 Res2;		/* reserved	                      */
461105059Scognet	u_int8_t	 Flags; 	/* RelADr,Wbus32,Wbus16,Sync,etc.     */
462105059Scognet	u_int8_t	 VendorID[8];	/* Vendor Identification	      */
463105059Scognet	u_int8_t	 ProductID[16];	/* Product Identification          */
464105059Scognet	u_int8_t	 ProductRev[4]; /* Product Revision              */
465105059Scognet} SCSI_INQDATA, *PSCSI_INQDATA;
466105059Scognet
467105059Scognet
468105059Scognet/*
469105059Scognet *      Inquiry byte 0 masks
470105059Scognet */
471105059Scognet#define SCSI_DEVTYPE	    	  0x1F    /* Peripheral Device Type 	    */
472105059Scognet#define SCSI_PERIPHQUAL		  0xE0      /* Peripheral Qualifier	    */
473105059Scognet/*
474105059Scognet *      Inquiry byte 1 mask
475105059Scognet */
476105059Scognet#define SCSI_REMOVABLE_MEDIA  	  0x80    /* Removable Media bit (1=removable)  */
477105059Scognet/*
478105059Scognet *      Peripheral Device Type definitions
479105059Scognet */
480105059Scognet#define SCSI_DASD	       	  0x00	   /* Direct-access Device	  */
481105059Scognet#define SCSI_SEQACESS		  0x01	   /* Sequential-access device	  */
482105059Scognet#define SCSI_PRINTER		  0x02	   /* Printer device		  */
483105059Scognet#define SCSI_PROCESSOR		  0x03	   /* Processor device		  */
484105059Scognet#define SCSI_WRITEONCE		  0x04	   /* Write-once device 	  */
485105059Scognet#define SCSI_CDROM	    	  0x05	   /* CD-ROM device		  */
486105059Scognet#define SCSI_SCANNER		  0x06	   /* Scanner device		  */
487105059Scognet#define SCSI_OPTICAL		  0x07	   /* Optical memory device	  */
488105059Scognet#define SCSI_MEDCHGR		  0x08	   /* Medium changer device	  */
489105059Scognet#define SCSI_COMM		  0x09	   /* Communications device	  */
490105059Scognet#define SCSI_NODEV		  0x1F	   /* Unknown or no device type   */
491105059Scognet/*
492105059Scognet *      Inquiry flag definitions (Inq data byte 7)
493105059Scognet */
494105059Scognet#define SCSI_INQ_RELADR       0x80    /* device supports relative addressing*/
495105059Scognet#define SCSI_INQ_WBUS32       0x40    /* device supports 32 bit data xfers  */
496105059Scognet#define SCSI_INQ_WBUS16       0x20    /* device supports 16 bit data xfers  */
497105059Scognet#define SCSI_INQ_SYNC	      0x10    /* device supports synchronous xfer   */
498105059Scognet#define SCSI_INQ_LINKED       0x08    /* device supports linked commands    */
499105059Scognet#define SCSI_INQ_CMDQUEUE     0x02    /* device supports command queueing   */
500105059Scognet#define SCSI_INQ_SFTRE	      0x01    /* device supports soft resets */
501105059Scognet/*
502105059Scognet *==========================================================
503105059Scognet *                EEPROM byte offset
504105059Scognet *==========================================================
505105059Scognet */
506105059Scognettypedef  struct  _EEprom {
507105059Scognet	u_int8_t	EE_MODE1;
508105059Scognet	u_int8_t	EE_SPEED;
509105059Scognet	u_int8_t	xx1;
510105059Scognet	u_int8_t	xx2;
511105059Scognet} EEprom, *PEEprom;
512105059Scognet
513105059Scognet#define EE_ADAPT_SCSI_ID	64
514105059Scognet#define EE_MODE2        	65
515105059Scognet#define EE_DELAY        	66
516105059Scognet#define EE_TAG_CMD_NUM   	67
517105059Scognet
518105059Scognet/*
519105059Scognet *    EE_MODE1 bits definition
520105059Scognet */
521105059Scognet#define PARITY_CHK_     	0x00000001
522105059Scognet#define SYNC_NEGO_      	0x00000002
523105059Scognet#define EN_DISCONNECT_   	0x00000004
524105059Scognet#define SEND_START_     	0x00000008
525105059Scognet#define TAG_QUEUING_    	0x00000010
526105059Scognet
527105059Scognet/*
528105059Scognet *    EE_MODE2 bits definition
529105059Scognet */
530105059Scognet#define MORE2_DRV        	0x00000001
531105059Scognet#define GREATER_1G      	0x00000002
532105059Scognet#define RST_SCSI_BUS    	0x00000004
533105059Scognet#define ACTIVE_NEGATION		0x00000008
534105059Scognet#define NO_SEEK         	0x00000010
535105059Scognet#define LUN_CHECK       	0x00000020
536105059Scognet
537105059Scognet#define ENABLE_CE       	0x01
538105059Scognet#define DISABLE_CE      	0x00
539105059Scognet#define EEPROM_READ     	0x80
540105059Scognet
541105059Scognet/*
542105059Scognet * The PCI configuration register offset for TRM_S1040
543105059Scognet *                  Registers bit Definition
544105059Scognet */
545105059Scognet#define     TRMREG_ID	   	0x00	/* Vendor and Device ID	     	*/
546105059Scognet#define     TRMREG_COMMAND  	0x04	/* PCI command register	       	*/
547105059Scognet#define     TRMREG_IOBASE   	0x10	/* I/O Space base address     	*/
548105059Scognet#define     TRMREG_ROMBASE  	0x30	/* Expansion ROM Base Address  	*/
549105059Scognet#define     TRMREG_INTLINE  	0x3C	/* Interrupt line	       	*/
550105059Scognet
551105059Scognet/*
552105059Scognet *
553105059Scognet * The SCSI register offset for TRM_S1040
554105059Scognet *
555105059Scognet */
556105059Scognet#define TRMREG_SCSI_STATUS   	0x80	/* SCSI Status (R)	      	*/
557105059Scognet/* ######### */
558105059Scognet#define     COMMANDPHASEDONE	0x2000	/* SCSI command phase done     	*/
559105059Scognet#define     SCSIXFERDONE	    0x0800  /* SCSI SCSI transfer done	*/
560105059Scognet#define     SCSIXFERCNT_2_ZERO  0x0100	/* SCSI SCSI transfer count to zero*/
561105059Scognet#define     SCSIINTERRUPT       0x0080	/* SCSI interrupt pending     	*/
562105059Scognet#define     COMMANDABORT        0x0040	/* SCSI command abort	       	*/
563105059Scognet#define     SEQUENCERACTIVE     0x0020	/* SCSI sequencer active       	*/
564105059Scognet#define     PHASEMISMATCH       0x0010	/* SCSI phase mismatch	       	*/
565105059Scognet#define     PARITYERROR	        0x0008	/* SCSI parity error	       	*/
566105059Scognet
567105059Scognet#define     PHASEMASK	        0x0007	/* Phase MSG/CD/IO	       	*/
568105059Scognet#define 	PH_DATA_OUT	        0x00	/* Data out phase      	*/
569105059Scognet#define 	PH_DATA_IN	        0x01	/* Data in phase       	*/
570105059Scognet#define 	PH_COMMAND	        0x02	/* Command phase       	*/
571105059Scognet#define 	PH_STATUS	        0x03	/* Status phase	       	*/
572105059Scognet#define 	PH_BUS_FREE	        0x05	/* Invalid phase used as bus free	*/
573105059Scognet#define 	PH_MSG_OUT	        0x06	/* Message out phase   	*/
574105059Scognet#define 	PH_MSG_IN	        0x07	/* Message in phase    	*/
575105059Scognet
576105059Scognet#define TRMREG_SCSI_CONTROL  	0x80	/* SCSI Control (W)	       	*/
577105059Scognet/* ######### */
578105059Scognet#define     DO_CLRATN	        0x0400	/* Clear ATN	        	*/
579105059Scognet#define     DO_SETATN	        0x0200	/* Set ATN		       	*/
580105059Scognet#define     DO_CMDABORT	        0x0100	/* Abort SCSI command   	*/
581105059Scognet#define     DO_RSTMODULE        0x0010	/* Reset SCSI chip      	*/
582105059Scognet#define     DO_RSTSCSI	        0x0008	/* Reset SCSI bus	       	*/
583105059Scognet#define     DO_CLRFIFO	        0x0004	/* Clear SCSI transfer FIFO    	*/
584105059Scognet#define     DO_DATALATCH    	0x0002	/* Enable SCSI bus data latch 	*/
585105059Scognet#define     DO_HWRESELECT       0x0001	/* Enable hardware reselection 	*/
586105059Scognet#define TRMREG_SCSI_FIFOCNT  	0x82	/* SCSI FIFO Counter 5bits(R) 	*/
587105059Scognet#define TRMREG_SCSI_SIGNAL   	0x83	/* SCSI low level signal (R/W) 	*/
588105059Scognet#define TRMREG_SCSI_INTSTATUS	0x84    /* SCSI Interrupt Status (R)   	*/
589105059Scognet/* ######### */
590105059Scognet#define     INT_SCAM	        0x80	/* SCAM selection interrupt    	*/
591105059Scognet#define     INT_SELECT	        0x40	/* Selection interrupt	       	*/
592105059Scognet#define     INT_SELTIMEOUT      0x20	/* Selection timeout interrupt 	*/
593105059Scognet#define     INT_DISCONNECT      0x10	/* Bus disconnected interrupt  	*/
594105059Scognet#define     INT_RESELECTED      0x08	/* Reselected interrupt	       	*/
595105059Scognet#define     INT_SCSIRESET       0x04	/* SCSI reset detected interrupt*/
596105059Scognet#define     INT_BUSSERVICE      0x02	/* Bus service interrupt       	*/
597105059Scognet#define     INT_CMDDONE	        0x01	/* SCSI command done interrupt 	*/
598105059Scognet#define TRMREG_SCSI_OFFSET   	0x84	/* SCSI Offset Count (W)       	*/
599105059Scognet/*
600105059Scognet *   Bit		Name	        Definition
601105059Scognet *   07-05	0	RSVD	        Reversed. Always 0.
602105059Scognet *   04 	0	OFFSET4	        Reversed for LVDS. Always 0.
603105059Scognet *   03-00	0	OFFSET[03:00]	Offset number from 0 to 15
604105059Scognet */
605105059Scognet#define TRMREG_SCSI_SYNC        0x85	/* SCSI Synchronous Control (R/W)*/
606105059Scognet/* ######### */
607105059Scognet#define     LVDS_SYNC	        0x20	/* Enable LVDS synchronous       */
608105059Scognet#define     WIDE_SYNC	        0x10	/* Enable WIDE synchronous       */
609105059Scognet#define     ALT_SYNC	        0x08	/* Enable Fast-20 alternate synchronous */
610105059Scognet/*
611105059Scognet * SYNCM	7    6	  5	   4	3   	2   	1   	0
612105059Scognet * Name 	RSVD RSVD LVDS WIDE	ALTPERD	PERIOD2	PERIOD1	PERIOD0
613105059Scognet * Default	0	 0	  0	   0	0	    0	    0	    0
614105059Scognet *
615105059Scognet *
616105059Scognet * Bit		    Name                	Definition
617105059Scognet * 07-06	0	RSVD                	Reversed. Always read 0
618105059Scognet * 05   	0	LVDS                	Reversed. Always read 0
619105059Scognet * 04   	0	WIDE/WSCSI          	Enable wide (16-bits) SCSI transfer.
620105059Scognet * 03   	0	ALTPERD/ALTPD	        Alternate (Sync./Period) mode.
621105059Scognet *
622105059Scognet *                                      @@ When this bit is set,
623105059Scognet *                                         the synchronous period bits 2:0
624105059Scognet *                                         in the Synchronous Mode register
625105059Scognet *                                         are used to transfer data
626105059Scognet *                                         at the Fast-20 rate.
627105059Scognet *                                      @@ When this bit is reset,
628105059Scognet *                                         the synchronous period bits 2:0
629105059Scognet *                                         in the Synchronous Mode Register
630105059Scognet *                                         are used to transfer data
631105059Scognet *                                         at the Fast-40 rate.
632105059Scognet *
633105059Scognet * 02-00	0	PERIOD[2:0]/SXPD[02:00]	Synchronous SCSI Transfer Rate.
634105059Scognet *                                      These 3 bits specify
635105059Scognet *                                      the Synchronous SCSI Transfer Rate
636105059Scognet *                                      for Fast-20 and Fast-10.
637105059Scognet *                                      These bits are also reset
638105059Scognet *                                      by a SCSI Bus reset.
639105059Scognet *
640105059Scognet * For Fast-10 bit ALTPD = 0 and LVDS = 0
641105059Scognet *     and 0x00000004,0x00000002,0x00000001 is defined as follows :
642105059Scognet *
643105059Scognet *  	   000	100ns, 10.0 Mbytes/s
644105059Scognet *   	   001	150ns,  6.6 Mbytes/s
645105059Scognet *  	   010	200ns,  5.0 Mbytes/s
646105059Scognet *  	   011	250ns,  4.0 Mbytes/s
647105059Scognet *   	   100	300ns,  3.3 Mbytes/s
648105059Scognet *  	   101	350ns,  2.8 Mbytes/s
649105059Scognet *	       110	400ns,  2.5 Mbytes/s
650105059Scognet *	       111	450ns,  2.2 Mbytes/s
651105059Scognet *
652105059Scognet * For Fast-20 bit ALTPD = 1 and LVDS = 0
653105059Scognet *     and 0x00000004,0x00000002,0x00000001 is defined as follows :
654105059Scognet *
655105059Scognet *	       000	 50ns, 20.0 Mbytes/s
656105059Scognet *	       001	 75ns, 13.3 Mbytes/s
657105059Scognet *	       010	100ns, 10.0 Mbytes/s
658105059Scognet *	       011	125ns,  8.0 Mbytes/s
659105059Scognet *	       100	150ns,  6.6 Mbytes/s
660105059Scognet *	       101	175ns,  5.7 Mbytes/s
661105059Scognet *	       110	200ns,  5.0 Mbytes/s
662105059Scognet *	       111	250ns,  4.0 Mbytes/s
663105059Scognet *
664105059Scognet * For Fast-40 bit ALTPD = 0 and LVDS = 1
665105059Scognet *     and 0x00000004,0x00000002,0x00000001 is defined as follows :
666105059Scognet *
667105059Scognet *	       000	 25ns, 40.0 Mbytes/s
668105059Scognet *	       001	 50ns, 20.0 Mbytes/s
669105059Scognet *	       010	 75ns, 13.3 Mbytes/s
670105059Scognet *	       011	100ns, 10.0 Mbytes/s
671105059Scognet *	       100	125ns,  8.0 Mbytes/s
672105059Scognet *	       101	150ns,  6.6 Mbytes/s
673105059Scognet *	       110	175ns,  5.7 Mbytes/s
674105059Scognet *	       111	200ns,  5.0 Mbytes/s
675105059Scognet */
676105059Scognet
677105059Scognet/*
678105059Scognet ***************************************
679105059Scognet */
680105059Scognet#define TRMREG_SCSI_TARGETID 	0x86	/* SCSI Target ID (R/W)  	*/
681105059Scognet/*
682105059Scognet ***************************************
683105059Scognet */
684105059Scognet#define TRMREG_SCSI_IDMSG    	0x87	/* SCSI Identify Message (R)   	*/
685105059Scognet/*
686105059Scognet ***************************************
687105059Scognet */
688105059Scognet#define TRMREG_SCSI_HOSTID   	0x87	/* SCSI Host ID (W)	       	*/
689105059Scognet/*
690105059Scognet ***************************************
691105059Scognet */
692105059Scognet#define TRMREG_SCSI_COUNTER  	0x88	/* SCSI Transfer Counter 24bits(R/W)*/
693105059Scognet/*
694105059Scognet ***************************************
695105059Scognet */
696105059Scognet#define TRMREG_SCSI_INTEN    	0x8C	/* SCSI Interrupt Enable (R/W)   */
697105059Scognet/* ######### */
698105059Scognet#define     EN_SCAM	        0x80	/* Enable SCAM selection interrupt*/
699105059Scognet#define     EN_SELECT	        0x40	/* Enable selection interrupt     */
700105059Scognet#define     EN_SELTIMEOUT       0x20	/* Enable selection timeout interrupt*/
701105059Scognet#define     EN_DISCONNECT       0x10	/* Enable bus disconnected interrupt*/
702105059Scognet#define     EN_RESELECTED       0x08	/* Enable reselected interrupt   */
703105059Scognet#define     EN_SCSIRESET        0x04	/* Enable SCSI reset detected interrupt*/
704105059Scognet#define     EN_BUSSERVICE       0x02	/* Enable bus service interrupt  */
705105059Scognet#define     EN_CMDDONE	        0x01	/* Enable SCSI command done interrupt*/
706105059Scognet/*
707105059Scognet ***************************************
708105059Scognet */
709105059Scognet#define TRMREG_SCSI_CONFIG0  	0x8D   	/* SCSI Configuration 0 (R/W)  	*/
710105059Scognet/* ######### */
711105059Scognet#define     PHASELATCH	        0x40	/* Enable phase latch	       	*/
712105059Scognet#define     INITIATOR	        0x20	/* Enable initiator mode       	*/
713105059Scognet#define     PARITYCHECK	        0x10	/* Enable parity check	       	*/
714105059Scognet#define     BLOCKRST	        0x01	/* Disable SCSI reset1	       	*/
715105059Scognet/*
716105059Scognet ***************************************
717105059Scognet */
718105059Scognet#define TRMREG_SCSI_CONFIG1  	0x8E   	/* SCSI Configuration 1 (R/W)  	*/
719105059Scognet/* ######### */
720105059Scognet#define     ACTIVE_NEGPLUS      0x10	/* Enhance active negation     	*/
721105059Scognet#define     FILTER_DISABLE      0x08	/* Disable SCSI data filter    	*/
722105059Scognet#define     ACTIVE_NEG	        0x02	/* Enable active negation      	*/
723111158Scognet#define	    ACTIVE_HISLEW	0x01	/* Enable high slew rate (3/6 ns) */
724105059Scognet/*
725105059Scognet ***************************************
726105059Scognet */
727105059Scognet#define TRMREG_SCSI_CONFIG2  	0x8F   	/* SCSI Configuration 2 (R/W)  	*/
728105059Scognet/*
729105059Scognet ***************************************
730105059Scognet */
731105059Scognet#define TRMREG_SCSI_COMMAND   	0x90   	/* SCSI Command (R/W)  		*/
732105059Scognet/* ######### */
733105059Scognet#define     SCMD_COMP	        0x12	/* Command complete            	*/
734105059Scognet#define     SCMD_SEL_ATN        0x60	/* Selection with ATN  		*/
735105059Scognet#define     SCMD_SEL_ATN3       0x64	/* Selection with ATN3 		*/
736105059Scognet#define     SCMD_SEL_ATNSTOP    0xB8	/* Selection with ATN and Stop 	*/
737105059Scognet#define     SCMD_FIFO_OUT       0xC0	/* SCSI FIFO transfer out      	*/
738105059Scognet#define     SCMD_DMA_OUT        0xC1	/* SCSI DMA transfer out       	*/
739105059Scognet#define     SCMD_FIFO_IN        0xC2	/* SCSI FIFO transfer in       	*/
740105059Scognet#define     SCMD_DMA_IN	        0xC3	/* SCSI DMA transfer in	       	*/
741105059Scognet#define     SCMD_MSGACCEPT      0xD8	/* Message accept	       	*/
742105059Scognet/*
743105059Scognet *  Code	Command Description
744105059Scognet *
745105059Scognet *  02	    Enable reselection with FIFO
746105059Scognet *  40  	Select without ATN with FIFO
747105059Scognet *  60   	Select with ATN with FIFO
748105059Scognet *  64  	Select with ATN3 with FIFO
749105059Scognet *  A0  	Select with ATN and stop with FIFO
750105059Scognet *  C0  	Transfer information out with FIFO
751105059Scognet *  C1  	Transfer information out with DMA
752105059Scognet *  C2  	Transfer information in with FIFO
753105059Scognet *  C3  	Transfer information in with DMA
754105059Scognet *  12  	Initiator command complete with FIFO
755105059Scognet *  50  	Initiator transfer information out sequence without ATN with FIFO
756105059Scognet *  70  	Initiator transfer information out sequence with ATN with FIFO
757105059Scognet *  74  	Initiator transfer information out sequence with ATN3 with FIFO
758105059Scognet *  52  	Initiator transfer information in sequence without ATN with FIFO
759105059Scognet *  72   	Initiator transfer information in sequence with ATN with FIFO
760105059Scognet *  76	    Initiator transfer information in sequence with ATN3 with FIFO
761105059Scognet *  90  	Initiator transfer information out command complete with FIFO
762105059Scognet *  92  	Initiator transfer information in command complete with FIFO
763105059Scognet *  D2  	Enable selection
764105059Scognet *  08  	Reselection
765105059Scognet *  48  	Disconnect command with FIFO
766105059Scognet *  88  	Terminate command with FIFO
767105059Scognet *  C8  	Target command complete with FIFO
768105059Scognet *  18  	SCAM Arbitration/ Selection
769105059Scognet *  5A  	Enable reselection
770105059Scognet *  98  	Select without ATN with FIFO
771105059Scognet *  B8  	Select with ATN with FIFO
772105059Scognet *  D8  	Message Accepted
773105059Scognet *  58  	NOP
774105059Scognet */
775105059Scognet/*
776105059Scognet ***************************************
777105059Scognet */
778105059Scognet#define TRMREG_SCSI_TIMEOUT  	0x91	/* SCSI Time Out Value (R/W)   	*/
779105059Scognet/*
780105059Scognet ***************************************
781105059Scognet */
782105059Scognet#define TRMREG_SCSI_FIFO     	0x98	/* SCSI FIFO (R/W)	       	*/
783105059Scognet/*
784105059Scognet ***************************************
785105059Scognet */
786111158Scognet#define     TRMREG_SCSI_TCR00     	0x9C	/* SCSI Target Control 0 (R/W) 	*/
787105059Scognet/* ######### */
788111158Scognet#define     TCR0_DO_WIDE_NEGO     	0x80	/* Do wide NEGO		      	*/
789111158Scognet#define     TCR0_DO_SYNC_NEGO      	0x40	/* Do sync NEGO	             	*/
790111158Scognet#define     TCR0_DISCONNECT_EN	    	0x20	/* Disconnection enable     	*/
791111158Scognet#define     TCR0_OFFSET_MASK	    	0x1F	/* Offset number	       	*/
792111158Scognet/*
793111158Scognet ***************************************
794111158Scognet */
795111158Scognet#define     TRMREG_SCSI_TCR01   	0x9D	/* SCSI Target Control 0 (R/W)  */
796111158Scognet/* ######### */
797111158Scognet#define     TCR0_ENABLE_LVDS    	0xF8	/* LVD   		   	*/
798111158Scognet#define     TCR0_ENABLE_WIDE    	0xF9	/* SE       			*/
799111158Scognet/*
800111158Scognet****************************************
801111158Scognet*/
802105059Scognet
803105059Scognet/*
804105059Scognet ***************************************
805105059Scognet */
806105059Scognet#define TRMREG_SCSI_TCR1     	0x9E   	/* SCSI Target Control 1 (R/W) 	*/
807105059Scognet/* ######### */
808105059Scognet#define     MAXTAG_MASK	        0x7F00	/* Maximum tags (127)	       	*/
809105059Scognet#define     NON_TAG_BUSY        0x0080	/* Non tag command active      	*/
810105059Scognet#define     ACTTAG_MASK	        0x007F	/* Active tags		      	*/
811105059Scognet/*
812105059Scognet *
813105059Scognet * The DMA register offset for TRM_S1040
814105059Scognet *
815105059Scognet */
816105059Scognet#define TRMREG_DMA_COMMAND   	0xA0	/* DMA Command (R/W)	        	*/
817105059Scognet/* ######### */
818105059Scognet#define     XFERDATAIN	        0x0103 	/* Transfer data in	       	*/
819105059Scognet#define     XFERDATAOUT	        0x0102	/* Transfer data out    	*/
820105059Scognet/*
821105059Scognet ***************************************
822105059Scognet */
823105059Scognet#define TRMREG_DMA_FIFOCNT   	0xA1	/* DMA FIFO Counter (R)	       	*/
824105059Scognet/*
825105059Scognet ***************************************
826105059Scognet */
827105059Scognet#define TRMREG_DMA_CONTROL   	0xA1	/* DMA Control (W)     		*/
828105059Scognet/* ######### */
829105059Scognet#define     STOPDMAXFER	        0x08	/* Stop  DMA transfer  		*/
830105059Scognet#define     ABORTXFER	        0x04	/* Abort DMA transfer         	*/
831105059Scognet#define     CLRXFIFO	        0x02	/* Clear DMA transfer FIFO     	*/
832105059Scognet#define     STARTDMAXFER        0x01	/* Start DMA transfer     	*/
833105059Scognet/*
834105059Scognet ***************************************
835105059Scognet */
836105059Scognet#define TRMREG_DMA_STATUS    	0xA3	/* DMA Interrupt Status (R/W)  	*/
837105059Scognet/* ######### */
838105059Scognet#define     XFERPENDING	        0x80	/* Transfer pending	        */
839105059Scognet#define     DMAXFERCOMP	        0x02    /* Bus Master XFER Complete status  */
840105059Scognet#define     SCSICOMP	        0x01	/* SCSI complete interrupt     	*/
841105059Scognet/*
842105059Scognet ***************************************
843105059Scognet */
844105059Scognet#define TRMREG_DMA_INTEN  	    0xA4	/* DMA Interrupt Enable (R/W)*/
845105059Scognet/* ######### */
846105059Scognet#define     EN_SCSIINTR	        0x01	/* Enable SCSI complete interrupt   */
847105059Scognet/*
848105059Scognet ***************************************
849105059Scognet */
850105059Scognet#define TRMREG_DMA_CONFIG    	0xA6	/* DMA Configuration (R/W)     	*/
851105059Scognet/* ######### */
852105059Scognet#define     DMA_ENHANCE	        0x8000	/* Enable DMA enhance feature  	*/
853105059Scognet/*
854105059Scognet ***************************************
855105059Scognet */
856105059Scognet#define TRMREG_DMA_XCNT   	    0xA8	/* DMA Transfer Counter (R/W)*/
857105059Scognet/*
858105059Scognet ***************************************
859105059Scognet */
860105059Scognet#define TRMREG_DMA_CXCNT   	    0xAC	/* DMA Current Transfer Counter (R) */
861105059Scognet/*
862105059Scognet ***************************************
863105059Scognet */
864105059Scognet#define TRMREG_DMA_XLOWADDR  	0xB0	/* DMA Transfer Physical Low Address  */
865105059Scognet/*
866105059Scognet ***************************************
867105059Scognet */
868105059Scognet#define TRMREG_DMA_XHIGHADDR 	0xB4	/* DMA Transfer Physical High Address */
869105059Scognet
870105059Scognet/*
871105059Scognet *
872105059Scognet * The general register offset for TRM_S1040
873105059Scognet *
874105059Scognet */
875105059Scognet#define TRMREG_GEN_CONTROL   	0xD4	/* Global Control	       	*/
876105059Scognet/* ######### */
877105059Scognet#define     EN_EEPROM	        0x10	/* Enable EEPROM programming   	*/
878105059Scognet#define     AUTOTERM	        0x04	/* Enable Auto SCSI terminator 	*/
879105059Scognet#define     LOW8TERM	        0x02	/* Enable Lower 8 bit SCSI terminator */
880105059Scognet#define     UP8TERM	            0x01	/* Enable Upper 8 bit SCSI terminator */
881105059Scognet/*
882105059Scognet ***************************************
883105059Scognet */
884105059Scognet#define TRMREG_GEN_STATUS    	0xD5	/* Global Status	       	*/
885105059Scognet/* ######### */
886105059Scognet#define     GTIMEOUT	        0x80	/* Global timer reach 0 	*/
887105059Scognet#define     CON5068	        0x10	/* External 50/68 pin connected	*/
888105059Scognet#define     CON68	        0x08	/* Internal 68 pin connected   	*/
889105059Scognet#define     CON50	        0x04	/* Internal 50 pin connected   	*/
890105059Scognet#define     WIDESCSI	        0x02	/* Wide SCSI card	       	*/
891105059Scognet/*
892105059Scognet ***************************************
893105059Scognet */
894105059Scognet#define TRMREG_GEN_NVRAM     	0xD6	/* Serial NON-VOLATILE RAM port	*/
895105059Scognet/* ######### */
896105059Scognet#define     NVR_BITOUT	        0x08	/* Serial data out	       	*/
897105059Scognet#define     NVR_BITIN	        0x04	/* Serial data in	       	*/
898105059Scognet#define     NVR_CLOCK	        0x02	/* Serial clock		       	*/
899105059Scognet#define     NVR_SELECT	        0x01	/* Serial select	       	*/
900105059Scognet/*
901105059Scognet ***************************************
902105059Scognet */
903105059Scognet#define TRMREG_GEN_EDATA     	0xD7	/* Parallel EEPROM data port   	*/
904105059Scognet/*
905105059Scognet ***************************************
906105059Scognet */
907105059Scognet#define TRMREG_GEN_EADDRESS  	0xD8	/* Parallel EEPROM address     	*/
908105059Scognet/*
909105059Scognet ***************************************
910105059Scognet */
911105059Scognet#define TRMREG_GEN_TIMER       	0xDB	/* Global timer	       		*/
912105059Scognet
913105059Scognet/*
914105059Scognet * The SEEPROM structure for TRM_S1040
915105059Scognet */
916105059Scognettypedef struct NVRAM_TARGET_STRUCT
917105059Scognet{
918105059Scognet	u_int8_t	NvmTarCfg0;	/* Target configuration byte 0	*/
919105059Scognet	u_int8_t	NvmTarPeriod;	/* Target period	       	*/
920105059Scognet	u_int8_t	NvmTarCfg2;	/* Target configuration byte 2  */
921105059Scognet	u_int8_t	NvmTarCfg3;	/* Target configuration byte 3 	*/
922105059Scognet} NVRAMTARGETTYPE;
923105059Scognet/*   NvmTarCfg0: Target configuration byte 0 :..pDCB->DevMode */
924105059Scognet#define NTC_DO_WIDE_NEGO	    0x20    /* Wide negotiate	    	*/
925105059Scognet#define NTC_DO_TAG_QUEUING  	0x10	/* Enable SCSI tag queuing	*/
926105059Scognet#define NTC_DO_SEND_START       0x08    /* Send start command SPINUP*/
927105059Scognet#define NTC_DO_DISCONNECT   	0x04	/* Enable SCSI disconnect	*/
928105059Scognet#define NTC_DO_SYNC_NEGO    	0x02    /* Sync negotiation	    	*/
929105059Scognet#define NTC_DO_PARITY_CHK   	0x01    /* (it sould define at NAC )
930105059Scognet                                           Parity check enable		*/
931105059Scognet
932105059Scognet/*
933105059Scognet *
934105059Scognet *
935105059Scognet *
936105059Scognet */
937105059Scognettypedef struct NVRAM_STRUC {
938105059Scognet	u_int8_t       	NvramSubVendorID[2];	 /*0,1  Sub Vendor ID	 */
939105059Scognet	u_int8_t       	NvramSubSysID[2];	     /*2,3  Sub System ID*/
940105059Scognet	u_int8_t       	NvramSubClass;		     /*4    Sub Class  	*/
941105059Scognet	u_int8_t       	NvramVendorID[2];	     /*5,6  Vendor ID  	*/
942105059Scognet	u_int8_t       	NvramDeviceID[2];	     /*7,8  Device ID  	*/
943105059Scognet	u_int8_t       	NvramReserved;		     /*9    Reserved   	*/
944111158Scognet	NVRAMTARGETTYPE	NvramTarget[TRM_MAX_TARGETS];/*										  *10,11,12,13
945105059Scognet	                                          *14,15,16,17									  * ....
946105059Scognet						  * ....
947105059Scognet						  *70,71,72,73
948105059Scognet	                                          */
949105059Scognet	u_int8_t       	NvramScsiId;	   /*74 Host Adapter SCSI ID	*/
950105059Scognet	u_int8_t       	NvramChannelCfg;   /*75 Channel configuration	*/
951105059Scognet	u_int8_t       	NvramDelayTime;	   /*76 Power on delay time	*/
952105059Scognet	u_int8_t       	NvramMaxTag;	   /*77 Maximum tags	    	*/
953105059Scognet	u_int8_t       	NvramReserved0;    /*78  */
954105059Scognet	u_int8_t       	NvramBootTarget;   /*79  */
955105059Scognet	u_int8_t       	NvramBootLun;      /*80  */
956105059Scognet	u_int8_t       	NvramReserved1;    /*81  */
957105059Scognet	u_int16_t      	Reserved[22];      /*82,..125 */
958105059Scognet	u_int16_t      	NvramCheckSum;     /*126,127*/
959105059Scognet} NVRAMTYPE,*PNVRAMTYPE;
960105059Scognet/* Nvram Initiater bits definition */
961105059Scognet#define MORE2_DRV       	0x00000001
962105059Scognet#define GREATER_1G      	0x00000002
963105059Scognet#define RST_SCSI_BUS    	0x00000004
964105059Scognet#define ACTIVE_NEGATION    	0x00000008
965105059Scognet#define NO_SEEK         	0x00000010
966105059Scognet#define LUN_CHECK       	0x00000020
967105059Scognet
968111158Scognet/* Nvram Adapter NvramChannelCfg bits definition */
969105059Scognet#define NAC_SCANLUN	    	        0x20    /* Include LUN as BIOS device*/
970105059Scognet#define NAC_POWERON_SCSI_RESET		0x04	/* Power on reset enable     */
971105059Scognet#define NAC_GREATER_1G	           	 0x02	/* > 1G support enable	     */
972105059Scognet#define NAC_GT2DRIVES		        0x01	/* Support more than 2 drives*/
973105059Scognet/*
974105059Scognet *#define NAC_DO_PARITY_CHK       	0x08    // Parity check enable
975105059Scognet */
976105059Scognet
977105059Scognet#endif /* trm_H */
978