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

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

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