src/sbin/atactl/atasmart.h

228 lines
6.6 KiB
C

/* $OpenBSD: atasmart.h,v 1.3 2004/01/16 22:41:52 grange Exp $ */
/*
* Copyright (c) 2002 Alexander Yurchenko <grange@rt.mipt.ru>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
/* ATA SMART subcommands */
#define ATA_SMART_READ 0xd0 /* SMART read data */
#define ATA_SMART_THRESHOLD 0xd1 /* SMART read threshold */
#define ATA_SMART_AUTOSAVE 0xd2 /* SMART en-/disable attr. autosave */
#define ATA_SMART_SAVE 0xd3 /* SMART save attributes */
#define ATA_SMART_OFFLINE 0xd4 /* SMART execute offline immediately */
#define ATA_SMART_READLOG 0xd5 /* SMART read log */
#define ATA_SMART_WRITELOG 0xd6 /* SMART write log */
#define ATA_SMART_EN 0xd8 /* SMART enable operations */
#define ATA_SMART_DS 0xd9 /* SMART disable operations */
#define ATA_SMART_STATUS 0xda /* SMART return status */
/* device attribute */
struct attribute {
u_int8_t id; /* Attribute ID */
u_int16_t status; /* Status flags */
u_int8_t value; /* Attribute value */
u_int8_t raw[8]; /* Vendor specific */
} __packed;
/* read data sector */
struct smart_read {
u_int16_t revision; /* Data structure revision */
struct attribute attribute[30]; /* Device attribute */
u_int8_t offstat; /* Off-line data collection status */
#define SMART_OFFSTAT_NOTSTART 0x00
#define SMART_OFFSTAT_COMPLETE 0x02
#define SMART_OFFSTAT_SUSPEND 0x04
#define SMART_OFFSTAT_INTR 0x05
#define SMART_OFFSTAT_ERROR 0x06
u_int8_t selfstat; /* Self-test execution status */
#define SMART_SELFSTAT_COMPLETE 0x00
#define SMART_SELFSTAT_ABORT 0x01
#define SMART_SELFSTAT_INTR 0x02
#define SMART_SELFSTAT_ERROR 0x03
#define SMART_SELFSTAT_UNKFAIL 0x04
#define SMART_SELFSTAT_ELFAIL 0x05
#define SMART_SELFSTAT_SRVFAIL 0x06
#define SMART_SELFSTAT_RDFAIL 0x07
#define SMART_SELFSTAT_PROGRESS 0x0f
u_int16_t time; /* Time to complete data collection activity */
u_int8_t vendor1; /* Vendor specific */
u_int8_t offcap; /* Off-line data collection capability */
#define SMART_OFFCAP_EXEC 0x01
#define SMART_OFFCAP_ABORT 0x04
#define SMART_OFFCAP_READSCAN 0x08
#define SMART_OFFCAP_SELFTEST 0x10
u_int16_t smartcap; /* SMART capability */
#define SMART_SMARTCAP_SAVE 0x01
#define SMART_SMARTCAP_AUTOSAVE 0x02
u_int8_t errcap; /* Error logging capability */
#define SMART_ERRCAP_ERRLOG 0x01
u_int8_t vendor2; /* Vendor specific */
u_int8_t shtime; /* Short self-test polling time */
u_int8_t extime; /* Extended self-test polling time */
u_int8_t res[12]; /* Reserved */
u_int8_t vendor3[125]; /* Vendor specific */
u_int8_t cksum; /* Data structure checksum */
};
/* threshold entry */
struct threshold {
u_int8_t id; /* Threshold ID */
u_int8_t value; /* Threshold value */
u_int8_t reserve[10];
};
/* read thresholds sector */
struct smart_threshold {
u_int16_t revision; /* Data structure revision */
struct threshold threshold[30];
u_int8_t reserve[18];
u_int8_t vendor[131];
u_int8_t cksum; /* Data structure checksum */
};
/* log directory entry */
struct smart_log_dir_entry {
u_int8_t sec_num;
u_int8_t res;
};
/* log directory sector */
struct smart_log_dir {
u_int16_t version;
struct smart_log_dir_entry entry[255];
};
/* command data structure */
struct smart_log_cmd {
u_int8_t reg_ctl;
u_int8_t reg_feat;
u_int8_t reg_seccnt;
u_int8_t reg_lbalo;
u_int8_t reg_lbamid;
u_int8_t reg_lbahi;
u_int8_t reg_dev;
u_int8_t reg_cmd;
u_int8_t time1;
u_int8_t time2;
u_int8_t time3;
u_int8_t time4;
};
/* error data structure */
struct smart_log_err {
u_int8_t res;
u_int8_t reg_err;
u_int8_t reg_seccnt;
u_int8_t reg_lbalo;
u_int8_t reg_lbamid;
u_int8_t reg_lbahi;
u_int8_t reg_dev;
u_int8_t reg_stat;
u_int8_t ext[19];
u_int8_t state;
#define SMART_LOG_STATE_UNK 0x0
#define SMART_LOG_STATE_SLEEP 0x1
#define SMART_LOG_STATE_ACTIDL 0x2
#define SMART_LOG_STATE_OFFSELF 0x3
u_int8_t time1;
u_int8_t time2;
};
/* error log data structure */
struct smart_log_errdata {
struct smart_log_cmd cmd[5];
struct smart_log_err err;
};
/* summary error log sector */
struct smart_log_sum {
u_int8_t version;
u_int8_t index;
struct smart_log_errdata errdata[5];
u_int16_t err_cnt;
u_int8_t res[57];
u_int8_t cksum;
};
/* comprehensive error log sector */
struct smart_log_comp {
u_int8_t version;
u_int8_t index;
struct smart_log_errdata errdata[5];
u_int16_t err_cnt;
u_int8_t res[57];
u_int8_t cksum;
};
/* self-test descriptor entry */
struct smart_log_self_desc {
u_int8_t reg_lbalo;
u_int8_t selfstat;
u_int8_t time1;
u_int8_t time2;
u_int8_t chkpnt;
u_int8_t lbafail1;
u_int8_t lbafail2;
u_int8_t lbafail3;
u_int8_t lbafail4;
u_int8_t vendor[15];
};
/* self-test log sector */
struct smart_log_self {
u_int16_t rev;
struct smart_log_self_desc desc[21];
u_int8_t vendor[2];
u_int8_t index;
u_int8_t res[2];
u_int8_t cksum;
};
#define SMART_SELFSTAT_PCNT(s) ((s & 0x0f) * 10)
#define SMART_SELFSTAT_STAT(s) (s >> 4)
#define SMART_OFFLINE_COLLECT 0
#define SMART_OFFLINE_SHORTOFF 1
#define SMART_OFFLINE_EXTENOFF 2
#define SMART_OFFLINE_ABORT 127
#define SMART_OFFLINE_SHORTCAP 129
#define SMART_OFFLINE_EXTENCAP 130
#define SMART_AUTOSAVE_DS 0x00
#define SMART_AUTOSAVE_EN 0xf1
#define SMART_READLOG_DIR 0x00
#define SMART_READLOG_SUM 0x01
#define SMART_READLOG_COMP 0x02
#define SMART_READLOG_ECOMP 0x03
#define SMART_READLOG_SELF 0x06
#define SMART_READLOG_ESELF 0x07
#define SMART_LOG_MSECT 0x01