]> git.proxmox.com Git - mirror_smartmontools-debian.git/blob - atacmds.cpp
Merge branch 'upstream'
[mirror_smartmontools-debian.git] / atacmds.cpp
1 /*
2 * atacmds.cpp
3 *
4 * Home page of code is: http://smartmontools.sourceforge.net
5 *
6 * Copyright (C) 2002-6 Bruce Allen <smartmontools-support@lists.sourceforge.net>
7 * Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
8 * Copyright (C) 2000 Andre Hedrick <andre@linux-ide.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 #include <stdio.h>
27 #include <string.h>
28 #include <errno.h>
29 #include <stdlib.h>
30 #include <ctype.h>
31
32 #include "config.h"
33 #include "int64.h"
34 #include "atacmds.h"
35 #include "scsiata.h"
36 #include "extern.h"
37 #include "utility.h"
38
39 const char *atacmds_c_cvsid="$Id: atacmds.cpp,v 1.176 2006/08/25 06:06:24 sxzzsf Exp $"
40 ATACMDS_H_CVSID CONFIG_H_CVSID EXTERN_H_CVSID INT64_H_CVSID SCSIATA_H_CVSID UTILITY_H_CVSID;
41
42 // to hold onto exit code for atexit routine
43 extern int exitstatus;
44
45 // for passing global control variables
46 extern smartmonctrl *con;
47
48 // These Drive Identity tables are taken from hdparm 5.2, and are also
49 // given in the ATA/ATAPI specs for the IDENTIFY DEVICE command. Note
50 // that SMART was first added into the ATA/ATAPI-3 Standard with
51 // Revision 3 of the document, July 25, 1995. Look at the "Document
52 // Status" revision commands at the beginning of
53 // http://www.t13.org/project/d2008r6.pdf to see this.
54 #define NOVAL_0 0x0000
55 #define NOVAL_1 0xffff
56 /* word 81: minor version number */
57 #define MINOR_MAX 0x22
58 const char *minor_str[] = { /* word 81 value: */
59 "Device does not report version", /* 0x0000 */
60 "ATA-1 X3T9.2 781D prior to revision 4", /* 0x0001 */
61 "ATA-1 published, ANSI X3.221-1994", /* 0x0002 */
62 "ATA-1 X3T9.2 781D revision 4", /* 0x0003 */
63 "ATA-2 published, ANSI X3.279-1996", /* 0x0004 */
64 "ATA-2 X3T10 948D prior to revision 2k", /* 0x0005 */
65 "ATA-3 X3T10 2008D revision 1", /* 0x0006 */ /* SMART NOT INCLUDED */
66 "ATA-2 X3T10 948D revision 2k", /* 0x0007 */
67 "ATA-3 X3T10 2008D revision 0", /* 0x0008 */
68 "ATA-2 X3T10 948D revision 3", /* 0x0009 */
69 "ATA-3 published, ANSI X3.298-199x", /* 0x000a */
70 "ATA-3 X3T10 2008D revision 6", /* 0x000b */ /* 1st VERSION WITH SMART */
71 "ATA-3 X3T13 2008D revision 7 and 7a", /* 0x000c */
72 "ATA/ATAPI-4 X3T13 1153D revision 6", /* 0x000d */
73 "ATA/ATAPI-4 T13 1153D revision 13", /* 0x000e */
74 "ATA/ATAPI-4 X3T13 1153D revision 7", /* 0x000f */
75 "ATA/ATAPI-4 T13 1153D revision 18", /* 0x0010 */
76 "ATA/ATAPI-4 T13 1153D revision 15", /* 0x0011 */
77 "ATA/ATAPI-4 published, ANSI NCITS 317-1998", /* 0x0012 */
78 "ATA/ATAPI-5 T13 1321D revision 3", /* 0x0013 */
79 "ATA/ATAPI-4 T13 1153D revision 14", /* 0x0014 */
80 "ATA/ATAPI-5 T13 1321D revision 1", /* 0x0015 */
81 "ATA/ATAPI-5 published, ANSI NCITS 340-2000", /* 0x0016 */
82 "ATA/ATAPI-4 T13 1153D revision 17", /* 0x0017 */
83 "ATA/ATAPI-6 T13 1410D revision 0", /* 0x0018 */
84 "ATA/ATAPI-6 T13 1410D revision 3a", /* 0x0019 */
85 "ATA/ATAPI-7 T13 1532D revision 1", /* 0x001a */
86 "ATA/ATAPI-6 T13 1410D revision 2", /* 0x001b */
87 "ATA/ATAPI-6 T13 1410D revision 1", /* 0x001c */
88 "ATA/ATAPI-7 published, ANSI INCITS 397-2005",/* 0x001d */
89 "ATA/ATAPI-7 T13 1532D revision 0", /* 0x001e */
90 "reserved", /* 0x001f */
91 "reserved", /* 0x0020 */
92 "ATA/ATAPI-7 T13 1532D revision 4a", /* 0x0021 */
93 "ATA/ATAPI-6 published, ANSI INCITS 361-2002" /* 0x0022 */
94 };
95
96 // NOTE ATA/ATAPI-4 REV 4 was the LAST revision where the device
97 // attribute structures were NOT completely vendor specific. So any
98 // disk that is ATA/ATAPI-4 or above can not be trusted to show the
99 // vendor values in sensible format.
100
101 // Negative values below are because it doesn't support SMART
102 const int actual_ver[] = {
103 /* word 81 value: */
104 0, /* 0x0000 WARNING: */
105 1, /* 0x0001 WARNING: */
106 1, /* 0x0002 WARNING: */
107 1, /* 0x0003 WARNING: */
108 2, /* 0x0004 WARNING: This array */
109 2, /* 0x0005 WARNING: corresponds */
110 -3, /*<== */ /* 0x0006 WARNING: *exactly* */
111 2, /* 0x0007 WARNING: to the ATA/ */
112 -3, /*<== */ /* 0x0008 WARNING: ATAPI version */
113 2, /* 0x0009 WARNING: listed in */
114 3, /* 0x000a WARNING: the */
115 3, /* 0x000b WARNING: minor_str */
116 3, /* 0x000c WARNING: array */
117 4, /* 0x000d WARNING: above. */
118 4, /* 0x000e WARNING: */
119 4, /* 0x000f WARNING: If you change */
120 4, /* 0x0010 WARNING: that one, */
121 4, /* 0x0011 WARNING: change this one */
122 4, /* 0x0012 WARNING: too!!! */
123 5, /* 0x0013 WARNING: */
124 4, /* 0x0014 WARNING: */
125 5, /* 0x0015 WARNING: */
126 5, /* 0x0016 WARNING: */
127 4, /* 0x0017 WARNING: */
128 6, /* 0x0018 WARNING: */
129 6, /* 0x0019 WARNING: */
130 7, /* 0x001a WARNING: */
131 6, /* 0x001b WARNING: */
132 6, /* 0x001c WARNING: */
133 7, /* 0x001d WARNING: */
134 7, /* 0x001e WARNING: */
135 0, /* 0x001f WARNING: */
136 0, /* 0x0020 WARNING: */
137 7, /* 0x0021 WARNING: */
138 6 /* 0x0022 WARNING: */
139 };
140
141 // When you add additional items to this list, you should then:
142 // 0 -- update this list
143 // 1 -- modify the following function parse_attribute_def()
144 // 2 -- if needed, modify ataPrintSmartAttribRawValue()
145 // 3 - if needed, modify ataPrintSmartAttribName()
146 // 4 -- add #define PRESET_N_DESCRIPTION at top of knowndrives.c
147 // 5 -- add drive in question into knowndrives[] table in knowndrives.c
148 // 6 -- update smartctl.8
149 // 7 -- update smartd.8
150 // 8 -- do "make smartd.conf.5" to update smartd.conf.5
151 // 9 -- update CHANGELOG file
152 const char *vendorattributeargs[] = {
153 // 0 defs[9]=1
154 "9,minutes",
155 // 1 defs[9]=3
156 "9,seconds",
157 // 2 defs[9]=2
158 "9,temp",
159 // 3 defs[220]=1
160 "220,temp",
161 // 4 defs[*]=253
162 "N,raw8",
163 // 5 defs[*]=254
164 "N,raw16",
165 // 6 defs[*]=255
166 "N,raw48",
167 // 7 defs[200]=1
168 "200,writeerrorcount",
169 // 8 defs[9]=4
170 "9,halfminutes",
171 // 9 defs[194]=1
172 "194,10xCelsius",
173 // 10 defs[194]=2
174 "194,unknown",
175 // 11 defs[193]=1
176 "193,loadunload",
177 // 12 defs[201]=1
178 "201,detectedtacount",
179 // 13 defs[192]=1
180 "192,emergencyretractcyclect",
181 // 14 defs[198]=1
182 "198,offlinescanuncsectorct",
183 // NULL should always terminate the array
184 NULL
185 };
186
187 // This are the meanings of the Self-test failure checkpoint byte.
188 // This is in the self-test log at offset 4 bytes into the self-test
189 // descriptor and in the SMART READ DATA structure at byte offset
190 // 371. These codes are not well documented. The meanings returned by
191 // this routine are used (at least) by Maxtor and IBM. Returns NULL if
192 // not recognized. Currently the maximum length is 15 bytes.
193 const char *SelfTestFailureCodeName(unsigned char which){
194
195 switch (which) {
196 case 0:
197 return "Write_Test";
198 case 1:
199 return "Servo_Basic";
200 case 2:
201 return "Servo_Random";
202 case 3:
203 return "G-list_Scan";
204 case 4:
205 return "Handling_Damage";
206 case 5:
207 return "Read_Scan";
208 default:
209 return NULL;
210 }
211 }
212
213 // This is a utility function for parsing pairs like "9,minutes" or
214 // "220,temp", and putting the correct flag into the attributedefs
215 // array. Returns 1 if problem, 0 if pair has been recongized.
216 int parse_attribute_def(char *pair, unsigned char **defsptr){
217 int i,j;
218 char temp[32];
219 unsigned char *defs;
220
221 // If array does not exist, allocate it
222 if (!*defsptr && !(*defsptr=(unsigned char *)calloc(MAX_ATTRIBUTE_NUM, 1))){
223 pout("Out of memory in parse_attribute_def\n");
224 EXIT(1);
225 }
226
227 defs=*defsptr;
228
229 // look along list and see if we find the pair
230 for (i=0; vendorattributeargs[i] && strcmp(pair, vendorattributeargs[i]); i++);
231
232 switch (i) {
233 case 0:
234 // attribute 9 is power on time in minutes
235 defs[9]=1;
236 return 0;
237 case 1:
238 // attribute 9 is power-on-time in seconds
239 defs[9]=3;
240 return 0;
241 case 2:
242 // attribute 9 is temperature in celsius
243 defs[9]=2;
244 return 0;
245 case 3:
246 // attribute 220 is temperature in celsius
247 defs[220]=1;
248 return 0;
249 case 4:
250 // print all attributes in raw 8-bit form
251 for (j=0; j<MAX_ATTRIBUTE_NUM; j++)
252 defs[j]=253;
253 return 0;
254 case 5:
255 // print all attributes in raw 16-bit form
256 for (j=0; j<MAX_ATTRIBUTE_NUM; j++)
257 defs[j]=254;
258 return 0;
259 case 6:
260 // print all attributes in raw 48-bit form
261 for (j=0; j<MAX_ATTRIBUTE_NUM; j++)
262 defs[j]=255;
263 return 0;
264 case 7:
265 // attribute 200 is write error count
266 defs[200]=1;
267 return 0;
268 case 8:
269 // attribute 9 increments once every 30 seconds (power on time
270 // measure)
271 defs[9]=4;
272 return 0;
273 case 9:
274 // attribute 194 is ten times disk temp in Celsius
275 defs[194]=1;
276 return 0;
277 case 10:
278 // attribute 194 is unknown
279 defs[194]=2;
280 return 0;
281 case 11:
282 // Hitachi : Attributes 193 has 2 values : 1 load, 1 normal unload
283 defs[193]=1;
284 return 0;
285 case 12:
286 // Fujitsu
287 defs[201]=1;
288 return 0;
289 case 13:
290 // Fujitsu
291 defs[192]=1;
292 return 0;
293 case 14:
294 // Fujitsu
295 defs[198]=1;
296 return 0;
297 default:
298 // pair not found
299 break;
300 }
301 // At this point, either the pair was not found, or it is of the
302 // form N,uninterpreted, in which case we need to parse N
303 j=sscanf(pair,"%d,%14s", &i, temp);
304
305 // if no match to pattern, unrecognized
306 if (j!=2 || i<0 || i >255)
307 return 1;
308
309 // check for recognized strings
310 if (!strcmp(temp, "raw8")) {
311 defs[i]=253;
312 return 0;
313 }
314
315 // check for recognized strings
316 if (!strcmp(temp, "raw16")) {
317 defs[i]=254;
318 return 0;
319 }
320
321 // check for recognized strings
322 if (!strcmp(temp, "raw48")) {
323 defs[i]=255;
324 return 0;
325 }
326
327 // didn't recognize the string
328 return 1;
329 }
330
331 // Structure used in sorting the array vendorattributeargs[].
332 typedef struct vaa_pair_s {
333 const char *vaa;
334 const char *padded_vaa;
335 } vaa_pair;
336
337 // Returns a copy of s with all numbers of less than three digits padded with
338 // leading zeros. Returns NULL if there isn't enough memory available. The
339 // memory for the string is dynamically allocated and should be freed by the
340 // caller.
341 char *pad_numbers(const char *s)
342 {
343 char c, *t, *u;
344 const char *r;
345 int i, len, ndigits = 0;
346
347 // Allocate the maximum possible amount of memory needed.
348 if (!(t = (char *)malloc(strlen(s)*2+2)))
349 return NULL;
350
351 // Copy the string s to t, padding any numbers of less than three digits
352 // with leading zeros. The string is copied backwards to simplify the code.
353 r = s + strlen(s);
354 u = t;
355 while (( r-- >= s)) {
356 if (isdigit((int)*r))
357 ndigits++;
358 else if (ndigits > 0) {
359 while (ndigits++ < 3)
360 *u++ = '0';
361 ndigits = 0;
362 }
363 *u++ = *r;
364 }
365 *u = '\0';
366
367 // Reverse the string in t.
368 len = strlen(t);
369 for (i = 0; i < len/2; i++) {
370 c = t[i];
371 t[i] = t[len-1-i];
372 t[len-1-i] = c;
373 }
374
375 return t;
376 }
377
378 // Comparison function for qsort(). Used by sort_vendorattributeargs().
379 int compare_vaa_pairs(const void *a, const void *b)
380 {
381 vaa_pair *p = (vaa_pair *)a;
382 vaa_pair *q = (vaa_pair *)b;
383
384 return strcmp(p->padded_vaa, q->padded_vaa);
385 }
386
387 // Returns a sorted list of vendorattributeargs or NULL if there is not enough
388 // memory available. The memory for the list is allocated dynamically and
389 // should be freed by the caller.
390 // To perform the sort, any numbers in the strings are padded out to three
391 // digits by adding leading zeros. For example,
392 //
393 // "9,minutes" becomes "009,minutes"
394 // "N,raw16" becomes "N,raw016"
395 //
396 // and the original strings are paired with the padded strings. The list of
397 // pairs is then sorted by comparing the padded strings (using strcmp) and the
398 // result is then the list of unpadded strings.
399 //
400 const char **sort_vendorattributeargs(void) {
401 const char **ps, **sorted_list = NULL;
402 vaa_pair *pairs, *pp;
403 int count, i;
404
405 // Figure out how many strings are in vendorattributeargs[] (not including
406 // the terminating NULL).
407 count = (sizeof vendorattributeargs) / sizeof(char *) - 1;
408
409 // Construct a list of pairs of strings from vendorattributeargs[] and their
410 // padded equivalents.
411 if (!(pairs = (vaa_pair *)malloc(sizeof(vaa_pair) * count)))
412 goto END;
413 for (ps = vendorattributeargs, pp = pairs; *ps; ps++, pp++) {
414 pp->vaa = *ps;
415 if (!(pp->padded_vaa = pad_numbers(*ps)))
416 goto END;
417 }
418
419 // Sort the array of vaa_pair structures by comparing the padded strings
420 // using strcmp().
421 qsort(pairs, count, sizeof(vaa_pair), compare_vaa_pairs);
422
423 // Construct the sorted list of strings.
424 if (!(sorted_list = (const char **)malloc(sizeof vendorattributeargs)))
425 goto END;
426 for (ps = sorted_list, pp = pairs, i = 0; i < count; ps++, pp++, i++)
427 *ps = pp->vaa;
428 *ps = NULL;
429
430 END:
431 if (pairs) {
432 for (i = 0; i < count; i++)
433 if (pairs[i].padded_vaa)
434 free((void *)pairs[i].padded_vaa);
435 free((void *)pairs);
436 }
437
438 // If there was a problem creating the list then sorted_list should now
439 // contain NULL.
440 return sorted_list;
441 }
442
443 // Function to return a multiline string containing a list of the arguments in
444 // vendorattributeargs[]. The strings are preceeded by tabs and followed
445 // (except for the last) by newlines.
446 // This function allocates the required memory for the string and the caller
447 // must use free() to free it. It returns NULL if the required memory can't
448 // be allocated.
449 char *create_vendor_attribute_arg_list(void){
450 const char **ps, **sorted;
451 char *s;
452 int len;
453
454 // Get a sorted list of vendor attribute arguments. If the sort fails
455 // (which should only happen if the system is really low on memory) then just
456 // use the unordered list.
457 if (!(sorted = (const char **) sort_vendorattributeargs()))
458 sorted = vendorattributeargs;
459
460 // Calculate the required number of characters
461 len = 1; // At least one char ('\0')
462 for (ps = sorted; *ps != NULL; ps++) {
463 len += 1; // For the tab
464 len += strlen(*ps); // For the actual argument string
465 if (*(ps+1))
466 len++; // For the newline if required
467 }
468
469 // Attempt to allocate memory for the string
470 if (!(s = (char *)malloc(len)))
471 return NULL;
472
473 // Construct the string
474 *s = '\0';
475 for (ps = sorted; *ps != NULL; ps++) {
476 strcat(s, "\t");
477 strcat(s, *ps);
478 if (*(ps+1))
479 strcat(s, "\n");
480 }
481
482 free((char **)sorted);
483
484 // Return a pointer to the string
485 return s;
486 }
487
488 // swap two bytes. Point to low address
489 void swap2(char *location){
490 char tmp=*location;
491 *location=*(location+1);
492 *(location+1)=tmp;
493 return;
494 }
495
496 // swap four bytes. Point to low address
497 void swap4(char *location){
498 char tmp=*location;
499 *location=*(location+3);
500 *(location+3)=tmp;
501 swap2(location+1);
502 return;
503 }
504
505 // swap eight bytes. Points to low address
506 void swap8(char *location){
507 char tmp=*location;
508 *location=*(location+7);
509 *(location+7)=tmp;
510 tmp=*(location+1);
511 *(location+1)=*(location+6);
512 *(location+6)=tmp;
513 swap4(location+2);
514 return;
515 }
516
517 static char *commandstrings[]={
518 "SMART ENABLE",
519 "SMART DISABLE",
520 "SMART AUTOMATIC ATTRIBUTE SAVE",
521 "SMART IMMEDIATE OFFLINE",
522 "SMART AUTO OFFLINE",
523 "SMART STATUS",
524 "SMART STATUS CHECK",
525 "SMART READ ATTRIBUTE VALUES",
526 "SMART READ ATTRIBUTE THRESHOLDS",
527 "SMART READ LOG",
528 "IDENTIFY DEVICE",
529 "IDENTIFY PACKET DEVICE",
530 "CHECK POWER MODE",
531 "SMART WRITE LOG",
532 "WARNING (UNDEFINED COMMAND -- CONTACT DEVELOPERS AT " PACKAGE_BUGREPORT ")\n"
533 };
534
535 void prettyprint(unsigned char *stuff, char *name){
536 int i,j;
537 pout("\n===== [%s] DATA START (BASE-16) =====\n", name);
538 for (i=0; i<32; i++){
539 pout("%03d-%03d: ", 16*i, 16*(i+1)-1);
540 for (j=0; j<15; j++)
541 pout("%02x ",*stuff++);
542 pout("%02x\n",*stuff++);
543 }
544 pout("===== [%s] DATA END (512 Bytes) =====\n\n", name);
545 }
546
547 // This function provides the pretty-print reporting for SMART
548 // commands: it implements the various -r "reporting" options for ATA
549 // ioctls.
550 int smartcommandhandler(int device, smart_command_set command, int select, char *data){
551 int retval;
552
553 // This conditional is true for commands that return data
554 int getsdata=(command==PIDENTIFY ||
555 command==IDENTIFY ||
556 command==READ_LOG ||
557 command==READ_THRESHOLDS ||
558 command==READ_VALUES ||
559 command==CHECK_POWER_MODE);
560
561 int sendsdata=(command==WRITE_LOG);
562
563 // If reporting is enabled, say what the command will be before it's executed
564 if (con->reportataioctl){
565 // conditional is true for commands that use parameters
566 int usesparam=(command==READ_LOG ||
567 command==AUTO_OFFLINE ||
568 command==AUTOSAVE ||
569 command==IMMEDIATE_OFFLINE ||
570 command==WRITE_LOG);
571
572 pout("\nREPORT-IOCTL: DeviceFD=%d Command=%s", device, commandstrings[command]);
573 if (usesparam)
574 pout(" InputParameter=%d\n", select);
575 else
576 pout("\n");
577 }
578
579 if ((getsdata || sendsdata) && !data){
580 pout("REPORT-IOCTL: Unable to execute command %s : data destination address is NULL\n", commandstrings[command]);
581 return -1;
582 }
583
584 // The reporting is cleaner, and we will find coding bugs faster, if
585 // the commands that failed clearly return empty (zeroed) data
586 // structures
587 if (getsdata) {
588 if (command==CHECK_POWER_MODE)
589 data[0]=0;
590 else
591 memset(data, '\0', 512);
592 }
593
594
595 // If reporting is enabled, say what input was sent to the command
596 if (con->reportataioctl && sendsdata){
597 pout("REPORT-IOCTL: DeviceFD=%d Command=%s", device, commandstrings[command]);
598 // if requested, pretty-print the output data structure
599 if (con->reportataioctl>1)
600 prettyprint((unsigned char *)data, commandstrings[command]);
601 }
602
603 // In case the command produces an error, we'll want to know what it is:
604 errno=0;
605
606 // now execute the command
607 switch (con->controller_type) {
608 case CONTROLLER_3WARE_678K:
609 case CONTROLLER_3WARE_678K_CHAR:
610 case CONTROLLER_3WARE_9000_CHAR:
611 retval=escalade_command_interface(device, con->controller_port-1, con->controller_type, command, select, data);
612 if (retval && con->controller_port<=0)
613 pout("WARNING: apparently missing '-d 3ware,N' disk specification\n");
614 break;
615 case CONTROLLER_MARVELL_SATA:
616 retval=marvell_command_interface(device, command, select, data);
617 break;
618 case CONTROLLER_SAT:
619 retval=sat_command_interface(device, command, select, data);
620 break;
621 case CONTROLLER_HPT:
622 retval=highpoint_command_interface(device, command, select, data);
623 break;
624 default:
625 retval=ata_command_interface(device, command, select, data);
626 }
627
628 // If reporting is enabled, say what output was produced by the command
629 if (con->reportataioctl){
630 if (errno)
631 pout("REPORT-IOCTL: DeviceFD=%d Command=%s returned %d errno=%d [%s]\n",
632 device, commandstrings[command], retval, errno, strerror(errno));
633 else
634 pout("REPORT-IOCTL: DeviceFD=%d Command=%s returned %d\n",
635 device, commandstrings[command], retval);
636
637 // if requested, pretty-print the output data structure
638 if (con->reportataioctl>1 && getsdata) {
639 if (command==CHECK_POWER_MODE)
640 pout("Sector Count Register (BASE-16): %02x\n", (unsigned char)(*data));
641 else
642 prettyprint((unsigned char *)data, commandstrings[command]);
643 }
644 }
645 return retval;
646 }
647
648
649 // This function computes the checksum of a single disk sector (512
650 // bytes). Returns zero if checksum is OK, nonzero if the checksum is
651 // incorrect. The size (512) is correct for all SMART structures.
652 unsigned char checksum(unsigned char *buffer){
653 unsigned char sum=0;
654 int i;
655
656 for (i=0; i<512; i++)
657 sum+=buffer[i];
658
659 return sum;
660 }
661
662 // returns -1 if command fails or the device is in Sleep mode, else
663 // value of Sector Count register. Sector Count result values:
664 // 00h device is in Standby mode.
665 // 80h device is in Idle mode.
666 // FFh device is in Active mode or Idle mode.
667
668 int ataCheckPowerMode(int device) {
669 unsigned char result;
670
671 if ((smartcommandhandler(device, CHECK_POWER_MODE, 0, (char *)&result)))
672 return -1;
673
674 if (result!=0 && result!=0x80 && result!=0xff)
675 pout("ataCheckPowerMode(): ATA CHECK POWER MODE returned unknown Sector Count Register value %02x\n", result);
676
677 return (int)result;
678 }
679
680
681
682
683 // Reads current Device Identity info (512 bytes) into buf. Returns 0
684 // if all OK. Returns -1 if no ATA Device identity can be
685 // established. Returns >0 if Device is ATA Packet Device (not SMART
686 // capable). The value of the integer helps identify the type of
687 // Packet device, which is useful so that the user can connect the
688 // formal device number with whatever object is inside their computer.
689 int ataReadHDIdentity (int device, struct ata_identify_device *buf){
690 unsigned short *rawshort=(unsigned short *)buf;
691 unsigned char *rawbyte =(unsigned char *)buf;
692
693 // See if device responds either to IDENTIFY DEVICE or IDENTIFY
694 // PACKET DEVICE
695 if ((smartcommandhandler(device, IDENTIFY, 0, (char *)buf))){
696 if (smartcommandhandler(device, PIDENTIFY, 0, (char *)buf)){
697 return -1;
698 }
699 }
700
701 #ifndef __NetBSD__
702 // if machine is big-endian, swap byte order as needed
703 // (the NetBSD kernel does deliver the results in host byte order)
704 if (isbigendian()){
705 int i;
706
707 // swap various capability words that are needed
708 for (i=0; i<33; i++)
709 swap2((char *)(buf->words047_079+i));
710
711 for (i=80; i<=87; i++)
712 swap2((char *)(rawshort+i));
713
714 for (i=0; i<168; i++)
715 swap2((char *)(buf->words088_255+i));
716 }
717 #endif
718
719 // If there is a checksum there, validate it
720 if ((rawshort[255] & 0x00ff) == 0x00a5 && checksum(rawbyte))
721 checksumwarning("Drive Identity Structure");
722
723 // If this is a PACKET DEVICE, return device type
724 if (rawbyte[1] & 0x80)
725 return 1+(rawbyte[1] & 0x1f);
726
727 // Not a PACKET DEVICE
728 return 0;
729 }
730
731 // Returns ATA version as an integer, and a pointer to a string
732 // describing which revision. Note that Revision 0 of ATA-3 does NOT
733 // support SMART. For this one case we return -3 rather than +3 as
734 // the version number. See notes above.
735 int ataVersionInfo (const char** description, struct ata_identify_device *drive, unsigned short *minor){
736 unsigned short major;
737 int i;
738
739 // check that arrays at the top of this file are defined
740 // consistently
741 if (sizeof(minor_str) != sizeof(char *)*(1+MINOR_MAX)){
742 pout("Internal error in ataVersionInfo(). minor_str[] size %d\n"
743 "is not consistent with value of MINOR_MAX+1 = %d\n",
744 (int)(sizeof(minor_str)/sizeof(char *)), MINOR_MAX+1);
745 fflush(NULL);
746 abort();
747 }
748 if (sizeof(actual_ver) != sizeof(int)*(1+MINOR_MAX)){
749 pout("Internal error in ataVersionInfo(). actual_ver[] size %d\n"
750 "is not consistent with value of MINOR_MAX = %d\n",
751 (int)(sizeof(actual_ver)/sizeof(int)), MINOR_MAX+1);
752 fflush(NULL);
753 abort();
754 }
755
756 // get major and minor ATA revision numbers
757 major=drive->major_rev_num;
758 *minor=drive->minor_rev_num;
759
760 // First check if device has ANY ATA version information in it
761 if (major==NOVAL_0 || major==NOVAL_1) {
762 *description=NULL;
763 return -1;
764 }
765
766 // The minor revision number has more information - try there first
767 if (*minor && (*minor<=MINOR_MAX)){
768 int std = actual_ver[*minor];
769 if (std) {
770 *description=minor_str[*minor];
771 return std;
772 }
773 }
774
775 // HDPARM has a very complicated algorithm from here on. Since SMART only
776 // exists on ATA-3 and later standards, let's punt on this. If you don't
777 // like it, please fix it. The code's in CVS.
778 for (i=15; i>0; i--)
779 if (major & (0x1<<i))
780 break;
781
782 *description=NULL;
783 if (i==0)
784 return 1;
785 else
786 return i;
787 }
788
789 // returns 1 if SMART supported, 0 if SMART unsupported, -1 if can't tell
790 int ataSmartSupport(struct ata_identify_device *drive){
791 unsigned short word82=drive->command_set_1;
792 unsigned short word83=drive->command_set_2;
793
794 // check if words 82/83 contain valid info
795 if ((word83>>14) == 0x01)
796 // return value of SMART support bit
797 return word82 & 0x0001;
798
799 // since we can're rely on word 82, we don't know if SMART supported
800 return -1;
801 }
802
803 // returns 1 if SMART enabled, 0 if SMART disabled, -1 if can't tell
804 int ataIsSmartEnabled(struct ata_identify_device *drive){
805 unsigned short word85=drive->cfs_enable_1;
806 unsigned short word87=drive->csf_default;
807
808 // check if words 85/86/87 contain valid info
809 if ((word87>>14) == 0x01)
810 // return value of SMART enabled bit
811 return word85 & 0x0001;
812
813 // Since we can't rely word85, we don't know if SMART is enabled.
814 return -1;
815 }
816
817
818 // Reads SMART attributes into *data
819 int ataReadSmartValues(int device, struct ata_smart_values *data){
820
821 if (smartcommandhandler(device, READ_VALUES, 0, (char *)data)){
822 syserror("Error SMART Values Read failed");
823 return -1;
824 }
825
826 // compute checksum
827 if (checksum((unsigned char *)data))
828 checksumwarning("SMART Attribute Data Structure");
829
830 // byte swap if needed
831 if (isbigendian()){
832 int i;
833 swap2((char *)&(data->revnumber));
834 swap2((char *)&(data->total_time_to_complete_off_line));
835 swap2((char *)&(data->smart_capability));
836 for (i=0; i<NUMBER_ATA_SMART_ATTRIBUTES; i++){
837 struct ata_smart_attribute *x=data->vendor_attributes+i;
838 swap2((char *)&(x->flags));
839 }
840 }
841
842 return 0;
843 }
844
845
846 // This corrects some quantities that are byte reversed in the SMART
847 // SELF TEST LOG
848 void fixsamsungselftestlog(struct ata_smart_selftestlog *data){
849 int i;
850
851 // bytes 508/509 (numbered from 0) swapped (swap of self-test index
852 // with one byte of reserved.
853 swap2((char *)&(data->mostrecenttest));
854
855 // LBA low register (here called 'selftestnumber", containing
856 // information about the TYPE of the self-test) is byte swapped with
857 // Self-test execution status byte. These are bytes N, N+1 in the
858 // entries.
859 for (i=0; i<21; i++)
860 swap2((char *)&(data->selftest_struct[i].selftestnumber));
861
862 return;
863 }
864
865 // Reads the Self Test Log (log #6)
866 int ataReadSelfTestLog (int device, struct ata_smart_selftestlog *data){
867
868 // get data from device
869 if (smartcommandhandler(device, READ_LOG, 0x06, (char *)data)){
870 syserror("Error SMART Error Self-Test Log Read failed");
871 return -1;
872 }
873
874 // compute its checksum, and issue a warning if needed
875 if (checksum((unsigned char *)data))
876 checksumwarning("SMART Self-Test Log Structure");
877
878 // fix firmware bugs in self-test log
879 if (con->fixfirmwarebug == FIX_SAMSUNG)
880 fixsamsungselftestlog(data);
881
882 // fix endian order, if needed
883 if (isbigendian()){
884 int i;
885 swap2((char*)&(data->revnumber));
886 for (i=0; i<21; i++){
887 struct ata_smart_selftestlog_struct *x=data->selftest_struct+i;
888 swap2((char *)&(x->timestamp));
889 swap4((char *)&(x->lbafirstfailure));
890 }
891 }
892
893 return 0;
894 }
895
896
897 // Reads the Log Directory (log #0). Note: NO CHECKSUM!!
898 int ataReadLogDirectory (int device, struct ata_smart_log_directory *data){
899
900 // get data from device
901 if (smartcommandhandler(device, READ_LOG, 0x00, (char *)data)){
902 return -1;
903 }
904
905 // swap endian order if needed
906 if (isbigendian()){
907 swap2((char *)&(data->logversion));
908 }
909
910 return 0;
911 }
912
913
914 // Reads the selective self-test log (log #9)
915 int ataReadSelectiveSelfTestLog(int device, struct ata_selective_self_test_log *data){
916
917 // get data from device
918 if (smartcommandhandler(device, READ_LOG, 0x09, (char *)data)){
919 syserror("Error SMART Read Selective Self-Test Log failed");
920 return -1;
921 }
922
923 // compute its checksum, and issue a warning if needed
924 if (checksum((unsigned char *)data))
925 checksumwarning("SMART Selective Self-Test Log Structure");
926
927 // swap endian order if needed
928 if (isbigendian()){
929 int i;
930 swap2((char *)&(data->logversion));
931 for (i=0;i<5;i++){
932 swap8((char *)&(data->span[i].start));
933 swap8((char *)&(data->span[i].end));
934 }
935 swap8((char *)&(data->currentlba));
936 swap2((char *)&(data->currentspan));
937 swap2((char *)&(data->flags));
938 swap2((char *)&(data->pendingtime));
939 }
940
941 if (data->logversion != 1)
942 pout("SMART Selective Self-Test Log Data Structure Revision Number (%d) should be 1\n", data->logversion);
943
944 return 0;
945 }
946
947 // Writes the selective self-test log (log #9)
948 int ataWriteSelectiveSelfTestLog(int device, struct ata_smart_values *sv){
949 int i;
950 struct ata_selective_self_test_log sstlog, *data=&sstlog;
951 unsigned char cksum=0;
952 unsigned char *ptr=(unsigned char *)data;
953
954 // Read log
955 if (ataReadSelectiveSelfTestLog(device, data)) {
956 pout("Since Read failed, will not attempt to WRITE Selective Self-test Log\n");
957 return -1;
958 }
959
960 // Fix logversion if needed
961 if (data->logversion !=1) {
962 pout("Error SMART Selective Self-Test Log Data Structure Revision not recognized\n"
963 "Revision number should be 1 but is %d. To be safe, aborting WRITE LOG\n", data->logversion);
964 return -2;
965 }
966
967 // Host is NOT allowed to write selective self-test log if a selective
968 // self-test is in progress.
969 if (0<data->currentspan && data->currentspan<6 && ((sv->self_test_exec_status)>>4)==15) {
970 pout("Error SMART Selective or other Self-Test in progress.\n");
971 return -4;
972 }
973
974 // Clear spans
975 for (i=0; i<5; i++)
976 memset(data->span+i, 0, sizeof(struct test_span));
977
978 // Set spans for testing
979 for (i=0; i<con->smartselectivenumspans; i++){
980 data->span[i].start = con->smartselectivespan[i][0];
981 data->span[i].end = con->smartselectivespan[i][1];
982 }
983
984 // host must initialize to zero before initiating selective self-test
985 data->currentlba=0;
986 data->currentspan=0;
987
988 // Perform off-line scan after selective test?
989 if (1 == con->scanafterselect)
990 // NO
991 data->flags &= ~SELECTIVE_FLAG_DOSCAN;
992 else if (2 == con->scanafterselect)
993 // YES
994 data->flags |= SELECTIVE_FLAG_DOSCAN;
995
996 // Must clear active and pending flags before writing
997 data->flags &= ~(SELECTIVE_FLAG_ACTIVE);
998 data->flags &= ~(SELECTIVE_FLAG_PENDING);
999
1000 // modify pending time?
1001 if (con->pendingtime)
1002 data->pendingtime=(unsigned short)(con->pendingtime-1);
1003
1004 // Set checksum to zero, then compute checksum
1005 data->checksum=0;
1006 for (i=0; i<512; i++)
1007 cksum+=ptr[i];
1008 cksum=~cksum;
1009 cksum+=1;
1010 data->checksum=cksum;
1011
1012 // swap endian order if needed
1013 if (isbigendian()){
1014 int i;
1015 swap2((char *)&(data->logversion));
1016 for (i=0;i<5;i++){
1017 swap8((char *)&(data->span[i].start));
1018 swap8((char *)&(data->span[i].end));
1019 }
1020 swap8((char *)&(data->currentlba));
1021 swap2((char *)&(data->currentspan));
1022 swap2((char *)&(data->flags));
1023 swap2((char *)&(data->pendingtime));
1024 }
1025
1026 // write new selective self-test log
1027 if (smartcommandhandler(device, WRITE_LOG, 0x09, (char *)data)){
1028 syserror("Error Write Selective Self-Test Log failed");
1029 return -3;
1030 }
1031
1032 return 0;
1033 }
1034
1035 // This corrects some quantities that are byte reversed in the SMART
1036 // ATA ERROR LOG.
1037 void fixsamsungerrorlog(struct ata_smart_errorlog *data){
1038 int i,j;
1039
1040 // FIXED IN SAMSUNG -25 FIRMWARE???
1041 // Device error count in bytes 452-3
1042 swap2((char *)&(data->ata_error_count));
1043
1044 // FIXED IN SAMSUNG -22a FIRMWARE
1045 // step through 5 error log data structures
1046 for (i=0; i<5; i++){
1047 // step through 5 command data structures
1048 for (j=0; j<5; j++)
1049 // Command data structure 4-byte millisec timestamp. These are
1050 // bytes (N+8, N+9, N+10, N+11).
1051 swap4((char *)&(data->errorlog_struct[i].commands[j].timestamp));
1052 // Error data structure two-byte hour life timestamp. These are
1053 // bytes (N+28, N+29).
1054 swap2((char *)&(data->errorlog_struct[i].error_struct.timestamp));
1055 }
1056 return;
1057 }
1058
1059 // NEEDED ONLY FOR SAMSUNG -22 (some) -23 AND -24?? FIRMWARE
1060 void fixsamsungerrorlog2(struct ata_smart_errorlog *data){
1061 // Device error count in bytes 452-3
1062 swap2((char *)&(data->ata_error_count));
1063 return;
1064 }
1065
1066 // Reads the Summary SMART Error Log (log #1). The Comprehensive SMART
1067 // Error Log is #2, and the Extended Comprehensive SMART Error log is
1068 // #3
1069 int ataReadErrorLog (int device, struct ata_smart_errorlog *data){
1070
1071 // get data from device
1072 if (smartcommandhandler(device, READ_LOG, 0x01, (char *)data)){
1073 syserror("Error SMART Error Log Read failed");
1074 return -1;
1075 }
1076
1077 // compute its checksum, and issue a warning if needed
1078 if (checksum((unsigned char *)data))
1079 checksumwarning("SMART ATA Error Log Structure");
1080
1081 // Some disks have the byte order reversed in some SMART Summary
1082 // Error log entries
1083 if (con->fixfirmwarebug == FIX_SAMSUNG)
1084 fixsamsungerrorlog(data);
1085 else if (con->fixfirmwarebug == FIX_SAMSUNG2)
1086 fixsamsungerrorlog2(data);
1087
1088 // Correct endian order if necessary
1089 if (isbigendian()){
1090 int i,j;
1091
1092 // Device error count in bytes 452-3
1093 swap2((char *)&(data->ata_error_count));
1094
1095 // step through 5 error log data structures
1096 for (i=0; i<5; i++){
1097 // step through 5 command data structures
1098 for (j=0; j<5; j++)
1099 // Command data structure 4-byte millisec timestamp
1100 swap4((char *)&(data->errorlog_struct[i].commands[j].timestamp));
1101 // Error data structure life timestamp
1102 swap2((char *)&(data->errorlog_struct[i].error_struct.timestamp));
1103 }
1104 }
1105
1106 return 0;
1107 }
1108
1109 int ataReadSmartThresholds (int device, struct ata_smart_thresholds_pvt *data){
1110
1111 // get data from device
1112 if (smartcommandhandler(device, READ_THRESHOLDS, 0, (char *)data)){
1113 syserror("Error SMART Thresholds Read failed");
1114 return -1;
1115 }
1116
1117 // compute its checksum, and issue a warning if needed
1118 if (checksum((unsigned char *)data))
1119 checksumwarning("SMART Attribute Thresholds Structure");
1120
1121 // byte swap if needed
1122 if (isbigendian())
1123 swap2((char *)&(data->revnumber));
1124
1125 return 0;
1126 }
1127
1128 int ataEnableSmart (int device ){
1129 if (smartcommandhandler(device, ENABLE, 0, NULL)){
1130 syserror("Error SMART Enable failed");
1131 return -1;
1132 }
1133 return 0;
1134 }
1135
1136 int ataDisableSmart (int device ){
1137
1138 if (smartcommandhandler(device, DISABLE, 0, NULL)){
1139 syserror("Error SMART Disable failed");
1140 return -1;
1141 }
1142 return 0;
1143 }
1144
1145 int ataEnableAutoSave(int device){
1146 if (smartcommandhandler(device, AUTOSAVE, 241, NULL)){
1147 syserror("Error SMART Enable Auto-save failed");
1148 return -1;
1149 }
1150 return 0;
1151 }
1152
1153 int ataDisableAutoSave(int device){
1154
1155 if (smartcommandhandler(device, AUTOSAVE, 0, NULL)){
1156 syserror("Error SMART Disable Auto-save failed");
1157 return -1;
1158 }
1159 return 0;
1160 }
1161
1162 // In *ALL* ATA standards the Enable/Disable AutoOffline command is
1163 // marked "OBSOLETE". It is defined in SFF-8035i Revision 2, and most
1164 // vendors still support it for backwards compatibility. IBM documents
1165 // it for some drives.
1166 int ataEnableAutoOffline (int device ){
1167
1168 /* timer hard coded to 4 hours */
1169 if (smartcommandhandler(device, AUTO_OFFLINE, 248, NULL)){
1170 syserror("Error SMART Enable Automatic Offline failed");
1171 return -1;
1172 }
1173 return 0;
1174 }
1175
1176 // Another Obsolete Command. See comments directly above, associated
1177 // with the corresponding Enable command.
1178 int ataDisableAutoOffline (int device ){
1179
1180 if (smartcommandhandler(device, AUTO_OFFLINE, 0, NULL)){
1181 syserror("Error SMART Disable Automatic Offline failed");
1182 return -1;
1183 }
1184 return 0;
1185 }
1186
1187 // If SMART is enabled, supported, and working, then this call is
1188 // guaranteed to return 1, else zero. Note that it should return 1
1189 // regardless of whether the disk's SMART status is 'healthy' or
1190 // 'failing'.
1191 int ataDoesSmartWork(int device){
1192 int retval=smartcommandhandler(device, STATUS, 0, NULL);
1193
1194 if (-1 == retval)
1195 return 0;
1196
1197 return 1;
1198 }
1199
1200 // This function uses a different interface (DRIVE_TASK) than the
1201 // other commands in this file.
1202 int ataSmartStatus2(int device){
1203 return smartcommandhandler(device, STATUS_CHECK, 0, NULL);
1204 }
1205
1206 // This is the way to execute ALL tests: offline, short self-test,
1207 // extended self test, with and without captive mode, etc.
1208 int ataSmartTest(int device, int testtype, struct ata_smart_values *sv) {
1209 char cmdmsg[128],*type,*captive;
1210 int errornum, cap, retval, select=0;
1211
1212 // Boolean, if set, says test is captive
1213 cap=testtype & CAPTIVE_MASK;
1214
1215 // Set up strings that describe the type of test
1216 if (cap)
1217 captive="captive";
1218 else
1219 captive="off-line";
1220
1221 if (testtype==OFFLINE_FULL_SCAN)
1222 type="off-line";
1223 else if (testtype==SHORT_SELF_TEST || testtype==SHORT_CAPTIVE_SELF_TEST)
1224 type="Short self-test";
1225 else if (testtype==EXTEND_SELF_TEST || testtype==EXTEND_CAPTIVE_SELF_TEST)
1226 type="Extended self-test";
1227 else if (testtype==CONVEYANCE_SELF_TEST || testtype==CONVEYANCE_CAPTIVE_SELF_TEST)
1228 type="Conveyance self-test";
1229 else if ((select=(testtype==SELECTIVE_SELF_TEST || testtype==SELECTIVE_CAPTIVE_SELF_TEST)))
1230 type="Selective self-test";
1231 else
1232 type="[Unrecognized] self-test";
1233
1234 // If doing a selective self-test, first use WRITE_LOG to write the
1235 // selective self-test log.
1236 if (select && (retval=ataWriteSelectiveSelfTestLog(device, sv))) {
1237 if (retval==-4)
1238 pout("Can't start selective self-test without aborting current test: use '-X' option to smartctl.\n");
1239 return retval;
1240 }
1241
1242 // Print ouf message that we are sending the command to test
1243 if (testtype==ABORT_SELF_TEST)
1244 sprintf(cmdmsg,"Abort SMART off-line mode self-test routine");
1245 else
1246 sprintf(cmdmsg,"Execute SMART %s routine immediately in %s mode",type,captive);
1247 pout("Sending command: \"%s\".\n",cmdmsg);
1248
1249 if (select) {
1250 int i;
1251 pout("SPAN STARTING_LBA ENDING_LBA\n");
1252 for (i = 0; i < con->smartselectivenumspans; i++)
1253 pout(" %d %20"PRId64" %20"PRId64"\n", i,
1254 con->smartselectivespan[i][0],
1255 con->smartselectivespan[i][1]);
1256 }
1257
1258 // Now send the command to test
1259 errornum=smartcommandhandler(device, IMMEDIATE_OFFLINE, testtype, NULL);
1260
1261 if (errornum && !(cap && errno==EIO)){
1262 char errormsg[128];
1263 sprintf(errormsg,"Command \"%s\" failed",cmdmsg);
1264 syserror(errormsg);
1265 pout("\n");
1266 return -1;
1267 }
1268
1269 // Since the command succeeded, tell user
1270 if (testtype==ABORT_SELF_TEST)
1271 pout("Self-testing aborted!\n");
1272 else
1273 pout("Drive command \"%s\" successful.\nTesting has begun.\n",cmdmsg);
1274 return 0;
1275 }
1276
1277 /* Test Time Functions */
1278 int TestTime(struct ata_smart_values *data,int testtype){
1279 switch (testtype){
1280 case OFFLINE_FULL_SCAN:
1281 return (int) data->total_time_to_complete_off_line;
1282 case SHORT_SELF_TEST:
1283 case SHORT_CAPTIVE_SELF_TEST:
1284 return (int) data->short_test_completion_time;
1285 case EXTEND_SELF_TEST:
1286 case EXTEND_CAPTIVE_SELF_TEST:
1287 return (int) data->extend_test_completion_time;
1288 case CONVEYANCE_SELF_TEST:
1289 case CONVEYANCE_CAPTIVE_SELF_TEST:
1290 return (int) data->conveyance_test_completion_time;
1291 default:
1292 return 0;
1293 }
1294 }
1295
1296 // This function tells you both about the ATA error log and the
1297 // self-test error log capability (introduced in ATA-5). The bit is
1298 // poorly documented in the ATA/ATAPI standard. Starting with ATA-6,
1299 // SMART error logging is also indicated in bit 0 of DEVICE IDENTIFY
1300 // word 84 and 87. Top two bits must match the pattern 01. BEFORE
1301 // ATA-6 these top two bits still had to match the pattern 01, but the
1302 // remaining bits were reserved (==0).
1303 int isSmartErrorLogCapable (struct ata_smart_values *data, struct ata_identify_device *identity){
1304
1305 unsigned short word84=identity->command_set_extension;
1306 unsigned short word87=identity->csf_default;
1307 int isata6=identity->major_rev_num & (0x01<<6);
1308 int isata7=identity->major_rev_num & (0x01<<7);
1309
1310 if ((isata6 || isata7) && (word84>>14) == 0x01 && (word84 & 0x01))
1311 return 1;
1312
1313 if ((isata6 || isata7) && (word87>>14) == 0x01 && (word87 & 0x01))
1314 return 1;
1315
1316 // otherwise we'll use the poorly documented capability bit
1317 return data->errorlog_capability & 0x01;
1318 }
1319
1320 // See previous function. If the error log exists then the self-test
1321 // log should (must?) also exist.
1322 int isSmartTestLogCapable (struct ata_smart_values *data, struct ata_identify_device *identity){
1323
1324 unsigned short word84=identity->command_set_extension;
1325 unsigned short word87=identity->csf_default;
1326 int isata6=identity->major_rev_num & (0x01<<6);
1327 int isata7=identity->major_rev_num & (0x01<<7);
1328
1329 if ((isata6 || isata7) && (word84>>14) == 0x01 && (word84 & 0x02))
1330 return 1;
1331
1332 if ((isata6 || isata7) && (word87>>14) == 0x01 && (word87 & 0x02))
1333 return 1;
1334
1335
1336 // otherwise we'll use the poorly documented capability bit
1337 return data->errorlog_capability & 0x01;
1338 }
1339
1340
1341 int isGeneralPurposeLoggingCapable(struct ata_identify_device *identity){
1342 unsigned short word84=identity->command_set_extension;
1343 unsigned short word87=identity->csf_default;
1344
1345 // If bit 14 of word 84 is set to one and bit 15 of word 84 is
1346 // cleared to zero, the contents of word 84 contains valid support
1347 // information. If not, support information is not valid in this
1348 // word.
1349 if ((word84>>14) == 0x01)
1350 // If bit 5 of word 84 is set to one, the device supports the
1351 // General Purpose Logging feature set.
1352 return (word84 & (0x01 << 5));
1353
1354 // If bit 14 of word 87 is set to one and bit 15 of word 87 is
1355 // cleared to zero, the contents of words (87:85) contain valid
1356 // information. If not, information is not valid in these words.
1357 if ((word87>>14) == 0x01)
1358 // If bit 5 of word 87 is set to one, the device supports
1359 // the General Purpose Logging feature set.
1360 return (word87 & (0x01 << 5));
1361
1362 // not capable
1363 return 0;
1364 }
1365
1366
1367 // SMART self-test capability is also indicated in bit 1 of DEVICE
1368 // IDENTIFY word 87 (if top two bits of word 87 match pattern 01).
1369 // However this was only introduced in ATA-6 (but self-test log was in
1370 // ATA-5).
1371 int isSupportExecuteOfflineImmediate(struct ata_smart_values *data){
1372 return data->offline_data_collection_capability & 0x01;
1373 }
1374 // Note in the ATA-5 standard, the following bit is listed as "Vendor
1375 // Specific". So it may not be reliable. The only use of this that I
1376 // have found is in IBM drives, where it is well-documented. See for
1377 // example page 170, section 13.32.1.18 of the IBM Travelstar 40GNX
1378 // hard disk drive specifications page 164 Revision 1.1 22 Apr 2002.
1379 int isSupportAutomaticTimer(struct ata_smart_values *data){
1380 return data->offline_data_collection_capability & 0x02;
1381 }
1382 int isSupportOfflineAbort(struct ata_smart_values *data){
1383 return data->offline_data_collection_capability & 0x04;
1384 }
1385 int isSupportOfflineSurfaceScan(struct ata_smart_values *data){
1386 return data->offline_data_collection_capability & 0x08;
1387 }
1388 int isSupportSelfTest (struct ata_smart_values *data){
1389 return data->offline_data_collection_capability & 0x10;
1390 }
1391 int isSupportConveyanceSelfTest(struct ata_smart_values *data){
1392 return data->offline_data_collection_capability & 0x20;
1393 }
1394 int isSupportSelectiveSelfTest(struct ata_smart_values *data){
1395 return data->offline_data_collection_capability & 0x40;
1396 }
1397
1398
1399
1400 // Loop over all valid attributes. If they are prefailure attributes
1401 // and are at or below the threshold value, then return the ID of the
1402 // first failing attribute found. Return 0 if all prefailure
1403 // attributes are in bounds. The spec says "Bit 0
1404 // -Pre-failure/advisory - If the value of this bit equals zero, an
1405 // attribute value less than or equal to its corresponding attribute
1406 // threshold indicates an advisory condition where the usage or age of
1407 // the device has exceeded its intended design life period. If the
1408 // value of this bit equals one, an atribute value less than or equal
1409 // to its corresponding attribute threshold indicates a pre-failure
1410 // condition where imminent loss of data is being predicted."
1411
1412
1413 // onlyfailed=0 : are or were any age or prefailure attributes <= threshold
1414 // onlyfailed=1: are any prefailure attributes <= threshold now
1415 int ataCheckSmart(struct ata_smart_values *data,
1416 struct ata_smart_thresholds_pvt *thresholds,
1417 int onlyfailed){
1418 int i;
1419
1420 // loop over all attributes
1421 for (i=0; i<NUMBER_ATA_SMART_ATTRIBUTES; i++){
1422
1423 // pointers to disk's values and vendor's thresholds
1424 struct ata_smart_attribute *disk=data->vendor_attributes+i;
1425 struct ata_smart_threshold_entry *thre=thresholds->thres_entries+i;
1426
1427 // consider only valid attributes
1428 if (disk->id && thre->id){
1429 int failednow,failedever;
1430
1431 failednow =disk->current <= thre->threshold;
1432 failedever=disk->worst <= thre->threshold;
1433
1434 if (!onlyfailed && failedever)
1435 return disk->id;
1436
1437 if (onlyfailed && failednow && ATTRIBUTE_FLAGS_PREFAILURE(disk->flags))
1438 return disk->id;
1439 }
1440 }
1441 return 0;
1442 }
1443
1444
1445
1446 // This checks the n'th attribute in the attribute list, NOT the
1447 // attribute with id==n. If the attribute does not exist, or the
1448 // attribute is > threshold, then returns zero. If the attribute is
1449 // <= threshold (failing) then we the attribute number if it is a
1450 // prefail attribute. Else we return minus the attribute number if it
1451 // is a usage attribute.
1452 int ataCheckAttribute(struct ata_smart_values *data,
1453 struct ata_smart_thresholds_pvt *thresholds,
1454 int n){
1455 struct ata_smart_attribute *disk;
1456 struct ata_smart_threshold_entry *thre;
1457
1458 if (n<0 || n>=NUMBER_ATA_SMART_ATTRIBUTES || !data || !thresholds)
1459 return 0;
1460
1461 // pointers to disk's values and vendor's thresholds
1462 disk=data->vendor_attributes+n;
1463 thre=thresholds->thres_entries+n;
1464
1465 if (!disk || !thre)
1466 return 0;
1467
1468 // consider only valid attributes, check for failure
1469 if (!disk->id || !thre->id || (disk->id != thre->id) || disk->current> thre->threshold)
1470 return 0;
1471
1472 // We have found a failed attribute. Return positive or negative?
1473 if (ATTRIBUTE_FLAGS_PREFAILURE(disk->flags))
1474 return disk->id;
1475 else
1476 return -1*(disk->id);
1477 }
1478
1479
1480 // This routine prints the raw value of an attribute as a text string
1481 // into out. It also returns this 48-bit number as a long long. The
1482 // array defs[] contains non-zero values if particular attributes have
1483 // non-default interpretations.
1484
1485 int64_t ataPrintSmartAttribRawValue(char *out,
1486 struct ata_smart_attribute *attribute,
1487 unsigned char *defs){
1488 int64_t rawvalue;
1489 unsigned word[3];
1490 int j;
1491 unsigned char select;
1492
1493 // convert the six individual bytes to a long long (8 byte) integer.
1494 // This is the value that we'll eventually return.
1495 rawvalue = 0;
1496 for (j=0; j<6; j++) {
1497 // This looks a bit roundabout, but is necessary. Don't
1498 // succumb to the temptation to use raw[j]<<(8*j) since under
1499 // the normal rules this will be promoted to the native type.
1500 // On a 32 bit machine this might then overflow.
1501 int64_t temp;
1502 temp = attribute->raw[j];
1503 temp <<= 8*j;
1504 rawvalue |= temp;
1505 }
1506
1507 // convert quantities to three two-byte words
1508 for (j=0; j<3; j++){
1509 word[j] = attribute->raw[2*j+1];
1510 word[j] <<= 8;
1511 word[j] |= attribute->raw[2*j];
1512 }
1513
1514 // if no data array, Attributes have default interpretations
1515 if (defs)
1516 select=defs[attribute->id];
1517 else
1518 select=0;
1519
1520 // Print six one-byte quantities.
1521 if (select==253){
1522 for (j=0; j<5; j++)
1523 out+=sprintf(out, "%d ", attribute->raw[5-j]);
1524 out+=sprintf(out, "%d ", attribute->raw[0]);
1525 return rawvalue;
1526 }
1527
1528 // Print three two-byte quantities
1529 if (select==254){
1530 out+=sprintf(out, "%d %d %d", word[2], word[1], word[0]);
1531 return rawvalue;
1532 }
1533
1534 // Print one six-byte quantity
1535 if (select==255){
1536 out+=sprintf(out, "%"PRIu64, rawvalue);
1537 return rawvalue;
1538 }
1539
1540 // This switch statement is where we handle Raw attributes
1541 // that are stored in an unusual vendor-specific format,
1542 switch (attribute->id){
1543 // Spin-up time
1544 case 3:
1545 out+=sprintf(out, "%d", word[0]);
1546 // if second nonzero then it stores the average spin-up time
1547 if (word[1])
1548 out+=sprintf(out, " (Average %d)", word[1]);
1549 break;
1550 // Power on time
1551 case 9:
1552 if (select==1){
1553 // minutes
1554 int64_t tmp1=rawvalue/60;
1555 int64_t tmp2=rawvalue%60;
1556 out+=sprintf(out, "%"PRIu64"h+%02"PRIu64"m", tmp1, tmp2);
1557 }
1558 else if (select==3){
1559 // seconds
1560 int64_t hours=rawvalue/3600;
1561 int64_t minutes=(rawvalue-3600*hours)/60;
1562 int64_t seconds=rawvalue%60;
1563 out+=sprintf(out, "%"PRIu64"h+%02"PRIu64"m+%02"PRIu64"s", hours, minutes, seconds);
1564 }
1565 else if (select==4){
1566 // 30-second counter
1567 int64_t tmp1=rawvalue/120;
1568 int64_t tmp2=(rawvalue-120*tmp1)/2;
1569 out+=sprintf(out, "%"PRIu64"h+%02"PRIu64"m", tmp1, tmp2);
1570 }
1571 else
1572 // hours
1573 out+=sprintf(out, "%"PRIu64, rawvalue); //stored in hours
1574 break;
1575 // Load unload cycles
1576 case 193:
1577 if (select==1){
1578 // loadunload
1579 long load =attribute->raw[0] + (attribute->raw[1]<<8) + (attribute->raw[2]<<16);
1580 long unload=attribute->raw[3] + (attribute->raw[4]<<8) + (attribute->raw[5]<<16);
1581 out+=sprintf(out, "%lu/%lu", load, unload);
1582 }
1583 else
1584 // associated
1585 out+=sprintf(out, "%"PRIu64, rawvalue);
1586 break;
1587 // Temperature
1588 case 194:
1589 if (select==1){
1590 // ten times temperature in Celsius
1591 int deg=word[0]/10;
1592 int tenths=word[0]%10;
1593 out+=sprintf(out, "%d.%d", deg, tenths);
1594 }
1595 else if (select==2)
1596 // unknown attribute
1597 out+=sprintf(out, "%"PRIu64, rawvalue);
1598 else {
1599 out+=sprintf(out, "%d", word[0]);
1600 if (!(rawvalue==word[0])) {
1601 int min=word[1]<word[2]?word[1]:word[2];
1602 int max=word[1]>word[2]?word[1]:word[2];
1603 // The other bytes are in use. Try IBM's model
1604 out+=sprintf(out, " (Lifetime Min/Max %d/%d)", min, max);
1605 }
1606 }
1607 break;
1608 default:
1609 out+=sprintf(out, "%"PRIu64, rawvalue);
1610 }
1611
1612 // Return the full value
1613 return rawvalue;
1614 }
1615
1616
1617 // Note some attribute names appear redundant because different
1618 // manufacturers use different attribute IDs for an attribute with the
1619 // same name. The variable val should contain a non-zero value if a particular
1620 // attributes has a non-default interpretation.
1621 void ataPrintSmartAttribName(char *out, unsigned char id, unsigned char *definitions){
1622 char *name;
1623 unsigned char val;
1624
1625 // If no data array, use default interpretations
1626 if (definitions)
1627 val=definitions[id];
1628 else
1629 val=0;
1630
1631 switch (id){
1632
1633 case 1:
1634 name="Raw_Read_Error_Rate";
1635 break;
1636 case 2:
1637 name="Throughput_Performance";
1638 break;
1639 case 3:
1640 name="Spin_Up_Time";
1641 break;
1642 case 4:
1643 name="Start_Stop_Count";
1644 break;
1645 case 5:
1646 name="Reallocated_Sector_Ct";
1647 break;
1648 case 6:
1649 name="Read_Channel_Margin";
1650 break;
1651 case 7:
1652 name="Seek_Error_Rate";
1653 break;
1654 case 8:
1655 name="Seek_Time_Performance";
1656 break;
1657 case 9:
1658 switch (val) {
1659 case 1:
1660 name="Power_On_Minutes";
1661 break;
1662 case 2:
1663 name="Temperature_Celsius";
1664 break;
1665 case 3:
1666 name="Power_On_Seconds";
1667 break;
1668 case 4:
1669 name="Power_On_Half_Minutes";
1670 break;
1671 default:
1672 name="Power_On_Hours";
1673 break;
1674 }
1675 break;
1676 case 10:
1677 name="Spin_Retry_Count";
1678 break;
1679 case 11:
1680 name="Calibration_Retry_Count";
1681 break;
1682 case 12:
1683 name="Power_Cycle_Count";
1684 break;
1685 case 13:
1686 name="Read_Soft_Error_Rate";
1687 break;
1688 case 190:
1689 // Western Digital uses this for temperature.
1690 // It's identical to Attribute 194 except that it
1691 // has a failure threshold set to correspond to the
1692 // max allowed operating temperature of the drive, which
1693 // is typically 55C. So if this attribute has failed
1694 // in the past, it indicates that the drive temp exceeded
1695 // 55C sometime in the past.
1696 name="Temperature_Celsius";
1697 break;
1698 case 191:
1699 name="G-Sense_Error_Rate";
1700 break;
1701 case 192:
1702 switch (val) {
1703 case 1:
1704 // Fujitsu
1705 name="Emergency_Retract_Cycle_Ct";
1706 break;
1707 default:
1708 name="Power-Off_Retract_Count";
1709 break;
1710 }
1711 break;
1712 case 193:
1713 name="Load_Cycle_Count";
1714 break;
1715 case 194:
1716 switch (val){
1717 case 1:
1718 // Samsung SV1204H with RK100-13 firmware
1719 name="Temperature_Celsius_x10";
1720 break;
1721 case 2:
1722 // for disks with no temperature Attribute
1723 name="Unknown_Attribute";
1724 break;
1725 default:
1726 name="Temperature_Celsius";
1727 break;
1728 }
1729 break;
1730 case 195:
1731 // Fujitsu name="ECC_On_The_Fly_Count";
1732 name="Hardware_ECC_Recovered";
1733 break;
1734 case 196:
1735 name="Reallocated_Event_Count";
1736 break;
1737 case 197:
1738 name="Current_Pending_Sector";
1739 break;
1740 case 198:
1741 switch (val){
1742 case 1:
1743 // Fujitsu
1744 name="Off-line_Scan_UNC_Sector_Ct";
1745 break;
1746 default:
1747 name="Offline_Uncorrectable";
1748 break;
1749 }
1750 break;
1751 case 199:
1752 name="UDMA_CRC_Error_Count";
1753 break;
1754 case 200:
1755 switch (val) {
1756 case 1:
1757 // Fujitsu MHS2020AT
1758 name="Write_Error_Count";
1759 break;
1760 default:
1761 // Western Digital
1762 name="Multi_Zone_Error_Rate";
1763 break;
1764 }
1765 break;
1766 case 201:
1767 switch (val) {
1768 case 1:
1769 // Fujitsu
1770 name="Detected_TA_Count";
1771 break;
1772 default:
1773 name="Soft_Read_Error_Rate";
1774 break;
1775 }
1776 break;
1777 case 202:
1778 // Fujitsu
1779 name="TA_Increase_Count";
1780 // Maxtor: Data Address Mark Errors
1781 break;
1782 case 203:
1783 // Fujitsu
1784 name="Run_Out_Cancel";
1785 // Maxtor: ECC Errors
1786 break;
1787 case 204:
1788 // Fujitsu
1789 name="Shock_Count_Write_Opern";
1790 // Maxtor: Soft ECC Correction
1791 break;
1792 case 205:
1793 // Fujitsu
1794 name="Shock_Rate_Write_Opern";
1795 // Maxtor: Thermal Aspirates
1796 break;
1797 case 206:
1798 // Fujitsu
1799 name="Flying_Height";
1800 break;
1801 case 207:
1802 // Maxtor
1803 name="Spin_High_Current";
1804 break;
1805 case 208:
1806 // Maxtor
1807 name="Spin_Buzz";
1808 break;
1809 case 209:
1810 // Maxtor
1811 name="Offline_Seek_Performnce";
1812 break;
1813 case 220:
1814 switch (val) {
1815 case 1:
1816 name="Temperature_Celsius";
1817 break;
1818 default:
1819 name="Disk_Shift";
1820 break;
1821 }
1822 break;
1823 case 221:
1824 name="G-Sense_Error_Rate";
1825 break;
1826 case 222:
1827 name="Loaded_Hours";
1828 break;
1829 case 223:
1830 name="Load_Retry_Count";
1831 break;
1832 case 224:
1833 name="Load_Friction";
1834 break;
1835 case 225:
1836 name="Load_Cycle_Count";
1837 break;
1838 case 226:
1839 name="Load-in_Time";
1840 break;
1841 case 227:
1842 name="Torq-amp_Count";
1843 break;
1844 case 228:
1845 name="Power-off_Retract_Count";
1846 break;
1847 case 230:
1848 // seen in IBM DTPA-353750
1849 name="Head_Amplitude";
1850 break;
1851 case 231:
1852 name="Temperature_Celsius";
1853 break;
1854 case 240:
1855 name="Head_Flying_Hours";
1856 break;
1857 case 250:
1858 name="Read_Error_Retry_Rate";
1859 break;
1860 default:
1861 name="Unknown_Attribute";
1862 break;
1863 }
1864 sprintf(out,"%3hu %s",(short int)id,name);
1865 return;
1866 }
1867
1868 // Returns raw value of Attribute with ID==id. This will be in the
1869 // range 0 to 2^48-1 inclusive. If the Attribute does not exist,
1870 // return -1.
1871 int64_t ATAReturnAttributeRawValue(unsigned char id, struct ata_smart_values *data) {
1872 int i;
1873
1874 // valid Attribute IDs are in the range 1 to 255 inclusive.
1875 if (!id || !data)
1876 return -1;
1877
1878 // loop over Attributes to see if there is one with the desired ID
1879 for (i=0; i<NUMBER_ATA_SMART_ATTRIBUTES; i++) {
1880 struct ata_smart_attribute *ap = data->vendor_attributes + i;
1881 if (ap->id == id) {
1882 // we've found the desired Attribute. Return its value
1883 int64_t rawvalue=0;
1884 int j;
1885
1886 for (j=0; j<6; j++) {
1887 // This looks a bit roundabout, but is necessary. Don't
1888 // succumb to the temptation to use raw[j]<<(8*j) since under
1889 // the normal rules this will be promoted to the native type.
1890 // On a 32 bit machine this might then overflow.
1891 int64_t temp;
1892 temp = ap->raw[j];
1893 temp <<= 8*j;
1894 rawvalue |= temp;
1895 } // loop over j
1896 return rawvalue;
1897 } // found desired Attribute
1898 } // loop over Attributes
1899
1900 // fall-through: no such Attribute found
1901 return -1;
1902 }
1903
1904 // Return Temperature Attribute raw value selected according to possible
1905 // non-default interpretations. If the Attribute does not exist, return 0
1906 unsigned char ATAReturnTemperatureValue(/*const*/ struct ata_smart_values *data, const unsigned char *defs){
1907 int i;
1908 for (i = 0; i < 3; i++) {
1909 static const unsigned char ids[3] = {194, 9, 220};
1910 unsigned char id = ids[i];
1911 unsigned char select = (defs ? defs[id] : 0);
1912 int64_t raw; unsigned temp;
1913 if (!( (id == 194 && select <= 1) // ! -v 194,unknown
1914 || (id == 9 && select == 2) // -v 9,temp
1915 || (id == 220 && select == 1))) // -v 220,temp
1916 continue;
1917 raw = ATAReturnAttributeRawValue(id, data);
1918 if (raw < 0)
1919 continue;
1920 temp = (unsigned short)raw; // ignore possible min/max values in high words
1921 if (id == 194 && select == 1) // -v 194,10xCelsius
1922 temp = (temp+5) / 10;
1923 if (!(0 < temp && temp <= 255))
1924 continue;
1925 return temp;
1926 }
1927 // No valid attribute found
1928 return 0;
1929 }