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