1 /*+M*************************************************************************
2 * Perceptive Solutions, Inc. PSI-240I device driver proc support for Linux.
3 *
4 * Copyright (c) 1997 Perceptive Solutions, Inc.
5 *
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)
9 * any later version.
10 *
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.
15 *
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.
19 *
20 *
21 * File Name: psi240i.h
22 *
23 * Description: Header file for the SCSI driver for the PSI240I
24 * EIDE interface card.
25 *
26 *-M*************************************************************************/
27 #ifndef _PSI240I_H
28 #define _PSI240I_H
29
30 #include <linux/types.h>
31 #include <linux/kdev_t.h>
32
33 #ifndef PSI_EIDE_SCSIOP
34 #define PSI_EIDE_SCSIOP 1
35
36 /************************************************/
37 /* Some defines that we like */
38 /************************************************/
39 #define CHAR char
40 #define UCHAR unsigned char
41 #define SHORT short
42 #define USHORT unsigned short
43 #define BOOL unsigned short
44 #define LONG long
45 #define ULONG unsigned long
46 #define VOID void
47
48 /************************************************/
49 /* Timeout konstants */
50 /************************************************/
51 #define TIMEOUT_READY 10 // 100 mSec
52 #define TIMEOUT_DRQ 40 // 400 mSec
53
54 /************************************************/
55 /* Misc. macros */
56 /************************************************/
57 #define ANY2SCSI(up, p) \
58 ((UCHAR *)up)[0] = (((ULONG)(p)) >> 8); \
59 ((UCHAR *)up)[1] = ((ULONG)(p));
60
61 #define SCSI2LONG(up) \
62 ( (((long)*(((UCHAR *)up))) << 16) \
63 + (((long)(((UCHAR *)up)[1])) << 8) \
64 + ((long)(((UCHAR *)up)[2])) )
65
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));
71
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])) )
77
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
151
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
168
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
178
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
188
189 // IDE interface structure
190 typedef struct _IDE_STRUCT
191 {
192 union
193 {
194 UCHAR ide[9];
195 struct
196 {
197 USHORT data;
198 UCHAR sectors;
199 UCHAR lba[4];
200 UCHAR cmd;
201 UCHAR spigot;
202 } ides;
203 } ide;
204 } IDE_STRUCT;
205
206 // SCSI read capacity structure
207 typedef struct _READ_CAPACITY_DATA
208 {
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;
212
213 // SCSI inquiry data
214 #ifndef HOSTS_C
215
216 typedef struct _INQUIRYDATA
217 {
218 UCHAR DeviceType :5;
219 UCHAR DeviceTypeQualifier :3;
220 UCHAR DeviceTypeModifier :7;
221 UCHAR RemovableMedia :1;
222 UCHAR Versions;
223 UCHAR ResponseDataFormat;
224 UCHAR AdditionalLength;
225 UCHAR Reserved[2];
226 UCHAR SoftReset :1;
227 UCHAR CommandQueue :1;
228 UCHAR Reserved2 :1;
229 UCHAR LinkedCommands :1;
230 UCHAR Synchronous :1;
231 UCHAR Wide16Bit :1;
232 UCHAR Wide32Bit :1;
233 UCHAR RelativeAddressing :1;
234 UCHAR VendorId[8];
235 UCHAR ProductId[16];
236 UCHAR ProductRevisionLevel[4];
237 UCHAR VendorSpecific[20];
238 UCHAR Reserved3[40];
239 } INQUIRYDATA, *PINQUIRYDATA;
240 #endif
241
242 // IDE IDENTIFY data
243 typedef struct _IDENTIFY_DATA
244 {
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
269 USHORT Reserved3:15;
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;
276
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
303 USHORT Reserved3:15;
304 USHORT NumberOfCurrentCylinders; // 6C
305 USHORT NumberOfCurrentHeads; // 6E
306 USHORT CurrentSectorsPerTrack; // 70
307 ULONG CurrentSectorCapacity; // 72
308 } IDENTIFY_DATA2, *PIDENTIFY_DATA2;
309
310 #endif // PSI_EIDE_SCSIOP
311
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[]);
319
320 #ifndef NULL
321 #define NULL 0
322 #endif
323
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, \
332 can_queue: 1, \
333 this_id: -1, \
334 sg_tablesize: SG_NONE, \
335 cmd_per_lun: 1, \
336 use_clustering: DISABLE_CLUSTERING }
337
338 #endif
339
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.