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