xref: /freebsd/sys/dev/isci/scil/intel_ata.h (revision 19261079)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3  *
4  * This file is provided under a dual BSD/GPLv2 license.  When using or
5  * redistributing this file, you may do so under either license.
6  *
7  * GPL LICENSE SUMMARY
8  *
9  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of version 2 of the GNU General Public License as
13  * published by the Free Software Foundation.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23  * The full GNU General Public License is included in this distribution
24  * in the file called LICENSE.GPL.
25  *
26  * BSD LICENSE
27  *
28  * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms, with or without
32  * modification, are permitted provided that the following conditions
33  * are met:
34  *
35  *   * Redistributions of source code must retain the above copyright
36  *     notice, this list of conditions and the following disclaimer.
37  *   * Redistributions in binary form must reproduce the above copyright
38  *     notice, this list of conditions and the following disclaimer in
39  *     the documentation and/or other materials provided with the
40  *     distribution.
41  *
42  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53  *
54  * $FreeBSD$
55  */
56 /**
57  * @file
58  * @brief This file defines all of the ATA related constants, enumerations,
59  *        and types.  Please note that this file does not necessarily contain
60  *        an exhaustive list of all constants, commands, sub-commands, etc.
61  */
62 
63 #ifndef _ATA_H_
64 #define _ATA_H_
65 
66 #include <dev/isci/types.h>
67 
68 /**
69  * @name ATA_COMMAND_CODES
70  *
71  * These constants depict the various ATA command codes defined
72  * in the ATA/ATAPI specification.
73  */
74 /*@{*/
75 #define ATA_IDENTIFY_DEVICE            0xEC
76 #define ATA_CHECK_POWER_MODE           0xE5
77 #define ATA_STANDBY                    0xE2
78 #define ATA_STANDBY_IMMED              0xE0
79 #define ATA_IDLE_IMMED                 0xE1
80 #define ATA_IDLE                       0xE3
81 #define ATA_FLUSH_CACHE                0xE7
82 #define ATA_FLUSH_CACHE_EXT            0xEA
83 #define ATA_READ_DMA_EXT               0x25
84 #define ATA_READ_DMA                   0xC8
85 #define ATA_READ_SECTORS_EXT           0x24
86 #define ATA_READ_SECTORS               0x20
87 #define ATA_WRITE_DMA_EXT              0x35
88 #define ATA_WRITE_DMA                  0xCA
89 #define ATA_WRITE_SECTORS_EXT          0x34
90 #define ATA_WRITE_SECTORS              0x30
91 #define ATA_WRITE_UNCORRECTABLE        0x45
92 #define ATA_READ_VERIFY_SECTORS        0x40
93 #define ATA_READ_VERIFY_SECTORS_EXT    0x42
94 #define ATA_READ_BUFFER                0xE4
95 #define ATA_WRITE_BUFFER               0xE8
96 #define ATA_EXECUTE_DEVICE_DIAG        0x90
97 #define ATA_SET_FEATURES               0xEF
98 #define ATA_SMART                      0xB0
99 #define ATA_PACKET_IDENTIFY            0xA1
100 #define ATA_PACKET                     0xA0
101 #define ATA_READ_FPDMA                 0x60
102 #define ATA_WRITE_FPDMA                0x61
103 #define ATA_READ_LOG_EXT               0x2F
104 #define ATA_NOP                        0x00
105 #define ATA_DEVICE_RESET               0x08
106 #define ATA_MEDIA_EJECT                0xED
107 #define ATA_SECURITY_UNLOCK            0xF2
108 #define ATA_SECURITY_FREEZE_LOCK       0xF5
109 #define ATA_DATA_SET_MANAGEMENT        0x06
110 #define ATA_DOWNLOAD_MICROCODE         0x92
111 #define ATA_WRITE_STREAM_DMA_EXT       0x3A
112 #define ATA_READ_LOG_DMA_EXT           0x47
113 #define ATA_READ_STREAM_DMA_EXT        0x2A
114 #define ATA_WRITE_DMA_FUA              0x3D
115 #define ATA_WRITE_LOG_DMA_EXT          0x57
116 #define ATA_READ_DMA_QUEUED            0xC7
117 #define ATA_READ_DMA_QUEUED_EXT        0x26
118 #define ATA_WRITE_DMA_QUEUED           0xCC
119 #define ATA_WRITE_DMA_QUEUED_EXT       0x36
120 #define ATA_WRITE_DMA_QUEUED_FUA_EXT   0x3E
121 #define ATA_READ_MULTIPLE              0xC4
122 #define ATA_READ_MULTIPLE_EXT          0x29
123 #define ATA_WRITE_MULTIPLE             0xC5
124 #define ATA_WRITE_MULTIPLE_EXT         0x39
125 #define ATA_WRITE_MULTIPLE_FUA_EXT     0xCE
126 
127 
128 /*@}*/
129 
130 /**
131  * @name ATA_SMART_SUB_COMMAND_CODES
132  *
133  * These constants define the ATA SMART command sub-codes that can be
134  * executed.
135  */
136 /*@{*/
137 #define ATA_SMART_SUB_CMD_ENABLE        0xD8
138 #define ATA_SMART_SUB_CMD_DISABLE       0xD9
139 #define ATA_SMART_SUB_CMD_RETURN_STATUS 0xDA
140 #define ATA_SMART_SUB_CMD_READ_LOG      0xD5
141 /*@}*/
142 
143 /**
144  * @name ATA_SET_FEATURES_SUB_COMMAND_CODES
145  *
146  * These constants define the ATA SET FEATURES command sub-codes that can
147  * be executed.
148  */
149 /*@{*/
150 #define ATA_SET_FEATURES_SUB_CMD_ENABLE_CACHE       0x02
151 #define ATA_SET_FEATURES_SUB_CMD_DISABLE_CACHE      0x82
152 #define ATA_SET_FEATURES_SUB_CMD_DISABLE_READ_AHEAD 0x55
153 #define ATA_SET_FEATURES_SUB_CMD_ENABLE_READ_AHEAD  0xAA
154 #define ATA_SET_FEATURES_SUB_CMD_SET_TRANSFER_MODE  0x3
155 /*@}*/
156 
157 /**
158  * @name ATA_READ_LOG_EXT_PAGE_CODES
159  *
160  * This is a list of log page codes available for use.
161  */
162 /*@{*/
163 #define ATA_LOG_PAGE_NCQ_ERROR                  0x10
164 #define ATA_LOG_PAGE_SMART_SELF_TEST            0x06
165 #define ATA_LOG_PAGE_EXTENDED_SMART_SELF_TEST   0x07
166 /*@}*/
167 
168 /**
169  * @name ATA_LOG_PAGE_NCQ_ERROR_CONSTANTS
170  *
171  * These constants define standard values for use when requesting the NCQ
172  * error log page.
173  */
174 /*@{*/
175 #define ATA_LOG_PAGE_NCQ_ERROR_SECTOR        0
176 #define ATA_LOG_PAGE_NCQ_ERROR_SECTOR_COUNT  1
177 /*@}*/
178 
179 /**
180  * @name ATA_STATUS_REGISTER_BITS
181  *
182  * The following are status register bit definitions per ATA/ATAPI-7.
183  */
184 /*@{*/
185 #define ATA_STATUS_REG_BSY_BIT          0x80
186 #define ATA_STATUS_REG_DEVICE_FAULT_BIT 0x20
187 #define ATA_STATUS_REG_ERROR_BIT        0x01
188 /*@}*/
189 
190 /**
191  * @name ATA_ERROR_REGISTER_BITS
192  *
193  * The following are error register bit definitions per ATA/ATAPI-7.
194  */
195 /*@{*/
196 #define ATA_ERROR_REG_NO_MEDIA_BIT              0x02
197 #define ATA_ERROR_REG_ABORT_BIT                 0x04
198 #define ATA_ERROR_REG_MEDIA_CHANGE_REQUEST_BIT  0x08
199 #define ATA_ERROR_REG_ID_NOT_FOUND_BIT          0x10
200 #define ATA_ERROR_REG_MEDIA_CHANGE_BIT          0x20
201 #define ATA_ERROR_REG_UNCORRECTABLE_BIT         0x40
202 #define ATA_ERROR_REG_WRITE_PROTECTED_BIT       0x40
203 #define ATA_ERROR_REG_ICRC_BIT                  0x80
204 /*@}*/
205 
206 /**
207  * @name ATA_CONTROL_REGISTER_BITS
208  *
209  * The following are control register bit definitions per ATA/ATAPI-7
210  */
211 /*@{*/
212 #define ATA_CONTROL_REG_INTERRUPT_ENABLE_BIT 0x02
213 #define ATA_CONTROL_REG_SOFT_RESET_BIT       0x04
214 #define ATA_CONTROL_REG_HIGH_ORDER_BYTE_BIT  0x80
215 /*@}*/
216 
217 /**
218  * @name ATA_DEVICE_HEAD_REGISTER_BITS
219  *
220  * The following are device/head register bit definitions per ATA/ATAPI-7.
221  */
222 /*@{*/
223 #define ATA_DEV_HEAD_REG_LBA_MODE_ENABLE  0x40
224 #define ATA_DEV_HEAD_REG_FUA_ENABLE       0x80
225 /*@}*/
226 
227 /**
228  * @name ATA_IDENTIFY_DEVICE_FIELD_LENGTHS
229  *
230  * The following constants define the number of bytes contained in various
231  * fields found in the IDENTIFY DEVICE data structure.
232  */
233 /*@{*/
234 #define ATA_IDENTIFY_SERIAL_NUMBER_LEN        20
235 #define ATA_IDENTIFY_MODEL_NUMBER_LEN         40
236 #define ATA_IDENTIFY_FW_REVISION_LEN          8
237 #define ATA_IDENTIFY_48_LBA_LEN               8
238 #define ATA_IDENTIFY_MEDIA_SERIAL_NUMBER_LEN  30
239 #define ATA_IDENTIFY_WWN_LEN                  8
240 /*@}*/
241 
242 /**
243  * @name ATA_IDENTIFY_DEVICE_FIELD_MASKS
244  *
245  * The following constants define bit masks utilized to determine if a
246  * feature is supported/enabled or if a bit is simply set inside of the
247  * IDENTIFY DEVICE data structure.
248  */
249 /*@{*/
250 #define ATA_IDENTIFY_REMOVABLE_MEDIA_ENABLE              0x0080
251 #define ATA_IDENTIFY_CAPABILITIES1_NORMAL_DMA_ENABLE     0x0100
252 #define ATA_IDENTIFY_CAPABILITIES1_STANDBY_ENABLE        0x2000
253 #define ATA_IDENTIFY_COMMAND_SET_SUPPORTED0_SMART_ENABLE 0x0001
254 #define ATA_IDENTIFY_COMMAND_SET_SUPPORTED1_48BIT_ENABLE 0x0400
255 #define ATA_IDENTIFY_COMMAND_SET_WWN_SUPPORT_ENABLE      0x0100
256 #define ATA_IDENTIFY_COMMAND_SET_ENABLED0_SMART_ENABLE   0x0001
257 #define ATA_IDENTIFY_SATA_CAPABILITIES_NCQ_ENABLE        0x0100
258 #define ATA_IDENTIFY_NCQ_QUEUE_DEPTH_ENABLE              0x001F
259 #define ATA_IDENTIFY_SECTOR_LARGER_THEN_512_ENABLE       0x0100
260 #define ATA_IDENTIFY_LOGICAL_SECTOR_PER_PHYSICAL_SECTOR_MASK   0x000F
261 #define ATA_IDENTIFY_LOGICAL_SECTOR_PER_PHYSICAL_SECTOR_ENABLE 0x2000
262 #define ATA_IDENTIFY_WRITE_UNCORRECTABLE_SUPPORT         0x0004
263 #define ATA_IDENTIFY_COMMAND_SET_SMART_SELF_TEST_SUPPORTED     0x0002
264 #define ATA_IDENTIFY_COMMAND_SET_DSM_TRIM_SUPPORTED            0x0001
265 #define ATA_IDENTIFY_COMMAND_ADDL_SUPPORTED_DETERMINISTIC_READ 0x4000
266 #define ATA_IDENTIFY_COMMAND_ADDL_SUPPORTED_READ_ZERO          0x0020
267 /*@}*/
268 
269 /**
270  * @name ATAPI_IDENTIFY_DEVICE_FIELD_MASKS
271  *
272  * These constants define the various bit definitions for the
273  * fields in the PACKET IDENTIFY DEVICE data structure.
274  */
275 /*@{*/
276 #define ATAPI_IDENTIFY_16BYTE_CMD_PCKT_ENABLE       0x01
277 /*@}*/
278 
279 /**
280  * @name ATA_PACKET_FEATURE_BITS
281  *
282  * These constants define the various bit definitions for the
283  * ATA PACKET feature register.
284  */
285 /*@{*/
286 #define ATA_PACKET_FEATURE_DMA     0x01
287 #define ATA_PACKET_FEATURE_OVL     0x02
288 #define ATA_PACKET_FEATURE_DMADIR  0x04
289 /*@}*/
290 
291 /**
292  * @name ATA_Device_Power_Mode_Values
293  *
294  * These constants define the power mode values returned by
295  * ATA_Check_Power_Mode
296  */
297 /*@{*/
298 #define ATA_STANDBY_POWER_MODE    0x00
299 #define ATA_IDLE_POWER_MODE       0x80
300 #define ATA_ACTIVE_POWER_MODE     0xFF
301 /*@}*/
302 
303 /**
304  * @name ATA_WRITE_UNCORRECTABLE feature field values
305  *
306  * These constants define the Write Uncorrectable feature values
307  * used with the SATI translation.
308  */
309 /*@{*/
310 #define ATA_WRITE_UNCORRECTABLE_PSEUDO    0x55
311 #define ATA_WRITE_UNCORRECTABLE_FLAGGED   0xAA
312 /*@}*/
313 
314 
315 
316 /**
317  * @name ATA_SECURITY_STATUS field values
318  *
319  * These constants define the mask of the securityStatus field and the various bits within it
320  */
321 /*@{*/
322 #define ATA_SECURITY_STATUS_SUPPORTED      0x0001
323 #define ATA_SECURITY_STATUS_ENABLED        0x0002
324 #define ATA_SECURITY_STATUS_LOCKED         0x0004
325 #define ATA_SECURITY_STATUS_FROZEN         0x0008
326 #define ATA_SECURITY_STATUS_EXPIRED        0x0010
327 #define ATA_SECURITY_STATUS_ERASESUPPORTED 0x0020
328 #define ATA_SECURITY_STATUS_RESERVED       0xFEC0
329 #define ATA_SECURITY_STATUS_SECURITYLEVEL  0x0100
330 /*@}*/
331 
332 /**
333  * @struct ATA_IDENTIFY_DEVICE
334  *
335  * @brief This structure depicts the ATA IDENTIFY DEVICE data format.
336  */
337 typedef struct ATA_IDENTIFY_DEVICE_DATA
338 {
339    U16   general_config_bits;                             // word  00
340    U16   obsolete0;                                       // word  01 (num cylinders)
341    U16   vendor_specific_config_bits;                     // word  02
342    U16   obsolete1;                                       // word  03 (num heads)
343    U16   retired1[2];                                     // words 04-05
344    U16   obsolete2;                                       // word  06 (sectors / track)
345    U16   reserved_for_compact_flash1[2];                  // words 07-08
346    U16   retired0;                                        // word  09
347    U8    serial_number[ATA_IDENTIFY_SERIAL_NUMBER_LEN];   // word 10-19
348    U16   retired2[2];                                     // words 20-21
349    U16   obsolete4;                                       // word  22
350    U8    firmware_revision[ATA_IDENTIFY_FW_REVISION_LEN]; // words 23-26
351    U8    model_number[ATA_IDENTIFY_MODEL_NUMBER_LEN];     // words 27-46
352    U16   max_sectors_per_multiple;                        // word  47
353    U16   reserved0;                                       // word  48
354    U16   capabilities1;                                   // word  49
355    U16   capabilities2;                                   // word  50
356    U16   obsolete5[2];                                    // words 51-52
357    U16   validity_bits;                                   // word  53
358    U16   obsolete6[5];                                    // words 54-58 Used to be:
359                                                           // current cylinders,
360                                                           // current heads,
361                                                           // current sectors/Track,
362                                                           // current capacity
363    U16   current_max_sectors_per_multiple;                // word  59
364    U8    total_num_sectors[4];                            // words 60-61
365    U16   obsolete7;                                       // word  62
366    U16   multi_word_dma_mode;                             // word  63
367    U16   pio_modes_supported;                             // word  64
368    U16   min_multiword_dma_transfer_cycle;                // word  65
369    U16   rec_min_multiword_dma_transfer_cycle;            // word  66
370    U16   min_pio_transfer_no_flow_ctrl;                   // word  67
371    U16   min_pio_transfer_with_flow_ctrl;                 // word  68
372    U16   additional_supported;                            // word  69
373    U16   reserved1;                                       // word  70
374    U16   reserved2[4];                                    // words 71-74
375    U16   queue_depth;                                     // word  75
376    U16   serial_ata_capabilities;                         // word  76
377    U16   serial_ata_reserved;                             // word  77
378    U16   serial_ata_features_supported;                   // word  78
379    U16   serial_ata_features_enabled;                     // word  79
380    U16   major_version_number;                            // word  80
381    U16   minor_version_number;                            // word  81
382    U16   command_set_supported0;                          // word  82
383    U16   command_set_supported1;                          // word  83
384    U16   command_set_supported_extention;                 // word  84
385    U16   command_set_enabled0;                            // word  85
386    U16   command_set_enabled1;                            // word  86
387    U16   command_set_default;                             // word  87
388    U16   ultra_dma_mode;                                  // word  88
389    U16   security_erase_completion_time;                  // word  89
390    U16   enhanced_security_erase_time;                    // word  90
391    U16   current_power_mgmt_value;                        // word  91
392    U16   master_password_revision;                        // word  92
393    U16   hardware_reset_result;                           // word  93
394    U16   current_acoustic_management_value;               // word  94
395    U16   stream_min_request_size;                         // word  95
396    U16   stream_transfer_time;                            // word  96
397    U16   stream_access_latency;                           // word  97
398    U16   stream_performance_granularity[2];               // words 98-99
399    U8    max_48bit_lba[ATA_IDENTIFY_48_LBA_LEN];          // words 100-103
400    U16   streaming_transfer_time;                         // word  104
401    U16   max_lba_range_entry_blocks;                      // word  105
402    U16   physical_logical_sector_info;                    // word  106
403    U16   acoustic_test_interseek_delay;                   // word  107
404    U8    world_wide_name[ATA_IDENTIFY_WWN_LEN];           // words 108-111
405    U8    reserved_for_wwn_extention[ATA_IDENTIFY_WWN_LEN];// words 112-115
406    U16   reserved4;                                       // word  116
407    U8    words_per_logical_sector[4];                     // words 117-118
408    U16   command_set_supported2;                          // word  119
409    U16   reserved5[7];                                    // words 120-126
410    U16   removable_media_status;                          // word  127
411    U16   security_status;                                 // word  128
412    U16   vendor_specific1[31];                            // words 129-159
413    U16   cfa_power_mode1;                                 // word  160
414    U16   reserved_for_compact_flash2[7];                  // words 161-167
415    U16   device_nominal_form_factor;                      // word  168
416    U16   data_set_management;                             // word  169
417    U16   reserved_for_compact_flash3[6];                  // words 170-175
418    U16   current_media_serial_number[ATA_IDENTIFY_MEDIA_SERIAL_NUMBER_LEN];//words 176-205
419    U16   reserved6[3];                                    // words 206-208
420    U16   logical_sector_alignment;                        // words 209
421    U16   reserved7[7];                                    // words 210-216
422    U16   nominal_media_rotation_rate;                     // word  217
423    U16   reserved8[16];                                   // words 218-233
424    U16   min_num_blocks_per_microcode;                    // word  234
425    U16   max_num_blocks_per_microcode;                    // word  235
426    U16   reserved9[19];                                   // words 236-254
427    U16   integrity_word;                                  // word  255
428 
429 } ATA_IDENTIFY_DEVICE_DATA_T;
430 
431 #define ATA_IDENTIFY_DEVICE_GET_OFFSET(field_name) \
432    ((POINTER_UINT)&(((ATA_IDENTIFY_DEVICE_DATA_T*)0)->field_name))
433 #define ATA_IDENTIFY_DEVICE_WCE_ENABLE  0x20
434 #define ATA_IDENTIFY_DEVICE_RA_ENABLE   0x40
435 
436 /**
437  * @struct ATAPI_IDENTIFY_PACKET_DATA
438  *
439  * @brief The following structure depicts the ATA-ATAPI 7 version of the
440  *        IDENTIFY PACKET DEVICE data structure.
441  */
442 typedef struct ATAPI_IDENTIFY_PACKET_DEVICE
443 {
444    U16   generalConfigBits;                      // word  00
445    U16   reserved0;                              // word  01 (num cylinders)
446    U16   uniqueConfigBits;                       // word  02
447    U16   reserved1[7];                           // words 03 - 09
448    U8    serialNumber[ATA_IDENTIFY_SERIAL_NUMBER_LEN];  // word 10-19
449    U16   reserved2[3];                           // words 20-22
450    U8    firmwareRevision[ATA_IDENTIFY_FW_REVISION_LEN];// words 23-26
451    U8    modelNumber[ATA_IDENTIFY_MODEL_NUMBER_LEN];    // words 27-46
452    U16   reserved4[2];                           // words 47-48
453    U16   capabilities1;                          // word  49
454    U16   capabilities2;                          // word  50
455    U16   obsolete0[2];                           // words 51-52
456    U16   validityBits;                           // word  53
457    U16   reserved[8];                            // words 54-61
458 
459    U16   DMADIRBitRequired;                      // word  62, page2
460    U16   multiWordDmaMode;                       // word  63
461    U16   pioModesSupported;                      // word  64
462    U16   minMultiwordDmaTransferCycle;           // word  65
463    U16   recMinMultiwordDmaTransferCycle;        // word  66
464    U16   minPioTransferNoFlowCtrl;               // word  67
465    U16   minPioTransferWithFlowCtrl;             // word  68
466    U16   reserved6[2];                           // words 69-70
467    U16   nsFromPACKETReceiptToBusRelease;        // word  71
468    U16   nsFromSERVICEReceiptToBSYreset;         // wore  72
469    U16   reserved7[2];                           // words 73-74
470    U16   queueDepth;                             // word  75
471    U16   serialAtaCapabilities;                  // word  76
472    U16   serialAtaReserved;                      // word  77
473    U16   serialAtaFeaturesSupported;             // word  78
474    U16   serialAtaFeaturesEnabled;               // word  79
475 
476    U16   majorVersionNumber;                     // word  80, page3
477    U16   minorVersionNumber;                     // word  81
478    U16   commandSetSupported0;                   // word  82
479    U16   commandSetSupported1;                   // word  83
480 
481    U16   commandSetSupportedExtention;           // word  84, page4
482    U16   commandSetEnabled0;                     // word  85
483    U16   commandSetEnabled1;                     // word  86
484    U16   commandSetDefault;                      // word  87
485 
486    U16   ultraDmaMode;                           // word  88, page5
487    U16   reserved8[4];                           // words 89 - 92
488 
489    U16   hardwareResetResult;                    // word  93, page6
490    U16   currentAcousticManagementValue;         // word  94
491    U16   reserved9[30];                          // words 95-124
492    U16   ATAPIByteCount0Behavior;                // word  125
493    U16   obsolete1;                              // word  126
494    U16   removableMediaStatus;                   // word  127,
495 
496    U16   securityStatus;                         // word  128, page7
497    U16   vendorSpecific1[31];                    // words 129-159
498    U16   reservedForCompactFlash[16];            // words 160-175
499    U16   reserved10[79];                         // words 176-254
500    U16   integrityWord;                          // word  255
501 } ATAPI_IDENTIFY_PACKET_DEVICE_T;
502 
503 /**
504 * @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
505 *
506 * @brief The following structure depicts the ATA-8 version of the
507 *        Extended SMART self test log page descriptor entry.
508 */
509 typedef union ATA_DESCRIPTOR_ENTRY
510 {
511       struct DESCRIPTOR_ENTRY
512       {
513          U8 lba_field;
514          U8 status_byte;
515          U8 time_stamp_low;
516          U8 time_stamp_high;
517          U8 checkpoint_byte;
518          U8 failing_lba_low;
519          U8 failing_lba_mid;
520          U8 failing_lba_high;
521          U8 failing_lba_low_ext;
522          U8 failing_lba_mid_ext;
523          U8 failing_lba_high_ext;
524 
525          U8 vendor_specific1;
526          U8 vendor_specific2;
527          U8 vendor_specific3;
528          U8 vendor_specific4;
529          U8 vendor_specific5;
530          U8 vendor_specific6;
531          U8 vendor_specific7;
532          U8 vendor_specific8;
533          U8 vendor_specific9;
534          U8 vendor_specific10;
535          U8 vendor_specific11;
536          U8 vendor_specific12;
537          U8 vendor_specific13;
538          U8 vendor_specific14;
539          U8 vendor_specific15;
540       } DESCRIPTOR_ENTRY;
541 
542       U8 descriptor_entry[26];
543 
544 } ATA_DESCRIPTOR_ENTRY_T;
545 
546 /**
547 * @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
548 *
549 * @brief The following structure depicts the ATA-8 version of the
550 *        SMART self test log page descriptor entry.
551 */
552 typedef union ATA_SMART_DESCRIPTOR_ENTRY
553 {
554       struct SMART_DESCRIPTOR_ENTRY
555       {
556          U8 lba_field;
557          U8 status_byte;
558          U8 time_stamp_low;
559          U8 time_stamp_high;
560          U8 checkpoint_byte;
561          U8 failing_lba_low;
562          U8 failing_lba_mid;
563          U8 failing_lba_high;
564          U8 failing_lba_low_ext;
565 
566          U8 vendor_specific1;
567          U8 vendor_specific2;
568          U8 vendor_specific3;
569          U8 vendor_specific4;
570          U8 vendor_specific5;
571          U8 vendor_specific6;
572          U8 vendor_specific7;
573          U8 vendor_specific8;
574          U8 vendor_specific9;
575          U8 vendor_specific10;
576          U8 vendor_specific11;
577          U8 vendor_specific12;
578          U8 vendor_specific13;
579          U8 vendor_specific14;
580          U8 vendor_specific15;
581       } SMART_DESCRIPTOR_ENTRY;
582 
583       U8 smart_descriptor_entry[24];
584 
585 } ATA_SMART_DESCRIPTOR_ENTRY_T;
586 
587 /**
588 * @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
589 *
590 * @brief The following structure depicts the ATA-8 version of the
591 *        Extended SMART self test log page.
592 */
593 typedef struct ATA_EXTENDED_SMART_SELF_TEST_LOG
594 {
595    U8    self_test_log_data_structure_revision_number;   //byte 0
596    U8    reserved0;                                      //byte 1
597    U8    self_test_descriptor_index[2];                  //byte 2-3
598 
599    ATA_DESCRIPTOR_ENTRY_T descriptor_entrys[19];         //bytes 4-497
600 
601    U8    vendor_specific[2];                             //byte 498-499
602    U8    reserved1[11];                                  //byte 500-510
603    U8    data_structure_checksum;                        //byte 511
604 
605 } ATA_EXTENDED_SMART_SELF_TEST_LOG_T;
606 
607 /**
608 * @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
609 *
610 * @brief The following structure depicts the ATA-8 version of the
611 *        SMART self test log page.
612 */
613 typedef struct ATA_SMART_SELF_TEST_LOG
614 {
615    U8    self_test_log_data_structure_revision_number[2];   //bytes 0-1
616 
617    ATA_SMART_DESCRIPTOR_ENTRY_T descriptor_entrys[21];      //bytes 2-505
618 
619    U8    vendor_specific[2];                                //byte 506-507
620    U8    self_test_index;                                   //byte 508
621    U8    reserved1[2];                                      //byte 509-510
622    U8    data_structure_checksum;                           //byte 511
623 
624 } ATA_SMART_SELF_TEST_LOG_T;
625 
626 /**
627 * @struct ATA_NCQ_COMMAND_ERROR_LOG
628 *
629 * @brief The following structure depicts the ATA-8 version of the
630 *        NCQ command error log page.
631 */
632 typedef struct ATA_NCQ_COMMAND_ERROR_LOG
633 {
634    U8    ncq_tag   : 5;
635    U8    reserved1 : 2;
636    U8    nq        : 1;
637    U8    reserved2;
638    U8    status;
639    U8    error;
640    U8    lba_7_0;
641    U8    lba_15_8;
642    U8    lba_23_16;
643    U8    device;
644    U8    lba_31_24;
645    U8    lba_39_32;
646    U8    lba_47_40;
647    U8    reserved3;
648    U8    count_7_0;
649    U8    count_15_8;
650    U8    reserved4[242];
651    U8    vendor_specific[255];
652    U8    checksum;
653 } ATA_NCQ_COMMAND_ERROR_LOG_T;
654 
655 #endif // _ATA_H_
656 
657