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