1*7419d6e4SChuck Tuffli /* 2*7419d6e4SChuck Tuffli * Copyright (c) 2016-2021 Chuck Tuffli <chuck@tuffli.net> 3*7419d6e4SChuck Tuffli * 4*7419d6e4SChuck Tuffli * Permission to use, copy, modify, and distribute this software for any 5*7419d6e4SChuck Tuffli * purpose with or without fee is hereby granted, provided that the above 6*7419d6e4SChuck Tuffli * copyright notice and this permission notice appear in all copies. 7*7419d6e4SChuck Tuffli * 8*7419d6e4SChuck Tuffli * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*7419d6e4SChuck Tuffli * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*7419d6e4SChuck Tuffli * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*7419d6e4SChuck Tuffli * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*7419d6e4SChuck Tuffli * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*7419d6e4SChuck Tuffli * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*7419d6e4SChuck Tuffli * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*7419d6e4SChuck Tuffli */ 16*7419d6e4SChuck Tuffli #ifndef _LIBSMART_PRIV_H 17*7419d6e4SChuck Tuffli #define _LIBSMART_PRIV_H 18*7419d6e4SChuck Tuffli 19*7419d6e4SChuck Tuffli /* OS-independent structures and definitions internal to libsmart */ 20*7419d6e4SChuck Tuffli 21*7419d6e4SChuck Tuffli #define PAGE_ID_ATA_SMART_READ_DATA 0xd0 /* SMART Read Data */ 22*7419d6e4SChuck Tuffli #define PAGE_ID_ATA_SMART_RET_STATUS 0xda /* SMART Return Status */ 23*7419d6e4SChuck Tuffli 24*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_SUPPORTED_PAGES 0x00 25*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_WRITE_ERR 0x02 /* Write Error counter */ 26*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_READ_ERR 0x03 /* Read Error counter */ 27*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_VERIFY_ERR 0x05 /* Verify Error counter */ 28*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_NON_MEDIUM_ERR 0x06 /* Non-Medium Error */ 29*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_LAST_N_ERR 0x07 /* Last n Error events */ 30*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_TEMPERATURE 0x0d /* Temperature */ 31*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_START_STOP_CYCLE 0x0e /* Start-Stop Cycle counter */ 32*7419d6e4SChuck Tuffli #define PAGE_ID_SCSI_INFO_EXCEPTION 0x2f /* Informational Exceptions */ 33*7419d6e4SChuck Tuffli 34*7419d6e4SChuck Tuffli extern bool do_debug; 35*7419d6e4SChuck Tuffli 36*7419d6e4SChuck Tuffli #define dprintf(f, ...) if (do_debug) fprintf(stderr, "dbg: " f, ## __VA_ARGS__) 37*7419d6e4SChuck Tuffli 38*7419d6e4SChuck Tuffli /* General information about the device */ 39*7419d6e4SChuck Tuffli typedef struct smart_info_s { 40*7419d6e4SChuck Tuffli /* device supports SMART */ 41*7419d6e4SChuck Tuffli uint32_t supported:1, 42*7419d6e4SChuck Tuffli /* storage protocol is tunneled (e.g. ATA inside SCSI) */ 43*7419d6e4SChuck Tuffli tunneled:1, 44*7419d6e4SChuck Tuffli :30; 45*7419d6e4SChuck Tuffli /* 46*7419d6e4SChuck Tuffli * Device-provided information, including 47*7419d6e4SChuck Tuffli * - vendor name 48*7419d6e4SChuck Tuffli * - device / model 49*7419d6e4SChuck Tuffli * - firmware revision 50*7419d6e4SChuck Tuffli * - serial number 51*7419d6e4SChuck Tuffli * Protocols may provide a subset of this information 52*7419d6e4SChuck Tuffli */ 53*7419d6e4SChuck Tuffli char vendor[16], device[48], rev[16], serial[32]; 54*7419d6e4SChuck Tuffli } smart_info_t; 55*7419d6e4SChuck Tuffli 56*7419d6e4SChuck Tuffli /* List of pages providing SMART/health data */ 57*7419d6e4SChuck Tuffli typedef struct smart_page_list_s { 58*7419d6e4SChuck Tuffli uint32_t pg_count; 59*7419d6e4SChuck Tuffli struct { 60*7419d6e4SChuck Tuffli uint32_t id; 61*7419d6e4SChuck Tuffli size_t bytes; 62*7419d6e4SChuck Tuffli } pages[]; 63*7419d6e4SChuck Tuffli } smart_page_list_t; 64*7419d6e4SChuck Tuffli 65*7419d6e4SChuck Tuffli /* 66*7419d6e4SChuck Tuffli * The device handle (i.e. smart_h) is an opaque pointer to memory containing 67*7419d6e4SChuck Tuffli * device/OS independent and dependent data. The library uses type punning to 68*7419d6e4SChuck Tuffli * isolate the OS-independent portion (struct smart_s) from the OS-dependent 69*7419d6e4SChuck Tuffli * details. Because of this, the device layer allocates and frees this memory. 70*7419d6e4SChuck Tuffli */ 71*7419d6e4SChuck Tuffli typedef struct smart_s { 72*7419d6e4SChuck Tuffli smart_protocol_e protocol; 73*7419d6e4SChuck Tuffli smart_info_t info; 74*7419d6e4SChuck Tuffli smart_page_list_t *pg_list; 75*7419d6e4SChuck Tuffli /* Device / OS specific follows this structure */ 76*7419d6e4SChuck Tuffli } smart_t; 77*7419d6e4SChuck Tuffli 78*7419d6e4SChuck Tuffli /* Return a textual description of the ATA attribute */ 79*7419d6e4SChuck Tuffli const char * __smart_ata_desc(uint32_t page, uint32_t id); 80*7419d6e4SChuck Tuffli /* Return a textual description of the SCSI error attribute */ 81*7419d6e4SChuck Tuffli const char * __smart_scsi_err_desc(uint32_t id); 82*7419d6e4SChuck Tuffli 83*7419d6e4SChuck Tuffli #endif 84