sata_defs.h revision 1612:f22bd5bc2aff
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef _SATA_DEFS_H 28#define _SATA_DEFS_H 29 30#pragma ident "%Z%%M% %I% %E% SMI" 31 32#ifdef __cplusplus 33extern "C" { 34#endif 35 36/* 37 * Common ATA commands (subset) 38 */ 39#define SATAC_DIAG 0x90 /* diagnose command */ 40#define SATAC_RECAL 0x10 /* restore cmd, 4 bits step rate */ 41#define SATAC_FORMAT 0x50 /* format track command */ 42#define SATAC_SET_FEATURES 0xef /* set features */ 43#define SATAC_IDLE_IM 0xe1 /* idle immediate */ 44#define SATAC_STANDBY_IM 0xe0 /* standby immediate */ 45#define SATAC_DOOR_LOCK 0xde /* door lock */ 46#define SATAC_DOOR_UNLOCK 0xdf /* door unlock */ 47#define SATAC_IDLE 0xe3 /* idle */ 48 49/* 50 * ATA/ATAPI disk commands (subset) 51 */ 52#define SATAC_DEVICE_RESET 0x08 /* ATAPI device reset */ 53#define SATAC_EJECT 0xed /* media eject */ 54#define SATAC_FLUSH_CACHE 0xe7 /* flush write-cache */ 55#define SATAC_ID_DEVICE 0xec /* IDENTIFY DEVICE */ 56#define SATAC_ID_PACKET_DEVICE 0xa1 /* ATAPI identify packet device */ 57#define SATAC_INIT_DEVPARMS 0x91 /* initialize device parameters */ 58#define SATAC_PACKET 0xa0 /* ATAPI packet */ 59#define SATAC_RDMULT 0xc4 /* read multiple w/DMA */ 60#define SATAC_RDSEC 0x20 /* read sector */ 61#define SATAC_RDVER 0x40 /* read verify */ 62#define SATAC_READ_DMA 0xc8 /* read DMA */ 63#define SATAC_SEEK 0x70 /* seek */ 64#define SATAC_SERVICE 0xa2 /* queued/overlap service */ 65#define SATAC_SETMULT 0xc6 /* set multiple mode */ 66#define SATAC_WRITE_DMA 0xca /* write (multiple) w/DMA */ 67#define SATAC_WRMULT 0xc5 /* write multiple */ 68#define SATAC_WRSEC 0x30 /* write sector */ 69#define SATAC_RDSEC_EXT 0x24 /* read sector extended (LBA48) */ 70#define SATAC_READ_DMA_EXT 0x25 /* read DMA extended (LBA48) */ 71#define SATAC_RDMULT_EXT 0x29 /* read multiple extended (LBA48) */ 72#define SATAC_WRSEC_EXT 0x34 /* read sector extended (LBA48) */ 73#define SATAC_WRITE_DMA_EXT 0x35 /* read DMA extended (LBA48) */ 74#define SATAC_WRMULT_EXT 0x39 /* read multiple extended (LBA48) */ 75 76#define SATAC_READ_DMA_QUEUED 0xc7 /* read DMA / may be queued */ 77#define SATAC_READ_DMA_QUEUED_EXT 0x26 /* read DMA ext / may be queued */ 78#define SATAC_WRITE_DMA_QUEUED 0xcc /* read DMA / may be queued */ 79#define SATAC_WRITE_DMA_QUEUED_EXT 0x36 /* read DMA ext / may be queued */ 80#define SATAC_READ_PM_REG 0xe4 /* read port mult reg */ 81#define SATAC_WRITE_PM_REG 0xe8 /* write port mult reg */ 82 83#define SATAC_READ_FPDMA_QUEUED 0x60 /* First-Party-DMA read queued */ 84#define SATAC_WRITE_FPDMA_QUEUED 0x61 /* First-Party-DMA write queued */ 85 86#define SATAC_READ_LOG_EXT 0x2f /* read log */ 87 88#define SATAC_SMART 0xb0 /* SMART */ 89 90#define SATA_LOG_PAGE_10 0x10 /* log page 0x10 - SATA error */ 91/* 92 * Power Managment Commands (subset) 93 */ 94#define SATAC_CHECK_POWER_MODE 0xe5 /* check power mode */ 95 96#define SATA_PWRMODE_STANDBY 0 /* standby mode */ 97#define SATA_PWRMODE_IDLE 0x80 /* idle mode */ 98#define SATA_PWRMODE_ACTIVE 0xFF /* active or idle mode, rev7 spec */ 99 100 101/* 102 * SMART FEATURES Subcommands 103 */ 104#define SATA_SMART_READ_DATA 0xd0 105#define SATA_SMART_ATTR_AUTOSAVE 0xd2 106#define SATA_SMART_EXECUTE_OFFLINE_IMM 0xd4 107#define SATA_SMART_READ_LOG 0xd5 108#define SATA_SMART_WRITE_LOG 0xd6 109#define SATA_SMART_ENABLE_OPS 0xd8 110#define SATA_SMART_DISABLE_OPS 0xd9 111#define SATA_SMART_RETURN_STATUS 0xda 112 113/* 114 * SET FEATURES Subcommands 115 */ 116#define SATAC_SF_ENABLE_WRITE_CACHE 0x02 117#define SATAC_SF_TRANSFER_MODE 0x03 118#define SATAC_SF_DISABLE_READ_AHEAD 0x55 119#define SATAC_SF_DISABLE_WRITE_CACHE 0x82 120#define SATAC_SF_ENABLE_READ_AHEAD 0xaa 121 122/* 123 * SET FEATURES transfer mode values 124 */ 125#define SATAC_TRANSFER_MODE_PIO_DEFAULT 0x00 126#define SATAC_TRANSFER_MODE_PIO_DISABLE_IODRY 0x01 127#define SATAC_TRANSFER_MODE_PIO_FLOW_CONTROL 0x08 128#define SATAC_TRANSFER_MODE_MULTI_WORD_DMA 0x20 129#define SATAC_TRANSFER_MODE_ULTRA_DMA 0x40 130 131/* Generic ATA definitions */ 132 133/* 134 * Identify Device data 135 * Although bot ATA and ATAPI devices' Identify Data has the same lenght, 136 * some words have different meaning/content and/or are irrelevant for 137 * other type of device. 138 * Following is the ATA Device Identify data layout 139 */ 140typedef struct sata_id { 141/* WORD */ 142/* OFFSET COMMENT */ 143 ushort_t ai_config; /* 0 general configuration bits */ 144 ushort_t ai_fixcyls; /* 1 # of cylinders (obsolete) */ 145 ushort_t ai_resv0; /* 2 # reserved */ 146 ushort_t ai_heads; /* 3 # of heads (obsolete) */ 147 ushort_t ai_trksiz; /* 4 # of bytes/track (retired) */ 148 ushort_t ai_secsiz; /* 5 # of bytes/sector (retired) */ 149 ushort_t ai_sectors; /* 6 # of sectors/track (obsolete) */ 150 ushort_t ai_resv1[3]; /* 7 "Vendor Unique" */ 151 char ai_drvser[20]; /* 10 Serial number */ 152 ushort_t ai_buftype; /* 20 Buffer type */ 153 ushort_t ai_bufsz; /* 21 Buffer size in 512 byte incr */ 154 ushort_t ai_ecc; /* 22 # of ecc bytes avail on rd/wr */ 155 char ai_fw[8]; /* 23 Firmware revision */ 156 char ai_model[40]; /* 27 Model # */ 157 ushort_t ai_mult1; /* 47 Multiple command flags */ 158 ushort_t ai_dwcap; /* 48 Doubleword capabilities */ 159 ushort_t ai_cap; /* 49 Capabilities */ 160 ushort_t ai_resv2; /* 50 Reserved */ 161 ushort_t ai_piomode; /* 51 PIO timing mode */ 162 ushort_t ai_dmamode; /* 52 DMA timing mode */ 163 ushort_t ai_validinfo; /* 53 bit0: wds 54-58, bit1: 64-70 */ 164 ushort_t ai_curcyls; /* 54 # of current cylinders */ 165 ushort_t ai_curheads; /* 55 # of current heads */ 166 ushort_t ai_cursectrk; /* 56 # of current sectors/track */ 167 ushort_t ai_cursccp[2]; /* 57 current sectors capacity */ 168 ushort_t ai_mult2; /* 59 multiple sectors info */ 169 ushort_t ai_addrsec[2]; /* 60 LBA only: no of addr secs */ 170 ushort_t ai_sworddma; /* 62 single word dma modes */ 171 ushort_t ai_dworddma; /* 63 double word dma modes */ 172 ushort_t ai_advpiomode; /* 64 advanced PIO modes supported */ 173 ushort_t ai_minmwdma; /* 65 min multi-word dma cycle info */ 174 ushort_t ai_recmwdma; /* 66 rec multi-word dma cycle info */ 175 ushort_t ai_minpio; /* 67 min PIO cycle info */ 176 ushort_t ai_minpioflow; /* 68 min PIO cycle info w/flow ctl */ 177 ushort_t ai_resv3[2]; /* 69,70 reserved */ 178 ushort_t ai_typtime[2]; /* 71-72 timing */ 179 ushort_t ai_resv4[2]; /* 73-74 reserved */ 180 ushort_t ai_qdepth; /* 75 queue depth */ 181 ushort_t ai_satacap; /* 76 SATA capabilities */ 182 ushort_t ai_resv5; /* 77 reserved */ 183 ushort_t ai_satafsup; /* 78 SATA features supported */ 184 ushort_t ai_satafenbl; /* 79 SATA features enabled */ 185 ushort_t ai_majorversion; /* 80 major versions supported */ 186 ushort_t ai_minorversion; /* 81 minor version number supported */ 187 ushort_t ai_cmdset82; /* 82 command set supported */ 188 ushort_t ai_cmdset83; /* 83 more command sets supported */ 189 ushort_t ai_cmdset84; /* 84 more command sets supported */ 190 ushort_t ai_features85; /* 85 enabled features */ 191 ushort_t ai_features86; /* 86 enabled features */ 192 ushort_t ai_features87; /* 87 enabled features */ 193 ushort_t ai_ultradma; /* 88 Ultra DMA mode */ 194 ushort_t ai_erasetime; /* 89 security erase time */ 195 ushort_t ai_erasetimex; /* 90 enhanced security erase time */ 196 ushort_t ai_adv_pwr_mgmt; /* 91 advanced power management time */ 197 ushort_t ai_master_pwd; /* 92 master password revision code */ 198 ushort_t ai_hrdwre_reset; /* 93 hardware reset result */ 199 ushort_t ai_acoustic; /* 94 accoustic management values */ 200 ushort_t ai_stream_min_sz; /* 95 stream minimum request size */ 201 ushort_t ai_stream_xfer_d; /* 96 streaming transfer time (DMA) */ 202 ushort_t ai_stream_lat; /* 97 streaming access latency */ 203 ushort_t ai_streamperf[2]; /* 98-99 streaming performance gran. */ 204 ushort_t ai_addrsecxt[4]; /* 100 extended max LBA sector */ 205 ushort_t ai_stream_xfer_p; /* 104 streaming transfer time (PIO) */ 206 ushort_t ai_padding1; /* 105 pad */ 207 ushort_t ai_phys_sect_sz; /* 106 physical sector size */ 208 ushort_t ai_seek_delay; /* 107 inter-seek delay time (usecs) */ 209 ushort_t ai_naa_ieee_oui; /* 108 NAA/IEEE OUI */ 210 ushort_t ai_ieee_oui_uid; /* 109 IEEE OUT/unique id */ 211 ushort_t ai_uid_mid; /* 110 unique id (mid) */ 212 ushort_t ai_uid_low; /* 111 unique id (low) */ 213 ushort_t ai_resv_wwn[4]; /* 112-115 reserved for WWN ext. */ 214 ushort_t ai_incits; /* 116 reserved for INCITS TR-37-2004 */ 215 ushort_t ai_words_lsec[2]; /* 117-118 words per logical sector */ 216 ushort_t ai_cmdset119; /* 119 more command sets supported */ 217 ushort_t ai_features120; /* 120 enabled features */ 218 ushort_t ai_padding2[6]; /* pad to 126 */ 219 ushort_t ai_rmsn; /* 127 removable media notification */ 220 ushort_t ai_securestatus; /* 128 security status */ 221 ushort_t ai_vendor[31]; /* 129-159 vendor specific */ 222 ushort_t ai_padding3[16]; /* 160 pad to 176 */ 223 ushort_t ai_curmedser[30]; /* 176-205 current media serial # */ 224 ushort_t ai_sctsupport; /* 206 SCT command transport */ 225 ushort_t ai_padding4[48]; /* 207 pad to 255 */ 226 ushort_t ai_integrity; /* 255 integrity word */ 227} sata_id_t; 228 229 230/* Identify Device: general config bits - word 0 */ 231 232#define SATA_ATA_TYPE_MASK 0x8001 /* ATA Device type mask */ 233#define SATA_ATA_TYPE 0x0000 /* ATA device */ 234#define SATA_REM_MEDIA 0x0080 /* Removable media */ 235 236#define SATA_ID_SERIAL_OFFSET 10 237#define SATA_ID_SERIAL_LEN 20 238#define SATA_ID_MODEL_OFFSET 27 239#define SATA_ID_MODEL_LEN 40 240 241/* Identify Device: common capability bits - word 49 */ 242 243#define SATA_DMA_SUPPORT 0x0100 244#define SATA_LBA_SUPPORT 0x0200 245#define SATA_IORDY_DISABLE 0x0400 246#define SATA_IORDY_SUPPORT 0x0800 247#define SATA_STANDBYTIMER 0x2000 248 249/* Identify Device: ai_validinfo (word 53) */ 250 251#define SATA_VALIDINFO_88 0x0004 /* word 88 supported fields valid */ 252 253/* Identify Device: ai_majorversion (word 80) */ 254 255#define SATA_MAJVER_6 0x0040 /* ATA/ATAPI-6 version supported */ 256#define SATA_MAJVER_4 0x0010 /* ATA/ATAPI-4 version supported */ 257 258/* Identify Device: command set supported/enabled bits - words 83 and 86 */ 259 260#define SATA_EXT48 0x0400 /* 48 bit address feature */ 261#define SATA_RW_DMA_QUEUED_CMD 0x0002 /* R/W DMA Queued supported */ 262#define SATA_DWNLOAD_MCODE_CMD 0x0001 /* Download Microcode CMD supp/enbld */ 263 264/* Identify Device: command set supported/enabled bits - words 82 and 85 */ 265 266#define SATA_SMART_SUPPORTED 0x0001 /* SMART feature set is supported */ 267#define SATA_WRITE_CACHE 0x0020 /* Write Cache supported/enabled */ 268#define SATA_LOOK_AHEAD 0x0040 /* Look Ahead supported/enabled */ 269#define SATA_DEVICE_RESET_CMD 0x0200 /* Device Reset CMD supported/enbld */ 270#define SATA_READ_BUFFER_CMD 0x2000 /* Read Buffer CMD supported/enbld */ 271#define SATA_WRITE_BUFFER_CMD 0x1000 /* Write Buffer CMD supported/enbld */ 272#define SATA_SMART_ENABLED 0x0001 /* SMART feature set is enabled */ 273 274/* Identify Device: command set supported/enabled bits - words 84 & 87 */ 275#define SATA_SMART_SELF_TEST_SUPPORTED 0x0002 /* SMART self-test supported */ 276 277#define SATA_MDMA_SEL_MASK 0x0700 /* Multiword DMA selected */ 278#define SATA_MDMA_2_SEL 0x0400 /* Multiword DMA mode 2 selected */ 279#define SATA_MDMA_1_SEL 0x0200 /* Multiword DMA mode 1 selected */ 280#define SATA_MDMA_0_SEL 0x0100 /* Multiword DMA mode 0 selected */ 281#define SATA_MDMA_2_SUP 0x0004 /* Multiword DMA mode 2 supported */ 282#define SATA_MDMA_1_SUP 0x0002 /* Multiword DMA mode 1 supported */ 283#define SATA_MDMA_0_SUP 0x0001 /* Multiword DMA mode 0 supported */ 284 285/* Identify Device: command set supported/enabled bits - word 206 */ 286 287/* All are SCT Command Transport support */ 288#define SATA_SCT_CMD_TRANS_SUP 0x0001 /* anything */ 289#define SATA_SCT_CMD_TRANS_LNG_SECT_SUP 0x0002 /* Long Sector Access */ 290#define SATA_SCT_CMD_TRANS_WR_SAME_SUP 0x0004 /* Write Same */ 291#define SATA_SCT_CMD_TRANS_ERR_RCOV_SUP 0x0008 /* Error Recovery Control */ 292#define SATA_SCT_CMD_TRANS_FEAT_CTL_SUP 0x0010 /* Features Control */ 293#define SATA_SCT_CMD_TRANS_DATA_TBL_SUP 0x0020 /* Data Tables supported */ 294 295#define SATA_DISK_SECTOR_SIZE 512 /* HD physical sector size */ 296 297/* Identify Packet Device data definitions (ATAPI devices) */ 298 299/* Identify Packet Device: general config bits - word 0 */ 300 301#define SATA_ATAPI_TYPE_MASK 0xc000 302#define SATA_ATAPI_TYPE 0x8000 /* ATAPI device */ 303#define SATA_ATAPI_ID_PKT_SZ 0x0003 /* Packet size mask */ 304#define SATA_ATAPI_ID_PKT_12B 0x0000 /* Packet size 12 bytes */ 305#define SATA_ATAPI_ID_PKT_16B 0x0001 /* Packet size 16 bytes */ 306#define SATA_ATAPI_ID_DRQ_TYPE 0x0060 /* DRQ asserted in 3ms after pkt */ 307#define SATA_ATAPI_ID_DRQ_INTR 0x0020 /* Obsolete in ATA/ATAPI 7 */ 308 309#define SATA_ATAPI_ID_DEV_TYPE 0x0f00 /* device type/command set mask */ 310#define SATA_ATAPI_ID_DEV_SHFT 8 311#define SATA_ATAPI_DIRACC_DEV 0x0000 /* Direct Access device */ 312#define SATA_ATAPI_SQACC_DEV 0x0100 /* Sequential access dev (tape ?) */ 313#define SATA_ATAPI_CDROM_DEV 0x0500 /* CD_ROM device */ 314 315/* 316 * Status bits from ATAPI Interrupt reason register (AT_COUNT) register 317 */ 318#define SATA_ATAPI_I_COD 0x01 /* Command or Data */ 319#define SATA_ATAPI_I_IO 0x02 /* IO direction */ 320#define SATA_ATAPI_I_RELEASE 0x04 /* Release for ATAPI overlap */ 321 322/* ATAPI feature reg definitions */ 323 324#define SATA_ATAPI_F_OVERLAP 0x02 325 326 327/* 328 * ATAPI IDENTIFY_DRIVE capabilities word 329 */ 330 331#define SATA_ATAPI_ID_CAP_DMA 0x0100 332#define SATA_ATAPI_ID_CAP_OVERLAP 0x2000 333 334/* 335 * ATAPI signature bits 336 */ 337#define SATA_ATAPI_SIG_HI 0xeb /* in high cylinder register */ 338#define SATA_ATAPI_SIG_LO 0x14 /* in low cylinder register */ 339 340/* These values are pre-set for CD_ROM/DVD ? */ 341 342#define SATA_ATAPI_SECTOR_SIZE 2048 343#define SATA_ATAPI_MAX_BYTES_PER_DRQ 0xf800 /* 16 bits - 2KB ie 62KB */ 344#define SATA_ATAPI_HEADS 64 345#define SATA_ATAPI_SECTORS_PER_TRK 32 346 347/* SATA Capabilites bits (word 76) */ 348 349#define SATA_NCQ 0x100 350#define SATA_2_SPEED 0x004 351#define SATA_1_SPEED 0x002 352 353/* SATA Features Supported (word 78) - not used */ 354 355/* SATA Features Enabled (word 79) - not used */ 356 357/* 358 * Status bits from AT_STATUS register 359 */ 360#define SATA_STATUS_BSY 0x80 /* controller busy */ 361#define SATA_STATUS_DRDY 0x40 /* drive ready */ 362#define SATA_STATUS_DF 0x20 /* device fault */ 363#define SATA_STATUS_DSC 0x10 /* seek operation complete */ 364#define SATA_STATUS_DRQ 0x08 /* data request */ 365#define SATA_STATUS_CORR 0x04 /* obsolete */ 366#define SATA_STATUS_IDX 0x02 /* obsolete */ 367#define SATA_STATUS_ERR 0x01 /* error flag */ 368 369/* 370 * Status bits from AT_ERROR register 371 */ 372#define SATA_ERROR_ICRC 0x80 /* CRC data transfer error detected */ 373#define SATA_ERROR_UNC 0x40 /* uncorrectable data error */ 374#define SATA_ERROR_MC 0x20 /* Media change */ 375#define SATA_ERROR_IDNF 0x10 /* ID/Address not found */ 376#define SATA_ERROR_MCR 0x08 /* media change request */ 377#define SATA_ERROR_ABORT 0x04 /* aborted command */ 378#define SATA_ERROR_NM 0x02 /* no media */ 379#define SATA_ERROR_EOM 0x02 /* end of media (Packet cmds) */ 380#define SATA_ERROR_ILI 0x01 /* cmd sepcific */ 381 382 383/* 384 * Bits from the device control register 385 */ 386#define SATA_DEVCTL_NIEN 0x02 /* not interrupt enabled */ 387#define SATA_DEVCTL_SRST 0x04 /* software reset */ 388#define SATA_DEVCTL_HOB 0x80 /* high order bit */ 389 390/* device_reg */ 391#define SATA_ADH_LBA 0x40 /* addressing in LBA mode not chs */ 392 393 394#define SCSI_LOG_PAGE_HDR_LEN 4 /* # bytes of a SCSI log page header */ 395#define SCSI_LOG_PARAM_HDR_LEN 4 /* # byttes of a SCSI log param hdr */ 396 397/* Number of log entries per extended selftest log block */ 398#define ENTRIES_PER_EXT_SELFTEST_LOG_BLK 19 399 400/* Number of entries per SCSI LOG SENSE SELFTEST RESULTS page */ 401#define SCSI_ENTRIES_IN_LOG_SENSE_SELFTEST_RESULTS 20 402 403/* Length of a SCSI LOG SENSE SELFTEST RESULTS parameter */ 404#define SCSI_LOG_SENSE_SELFTEST_PARAM_LEN 0x10 405 406#define DIAGNOSTIC_FAILURE_ON_COMPONENT 0x40 407 408#define SCSI_COMPONENT_81 0x81 409#define SCSI_COMPONENT_82 0x82 410#define SCSI_COMPONENT_83 0x83 411#define SCSI_COMPONENT_84 0x84 412#define SCSI_COMPONENT_85 0x85 413#define SCSI_COMPONENT_86 0x86 414#define SCSI_COMPONENT_87 0x87 415#define SCSI_COMPONENT_88 0x88 416 417#define SCSI_ASC_ATA_DEV_FEAT_NOT_ENABLED 0x67 418#define SCSI_ASCQ_ATA_DEV_FEAT_NOT_ENABLED 0x0b 419 420#define SCSI_PREDICTED_FAILURE 0x5d 421#define SCSI_GENERAL_HD_FAILURE 0x10 422 423#define SCSI_INFO_EXCEPTIONS_PARAM_LEN 3 424 425#define READ_LOG_EXT_LOG_DIRECTORY 0 426#define SMART_SELFTEST_LOG_PAGE 6 427#define EXT_SMART_SELFTEST_LOG_PAGE 7 428/* 429 * SMART data structures 430 */ 431struct smart_data { 432 uint8_t smart_vendor_specific[362]; 433 uint8_t smart_offline_data_collection_status; 434 uint8_t smart_selftest_exec_status; 435 uint8_t smart_secs_to_complete_offline_data[2]; 436 uint8_t smart_vendor_specific2; 437 uint8_t smart_offline_data_collection_capability; 438 uint8_t smart_capability[2]; 439 uint8_t smart_error_logging_capability; 440 uint8_t smart_vendor_specific3; 441 uint8_t smart_short_selftest_polling_time; 442 uint8_t smart_extended_selftest_polling_time; 443 uint8_t smart_conveyance_selftest_polling_time; 444 uint8_t smart_reserved[11]; 445 uint8_t smart_vendor_specific4[125]; 446 uint8_t smart_checksum; 447}; 448 449struct smart_selftest_log_entry { 450 uint8_t smart_selftest_log_lba_low; 451 uint8_t smart_selftest_log_status; 452 uint8_t smart_selftest_log_timestamp[2]; 453 uint8_t smart_selftest_log_checkpoint; 454 uint8_t smart_selftest_log_failing_lba[4]; /* from LSB to MSB */ 455 uint8_t smart_selftest_log_vendor_specific[15]; 456}; 457 458#define NUM_SMART_SELFTEST_LOG_ENTRIES 21 459struct smart_selftest_log { 460 uint8_t smart_selftest_log_revision[2]; 461 struct smart_selftest_log_entry 462 smart_selftest_log_entries[NUM_SMART_SELFTEST_LOG_ENTRIES]; 463 uint8_t smart_selftest_log_vendor_specific[2]; 464 uint8_t smart_selftest_log_index; 465 uint8_t smart_selftest_log_reserved[2]; 466 uint8_t smart_selftest_log_checksum; 467}; 468 469struct smart_ext_selftest_log_entry { 470 uint8_t smart_ext_selftest_log_lba_low; 471 uint8_t smart_ext_selftest_log_status; 472 uint8_t smart_ext_selftest_log_timestamp[2]; 473 uint8_t smart_ext_selftest_log_checkpoint; 474 uint8_t smart_ext_selftest_log_failing_lba[6]; 475 uint8_t smart_ext_selftest_log_vendor_specific[15]; 476}; 477 478struct smart_ext_selftest_log { 479 uint8_t smart_ext_selftest_log_rev; 480 uint8_t smart_ext_selftest_log_reserved; 481 uint8_t smart_ext_selftest_log_index[2]; 482 struct smart_ext_selftest_log_entry smart_ext_selftest_log_entries[19]; 483 uint8_t smart_ext_selftest_log_vendor_specific[2]; 484 uint8_t smart_ext_selftest_log_reserved2[11]; 485 uint8_t smart_ext_selftest_log_checksum; 486}; 487 488struct read_log_ext_directory { 489 uint8_t read_log_ext_vers[2]; /* general purpose log version */ 490 uint8_t read_log_ext_nblks[2][255]; /* # of blks @ log addr index+1 */ 491}; 492 493/* 494 * SMART specific data 495 * These eventually need to go to a generic scsi hearder file 496 * for now they will reside here 497 */ 498#define PC_CUMMULATIVE_VALUES 0x01 499#define PAGE_CODE_GET_SUPPORTED_LOG_PAGES 0x00 500#define PAGE_CODE_SELF_TEST_RESULTS 0x10 501#define PAGE_CODE_INFORMATION_EXCEPTIONS 0x2f 502#define PAGE_CODE_SMART_READ_DATA 0x30 503 504 505struct log_parameter { 506 uint8_t param_code[2]; /* parameter dependant */ 507 uint8_t param_ctrl_flags; /* see defines below */ 508 uint8_t param_len; /* # of bytes following */ 509 uint8_t param_values[1]; /* # of bytes defined by param_len */ 510}; 511 512/* param_ctrl_flag fields */ 513#define LOG_CTRL_LP 0x01 /* list parameter */ 514#define LOG_CTRL_LBIN 0x02 /* list is binary */ 515#define LOG_CTRL_TMC 0x0c /* threshold met criteria */ 516#define LOG_CTRL_ETC 0x10 /* enable threshold comparison */ 517#define LOG_CTRL_TSD 0x20 /* target save disable */ 518#define LOG_CTRL_DS 0x40 /* disable save */ 519#define LOG_CTRL_DU 0x80 /* disable update */ 520 521#define SMART_MAGIC_VAL_1 0x4f 522#define SMART_MAGIC_VAL_2 0xc2 523#define SMART_MAGIC_VAL_3 0xf4 524#define SMART_MAGIC_VAL_4 0x2c 525 526#define SCT_STATUS_LOG_PAGE 0xe0 527 528#ifdef __cplusplus 529} 530#endif 531 532#endif /* _SATA_DEFS_H */ 533