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/************************************************/
246typedef	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
261typedef	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
293typedef 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