ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / scsi / psi_dale.h
1 /****************************************************************************
2  * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
3  *
4  * psi_dalei.h - Linux Host Driver for PCI-2220i EIDE 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 /************************************************/
23 /*              Some defines that we like                               */
24 /************************************************/
25 #define CHAR            char
26 #define UCHAR           unsigned char
27 #define SHORT           short
28 #define USHORT          unsigned short
29 #define BOOL            unsigned short
30 #define LONG            long
31 #define ULONG           unsigned long
32 #define VOID            void
33
34 /************************************************/
35 /*              Dale PCI setup                                                  */
36 /************************************************/
37 #define VENDOR_PSI                      0x1256
38 #define DEVICE_DALE_1           0x4401          /* 'D1' */
39 #define DEVICE_BIGD_1           0x4201          /* 'B1' */
40 #define DEVICE_BIGD_2           0x4202          /* 'B2' */
41
42 /************************************************/
43 /*              Misc konstants                                                  */
44 /************************************************/
45 #define DALE_MAXDRIVES                  4
46 #define BIGD_MAXDRIVES                  8
47 #define SECTORSXFER                             8
48 #define ATAPI_TRANSFER                  8192
49 #define BYTES_PER_SECTOR                512
50 #define DEFAULT_TIMING_MODE             5
51
52 /************************************************/
53 /*              EEPROM locations                                                */
54 /************************************************/
55 #define DALE_FLASH_PAGE_SIZE    128                             // number of bytes per page
56 #define DALE_FLASH_SIZE                 65536L
57
58 #define DALE_FLASH_BIOS                 0x00080000L             // BIOS base address
59 #define DALE_FLASH_SETUP                0x00088000L             // SETUP PROGRAM base address offset from BIOS
60 #define DALE_FLASH_RAID                 0x00088400L             // RAID signature storage
61 #define DALE_FLASH_FACTORY              0x00089000L             // FACTORY data base address offset from BIOS
62
63 #define DALE_FLASH_BIOS_SIZE    32768U                  // size of FLASH BIOS REGION
64
65 /************************************************/
66 /*              DALE Register address offsets                   */
67 /************************************************/
68 #define REG_DATA                                        0x80
69 #define REG_ERROR                                       0x84
70 #define REG_SECTOR_COUNT                        0x88
71 #define REG_LBA_0                                       0x8C
72 #define REG_LBA_8                                       0x90
73 #define REG_LBA_16                                      0x94
74 #define REG_LBA_24                                      0x98
75 #define REG_STAT_CMD                            0x9C
76 #define REG_STAT_SEL                            0xA0
77 #define REG_FAIL                                        0xB0
78 #define REG_ALT_STAT                            0xB8
79 #define REG_DRIVE_ADRS                          0xBC
80
81 #define DALE_DATA_SLOW                          0x00040000L
82 #define DALE_DATA_MODE2                         0x00040000L
83 #define DALE_DATA_MODE3                         0x00050000L
84 #define DALE_DATA_MODE4                         0x00060000L
85 #define DALE_DATA_MODE5                         0x00070000L
86
87 #define BIGD_DATA_SLOW                          0x00000000L
88 #define BIGD_DATA_MODE0                         0x00000000L
89 #define BIGD_DATA_MODE2                         0x00000000L
90 #define BIGD_DATA_MODE3                         0x00000008L
91 #define BIGD_DATA_MODE4                         0x00000010L
92 #define BIGD_DATA_MODE5                         0x00000020L
93
94 #define RTR_LOCAL_RANGE                         0x000
95 #define RTR_LOCAL_REMAP                         0x004
96 #define RTR_EXP_RANGE                           0x010
97 #define RTR_EXP_REMAP                           0x014
98 #define RTR_REGIONS                                     0x018
99 #define RTR_DM_MASK                                     0x01C
100 #define RTR_DM_LOCAL_BASE                       0x020
101 #define RTR_DM_IO_BASE                          0x024
102 #define RTR_DM_PCI_REMAP                        0x028
103 #define RTR_DM_IO_CONFIG                        0x02C
104 #define RTR_MAILBOX                                     0x040
105 #define RTR_LOCAL_DOORBELL                      0x060
106 #define RTR_PCI_DOORBELL                        0x064
107 #define RTR_INT_CONTROL_STATUS          0x068
108 #define RTR_EEPROM_CONTROL_STATUS       0x06C
109
110 #define RTR_DMA0_MODE                           0x0080
111 #define RTR_DMA0_PCI_ADDR                       0x0084
112 #define RTR_DMA0_LOCAL_ADDR                     0x0088
113 #define RTR_DMA0_COUNT                          0x008C
114 #define RTR_DMA0_DESC_PTR                       0x0090
115 #define RTR_DMA1_MODE                           0x0094
116 #define RTR_DMA1_PCI_ADDR                       0x0098
117 #define RTR_DMA1_LOCAL_ADDR                     0x009C
118 #define RTR_DMA1_COUNT                          0x00A0
119 #define RTR_DMA1_DESC_PTR                       0x00A4
120 #define RTR_DMA_COMMAND_STATUS          0x00A8
121 #define RTR_DMA_ARB0                            0x00AC
122 #define RTR_DMA_ARB1                            0x00B0
123
124 #define RTL_DMA0_MODE                           0x00
125 #define RTL_DMA0_PCI_ADDR                       0x04
126 #define RTL_DMA0_LOCAL_ADDR                     0x08
127 #define RTL_DMA0_COUNT                          0x0C
128 #define RTL_DMA0_DESC_PTR                       0x10
129 #define RTL_DMA1_MODE                           0x14
130 #define RTL_DMA1_PCI_ADDR                       0x18
131 #define RTL_DMA1_LOCAL_ADDR                     0x1C
132 #define RTL_DMA1_COUNT                          0x20
133 #define RTL_DMA1_DESC_PTR                       0x24
134 #define RTL_DMA_COMMAND_STATUS          0x28
135 #define RTL_DMA_ARB0                            0x2C
136 #define RTL_DMA_ARB1                            0x30
137
138 /************************************************/
139 /*              Dale Scratchpad locations                               */
140 /************************************************/
141 #define DALE_CHANNEL_DEVICE_0           0               // device channel locations
142 #define DALE_CHANNEL_DEVICE_1           1
143 #define DALE_CHANNEL_DEVICE_2           2
144 #define DALE_CHANNEL_DEVICE_3           3
145
146 #define DALE_SCRATCH_DEVICE_0           4               // device type codes
147 #define DALE_SCRATCH_DEVICE_1           5
148 #define DALE_SCRATCH_DEVICE_2           6
149 #define DALE_SCRATCH_DEVICE_3           7
150
151 #define DALE_RAID_0_STATUS                      8
152 #define DALE_RAID_1_STATUS                      9
153
154 #define DALE_TIMING_MODE                        12              // bus master timing mode (2, 3, 4, 5)
155 #define DALE_NUM_DRIVES                         13              // number of addressable drives on this board
156 #define DALE_RAID_ON                            14              // RAID status On
157 #define DALE_LAST_ERROR                         15              // Last error code from BIOS
158
159 /************************************************/
160 /*              BigD Scratchpad locations                               */
161 /************************************************/
162 #define BIGD_DEVICE_0                   0               // device channel locations
163 #define BIGD_DEVICE_1                   1
164 #define BIGD_DEVICE_2                   2
165 #define BIGD_DEVICE_3                   3
166
167 #define BIGD_DEVICE_4                   4               // device type codes
168 #define BIGD_DEVICE_5                   5
169 #define BIGD_DEVICE_6                   6
170 #define BIGD_DEVICE_7                   7
171
172 #define BIGD_ALARM_IMAGE                11              // ~image of alarm fail register                
173 #define BIGD_TIMING_MODE                12              // bus master timing mode (2, 3, 4, 5)
174 #define BIGD_NUM_DRIVES                 13              // number of addressable drives on this board
175 #define BIGD_RAID_ON                    14              // RAID status is on for the whole board
176 #define BIGD_LAST_ERROR                 15              // Last error code from BIOS
177
178 #define BIGD_RAID_0_STATUS              16
179 #define BIGD_RAID_1_STATUS              17
180 #define BIGD_RAID_2_STATUS              18
181 #define BIGD_RAID_3_STATUS              19
182 #define BIGD_RAID_4_STATUS              20
183 #define BIGD_RAID_5_STATUS              21
184 #define BIGD_RAID_6_STATUS              22
185 #define BIGD_RAID_7_STATUS              23
186
187 /************************************************/
188 /*              Dale cable select bits                                  */
189 /************************************************/
190 #define SEL_NONE                                        0x00
191 #define SEL_1                                           0x01
192 #define SEL_2                                           0x02
193 #define SEL_3                                           0x04
194 #define SEL_4                                           0x08
195 #define SEL_NEW_SPEED_1                         0x20
196 #define SEL_COPY                                        0x40
197 #define SEL_IRQ_OFF                                     0x80
198
199 /************************************************/
200 /*              Device/Geometry controls                                */
201 /************************************************/
202 #define GEOMETRY_NONE                           0x0                             // No device
203 #define GEOMETRY_SET                            0x1                             // Geometry set
204 #define GEOMETRY_LBA                            0x2                             // Geometry set in default LBA mode
205 #define GEOMETRY_PHOENIX                        0x3                             // Geometry set in Pheonix BIOS compatibility mode
206
207 #define DEVICE_NONE                                     0x0                             // No device present
208 #define DEVICE_INACTIVE                         0x1                             // device present but not registered active
209 #define DEVICE_ATAPI                            0x2                             // ATAPI device (CD_ROM, Tape, Etc...)
210 #define DEVICE_DASD_NONLBA                      0x3                             // Non LBA incompatible device
211 #define DEVICE_DASD_LBA                         0x4                             // LBA compatible device
212
213 /************************************************/
214 /*              BigD fail register bits                                 */
215 /************************************************/
216 #define FAIL_NONE                               0x00
217 #define FAIL_0                                  0x01
218 #define FAIL_1                                  0x02
219 #define FAIL_2                                  0x04
220 #define FAIL_MULTIPLE                   0x08
221 #define FAIL_GOOD                               0x20
222 #define FAIL_AUDIBLE                    0x40
223 #define FAIL_ANY                                0x80
224
225 /************************************************/
226 /*              Setup Structure Definitions                             */
227 /************************************************/
228 typedef struct          // device setup parameters
229         {
230         UCHAR   geometryControl;        // geometry control flags
231         UCHAR   device;                         // device code
232         USHORT  sectors;                        // number of sectors per track
233         USHORT  heads;                          // number of heads
234         USHORT  cylinders;                      // number of cylinders for this device
235         ULONG   blocks;                         // number of blocks on device
236         ULONG   realCapacity;           // number of real blocks on this device for drive changed testing
237         } SETUP_DEVICE, *PSETUP_DEVICE;
238
239 typedef struct          // master setup structure
240         {
241         USHORT                  startupDelay;
242         BOOL                    promptBIOS;
243         BOOL                    fastFormat;
244         BOOL                    shareInterrupt;
245         BOOL                    rebootRebuild;
246         USHORT                  timingMode;
247         USHORT                  spare5;
248         USHORT                  spare6;
249         SETUP_DEVICE    setupDevice[BIGD_MAXDRIVES];
250         }       SETUP, *PSETUP;
251
252 /************************************************/
253 /*              RAID Structure Definitions                              */
254 /************************************************/
255 typedef struct
256         {
257         UCHAR   signature;                      // 0x55 our mirror signature
258         UCHAR   status;                         // current status bits
259         UCHAR   pairIdentifier;         // unique identifier for pair
260         ULONG   reconstructPoint;       // recontruction point for hot reconstruct
261         }       DISK_MIRROR;
262
263 typedef struct  DEVICE_RAID1
264         {
265         long            TotalSectors;
266         DISK_MIRROR DiskRaid1;
267         }       DEVICE_RAID1, *PDEVICE_RAID1;
268
269 #define DISK_MIRROR_POSITION    0x01A8
270 #define SIGNATURE                               0x55
271
272 #define MASK_SERIAL_NUMBER      0x0FFE                  // mask for serial number matching
273 #define MASK_SERIAL_UNIT        0x0001                  // mask for unit portion of serial number
274
275 // Status bits
276 #define UCBF_MIRRORED           0x0010                                                          // drive has a pair
277 #define UCBF_MATCHED            0x0020                                                          // drive pair is matched
278 #define UCBF_SURVIVOR           0x0040                                                          // this unit is a survivor of a pair
279 #define UCBF_REBUILD            0x0080                                                          // rebuild in progress on this device
280
281 // SCSI controls for RAID
282 #define SC_MY_RAID                      0xBF                    // our special CDB command byte for Win95... interface
283 #define MY_SCSI_QUERY1          0x32                    // byte 1 subcommand to query driver for RAID 1 informatation
284 #define MY_SCSI_REBUILD         0x40                    // byte 1 subcommand to reconstruct a mirrored pair
285 #define MY_SCSI_DEMOFAIL        0x54                    // byte 1 subcommand for RAID failure demonstration
286 #define MY_SCSI_ALARMMUTE       0x60                    // byte 1 subcommand to mute any alarm currently on
287
288 /************************************************/
289 /*              Timeout konstants                                               */
290 /************************************************/
291 #define TIMEOUT_READY                           100                     // 100 mSec
292 #define TIMEOUT_DRQ                                     300                     // 300 mSec
293 #define TIMEOUT_DATA                            (3 * HZ)        // 3 seconds
294
295 /************************************************/
296 /*              Misc. macros                                                    */
297 /************************************************/
298 #define ANY2SCSI(up, p)                                 \
299 ((UCHAR *)up)[0] = (((ULONG)(p)) >> 8); \
300 ((UCHAR *)up)[1] = ((ULONG)(p));
301
302 #define SCSI2LONG(up)                                   \
303 ( (((long)*(((UCHAR *)up))) << 16)              \
304 + (((long)(((UCHAR *)up)[1])) << 8)             \
305 + ((long)(((UCHAR *)up)[2])) )
306
307 #define XANY2SCSI(up, p)                                \
308 ((UCHAR *)up)[0] = ((long)(p)) >> 24;   \
309 ((UCHAR *)up)[1] = ((long)(p)) >> 16;   \
310 ((UCHAR *)up)[2] = ((long)(p)) >> 8;    \
311 ((UCHAR *)up)[3] = ((long)(p));
312
313 #define XSCSI2LONG(up)                                  \
314 ( (((long)(((UCHAR *)up)[0])) << 24)    \
315 + (((long)(((UCHAR *)up)[1])) << 16)    \
316 + (((long)(((UCHAR *)up)[2])) <<  8)    \
317 + ((long)(((UCHAR *)up)[3])) )
318
319 #define SelectSpigot(padapter,spigot)   outb_p (spigot, padapter->regStatSel)
320 #define WriteCommand(padapter,cmd)              outb_p (cmd, padapter->regStatCmd)
321 #define AtapiDevice(padapter,b)                 outb_p (b, padapter->regLba24);
322 #define AtapiCountLo(padapter,b)                outb_p (b, padapter->regLba8)
323 #define AtapiCountHi(padapter,b)                outb_p (b, padapter->regLba16)
324
325 /************************************************/
326 /*              SCSI CDB operation codes                                */
327 /************************************************/
328 #define SCSIOP_TEST_UNIT_READY          0x00
329 #define SCSIOP_REZERO_UNIT                      0x01
330 #define SCSIOP_REWIND                           0x01
331 #define SCSIOP_REQUEST_BLOCK_ADDR       0x02
332 #define SCSIOP_REQUEST_SENSE            0x03
333 #define SCSIOP_FORMAT_UNIT                      0x04
334 #define SCSIOP_READ_BLOCK_LIMITS        0x05
335 #define SCSIOP_REASSIGN_BLOCKS          0x07
336 #define SCSIOP_READ6                            0x08
337 #define SCSIOP_RECEIVE                          0x08
338 #define SCSIOP_WRITE6                           0x0A
339 #define SCSIOP_PRINT                            0x0A
340 #define SCSIOP_SEND                                     0x0A
341 #define SCSIOP_SEEK6                            0x0B
342 #define SCSIOP_TRACK_SELECT                     0x0B
343 #define SCSIOP_SLEW_PRINT                       0x0B
344 #define SCSIOP_SEEK_BLOCK                       0x0C
345 #define SCSIOP_PARTITION                        0x0D
346 #define SCSIOP_READ_REVERSE                     0x0F
347 #define SCSIOP_WRITE_FILEMARKS          0x10
348 #define SCSIOP_FLUSH_BUFFER                     0x10
349 #define SCSIOP_SPACE                            0x11
350 #define SCSIOP_INQUIRY                          0x12
351 #define SCSIOP_VERIFY6                          0x13
352 #define SCSIOP_RECOVER_BUF_DATA         0x14
353 #define SCSIOP_MODE_SELECT                      0x15
354 #define SCSIOP_RESERVE_UNIT                     0x16
355 #define SCSIOP_RELEASE_UNIT                     0x17
356 #define SCSIOP_COPY                                     0x18
357 #define SCSIOP_ERASE                            0x19
358 #define SCSIOP_MODE_SENSE                       0x1A
359 #define SCSIOP_START_STOP_UNIT          0x1B
360 #define SCSIOP_STOP_PRINT                       0x1B
361 #define SCSIOP_LOAD_UNLOAD                      0x1B
362 #define SCSIOP_RECEIVE_DIAGNOSTIC       0x1C
363 #define SCSIOP_SEND_DIAGNOSTIC          0x1D
364 #define SCSIOP_MEDIUM_REMOVAL           0x1E
365 #define SCSIOP_READ_CAPACITY            0x25
366 #define SCSIOP_READ                                     0x28
367 #define SCSIOP_WRITE                            0x2A
368 #define SCSIOP_SEEK                                     0x2B
369 #define SCSIOP_LOCATE                           0x2B
370 #define SCSIOP_WRITE_VERIFY                     0x2E
371 #define SCSIOP_VERIFY                           0x2F
372 #define SCSIOP_SEARCH_DATA_HIGH         0x30
373 #define SCSIOP_SEARCH_DATA_EQUAL        0x31
374 #define SCSIOP_SEARCH_DATA_LOW          0x32
375 #define SCSIOP_SET_LIMITS                       0x33
376 #define SCSIOP_READ_POSITION            0x34
377 #define SCSIOP_SYNCHRONIZE_CACHE        0x35
378 #define SCSIOP_COMPARE                          0x39
379 #define SCSIOP_COPY_COMPARE                     0x3A
380 #define SCSIOP_WRITE_DATA_BUFF          0x3B
381 #define SCSIOP_READ_DATA_BUFF           0x3C
382 #define SCSIOP_CHANGE_DEFINITION        0x40
383 #define SCSIOP_READ_SUB_CHANNEL         0x42
384 #define SCSIOP_READ_TOC                         0x43
385 #define SCSIOP_READ_HEADER                      0x44
386 #define SCSIOP_PLAY_AUDIO                       0x45
387 #define SCSIOP_PLAY_AUDIO_MSF           0x47
388 #define SCSIOP_PLAY_TRACK_INDEX         0x48
389 #define SCSIOP_PLAY_TRACK_RELATIVE      0x49
390 #define SCSIOP_PAUSE_RESUME                     0x4B
391 #define SCSIOP_LOG_SELECT                       0x4C
392 #define SCSIOP_LOG_SENSE                        0x4D
393 #define SCSIOP_MODE_SELECT10            0x55
394 #define SCSIOP_MODE_SENSE10                     0x5A
395 #define SCSIOP_LOAD_UNLOAD_SLOT         0xA6
396 #define SCSIOP_MECHANISM_STATUS         0xBD
397 #define SCSIOP_READ_CD                          0xBE
398
399 // IDE command definitions
400 #define IDE_COMMAND_ATAPI_RESET         0x08
401 #define IDE_COMMAND_READ                        0x20
402 #define IDE_COMMAND_WRITE                       0x30
403 #define IDE_COMMAND_RECALIBRATE         0x10
404 #define IDE_COMMAND_SEEK                        0x70
405 #define IDE_COMMAND_SET_PARAMETERS      0x91
406 #define IDE_COMMAND_VERIFY                      0x40
407 #define IDE_COMMAND_ATAPI_PACKET        0xA0
408 #define IDE_COMMAND_ATAPI_IDENTIFY      0xA1
409 #define IDE_CMD_READ_MULTIPLE           0xC4
410 #define IDE_CMD_WRITE_MULTIPLE          0xC5
411 #define IDE_CMD_SET_MULTIPLE            0xC6
412 #define IDE_COMMAND_IDENTIFY            0xEC
413
414 // IDE status definitions
415 #define IDE_STATUS_ERROR                        0x01
416 #define IDE_STATUS_INDEX                        0x02
417 #define IDE_STATUS_CORRECTED_ERROR      0x04
418 #define IDE_STATUS_DRQ                          0x08
419 #define IDE_STATUS_DSC                          0x10
420 #define IDE_STATUS_WRITE_FAULT          0x20
421 #define IDE_STATUS_DRDY                         0x40
422 #define IDE_STATUS_BUSY                         0x80
423
424 typedef struct _ATAPI_STATUS
425         {
426         CHAR    check           :1;
427         CHAR    reserved1       :1;
428         CHAR    corr            :1;
429         CHAR    drq                     :1;
430         CHAR    dsc                     :1;
431         CHAR    reserved2       :1;
432         CHAR    drdy            :1;
433         CHAR    bsy                     :1;
434         }       ATAPI_STATUS;
435
436 typedef struct _ATAPI_REASON
437         {
438         CHAR    cod                     :1;
439         CHAR    io                      :1;
440         CHAR    reserved1       :6;
441         }       ATAPI_REASON;
442
443 typedef struct _ATAPI_ERROR
444         {
445         CHAR    ili                     :1;
446         CHAR    eom                     :1;
447         CHAR    abort           :1;
448         CHAR    mcr                     :1;
449         CHAR    senseKey        :4;
450         }       ATAPI_ERROR;
451
452 // IDE error definitions
453 #define IDE_ERROR_AMNF                          0x01
454 #define IDE_ERROR_TKONF                         0x02
455 #define IDE_ERROR_ABRT                          0x04
456 #define IDE_ERROR_MCR                           0x08
457 #define IDE_ERROR_IDFN                          0x10
458 #define IDE_ERROR_MC                            0x20
459 #define IDE_ERROR_UNC                           0x40
460 #define IDE_ERROR_BBK                           0x80
461
462 // SCSI read capacity structure
463 typedef struct _READ_CAPACITY_DATA
464         {
465         ULONG blks;                             /* total blocks (converted to little endian) */
466         ULONG blksiz;                   /* size of each (converted to little endian) */
467         }       READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
468
469 // SCSI inquiry data
470 typedef struct _INQUIRYDATA
471         {
472         UCHAR DeviceType                        :5;
473         UCHAR DeviceTypeQualifier       :3;
474         UCHAR DeviceTypeModifier        :7;
475         UCHAR RemovableMedia            :1;
476     UCHAR Versions;
477     UCHAR ResponseDataFormat;
478     UCHAR AdditionalLength;
479     UCHAR Reserved[2];
480         UCHAR SoftReset                         :1;
481         UCHAR CommandQueue                      :1;
482         UCHAR Reserved2                         :1;
483         UCHAR LinkedCommands            :1;
484         UCHAR Synchronous                       :1;
485         UCHAR Wide16Bit                         :1;
486         UCHAR Wide32Bit                         :1;
487         UCHAR RelativeAddressing        :1;
488     UCHAR VendorId[8];
489     UCHAR ProductId[16];
490     UCHAR ProductRevisionLevel[4];
491     UCHAR VendorSpecific[20];
492     UCHAR Reserved3[40];
493         }       INQUIRYDATA, *PINQUIRYDATA;
494
495 // IDE IDENTIFY data
496 #pragma pack (1)
497 typedef struct _IDENTIFY_DATA
498         {
499     USHORT      GeneralConfiguration;           //  0
500     USHORT      NumberOfCylinders;                      //  1
501     USHORT      Reserved1;                                      //  2
502     USHORT      NumberOfHeads;                          //  3
503     USHORT      UnformattedBytesPerTrack;       //  4
504     USHORT      UnformattedBytesPerSector;      //  5
505     USHORT      SectorsPerTrack;                        //  6
506         USHORT  NumBytesISG;                            //  7 Byte Len - inter-sector gap
507         USHORT  NumBytesSync;                           //  8          - sync field
508         USHORT  NumWordsVUS;                            //  9 Len - Vendor Unique Info
509     USHORT      SerialNumber[10];                       // 10
510     USHORT      BufferType;                                     // 20
511     USHORT      BufferSectorSize;                       // 21
512     USHORT      NumberOfEccBytes;                       // 22
513     USHORT      FirmwareRevision[4];            // 23
514     USHORT      ModelNumber[20];                        // 27
515         USHORT  NumSectorsPerInt        :8;             // 47 Multiple Mode - Sec/Blk
516         USHORT  Reserved2                       :8;             // 47
517         USHORT  DoubleWordMode;                         // 48 flag for double word mode capable
518         USHORT  VendorUnique1           :8;             // 49
519         USHORT  SupportDMA                      :1;             // 49 DMA supported
520         USHORT  SupportLBA                      :1;             // 49 LBA supported
521         USHORT  SupportIORDYDisable     :1;             // 49 IORDY can be disabled
522         USHORT  SupportIORDY            :1;             // 49 IORDY supported
523         USHORT  ReservedPsuedoDMA       :1;             // 49 reserved for pseudo DMA mode support
524         USHORT  Reserved3                       :3;             // 49
525         USHORT  Reserved4;                                      // 50
526         USHORT  Reserved5                       :8;             // 51 Transfer Cycle Timing - PIO
527         USHORT  PIOCycleTime            :8;             // 51 Transfer Cycle Timing - PIO
528         USHORT  Reserved6                       :8;             // 52                       - DMA
529         USHORT  DMACycleTime            :8;             // 52                       - DMA
530         USHORT  Valid_54_58                     :1;             // 53 words 54 - 58 are valid
531         USHORT  Valid_64_70                     :1;             // 53 words 64 - 70 are valid
532         USHORT  Reserved7                       :14;    // 53
533         USHORT  LogNumCyl;                                      // 54 Current Translation - Num Cyl
534         USHORT  LogNumHeads;                            // 55                       Num Heads
535         USHORT  LogSectorsPerTrack;                     // 56                       Sec/Trk
536         ULONG   LogTotalSectors;                        // 57                       Total Sec
537         USHORT  CurrentNumSecPerInt     :8;             // 59 current setting for number of sectors per interrupt
538         USHORT  ValidNumSecPerInt       :1;             // 59 Current setting is valid for number of sectors per interrupt
539         USHORT  Reserved8                       :7;             // 59
540         ULONG   LBATotalSectors;                        // 60 LBA Mode - Sectors
541         USHORT  DMASWordFlags;                          // 62
542         USHORT  DMAMWordFlags;                          // 63
543         USHORT  AdvancedPIOSupport  :8;         // 64 Flow control PIO transfer modes supported
544         USHORT  Reserved9                       :8;             // 64
545         USHORT  MinMultiDMACycle;                       // 65 minimum multiword DMA transfer cycle time per word
546         USHORT  RecomendDMACycle;                       // 66 Manufacturer's recommende multiword DMA transfer cycle time
547         USHORT  MinPIOCycleWithoutFlow;         // 67 Minimum PIO transfer cycle time without flow control
548         USHORT  MinPIOCylceWithFlow;            // 68 Minimum PIO transfer cycle time with IORDY flow control
549         USHORT  ReservedSpace[256-69];          // 69
550         }       IDENTIFY_DATA, *PIDENTIFY_DATA;
551
552 // ATAPI configuration bits
553 typedef struct _ATAPI_GENERAL_0
554         {
555         USHORT  CmdPacketSize           :2;             // Command packet size
556         USHORT  Reserved1                       :3;
557         USHORT  CmdDrqType                      :2;
558         USHORT  Removable                       :1;
559         USHORT  DeviceType                      :5;
560         USHORT  Reserved2                       :1;
561         USHORT  ProtocolType            :2;
562         }       ATAPI_GENERAL_0;
563
564 #pragma pack ()