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