1*f9747139SRobert Mustacchi /* 2*f9747139SRobert Mustacchi * This file and its contents are supplied under the terms of the 3*f9747139SRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 4*f9747139SRobert Mustacchi * You may only use this file in accordance with the terms of version 5*f9747139SRobert Mustacchi * 1.0 of the CDDL. 6*f9747139SRobert Mustacchi * 7*f9747139SRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 8*f9747139SRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 9*f9747139SRobert Mustacchi * http://www.illumos.org/license/CDDL. 10*f9747139SRobert Mustacchi */ 11*f9747139SRobert Mustacchi 12*f9747139SRobert Mustacchi /* 13*f9747139SRobert Mustacchi * Copyright 2026 Oxide Computer Company 14*f9747139SRobert Mustacchi */ 15*f9747139SRobert Mustacchi 16*f9747139SRobert Mustacchi /* 17*f9747139SRobert Mustacchi * Many vendors have followed the same layout for their Extended SMART data 18*f9747139SRobert Mustacchi * which usually is a 1 byte id, 1 byte normalized value, and 6ish bytes of 19*f9747139SRobert Mustacchi * data. This file contains the field data for printing those and the 20*f9747139SRobert Mustacchi * corresponding logs. 21*f9747139SRobert Mustacchi */ 22*f9747139SRobert Mustacchi 23*f9747139SRobert Mustacchi #include <sys/stddef.h> 24*f9747139SRobert Mustacchi #include <sys/sysmacros.h> 25*f9747139SRobert Mustacchi #include <sys/nvme/kioxia.h> 26*f9747139SRobert Mustacchi #include <sys/nvme/solidigm.h> 27*f9747139SRobert Mustacchi #include <sys/nvme/wdc.h> 28*f9747139SRobert Mustacchi 29*f9747139SRobert Mustacchi #include "nvmeadm.h" 30*f9747139SRobert Mustacchi 31*f9747139SRobert Mustacchi #define EXTSMART_F(f) \ 32*f9747139SRobert Mustacchi .nf_off = offsetof(solidigm_smart_ent_t, sse_##f), \ 33*f9747139SRobert Mustacchi .nf_len = sizeof (((solidigm_smart_ent_t *)NULL)->sse_##f) 34*f9747139SRobert Mustacchi 35*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_percent_fields[] = { { 36*f9747139SRobert Mustacchi EXTSMART_F(type), 37*f9747139SRobert Mustacchi .nf_short = "id", 38*f9747139SRobert Mustacchi .nf_desc = "Identifier", 39*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 40*f9747139SRobert Mustacchi }, { 41*f9747139SRobert Mustacchi EXTSMART_F(norm), 42*f9747139SRobert Mustacchi .nf_short = "norm", 43*f9747139SRobert Mustacchi .nf_desc = "Normalized", 44*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_PERCENT 45*f9747139SRobert Mustacchi }, { 46*f9747139SRobert Mustacchi EXTSMART_F(raw), 47*f9747139SRobert Mustacchi .nf_short = "raw", 48*f9747139SRobert Mustacchi .nf_desc = "Raw", 49*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 50*f9747139SRobert Mustacchi } }; 51*f9747139SRobert Mustacchi 52*f9747139SRobert Mustacchi /* 53*f9747139SRobert Mustacchi * All fields are just printed in hex. 54*f9747139SRobert Mustacchi */ 55*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_hex_fields[] = { { 56*f9747139SRobert Mustacchi EXTSMART_F(type), 57*f9747139SRobert Mustacchi .nf_short = "id", 58*f9747139SRobert Mustacchi .nf_desc = "Identifier", 59*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 60*f9747139SRobert Mustacchi }, { 61*f9747139SRobert Mustacchi EXTSMART_F(norm), 62*f9747139SRobert Mustacchi .nf_short = "norm", 63*f9747139SRobert Mustacchi .nf_desc = "Normalized", 64*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 65*f9747139SRobert Mustacchi }, { 66*f9747139SRobert Mustacchi EXTSMART_F(raw), 67*f9747139SRobert Mustacchi .nf_short = "raw", 68*f9747139SRobert Mustacchi .nf_desc = "Raw", 69*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 70*f9747139SRobert Mustacchi } }; 71*f9747139SRobert Mustacchi 72*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_wl_fields[] = { { 73*f9747139SRobert Mustacchi EXTSMART_F(type), 74*f9747139SRobert Mustacchi .nf_short = "id", 75*f9747139SRobert Mustacchi .nf_desc = "Identifier", 76*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 77*f9747139SRobert Mustacchi }, { 78*f9747139SRobert Mustacchi EXTSMART_F(norm), 79*f9747139SRobert Mustacchi .nf_short = "norm", 80*f9747139SRobert Mustacchi .nf_desc = "Normalized", 81*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_PERCENT 82*f9747139SRobert Mustacchi }, { 83*f9747139SRobert Mustacchi .nf_off = offsetof(solidigm_smart_ent_t, sse_raw[0]), 84*f9747139SRobert Mustacchi .nf_len = 2, 85*f9747139SRobert Mustacchi .nf_short = "min", 86*f9747139SRobert Mustacchi .nf_desc = "Minimum Erase Cycles", 87*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 88*f9747139SRobert Mustacchi }, { 89*f9747139SRobert Mustacchi .nf_off = offsetof(solidigm_smart_ent_t, sse_raw[2]), 90*f9747139SRobert Mustacchi .nf_len = 2, 91*f9747139SRobert Mustacchi .nf_short = "max", 92*f9747139SRobert Mustacchi .nf_desc = "Maximum Erase Cycles", 93*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 94*f9747139SRobert Mustacchi }, { 95*f9747139SRobert Mustacchi .nf_off = offsetof(solidigm_smart_ent_t, sse_raw[4]), 96*f9747139SRobert Mustacchi .nf_len = 2, 97*f9747139SRobert Mustacchi .nf_short = "avg", 98*f9747139SRobert Mustacchi .nf_desc = "Average Erase Cycles", 99*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 100*f9747139SRobert Mustacchi } }; 101*f9747139SRobert Mustacchi 102*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_32mio_fields[] = { { 103*f9747139SRobert Mustacchi EXTSMART_F(type), 104*f9747139SRobert Mustacchi .nf_short = "id", 105*f9747139SRobert Mustacchi .nf_desc = "Identifier", 106*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 107*f9747139SRobert Mustacchi }, { 108*f9747139SRobert Mustacchi EXTSMART_F(norm), 109*f9747139SRobert Mustacchi .nf_short = "norm", 110*f9747139SRobert Mustacchi .nf_desc = "Normalized", 111*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 112*f9747139SRobert Mustacchi }, { 113*f9747139SRobert Mustacchi EXTSMART_F(raw), 114*f9747139SRobert Mustacchi .nf_short = "raw", 115*f9747139SRobert Mustacchi .nf_desc = "Raw", 116*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_BYTES, 117*f9747139SRobert Mustacchi .nf_addend = { .nfa_shift = 25 } 118*f9747139SRobert Mustacchi } }; 119*f9747139SRobert Mustacchi 120*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_rawpct_fields[] = { { 121*f9747139SRobert Mustacchi EXTSMART_F(type), 122*f9747139SRobert Mustacchi .nf_short = "id", 123*f9747139SRobert Mustacchi .nf_desc = "Identifier", 124*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 125*f9747139SRobert Mustacchi }, { 126*f9747139SRobert Mustacchi EXTSMART_F(norm), 127*f9747139SRobert Mustacchi .nf_short = "norm", 128*f9747139SRobert Mustacchi .nf_desc = "Normalized", 129*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 130*f9747139SRobert Mustacchi }, { 131*f9747139SRobert Mustacchi EXTSMART_F(raw), 132*f9747139SRobert Mustacchi .nf_short = "raw", 133*f9747139SRobert Mustacchi .nf_desc = "Raw", 134*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_PERCENT, 135*f9747139SRobert Mustacchi } }; 136*f9747139SRobert Mustacchi 137*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_rawmin_fields[] = { { 138*f9747139SRobert Mustacchi EXTSMART_F(type), 139*f9747139SRobert Mustacchi .nf_short = "id", 140*f9747139SRobert Mustacchi .nf_desc = "Identifier", 141*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 142*f9747139SRobert Mustacchi }, { 143*f9747139SRobert Mustacchi EXTSMART_F(norm), 144*f9747139SRobert Mustacchi .nf_short = "norm", 145*f9747139SRobert Mustacchi .nf_desc = "Normalized", 146*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 147*f9747139SRobert Mustacchi }, { 148*f9747139SRobert Mustacchi EXTSMART_F(raw), 149*f9747139SRobert Mustacchi .nf_short = "raw", 150*f9747139SRobert Mustacchi .nf_desc = "Raw", 151*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_UNIT, 152*f9747139SRobert Mustacchi .nf_addend = { .nfa_unit = "min" } 153*f9747139SRobert Mustacchi } }; 154*f9747139SRobert Mustacchi 155*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_rawhour_fields[] = { { 156*f9747139SRobert Mustacchi EXTSMART_F(type), 157*f9747139SRobert Mustacchi .nf_short = "id", 158*f9747139SRobert Mustacchi .nf_desc = "Identifier", 159*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 160*f9747139SRobert Mustacchi }, { 161*f9747139SRobert Mustacchi EXTSMART_F(norm), 162*f9747139SRobert Mustacchi .nf_short = "norm", 163*f9747139SRobert Mustacchi .nf_desc = "Normalized", 164*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 165*f9747139SRobert Mustacchi }, { 166*f9747139SRobert Mustacchi EXTSMART_F(raw), 167*f9747139SRobert Mustacchi .nf_short = "raw", 168*f9747139SRobert Mustacchi .nf_desc = "Raw", 169*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_UNIT, 170*f9747139SRobert Mustacchi .nf_addend = { .nfa_unit = "hours" } 171*f9747139SRobert Mustacchi } }; 172*f9747139SRobert Mustacchi 173*f9747139SRobert Mustacchi static const nvmeadm_field_t extsmart_therm_fields[] = { { 174*f9747139SRobert Mustacchi EXTSMART_F(type), 175*f9747139SRobert Mustacchi .nf_short = "id", 176*f9747139SRobert Mustacchi .nf_desc = "Identifier", 177*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 178*f9747139SRobert Mustacchi }, { 179*f9747139SRobert Mustacchi EXTSMART_F(norm), 180*f9747139SRobert Mustacchi .nf_short = "norm", 181*f9747139SRobert Mustacchi .nf_desc = "Normalized", 182*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 183*f9747139SRobert Mustacchi }, { 184*f9747139SRobert Mustacchi .nf_off = offsetof(solidigm_smart_ent_t, sse_raw[0]), 185*f9747139SRobert Mustacchi .nf_len = 1, 186*f9747139SRobert Mustacchi .nf_short = "status", 187*f9747139SRobert Mustacchi .nf_desc = "Throttle Status", 188*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_PERCENT 189*f9747139SRobert Mustacchi }, { 190*f9747139SRobert Mustacchi .nf_off = offsetof(solidigm_smart_ent_t, sse_raw[1]), 191*f9747139SRobert Mustacchi .nf_len = 4, 192*f9747139SRobert Mustacchi .nf_short = "count", 193*f9747139SRobert Mustacchi .nf_desc = "Throttle Count", 194*f9747139SRobert Mustacchi .nf_type = NVMEADM_FT_HEX 195*f9747139SRobert Mustacchi } }; 196*f9747139SRobert Mustacchi 197*f9747139SRobert Mustacchi #define WDC_F_SMART(f) \ 198*f9747139SRobert Mustacchi .nf_off = offsetof(wdc_vul_sn65x_smart_t, sm_##f), \ 199*f9747139SRobert Mustacchi .nf_len = sizeof (((wdc_vul_sn65x_smart_t *)NULL)->sm_##f) 200*f9747139SRobert Mustacchi 201*f9747139SRobert Mustacchi static const nvmeadm_field_t wdc_vul_cusmart_fields[] = { { 202*f9747139SRobert Mustacchi WDC_F_SMART(prog_fail), 203*f9747139SRobert Mustacchi .nf_short = "pfc", 204*f9747139SRobert Mustacchi .nf_desc = "Program Fail Count", 205*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_percent_fields) 206*f9747139SRobert Mustacchi }, { 207*f9747139SRobert Mustacchi WDC_F_SMART(erase_fail), 208*f9747139SRobert Mustacchi .nf_short = "efc", 209*f9747139SRobert Mustacchi .nf_desc = "Erase Fail Count", 210*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_percent_fields) 211*f9747139SRobert Mustacchi }, { 212*f9747139SRobert Mustacchi WDC_F_SMART(wear_level), 213*f9747139SRobert Mustacchi .nf_short = "wl", 214*f9747139SRobert Mustacchi .nf_desc = "Wear Leveling", 215*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_wl_fields) 216*f9747139SRobert Mustacchi }, { 217*f9747139SRobert Mustacchi WDC_F_SMART(e2e_edet), 218*f9747139SRobert Mustacchi .nf_short = "e2e", 219*f9747139SRobert Mustacchi .nf_desc = "End-to-End Error Detection Count", 220*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 221*f9747139SRobert Mustacchi }, { 222*f9747139SRobert Mustacchi WDC_F_SMART(crc_err), 223*f9747139SRobert Mustacchi .nf_short = "crc", 224*f9747139SRobert Mustacchi .nf_desc = "CRC Error Count", 225*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 226*f9747139SRobert Mustacchi }, { 227*f9747139SRobert Mustacchi WDC_F_SMART(timed_wear), 228*f9747139SRobert Mustacchi .nf_short = "twmw", 229*f9747139SRobert Mustacchi .nf_desc = "Timed Workload Media Wear", 230*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 231*f9747139SRobert Mustacchi }, { 232*f9747139SRobert Mustacchi WDC_F_SMART(timed_read), 233*f9747139SRobert Mustacchi .nf_short = "twhr", 234*f9747139SRobert Mustacchi .nf_desc = "Timed Workload Host Reads", 235*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_rawpct_fields) 236*f9747139SRobert Mustacchi }, { 237*f9747139SRobert Mustacchi WDC_F_SMART(timed_timer), 238*f9747139SRobert Mustacchi .nf_short = "twt", 239*f9747139SRobert Mustacchi .nf_desc = "Timed Workload Timer", 240*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_rawmin_fields) 241*f9747139SRobert Mustacchi }, { 242*f9747139SRobert Mustacchi WDC_F_SMART(therm_throt), 243*f9747139SRobert Mustacchi .nf_short = "tthrot", 244*f9747139SRobert Mustacchi .nf_desc = "Thermal Throttle", 245*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_therm_fields) 246*f9747139SRobert Mustacchi }, { 247*f9747139SRobert Mustacchi WDC_F_SMART(retry_buf_over), 248*f9747139SRobert Mustacchi .nf_short = "rboc", 249*f9747139SRobert Mustacchi .nf_desc = "Retry Buffer Overflow Count", 250*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 251*f9747139SRobert Mustacchi }, { 252*f9747139SRobert Mustacchi WDC_F_SMART(pll_lock_loss), 253*f9747139SRobert Mustacchi .nf_short = "pllll", 254*f9747139SRobert Mustacchi .nf_desc = "PLL Lock Loss Count", 255*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 256*f9747139SRobert Mustacchi }, { 257*f9747139SRobert Mustacchi WDC_F_SMART(nand_write), 258*f9747139SRobert Mustacchi .nf_short = "nbw", 259*f9747139SRobert Mustacchi .nf_desc = "NAND Bytes Written", 260*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_32mio_fields) 261*f9747139SRobert Mustacchi }, { 262*f9747139SRobert Mustacchi WDC_F_SMART(host_write), 263*f9747139SRobert Mustacchi .nf_short = "hbw", 264*f9747139SRobert Mustacchi .nf_desc = "Host Bytes Written", 265*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_32mio_fields) 266*f9747139SRobert Mustacchi } }; 267*f9747139SRobert Mustacchi 268*f9747139SRobert Mustacchi const nvmeadm_log_field_info_t wdc_vul_cusmart_field_info = { 269*f9747139SRobert Mustacchi .nlfi_log = "wdc/cusmart", 270*f9747139SRobert Mustacchi .nlfi_fields = wdc_vul_cusmart_fields, 271*f9747139SRobert Mustacchi .nlfi_nfields = ARRAY_SIZE(wdc_vul_cusmart_fields), 272*f9747139SRobert Mustacchi .nlfi_min = sizeof (wdc_vul_sn65x_smart_t) 273*f9747139SRobert Mustacchi }; 274*f9747139SRobert Mustacchi 275*f9747139SRobert Mustacchi 276*f9747139SRobert Mustacchi #define KIOXIA_F_SMART(f) \ 277*f9747139SRobert Mustacchi .nf_off = offsetof(kioxia_vul_cd8_smart_t, cds_##f), \ 278*f9747139SRobert Mustacchi .nf_len = sizeof (((kioxia_vul_cd8_smart_t *)NULL)->cds_##f) 279*f9747139SRobert Mustacchi 280*f9747139SRobert Mustacchi static const nvmeadm_field_t kioxia_vul_extsmart_fields[] = { { 281*f9747139SRobert Mustacchi KIOXIA_F_SMART(prog_fail), 282*f9747139SRobert Mustacchi .nf_short = "pfc", 283*f9747139SRobert Mustacchi .nf_desc = "Program Fail Count", 284*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_percent_fields) 285*f9747139SRobert Mustacchi }, { 286*f9747139SRobert Mustacchi KIOXIA_F_SMART(erase_fail), 287*f9747139SRobert Mustacchi .nf_short = "efc", 288*f9747139SRobert Mustacchi .nf_desc = "Erase Fail Count", 289*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_percent_fields) 290*f9747139SRobert Mustacchi }, { 291*f9747139SRobert Mustacchi KIOXIA_F_SMART(wear_level), 292*f9747139SRobert Mustacchi .nf_short = "wl", 293*f9747139SRobert Mustacchi .nf_desc = "Wear Leveling", 294*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_wl_fields) 295*f9747139SRobert Mustacchi }, { 296*f9747139SRobert Mustacchi KIOXIA_F_SMART(e2e_det), 297*f9747139SRobert Mustacchi .nf_short = "e2e", 298*f9747139SRobert Mustacchi .nf_desc = "End-to-End Error Detection Count", 299*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 300*f9747139SRobert Mustacchi }, { 301*f9747139SRobert Mustacchi KIOXIA_F_SMART(crc_error), 302*f9747139SRobert Mustacchi .nf_short = "crc", 303*f9747139SRobert Mustacchi .nf_desc = "CRC Error Count", 304*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 305*f9747139SRobert Mustacchi }, { 306*f9747139SRobert Mustacchi KIOXIA_F_SMART(nand_write), 307*f9747139SRobert Mustacchi .nf_short = "nbw", 308*f9747139SRobert Mustacchi .nf_desc = "NAND Bytes Written", 309*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_32mio_fields) 310*f9747139SRobert Mustacchi }, { 311*f9747139SRobert Mustacchi KIOXIA_F_SMART(host_write), 312*f9747139SRobert Mustacchi .nf_short = "hbw", 313*f9747139SRobert Mustacchi .nf_desc = "Host Bytes Written", 314*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_32mio_fields) 315*f9747139SRobert Mustacchi }, { 316*f9747139SRobert Mustacchi /* 317*f9747139SRobert Mustacchi * The remaining fields (other than host bytes read) are duplicates from 318*f9747139SRobert Mustacchi * the normal NVMe Health log so we use the standard's name and short 319*f9747139SRobert Mustacchi * values. 320*f9747139SRobert Mustacchi */ 321*f9747139SRobert Mustacchi KIOXIA_F_SMART(crit_warn), 322*f9747139SRobert Mustacchi .nf_short = "cw", 323*f9747139SRobert Mustacchi .nf_desc = "Device Critical Warning", 324*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 325*f9747139SRobert Mustacchi }, { 326*f9747139SRobert Mustacchi KIOXIA_F_SMART(host_read), 327*f9747139SRobert Mustacchi .nf_short = "hbr", 328*f9747139SRobert Mustacchi .nf_desc = "Host Bytes Read", 329*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_32mio_fields) 330*f9747139SRobert Mustacchi }, { 331*f9747139SRobert Mustacchi KIOXIA_F_SMART(comp_temp), 332*f9747139SRobert Mustacchi .nf_short = "ctemp", 333*f9747139SRobert Mustacchi .nf_desc = "Composite Temperature", 334*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 335*f9747139SRobert Mustacchi }, { 336*f9747139SRobert Mustacchi KIOXIA_F_SMART(life_used), 337*f9747139SRobert Mustacchi .nf_short = "pused", 338*f9747139SRobert Mustacchi .nf_desc = "Percentage Used", 339*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_percent_fields) 340*f9747139SRobert Mustacchi }, { 341*f9747139SRobert Mustacchi KIOXIA_F_SMART(power_cycles), 342*f9747139SRobert Mustacchi .nf_short = "pwrc", 343*f9747139SRobert Mustacchi .nf_desc = "Power Cycles", 344*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 345*f9747139SRobert Mustacchi }, { 346*f9747139SRobert Mustacchi KIOXIA_F_SMART(power_hours), 347*f9747139SRobert Mustacchi .nf_short = "poh", 348*f9747139SRobert Mustacchi .nf_desc = "Power On Hours", 349*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_rawhour_fields) 350*f9747139SRobert Mustacchi }, { 351*f9747139SRobert Mustacchi KIOXIA_F_SMART(unsafe_shut), 352*f9747139SRobert Mustacchi .nf_short = "upl", 353*f9747139SRobert Mustacchi .nf_desc = "Unexpected Power Losses", 354*f9747139SRobert Mustacchi NVMEADM_F_FIELDS(extsmart_hex_fields) 355*f9747139SRobert Mustacchi } }; 356*f9747139SRobert Mustacchi 357*f9747139SRobert Mustacchi const nvmeadm_log_field_info_t kioxia_vul_extsmart_field_info = { 358*f9747139SRobert Mustacchi .nlfi_log = "kioxia/extsmart", 359*f9747139SRobert Mustacchi .nlfi_fields = kioxia_vul_extsmart_fields, 360*f9747139SRobert Mustacchi .nlfi_nfields = ARRAY_SIZE(kioxia_vul_extsmart_fields), 361*f9747139SRobert Mustacchi .nlfi_min = sizeof (kioxia_vul_cd8_smart_t) 362*f9747139SRobert Mustacchi }; 363