1 /* $OpenBSD: atasmart.h,v 1.3 2004/01/16 22:41:52 grange Exp $ */ 2 3 /* 4 * Copyright (c) 2002 Alexander Yurchenko <grange@rt.mipt.ru> 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * - Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * - Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following 15 * disclaimer in the documentation and/or other materials provided 16 * with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 28 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 * 31 */ 32 33 /* ATA SMART subcommands */ 34 #define ATA_SMART_READ 0xd0 /* SMART read data */ 35 #define ATA_SMART_THRESHOLD 0xd1 /* SMART read threshold */ 36 #define ATA_SMART_AUTOSAVE 0xd2 /* SMART en-/disable attr. autosave */ 37 #define ATA_SMART_SAVE 0xd3 /* SMART save attributes */ 38 #define ATA_SMART_OFFLINE 0xd4 /* SMART execute offline immediately */ 39 #define ATA_SMART_READLOG 0xd5 /* SMART read log */ 40 #define ATA_SMART_WRITELOG 0xd6 /* SMART write log */ 41 #define ATA_SMART_EN 0xd8 /* SMART enable operations */ 42 #define ATA_SMART_DS 0xd9 /* SMART disable operations */ 43 #define ATA_SMART_STATUS 0xda /* SMART return status */ 44 45 /* device attribute */ 46 struct attribute { 47 u_int8_t id; /* Attribute ID */ 48 u_int16_t status; /* Status flags */ 49 u_int8_t value; /* Attribute value */ 50 u_int8_t raw[8]; /* Vendor specific */ 51 } __packed; 52 53 /* read data sector */ 54 struct smart_read { 55 u_int16_t revision; /* Data structure revision */ 56 struct attribute attribute[30]; /* Device attribute */ 57 u_int8_t offstat; /* Off-line data collection status */ 58 #define SMART_OFFSTAT_NOTSTART 0x00 59 #define SMART_OFFSTAT_COMPLETE 0x02 60 #define SMART_OFFSTAT_SUSPEND 0x04 61 #define SMART_OFFSTAT_INTR 0x05 62 #define SMART_OFFSTAT_ERROR 0x06 63 u_int8_t selfstat; /* Self-test execution status */ 64 #define SMART_SELFSTAT_COMPLETE 0x00 65 #define SMART_SELFSTAT_ABORT 0x01 66 #define SMART_SELFSTAT_INTR 0x02 67 #define SMART_SELFSTAT_ERROR 0x03 68 #define SMART_SELFSTAT_UNKFAIL 0x04 69 #define SMART_SELFSTAT_ELFAIL 0x05 70 #define SMART_SELFSTAT_SRVFAIL 0x06 71 #define SMART_SELFSTAT_RDFAIL 0x07 72 #define SMART_SELFSTAT_PROGRESS 0x0f 73 u_int16_t time; /* Time to complete data collection activity */ 74 u_int8_t vendor1; /* Vendor specific */ 75 u_int8_t offcap; /* Off-line data collection capability */ 76 #define SMART_OFFCAP_EXEC 0x01 77 #define SMART_OFFCAP_ABORT 0x04 78 #define SMART_OFFCAP_READSCAN 0x08 79 #define SMART_OFFCAP_SELFTEST 0x10 80 u_int16_t smartcap; /* SMART capability */ 81 #define SMART_SMARTCAP_SAVE 0x01 82 #define SMART_SMARTCAP_AUTOSAVE 0x02 83 u_int8_t errcap; /* Error logging capability */ 84 #define SMART_ERRCAP_ERRLOG 0x01 85 u_int8_t vendor2; /* Vendor specific */ 86 u_int8_t shtime; /* Short self-test polling time */ 87 u_int8_t extime; /* Extended self-test polling time */ 88 u_int8_t res[12]; /* Reserved */ 89 u_int8_t vendor3[125]; /* Vendor specific */ 90 u_int8_t cksum; /* Data structure checksum */ 91 }; 92 93 /* threshold entry */ 94 struct threshold { 95 u_int8_t id; /* Threshold ID */ 96 u_int8_t value; /* Threshold value */ 97 u_int8_t reserve[10]; 98 }; 99 100 /* read thresholds sector */ 101 struct smart_threshold { 102 u_int16_t revision; /* Data structure revision */ 103 struct threshold threshold[30]; 104 u_int8_t reserve[18]; 105 u_int8_t vendor[131]; 106 u_int8_t cksum; /* Data structure checksum */ 107 }; 108 109 /* log directory entry */ 110 struct smart_log_dir_entry { 111 u_int8_t sec_num; 112 u_int8_t res; 113 }; 114 115 /* log directory sector */ 116 struct smart_log_dir { 117 u_int16_t version; 118 struct smart_log_dir_entry entry[255]; 119 }; 120 121 /* command data structure */ 122 struct smart_log_cmd { 123 u_int8_t reg_ctl; 124 u_int8_t reg_feat; 125 u_int8_t reg_seccnt; 126 u_int8_t reg_lbalo; 127 u_int8_t reg_lbamid; 128 u_int8_t reg_lbahi; 129 u_int8_t reg_dev; 130 u_int8_t reg_cmd; 131 u_int8_t time1; 132 u_int8_t time2; 133 u_int8_t time3; 134 u_int8_t time4; 135 }; 136 137 /* error data structure */ 138 struct smart_log_err { 139 u_int8_t res; 140 u_int8_t reg_err; 141 u_int8_t reg_seccnt; 142 u_int8_t reg_lbalo; 143 u_int8_t reg_lbamid; 144 u_int8_t reg_lbahi; 145 u_int8_t reg_dev; 146 u_int8_t reg_stat; 147 u_int8_t ext[19]; 148 u_int8_t state; 149 #define SMART_LOG_STATE_UNK 0x0 150 #define SMART_LOG_STATE_SLEEP 0x1 151 #define SMART_LOG_STATE_ACTIDL 0x2 152 #define SMART_LOG_STATE_OFFSELF 0x3 153 u_int8_t time1; 154 u_int8_t time2; 155 }; 156 157 /* error log data structure */ 158 struct smart_log_errdata { 159 struct smart_log_cmd cmd[5]; 160 struct smart_log_err err; 161 }; 162 163 /* summary error log sector */ 164 struct smart_log_sum { 165 u_int8_t version; 166 u_int8_t index; 167 struct smart_log_errdata errdata[5]; 168 u_int16_t err_cnt; 169 u_int8_t res[57]; 170 u_int8_t cksum; 171 }; 172 173 /* comprehensive error log sector */ 174 struct smart_log_comp { 175 u_int8_t version; 176 u_int8_t index; 177 struct smart_log_errdata errdata[5]; 178 u_int16_t err_cnt; 179 u_int8_t res[57]; 180 u_int8_t cksum; 181 }; 182 183 /* self-test descriptor entry */ 184 struct smart_log_self_desc { 185 u_int8_t reg_lbalo; 186 u_int8_t selfstat; 187 u_int8_t time1; 188 u_int8_t time2; 189 u_int8_t chkpnt; 190 u_int8_t lbafail1; 191 u_int8_t lbafail2; 192 u_int8_t lbafail3; 193 u_int8_t lbafail4; 194 u_int8_t vendor[15]; 195 }; 196 197 /* self-test log sector */ 198 struct smart_log_self { 199 u_int16_t rev; 200 struct smart_log_self_desc desc[21]; 201 u_int8_t vendor[2]; 202 u_int8_t index; 203 u_int8_t res[2]; 204 u_int8_t cksum; 205 }; 206 207 #define SMART_SELFSTAT_PCNT(s) ((s & 0x0f) * 10) 208 #define SMART_SELFSTAT_STAT(s) (s >> 4) 209 210 #define SMART_OFFLINE_COLLECT 0 211 #define SMART_OFFLINE_SHORTOFF 1 212 #define SMART_OFFLINE_EXTENOFF 2 213 #define SMART_OFFLINE_ABORT 127 214 #define SMART_OFFLINE_SHORTCAP 129 215 #define SMART_OFFLINE_EXTENCAP 130 216 217 #define SMART_AUTOSAVE_DS 0x00 218 #define SMART_AUTOSAVE_EN 0xf1 219 220 #define SMART_READLOG_DIR 0x00 221 #define SMART_READLOG_SUM 0x01 222 #define SMART_READLOG_COMP 0x02 223 #define SMART_READLOG_ECOMP 0x03 224 #define SMART_READLOG_SELF 0x06 225 #define SMART_READLOG_ESELF 0x07 226 227 #define SMART_LOG_MSECT 0x01 228