]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - sys/dev/hptmv/atapi.h
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / sys / dev / hptmv / atapi.h
1 /*
2  * Copyright (c) 2004-2005 HighPoint Technologies, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #ifndef _ATAPI_H_
30 #define _ATAPI_H_
31
32 #pragma pack(1)
33
34 /***************************************************************************
35  *            IDE IO Register File
36  ***************************************************************************/
37
38 /*
39  * IDE IO Port definition
40  */
41 typedef struct _IDE_REGISTERS_1 {
42     USHORT Data;               /* RW: Data port feature register      */
43     UCHAR BlockCount;          /* RW: Sector count               */
44     UCHAR BlockNumber;         /* RW: Sector number & LBA 0-7    */
45     UCHAR CylinderLow;         /* RW: Cylinder low & LBA 8-15    */
46     UCHAR CylinderHigh;        /* RW: Cylinder hign & LBA 16-23  */
47     UCHAR DriveSelect;         /* RW: Drive/head & LBA 24-27     */
48     UCHAR Command;             /* RO: Status WR:Command          */
49 } IDE_REGISTERS_1, *PIDE_REGISTERS_1;
50
51
52 /*
53  * IDE status definitions
54  */
55 #define IDE_STATUS_ERROR             0x01 /* Error Occurred in Execution    */
56 #define IDE_STATUS_INDEX             0x02 /* is vendor specific             */
57 #define IDE_STATUS_CORRECTED_ERROR   0x04 /* Corrected Data                 */
58 #define IDE_STATUS_DRQ               0x08 /* Ready to transfer data         */
59 #define IDE_STATUS_DSC               0x10 /* not defined in ATA-2           */
60 #define IDE_STATUS_DWF               0x20 /* Device Fault has been detected */
61 #define IDE_STATUS_DRDY              0x40 /* Device Ready to accept command */
62 #define IDE_STATUS_IDLE              0x50 /* Device is OK                   */
63 #define IDE_STATUS_BUSY              0x80 /* Device Busy, must wait         */
64
65
66 #define IDE_ERROR_BAD_BLOCK          0x80 /* Reserved now                   */
67 #define IDE_ERROR_DATA_ERROR         0x40 /* Uncorreectable  Data Error     */
68 #define IDE_ERROR_MEDIA_CHANGE       0x20 /* Media Changed                  */
69 #define IDE_ERROR_ID_NOT_FOUND       0x10 /* ID Not Found                   */
70 #define IDE_ERROR_MEDIA_CHANGE_REQ   0x08 /* Media Change Requested         */
71 #define IDE_ERROR_COMMAND_ABORTED    0x04 /* Aborted Command                */
72 #define IDE_ERROR_TRACK0_NOT_FOUND   0x02 /* Track 0 Not Found              */
73 #define IDE_ERROR_ADDRESS_NOT_FOUND  0x01 /* Address Mark Not Found         */
74
75
76 #define LBA_MODE                     0x40
77
78 /*
79  * IDE command definitions
80  */
81
82 #define IDE_COMMAND_RECALIBRATE      0x10 /* Recalibrate                    */
83 #define IDE_COMMAND_READ             0x20 /* Read Sectors with retry        */
84 #define IDE_COMMAND_WRITE            0x30 /* Write Sectors with retry       */
85 #define IDE_COMMAND_VERIFY           0x40 /* Read Verify Sectors with Retry */
86 #define IDE_COMMAND_SEEK             0x70 /* Seek                           */
87 #define IDE_COMMAND_SET_DRIVE_PARAMETER   0x91 /* Initialize Device Parmeters */
88 #define IDE_COMMAND_GET_MEDIA_STATUS 0xDA
89 #define IDE_COMMAND_DOOR_LOCK        0xDE /* Door Lock                      */
90 #define IDE_COMMAND_DOOR_UNLOCK      0xDF /* Door Unlock                          */
91 #define IDE_COMMAND_ENABLE_MEDIA_STATUS   0xEF /* Set Features              */
92 #define IDE_COMMAND_IDENTIFY         0xEC /* Identify Device                */
93 #define IDE_COMMAND_MEDIA_EJECT      0xED
94 #define IDE_COMMAND_SET_FEATURES     0xEF /* IDE set features command       */
95
96 #define IDE_COMMAND_FLUSH_CACHE      0xE7
97 #define IDE_COMMAND_STANDBY_IMMEDIATE 0xE0
98
99 #ifndef NOT_SUPPORT_MULTIPLE
100 #define IDE_COMMAND_READ_MULTIPLE    0xC4 /* Read Multiple                  */
101 #define IDE_COMMAND_WRITE_MULTIPLE   0xC5 /* Write Multiple                 */
102 #define IDE_COMMAND_SET_MULTIPLE     0xC6 /* Set Multiple Mode              */
103 #endif
104
105 #ifndef NOT_SUPPORT_DMA
106 #define IDE_COMMAND_DMA_READ        0xc8  /* IDE DMA read command           */
107 #define IDE_COMMAND_DMA_WRITE       0xca  /* IDE DMA write command          */
108 #endif
109
110 #define IDE_COMMAND_READ_DMA_QUEUE   0xc7 /* IDE read DMA queue command     */
111 #define IDE_COMMAND_WRITE_DMA_QUEUE  0xcc /* IDE write DMA queue command    */
112 #define IDE_COMMAND_SERVICE          0xA2 /* IDE service command command    */
113 #define IDE_COMMAND_NOP              0x00 /* IDE NOP command                */
114 #define IDE_STATUS_SRV               0x10
115 #define IDE_RELEASE_BUS              4
116
117 /*#define IDE_COMMAND_FLUSH_CACHE_EXT */
118 #define IDE_COMMAND_READ_DMA_EXT        0x25
119 #define IDE_COMMAND_READ_QUEUE_EXT              0x26
120 #define IDE_COMMAND_READ_MULTIPLE_EXT   0x29
121 #define IDE_COMMAND_READ_MAX_ADDR               0x27
122 #define IDE_COMMAND_READ_EXT                    0x24
123 #define IDE_COMMAND_VERIFY_EXT                  0x42
124 #define IDE_COMMAND_SET_MULTIPLE_EXT    0x37
125 #define IDE_COMMAND_WRITE_DMA_EXT               0x35
126 #define IDE_COMMAND_WRITE_QUEUE_EXT             0x36
127 #define IDE_COMMAND_WRITE_EXT                   0x34
128 #define IDE_COMMAND_WRITE_MULTIPLE_EXT  0x39
129
130 /*
131  * IDE_COMMAND_SET_FEATURES
132  */
133 #define FT_USE_ULTRA        0x40    /* Set feature for Ultra DMA           */
134 #define FT_USE_MWDMA        0x20    /* Set feature for MW DMA              */
135 #define FT_USE_SWDMA        0x10    /* Set feature for SW DMA              */
136 #define FT_USE_PIO          0x8     /* Set feature for PIO                 */
137 #define FT_DISABLE_IORDY    0x10    /* Set feature for disabling IORDY     */
138
139 /*
140  * S.M.A.R.T. commands
141  */
142 #define IDE_COMMAND_SMART       0xB0
143 #define SMART_READ_VALUES       0xd0
144 #define SMART_READ_THRESHOLDS   0xd1
145 #define SMART_AUTOSAVE          0xd2
146 #define SMART_SAVE              0xd3
147 #define SMART_IMMEDIATE_OFFLINE 0xd4
148 #define SMART_READ_LOG_SECTOR   0xd5
149 #define SMART_WRITE_LOG_SECTOR  0xd6
150 #define SMART_ENABLE            0xd8
151 #define SMART_DISABLE           0xd9
152 #define SMART_STATUS            0xda
153 #define SMART_AUTO_OFFLINE      0xdb
154
155  /***************************************************************************
156  *            IDE Control Register File
157  ***************************************************************************/
158
159 typedef struct _IDE_REGISTERS_2 {
160     UCHAR AlternateStatus;     /* RW: device control port        */
161 } IDE_REGISTERS_2, *PIDE_REGISTERS_2;
162
163
164 /*
165  * IDE drive control definitions
166  */
167 #define IDE_DC_DISABLE_INTERRUPTS    0x02
168 #define IDE_DC_RESET_CONTROLLER      0x04
169 #define IDE_DC_REENABLE_CONTROLLER   0x00
170
171 /***************************************************************************
172  *   MSNS:   Removable device
173  ***************************************************************************/
174 /*
175  * Media syatus
176  */
177 #define MSNS_NO_MEDIA             2
178 #define MSNS_MEDIA_CHANGE_REQUEST 8
179 #define MSNS_MIDIA_CHANGE         0x20
180 #define MSNS_WRITE_PROTECT        0x40
181 #define MSNS_READ_PROTECT         0x80
182
183 /***************************************************************************
184  *            ATAPI IO Register File
185  ***************************************************************************/
186
187 /*
188  * ATAPI register definition
189  */
190
191 typedef struct _ATAPI_REGISTERS_1 {
192     USHORT Data;
193     UCHAR InterruptReason;              /* Atapi Phase Port               */
194     UCHAR Unused1;
195     UCHAR ByteCountLow;                 /* Byte Count LSB                 */
196     UCHAR ByteCountHigh;                /* Byte Count MSB                 */
197     UCHAR DriveSelect;
198     UCHAR Command;
199 } ATAPI_REGISTERS_1, *PATAPI_REGISTERS_1;
200
201 /*
202  *    Atapi Error Status
203  */
204 #define IDE_ERROR_END_OF_MEDIA       IDE_ERROR_TRACK0_NOT_FOUND
205 #define IDE_ERROR_ILLEGAL_LENGTH     IDE_ERROR_ADDRESS_NOT_FOUND
206
207 /*
208  * ATAPI interrupt reasons
209  */
210 #define ATAPI_IR_COD 0x01
211 #define ATAPI_IR_IO  0x02
212
213 /* sense key */
214 #define ATAPI_SENSE_NO_SENSE         0x00
215 #define ATAPI_SENSE_RECOVERED_ERROR  0x01
216 #define ATAPI_SENSE_NOT_READY        0x02
217 #define ATAPI_SENSE_MEDIUM_ERROR     0x03
218 #define ATAPI_SENSE_HARDWARE_ERROR   0x04
219 #define ATAPI_SENSE_ILLEGAL_REQUEST  0x05
220 #define ATAPI_SENSE_UNIT_ATTENTION   0x06
221 #define ATAPI_SENSE_DATA_PROTECT     0x07
222 #define ATAPI_SENSE_BLANK_CHECK      0x08
223 #define ATAPI_SENSE_UNIQUE           0x09
224 #define ATAPI_SENSE_COPY_ABORTED     0x0A
225 #define ATAPI_SENSE_ABORTED_COMMAND  0x0B
226 #define ATAPI_SENSE_EQUAL            0x0C
227 #define ATAPI_SENSE_VOL_OVERFLOW     0x0D
228 #define ATAPI_SENSE_MISCOMPARE       0x0E
229 #define ATAPI_SENSE_RESERVED         0x0F
230
231 /* Additional Sense codes */
232 #define ATAPI_ASC_NO_SENSE           0x00
233 #define ATAPI_ASC_LUN_NOT_READY      0x04
234 #define ATAPI_ASC_TRACK_ERROR        0x14
235 #define ATAPI_ASC_SEEK_ERROR         0x15
236 #define ATAPI_ASC_REC_DATA_NOECC     0x17
237 #define ATAPI_ASC_REC_DATA_ECC       0x18
238 #define ATAPI_ASC_ILLEGAL_COMMAND    0x20
239 #define ATAPI_ASC_ILLEGAL_BLOCK      0x21
240 #define ATAPI_ASC_INVALID_CDB        0x24
241 #define ATAPI_ASC_INVALID_LUN        0x25
242 #define ATAPI_ASC_PROTECT            0x27
243 #define ATAPI_ASC_MEDIUM_CHANGED     0x28
244 #define ATAPI_ASC_BUS_RESET          0x29
245 #define ATAPI_ASC_NO_MEDIA_IN_DEVICE 0x3a
246 #define ATAPI_ASC_MUSIC_AREA         0xA0
247 #define ATAPI_ASC_DATA_AREA          0xA1
248 #define ATAPI_ASC_VOLUME_OVERFLOW    0xA7
249
250 /*
251  * IDE command definitions ( for ATAPI )
252  */
253
254 #define IDE_COMMAND_ATAPI_RESET      0x08 /* Atapi Software Reset command   */
255 #define IDE_COMMAND_ATAPI_PACKET     0xA0    /* Atapi Identify command         */
256 #define IDE_COMMAND_ATAPI_IDENTIFY   0xA1    /* Atapi Packet Command           */
257
258
259 /*
260  * ATAPI command definitions
261  */
262
263 #define ATAPI_TEST_UNIT_READY     0x00
264 #define ATAPI_REZERO_UNIT         0x01
265 #define ATAPI_REQUEST_SENSE       0x03
266 #define ATAPI_FORMAT_UNIT6        0x04
267 #define ATAPI_FORMAT_UNIT         0x24
268 #define ATAPI_INQUIRY             0x12
269 #define ATAPI_MODE_SELECT         0x15
270 #define ATAPI_RELEASE6            0x17
271 #define ATAPI_MODE_SENSE          0x1A
272 #define ATAPI_START_STOP_UNIT     0x1B
273 #define ATAPI_LOAD_UNLOAD         0x1B
274 #define ATAPI_RECEIVE_DIAGNOSTIC  0x1C
275 #define ATAPI_SEND_DIAGNOSTIC     0x1D
276 #define ATAPI_MEDIUM_REMOVAL      0x1E
277 #define ATAPI_READ_FORMAT_CAPACITY 0x23
278 #define ATAPI_READ_CAPACITY       0x25
279 #define ATAPI_READ                0x28
280 #define ATAPI_WRITE               0x2A
281 #define ATAPI_SEEK                0x2B
282 #define ATAPI_ERASE               0x2C
283 #define ATAPI_VERIFY              0x2F
284 #define ATAPI_WRITE_VERIFY        0x2E 
285 #define ATAPI_SYNCHRONIZE_CACHE   0x35
286 #define ATAPI_LOCK_CACHE          0x36
287 #define ATAPI_COMPARE             0x39
288 #define ATAPI_WRITE_BUFFER        0x3B
289 #define ATAPI_READ_DATA_BUFF      0x3C
290 #define ATAPI_READ_SUB_CHANNEL    0x42
291 #define ATAPI_READ_TOC            0x43
292 #define ATAPI_READ_HEADER         0x44
293 #define ATAPI_PLAY_AUDIO10        0x45
294 #define ATAPI_GET_CONFIGURATION   0x46
295 #define ATAPI_PLAY_AUDIO_MSF      0x47
296 #define ATAPI_GET_EVENT_STATUS_NOTIFICATION 0x4A
297 #define ATAPI_PAUSE_RESUME        0x4B
298 #define ATAPI_LOG_SELECT          0x4C
299 #define ATAPI_LOG_SENSE           0x4D
300 #define ATAPI_STOP_PLAY_SCAN      0x4E
301 #define ATAPI_READ_DISK_INFORMATION  0x51
302 #define ATAPI_READ_TRACK_INFORMATION 0x52
303 #define ATAPI_RESERVE_TRACK_RZONE    0x53
304 #define ATAPI_SEND_OPC_INFORMATION   0x54
305 #define ATAPI_MODE_SELECT10       0x55
306 #define ATAPI_RELEASE10           0x57
307 #define ATAPI_REPAIR_ZONE         0x58
308 #define ATAPI_MODE_SENSE10        0x5A
309 #define ATAPI_CLOSE_TRACK_SESSION 0x5B
310 #define ATAPI_READ_BUFFER_CAPACITY   0x5C
311 #define ATAPI_SEND_CUE_SHEET      0x5D
312 #define ATAPI_BLANK_COMMAND       0xA1 /*Provide the ability to erase any part of a CD-RW disc.*/
313 #define ATAPI_SEND_EVENT          0xA2  /* add for DVD */
314 #define ATAPI_SEND_KEY            0xA3  /* add for DVD  */
315 #define ATAPI_REPORT_KEY          0xA4
316 #define ATAPI_PLAY_AUDIO          0xA5
317 #define ATAPI_LOAD_UNLOAD_MEDIUM  0xA6
318 #define ATAPI_SET_READ_AHEAD      0xA7
319 #define ATAPI_READ12              0xA8
320 #define ATAPI_READ_DVD_STRUCTURE  0xAD
321 #define ATAPI_WRITE12             0xAA
322 #define ATAPI_GET_PERFORM_NOTIFICATION  0xAC  /* add for DVD-RW */
323 #define ATAPI_SET_STREAM          0xB6        /* add for DVD-RW */
324 #define ATAPI_READ_CD_MSF         0xB9
325 #define ATAPI_SCAN                0xBA
326 #define ATAPI_SET_SPEED           0xBB        /* no payload  */
327 #define ATAPI_MECHANISM_STATUS    0xBD
328 #define ATAPI_READ_CD             0xBE
329 #define ATAPI_SEND_DVD_STRUCTURE  0xBF        
330 #define ATAPI_SET_CDRW_SPEED      0xDA /*WindowsXP need*/
331
332 #define MODE_DSP_WRITE_PROTECT  0x80
333
334
335 /***************************************************************************
336  *            ATAPI IO Register File
337  ***************************************************************************/
338
339
340 typedef struct _ATAPI_REGISTERS_2 {
341     UCHAR AlternateStatus;
342 } ATAPI_REGISTERS_2, *PATAPI_REGISTERS_2;
343
344
345 /***************************************************************************
346  *            ATAPI packets
347  ***************************************************************************/
348 typedef struct _ATAPI_SENSE_DATA {
349 #ifdef __BIG_ENDIAN_BITFIELD
350     UCHAR Valid:1;
351     UCHAR ErrorCode:7;
352     UCHAR SegmentNumber;
353     UCHAR FileMark:1;
354     UCHAR EndOfMedia:1;
355     UCHAR IncorrectLength:1;
356     UCHAR Reserved:1;
357     UCHAR SenseKey:4;
358 #else 
359     UCHAR ErrorCode:7;
360     UCHAR Valid:1;
361     UCHAR SegmentNumber;
362     UCHAR SenseKey:4;
363     UCHAR Reserved:1;
364     UCHAR IncorrectLength:1;
365     UCHAR EndOfMedia:1;
366     UCHAR FileMark:1;
367 #endif
368     UCHAR Information[4];
369     UCHAR AdditionalSenseLength;
370     UCHAR CommandSpecificInformation[4];
371     UCHAR AdditionalSenseCode;
372     UCHAR AdditionalSenseCodeQualifier;
373     UCHAR FieldReplaceableUnitCode;
374     UCHAR SenseKeySpecific[3];
375 } ATAPI_SENSE_DATA, *PATAPI_SENSE_DATA;
376
377 /*
378  * IDENTIFY data
379  */
380 typedef struct _IDENTIFY_DATA {
381     USHORT GeneralConfiguration;            /* 00 00 */
382     USHORT NumberOfCylinders;               /* 02  1 */
383     USHORT Reserved1;                       /* 04  2 */
384     USHORT NumberOfHeads;                   /* 06  3 */
385     USHORT UnformattedBytesPerTrack;        /* 08  4 */
386     USHORT UnformattedBytesPerSector;       /* 0A  5 */
387     USHORT SectorsPerTrack;                 /* 0C  6 */
388     USHORT VendorUnique1[3];                /* 0E  7-9 */
389     USHORT SerialNumber[10];                /* 14  10-19 */
390     USHORT BufferType;                      /* 28  20 */
391     USHORT BufferSectorSize;                /* 2A  21 */
392     USHORT NumberOfEccBytes;                /* 2C  22 */
393     USHORT FirmwareRevision[4];             /* 2E  23-26 */
394     USHORT ModelNumber[20];                 /* 36  27-46 */
395     UCHAR  MaximumBlockTransfer;            /* 5E  47 */
396     UCHAR  VendorUnique2;                   /* 5F */
397     USHORT DoubleWordIo;                    /* 60  48 */
398     USHORT Capabilities;                    /* 62  49 */
399     USHORT Reserved2;                       /* 64  50 */
400     UCHAR  VendorUnique3;                   /* 66  51 */
401     UCHAR  PioCycleTimingMode;              /* 67 */
402     UCHAR  VendorUnique4;                   /* 68  52 */
403     UCHAR  DmaCycleTimingMode;              /* 69 */
404     USHORT TranslationFieldsValid;          /* 6A  53 */
405     USHORT NumberOfCurrentCylinders;        /* 6C  54 */
406     USHORT NumberOfCurrentHeads;            /* 6E  55 */
407     USHORT CurrentSectorsPerTrack;          /* 70  56 */
408     ULONG  CurrentSectorCapacity;           /* 72  57-58 */
409     USHORT CurrentMultiSectorSetting;       /* 76  59 */
410     ULONG  UserAddressableSectors;          /* 78  60-61 */
411     UCHAR  SingleWordDMASupport;            /* 7C  62 */
412     UCHAR  SingleWordDMAActive;             /* 7D */
413     UCHAR  MultiWordDMASupport;                 /* 7E  63 */
414     UCHAR  MultiWordDMAActive;              /* 7F */
415     UCHAR  AdvancedPIOModes;                /* 80  64 */
416     UCHAR  Reserved4;                       /* 81 */
417     USHORT MinimumMWXferCycleTime;          /* 82  65 */
418     USHORT RecommendedMWXferCycleTime;      /* 84  66 */
419     USHORT MinimumPIOCycleTime;             /* 86  67 */
420     USHORT MinimumPIOCycleTimeIORDY;        /* 88  68 */
421     USHORT Reserved5[2];                    /* 8A  69-70 */
422     USHORT ReleaseTimeOverlapped;           /* 8E  71 */
423     USHORT ReleaseTimeServiceCommand;       /* 90  72 */
424     USHORT MajorRevision;                   /* 92  73 */
425     USHORT MinorRevision;                   /* 94  74 */
426     USHORT MaxQueueDepth;                   /* 96  75 */
427         USHORT SataCapability;                  /*     76 */
428     USHORT Reserved6[9];                    /* 98   77-85 */
429     USHORT CommandSupport;                  /*     86 */
430     USHORT CommandEnable;                   /*     87 */
431     USHORT UtralDmaMode;                    /*     88 */
432     USHORT Reserved7[11];                   /*     89-99 */
433     ULONG  Lba48BitLow;                                         /*     101-100 */
434     ULONG  Lba48BitHigh;                                        /*     103-102 */
435     USHORT Reserved8[23];                   /*     104-126 */
436     USHORT SpecialFunctionsEnabled;         /*     127 */
437     USHORT Reserved9[128];                  /*     128-255 */
438
439 } IDENTIFY_DATA, *PIDENTIFY_DATA;
440
441 typedef struct _CONFIGURATION_IDENTIFY_DATA {
442         USHORT Revision;
443         USHORT MWDMAModeSupported;
444         USHORT UDMAModeSupported;
445         ULONG  MaximumLbaLow;
446         ULONG  MaximumLbaHigh;
447         USHORT CommandSupport;
448         USHORT Reserved[247];
449         UCHAR  Signature; /* 0xA5 */
450         UCHAR  CheckSum;
451 }
452 CONFIGURATION_IDENTIFY_DATA, *PCONFIGURATION_IDENTIFY_DATA;
453
454 /* */
455 /* Identify data without the Reserved4. */
456 /* */
457 typedef struct _IDENTIFY_DATA2 {
458     USHORT GeneralConfiguration;            /* 00 00 */
459     USHORT NumberOfCylinders;               /* 02  1 */
460     USHORT Reserved1;                       /* 04  2 */
461     USHORT NumberOfHeads;                   /* 06  3 */
462     USHORT UnformattedBytesPerTrack;        /* 08  4 */
463     USHORT UnformattedBytesPerSector;       /* 0A  5 */
464     USHORT SectorsPerTrack;                 /* 0C  6 */
465     USHORT VendorUnique1[3];                /* 0E  7-9 */
466     USHORT SerialNumber[10];                /* 14  10-19 */
467     USHORT BufferType;                      /* 28  20 */
468     USHORT BufferSectorSize;                /* 2A  21 */
469     USHORT NumberOfEccBytes;                /* 2C  22 */
470     USHORT FirmwareRevision[4];             /* 2E  23-26 */
471     USHORT ModelNumber[20];                 /* 36  27-46 */
472     UCHAR  MaximumBlockTransfer;            /* 5E  47 */
473     UCHAR  VendorUnique2;                   /* 5F */
474     USHORT DoubleWordIo;                    /* 60  48 */
475     USHORT Capabilities;                    /* 62  49 */
476     USHORT Reserved2;                       /* 64  50 */
477     UCHAR  VendorUnique3;                   /* 66  51 */
478     UCHAR  PioCycleTimingMode;              /* 67 */
479     UCHAR  VendorUnique4;                   /* 68  52 */
480     UCHAR  DmaCycleTimingMode;              /* 69 */
481     USHORT TranslationFieldsValid;              /* 6A  53 */
482     USHORT NumberOfCurrentCylinders;        /* 6C  54 */
483     USHORT NumberOfCurrentHeads;            /* 6E  55 */
484     USHORT CurrentSectorsPerTrack;          /* 70  56 */
485     ULONG  CurrentSectorCapacity;           /* 72  57-58 */
486     USHORT CurrentMultiSectorSetting;       /*     59 */
487     ULONG  UserAddressableSectors;          /*     60-61 */
488     UCHAR  SingleWordDMASupport;                /*     62 */
489     UCHAR  SingleWordDMAActive;
490     UCHAR  MultiWordDMASupport;                 /*     63 */
491     UCHAR  MultiWordDMAActive;
492     UCHAR  AdvancedPIOModes;                    /*     64 */
493     UCHAR  Reserved4;
494     USHORT MinimumMWXferCycleTime;          /*     65 */
495     USHORT RecommendedMWXferCycleTime;      /*     66 */
496     USHORT MinimumPIOCycleTime;             /*     67 */
497     USHORT MinimumPIOCycleTimeIORDY;        /*     68 */
498     USHORT Reserved5[2];                    /*     69-70 */
499     USHORT ReleaseTimeOverlapped;           /*     71 */
500     USHORT ReleaseTimeServiceCommand;       /*     72 */
501     USHORT MajorRevision;                   /*     73 */
502     USHORT MinorRevision;                   /*     74 */
503 /*    USHORT Reserved6[14];                 //     75-88 */
504 } IDENTIFY_DATA2, *PIDENTIFY_DATA2;
505
506 #define IDENTIFY_DATA_SIZE sizeof(IDENTIFY_DATA2)
507
508 /* */
509 /* IDENTIFY DMA timing cycle modes. */
510 /* */
511
512 #define IDENTIFY_DMA_CYCLES_MODE_0 0x00
513 #define IDENTIFY_DMA_CYCLES_MODE_1 0x01
514 #define IDENTIFY_DMA_CYCLES_MODE_2 0x02
515
516 /*
517  * Mode definitions
518  */
519 typedef enum _DISK_MODE
520 {
521         IDE_PIO_0 = 0,
522         IDE_PIO_1,
523         IDE_PIO_2,
524         IDE_PIO_3,
525         IDE_PIO_4,
526         IDE_MWDMA_0,
527         IDE_MWDMA_1,
528         IDE_MWDMA_2,
529         IDE_UDMA_0,
530         IDE_UDMA_1,
531         IDE_UDMA_2,
532         IDE_UDMA_3,
533         IDE_UDMA_4,
534         IDE_UDMA_5,
535         IDE_UDMA_6,
536         IDE_UDMA_7,
537 } DISK_MODE;
538
539 /***************************************************************************
540  *            IDE Macro
541  ***************************************************************************/
542 #ifndef MAX_LBA_T
543 #define MAX_LBA_T ((LBA_T)-1)
544 #endif
545
546 #define SECTOR_TO_BYTE_SHIFT 9
547 #define SECTOR_TO_BYTE(x)  ((ULONG)(x) << SECTOR_TO_BYTE_SHIFT)
548
549 #define mGetStatus(IOPort2)           (UCHAR)InPort(&IOPort2->AlternateStatus)
550 #define mUnitControl(IOPort2, Value)  OutPort(&IOPort2->AlternateStatus,(UCHAR)(Value))
551
552 #define mGetErrorCode(IOPort)         (UCHAR)InPort((PUCHAR)&IOPort->Data+1)
553 #define mSetFeaturePort(IOPort,x)     OutPort((PUCHAR)&IOPort->Data+1, x)
554 #define mSetBlockCount(IOPort,x)      OutPort(&IOPort->BlockCount, x)
555 #define mGetBlockCount(IOPort)        (UCHAR)InPort(&IOPort->BlockCount)
556 #define mGetInterruptReason(IOPort)   (UCHAR)InPort(&IOPort->BlockCount)
557 #define mSetBlockNumber(IOPort,x)     OutPort(&IOPort->BlockNumber, x)
558 #define mGetBlockNumber(IOPort)       (UCHAR)InPort((PUCHAR)&IOPort->BlockNumber)
559 #define mGetByteLow(IOPort)           (UCHAR)InPort(&IOPort->CylinderLow)
560 #define mSetCylinderLow(IOPort,x)         OutPort(&IOPort->CylinderLow, x)
561 #define mGetByteHigh(IOPort)          (UCHAR)InPort(&IOPort->CylinderHigh)
562 #define mSetCylinderHigh(IOPort,x)    OutPort(&IOPort->CylinderHigh, x)
563 #define mGetBaseStatus(IOPort)        (UCHAR)InPort(&IOPort->Command)
564 #ifdef SUPPORT_HPT601
565 #define mSelectUnit(IOPort,UnitId)  do {\
566                 OutPort(&IOPort->DriveSelect, (UCHAR)(UnitId));\
567                 OutPort(&IOPort->DriveSelect, (UCHAR)(UnitId));\
568                 } while (0)
569 #else 
570 #define mSelectUnit(IOPort,UnitId)    OutPort(&IOPort->DriveSelect, (UCHAR)(UnitId))
571 #endif
572 #define mGetUnitNumber(IOPort)        InPort(&IOPort->DriveSelect)
573 #define mIssueCommand(IOPort,Cmd)     OutPort(&IOPort->Command, (UCHAR)(Cmd))
574
575 /*
576  * WDC old disk, don't care right now
577  */
578 #define WDC_MW1_FIX_FLAG_OFFSET        129
579 #define WDC_MW1_FIX_FLAG_VALUE        0x00005555
580
581 #pragma pack()  
582 #endif
583
584
585