aboutsummaryrefslogtreecommitdiff
path: root/libsmart_priv.h
diff options
context:
space:
mode:
Diffstat (limited to 'libsmart_priv.h')
-rw-r--r--libsmart_priv.h83
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