xref: /spdk/lib/bdev/scsi_nvme.c (revision 6f338d4bf3a8a91b7abe377a605a321ea2b05bf7)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) 2016 FUJITSU LIMITED, All rights reserved.
3  */
4 
5 #include "spdk/bdev_module.h"
6 
7 #include "spdk/nvme_spec.h"
8 
9 void
10 spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io, int *sc, int *sk,
11 			 int *asc, int *ascq)
12 {
13 	int nvme_sct = bdev_io->internal.error.nvme.sct;
14 	int nvme_sc = bdev_io->internal.error.nvme.sc;
15 
16 	switch (nvme_sct) {
17 	case SPDK_NVME_SCT_GENERIC:
18 		switch (nvme_sc) {
19 		case SPDK_NVME_SC_SUCCESS:
20 			*sc   = SPDK_SCSI_STATUS_GOOD;
21 			*sk   = SPDK_SCSI_SENSE_NO_SENSE;
22 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
23 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
24 			break;
25 		case SPDK_NVME_SC_INVALID_OPCODE:
26 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
27 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
28 			*asc  = SPDK_SCSI_ASC_INVALID_COMMAND_OPERATION_CODE;
29 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
30 			break;
31 		case SPDK_NVME_SC_INVALID_FIELD:
32 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
33 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
34 			*asc  = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
35 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
36 			break;
37 		case SPDK_NVME_SC_DATA_TRANSFER_ERROR:
38 		case SPDK_NVME_SC_CAPACITY_EXCEEDED:
39 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
40 			*sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
41 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
42 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
43 			break;
44 		case SPDK_NVME_SC_ABORTED_POWER_LOSS:
45 			*sc   = SPDK_SCSI_STATUS_TASK_ABORTED;
46 			*sk   = SPDK_SCSI_SENSE_ABORTED_COMMAND;
47 			*asc  = SPDK_SCSI_ASC_WARNING;
48 			*ascq = SPDK_SCSI_ASCQ_POWER_LOSS_EXPECTED;
49 			break;
50 		case SPDK_NVME_SC_INTERNAL_DEVICE_ERROR:
51 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
52 			*sk   = SPDK_SCSI_SENSE_HARDWARE_ERROR;
53 			*asc  = SPDK_SCSI_ASC_INTERNAL_TARGET_FAILURE;
54 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
55 			break;
56 		case SPDK_NVME_SC_ABORTED_BY_REQUEST:
57 		case SPDK_NVME_SC_ABORTED_SQ_DELETION:
58 		case SPDK_NVME_SC_ABORTED_FAILED_FUSED:
59 		case SPDK_NVME_SC_ABORTED_MISSING_FUSED:
60 			*sc   = SPDK_SCSI_STATUS_TASK_ABORTED;
61 			*sk   = SPDK_SCSI_SENSE_ABORTED_COMMAND;
62 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
63 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
64 			break;
65 		case SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT:
66 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
67 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
68 			*asc  = SPDK_SCSI_ASC_ACCESS_DENIED;
69 			*ascq = SPDK_SCSI_ASCQ_INVALID_LU_IDENTIFIER;
70 			break;
71 		case SPDK_NVME_SC_LBA_OUT_OF_RANGE:
72 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
73 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
74 			*asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
75 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
76 			break;
77 		case SPDK_NVME_SC_NAMESPACE_NOT_READY:
78 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
79 			*sk   = SPDK_SCSI_SENSE_NOT_READY;
80 			*asc  = SPDK_SCSI_ASC_LOGICAL_UNIT_NOT_READY;
81 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
82 			break;
83 		case SPDK_NVME_SC_RESERVATION_CONFLICT:
84 			*sc   = SPDK_SCSI_STATUS_RESERVATION_CONFLICT;
85 			*sk   = SPDK_SCSI_SENSE_NO_SENSE;
86 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
87 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
88 			break;
89 		case SPDK_NVME_SC_COMMAND_ID_CONFLICT:
90 		case SPDK_NVME_SC_COMMAND_SEQUENCE_ERROR:
91 		case SPDK_NVME_SC_INVALID_SGL_SEG_DESCRIPTOR:
92 		case SPDK_NVME_SC_INVALID_NUM_SGL_DESCIRPTORS:
93 		case SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID:
94 		case SPDK_NVME_SC_METADATA_SGL_LENGTH_INVALID:
95 		case SPDK_NVME_SC_SGL_DESCRIPTOR_TYPE_INVALID:
96 		case SPDK_NVME_SC_INVALID_CONTROLLER_MEM_BUF:
97 		case SPDK_NVME_SC_INVALID_PRP_OFFSET:
98 		case SPDK_NVME_SC_ATOMIC_WRITE_UNIT_EXCEEDED:
99 		case SPDK_NVME_SC_INVALID_SGL_OFFSET:
100 		case SPDK_NVME_SC_HOSTID_INCONSISTENT_FORMAT:
101 		case SPDK_NVME_SC_KEEP_ALIVE_EXPIRED:
102 		case SPDK_NVME_SC_KEEP_ALIVE_INVALID:
103 		case SPDK_NVME_SC_FORMAT_IN_PROGRESS:
104 		default:
105 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
106 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
107 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
108 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
109 			break;
110 		}
111 		break;
112 	case SPDK_NVME_SCT_COMMAND_SPECIFIC:
113 		switch (nvme_sc) {
114 		case SPDK_NVME_SC_COMPLETION_QUEUE_INVALID:
115 		case SPDK_NVME_SC_ABORT_COMMAND_LIMIT_EXCEEDED:
116 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
117 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
118 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
119 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
120 			break;
121 		case SPDK_NVME_SC_INVALID_FORMAT:
122 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
123 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
124 			*asc  = SPDK_SCSI_ASC_FORMAT_COMMAND_FAILED;
125 			*ascq = SPDK_SCSI_ASCQ_FORMAT_COMMAND_FAILED;
126 			break;
127 		case SPDK_NVME_SC_CONFLICTING_ATTRIBUTES:
128 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
129 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
130 			*asc  = SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB;
131 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
132 			break;
133 		case SPDK_NVME_SC_ATTEMPTED_WRITE_TO_RO_RANGE:
134 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
135 			*sk   = SPDK_SCSI_SENSE_DATA_PROTECT;
136 			*asc  = SPDK_SCSI_ASC_WRITE_PROTECTED;
137 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
138 			break;
139 		case SPDK_NVME_SC_INVALID_QUEUE_IDENTIFIER:
140 		case SPDK_NVME_SC_INVALID_QUEUE_SIZE:
141 		case SPDK_NVME_SC_ASYNC_EVENT_REQUEST_LIMIT_EXCEEDED:
142 		case SPDK_NVME_SC_INVALID_FIRMWARE_SLOT:
143 		case SPDK_NVME_SC_INVALID_FIRMWARE_IMAGE:
144 		case SPDK_NVME_SC_INVALID_INTERRUPT_VECTOR:
145 		case SPDK_NVME_SC_INVALID_LOG_PAGE:
146 		case SPDK_NVME_SC_FIRMWARE_REQ_CONVENTIONAL_RESET:
147 		case SPDK_NVME_SC_INVALID_QUEUE_DELETION:
148 		case SPDK_NVME_SC_FEATURE_ID_NOT_SAVEABLE:
149 		case SPDK_NVME_SC_FEATURE_NOT_CHANGEABLE:
150 		case SPDK_NVME_SC_FEATURE_NOT_NAMESPACE_SPECIFIC:
151 		case SPDK_NVME_SC_FIRMWARE_REQ_NVM_RESET:
152 		case SPDK_NVME_SC_FIRMWARE_REQ_RESET:
153 		case SPDK_NVME_SC_FIRMWARE_REQ_MAX_TIME_VIOLATION:
154 		case SPDK_NVME_SC_FIRMWARE_ACTIVATION_PROHIBITED:
155 		case SPDK_NVME_SC_OVERLAPPING_RANGE:
156 		case SPDK_NVME_SC_NAMESPACE_INSUFFICIENT_CAPACITY:
157 		case SPDK_NVME_SC_NAMESPACE_ID_UNAVAILABLE:
158 		case SPDK_NVME_SC_NAMESPACE_ALREADY_ATTACHED:
159 		case SPDK_NVME_SC_NAMESPACE_IS_PRIVATE:
160 		case SPDK_NVME_SC_NAMESPACE_NOT_ATTACHED:
161 		case SPDK_NVME_SC_THINPROVISIONING_NOT_SUPPORTED:
162 		case SPDK_NVME_SC_CONTROLLER_LIST_INVALID:
163 		case SPDK_NVME_SC_INVALID_PROTECTION_INFO:
164 		default:
165 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
166 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
167 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
168 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
169 			break;
170 		}
171 		break;
172 	case SPDK_NVME_SCT_MEDIA_ERROR:
173 		switch (nvme_sc) {
174 		case SPDK_NVME_SC_WRITE_FAULTS:
175 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
176 			*sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
177 			*asc  = SPDK_SCSI_ASC_PERIPHERAL_DEVICE_WRITE_FAULT;
178 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
179 			break;
180 		case SPDK_NVME_SC_UNRECOVERED_READ_ERROR:
181 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
182 			*sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
183 			*asc  = SPDK_SCSI_ASC_UNRECOVERED_READ_ERROR;
184 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
185 			break;
186 		case SPDK_NVME_SC_GUARD_CHECK_ERROR:
187 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
188 			*sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
189 			*asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
190 			*ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_GUARD_CHECK_FAILED;
191 			break;
192 		case SPDK_NVME_SC_APPLICATION_TAG_CHECK_ERROR:
193 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
194 			*sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
195 			*asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
196 			*ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED;
197 			break;
198 		case SPDK_NVME_SC_REFERENCE_TAG_CHECK_ERROR:
199 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
200 			*sk   = SPDK_SCSI_SENSE_MEDIUM_ERROR;
201 			*asc  = SPDK_SCSI_ASC_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
202 			*ascq = SPDK_SCSI_ASCQ_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED;
203 			break;
204 		case SPDK_NVME_SC_COMPARE_FAILURE:
205 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
206 			*sk   = SPDK_SCSI_SENSE_MISCOMPARE;
207 			*asc  = SPDK_SCSI_ASC_MISCOMPARE_DURING_VERIFY_OPERATION;
208 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
209 			break;
210 		case SPDK_NVME_SC_ACCESS_DENIED:
211 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
212 			*sk   = SPDK_SCSI_SENSE_DATA_PROTECT;
213 			*asc  = SPDK_SCSI_ASC_ACCESS_DENIED;
214 			*ascq = SPDK_SCSI_ASCQ_NO_ACCESS_RIGHTS;
215 			break;
216 		case SPDK_NVME_SC_DEALLOCATED_OR_UNWRITTEN_BLOCK:
217 		default:
218 			*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
219 			*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
220 			*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
221 			*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
222 			break;
223 		}
224 		break;
225 	case SPDK_NVME_SCT_VENDOR_SPECIFIC:
226 	default:
227 		*sc   = SPDK_SCSI_STATUS_CHECK_CONDITION;
228 		*sk   = SPDK_SCSI_SENSE_ILLEGAL_REQUEST;
229 		*asc  = SPDK_SCSI_ASC_NO_ADDITIONAL_SENSE;
230 		*ascq = SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE;
231 		break;
232 	}
233 }
234