From d20185ac96c4b50ed4de7098a101a31f2b140b82 Mon Sep 17 00:00:00 2001 From: Cástor Muñoz Date: Tue, 9 Dec 2014 19:38:47 +0100 Subject: iPod Classic: reads HDD S.M.A.R.T. data Adds ata_read_smart() function to storage ATA driver, current SMART data can be displayed and optionally written to hard disk using System->Debug menu. Change-Id: Ie8817bb311d5d956df2f0fbfaf554e2d53e89a93 --- firmware/export/ata.h | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) (limited to 'firmware/export/ata.h') diff --git a/firmware/export/ata.h b/firmware/export/ata.h index 0bcb144e63..6f0d0b699f 100644 --- a/firmware/export/ata.h +++ b/firmware/export/ata.h @@ -25,6 +25,107 @@ #include "config.h" /* for HAVE_MULTIVOLUME or not */ #include "mv.h" /* for IF_MV() and friends */ +#ifdef HAVE_ATA_SMART +/* S.M.A.R.T. headers from smartmontools-5.42 */ +#define NUMBER_ATA_SMART_ATTRIBUTES 30 + +struct ata_smart_attribute { + unsigned char id; + /* meaning of flag bits: see MACROS just below */ + /* WARNING: MISALIGNED! */ + unsigned short flags; + unsigned char current; + unsigned char worst; + unsigned char raw[6]; + unsigned char reserv; +} __attribute__((packed)); + +/* MACROS to interpret the flags bits in the previous structure. */ +/* These have not been implemented using bitflags and a union, to make */ +/* it portable across bit/little endian and different platforms. */ + +/* 0: Prefailure bit */ + +/* From SFF 8035i Revision 2 page 19: Bit 0 (pre-failure/advisory bit) */ +/* - If the value of this bit equals zero, an attribute value less */ +/* than or equal to its corresponding attribute threshold indicates an */ +/* advisory condition where the usage or age of the device has */ +/* exceeded its intended design life period. If the value of this bit */ +/* equals one, an attribute value less than or equal to its */ +/* corresponding attribute threshold indicates a prefailure condition */ +/* where imminent loss of data is being predicted. */ +#define ATTRIBUTE_FLAGS_PREFAILURE(x) (x & 0x01) + +/* 1: Online bit */ + +/* From SFF 8035i Revision 2 page 19: Bit 1 (on-line data collection */ +/* bit) - If the value of this bit equals zero, then the attribute */ +/* value is updated only during off-line data collection */ +/* activities. If the value of this bit equals one, then the attribute */ +/* value is updated during normal operation of the device or during */ +/* both normal operation and off-line testing. */ +#define ATTRIBUTE_FLAGS_ONLINE(x) (x & 0x02) + +/* The following are (probably) IBM's, Maxtors and Quantum's definitions for the */ +/* vendor-specific bits: */ +/* 2: Performance type bit */ +#define ATTRIBUTE_FLAGS_PERFORMANCE(x) (x & 0x04) + +/* 3: Errorrate type bit */ +#define ATTRIBUTE_FLAGS_ERRORRATE(x) (x & 0x08) + +/* 4: Eventcount bit */ +#define ATTRIBUTE_FLAGS_EVENTCOUNT(x) (x & 0x10) + +/* 5: Selfpereserving bit */ +#define ATTRIBUTE_FLAGS_SELFPRESERVING(x) (x & 0x20) + +/* 6-15: Reserved for future use */ +#define ATTRIBUTE_FLAGS_OTHER(x) ((x) & 0xffc0) + +struct ata_smart_values +{ + unsigned short int revnumber; + struct ata_smart_attribute vendor_attributes [NUMBER_ATA_SMART_ATTRIBUTES]; + unsigned char offline_data_collection_status; + unsigned char self_test_exec_status; + unsigned short int total_time_to_complete_off_line; + unsigned char vendor_specific_366; + unsigned char offline_data_collection_capability; + unsigned short int smart_capability; + unsigned char errorlog_capability; + unsigned char vendor_specific_371; + unsigned char short_test_completion_time; + unsigned char extend_test_completion_time; + unsigned char conveyance_test_completion_time; + unsigned char reserved_375_385[11]; + unsigned char vendor_specific_386_510[125]; + unsigned char chksum; +} __attribute__((packed)); + +/* Raw attribute value print formats */ +enum ata_attr_raw_format +{ + RAWFMT_DEFAULT, + RAWFMT_RAW8, + RAWFMT_RAW16, + RAWFMT_RAW48, + RAWFMT_HEX48, + RAWFMT_RAW64, + RAWFMT_HEX64, + RAWFMT_RAW16_OPT_RAW16, + RAWFMT_RAW16_OPT_AVG16, + RAWFMT_RAW24_DIV_RAW24, + RAWFMT_RAW24_DIV_RAW32, + RAWFMT_SEC2HOUR, + RAWFMT_MIN2HOUR, + RAWFMT_HALFMIN2HOUR, + RAWFMT_MSEC24_HOUR32, + RAWFMT_TEMPMINMAX, + RAWFMT_TEMP10X, +}; +#endif /* HAVE_ATA_SMART */ + struct storage_info; void ata_enable(bool on); @@ -69,4 +170,9 @@ int ata_spinup_time(void); /* ticks */ int ata_get_dma_mode(void); #endif /* HAVE_ATA_DMA */ +#ifdef HAVE_ATA_SMART +/* Returns current S.M.A.R.T. data */ +void* ata_read_smart(void); +#endif + #endif /* __ATA_H__ */ -- cgit v1.2.3