Annotation of embedaddon/smartmontools/atacmds.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * atacmds.h
                      3:  *
                      4:  * Home page of code is: http://smartmontools.sourceforge.net
                      5:  *
                      6:  * Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
                      7:  * Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
                      8:  * Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
                      9:  *
                     10:  * This program is free software; you can redistribute it and/or modify
                     11:  * it under the terms of the GNU General Public License as published by
                     12:  * the Free Software Foundation; either version 2, or (at your option)
                     13:  * any later version.
                     14:  *
                     15:  * You should have received a copy of the GNU General Public License
                     16:  * (for example COPYING); if not, write to the Free
                     17:  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     18:  *
                     19:  * This code was originally developed as a Senior Thesis by Michael Cornwell
                     20:  * at the Concurrent Systems Laboratory (now part of the Storage Systems
                     21:  * Research Center), Jack Baskin School of Engineering, University of
                     22:  * California, Santa Cruz. http://ssrc.soe.ucsc.edu/
                     23:  *
                     24:  */
                     25: 
                     26: #ifndef ATACMDS_H_
                     27: #define ATACMDS_H_
                     28: 
                     29: #define ATACMDS_H_CVSID "$Id: atacmds.h 3316 2011-04-19 19:34:57Z chrfranke $"
                     30: 
                     31: #include "dev_interface.h" // ata_device
                     32: 
                     33: // Macro to check expected size of struct at compile time using a
                     34: // dummy typedef.  On size mismatch, compiler reports a negative array
                     35: // size.  If you see an error message of this form, it means that the
                     36: // #pragma pack(1) pragma below is not having the desired effect on
                     37: // your compiler.
                     38: #define ASSERT_SIZEOF_STRUCT(s, n) \
                     39:   typedef char assert_sizeof_struct_##s[(sizeof(struct s) == (n)) ? 1 : -1]
                     40: 
                     41: // Add __attribute__((packed)) if compiler supports it
                     42: // because some gcc versions (at least ARM) lack support of #pragma pack()
                     43: #ifdef HAVE_ATTR_PACKED
                     44: #define ATTR_PACKED __attribute__((packed))
                     45: #else
                     46: #define ATTR_PACKED
                     47: #endif
                     48: 
                     49: typedef enum {
                     50:   // returns no data, just succeeds or fails
                     51:   ENABLE,
                     52:   DISABLE,
                     53:   AUTOSAVE,
                     54:   IMMEDIATE_OFFLINE,
                     55:   AUTO_OFFLINE,
                     56:   STATUS,       // just says if SMART is working or not
                     57:   STATUS_CHECK, // says if disk's SMART status is healthy, or failing
                     58:   // return 512 bytes of data:
                     59:   READ_VALUES,
                     60:   READ_THRESHOLDS,
                     61:   READ_LOG,
                     62:   IDENTIFY,
                     63:   PIDENTIFY,
                     64:   // returns 1 byte of data
                     65:   CHECK_POWER_MODE,
                     66:   // writes 512 bytes of data:
                     67:   WRITE_LOG
                     68: } smart_command_set;
                     69: 
                     70: // Possible values for fix_firmwarebug.
                     71: enum {
                     72:   FIX_NOTSPECIFIED = 0,
                     73:   FIX_NONE,
                     74:   FIX_SAMSUNG,
                     75:   FIX_SAMSUNG2,
                     76:   FIX_SAMSUNG3
                     77: };
                     78: 
                     79: // ATA Specification Command Register Values (Commands)
                     80: #define ATA_IDENTIFY_DEVICE             0xec
                     81: #define ATA_IDENTIFY_PACKET_DEVICE      0xa1
                     82: #define ATA_SMART_CMD                   0xb0
                     83: #define ATA_CHECK_POWER_MODE            0xe5
                     84: // 48-bit commands
                     85: #define ATA_READ_LOG_EXT                0x2F
                     86: 
                     87: // ATA Specification Feature Register Values (SMART Subcommands).
                     88: // Note that some are obsolete as of ATA-7.
                     89: #define ATA_SMART_READ_VALUES           0xd0
                     90: #define ATA_SMART_READ_THRESHOLDS       0xd1
                     91: #define ATA_SMART_AUTOSAVE              0xd2
                     92: #define ATA_SMART_SAVE                  0xd3
                     93: #define ATA_SMART_IMMEDIATE_OFFLINE     0xd4
                     94: #define ATA_SMART_READ_LOG_SECTOR       0xd5
                     95: #define ATA_SMART_WRITE_LOG_SECTOR      0xd6
                     96: #define ATA_SMART_WRITE_THRESHOLDS      0xd7
                     97: #define ATA_SMART_ENABLE                0xd8
                     98: #define ATA_SMART_DISABLE               0xd9
                     99: #define ATA_SMART_STATUS                0xda
                    100: // SFF 8035i Revision 2 Specification Feature Register Value (SMART
                    101: // Subcommand)
                    102: #define ATA_SMART_AUTO_OFFLINE          0xdb
                    103: 
                    104: // Sector Number values for ATA_SMART_IMMEDIATE_OFFLINE Subcommand
                    105: #define OFFLINE_FULL_SCAN               0
                    106: #define SHORT_SELF_TEST                 1
                    107: #define EXTEND_SELF_TEST                2
                    108: #define CONVEYANCE_SELF_TEST            3
                    109: #define SELECTIVE_SELF_TEST             4
                    110: #define ABORT_SELF_TEST                 127
                    111: #define SHORT_CAPTIVE_SELF_TEST         129
                    112: #define EXTEND_CAPTIVE_SELF_TEST        130
                    113: #define CONVEYANCE_CAPTIVE_SELF_TEST    131
                    114: #define SELECTIVE_CAPTIVE_SELF_TEST     132
                    115: #define CAPTIVE_MASK                    (0x01<<7)
                    116: 
                    117: // Maximum allowed number of SMART Attributes
                    118: #define NUMBER_ATA_SMART_ATTRIBUTES     30
                    119: 
                    120: // Needed parts of the ATA DRIVE IDENTIFY Structure. Those labeled
                    121: // word* are NOT used.
                    122: #pragma pack(1)
                    123: struct ata_identify_device {
                    124:   unsigned short words000_009[10];
                    125:   unsigned char  serial_no[20];
                    126:   unsigned short words020_022[3];
                    127:   unsigned char  fw_rev[8];
                    128:   unsigned char  model[40];
                    129:   unsigned short words047_079[33];
                    130:   unsigned short major_rev_num;
                    131:   unsigned short minor_rev_num;
                    132:   unsigned short command_set_1;
                    133:   unsigned short command_set_2;
                    134:   unsigned short command_set_extension;
                    135:   unsigned short cfs_enable_1;
                    136:   unsigned short word086;
                    137:   unsigned short csf_default;
                    138:   unsigned short words088_255[168];
                    139: } ATTR_PACKED;
                    140: #pragma pack()
                    141: ASSERT_SIZEOF_STRUCT(ata_identify_device, 512);
                    142: 
                    143: /* ata_smart_attribute is the vendor specific in SFF-8035 spec */ 
                    144: #pragma pack(1)
                    145: struct ata_smart_attribute {
                    146:   unsigned char id;
                    147:   // meaning of flag bits: see MACROS just below
                    148:   // WARNING: MISALIGNED!
                    149:   unsigned short flags; 
                    150:   unsigned char current;
                    151:   unsigned char worst;
                    152:   unsigned char raw[6];
                    153:   unsigned char reserv;
                    154: } ATTR_PACKED;
                    155: #pragma pack()
                    156: ASSERT_SIZEOF_STRUCT(ata_smart_attribute, 12);
                    157: 
                    158: // MACROS to interpret the flags bits in the previous structure.
                    159: // These have not been implemented using bitflags and a union, to make
                    160: // it portable across bit/little endian and different platforms.
                    161: 
                    162: // 0: Prefailure bit
                    163: 
                    164: // From SFF 8035i Revision 2 page 19: Bit 0 (pre-failure/advisory bit)
                    165: // - If the value of this bit equals zero, an attribute value less
                    166: // than or equal to its corresponding attribute threshold indicates an
                    167: // advisory condition where the usage or age of the device has
                    168: // exceeded its intended design life period. If the value of this bit
                    169: // equals one, an attribute value less than or equal to its
                    170: // corresponding attribute threshold indicates a prefailure condition
                    171: // where imminent loss of data is being predicted.
                    172: #define ATTRIBUTE_FLAGS_PREFAILURE(x) (x & 0x01)
                    173: 
                    174: // 1: Online bit 
                    175: 
                    176: //  From SFF 8035i Revision 2 page 19: Bit 1 (on-line data collection
                    177: // bit) - If the value of this bit equals zero, then the attribute
                    178: // value is updated only during off-line data collection
                    179: // activities. If the value of this bit equals one, then the attribute
                    180: // value is updated during normal operation of the device or during
                    181: // both normal operation and off-line testing.
                    182: #define ATTRIBUTE_FLAGS_ONLINE(x) (x & 0x02)
                    183: 
                    184: 
                    185: // The following are (probably) IBM's, Maxtors and  Quantum's definitions for the
                    186: // vendor-specific bits:
                    187: // 2: Performance type bit
                    188: #define ATTRIBUTE_FLAGS_PERFORMANCE(x) (x & 0x04)
                    189: 
                    190: // 3: Errorrate type bit
                    191: #define ATTRIBUTE_FLAGS_ERRORRATE(x) (x & 0x08)
                    192: 
                    193: // 4: Eventcount bit
                    194: #define ATTRIBUTE_FLAGS_EVENTCOUNT(x) (x & 0x10)
                    195: 
                    196: // 5: Selfpereserving bit
                    197: #define ATTRIBUTE_FLAGS_SELFPRESERVING(x) (x & 0x20)
                    198: 
                    199: // 6-15: Reserved for future use
                    200: #define ATTRIBUTE_FLAGS_OTHER(x) ((x) & 0xffc0)
                    201: 
                    202: 
                    203: /* ata_smart_values is format of the read drive Attribute command */
                    204: /* see Table 34 of T13/1321D Rev 1 spec (Device SMART data structure) for *some* info */
                    205: #pragma pack(1)
                    206: struct ata_smart_values {
                    207:   unsigned short int revnumber;
                    208:   struct ata_smart_attribute vendor_attributes [NUMBER_ATA_SMART_ATTRIBUTES];
                    209:   unsigned char offline_data_collection_status;
                    210:   unsigned char self_test_exec_status;  //IBM # segments for offline collection
                    211:   unsigned short int total_time_to_complete_off_line; // IBM different
                    212:   unsigned char vendor_specific_366; // Maxtor & IBM curent segment pointer
                    213:   unsigned char offline_data_collection_capability;
                    214:   unsigned short int smart_capability;
                    215:   unsigned char errorlog_capability;
                    216:   unsigned char vendor_specific_371;  // Maxtor, IBM: self-test failure checkpoint see below!
                    217:   unsigned char short_test_completion_time;
                    218:   unsigned char extend_test_completion_time;
                    219:   unsigned char conveyance_test_completion_time;
                    220:   unsigned char reserved_375_385[11];
                    221:   unsigned char vendor_specific_386_510[125]; // Maxtor bytes 508-509 Attribute/Threshold Revision #
                    222:   unsigned char chksum;
                    223: } ATTR_PACKED;
                    224: #pragma pack()
                    225: ASSERT_SIZEOF_STRUCT(ata_smart_values, 512);
                    226: 
                    227: /* Maxtor, IBM: self-test failure checkpoint byte meaning:
                    228:  00 - write test
                    229:  01 - servo basic
                    230:  02 - servo random
                    231:  03 - G-list scan
                    232:  04 - Handling damage
                    233:  05 - Read scan
                    234: */
                    235: 
                    236: /* Vendor attribute of SMART Threshold (compare to ata_smart_attribute above) */
                    237: #pragma pack(1)
                    238: struct ata_smart_threshold_entry {
                    239:   unsigned char id;
                    240:   unsigned char threshold;
                    241:   unsigned char reserved[10];
                    242: } ATTR_PACKED;
                    243: #pragma pack()
                    244: ASSERT_SIZEOF_STRUCT(ata_smart_threshold_entry, 12);
                    245: 
                    246: /* Format of Read SMART THreshold Command */
                    247: /* Compare to ata_smart_values above */
                    248: #pragma pack(1)
                    249: struct ata_smart_thresholds_pvt {
                    250:   unsigned short int revnumber;
                    251:   struct ata_smart_threshold_entry thres_entries[NUMBER_ATA_SMART_ATTRIBUTES];
                    252:   unsigned char reserved[149];
                    253:   unsigned char chksum;
                    254: } ATTR_PACKED;
                    255: #pragma pack()
                    256: ASSERT_SIZEOF_STRUCT(ata_smart_thresholds_pvt, 512);
                    257: 
                    258: 
                    259: // Table 42 of T13/1321D Rev 1 spec (Error Data Structure)
                    260: #pragma pack(1)
                    261: struct ata_smart_errorlog_error_struct {
                    262:   unsigned char reserved;
                    263:   unsigned char error_register;
                    264:   unsigned char sector_count;
                    265:   unsigned char sector_number;
                    266:   unsigned char cylinder_low;
                    267:   unsigned char cylinder_high;
                    268:   unsigned char drive_head;
                    269:   unsigned char status;
                    270:   unsigned char extended_error[19];
                    271:   unsigned char state;
                    272:   unsigned short timestamp;
                    273: } ATTR_PACKED;
                    274: #pragma pack()
                    275: ASSERT_SIZEOF_STRUCT(ata_smart_errorlog_error_struct, 30);
                    276: 
                    277: 
                    278: // Table 41 of T13/1321D Rev 1 spec (Command Data Structure)
                    279: #pragma pack(1)
                    280: struct ata_smart_errorlog_command_struct {
                    281:   unsigned char devicecontrolreg;
                    282:   unsigned char featuresreg;
                    283:   unsigned char sector_count;
                    284:   unsigned char sector_number;
                    285:   unsigned char cylinder_low;
                    286:   unsigned char cylinder_high;
                    287:   unsigned char drive_head;
                    288:   unsigned char commandreg;
                    289:   unsigned int timestamp;
                    290: } ATTR_PACKED;
                    291: #pragma pack()
                    292: ASSERT_SIZEOF_STRUCT(ata_smart_errorlog_command_struct, 12);
                    293: 
                    294: // Table 40 of T13/1321D Rev 1 spec (Error log data structure)
                    295: #pragma pack(1)
                    296: struct ata_smart_errorlog_struct {
                    297:   struct ata_smart_errorlog_command_struct commands[5];
                    298:   struct ata_smart_errorlog_error_struct error_struct;
                    299: } ATTR_PACKED;
                    300: #pragma pack()
                    301: ASSERT_SIZEOF_STRUCT(ata_smart_errorlog_struct, 90);
                    302: 
                    303: // Table 39 of T13/1321D Rev 1 spec (SMART error log sector)
                    304: #pragma pack(1)
                    305: struct ata_smart_errorlog {
                    306:   unsigned char revnumber;
                    307:   unsigned char error_log_pointer;
                    308:   struct ata_smart_errorlog_struct errorlog_struct[5];
                    309:   unsigned short int ata_error_count;
                    310:   unsigned char reserved[57];
                    311:   unsigned char checksum;
                    312: } ATTR_PACKED;
                    313: #pragma pack()
                    314: ASSERT_SIZEOF_STRUCT(ata_smart_errorlog, 512);
                    315: 
                    316: 
                    317: // Extended Comprehensive SMART Error Log data structures
                    318: // See Section A.7 of
                    319: //   AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)
                    320: //   T13/1699-D Revision 6a (Working Draft), September 6, 2008.
                    321: 
                    322: // Command data structure
                    323: // Table A.9 of T13/1699-D Revision 6a
                    324: #pragma pack(1)
                    325: struct ata_smart_exterrlog_command
                    326: {
                    327:   unsigned char device_control_register;
                    328:   unsigned char features_register;
                    329:   unsigned char features_register_hi;
                    330:   unsigned char count_register;
                    331:   unsigned char count_register_hi;
                    332:   unsigned char lba_low_register;
                    333:   unsigned char lba_low_register_hi;
                    334:   unsigned char lba_mid_register;
                    335:   unsigned char lba_mid_register_hi;
                    336:   unsigned char lba_high_register;
                    337:   unsigned char lba_high_register_hi;
                    338:   unsigned char device_register;
                    339:   unsigned char command_register;
                    340: 
                    341:   unsigned char reserved;
                    342:   unsigned int timestamp;
                    343: } ATTR_PACKED;
                    344: #pragma pack()
                    345: ASSERT_SIZEOF_STRUCT(ata_smart_exterrlog_command, 18);
                    346: 
                    347: // Error data structure
                    348: // Table A.10 T13/1699-D Revision 6a
                    349: #pragma pack(1)
                    350: struct ata_smart_exterrlog_error
                    351: {
                    352:   unsigned char device_control_register;
                    353:   unsigned char error_register;
                    354:   unsigned char count_register;
                    355:   unsigned char count_register_hi;
                    356:   unsigned char lba_low_register;
                    357:   unsigned char lba_low_register_hi;
                    358:   unsigned char lba_mid_register;
                    359:   unsigned char lba_mid_register_hi;
                    360:   unsigned char lba_high_register;
                    361:   unsigned char lba_high_register_hi;
                    362:   unsigned char device_register;
                    363:   unsigned char status_register;
                    364: 
                    365:   unsigned char extended_error[19];
                    366:   unsigned char state;
                    367:   unsigned short timestamp;
                    368: } ATTR_PACKED;
                    369: #pragma pack()
                    370: ASSERT_SIZEOF_STRUCT(ata_smart_exterrlog_error, 34);
                    371: 
                    372: // Error log data structure
                    373: // Table A.8 of T13/1699-D Revision 6a
                    374: #pragma pack(1)
                    375: struct ata_smart_exterrlog_error_log
                    376: {
                    377:   ata_smart_exterrlog_command commands[5];
                    378:   ata_smart_exterrlog_error error;
                    379: } ATTR_PACKED;
                    380: #pragma pack()
                    381: ASSERT_SIZEOF_STRUCT(ata_smart_exterrlog_error_log, 124);
                    382: 
                    383: // Ext. Comprehensive SMART error log
                    384: // Table A.7 of T13/1699-D Revision 6a
                    385: #pragma pack(1)
                    386: struct ata_smart_exterrlog
                    387: {
                    388:   unsigned char version;
                    389:   unsigned char reserved1;
                    390:   unsigned short error_log_index;
                    391:   ata_smart_exterrlog_error_log error_logs[4];
                    392:   unsigned short device_error_count;
                    393:   unsigned char reserved2[9];
                    394:   unsigned char checksum;
                    395: } ATTR_PACKED;
                    396: #pragma pack()
                    397: ASSERT_SIZEOF_STRUCT(ata_smart_exterrlog, 512);
                    398: 
                    399: 
                    400: // Table 45 of T13/1321D Rev 1 spec (Self-test log descriptor entry)
                    401: #pragma pack(1)
                    402: struct ata_smart_selftestlog_struct {
                    403:   unsigned char selftestnumber; // Sector number register
                    404:   unsigned char selfteststatus;
                    405:   unsigned short int timestamp;
                    406:   unsigned char selftestfailurecheckpoint;
                    407:   unsigned int lbafirstfailure;
                    408:   unsigned char vendorspecific[15];
                    409: } ATTR_PACKED;
                    410: #pragma pack()
                    411: ASSERT_SIZEOF_STRUCT(ata_smart_selftestlog_struct, 24);
                    412: 
                    413: // Table 44 of T13/1321D Rev 1 spec (Self-test log data structure)
                    414: #pragma pack(1)
                    415: struct ata_smart_selftestlog {
                    416:   unsigned short int revnumber;
                    417:   struct ata_smart_selftestlog_struct selftest_struct[21];
                    418:   unsigned char vendorspecific[2];
                    419:   unsigned char mostrecenttest;
                    420:   unsigned char reserved[2];
                    421:   unsigned char chksum;
                    422: } ATTR_PACKED;
                    423: #pragma pack()
                    424: ASSERT_SIZEOF_STRUCT(ata_smart_selftestlog, 512);
                    425: 
                    426: // Extended SMART Self-test log data structures
                    427: // See Section A.8 of
                    428: //   AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)
                    429: //   T13/1699-D Revision 6a (Working Draft), September 6, 2008.
                    430: 
                    431: // Extended Self-test log descriptor entry
                    432: // Table A.13 of T13/1699-D Revision 6a
                    433: #pragma pack(1)
                    434: struct ata_smart_extselftestlog_desc
                    435: {
                    436:   unsigned char self_test_type;
                    437:   unsigned char self_test_status;
                    438:   unsigned short timestamp;
                    439:   unsigned char checkpoint;
                    440:   unsigned char failing_lba[6];
                    441:   unsigned char vendorspecific[15];
                    442: } ATTR_PACKED;
                    443: #pragma pack()
                    444: ASSERT_SIZEOF_STRUCT(ata_smart_extselftestlog_desc, 26);
                    445: 
                    446: // Extended Self-test log data structure
                    447: // Table A.12 of T13/1699-D Revision 6a
                    448: #pragma pack(1)
                    449: struct ata_smart_extselftestlog
                    450: {
                    451:   unsigned char version;
                    452:   unsigned char reserved1;
                    453:   unsigned short log_desc_index;
                    454:   struct ata_smart_extselftestlog_desc log_descs[19];
                    455:   unsigned char vendor_specifc[2];
                    456:   unsigned char reserved2[11];
                    457:   unsigned char chksum;
                    458: } ATTR_PACKED;
                    459: #pragma pack()
                    460: ASSERT_SIZEOF_STRUCT(ata_smart_extselftestlog, 512);
                    461: 
                    462: // SMART LOG DIRECTORY Table 52 of T13/1532D Vol 1 Rev 1a
                    463: #pragma pack(1)
                    464: struct ata_smart_log_entry {
                    465:   unsigned char numsectors;
                    466:   unsigned char reserved;
                    467: } ATTR_PACKED;
                    468: #pragma pack()
                    469: ASSERT_SIZEOF_STRUCT(ata_smart_log_entry, 2);
                    470: 
                    471: #pragma pack(1)
                    472: struct ata_smart_log_directory {
                    473:   unsigned short int logversion;
                    474:   struct ata_smart_log_entry entry[255];
                    475: } ATTR_PACKED;
                    476: #pragma pack()
                    477: ASSERT_SIZEOF_STRUCT(ata_smart_log_directory, 512);
                    478: 
                    479: // SMART SELECTIVE SELF-TEST LOG Table 61 of T13/1532D Volume 1
                    480: // Revision 3
                    481: #pragma pack(1)
                    482: struct test_span {
                    483:   uint64_t start;
                    484:   uint64_t end;
                    485: } ATTR_PACKED;
                    486: #pragma pack()
                    487: ASSERT_SIZEOF_STRUCT(test_span, 16);
                    488: 
                    489: #pragma pack(1)
                    490: struct ata_selective_self_test_log {
                    491:   unsigned short     logversion;
                    492:   struct test_span   span[5];
                    493:   unsigned char      reserved1[337-82+1];
                    494:   unsigned char      vendor_specific1[491-338+1];
                    495:   uint64_t           currentlba;
                    496:   unsigned short     currentspan;
                    497:   unsigned short     flags;
                    498:   unsigned char      vendor_specific2[507-504+1];
                    499:   unsigned short     pendingtime;
                    500:   unsigned char      reserved2;
                    501:   unsigned char      checksum;
                    502: } ATTR_PACKED;
                    503: #pragma pack()
                    504: ASSERT_SIZEOF_STRUCT(ata_selective_self_test_log, 512);
                    505: 
                    506: #define SELECTIVE_FLAG_DOSCAN  (0x0002)
                    507: #define SELECTIVE_FLAG_PENDING (0x0008)
                    508: #define SELECTIVE_FLAG_ACTIVE  (0x0010)
                    509: 
                    510: 
                    511: // SCT (SMART Command Transport) data structures
                    512: // See Sections 8.2 and 8.3 of:
                    513: //   AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)
                    514: //   T13/1699-D Revision 3f (Working Draft), December 11, 2006.
                    515: 
                    516: // SCT Status response (read with SMART_READ_LOG page 0xe0)
                    517: // Table 60 of T13/1699-D Revision 3f 
                    518: #pragma pack(1)
                    519: struct ata_sct_status_response
                    520: {
                    521:   unsigned short format_version;    // 0-1: Status response format version number (2, 3)
                    522:   unsigned short sct_version;       // 2-3: Vendor specific version number
                    523:   unsigned short sct_spec;          // 4-5: SCT level supported (1)
                    524:   unsigned int status_flags;        // 6-9: Status flags (Bit 0: Segment initialized, Bits 1-31: reserved)
                    525:   unsigned char device_state;       // 10: Device State (0-5)
                    526:   unsigned char bytes011_013[3];    // 11-13: reserved
                    527:   unsigned short ext_status_code;   // 14-15: Status of last SCT command (0xffff if executing)
                    528:   unsigned short action_code;       // 16-17: Action code of last SCT command
                    529:   unsigned short function_code;     // 18-19: Function code of last SCT command
                    530:   unsigned char bytes020_039[20];   // 20-39: reserved
                    531:   uint64_t lba_current;             // 40-47: LBA of SCT command executing in background
                    532:   unsigned char bytes048_199[152];  // 48-199: reserved
                    533:   signed char hda_temp;             // 200: Current temperature in Celsius (0x80 = invalid)
                    534:   signed char min_temp;             // 201: Minimum temperature this power cycle
                    535:   signed char max_temp;             // 202: Maximum temperature this power cycle
                    536:   signed char life_min_temp;        // 203: Minimum lifetime temperature
                    537:   signed char life_max_temp;        // 204: Maximum lifetime temperature
                    538:   unsigned char byte205;            // 205: reserved (T13/e06152r0-2: Average lifetime temperature)
                    539:   unsigned int over_limit_count;    // 206-209: # intervals since last reset with temperature > Max Op Limit
                    540:   unsigned int under_limit_count;   // 210-213: # intervals since last reset with temperature < Min Op Limit
                    541:   unsigned char bytes214_479[266];  // 214-479: reserved
                    542:   unsigned char vendor_specific[32];// 480-511: vendor specific
                    543: } ATTR_PACKED;
                    544: #pragma pack()
                    545: ASSERT_SIZEOF_STRUCT(ata_sct_status_response, 512);
                    546: 
                    547: // SCT Error Recovery Control command (send with SMART_WRITE_LOG page 0xe0)
                    548: // Table 88 of T13/1699-D Revision 6a
                    549: #pragma pack(1)
                    550: struct ata_sct_error_recovery_control_command
                    551: {
                    552:   unsigned short action_code;       // 3 = Error Recovery Control
                    553:   unsigned short function_code;     // 1 = Set, 2 = Return
                    554:   unsigned short selection_code;    // 1 = Read Timer, 2 = Write Timer
                    555:   unsigned short time_limit;        // If set: Recovery time limit in 100ms units
                    556:   unsigned short words004_255[252]; // reserved
                    557: } ATTR_PACKED;
                    558: #pragma pack()
                    559: ASSERT_SIZEOF_STRUCT(ata_sct_error_recovery_control_command, 512);
                    560: 
                    561: // SCT Feature Control command (send with SMART_WRITE_LOG page 0xe0)
                    562: // Table 72 of T13/1699-D Revision 3f
                    563: #pragma pack(1)
                    564: struct ata_sct_feature_control_command
                    565: {
                    566:   unsigned short action_code;       // 4 = Feature Control
                    567:   unsigned short function_code;     // 1 = Set, 2 = Return, 3 = Return options
                    568:   unsigned short feature_code;      // 3 = Temperature logging interval
                    569:   unsigned short state;             // Interval
                    570:   unsigned short option_flags;      // Bit 0: persistent, Bits 1-15: reserved
                    571:   unsigned short words005_255[251]; // reserved
                    572: } ATTR_PACKED;
                    573: #pragma pack()
                    574: ASSERT_SIZEOF_STRUCT(ata_sct_feature_control_command, 512);
                    575: 
                    576: // SCT Data Table command (send with SMART_WRITE_LOG page 0xe0)
                    577: // Table 73 of T13/1699-D Revision 3f 
                    578: #pragma pack(1)
                    579: struct ata_sct_data_table_command
                    580: {
                    581:   unsigned short action_code;       // 5 = Data Table
                    582:   unsigned short function_code;     // 1 = Read Table
                    583:   unsigned short table_id;          // 2 = Temperature History
                    584:   unsigned short words003_255[253]; // reserved
                    585: } ATTR_PACKED;
                    586: #pragma pack()
                    587: ASSERT_SIZEOF_STRUCT(ata_sct_data_table_command, 512);
                    588: 
                    589: // SCT Temperature History Table (read with SMART_READ_LOG page 0xe1)
                    590: // Table 75 of T13/1699-D Revision 3f 
                    591: #pragma pack(1)
                    592: struct ata_sct_temperature_history_table
                    593: {
                    594:   unsigned short format_version;    // 0-1: Data table format version number (2)
                    595:   unsigned short sampling_period;   // 2-3: Temperature sampling period in minutes
                    596:   unsigned short interval;          // 4-5: Timer interval between history entries
                    597:   signed char max_op_limit;         // 6: Maximum recommended continuous operating temperature
                    598:   signed char over_limit;           // 7: Maximum temperature limit
                    599:   signed char min_op_limit;         // 8: Minimum recommended continuous operating limit
                    600:   signed char under_limit;          // 9: Minimum temperature limit
                    601:   unsigned char bytes010_029[20];   // 10-29: reserved
                    602:   unsigned short cb_size;           // 30-31: Number of history entries (range 128-478)
                    603:   unsigned short cb_index;          // 32-33: Index of last updated entry (zero-based)
                    604:   signed char cb[478];              // 34-(34+cb_size-1): Circular buffer of temperature values
                    605: } ATTR_PACKED;
                    606: #pragma pack()
                    607: ASSERT_SIZEOF_STRUCT(ata_sct_temperature_history_table, 512);
                    608: 
                    609: // Possible values for span_args.mode
                    610: enum {
                    611:   SEL_RANGE, // MIN-MAX
                    612:   SEL_REDO,  // redo this
                    613:   SEL_NEXT,  // do next range
                    614:   SEL_CONT   // redo or next depending of last test status
                    615: };
                    616: 
                    617: // Arguments for selective self-test
                    618: struct ata_selective_selftest_args
                    619: {
                    620:   // Arguments for each span
                    621:   struct span_args
                    622:   {
                    623:     uint64_t start;   // First block
                    624:     uint64_t end;     // Last block
                    625:     int mode;         // SEL_*, see above
                    626: 
                    627:     span_args()
                    628:       : start(0), end(0), mode(SEL_RANGE) { }
                    629:   };
                    630: 
                    631:   span_args span[5];  // Range and mode for 5 spans
                    632:   int num_spans;      // Number of spans
                    633:   int pending_time;   // One plus time in minutes to wait after powerup before restarting
                    634:                       // interrupted offline scan after selective self-test.
                    635:   int scan_after_select; // Run offline scan after selective self-test:
                    636:                       // 0: don't change,
                    637:                       // 1: turn off scan after selective self-test,
                    638:                       // 2: turn on scan after selective self-test.
                    639: 
                    640:   ata_selective_selftest_args()
                    641:     : num_spans(0), pending_time(0), scan_after_select(0) { }
                    642: };
                    643: 
                    644: // Priority for vendor attribute defs
                    645: enum ata_vendor_def_prior
                    646: {
                    647:   PRIOR_DEFAULT,
                    648:   PRIOR_DATABASE,
                    649:   PRIOR_USER
                    650: };
                    651: 
                    652: // Raw attribute value print formats
                    653: enum ata_attr_raw_format
                    654: {
                    655:   RAWFMT_DEFAULT,
                    656:   RAWFMT_RAW8,
                    657:   RAWFMT_RAW16,
                    658:   RAWFMT_RAW48,
                    659:   RAWFMT_HEX48,
                    660:   RAWFMT_RAW64,
                    661:   RAWFMT_HEX64,
                    662:   RAWFMT_RAW16_OPT_RAW16,
                    663:   RAWFMT_RAW16_OPT_AVG16,
                    664:   RAWFMT_RAW24_DIV_RAW24,
                    665:   RAWFMT_RAW24_DIV_RAW32,
                    666:   RAWFMT_SEC2HOUR,
                    667:   RAWFMT_MIN2HOUR,
                    668:   RAWFMT_HALFMIN2HOUR,
                    669:   RAWFMT_MSEC24_HOUR32,
                    670:   RAWFMT_TEMPMINMAX,
                    671:   RAWFMT_TEMP10X,
                    672: };
                    673: 
                    674: // Attribute flags
                    675: enum {
                    676:   ATTRFLAG_INCREASING = 0x01,   // Value not reset (for reallocated/pending counts)
                    677:   ATTRFLAG_NO_NORMVAL = 0x02,   // Normalized value not valid
                    678:   ATTRFLAG_NO_WORSTVAL = 0x04   // Worst value not valid
                    679: };
                    680: 
                    681: // Vendor attribute display defs for all attribute ids
                    682: class ata_vendor_attr_defs
                    683: {
                    684: public:
                    685:   struct entry
                    686:   {
                    687:     std::string name; // Attribute name, empty for default
                    688:     ata_attr_raw_format raw_format; // Raw value print format
                    689:     ata_vendor_def_prior priority; // Setting priority
                    690:     unsigned flags; // ATTRFLAG_*
                    691:     char byteorder[8+1]; // String [012345rvwz] to define byte order
                    692: 
                    693:     entry()
                    694:       : raw_format(RAWFMT_DEFAULT),
                    695:         priority(PRIOR_DEFAULT),
                    696:         flags(0)
                    697:       { byteorder[0] = 0; }
                    698:   };
                    699: 
                    700:   entry & operator[](unsigned char id)
                    701:     { return m_defs[id]; }
                    702: 
                    703:   const entry & operator[](unsigned char id) const
                    704:     { return m_defs[id]; }
                    705: 
                    706: private:
                    707:   entry m_defs[256];
                    708: };
                    709: 
                    710: 
                    711: // Print ATA debug messages?
                    712: extern unsigned char ata_debugmode;
                    713: 
                    714: // Suppress serial number?
                    715: extern bool dont_print_serial_number;
                    716: 
                    717: // Get information from drive
                    718: int ata_read_identity(ata_device * device, ata_identify_device * buf, bool fix_swapped_id);
                    719: int ataCheckPowerMode(ata_device * device);
                    720: 
                    721: /* Read S.M.A.R.T information from drive */
                    722: int ataReadSmartValues(ata_device * device,struct ata_smart_values *);
                    723: int ataReadSmartThresholds(ata_device * device, struct ata_smart_thresholds_pvt *);
                    724: int ataReadErrorLog (ata_device * device, ata_smart_errorlog *data,
                    725:                      unsigned char fix_firmwarebug);
                    726: int ataReadSelfTestLog(ata_device * device, ata_smart_selftestlog * data,
                    727:                        unsigned char fix_firmwarebug);
                    728: int ataReadSelectiveSelfTestLog(ata_device * device, struct ata_selective_self_test_log *data);
                    729: int ataSetSmartThresholds(ata_device * device, struct ata_smart_thresholds_pvt *);
                    730: int ataReadLogDirectory(ata_device * device, ata_smart_log_directory *, bool gpl);
                    731: 
                    732: // Read GP Log page(s)
                    733: bool ataReadLogExt(ata_device * device, unsigned char logaddr,
                    734:                    unsigned char features, unsigned page,
                    735:                    void * data, unsigned nsectors);
                    736: // Read SMART Log page(s)
                    737: bool ataReadSmartLog(ata_device * device, unsigned char logaddr,
                    738:                      void * data, unsigned nsectors);
                    739: // Read SMART Extended Comprehensive Error Log
                    740: bool ataReadExtErrorLog(ata_device * device, ata_smart_exterrlog * log,
                    741:                         unsigned nsectors);
                    742: // Read SMART Extended Self-test Log
                    743: bool ataReadExtSelfTestLog(ata_device * device, ata_smart_extselftestlog * log,
                    744:                            unsigned nsectors);
                    745: 
                    746: // Read SCT information
                    747: int ataReadSCTStatus(ata_device * device, ata_sct_status_response * sts);
                    748: int ataReadSCTTempHist(ata_device * device, ata_sct_temperature_history_table * tmh,
                    749:                        ata_sct_status_response * sts);
                    750: // Set SCT temperature logging interval
                    751: int ataSetSCTTempInterval(ata_device * device, unsigned interval, bool persistent);
                    752: 
                    753: // Get/Set SCT Error Recovery Control
                    754: int ataGetSCTErrorRecoveryControltime(ata_device * device, unsigned type, unsigned short & time_limit);
                    755: int ataSetSCTErrorRecoveryControltime(ata_device * device, unsigned type, unsigned short time_limit);
                    756: 
                    757: 
                    758: /* Enable/Disable SMART on device */
                    759: int ataEnableSmart (ata_device * device);
                    760: int ataDisableSmart (ata_device * device);
                    761: int ataEnableAutoSave(ata_device * device);
                    762: int ataDisableAutoSave(ata_device * device);
                    763: 
                    764: /* Automatic Offline Testing */
                    765: int ataEnableAutoOffline (ata_device * device);
                    766: int ataDisableAutoOffline (ata_device * device);
                    767: 
                    768: /* S.M.A.R.T. test commands */
                    769: int ataSmartOfflineTest (ata_device * device);
                    770: int ataSmartExtendSelfTest (ata_device * device);
                    771: int ataSmartShortSelfTest (ata_device * device);
                    772: int ataSmartShortCapSelfTest (ata_device * device);
                    773: int ataSmartExtendCapSelfTest (ata_device * device);
                    774: int ataSmartSelfTestAbort (ata_device * device);
                    775: int ataWriteSelectiveSelfTestLog(ata_device * device, ata_selective_selftest_args & args,
                    776:                                  const ata_smart_values * sv, uint64_t num_sectors,
                    777:                                  const ata_selective_selftest_args * prev_spans = 0);
                    778: 
                    779: // Returns the latest compatibility of ATA/ATAPI Version the device
                    780: // supports. Returns -1 if Version command is not supported
                    781: int ataVersionInfo(const char ** description, const ata_identify_device * drive, unsigned short * minor);
                    782: 
                    783: // Get World Wide Name (WWN) fields.
                    784: // Return NAA field or -1 if WWN is unsupported.
                    785: int ata_get_wwn(const ata_identify_device * id, unsigned & oui, uint64_t & unique_id);
                    786: 
                    787: // If SMART supported, this is guaranteed to return 1 if SMART is enabled, else 0.
                    788: int ataDoesSmartWork(ata_device * device);
                    789: 
                    790: // returns 1 if SMART supported, 0 if not supported or can't tell
                    791: int ataSmartSupport(const ata_identify_device * drive);
                    792: 
                    793: // Return values:
                    794: //  1: SMART enabled
                    795: //  0: SMART disabled
                    796: // -1: can't tell if SMART is enabled -- try issuing ataDoesSmartWork command to see
                    797: int ataIsSmartEnabled(const ata_identify_device * drive);
                    798: 
                    799: int ataSmartStatus2(ata_device * device);
                    800: 
                    801: int isSmartErrorLogCapable(const ata_smart_values * data, const ata_identify_device * identity);
                    802: 
                    803: int isSmartTestLogCapable(const ata_smart_values * data, const ata_identify_device * identity);
                    804: 
                    805: int isGeneralPurposeLoggingCapable(const ata_identify_device * identity);
                    806: 
                    807: int isSupportExecuteOfflineImmediate(const ata_smart_values * data);
                    808: 
                    809: int isSupportAutomaticTimer(const ata_smart_values * data);
                    810: 
                    811: int isSupportOfflineAbort(const ata_smart_values * data);
                    812: 
                    813: int isSupportOfflineSurfaceScan(const ata_smart_values * data);
                    814: 
                    815: int isSupportSelfTest(const ata_smart_values * data);
                    816: 
                    817: int isSupportConveyanceSelfTest(const ata_smart_values * data);
                    818: 
                    819: int isSupportSelectiveSelfTest(const ata_smart_values * data);
                    820: 
                    821: inline bool isSCTCapable(const ata_identify_device *drive)
                    822:   { return !!(drive->words088_255[206-88] & 0x01); } // 0x01 = SCT support
                    823: 
                    824: inline bool isSCTErrorRecoveryControlCapable(const ata_identify_device *drive)
                    825:   { return ((drive->words088_255[206-88] & 0x09) == 0x09); } // 0x08 = SCT Error Recovery Control support
                    826: 
                    827: inline bool isSCTFeatureControlCapable(const ata_identify_device *drive)
                    828:   { return ((drive->words088_255[206-88] & 0x11) == 0x11); } // 0x10 = SCT Feature Control support
                    829: 
                    830: inline bool isSCTDataTableCapable(const ata_identify_device *drive)
                    831:   { return ((drive->words088_255[206-88] & 0x21) == 0x21); } // 0x20 = SCT Data Table support
                    832: 
                    833: int ataSmartTest(ata_device * device, int testtype, const ata_selective_selftest_args & args,
                    834:                  const ata_smart_values * sv, uint64_t num_sectors);
                    835: 
                    836: int TestTime(const ata_smart_values * data, int testtype);
                    837: 
                    838: // Attribute state
                    839: enum ata_attr_state
                    840: {
                    841:   ATTRSTATE_NON_EXISTING,   // No such Attribute
                    842:   ATTRSTATE_NO_NORMVAL,     // Normalized value not valid
                    843:   ATTRSTATE_NO_THRESHOLD,   // Unknown or no threshold
                    844:   ATTRSTATE_OK,             // Never failed
                    845:   ATTRSTATE_FAILED_PAST,    // Failed in the past
                    846:   ATTRSTATE_FAILED_NOW      // Failed now
                    847: };
                    848: 
                    849: // Get attribute state
                    850: ata_attr_state ata_get_attr_state(const ata_smart_attribute & attr,
                    851:                                   int attridx,
                    852:                                   const ata_smart_threshold_entry * thresholds,
                    853:                                   const ata_vendor_attr_defs & defs,
                    854:                                   unsigned char * threshval = 0);
                    855: 
                    856: // Get attribute raw value.
                    857: uint64_t ata_get_attr_raw_value(const ata_smart_attribute & attr,
                    858:                                 const ata_vendor_attr_defs & defs);
                    859: 
                    860: // Format attribute raw value.
                    861: std::string ata_format_attr_raw_value(const ata_smart_attribute & attr,
                    862:                                       const ata_vendor_attr_defs & defs);
                    863: 
                    864: // Get attribute name
                    865: std::string ata_get_smart_attr_name(unsigned char id,
                    866:                                     const ata_vendor_attr_defs & defs);
                    867: 
                    868: // External handler function, for when a checksum is not correct.  Can
                    869: // simply return if no action is desired, or can print error messages
                    870: // as needed, or exit.  Is passed a string with the name of the Data
                    871: // Structure with the incorrect checksum.
                    872: void checksumwarning(const char *string);
                    873: 
                    874: // Find attribute index for attribute id, -1 if not found.
                    875: int ata_find_attr_index(unsigned char id, const ata_smart_values & smartval);
                    876: 
                    877: // Return Temperature Attribute raw value selected according to possible
                    878: // non-default interpretations. If the Attribute does not exist, return 0
                    879: unsigned char ata_return_temperature_value(const ata_smart_values * data, const ata_vendor_attr_defs & defs);
                    880: 
                    881: 
                    882: // This are the meanings of the Self-test failure checkpoint byte.
                    883: // This is in the self-test log at offset 4 bytes into the self-test
                    884: // descriptor and in the SMART READ DATA structure at byte offset
                    885: // 371. These codes are not well documented.  The meanings returned by
                    886: // this routine are used (at least) by Maxtor and IBM. Returns NULL if
                    887: // not recognized.
                    888: const char *SelfTestFailureCodeName(unsigned char which);
                    889: 
                    890: 
                    891: #define MAX_ATTRIBUTE_NUM 256
                    892: 
                    893: // Parse vendor attribute display def (-v option).
                    894: // Return false on error.
                    895: bool parse_attribute_def(const char * opt, ata_vendor_attr_defs & defs,
                    896:                          ata_vendor_def_prior priority);
                    897: 
                    898: // Get ID and increase flag of current pending or offline
                    899: // uncorrectable attribute.
                    900: unsigned char get_unc_attr_id(bool offline, const ata_vendor_attr_defs & defs,
                    901:                               bool & increase);
                    902: 
                    903: // Return a multiline string containing a list of valid arguments for
                    904: // parse_attribute_def().
                    905: std::string create_vendor_attribute_arg_list();
                    906: 
                    907: 
                    908: // These are two of the functions that are defined in os_*.c and need
                    909: // to be ported to get smartmontools onto another OS.
                    910: // Moved to C++ interface
                    911: //int ata_command_interface(int device, smart_command_set command, int select, char *data);
                    912: //int escalade_command_interface(int fd, int escalade_port, int escalade_type, smart_command_set command, int select, char *data);
                    913: //int marvell_command_interface(int device, smart_command_set command, int select, char *data);
                    914: //int highpoint_command_interface(int device, smart_command_set command, int select, char *data);
                    915: //int areca_command_interface(int fd, int disknum, smart_command_set command, int select, char *data);
                    916: 
                    917: 
                    918: // Optional functions of os_*.c
                    919: #ifdef HAVE_ATA_IDENTIFY_IS_CACHED
                    920: // Return true if OS caches the ATA identify sector
                    921: //int ata_identify_is_cached(int fd);
                    922: #endif
                    923: 
                    924: // This function is exported to give low-level capability
                    925: int smartcommandhandler(ata_device * device, smart_command_set command, int select, char *data);
                    926: 
                    927: // Print one self-test log entry.
                    928: // Returns:
                    929: // -1: failed self-test
                    930: //  1: extended self-test completed without error
                    931: //  0: otherwise
                    932: int ataPrintSmartSelfTestEntry(unsigned testnum, unsigned char test_type,
                    933:                                unsigned char test_status,
                    934:                                unsigned short timestamp,
                    935:                                uint64_t failing_lba,
                    936:                                bool print_error_only, bool & print_header);
                    937: 
                    938: // Print Smart self-test log, used by smartctl and smartd.
                    939: int ataPrintSmartSelfTestlog(const ata_smart_selftestlog * data, bool allentries,
                    940:                              unsigned char fix_firmwarebug);
                    941: 
                    942: // Get capacity and sector sizes from IDENTIFY data
                    943: struct ata_size_info
                    944: {
                    945:   uint64_t sectors;
                    946:   uint64_t capacity;
                    947:   unsigned log_sector_size;
                    948:   unsigned phy_sector_size;
                    949:   unsigned log_sector_offset;
                    950: };
                    951: 
                    952: void ata_get_size_info(const ata_identify_device * id, ata_size_info & sizes);
                    953: 
                    954: // Convenience function for formatting strings from ata_identify_device.
                    955: void ata_format_id_string(char * out, const unsigned char * in, int n);
                    956: 
                    957: // Utility routines.
                    958: unsigned char checksum(const void * data);
                    959: 
                    960: void swap2(char *location);
                    961: void swap4(char *location);
                    962: void swap8(char *location);
                    963: // Typesafe variants using overloading
                    964: inline void swapx(unsigned short * p)
                    965:   { swap2((char*)p); }
                    966: inline void swapx(unsigned int * p)
                    967:   { swap4((char*)p); }
                    968: inline void swapx(uint64_t * p)
                    969:   { swap8((char*)p); }
                    970: 
                    971: // Return pseudo-device to parse "smartctl -r ataioctl,2 ..." output
                    972: // and simulate an ATA device with same behaviour
                    973: ata_device * get_parsed_ata_device(smart_interface * intf, const char * dev_name);
                    974: 
                    975: #endif /* ATACMDS_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>