1 /*+M*************************************************************************
2 * Perceptive Solutions, Inc. PSI-240I device driver proc support for Linux.
4 * Copyright (c) 1997 Perceptive Solutions, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; see the file COPYING. If not, write to
18 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21 * File Name: psi240i.h
23 * Description: Header file for the SCSI driver for the PSI240I
24 * EIDE interface card.
26 *-M*************************************************************************/
30 #include <linux/types.h>
31 #include <linux/kdev_t.h>
33 #ifndef PSI_EIDE_SCSIOP
34 #define PSI_EIDE_SCSIOP 1
36 /************************************************/
37 /* Some defines that we like */
38 /************************************************/
40 #define UCHAR unsigned char
42 #define USHORT unsigned short
43 #define BOOL unsigned short
45 #define ULONG unsigned long
48 /************************************************/
49 /* Timeout konstants */
50 /************************************************/
51 #define TIMEOUT_READY 10 // 100 mSec
52 #define TIMEOUT_DRQ 40 // 400 mSec
54 /************************************************/
56 /************************************************/
57 #define ANY2SCSI(up, p) \
58 ((UCHAR *)up)[0] = (((ULONG)(p)) >> 8); \
59 ((UCHAR *)up)[1] = ((ULONG)(p));
61 #define SCSI2LONG(up) \
62 ( (((long)*(((UCHAR *)up))) << 16) \
63 + (((long)(((UCHAR *)up)[1])) << 8) \
64 + ((long)(((UCHAR *)up)[2])) )
66 #define XANY2SCSI(up, p) \
67 ((UCHAR *)up)[0] = ((long)(p)) >> 24; \
68 ((UCHAR *)up)[1] = ((long)(p)) >> 16; \
69 ((UCHAR *)up)[2] = ((long)(p)) >> 8; \
70 ((UCHAR *)up)[3] = ((long)(p));
72 #define XSCSI2LONG(up) \
73 ( (((long)(((UCHAR *)up)[0])) << 24) \
74 + (((long)(((UCHAR *)up)[1])) << 16) \
75 + (((long)(((UCHAR *)up)[2])) << 8) \
76 + ((long)(((UCHAR *)up)[3])) )
78 /************************************************/
79 /* SCSI CDB operation codes */
80 /************************************************/
81 #define SCSIOP_TEST_UNIT_READY 0x00
82 #define SCSIOP_REZERO_UNIT 0x01
83 #define SCSIOP_REWIND 0x01
84 #define SCSIOP_REQUEST_BLOCK_ADDR 0x02
85 #define SCSIOP_REQUEST_SENSE 0x03
86 #define SCSIOP_FORMAT_UNIT 0x04
87 #define SCSIOP_READ_BLOCK_LIMITS 0x05
88 #define SCSIOP_REASSIGN_BLOCKS 0x07
89 #define SCSIOP_READ6 0x08
90 #define SCSIOP_RECEIVE 0x08
91 #define SCSIOP_WRITE6 0x0A
92 #define SCSIOP_PRINT 0x0A
93 #define SCSIOP_SEND 0x0A
94 #define SCSIOP_SEEK6 0x0B
95 #define SCSIOP_TRACK_SELECT 0x0B
96 #define SCSIOP_SLEW_PRINT 0x0B
97 #define SCSIOP_SEEK_BLOCK 0x0C
98 #define SCSIOP_PARTITION 0x0D
99 #define SCSIOP_READ_REVERSE 0x0F
100 #define SCSIOP_WRITE_FILEMARKS 0x10
101 #define SCSIOP_FLUSH_BUFFER 0x10
102 #define SCSIOP_SPACE 0x11
103 #define SCSIOP_INQUIRY 0x12
104 #define SCSIOP_VERIFY6 0x13
105 #define SCSIOP_RECOVER_BUF_DATA 0x14
106 #define SCSIOP_MODE_SELECT 0x15
107 #define SCSIOP_RESERVE_UNIT 0x16
108 #define SCSIOP_RELEASE_UNIT 0x17
109 #define SCSIOP_COPY 0x18
110 #define SCSIOP_ERASE 0x19
111 #define SCSIOP_MODE_SENSE 0x1A
112 #define SCSIOP_START_STOP_UNIT 0x1B
113 #define SCSIOP_STOP_PRINT 0x1B
114 #define SCSIOP_LOAD_UNLOAD 0x1B
115 #define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
116 #define SCSIOP_SEND_DIAGNOSTIC 0x1D
117 #define SCSIOP_MEDIUM_REMOVAL 0x1E
118 #define SCSIOP_READ_CAPACITY 0x25
119 #define SCSIOP_READ 0x28
120 #define SCSIOP_WRITE 0x2A
121 #define SCSIOP_SEEK 0x2B
122 #define SCSIOP_LOCATE 0x2B
123 #define SCSIOP_WRITE_VERIFY 0x2E
124 #define SCSIOP_VERIFY 0x2F
125 #define SCSIOP_SEARCH_DATA_HIGH 0x30
126 #define SCSIOP_SEARCH_DATA_EQUAL 0x31
127 #define SCSIOP_SEARCH_DATA_LOW 0x32
128 #define SCSIOP_SET_LIMITS 0x33
129 #define SCSIOP_READ_POSITION 0x34
130 #define SCSIOP_SYNCHRONIZE_CACHE 0x35
131 #define SCSIOP_COMPARE 0x39
132 #define SCSIOP_COPY_COMPARE 0x3A
133 #define SCSIOP_WRITE_DATA_BUFF 0x3B
134 #define SCSIOP_READ_DATA_BUFF 0x3C
135 #define SCSIOP_CHANGE_DEFINITION 0x40
136 #define SCSIOP_READ_SUB_CHANNEL 0x42
137 #define SCSIOP_READ_TOC 0x43
138 #define SCSIOP_READ_HEADER 0x44
139 #define SCSIOP_PLAY_AUDIO 0x45
140 #define SCSIOP_PLAY_AUDIO_MSF 0x47
141 #define SCSIOP_PLAY_TRACK_INDEX 0x48
142 #define SCSIOP_PLAY_TRACK_RELATIVE 0x49
143 #define SCSIOP_PAUSE_RESUME 0x4B
144 #define SCSIOP_LOG_SELECT 0x4C
145 #define SCSIOP_LOG_SENSE 0x4D
146 #define SCSIOP_MODE_SELECT10 0x55
147 #define SCSIOP_MODE_SENSE10 0x5A
148 #define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
149 #define SCSIOP_MECHANISM_STATUS 0xBD
150 #define SCSIOP_READ_CD 0xBE
152 // IDE command definitions
153 #define IDE_COMMAND_ATAPI_RESET 0x08
154 #define IDE_COMMAND_READ 0x20
155 #define IDE_COMMAND_WRITE 0x30
156 #define IDE_COMMAND_RECALIBRATE 0x10
157 #define IDE_COMMAND_SEEK 0x70
158 #define IDE_COMMAND_SET_PARAMETERS 0x91
159 #define IDE_COMMAND_VERIFY 0x40
160 #define IDE_COMMAND_ATAPI_PACKET 0xA0
161 #define IDE_COMMAND_ATAPI_IDENTIFY 0xA1
162 #define IDE_CMD_READ_MULTIPLE 0xC4
163 #define IDE_CMD_WRITE_MULTIPLE 0xC5
164 #define IDE_CMD_SET_MULTIPLE 0xC6
165 #define IDE_COMMAND_WRITE_DMA 0xCA
166 #define IDE_COMMAND_READ_DMA 0xC8
167 #define IDE_COMMAND_IDENTIFY 0xEC
169 // IDE status definitions
170 #define IDE_STATUS_ERROR 0x01
171 #define IDE_STATUS_INDEX 0x02
172 #define IDE_STATUS_CORRECTED_ERROR 0x04
173 #define IDE_STATUS_DRQ 0x08
174 #define IDE_STATUS_DSC 0x10
175 #define IDE_STATUS_WRITE_FAULT 0x20
176 #define IDE_STATUS_DRDY 0x40
177 #define IDE_STATUS_BUSY 0x80
179 // IDE error definitions
180 #define IDE_ERROR_AMNF 0x01
181 #define IDE_ERROR_TKONF 0x02
182 #define IDE_ERROR_ABRT 0x04
183 #define IDE_ERROR_MCR 0x08
184 #define IDE_ERROR_IDFN 0x10
185 #define IDE_ERROR_MC 0x20
186 #define IDE_ERROR_UNC 0x40
187 #define IDE_ERROR_BBK 0x80
189 // IDE interface structure
190 typedef struct _IDE_STRUCT
206 // SCSI read capacity structure
207 typedef struct _READ_CAPACITY_DATA
209 ULONG blks; /* total blocks (converted to little endian) */
210 ULONG blksiz; /* size of each (converted to little endian) */
211 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
216 typedef struct _INQUIRYDATA
219 UCHAR DeviceTypeQualifier :3;
220 UCHAR DeviceTypeModifier :7;
221 UCHAR RemovableMedia :1;
223 UCHAR ResponseDataFormat;
224 UCHAR AdditionalLength;
227 UCHAR CommandQueue :1;
229 UCHAR LinkedCommands :1;
230 UCHAR Synchronous :1;
233 UCHAR RelativeAddressing :1;
236 UCHAR ProductRevisionLevel[4];
237 UCHAR VendorSpecific[20];
239 } INQUIRYDATA, *PINQUIRYDATA;
243 typedef struct _IDENTIFY_DATA
245 USHORT GeneralConfiguration; // 00
246 USHORT NumberOfCylinders; // 02
247 USHORT Reserved1; // 04
248 USHORT NumberOfHeads; // 06
249 USHORT UnformattedBytesPerTrack; // 08
250 USHORT UnformattedBytesPerSector; // 0A
251 USHORT SectorsPerTrack; // 0C
252 USHORT VendorUnique1[3]; // 0E
253 USHORT SerialNumber[10]; // 14
254 USHORT BufferType; // 28
255 USHORT BufferSectorSize; // 2A
256 USHORT NumberOfEccBytes; // 2C
257 USHORT FirmwareRevision[4]; // 2E
258 USHORT ModelNumber[20]; // 36
259 UCHAR MaximumBlockTransfer; // 5E
260 UCHAR VendorUnique2; // 5F
261 USHORT DoubleWordIo; // 60
262 USHORT Capabilities; // 62
263 USHORT Reserved2; // 64
264 UCHAR VendorUnique3; // 66
265 UCHAR PioCycleTimingMode; // 67
266 UCHAR VendorUnique4; // 68
267 UCHAR DmaCycleTimingMode; // 69
268 USHORT TranslationFieldsValid:1; // 6A
270 USHORT NumberOfCurrentCylinders; // 6C
271 USHORT NumberOfCurrentHeads; // 6E
272 USHORT CurrentSectorsPerTrack; // 70
273 ULONG CurrentSectorCapacity; // 72
274 USHORT Reserved4[197]; // 76
275 } IDENTIFY_DATA, *PIDENTIFY_DATA;
277 // Identify data without the Reserved4.
278 typedef struct _IDENTIFY_DATA2 {
279 USHORT GeneralConfiguration; // 00
280 USHORT NumberOfCylinders; // 02
281 USHORT Reserved1; // 04
282 USHORT NumberOfHeads; // 06
283 USHORT UnformattedBytesPerTrack; // 08
284 USHORT UnformattedBytesPerSector; // 0A
285 USHORT SectorsPerTrack; // 0C
286 USHORT VendorUnique1[3]; // 0E
287 USHORT SerialNumber[10]; // 14
288 USHORT BufferType; // 28
289 USHORT BufferSectorSize; // 2A
290 USHORT NumberOfEccBytes; // 2C
291 USHORT FirmwareRevision[4]; // 2E
292 USHORT ModelNumber[20]; // 36
293 UCHAR MaximumBlockTransfer; // 5E
294 UCHAR VendorUnique2; // 5F
295 USHORT DoubleWordIo; // 60
296 USHORT Capabilities; // 62
297 USHORT Reserved2; // 64
298 UCHAR VendorUnique3; // 66
299 UCHAR PioCycleTimingMode; // 67
300 UCHAR VendorUnique4; // 68
301 UCHAR DmaCycleTimingMode; // 69
302 USHORT TranslationFieldsValid:1; // 6A
304 USHORT NumberOfCurrentCylinders; // 6C
305 USHORT NumberOfCurrentHeads; // 6E
306 USHORT CurrentSectorsPerTrack; // 70
307 ULONG CurrentSectorCapacity; // 72
308 } IDENTIFY_DATA2, *PIDENTIFY_DATA2;
310 #endif // PSI_EIDE_SCSIOP
312 // function prototypes
313 int Psi240i_Detect (Scsi_Host_Template *tpnt);
314 int Psi240i_Command (Scsi_Cmnd *SCpnt);
315 int Psi240i_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
316 int Psi240i_Abort (Scsi_Cmnd *SCpnt);
317 int Psi240i_Reset (Scsi_Cmnd *SCpnt, unsigned int flags);
318 int Psi240i_BiosParam (Disk *disk, kdev_t dev, int geom[]);
324 #define PSI240I { proc_name: "psi240i", \
325 name: "PSI-240I EIDE Disk Controller",\
326 detect: Psi240i_Detect, \
327 command: Psi240i_Command, \
328 queuecommand: Psi240i_QueueCommand, \
329 abort: Psi240i_Abort, \
330 reset: Psi240i_Reset, \
331 bios_param: Psi240i_BiosParam, \
334 sg_tablesize: SG_NONE, \
336 use_clustering: DISABLE_CLUSTERING }