1 /****************************************************************************
2  * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
3  *
4  * psi_roy.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
5  *
6  * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
7  * All Rights Reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that redistributions of source
11  * code retain the above copyright notice and this comment without
12  * modification.
13  *
14  * Technical updates and product information at:
15  *  http://www.psidisk.com
16  *
17  * Please send questions, comments, bug reports to:
18  *  tech@psidisk.com Technical Support
19  *
20  ****************************************************************************/
21 
22 #ifndef	ROY_HOST
23 #define	ROY_HOST
24 
25 /************************************************/
26 /*		PCI setup								*/
27 /************************************************/
28 #define	VENDOR_PSI			0x1256
29 #define	DEVICE_ROY_1		0x5201		/* 'R1' */
30 
31 /************************************************/
32 /*		controller constants					*/
33 /************************************************/
34 #define MAXADAPTER			4			// Increase this and the sizes of the arrays below, if you need more.
35 #define	MAX_BUS				2
36 #define	MAX_UNITS			16
37 #define	TIMEOUT_COMMAND		400			// number of milliSecondos for command busy timeout
38 
39 /************************************************/
40 /*		I/O address offsets						*/
41 /************************************************/
42 #define RTR_MAILBOX						0x040
43 #define RTR_LOCAL_DOORBELL				0x060
44 #define RTR_PCI_DOORBELL				0x064
45 
46 /************************************************/
47 /*												*/
48 /*			Host command codes					*/
49 /*												*/
50 /************************************************/
51 #define	CMD_READ_CHS		0x01		/* read sectors as specified (CHS mode) */
52 #define	CMD_READ			0x02		/* read sectors as specified (RBA mode) */
53 #define	CMD_READ_SG			0x03		/* read sectors using scatter/gather list */
54 #define	CMD_WRITE_CHS		0x04		/* write sectors as specified (CHS mode) */
55 #define	CMD_WRITE			0x05		/* write sectors as specified (RBA mode) */
56 #define	CMD_WRITE_SG		0x06		/* write sectors using scatter/gather list (LBA mode) */
57 #define	CMD_READ_CHS_SG		0x07		/* read sectors using scatter/gather list (CHS mode) */
58 #define	CMD_WRITE_CHS_SG	0x08		/* write sectors using scatter/gather list (CHS mode) */
59 #define	CMD_VERIFY_CHS		0x09		/* verify data on sectors as specified (CHS mode) */
60 #define	CMD_VERIFY			0x0A		/* verify data on sectors as specified (RBA mode) */
61 #define	CMD_DASD_CDB		0x0B		/* process CDB for a DASD device */
62 #define	CMD_DASD_CDB_SG		0x0C		/* process CDB for a DASD device with scatter/gather */
63 
64 #define	CMD_READ_ABS		0x10		/* read absolute disk */
65 #define	CMD_WRITE_ABS		0x11		/* write absolute disk */
66 #define	CMD_VERIFY_ABS		0x12		/* verify absolute disk */
67 #define	CMD_TEST_READY		0x13		/* test unit ready and return status code */
68 #define	CMD_LOCK_DOOR		0x14		/* lock device door */
69 #define	CMD_UNLOCK_DOOR		0x15		/* unlock device door */
70 #define	CMD_EJECT_MEDIA		0x16		/* eject the media */
71 #define	CMD_UPDATE_CAP		0x17		/* update capacity information */
72 #define	CMD_TEST_PRIV		0x18		/* test and setup private format media */
73 
74 
75 #define	CMD_SCSI_THRU		0x30		/* SCSI pass through CDB */
76 #define	CMD_SCSI_THRU_SG	0x31		/* SCSI pass through CDB with scatter/gather */
77 #define	CMD_SCSI_REQ_SENSE	0x32		/* SCSI pass through request sense after check condition */
78 
79 #define	CMD_DASD_RAID_RQ	0x35		/* request DASD RAID drive data */
80 #define	CMD_DASD_RAID_RQ0	0x31			/* byte 1 subcommand to query for RAID 0 informatation */
81 #define	CMD_DASD_RAID_RQ1	0x32			/* byte 1 subcommand to query for RAID 1 informatation */
82 #define	CMD_DASD_RAID_RQ5	0x33			/* byte 1 subcommand to query for RAID 5 informatation */
83 
84 #define	CMD_DASD_SCSI_INQ	0x36		/* do DASD inquire and return in SCSI format */
85 #define	CMD_DASD_CAP		0x37		/* read DASD capacity */
86 #define	CMD_DASD_INQ		0x38		/* do DASD inquire for type data and return SCSI/EIDE inquiry */
87 #define	CMD_SCSI_INQ		0x39		/* do SCSI inquire */
88 #define	CMD_READ_SETUP		0x3A		/* Get setup structures from controller */
89 #define	CMD_WRITE_SETUP		0x3B		/* Put setup structures in controller and burn in flash */
90 #define	CMD_READ_CONFIG		0x3C		/* Get the entire configuration and setup structures */
91 #define	CMD_WRITE_CONFIG	0x3D		/* Put the entire configuration and setup structures in flash */
92 
93 #define	CMD_TEXT_DEVICE		0x3E		/* obtain device text */
94 #define	CMD_TEXT_SIGNON		0x3F		/* get sign on banner */
95 
96 #define	CMD_QUEUE			0x40		/* any command below this generates a queue tag interrupt to host*/
97 
98 #define	CMD_PREFETCH		0x40		/* prefetch sectors as specified */
99 #define	CMD_TEST_WRITE		0x41		/* Test a device for write protect */
100 #define	CMD_LAST_STATUS		0x42		/* get last command status and error data*/
101 #define	CMD_ABORT			0x43		/* abort command as specified */
102 #define	CMD_ERROR			0x44		/* fetch error code from a tagged op */
103 #define	CMD_DONE			0x45		/* done with operation */
104 #define	CMD_DIAGNOSTICS		0x46		/* execute controller diagnostics and wait for results */
105 #define	CMD_FEATURE_MODE	0x47		/* feature mode control word */
106 #define	CMD_DASD_INQUIRE	0x48		/* inquire as to DASD SCSI device (32 possible) */
107 #define	CMD_FEATURE_QUERY	0x49		/* query the feature control word */
108 #define	CMD_DASD_EJECT		0x4A		/* Eject removable media for DASD type */
109 #define	CMD_DASD_LOCK		0x4B		/* Lock removable media for DASD type */
110 #define	CMD_DASD_TYPE		0x4C		/* obtain DASD device type */
111 #define	CMD_NUM_DEV			0x4D		/* obtain the number of devices connected to the controller */
112 #define	CMD_GET_PARMS		0x4E		/* obtain device parameters */
113 #define	CMD_SPECIFY			0x4F		/* specify operating system for scatter/gather operations */
114 
115 #define	CMD_RAID_GET_DEV	0x50		/* read RAID device geometry */
116 #define CMD_RAID_READ		0x51		/* read RAID 1 parameter block */
117 #define	CMD_RAID_WRITE		0x52		/* write RAID 1 parameter block */
118 #define	CMD_RAID_LITEUP		0x53		/* Light up the drive light for identification */
119 #define	CMD_RAID_REBUILD	0x54		/* issue a RAID 1 pair rebuild */
120 #define	CMD_RAID_MUTE		0x55		/* mute RAID failure alarm */
121 #define	CMD_RAID_FAIL		0x56		/* induce a RAID failure */
122 #define	CMD_RAID_STATUS		0x57		/* get status of RAID pair */
123 #define	CMD_RAID_STOP		0x58		/* stop any reconstruct in progress */
124 #define CMD_RAID_START		0x59		/* start reconstruct */
125 #define	CMD_RAID0_READ		0x5A		/* read RAID 0 parameter block */
126 #define	CMD_RAID0_WRITE		0x5B		/* write RAID 0 parameter block */
127 #define	CMD_RAID5_READ		0x5C		/* read RAID 5 parameter block */
128 #define	CMD_RAID5_WRITE		0x5D		/* write RAID 5 parameter block */
129 
130 #define	CMD_ERASE_TABLES	0x5F		/* erase partition table and RAID signatutures */
131 
132 #define	CMD_SCSI_GET		0x60		/* get SCSI pass through devices */
133 #define	CMD_SCSI_TIMEOUT	0x61		/* set SCSI pass through timeout */
134 #define	CMD_SCSI_ERROR		0x62		/* get SCSI pass through request sense length and residual data count */
135 #define	CMD_GET_SPARMS		0x63		/* get SCSI bus and user parms */
136 #define	CMD_SCSI_ABORT		0x64		/* abort by setting time-out to zero */
137 
138 #define	CMD_CHIRP_CHIRP		0x77		/* make a chirp chirp sound */
139 #define	CMD_GET_LAST_DONE	0x78		/* get tag of last done in progress */
140 #define	CMD_GET_FEATURES	0x79		/* get feature code and ESN */
141 #define CMD_CLEAR_CACHE		0x7A		/* Clear cache on specified device */
142 #define	CMD_BIOS_TEST		0x7B		/* Test whether or not to load BIOS */
143 #define	CMD_WAIT_FLUSH		0x7C		/* wait for cache flushed and invalidate read cache */
144 #define	CMD_RESET_BUS		0x7D		/* reset the SCSI bus */
145 #define	CMD_STARTUP_QRY		0x7E		/* startup in progress query */
146 #define	CMD_RESET			0x7F		/* reset the controller */
147 
148 #define	CMD_RESTART_RESET	0x80		/* reload and restart the controller at any reset issued */
149 #define	CMD_SOFT_RESET		0x81		/* do a soft reset NOW! */
150 
151 /************************************************/
152 /*												*/
153 /*				Host return errors				*/
154 /*												*/
155 /************************************************/
156 #define	ERR08_TAGGED		0x80		/* doorbell error ored with tag */
157 
158 #define	ERR16_NONE			0x0000		/* no errors */
159 #define	ERR16_SC_COND_MET	0x0004		/* SCSI status - Condition Met */
160 #define	ERR16_CMD			0x0101		/* command error */
161 #define	ERR16_SC_CHECK_COND	0x0002		/* SCSI status - Check Condition */
162 #define	ERR16_CMD_NOT		0x0201		/* command not supported */
163 #define ERR16_NO_DEVICE     0x0301		/* invalid device selection */
164 #define	ERR16_SECTOR		0x0202		/* bad sector */
165 #define	ERR16_PROTECT		0x0303		/* write protected */
166 #define	ERR16_NOSECTOR		0x0404		/* sector not found */
167 #define	ERR16_MEDIA			0x0C0C		/* invalid media */
168 #define	ERR16_CONTROL		0x2020		/* controller error */
169 #define	ERR16_CONTROL_DMA	0x2120		/* controller DMA engine error */
170 #define	ERR16_NO_ALARM		0x2220		/* alarm is not active */
171 #define	ERR16_OP_BUSY		0x2320		/* operation busy */
172 #define	ERR16_SEEK			0x4040		/* seek failure */
173 #define	ERR16_DEVICE_FAIL	0x4140		/* device has failed */
174 #define ERR16_TIMEOUT		0x8080		/* timeout error */
175 #define	ERR16_DEV_NOT_READY	0xAAAA		/* drive not ready */
176 #define	ERR16_UNDEFINED		0xBBBB		/* undefined error */
177 #define	ERR16_WRITE_FAULT	0xCCCC		/* write fault */
178 #define ERR16_INVALID_DEV	0x4001		/* invalid device access */
179 #define	ERR16_DEVICE_BUSY	0x4002		/* device is busy */
180 #define	ERR16_MEMORY		0x4003		/* device pass thru requires too much memory */
181 #define	ERR16_NO_FEATURE	0x40FA		/* feature no implemented */
182 #define	ERR16_NOTAG			0x40FD		/* no tag space available */
183 #define	ERR16_NOT_READY		0x40FE		/* controller not ready error */
184 #define	ERR16_SETUP_FLASH	0x5050		/* error when writing setup to flash memory */
185 #define	ERR16_SETUP_SIZE	0x5051		/* setup block size error */
186 #define	ERR16_SENSE			0xFFFF		/* sense opereration failed */
187 #define	ERR16_SC_BUSY		0x0008		/* SCSI status - Busy */
188 #define	ERR16_SC_RES_CONFL	0x0018		/* SCSI status - Reservation Conflict */
189 #define	ERR16_SC_CMD_TERM	0x0022		/* SCSI status - Command Terminated */
190 #define	ERR16_SC_OTHER		0x00FF		/* SCSI status - not recognized (any value masked) */
191 #define	ERR16_MEDIA_CHANGED	0x8001		/* devices media has been changed */
192 
193 #define	ERR32_NONE			0x00000000	/* no errors */
194 #define	ERR32_SC_COND_MET	0x00000004	/* SCSI status - Condition Met */
195 #define	ERR32_CMD			0x00010101	/* command error */
196 #define	ERR32_SC_CHECK_COND	0x00020002	/* SCSI status - Check Condition */
197 #define	ERR32_CMD_NOT		0x00030201	/* command not supported */
198 #define ERR32_NO_DEVICE     0x00040301	/* invalid device selection */
199 #define	ERR32_SECTOR		0x00050202	/* bad sector */
200 #define	ERR32_PROTECT		0x00060303	/* write protected */
201 #define	ERR32_NOSECTOR		0x00070404	/* sector not found */
202 #define	ERR32_MEDIA			0x00080C0C	/* invalid media */
203 #define	ERR32_CONTROL		0x00092020	/* controller error */
204 #define	ERR32_CONTROL_DMA	0x000A2120	/* Controller DMA error */
205 #define	ERR32_NO_ALARM		0x000B2220 	/* alarm is not active */
206 #define	ERR32_OP_BUSY		0x000C2320	/* operation busy */
207 #define	ERR32_SEEK			0x000D4040	/* seek failure */
208 #define	ERR32_DEVICE_FAIL	0x000E4140	/* device has failed */
209 #define ERR32_TIMEOUT		0x000F8080	/* timeout error */
210 #define	ERR32_DEV_NOT_READY	0x0010AAAA	/* drive not ready */
211 #define	ERR32_UNDEFINED		0x0011BBBB	/* undefined error */
212 #define	ERR32_WRITE_FAULT	0x0012CCCC	/* write fault */
213 #define ERR32_INVALID_DEV	0x00134001	/* invalid device access */
214 #define	ERR32_DEVICE_BUSY	0x00144002	/* device is busy */
215 #define	ERR32_MEMORY		0x00154003	/* device pass thru requires too much memory */
216 #define	ERR32_NO_FEATURE	0x001640FA	/* feature no implemented */
217 #define	ERR32_NOTAG			0x001740FD	/* no tag space available */
218 #define	ERR32_NOT_READY		0x001840FE	/* controller not ready error */
219 #define	ERR32_SETUP_FLASH	0x00195050	/* error when writing setup to flash memory */
220 #define	ERR32_SETUP_SIZE	0x001A5051	/* setup block size error */
221 #define	ERR32_SENSE			0x001BFFFF	/* sense opereration failed */
222 #define	ERR32_SC_BUSY		0x001C0008	/* SCSI status - Busy */
223 #define	ERR32_SC_RES_CONFL	0x001D0018	/* SCSI status - Reservation Conflict */
224 #define	ERR32_SC_CMD_TERM	0x001E0022	/* SCSI status - Command Terminated */
225 #define	ERR32_SC_OTHER		0x001F00FF	/* SCSI status - not recognized (any value masked) */
226 #define	ERR32_MEDIA_CHANGED	0x00208001	/* devices media has been changed */
227 
228 /************************************************/
229 /*												*/
230 /*	Host Operating System specification codes	*/
231 /*												*/
232 /************************************************/
233 #define	SPEC_INTERRUPT		0x80		/* specification requires host interrupt */
234 #define	SPEC_BACKWARD_SG	0x40		/* specification requires scatter/gather items reversed */
235 #define	SPEC_DOS_BLOCK		0x01		/* DOS DASD blocking on pass through */
236 #define	SPEC_OS2_V3			0x02		/* OS/2 Warp */
237 #define	SPCE_SCO_3242		0x04		/* SCO 3.4.2.2 */
238 #define	SPEC_QNX_4X			0x05		/* QNX 4.XX */
239 #define	SPEC_NOVELL_NWPA	0x08		/* Novell NWPA scatter/gather support */
240 
241 /************************************************/
242 /*												*/
243 /*	Inquire structures							*/
244 /*												*/
245 /************************************************/
246 typedef	struct	_CNT_SCSI_INQ
247 	{
248 	UCHAR	devt;						/* 00: device type */
249 	UCHAR	devtm;						/* 01: device type modifier */
250 	UCHAR	svers;						/* 02: SCSI version */
251 	UCHAR	rfmt;						/* 03: response data format */
252 	UCHAR	adlen;						/* 04: additional length of data */
253 	UCHAR	res1;						/* 05: */
254 	UCHAR	res2;						/* 06: */
255 	UCHAR	fncs;						/* 07: functional capabilities */
256 	UCHAR	vid[8];						/* 08: vendor ID */
257 	UCHAR	pid[16];					/* 10: product ID */
258 	UCHAR	rev[4];						/* 20: product revision */
259 	}	CNT_SCSI_INQ;
260 
261 typedef	struct	_CNT_IDE_INQ
262 	{
263 	USHORT	GeneralConfiguration;		/* 00 */
264 	USHORT	NumberOfCylinders;			/* 02 */
265 	USHORT	Reserved1;					/* 04 */
266 	USHORT	NumberOfHeads;				/* 06 */
267 	USHORT	UnformattedBytesPerTrack;	/* 08 */
268 	USHORT	UnformattedBytesPerSector;	/* 0A */
269 	USHORT	SectorsPerTrack;			/* 0C */
270 	USHORT	VendorUnique1[3];			/* 0E */
271 	USHORT	SerialNumber[10];			/* 14 */
272 	USHORT	BufferType;					/* 28 */
273 	USHORT	BufferSectorSize;			/* 2A */
274 	USHORT	NumberOfEccBytes;			/* 2C */
275 	USHORT	FirmwareRevision[4];		/* 2E */
276 	USHORT	ModelNumber[20];			/* 36 */
277 	UCHAR	MaximumBlockTransfer;		/* 5E */
278 	UCHAR	VendorUnique2;				/* 5F */
279 	USHORT	DoubleWordIo;				/* 60 */
280 	USHORT	Capabilities;				/* 62 */
281 	USHORT	Reserved2;					/* 64 */
282 	UCHAR	VendorUnique3;				/* 66 */
283 	UCHAR	PioCycleTimingMode;			/* 67 */
284 	UCHAR	VendorUnique4;				/* 68 */
285 	UCHAR	DmaCycleTimingMode;			/* 69 */
286 	USHORT	TranslationFieldsValid;		/* 6A */
287 	USHORT	NumberOfCurrentCylinders;	/* 6C */
288 	USHORT	NumberOfCurrentHeads;		/* 6E */
289 	USHORT	CurrentSectorsPerTrack;		/* 70 */
290 	ULONG	CurrentSectorCapacity;		/* 72 */
291 	}	CNT_IDE_INQ;
292 
293 typedef struct	_DASD_INQUIRE
294 	{
295 	ULONG	type;						/* 0 = SCSI, 1 = IDE */
296 	union
297 		{
298 		CNT_SCSI_INQ	scsi;			/* SCSI inquire data */
299 		CNT_IDE_INQ		ide;			/* IDE inquire data */
300 		}	inq;
301 	}	DASD_INQUIRE;
302 
303 /************************************************/
304 /*												*/
305 /*	Device Codes								*/
306 /*												*/
307 /************************************************/
308 #define DEVC_DASD			0x00		/* Direct-access Storage Device */
309 #define DEVC_SEQACESS		0x01		/* Sequential-access device */
310 #define DEVC_PRINTER		0x02		/* Printer device */
311 #define DEVC_PROCESSOR		0x03		/* Processor device */
312 #define DEVC_WRITEONCE		0x04		/* Write-once device */
313 #define DEVC_CDROM			0x05		/* CD-ROM device */
314 #define DEVC_SCANNER		0x06		/* Scanner device */
315 #define DEVC_OPTICAL		0x07		/* Optical memory device */
316 #define DEVC_MEDCHGR		0x08		/* Medium changer device */
317 #define	DEVC_DASD_REMOVABLE	0x80		/* Direct-access storage device, Removable */
318 #define	DEVC_NONE			0xFF		/* no device */
319 
320 // SCSI controls for RAID
321 #define	SC_MY_RAID			0xBF			// our special CDB command byte for Win95... interface
322 #define	MY_SCSI_QUERY0		0x31			// byte 1 subcommand to query driver for RAID 0 informatation
323 #define	MY_SCSI_QUERY1		0x32			// byte 1 subcommand to query driver for RAID 1 informatation
324 #define	MY_SCSI_QUERY5		0x33			// byte 1 subcommand to query driver for RAID 5 informatation
325 #define	MY_SCSI_REBUILD		0x40			// byte 1 subcommand to reconstruct a mirrored pair
326 #define MY_SCSI_DEMOFAIL	0x54			// byte 1 subcommand for RAID failure demonstration
327 #define	MY_SCSI_ALARMMUTE	0x60			// byte 1 subcommand to mute any alarm currently on
328 
329 
330 #endif
331 
332