diff options
Diffstat (limited to 'libsmart_priv.h')
| -rw-r--r-- | libsmart_priv.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/libsmart_priv.h b/libsmart_priv.h new file mode 100644 index 000000000000..f29fc1e1e033 --- /dev/null +++ b/libsmart_priv.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2016-2021 Chuck Tuffli <chuck@tuffli.net> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +#ifndef _LIBSMART_PRIV_H +#define _LIBSMART_PRIV_H + +/* OS-independent structures and definitions internal to libsmart */ + +#define PAGE_ID_ATA_SMART_READ_DATA 0xd0 /* SMART Read Data */ +#define PAGE_ID_ATA_SMART_RET_STATUS 0xda /* SMART Return Status */ + +#define PAGE_ID_SCSI_SUPPORTED_PAGES 0x00 +#define PAGE_ID_SCSI_WRITE_ERR 0x02 /* Write Error counter */ +#define PAGE_ID_SCSI_READ_ERR 0x03 /* Read Error counter */ +#define PAGE_ID_SCSI_VERIFY_ERR 0x05 /* Verify Error counter */ +#define PAGE_ID_SCSI_NON_MEDIUM_ERR 0x06 /* Non-Medium Error */ +#define PAGE_ID_SCSI_LAST_N_ERR 0x07 /* Last n Error events */ +#define PAGE_ID_SCSI_TEMPERATURE 0x0d /* Temperature */ +#define PAGE_ID_SCSI_START_STOP_CYCLE 0x0e /* Start-Stop Cycle counter */ +#define PAGE_ID_SCSI_INFO_EXCEPTION 0x2f /* Informational Exceptions */ + +extern bool do_debug; + +#define dprintf(f, ...) if (do_debug) fprintf(stderr, "dbg: " f, ## __VA_ARGS__) + +/* General information about the device */ +typedef struct smart_info_s { + /* device supports SMART */ + uint32_t supported:1, + /* storage protocol is tunneled (e.g. ATA inside SCSI) */ + tunneled:1, + :30; + /* + * Device-provided information, including + * - vendor name + * - device / model + * - firmware revision + * - serial number + * Protocols may provide a subset of this information + */ + char vendor[16], device[48], rev[16], serial[32]; +} smart_info_t; + +/* List of pages providing SMART/health data */ +typedef struct smart_page_list_s { + uint32_t pg_count; + struct { + uint32_t id; + size_t bytes; + } pages[]; +} smart_page_list_t; + +/* + * The device handle (i.e. smart_h) is an opaque pointer to memory containing + * device/OS independent and dependent data. The library uses type punning to + * isolate the OS-independent portion (struct smart_s) from the OS-dependent + * details. Because of this, the device layer allocates and frees this memory. + */ +typedef struct smart_s { + smart_protocol_e protocol; + smart_info_t info; + smart_page_list_t *pg_list; + /* Device / OS specific follows this structure */ +} smart_t; + +/* Return a textual description of the ATA attribute */ +const char * __smart_ata_desc(uint32_t page, uint32_t id); +/* Return a textual description of the SCSI error attribute */ +const char * __smart_scsi_err_desc(uint32_t id); + +#endif |
