xref: /dragonfly/sbin/nvmectl/subs.c (revision 65cc0652)
1 /*
2  * Copyright (c) 2016 The DragonFly Project.  All rights reserved.
3  *
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@backplane.com>
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 #include "nvmectl.h"
36 
37 const char *
38 format_number(uint64_t value)
39 {
40 	static char buf[8];
41 
42 	humanize_number(buf, sizeof(buf), value, "",
43 			 HN_AUTOSCALE, HN_DIVISOR_1000 | HN_NOSPACE);
44 
45 	return buf;
46 }
47 
48 const char *
49 status_to_str(uint16_t status)
50 {
51 	static char buf[64];
52 	int code = NVME_COMQ_STATUS_CODE_GET(status);
53 	const char *msg = NULL;
54 
55 	switch(NVME_COMQ_STATUS_TYPE_GET(status)) {
56 	case NVME_STATUS_TYPE_GENERIC:
57 		switch(code) {
58 		case NVME_CODE_SUCCESS:
59 			msg = "SUCCESS";
60 			break;
61 		case NVME_CODE_BADOP:
62 			msg = "Bad Op";
63 			break;
64 		case NVME_CODE_BADFIELD:
65 			msg = "Bad Field";
66 			break;
67 		case NVME_CODE_IDCONFLICT:
68 			msg = "ID Conflict";
69 			break;
70 		case NVME_CODE_BADXFER:
71 			msg = "Bad XFer";
72 			break;
73 		case NVME_CODE_ABORTED_PWRLOSS:
74 			msg = "Abort on Power Loss";
75 			break;
76 		case NVME_CODE_INTERNAL:
77 			msg = "Internal Error";
78 			break;
79 		case NVME_CODE_ABORTED_ONREQ:
80 			msg = "Abort on Request";
81 			break;
82 		case NVME_CODE_ABORTED_SQDEL:
83 			msg = "Abort on SubQ Deletion";
84 			break;
85 		case NVME_CODE_ABORTED_FUSEFAIL:
86 			msg = "Abort on Fuse Failed";
87 			break;
88 		case NVME_CODE_ABORTED_FUSEMISSING:
89 			msg = "Abort on Fuse Missing";
90 			break;
91 		case NVME_CODE_BADNAMESPACE:
92 			msg = "Bad Namespace";
93 			break;
94 		case NVME_CODE_SEQERROR:
95 			msg = "Seq Error";
96 			break;
97 		case NVME_CODE_BADSGLSEG:
98 			msg = "Bad SGL Segment";
99 			break;
100 		case NVME_CODE_BADSGLCNT:
101 			msg = "Bad SGL Count";
102 			break;
103 		case NVME_CODE_BADSGLLEN:
104 			msg = "Bad SGL Length";
105 			break;
106 		case NVME_CODE_BADSGLMLEN:
107 			msg = "Bad SGL MLength";
108 			break;
109 		case NVME_CODE_BADSGLTYPE:
110 			msg = "Bad SGL Type";
111 			break;
112 		case NVME_CODE_BADMEMBUFUSE:
113 			msg = "Bad Memory Buffer Usage";
114 			break;
115 		case NVME_CODE_BADPRPOFF:
116 			msg = "Bad PRP Offset";
117 			break;
118 		case NVME_CODE_ATOMICWUOVFL:
119 			msg = "Atomic Write Overflow";
120 			break;
121 		case NVME_CODE_LBA_RANGE:
122 			msg = "LBA Out of Range";
123 			break;
124 		case NVME_CODE_CAP_EXCEEDED:
125 			msg = "Capacity Exceeded";
126 			break;
127 		case NVME_CODE_NAM_NOT_READY:
128 			msg = "Namespace not Ready";
129 			break;
130 		case NVME_CODE_RSV_CONFLICT:
131 			msg = "Reservation Conflict";
132 			break;
133 		case NVME_CODE_FMT_IN_PROG:
134 			msg = "Format in Progress";
135 			break;
136 		default:
137 			snprintf(buf, sizeof(buf), "generic(0x%02x)", code);
138 			break;
139 		}
140 		break;
141 	case NVME_STATUS_TYPE_SPECIFIC:
142 		switch(code) {
143 		case NVME_CSSCODE_BADCOMQ:
144 			msg = "Bad Completion Queue";
145 			break;
146 		case NVME_CSSCODE_BADQID:
147 			msg = "Bad Queue ID";
148 			break;
149 		case NVME_CSSCODE_BADQSIZE:
150 			msg = "Bad Queue Size";
151 			break;
152 		case NVME_CSSCODE_ABORTLIM:
153 			msg = "Too many Aborts";
154 			break;
155 		case NVME_CSSCODE_RESERVED04:
156 			msg = "reserved04";
157 			break;
158 		case NVME_CSSCODE_ASYNCEVENTLIM:
159 			msg = "Too many Async Events";
160 			break;
161 		case NVME_CSSCODE_BADFWSLOT:
162 			msg = "Bad Firmware Slot";
163 			break;
164 		case NVME_CSSCODE_BADFWIMAGE:
165 			msg = "Bad Firmware Image";
166 			break;
167 		case NVME_CSSCODE_BADINTRVECT:
168 			msg = "Bad Interrupt Vector";
169 			break;
170 		case NVME_CSSCODE_BADLOGPAGE:
171 			msg = "Unsupported Log Page";
172 			break;
173 		case NVME_CSSCODE_BADFORMAT:
174 			msg = "Bad Format Command";
175 			break;
176 		case NVME_CSSCODE_FW_NEEDSCONVRESET:
177 			msg = "Firmware Activation Needs Conventional Reset";
178 			break;
179 		case NVME_CSSCODE_BADQDELETE:
180 			msg = "Bad Queue Delete";
181 			break;
182 		case NVME_CSSCODE_FEAT_NOT_SAVEABLE:
183 			msg = "Feature not Saveable";
184 			break;
185 		case NVME_CSSCODE_FEAT_NOT_CHGABLE:
186 			msg = "Feature not Changeable";
187 			break;
188 		case NVME_CSSCODE_FEAT_NOT_NSSPEC:
189 			msg = "Feature not Namespace-Specific";
190 			break;
191 		case NVME_CSSCODE_FW_NEEDSSUBRESET:
192 			msg = "Firmware Activation Needs Subsystem Reset";
193 			break;
194 		case NVME_CSSCODE_FW_NEEDSRESET:
195 			msg = "Firmware Activation Needs Reset";
196 			break;
197 		case NVME_CSSCODE_FW_NEEDSMAXTVIOLATE:
198 			msg = "Firmware Activation Requires "
199 				"Maximum Time Violation";
200 			break;
201 		case NVME_CSSCODE_FW_PROHIBITED:
202 			msg = "Firmware Activation Prohibited";
203 			break;
204 		case NVME_CSSCODE_RANGE_OVERLAP:
205 			msg = "Overlapping Range";
206 			break;
207 		case NVME_CSSCODE_NAM_INSUFF_CAP:
208 			msg = "Insufficient Capacity";
209 			break;
210 		case NVME_CSSCODE_NAM_ID_UNAVAIL:
211 			msg = "NSID is not Available";
212 			break;
213 		case NVME_CSSCODE_RESERVED17:
214 			msg = "reserved17";
215 			break;
216 		case NVME_CSSCODE_NAM_ALREADY_ATT:
217 			msg = "NSID Already Attached";
218 			break;
219 		case NVME_CSSCODE_NAM_IS_PRIVATE:
220 			msg = "NSID is Private";
221 			break;
222 		case NVME_CSSCODE_NAM_NOT_ATT:
223 			msg = "NSID Not Attached";
224 			break;
225 		case NVME_CSSCODE_NO_THIN_PROVISION:
226 			msg = "This Provisioning not Supported";
227 			break;
228 		case NVME_CSSCODE_CTLR_LIST_INVALID:
229 			msg = "Controller List Invalid";
230 			break;
231 		case NVME_CSSCODE_ATTR_CONFLICT:
232 			msg = "Conflicting Attributes";
233 			break;
234 		case NVME_CSSCODE_BADPROTINFO:
235 			msg = "Invalid Prortection Information";
236 			break;
237 		case NVME_CSSCODE_WRITE_TO_RDONLY:
238 			msg = "Attempted Write to Read Only Range";
239 			break;
240 		default:
241 			snprintf(buf, sizeof(buf), "specific(0x%02x)", code);
242 			break;
243 		}
244 		break;
245 	case NVME_STATUS_TYPE_MEDIA:
246 		switch(code) {
247 		case NVME_MEDCODE_WRITE_FAULT:
248 			msg = "Write Fault";
249 			break;
250 		case NVME_MEDCODE_UNRECOV_READ_ERROR:
251 			msg = "Unrecoverable Read Error";
252 			break;
253 		case NVME_MEDCODE_ETOE_GUARD_CHK:
254 			msg = "End-to-End Guard Check Fail";
255 			break;
256 		case NVME_MEDCODE_ETOE_APPTAG_CHK:
257 			msg = "End-to-End Application Tag Check Error";
258 			break;
259 		case NVME_MEDCODE_ETOE_REFTAG_CHK:
260 			msg = "End-to-End Reference Tag Check Error";
261 			break;
262 		case NVME_MEDCODE_COMPARE_FAILURE:
263 			msg = "Compare Failure";
264 			break;
265 		case NVME_MEDCODE_ACCESS_DENIED:
266 			msg = "Access Denied";
267 			break;
268 		case NVME_MEDCODE_UNALLOCATED:
269 			msg = "Deallocated or Unwritten Logical Block";
270 			break;
271 		default:
272 			snprintf(buf, sizeof(buf), "media(0x%02x)", code);
273 			break;
274 		}
275 		break;
276 	case NVME_STATUS_TYPE_3:
277 	case NVME_STATUS_TYPE_4:
278 	case NVME_STATUS_TYPE_5:
279 	case NVME_STATUS_TYPE_6:
280 		buf[0] = 0;
281 		break;
282 	case NVME_STATUS_TYPE_VENDOR:
283 		snprintf(buf, sizeof(buf), "vendor(0x%02x)", code);
284 		break;
285 	}
286 	if (msg)
287 		snprintf(buf, sizeof(buf), "%s", msg);
288 
289 	return buf;
290 }
291