summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWojciech Piekutowski <wojciech@piekutowski.net>2011-04-12 23:19:51 +0200
committerWojciech Piekutowski <wojciech@piekutowski.net>2011-04-12 23:20:32 +0200
commitdfed92851e32b687c586793669bbf82a9dd21675 (patch)
treebcf73fd0d4965657f26bcea572ab433a4d9a59e1
parentae5cf2a7a9e80b8c80f9aaee74cfb905032e8a2b (diff)
Support Timed Workload Media Wear, Timed Workload Host Reads, Workload Timer
-rw-r--r--atasmart.c88
-rw-r--r--atasmart.h5
2 files changed, 73 insertions, 20 deletions
diff --git a/atasmart.c b/atasmart.c
index c8aaf9e..cd074ee 100644
--- a/atasmart.c
+++ b/atasmart.c
@@ -1214,6 +1214,11 @@ static void make_pretty(SkSmartAttributeParsedData *a) {
else if (!strcmp(a->name, "total-lbas-written") ||
!strcmp(a->name, "total-lbas-read"))
a->pretty_value = fourtyeight * 65536LLU * 512LLU / 1000000LLU;
+ else if (!strcmp(a->name, "timed-workload-media-wear") ||
+ !strcmp(a->name, "timed-workload-host-reads"))
+ a->pretty_value = (double)fourtyeight / 1024LLU;
+ else if (!strcmp(a->name, "workload-timer"))
+ a->pretty_value = fourtyeight * 60 * 1000;
else
a->pretty_value = fourtyeight;
}
@@ -1349,24 +1354,27 @@ static const SkSmartAttributeInfo const attribute_info[256] = {
/* %STRINGPOOLSTOP% */
typedef enum SkSmartQuirk {
- SK_SMART_QUIRK_9_POWERONMINUTES = 0x00001,
- SK_SMART_QUIRK_9_POWERONSECONDS = 0x00002,
- SK_SMART_QUIRK_9_POWERONHALFMINUTES = 0x00004,
- SK_SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT = 0x00008,
- SK_SMART_QUIRK_193_LOADUNLOAD = 0x00010,
- SK_SMART_QUIRK_194_10XCELSIUS = 0x00020,
- SK_SMART_QUIRK_194_UNKNOWN = 0x00040,
- SK_SMART_QUIRK_200_WRITEERRORCOUNT = 0x00080,
- SK_SMART_QUIRK_201_DETECTEDTACOUNT = 0x00100,
- SK_SMART_QUIRK_5_UNKNOWN = 0x00200,
- SK_SMART_QUIRK_9_UNKNOWN = 0x00400,
- SK_SMART_QUIRK_197_UNKNOWN = 0x00800,
- SK_SMART_QUIRK_198_UNKNOWN = 0x01000,
- SK_SMART_QUIRK_190_UNKNOWN = 0x02000,
- SK_SMART_QUIRK_232_AVAILABLERESERVEDSPACE = 0x04000,
- SK_SMART_QUIRK_233_MEDIAWEAROUTINDICATOR = 0x08000,
- SK_SMART_QUIRK_225_TOTALLBASWRITTEN = 0x10000,
- SK_SMART_QUIRK_4_UNUSED = 0x20000
+ SK_SMART_QUIRK_9_POWERONMINUTES = 0x000001,
+ SK_SMART_QUIRK_9_POWERONSECONDS = 0x000002,
+ SK_SMART_QUIRK_9_POWERONHALFMINUTES = 0x000004,
+ SK_SMART_QUIRK_192_EMERGENCYRETRACTCYCLECT = 0x000008,
+ SK_SMART_QUIRK_193_LOADUNLOAD = 0x000010,
+ SK_SMART_QUIRK_194_10XCELSIUS = 0x000020,
+ SK_SMART_QUIRK_194_UNKNOWN = 0x000040,
+ SK_SMART_QUIRK_200_WRITEERRORCOUNT = 0x000080,
+ SK_SMART_QUIRK_201_DETECTEDTACOUNT = 0x000100,
+ SK_SMART_QUIRK_5_UNKNOWN = 0x000200,
+ SK_SMART_QUIRK_9_UNKNOWN = 0x000400,
+ SK_SMART_QUIRK_197_UNKNOWN = 0x000800,
+ SK_SMART_QUIRK_198_UNKNOWN = 0x001000,
+ SK_SMART_QUIRK_190_UNKNOWN = 0x002000,
+ SK_SMART_QUIRK_232_AVAILABLERESERVEDSPACE = 0x004000,
+ SK_SMART_QUIRK_233_MEDIAWEAROUTINDICATOR = 0x008000,
+ SK_SMART_QUIRK_225_TOTALLBASWRITTEN = 0x010000,
+ SK_SMART_QUIRK_4_UNUSED = 0x020000,
+ SK_SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR = 0x040000,
+ SK_SMART_QUIRK_227_TIMEWORKLOADHOSTREADS = 0x080000,
+ SK_SMART_QUIRK_228_WORKLOADTIMER = 0x100000,
} SkSmartQuirk;
/* %STRINGPOOLSTART% */
@@ -1544,6 +1552,9 @@ static const SkSmartQuirkDatabase quirk_database[] = { {
NULL,
SK_SMART_QUIRK_4_UNUSED|
SK_SMART_QUIRK_225_TOTALLBASWRITTEN|
+ SK_SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR|
+ SK_SMART_QUIRK_227_TIMEWORKLOADHOSTREADS|
+ SK_SMART_QUIRK_228_WORKLOADTIMER|
SK_SMART_QUIRK_232_AVAILABLERESERVEDSPACE|
SK_SMART_QUIRK_233_MEDIAWEAROUTINDICATOR
}, {
@@ -1750,6 +1761,42 @@ static const SkSmartAttributeInfo *lookup_attribute(SkDisk *d, uint8_t id) {
break;
+ case 226:
+ /* %STRINGPOOLSTART% */
+ if (quirk & SK_SMART_QUIRK_226_TIMEWORKLOADMEDIAWEAR) {
+ static const SkSmartAttributeInfo a = {
+ "timed-workload-media-wear", SK_SMART_ATTRIBUTE_UNIT_SMALL_PERCENT, NULL
+ };
+ return &a;
+ }
+ /* %STRINGPOOLSTOP% */
+
+ break;
+
+ case 227:
+ /* %STRINGPOOLSTART% */
+ if (quirk & SK_SMART_QUIRK_227_TIMEWORKLOADHOSTREADS) {
+ static const SkSmartAttributeInfo a = {
+ "timed-workload-host-reads", SK_SMART_ATTRIBUTE_UNIT_SMALL_PERCENT, NULL
+ };
+ return &a;
+ }
+ /* %STRINGPOOLSTOP% */
+
+ break;
+
+ case 228:
+ /* %STRINGPOOLSTART% */
+ if (quirk & SK_SMART_QUIRK_228_WORKLOADTIMER) {
+ static const SkSmartAttributeInfo a = {
+ "workload-timer", SK_SMART_ATTRIBUTE_UNIT_MSECONDS, NULL
+ };
+ return &a;
+ }
+ /* %STRINGPOOLSTOP% */
+
+ break;
+
case 232:
/* %STRINGPOOLSTART% */
if (quirk & SK_SMART_QUIRK_232_AVAILABLERESERVEDSPACE) {
@@ -1964,6 +2011,7 @@ const char* sk_smart_attribute_unit_to_string(SkSmartAttributeUnit unit) {
[SK_SMART_ATTRIBUTE_UNIT_SECTORS] = "sectors",
[SK_SMART_ATTRIBUTE_UNIT_MKELVIN] = "mK",
[SK_SMART_ATTRIBUTE_UNIT_PERCENT] = "%",
+ [SK_SMART_ATTRIBUTE_UNIT_SMALL_PERCENT] = "%",
[SK_SMART_ATTRIBUTE_UNIT_MB] = "MB"
};
/* %STRINGPOOLSTOP% */
@@ -2305,6 +2353,10 @@ static char *print_value(char *s, size_t len, uint64_t pretty_value, SkSmartAttr
snprintf(s, len, "%llu%%", (unsigned long long) pretty_value);
break;
+ case SK_SMART_ATTRIBUTE_UNIT_SMALL_PERCENT:
+ snprintf(s, len, "%0.3f%%", (double) pretty_value);
+ break;
+
case SK_SMART_ATTRIBUTE_UNIT_MB:
if (pretty_value >= 1000000LLU)
snprintf(s, len, "%0.3f TB", (double) pretty_value / 1000000LLU);
diff --git a/atasmart.h b/atasmart.h
index 65d96e7..4aa0589 100644
--- a/atasmart.h
+++ b/atasmart.h
@@ -130,9 +130,10 @@ unsigned sk_smart_self_test_polling_minutes(const SkSmartParsedData *d, SkSmartS
typedef enum SkSmartAttributeUnit {
SK_SMART_ATTRIBUTE_UNIT_UNKNOWN,
SK_SMART_ATTRIBUTE_UNIT_NONE,
- SK_SMART_ATTRIBUTE_UNIT_MSECONDS, /* milliseconds */
+ SK_SMART_ATTRIBUTE_UNIT_MSECONDS, /* milliseconds */
SK_SMART_ATTRIBUTE_UNIT_SECTORS,
- SK_SMART_ATTRIBUTE_UNIT_MKELVIN, /* millikelvin */
+ SK_SMART_ATTRIBUTE_UNIT_MKELVIN, /* millikelvin */
+ SK_SMART_ATTRIBUTE_UNIT_SMALL_PERCENT, /* percentage with 3 decimal points */
SK_SMART_ATTRIBUTE_UNIT_PERCENT,
SK_SMART_ATTRIBUTE_UNIT_MB,
_SK_SMART_ATTRIBUTE_UNIT_MAX