xref: /illumos-gate/usr/src/cmd/nvmeadm/nvmeadm_extsmart.c (revision f97471398e082e41a83d1e6879c77893cca0a4f4)
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