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