lkml.org 
[lkml]   [1998]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: SMART-ide how???
Gadi's utility is attached.
--
mlord@pobox.com#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <linux/hdreg.h>
#include <linux/types.h>

#define NR_ATTRIBUTES 30

typedef struct threshold_s {
__u8 id;
__u8 threshold;
__u8 reserved[10];
} __attribute__ ((packed)) threshold_t;
typedef struct thresholds_s {
__u16 revision;
threshold_t thresholds[NR_ATTRIBUTES];
__u8 reserved[18];
__u8 vendor[131];
__u8 checksum;
} __attribute__ ((packed)) thresholds_t;
typedef struct value_s {
__u8 id;
__u16 status;
__u8 value;
__u8 vendor[8];
} __attribute__ ((packed)) value_t;
typedef struct values_s {
__u16 revision;
value_t values[NR_ATTRIBUTES];
__u8 offline_status;
__u8 vendor1;
__u16 offline_timeout;
__u8 vendor2;
__u8 offline_capability;
__u16 smart_capability;
__u8 reserved[16];
__u8 vendor[125];
__u8 checksum;
} __attribute__ ((packed)) values_t;
#define NR_OFFLINE_TEXTS 5
struct {
__u8 value;
char *text;
} offline_status_text[NR_OFFLINE_TEXTS] = {
{ 0x00, "NeverStarted" },
{ 0x02, "Completed" },
{ 0x04, "Suspended" },
{ 0x05, "Aborted" },
{ 0x06, "Failed" }
};
int fd;
values_t values;
thresholds_t thresholds;

static char *get_offline_text(int status)
{
int i;
for (i = 0; i < NR_OFFLINE_TEXTS; i++)
if (offline_status_text[i].value == status)
return offline_status_text[i].text;
return "unknown";
}
static void smart_read_values(void)
{
__u8 args[4 + 512] = {WIN_SMART, 0, SMART_READ_VALUES, 1, };
if (ioctl(fd, HDIO_DRIVE_CMD, &args)) {
perror(" couldn't read values");
return;
}
memcpy(&values, args + 4, 512);
}
static void print_value(value_t *p, threshold_t *t)
{
if (!p->id || !t->id || p->id != t->id)
return;
printf("Id=%3d, Status=%2d {%s , %s}, Value=%3d, Threshold=%3d, %s\n", p->id, p->status,
p->status & 1 ? "PreFailture" : "Advisory ",
p->status & 2 ? "OnLine " : "OffLine",
p->value, t->threshold,
p->value > t->threshold ? "Passed" : "Failed");
}
static void print_values(values_t *p, thresholds_t *t)
{
value_t *value = p->values;
threshold_t *threshold = t->thresholds;
int i;
printf("\n");
for (i = 0; i < NR_ATTRIBUTES; i++)
print_value(value++, threshold++);
printf("OffLineStatus=%d {%s}, AutoOffLine=%s, OffLineTimeout=%d minutes\n",
p->offline_status, get_offline_text(p->offline_status & 0x7f),
p->offline_status & 0x80 ? "Yes" : "No",
p->offline_timeout / 60);
printf("OffLineCapability=%d {%s %s %s}\n", p->offline_capability,
p->offline_capability & 1 ? "Immediate" : "",
p->offline_capability & 2 ? "Auto" : "",
p->offline_capability & 4 ? "AbortOnCmd" : "SuspendOnCmd");
printf("SmartRevision=%d, CheckSum=%d, SmartCapability=%d {%s %s}\n",
p->revision, p->checksum, p->smart_capability,
p->smart_capability & 1 ? "SaveOnStandBy" : "",
p->smart_capability & 2 ? "AutoSave" : "");
printf("\n");
}
static void print_threshold(threshold_t *p)
{
if (!p->id)
return;
printf("Id=%3d, Threshold=%3d\n", p->id, p->threshold);
}
static void print_thresholds(thresholds_t *p)
{
threshold_t *threshold = p->thresholds;
int i;
printf("\n");
printf("SmartRevision=%d\n", p->revision);
for (i = 0; i < NR_ATTRIBUTES; i++)
print_threshold(threshold++);
printf("CheckSum=%d\n", p->checksum);
printf("\n");
}
static void smart_read_thresholds(void)
{
__u8 args[4 + 512] = {WIN_SMART, 0, SMART_READ_THRESHOLDS, 1, };
if (ioctl(fd, HDIO_DRIVE_CMD, &args)) {
perror(" SMART_READ_THRESHOLDS failed");
return;
}
memcpy(&thresholds, args + 4, 512);
}
static void smart_disable(void)
{
__u8 args[4] = {WIN_SMART, 0, SMART_DISABLE, 0};
if (ioctl(fd, HDIO_DRIVE_CMD, &args))
perror(" SMART_DISABLE failed");
}
static void smart_enable(void)
{
__u8 args[4] = {WIN_SMART, 0, SMART_ENABLE, 0};
if (ioctl(fd, HDIO_DRIVE_CMD, &args))
perror(" SMART_ENABLE failed");
}
static void smart_offline_immediate(void)
{
__u8 args[4] = {WIN_SMART, 0, SMART_IMMEDIATE_OFFLINE, 0};
if (ioctl(fd, HDIO_DRIVE_CMD, &args))
perror(" SMART_IMMEDIATE_OFFLINE falied");
}
int main(int argc, char *argv[])
{
if (argc != 2) {
printf("usage: ide-smart device\n");
return 0;
}
if ((fd = open(argv[1], O_RDONLY)) == -1) {
perror("couldn't open device");
return 0;
}
smart_enable();
#if 1
smart_offline_immediate();
#endif
smart_read_values();
smart_read_thresholds();
print_values(&values, &thresholds);
close(fd);
return 0;
}
\
 
 \ /
  Last update: 2005-03-22 13:43    [from the cache]
©2003-2011 Jasper Spaans