1230557Sjimharris/*-
2230557Sjimharris * This file is provided under a dual BSD/GPLv2 license.  When using or
3230557Sjimharris * redistributing this file, you may do so under either license.
4230557Sjimharris *
5230557Sjimharris * GPL LICENSE SUMMARY
6230557Sjimharris *
7230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8230557Sjimharris *
9230557Sjimharris * This program is free software; you can redistribute it and/or modify
10230557Sjimharris * it under the terms of version 2 of the GNU General Public License as
11230557Sjimharris * published by the Free Software Foundation.
12230557Sjimharris *
13230557Sjimharris * This program is distributed in the hope that it will be useful, but
14230557Sjimharris * WITHOUT ANY WARRANTY; without even the implied warranty of
15230557Sjimharris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16230557Sjimharris * General Public License for more details.
17230557Sjimharris *
18230557Sjimharris * You should have received a copy of the GNU General Public License
19230557Sjimharris * along with this program; if not, write to the Free Software
20230557Sjimharris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21230557Sjimharris * The full GNU General Public License is included in this distribution
22230557Sjimharris * in the file called LICENSE.GPL.
23230557Sjimharris *
24230557Sjimharris * BSD LICENSE
25230557Sjimharris *
26230557Sjimharris * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
27230557Sjimharris * All rights reserved.
28230557Sjimharris *
29230557Sjimharris * Redistribution and use in source and binary forms, with or without
30230557Sjimharris * modification, are permitted provided that the following conditions
31230557Sjimharris * are met:
32230557Sjimharris *
33230557Sjimharris *   * Redistributions of source code must retain the above copyright
34230557Sjimharris *     notice, this list of conditions and the following disclaimer.
35230557Sjimharris *   * Redistributions in binary form must reproduce the above copyright
36230557Sjimharris *     notice, this list of conditions and the following disclaimer in
37230557Sjimharris *     the documentation and/or other materials provided with the
38230557Sjimharris *     distribution.
39230557Sjimharris *
40230557Sjimharris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41230557Sjimharris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42230557Sjimharris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43230557Sjimharris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44230557Sjimharris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45230557Sjimharris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46230557Sjimharris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47230557Sjimharris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48230557Sjimharris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49230557Sjimharris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50230557Sjimharris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51230557Sjimharris *
52230557Sjimharris * $FreeBSD$
53230557Sjimharris */
54230557Sjimharris/**
55230557Sjimharris * @file
56230557Sjimharris * @brief This file defines all of the ATA related constants, enumerations,
57230557Sjimharris *        and types.  Please note that this file does not necessarily contain
58230557Sjimharris *        an exhaustive list of all constants, commands, sub-commands, etc.
59230557Sjimharris */
60230557Sjimharris
61230557Sjimharris#ifndef _ATA_H_
62230557Sjimharris#define _ATA_H_
63230557Sjimharris
64230557Sjimharris#include <dev/isci/types.h>
65230557Sjimharris
66230557Sjimharris/**
67230557Sjimharris * @name ATA_COMMAND_CODES
68230557Sjimharris *
69230557Sjimharris * These constants depict the various ATA command codes defined
70230557Sjimharris * in the ATA/ATAPI specification.
71230557Sjimharris */
72230557Sjimharris/*@{*/
73230557Sjimharris#define ATA_IDENTIFY_DEVICE            0xEC
74230557Sjimharris#define ATA_CHECK_POWER_MODE           0xE5
75230557Sjimharris#define ATA_STANDBY                    0xE2
76230557Sjimharris#define ATA_STANDBY_IMMED              0xE0
77230557Sjimharris#define ATA_IDLE_IMMED                 0xE1
78230557Sjimharris#define ATA_IDLE                       0xE3
79230557Sjimharris#define ATA_FLUSH_CACHE                0xE7
80230557Sjimharris#define ATA_FLUSH_CACHE_EXT            0xEA
81230557Sjimharris#define ATA_READ_DMA_EXT               0x25
82230557Sjimharris#define ATA_READ_DMA                   0xC8
83230557Sjimharris#define ATA_READ_SECTORS_EXT           0x24
84230557Sjimharris#define ATA_READ_SECTORS               0x20
85230557Sjimharris#define ATA_WRITE_DMA_EXT              0x35
86230557Sjimharris#define ATA_WRITE_DMA                  0xCA
87230557Sjimharris#define ATA_WRITE_SECTORS_EXT          0x34
88230557Sjimharris#define ATA_WRITE_SECTORS              0x30
89230557Sjimharris#define ATA_WRITE_UNCORRECTABLE        0x45
90230557Sjimharris#define ATA_READ_VERIFY_SECTORS        0x40
91230557Sjimharris#define ATA_READ_VERIFY_SECTORS_EXT    0x42
92230557Sjimharris#define ATA_READ_BUFFER                0xE4
93230557Sjimharris#define ATA_WRITE_BUFFER               0xE8
94230557Sjimharris#define ATA_EXECUTE_DEVICE_DIAG        0x90
95230557Sjimharris#define ATA_SET_FEATURES               0xEF
96230557Sjimharris#define ATA_SMART                      0xB0
97230557Sjimharris#define ATA_PACKET_IDENTIFY            0xA1
98230557Sjimharris#define ATA_PACKET                     0xA0
99230557Sjimharris#define ATA_READ_FPDMA                 0x60
100230557Sjimharris#define ATA_WRITE_FPDMA                0x61
101230557Sjimharris#define ATA_READ_LOG_EXT               0x2F
102230557Sjimharris#define ATA_NOP                        0x00
103230557Sjimharris#define ATA_DEVICE_RESET               0x08
104230557Sjimharris#define ATA_MEDIA_EJECT                0xED
105230557Sjimharris#define ATA_SECURITY_UNLOCK            0xF2
106230557Sjimharris#define ATA_SECURITY_FREEZE_LOCK       0xF5
107230557Sjimharris#define ATA_DATA_SET_MANAGEMENT        0x06
108230557Sjimharris#define ATA_DOWNLOAD_MICROCODE         0x92
109230557Sjimharris#define ATA_WRITE_STREAM_DMA_EXT       0x3A
110230557Sjimharris#define ATA_READ_LOG_DMA_EXT           0x47
111230557Sjimharris#define ATA_READ_STREAM_DMA_EXT        0x2A
112230557Sjimharris#define ATA_WRITE_DMA_FUA              0x3D
113230557Sjimharris#define ATA_WRITE_LOG_DMA_EXT          0x57
114230557Sjimharris#define ATA_READ_DMA_QUEUED            0xC7
115230557Sjimharris#define ATA_READ_DMA_QUEUED_EXT        0x26
116230557Sjimharris#define ATA_WRITE_DMA_QUEUED           0xCC
117230557Sjimharris#define ATA_WRITE_DMA_QUEUED_EXT       0x36
118230557Sjimharris#define ATA_WRITE_DMA_QUEUED_FUA_EXT   0x3E
119230557Sjimharris#define ATA_READ_MULTIPLE              0xC4
120230557Sjimharris#define ATA_READ_MULTIPLE_EXT          0x29
121230557Sjimharris#define ATA_WRITE_MULTIPLE             0xC5
122230557Sjimharris#define ATA_WRITE_MULTIPLE_EXT         0x39
123230557Sjimharris#define ATA_WRITE_MULTIPLE_FUA_EXT     0xCE
124230557Sjimharris
125230557Sjimharris
126230557Sjimharris/*@}*/
127230557Sjimharris
128230557Sjimharris/**
129230557Sjimharris * @name ATA_SMART_SUB_COMMAND_CODES
130230557Sjimharris *
131230557Sjimharris * These constants define the ATA SMART command sub-codes that can be
132230557Sjimharris * executed.
133230557Sjimharris */
134230557Sjimharris/*@{*/
135230557Sjimharris#define ATA_SMART_SUB_CMD_ENABLE        0xD8
136230557Sjimharris#define ATA_SMART_SUB_CMD_DISABLE       0xD9
137230557Sjimharris#define ATA_SMART_SUB_CMD_RETURN_STATUS 0xDA
138230557Sjimharris#define ATA_SMART_SUB_CMD_READ_LOG      0xD5
139230557Sjimharris/*@}*/
140230557Sjimharris
141230557Sjimharris/**
142230557Sjimharris * @name ATA_SET_FEATURES_SUB_COMMAND_CODES
143230557Sjimharris *
144230557Sjimharris * These constants define the ATA SET FEATURES command sub-codes that can
145230557Sjimharris * be executed.
146230557Sjimharris */
147230557Sjimharris/*@{*/
148230557Sjimharris#define ATA_SET_FEATURES_SUB_CMD_ENABLE_CACHE       0x02
149230557Sjimharris#define ATA_SET_FEATURES_SUB_CMD_DISABLE_CACHE      0x82
150230557Sjimharris#define ATA_SET_FEATURES_SUB_CMD_DISABLE_READ_AHEAD 0x55
151230557Sjimharris#define ATA_SET_FEATURES_SUB_CMD_ENABLE_READ_AHEAD  0xAA
152230557Sjimharris#define ATA_SET_FEATURES_SUB_CMD_SET_TRANSFER_MODE  0x3
153230557Sjimharris/*@}*/
154230557Sjimharris
155230557Sjimharris/**
156230557Sjimharris * @name ATA_READ_LOG_EXT_PAGE_CODES
157230557Sjimharris *
158230557Sjimharris * This is a list of log page codes available for use.
159230557Sjimharris */
160230557Sjimharris/*@{*/
161230557Sjimharris#define ATA_LOG_PAGE_NCQ_ERROR                  0x10
162230557Sjimharris#define ATA_LOG_PAGE_SMART_SELF_TEST            0x06
163230557Sjimharris#define ATA_LOG_PAGE_EXTENDED_SMART_SELF_TEST   0x07
164230557Sjimharris/*@}*/
165230557Sjimharris
166230557Sjimharris/**
167230557Sjimharris * @name ATA_LOG_PAGE_NCQ_ERROR_CONSTANTS
168230557Sjimharris *
169230557Sjimharris * These constants define standard values for use when requesting the NCQ
170230557Sjimharris * error log page.
171230557Sjimharris */
172230557Sjimharris/*@{*/
173230557Sjimharris#define ATA_LOG_PAGE_NCQ_ERROR_SECTOR        0
174230557Sjimharris#define ATA_LOG_PAGE_NCQ_ERROR_SECTOR_COUNT  1
175230557Sjimharris/*@}*/
176230557Sjimharris
177230557Sjimharris/**
178230557Sjimharris * @name ATA_STATUS_REGISTER_BITS
179230557Sjimharris *
180230557Sjimharris * The following are status register bit definitions per ATA/ATAPI-7.
181230557Sjimharris */
182230557Sjimharris/*@{*/
183230557Sjimharris#define ATA_STATUS_REG_BSY_BIT          0x80
184230557Sjimharris#define ATA_STATUS_REG_DEVICE_FAULT_BIT 0x20
185230557Sjimharris#define ATA_STATUS_REG_ERROR_BIT        0x01
186230557Sjimharris/*@}*/
187230557Sjimharris
188230557Sjimharris/**
189230557Sjimharris * @name ATA_ERROR_REGISTER_BITS
190230557Sjimharris *
191230557Sjimharris * The following are error register bit definitions per ATA/ATAPI-7.
192230557Sjimharris */
193230557Sjimharris/*@{*/
194230557Sjimharris#define ATA_ERROR_REG_NO_MEDIA_BIT              0x02
195230557Sjimharris#define ATA_ERROR_REG_ABORT_BIT                 0x04
196230557Sjimharris#define ATA_ERROR_REG_MEDIA_CHANGE_REQUEST_BIT  0x08
197230557Sjimharris#define ATA_ERROR_REG_ID_NOT_FOUND_BIT          0x10
198230557Sjimharris#define ATA_ERROR_REG_MEDIA_CHANGE_BIT          0x20
199230557Sjimharris#define ATA_ERROR_REG_UNCORRECTABLE_BIT         0x40
200230557Sjimharris#define ATA_ERROR_REG_WRITE_PROTECTED_BIT       0x40
201230557Sjimharris#define ATA_ERROR_REG_ICRC_BIT                  0x80
202230557Sjimharris/*@}*/
203230557Sjimharris
204230557Sjimharris/**
205230557Sjimharris * @name ATA_CONTROL_REGISTER_BITS
206230557Sjimharris *
207230557Sjimharris * The following are control register bit definitions per ATA/ATAPI-7
208230557Sjimharris */
209230557Sjimharris/*@{*/
210230557Sjimharris#define ATA_CONTROL_REG_INTERRUPT_ENABLE_BIT 0x02
211230557Sjimharris#define ATA_CONTROL_REG_SOFT_RESET_BIT       0x04
212230557Sjimharris#define ATA_CONTROL_REG_HIGH_ORDER_BYTE_BIT  0x80
213230557Sjimharris/*@}*/
214230557Sjimharris
215230557Sjimharris/**
216230557Sjimharris * @name ATA_DEVICE_HEAD_REGISTER_BITS
217230557Sjimharris *
218230557Sjimharris * The following are device/head register bit definitions per ATA/ATAPI-7.
219230557Sjimharris */
220230557Sjimharris/*@{*/
221230557Sjimharris#define ATA_DEV_HEAD_REG_LBA_MODE_ENABLE  0x40
222230557Sjimharris#define ATA_DEV_HEAD_REG_FUA_ENABLE       0x80
223230557Sjimharris/*@}*/
224230557Sjimharris
225230557Sjimharris/**
226230557Sjimharris * @name ATA_IDENTIFY_DEVICE_FIELD_LENGTHS
227230557Sjimharris *
228230557Sjimharris * The following constants define the number of bytes contained in various
229230557Sjimharris * fields found in the IDENTIFY DEVICE data structure.
230230557Sjimharris */
231230557Sjimharris/*@{*/
232230557Sjimharris#define ATA_IDENTIFY_SERIAL_NUMBER_LEN        20
233230557Sjimharris#define ATA_IDENTIFY_MODEL_NUMBER_LEN         40
234230557Sjimharris#define ATA_IDENTIFY_FW_REVISION_LEN          8
235230557Sjimharris#define ATA_IDENTIFY_48_LBA_LEN               8
236230557Sjimharris#define ATA_IDENTIFY_MEDIA_SERIAL_NUMBER_LEN  30
237230557Sjimharris#define ATA_IDENTIFY_WWN_LEN                  8
238230557Sjimharris/*@}*/
239230557Sjimharris
240230557Sjimharris/**
241230557Sjimharris * @name ATA_IDENTIFY_DEVICE_FIELD_MASKS
242230557Sjimharris *
243230557Sjimharris * The following constants define bit masks utilized to determine if a
244230557Sjimharris * feature is supported/enabled or if a bit is simply set inside of the
245230557Sjimharris * IDENTIFY DEVICE data structre.
246230557Sjimharris */
247230557Sjimharris/*@{*/
248230557Sjimharris#define ATA_IDENTIFY_REMOVABLE_MEDIA_ENABLE              0x0080
249230557Sjimharris#define ATA_IDENTIFY_CAPABILITIES1_NORMAL_DMA_ENABLE     0x0100
250230557Sjimharris#define ATA_IDENTIFY_CAPABILITIES1_STANDBY_ENABLE        0x2000
251230557Sjimharris#define ATA_IDENTIFY_COMMAND_SET_SUPPORTED0_SMART_ENABLE 0x0001
252230557Sjimharris#define ATA_IDENTIFY_COMMAND_SET_SUPPORTED1_48BIT_ENABLE 0x0400
253230557Sjimharris#define ATA_IDENTIFY_COMMAND_SET_WWN_SUPPORT_ENABLE      0x0100
254230557Sjimharris#define ATA_IDENTIFY_COMMAND_SET_ENABLED0_SMART_ENABLE   0x0001
255230557Sjimharris#define ATA_IDENTIFY_SATA_CAPABILITIES_NCQ_ENABLE        0x0100
256230557Sjimharris#define ATA_IDENTIFY_NCQ_QUEUE_DEPTH_ENABLE              0x001F
257230557Sjimharris#define ATA_IDENTIFY_SECTOR_LARGER_THEN_512_ENABLE       0x0100
258230557Sjimharris#define ATA_IDENTIFY_LOGICAL_SECTOR_PER_PHYSICAL_SECTOR_MASK   0x000F
259230557Sjimharris#define ATA_IDENTIFY_LOGICAL_SECTOR_PER_PHYSICAL_SECTOR_ENABLE 0x2000
260230557Sjimharris#define ATA_IDENTIFY_WRITE_UNCORRECTABLE_SUPPORT         0x0004
261230557Sjimharris#define ATA_IDENTIFY_COMMAND_SET_SMART_SELF_TEST_SUPPORTED     0x0002
262230557Sjimharris#define ATA_IDENTIFY_COMMAND_SET_DSM_TRIM_SUPPORTED            0x0001
263230557Sjimharris#define ATA_IDENTIFY_COMMAND_ADDL_SUPPORTED_DETERMINISTIC_READ 0x4000
264230557Sjimharris#define ATA_IDENTIFY_COMMAND_ADDL_SUPPORTED_READ_ZERO          0x0020
265230557Sjimharris/*@}*/
266230557Sjimharris
267230557Sjimharris/**
268230557Sjimharris * @name ATAPI_IDENTIFY_DEVICE_FIELD_MASKS
269230557Sjimharris *
270230557Sjimharris * These constants define the various bit definitions for the
271230557Sjimharris * fields in the PACKET IDENTIFY DEVICE data structure.
272230557Sjimharris */
273230557Sjimharris/*@{*/
274230557Sjimharris#define ATAPI_IDENTIFY_16BYTE_CMD_PCKT_ENABLE       0x01
275230557Sjimharris/*@}*/
276230557Sjimharris
277230557Sjimharris/**
278230557Sjimharris * @name ATA_PACKET_FEATURE_BITS
279230557Sjimharris *
280230557Sjimharris * These constants define the various bit definitions for the
281230557Sjimharris * ATA PACKET feature register.
282230557Sjimharris */
283230557Sjimharris/*@{*/
284230557Sjimharris#define ATA_PACKET_FEATURE_DMA     0x01
285230557Sjimharris#define ATA_PACKET_FEATURE_OVL     0x02
286230557Sjimharris#define ATA_PACKET_FEATURE_DMADIR  0x04
287230557Sjimharris/*@}*/
288230557Sjimharris
289230557Sjimharris/**
290230557Sjimharris * @name ATA_Device_Power_Mode_Values
291230557Sjimharris *
292230557Sjimharris * These constants define the power mode values returned by
293230557Sjimharris * ATA_Check_Power_Mode
294230557Sjimharris */
295230557Sjimharris/*@{*/
296230557Sjimharris#define ATA_STANDBY_POWER_MODE    0x00
297230557Sjimharris#define ATA_IDLE_POWER_MODE       0x80
298230557Sjimharris#define ATA_ACTIVE_POWER_MODE     0xFF
299230557Sjimharris/*@}*/
300230557Sjimharris
301230557Sjimharris/**
302230557Sjimharris * @name ATA_WRITE_UNCORRECTIABLE feature field values
303230557Sjimharris *
304230557Sjimharris * These constants define the Write Uncorrectable feature values
305230557Sjimharris * used with the SATI translation.
306230557Sjimharris */
307230557Sjimharris/*@{*/
308230557Sjimharris#define ATA_WRITE_UNCORRECTABLE_PSUEDO    0x55
309230557Sjimharris#define ATA_WRITE_UNCORRECTABLE_FLAGGED   0xAA
310230557Sjimharris/*@}*/
311230557Sjimharris
312230557Sjimharris
313230557Sjimharris
314230557Sjimharris/**
315230557Sjimharris * @name ATA_SECURITY_STATUS field values
316230557Sjimharris *
317230557Sjimharris * These constants define the mask of the securityStatus field and the various bits within it
318230557Sjimharris */
319230557Sjimharris/*@{*/
320230557Sjimharris#define ATA_SECURITY_STATUS_SUPPORTED      0x0001
321230557Sjimharris#define ATA_SECURITY_STATUS_ENABLED        0x0002
322230557Sjimharris#define ATA_SECURITY_STATUS_LOCKED         0x0004
323230557Sjimharris#define ATA_SECURITY_STATUS_FROZEN         0x0008
324230557Sjimharris#define ATA_SECURITY_STATUS_EXPIRED        0x0010
325230557Sjimharris#define ATA_SECURITY_STATUS_ERASESUPPORTED 0x0020
326230557Sjimharris#define ATA_SECURITY_STATUS_RESERVED       0xFEC0
327230557Sjimharris#define ATA_SECURITY_STATUS_SECURITYLEVEL  0x0100
328230557Sjimharris/*@}*/
329230557Sjimharris
330230557Sjimharris/**
331230557Sjimharris * @struct ATA_IDENTIFY_DEVICE
332230557Sjimharris *
333230557Sjimharris * @brief This structure depicts the ATA IDENTIFY DEVICE data format.
334230557Sjimharris */
335230557Sjimharristypedef struct ATA_IDENTIFY_DEVICE_DATA
336230557Sjimharris{
337230557Sjimharris   U16   general_config_bits;                             // word  00
338230557Sjimharris   U16   obsolete0;                                       // word  01 (num cylinders)
339230557Sjimharris   U16   vendor_specific_config_bits;                     // word  02
340230557Sjimharris   U16   obsolete1;                                       // word  03 (num heads)
341230557Sjimharris   U16   retired1[2];                                     // words 04-05
342230557Sjimharris   U16   obsolete2;                                       // word  06 (sectors / track)
343230557Sjimharris   U16   reserved_for_compact_flash1[2];                  // words 07-08
344230557Sjimharris   U16   retired0;                                        // word  09
345230557Sjimharris   U8    serial_number[ATA_IDENTIFY_SERIAL_NUMBER_LEN];   // word 10-19
346230557Sjimharris   U16   retired2[2];                                     // words 20-21
347230557Sjimharris   U16   obsolete4;                                       // word  22
348230557Sjimharris   U8    firmware_revision[ATA_IDENTIFY_FW_REVISION_LEN]; // words 23-26
349230557Sjimharris   U8    model_number[ATA_IDENTIFY_MODEL_NUMBER_LEN];     // words 27-46
350230557Sjimharris   U16   max_sectors_per_multiple;                        // word  47
351230557Sjimharris   U16   reserved0;                                       // word  48
352230557Sjimharris   U16   capabilities1;                                   // word  49
353230557Sjimharris   U16   capabilities2;                                   // word  50
354230557Sjimharris   U16   obsolete5[2];                                    // words 51-52
355230557Sjimharris   U16   validity_bits;                                   // word  53
356230557Sjimharris   U16   obsolete6[5];                                    // words 54-58 Used to be:
357230557Sjimharris                                                          // current cylinders,
358230557Sjimharris                                                          // current heads,
359230557Sjimharris                                                          // current sectors/Track,
360230557Sjimharris                                                          // current capacity
361230557Sjimharris   U16   current_max_sectors_per_multiple;                // word  59
362230557Sjimharris   U8    total_num_sectors[4];                            // words 60-61
363230557Sjimharris   U16   obsolete7;                                       // word  62
364230557Sjimharris   U16   multi_word_dma_mode;                             // word  63
365230557Sjimharris   U16   pio_modes_supported;                             // word  64
366230557Sjimharris   U16   min_multiword_dma_transfer_cycle;                // word  65
367230557Sjimharris   U16   rec_min_multiword_dma_transfer_cycle;            // word  66
368230557Sjimharris   U16   min_pio_transfer_no_flow_ctrl;                   // word  67
369230557Sjimharris   U16   min_pio_transfer_with_flow_ctrl;                 // word  68
370230557Sjimharris   U16   additional_supported;                            // word  69
371230557Sjimharris   U16   reserved1;                                       // word  70
372230557Sjimharris   U16   reserved2[4];                                    // words 71-74
373230557Sjimharris   U16   queue_depth;                                     // word  75
374230557Sjimharris   U16   serial_ata_capabilities;                         // word  76
375230557Sjimharris   U16   serial_ata_reserved;                             // word  77
376230557Sjimharris   U16   serial_ata_features_supported;                   // word  78
377230557Sjimharris   U16   serial_ata_features_enabled;                     // word  79
378230557Sjimharris   U16   major_version_number;                            // word  80
379230557Sjimharris   U16   minor_version_number;                            // word  81
380230557Sjimharris   U16   command_set_supported0;                          // word  82
381230557Sjimharris   U16   command_set_supported1;                          // word  83
382230557Sjimharris   U16   command_set_supported_extention;                 // word  84
383230557Sjimharris   U16   command_set_enabled0;                            // word  85
384230557Sjimharris   U16   command_set_enabled1;                            // word  86
385230557Sjimharris   U16   command_set_default;                             // word  87
386230557Sjimharris   U16   ultra_dma_mode;                                  // word  88
387230557Sjimharris   U16   security_erase_completion_time;                  // word  89
388230557Sjimharris   U16   enhanced_security_erase_time;                    // word  90
389230557Sjimharris   U16   current_power_mgmt_value;                        // word  91
390230557Sjimharris   U16   master_password_revision;                        // word  92
391230557Sjimharris   U16   hardware_reset_result;                           // word  93
392230557Sjimharris   U16   current_acoustic_management_value;               // word  94
393230557Sjimharris   U16   stream_min_request_size;                         // word  95
394230557Sjimharris   U16   stream_transfer_time;                            // word  96
395230557Sjimharris   U16   stream_access_latency;                           // word  97
396230557Sjimharris   U16   stream_performance_granularity[2];               // words 98-99
397230557Sjimharris   U8    max_48bit_lba[ATA_IDENTIFY_48_LBA_LEN];          // words 100-103
398230557Sjimharris   U16   streaming_transfer_time;                         // word  104
399230557Sjimharris   U16   max_lba_range_entry_blocks;                      // word  105
400230557Sjimharris   U16   physical_logical_sector_info;                    // word  106
401230557Sjimharris   U16   acoustic_test_interseek_delay;                   // word  107
402230557Sjimharris   U8    world_wide_name[ATA_IDENTIFY_WWN_LEN];           // words 108-111
403230557Sjimharris   U8    reserved_for_wwn_extention[ATA_IDENTIFY_WWN_LEN];// words 112-115
404230557Sjimharris   U16   reserved4;                                       // word  116
405230557Sjimharris   U8    words_per_logical_sector[4];                     // words 117-118
406230557Sjimharris   U16   command_set_supported2;                          // word  119
407230557Sjimharris   U16   reserved5[7];                                    // words 120-126
408230557Sjimharris   U16   removable_media_status;                          // word  127
409230557Sjimharris   U16   security_status;                                 // word  128
410230557Sjimharris   U16   vendor_specific1[31];                            // words 129-159
411230557Sjimharris   U16   cfa_power_mode1;                                 // word  160
412230557Sjimharris   U16   reserved_for_compact_flash2[7];                  // words 161-167
413230557Sjimharris   U16   device_nominal_form_factor;                      // word  168
414230557Sjimharris   U16   data_set_management;                             // word  169
415230557Sjimharris   U16   reserved_for_compact_flash3[6];                  // words 170-175
416230557Sjimharris   U16   current_media_serial_number[ATA_IDENTIFY_MEDIA_SERIAL_NUMBER_LEN];//words 176-205
417230557Sjimharris   U16   reserved6[3];                                    // words 206-208
418230557Sjimharris   U16   logical_sector_alignment;                        // words 209
419230557Sjimharris   U16   reserved7[7];                                    // words 210-216
420230557Sjimharris   U16   nominal_media_rotation_rate;                     // word  217
421230557Sjimharris   U16   reserved8[16];                                   // words 218-233
422230557Sjimharris   U16   min_num_blocks_per_microcode;                    // word  234
423230557Sjimharris   U16   max_num_blocks_per_microcode;                    // word  235
424230557Sjimharris   U16   reserved9[19];                                   // words 236-254
425230557Sjimharris   U16   integrity_word;                                  // word  255
426230557Sjimharris
427230557Sjimharris} ATA_IDENTIFY_DEVICE_DATA_T;
428230557Sjimharris
429230557Sjimharris#define ATA_IDENTIFY_DEVICE_GET_OFFSET(field_name) \
430230557Sjimharris   ((POINTER_UINT)&(((ATA_IDENTIFY_DEVICE_DATA_T*)0)->field_name))
431230557Sjimharris#define ATA_IDENTIFY_DEVICE_WCE_ENABLE  0x20
432230557Sjimharris#define ATA_IDENTIFY_DEVICE_RA_ENABLE   0x40
433230557Sjimharris
434230557Sjimharris/**
435230557Sjimharris * @struct ATAPI_IDENTIFY_PACKET_DATA
436230557Sjimharris *
437230557Sjimharris * @brief The following structure depicts the ATA-ATAPI 7 version of the
438230557Sjimharris *        IDENTIFY PACKET DEVICE data structure.
439230557Sjimharris */
440230557Sjimharristypedef struct ATAPI_IDENTIFY_PACKET_DEVICE
441230557Sjimharris{
442230557Sjimharris   U16   generalConfigBits;                      // word  00
443230557Sjimharris   U16   reserved0;                              // word  01 (num cylinders)
444230557Sjimharris   U16   uniqueConfigBits;                       // word  02
445230557Sjimharris   U16   reserved1[7];                           // words 03 - 09
446230557Sjimharris   U8    serialNumber[ATA_IDENTIFY_SERIAL_NUMBER_LEN];  // word 10-19
447230557Sjimharris   U16   reserved2[3];                           // words 20-22
448230557Sjimharris   U8    firmwareRevision[ATA_IDENTIFY_FW_REVISION_LEN];// words 23-26
449230557Sjimharris   U8    modelNumber[ATA_IDENTIFY_MODEL_NUMBER_LEN];    // words 27-46
450230557Sjimharris   U16   reserved4[2];                           // words 47-48
451230557Sjimharris   U16   capabilities1;                          // word  49
452230557Sjimharris   U16   capabilities2;                          // word  50
453230557Sjimharris   U16   obsolete0[2];                           // words 51-52
454230557Sjimharris   U16   validityBits;                           // word  53
455230557Sjimharris   U16   reserved[8];                            // words 54-61
456230557Sjimharris
457230557Sjimharris   U16   DMADIRBitRequired;                      // word  62, page2
458230557Sjimharris   U16   multiWordDmaMode;                       // word  63
459230557Sjimharris   U16   pioModesSupported;                      // word  64
460230557Sjimharris   U16   minMultiwordDmaTransferCycle;           // word  65
461230557Sjimharris   U16   recMinMultiwordDmaTransferCycle;        // word  66
462230557Sjimharris   U16   minPioTransferNoFlowCtrl;               // word  67
463230557Sjimharris   U16   minPioTransferWithFlowCtrl;             // word  68
464230557Sjimharris   U16   reserved6[2];                           // words 69-70
465230557Sjimharris   U16   nsFromPACKETReceiptToBusRelease;        // word  71
466230557Sjimharris   U16   nsFromSERVICEReceiptToBSYreset;         // wore  72
467230557Sjimharris   U16   reserved7[2];                           // words 73-74
468230557Sjimharris   U16   queueDepth;                             // word  75
469230557Sjimharris   U16   serialAtaCapabilities;                  // word  76
470230557Sjimharris   U16   serialAtaReserved;                      // word  77
471230557Sjimharris   U16   serialAtaFeaturesSupported;             // word  78
472230557Sjimharris   U16   serialAtaFeaturesEnabled;               // word  79
473230557Sjimharris
474230557Sjimharris   U16   majorVersionNumber;                     // word  80, page3
475230557Sjimharris   U16   minorVersionNumber;                     // word  81
476230557Sjimharris   U16   commandSetSupported0;                   // word  82
477230557Sjimharris   U16   commandSetSupported1;                   // word  83
478230557Sjimharris
479230557Sjimharris   U16   commandSetSupportedExtention;           // word  84, page4
480230557Sjimharris   U16   commandSetEnabled0;                     // word  85
481230557Sjimharris   U16   commandSetEnabled1;                     // word  86
482230557Sjimharris   U16   commandSetDefault;                      // word  87
483230557Sjimharris
484230557Sjimharris   U16   ultraDmaMode;                           // word  88, page5
485230557Sjimharris   U16   reserved8[4];                           // words 89 - 92
486230557Sjimharris
487230557Sjimharris   U16   hardwareResetResult;                    // word  93, page6
488230557Sjimharris   U16   currentAcousticManagementValue;         // word  94
489230557Sjimharris   U16   reserved9[30];                          // words 95-124
490230557Sjimharris   U16   ATAPIByteCount0Behavior;                // word  125
491230557Sjimharris   U16   obsolete1;                              // word  126
492230557Sjimharris   U16   removableMediaStatus;                   // word  127,
493230557Sjimharris
494230557Sjimharris   U16   securityStatus;                         // word  128, page7
495230557Sjimharris   U16   vendorSpecific1[31];                    // words 129-159
496230557Sjimharris   U16   reservedForCompactFlash[16];            // words 160-175
497230557Sjimharris   U16   reserved10[79];                         // words 176-254
498230557Sjimharris   U16   integrityWord;                          // word  255
499230557Sjimharris} ATAPI_IDENTIFY_PACKET_DEVICE_T;
500230557Sjimharris
501230557Sjimharris/**
502230557Sjimharris* @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
503230557Sjimharris*
504230557Sjimharris* @brief The following structure depicts the ATA-8 version of the
505230557Sjimharris*        Extended SMART self test log page descriptor entry.
506230557Sjimharris*/
507230557Sjimharristypedef union ATA_DESCRIPTOR_ENTRY
508230557Sjimharris{
509230557Sjimharris      struct DESCRIPTOR_ENTRY
510230557Sjimharris      {
511230557Sjimharris         U8 lba_field;
512230557Sjimharris         U8 status_byte;
513230557Sjimharris         U8 time_stamp_low;
514230557Sjimharris         U8 time_stamp_high;
515230557Sjimharris         U8 checkpoint_byte;
516230557Sjimharris         U8 failing_lba_low;
517230557Sjimharris         U8 failing_lba_mid;
518230557Sjimharris         U8 failing_lba_high;
519230557Sjimharris         U8 failing_lba_low_ext;
520230557Sjimharris         U8 failing_lba_mid_ext;
521230557Sjimharris         U8 failing_lba_high_ext;
522230557Sjimharris
523230557Sjimharris         U8 vendor_specific1;
524230557Sjimharris         U8 vendor_specific2;
525230557Sjimharris         U8 vendor_specific3;
526230557Sjimharris         U8 vendor_specific4;
527230557Sjimharris         U8 vendor_specific5;
528230557Sjimharris         U8 vendor_specific6;
529230557Sjimharris         U8 vendor_specific7;
530230557Sjimharris         U8 vendor_specific8;
531230557Sjimharris         U8 vendor_specific9;
532230557Sjimharris         U8 vendor_specific10;
533230557Sjimharris         U8 vendor_specific11;
534230557Sjimharris         U8 vendor_specific12;
535230557Sjimharris         U8 vendor_specific13;
536230557Sjimharris         U8 vendor_specific14;
537230557Sjimharris         U8 vendor_specific15;
538230557Sjimharris      } DESCRIPTOR_ENTRY;
539230557Sjimharris
540230557Sjimharris      U8 descriptor_entry[26];
541230557Sjimharris
542230557Sjimharris} ATA_DESCRIPTOR_ENTRY_T;
543230557Sjimharris
544230557Sjimharris/**
545230557Sjimharris* @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
546230557Sjimharris*
547230557Sjimharris* @brief The following structure depicts the ATA-8 version of the
548230557Sjimharris*        SMART self test log page descriptor entry.
549230557Sjimharris*/
550230557Sjimharristypedef union ATA_SMART_DESCRIPTOR_ENTRY
551230557Sjimharris{
552230557Sjimharris      struct SMART_DESCRIPTOR_ENTRY
553230557Sjimharris      {
554230557Sjimharris         U8 lba_field;
555230557Sjimharris         U8 status_byte;
556230557Sjimharris         U8 time_stamp_low;
557230557Sjimharris         U8 time_stamp_high;
558230557Sjimharris         U8 checkpoint_byte;
559230557Sjimharris         U8 failing_lba_low;
560230557Sjimharris         U8 failing_lba_mid;
561230557Sjimharris         U8 failing_lba_high;
562230557Sjimharris         U8 failing_lba_low_ext;
563230557Sjimharris
564230557Sjimharris         U8 vendor_specific1;
565230557Sjimharris         U8 vendor_specific2;
566230557Sjimharris         U8 vendor_specific3;
567230557Sjimharris         U8 vendor_specific4;
568230557Sjimharris         U8 vendor_specific5;
569230557Sjimharris         U8 vendor_specific6;
570230557Sjimharris         U8 vendor_specific7;
571230557Sjimharris         U8 vendor_specific8;
572230557Sjimharris         U8 vendor_specific9;
573230557Sjimharris         U8 vendor_specific10;
574230557Sjimharris         U8 vendor_specific11;
575230557Sjimharris         U8 vendor_specific12;
576230557Sjimharris         U8 vendor_specific13;
577230557Sjimharris         U8 vendor_specific14;
578230557Sjimharris         U8 vendor_specific15;
579230557Sjimharris      } SMART_DESCRIPTOR_ENTRY;
580230557Sjimharris
581230557Sjimharris      U8 smart_descriptor_entry[24];
582230557Sjimharris
583230557Sjimharris} ATA_SMART_DESCRIPTOR_ENTRY_T;
584230557Sjimharris
585230557Sjimharris/**
586230557Sjimharris* @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
587230557Sjimharris*
588230557Sjimharris* @brief The following structure depicts the ATA-8 version of the
589230557Sjimharris*        Extended SMART self test log page.
590230557Sjimharris*/
591230557Sjimharristypedef struct ATA_EXTENDED_SMART_SELF_TEST_LOG
592230557Sjimharris{
593230557Sjimharris   U8    self_test_log_data_structure_revision_number;   //byte 0
594230557Sjimharris   U8    reserved0;                                      //byte 1
595230557Sjimharris   U8    self_test_descriptor_index[2];                  //byte 2-3
596230557Sjimharris
597230557Sjimharris   ATA_DESCRIPTOR_ENTRY_T descriptor_entrys[19];         //bytes 4-497
598230557Sjimharris
599230557Sjimharris   U8    vendor_specific[2];                             //byte 498-499
600230557Sjimharris   U8    reserved1[11];                                  //byte 500-510
601230557Sjimharris   U8    data_structure_checksum;                        //byte 511
602230557Sjimharris
603230557Sjimharris} ATA_EXTENDED_SMART_SELF_TEST_LOG_T;
604230557Sjimharris
605230557Sjimharris/**
606230557Sjimharris* @struct ATA_EXTENDED_SMART_SELF_TEST_LOG
607230557Sjimharris*
608230557Sjimharris* @brief The following structure depicts the ATA-8 version of the
609230557Sjimharris*        SMART self test log page.
610230557Sjimharris*/
611230557Sjimharristypedef struct ATA_SMART_SELF_TEST_LOG
612230557Sjimharris{
613230557Sjimharris   U8    self_test_log_data_structure_revision_number[2];   //bytes 0-1
614230557Sjimharris
615230557Sjimharris   ATA_SMART_DESCRIPTOR_ENTRY_T descriptor_entrys[21];      //bytes 2-505
616230557Sjimharris
617230557Sjimharris   U8    vendor_specific[2];                                //byte 506-507
618230557Sjimharris   U8    self_test_index;                                   //byte 508
619230557Sjimharris   U8    reserved1[2];                                      //byte 509-510
620230557Sjimharris   U8    data_structure_checksum;                           //byte 511
621230557Sjimharris
622230557Sjimharris} ATA_SMART_SELF_TEST_LOG_T;
623230557Sjimharris
624230557Sjimharris/**
625230557Sjimharris* @struct ATA_NCQ_COMMAND_ERROR_LOG
626230557Sjimharris*
627230557Sjimharris* @brief The following structure depicts the ATA-8 version of the
628230557Sjimharris*        NCQ command error log page.
629230557Sjimharris*/
630230557Sjimharristypedef struct ATA_NCQ_COMMAND_ERROR_LOG
631230557Sjimharris{
632230557Sjimharris   U8    ncq_tag   : 5;
633230557Sjimharris   U8    reserved1 : 2;
634230557Sjimharris   U8    nq        : 1;
635230557Sjimharris   U8    reserved2;
636230557Sjimharris   U8    status;
637230557Sjimharris   U8    error;
638230557Sjimharris   U8    lba_7_0;
639230557Sjimharris   U8    lba_15_8;
640230557Sjimharris   U8    lba_23_16;
641230557Sjimharris   U8    device;
642230557Sjimharris   U8    lba_31_24;
643230557Sjimharris   U8    lba_39_32;
644230557Sjimharris   U8    lba_47_40;
645230557Sjimharris   U8    reserved3;
646230557Sjimharris   U8    count_7_0;
647230557Sjimharris   U8    count_15_8;
648230557Sjimharris   U8    reserved4[242];
649230557Sjimharris   U8    vendor_specific[255];
650230557Sjimharris   U8    checksum;
651230557Sjimharris} ATA_NCQ_COMMAND_ERROR_LOG_T;
652230557Sjimharris
653230557Sjimharris#endif // _ATA_H_
654230557Sjimharris
655