1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * linux/include/linux/hdsmart.h 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org> 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (C) 2000 Andre Hedrick <andre@linux-ide.org> 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This program is free software; you can redistribute it and/or modify 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * it under the terms of the GNU General Public License as published by 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * the Free Software Foundation; either version 2, or (at your option) 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * any later version. 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * You should have received a copy of the GNU General Public License 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * (for example /usr/src/linux/COPYING); if not, write to the Free 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_HDSMART_H 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_HDSMART_H 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define OFFLINE_FULL_SCAN 0 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SHORT_SELF_TEST 1 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define EXTEND_SELF_TEST 2 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define SHORT_CAPTIVE_SELF_TEST 129 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define EXTEND_CAPTIVE_SELF_TEST 130 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* smart_attribute is the vendor specific in SFF-8035 spec */ 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_attribute_s { 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char id; 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short status_flag; 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char normalized; 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char worse_normal; 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char raw[6]; 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char reserv; 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_attribute_t; 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* smart_values is format of the read drive Atrribute command */ 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_values_s { 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short revnumber; 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ata_smart_attribute_t vendor_attributes [30]; 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char offline_data_collection_status; 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char self_test_exec_status; 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short total_time_to_complete_off_line; 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char vendor_specific_366; 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char offline_data_collection_capability; 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short smart_capability; 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char errorlog_capability; 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char vendor_specific_371; 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char short_test_completion_time; 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char extend_test_completion_time; 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char reserved_374_385 [12]; 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char vendor_specific_386_509 [125]; 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char chksum; 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_values_t; 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Smart Threshold data structures */ 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Vendor attribute of SMART Threshold */ 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_threshold_entry_s { 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char id; 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char normalized_threshold; 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char reserved[10]; 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_threshold_entry_t; 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Format of Read SMART THreshold Command */ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_thresholds_s { 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short revnumber; 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ata_smart_threshold_entry_t thres_entries[30]; 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char reserved[149]; 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char chksum; 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_thresholds_t; 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_errorlog_command_struct_s { 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char devicecontrolreg; 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char featuresreg; 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char sector_count; 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char sector_number; 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char cylinder_low; 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char cylinder_high; 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char drive_head; 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char commandreg; 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int timestamp; 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_errorlog_command_struct_t; 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_errorlog_error_struct_s { 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char error_condition; 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char extended_error[14]; 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char state; 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short timestamp; 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_errorlog_error_struct_t; 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_errorlog_struct_s { 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ata_smart_errorlog_command_struct_t commands[6]; 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ata_smart_errorlog_error_struct_t error_struct; 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_errorlog_struct_t; 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_errorlog_s { 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char revnumber; 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char error_log_pointer; 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ata_smart_errorlog_struct_t errorlog_struct[5]; 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short ata_error_count; 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short non_fatal_count; 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short drive_timeout_count; 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char reserved[53]; 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char chksum; 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_errorlog_t; 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_selftestlog_struct_s { 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char selftestnumber; 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char selfteststatus; 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short timestamp; 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char selftestfailurecheckpoint; 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned int lbafirstfailure; 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char vendorspecific[15]; 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_selftestlog_struct_t; 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutypedef struct ata_smart_selftestlog_s { 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned short revnumber; 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru ata_smart_selftestlog_struct_t selftest_struct[21]; 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char vendorspecific[2]; 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char mostrecenttest; 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char resevered[2]; 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru unsigned char chksum; 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} __attribute__ ((packed)) ata_smart_selftestlog_t; 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif /* _LINUX_HDSMART_H */ 125