/*
 * linux/include/linux/hdsmart.h
 *
 * Copyright (C) 1999-2000	Michael Cornwell <cornwell@acm.org>
 * Copyright (C) 2000		Andre Hedrick <andre@linux-ide.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * You should have received a copy of the GNU General Public License
 * (for example /usr/src/linux/COPYING); if not, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#ifndef _LINUX_HDSMART_H
#define _LINUX_HDSMART_H

#define OFFLINE_FULL_SCAN		0
#define SHORT_SELF_TEST			1
#define EXTEND_SELF_TEST		2
#define SHORT_CAPTIVE_SELF_TEST		129
#define EXTEND_CAPTIVE_SELF_TEST	130

/* smart_attribute is the vendor specific in SFF-8035 spec */
typedef struct ata_smart_attribute_s {
	unsigned char			id;
	unsigned short			status_flag;
	unsigned char			normalized;
	unsigned char			worse_normal;
	unsigned char			raw[6];
	unsigned char			reserv;
} __attribute__ ((packed)) ata_smart_attribute_t;

/* smart_values is format of the read drive Atrribute command */
typedef struct ata_smart_values_s {
	unsigned short			revnumber;
	ata_smart_attribute_t		vendor_attributes [30];
        unsigned char			offline_data_collection_status;
        unsigned char			self_test_exec_status;
	unsigned short			total_time_to_complete_off_line;
	unsigned char			vendor_specific_366;
	unsigned char			offline_data_collection_capability;
	unsigned short			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			reserved_374_385 [12];
	unsigned char			vendor_specific_386_509 [125];
	unsigned char			chksum;
} __attribute__ ((packed)) ata_smart_values_t;

/* Smart Threshold data structures */
/* Vendor attribute of SMART Threshold */
typedef struct ata_smart_threshold_entry_s {
	unsigned char			id;
	unsigned char			normalized_threshold;
	unsigned char			reserved[10];
} __attribute__ ((packed)) ata_smart_threshold_entry_t;

/* Format of Read SMART THreshold Command */
typedef struct ata_smart_thresholds_s {
	unsigned short			revnumber;
	ata_smart_threshold_entry_t	thres_entries[30];
	unsigned char			reserved[149];
	unsigned char			chksum;
} __attribute__ ((packed)) ata_smart_thresholds_t;

typedef struct ata_smart_errorlog_command_struct_s {
	unsigned char			devicecontrolreg;
	unsigned char			featuresreg;
	unsigned char			sector_count;
	unsigned char			sector_number;
	unsigned char			cylinder_low;
	unsigned char			cylinder_high;
	unsigned char			drive_head;
	unsigned char			commandreg;
	unsigned int			timestamp;
} __attribute__ ((packed)) ata_smart_errorlog_command_struct_t;

typedef struct ata_smart_errorlog_error_struct_s {
	unsigned char			error_condition;
	unsigned char			extended_error[14];
	unsigned char			state;
	unsigned short			timestamp;
} __attribute__ ((packed)) ata_smart_errorlog_error_struct_t;

typedef struct ata_smart_errorlog_struct_s {
	ata_smart_errorlog_command_struct_t	commands[6];
	ata_smart_errorlog_error_struct_t	error_struct;
} __attribute__ ((packed)) ata_smart_errorlog_struct_t;

typedef struct ata_smart_errorlog_s {
	unsigned char			revnumber;
	unsigned char			error_log_pointer;
	ata_smart_errorlog_struct_t	errorlog_struct[5];
	unsigned short			ata_error_count;
	unsigned short			non_fatal_count;
	unsigned short			drive_timeout_count;
	unsigned char			reserved[53];
	unsigned char			chksum;
} __attribute__ ((packed)) ata_smart_errorlog_t;

typedef struct ata_smart_selftestlog_struct_s {
	unsigned char			selftestnumber;
	unsigned char			selfteststatus;
	unsigned short			timestamp;
	unsigned char			selftestfailurecheckpoint;
	unsigned int			lbafirstfailure;
	unsigned char			vendorspecific[15];
} __attribute__ ((packed)) ata_smart_selftestlog_struct_t;

typedef struct ata_smart_selftestlog_s {
	unsigned short			revnumber;
	ata_smart_selftestlog_struct_t	selftest_struct[21];
	unsigned char			vendorspecific[2];
	unsigned char			mostrecenttest;
	unsigned char			resevered[2];
	unsigned char			chksum;
} __attribute__ ((packed)) ata_smart_selftestlog_t;

#endif	/* _LINUX_HDSMART_H */
