update atp870u driver to 0.78 from D-Link source
[linux-2.4.git] / drivers / scsi / psi240i.h
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