From nobody Fri May 3 00:15:56 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4VVrtj0jLqz5KJtB; Fri, 3 May 2024 00:15:57 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4VVrth4Qlhz4QxF; Fri, 3 May 2024 00:15:56 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1714695356; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=S+/BSZJFANGMcVf2oToJ8Cx/x+CEIjH9P2QrARy6ndY=; b=V2wJUmykgUL6ZiyuSn8Zy+XMRZF/Eq3y5SuABZ3QmAJjuD/JbPnLgV8aM+tDV/jkqZuhlB ug2PlB+a5SAxVxpuEkFkOtjJolSjyH/1mXSle6kAOCJ80Gvkk6KNBD64wRsm11bxepggS4 qEynVN8P5xNsayhDpMall8oP4KUE6rxhPSJSs0PihaR7if1VoJMZrccsFWEdPhw8a5IT6T rnJ5Y0rmUq7MCC5+KM91pVU2ECyAE+gu1YRHOczm9WX3W6okFTnmt9OzJ/kiYWiBM7rlZ2 MuWa3PPqRFx5FcivzFOomF52XGmjyQgt7yipzQ2ZBvxAvuB86bBpNdRrTTfWuQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1714695356; a=rsa-sha256; cv=none; b=qbOi+gzXqpo335iAmIaiHPJ9pRHJJ1HSRBIjjXdBip1+6N9owWnfhs52mqjagx+6YYk8gL yfg3IA1mFfuwWx4g7JmJu9pGEgoUiOONAtR1affuygwBCcxJ/0aohWQToQdz7CxON5cPxf 1RmsXNMa2fK94CyAxoaO47l5EIPtMnrxHacIGFWcI+GFc8x6Iw3d1CsiYVcpmO3O2FUOXM rbycdOZJVRo4vYN8cKCLvYuggLhtE2Xj4djfluwp5e/+RIT3dVb3Ulggq4Oeum1IBrQto8 uqGg1Tv23OLeAHhhH9tuEuHNNEkAucDoZYd8DkqIUzWzeLsUkVV9qsCTmLWvxA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1714695356; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=S+/BSZJFANGMcVf2oToJ8Cx/x+CEIjH9P2QrARy6ndY=; b=bRRbarog3vBoU4VAH/9kwlJ89rkMncUFVHSAfWBTaHD/HrlzNKYk11cReDh2XGpIoqR9vj bjyYL/CFUnDKOGikspIjdVB42AWacbkLBEwTtbMzJul0fk6es75gRfBhzW+CuYYUAPH92h KnhMDJNqS7N3YLlCmxnhvYocwZl+XfiAsPh69ZK4Ym8EsZpluTredIm1z+dxMNhlY/WpOz yowKtIHtHSsb2Gui7DC91TLbHo2x1BSqxH7JnS7mHRsu4MHOf1AglBTzS69zWyxTWNcACJ 735PqO0X2pArTHA4vRX+nP2ILmllE5dBlfQNuQvWdygV0bS/vzZVkjcY7BpEQg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4VVrth30MYzNHm; Fri, 3 May 2024 00:15:56 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 4430Fuoh079533; Fri, 3 May 2024 00:15:56 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 4430FuSQ079530; Fri, 3 May 2024 00:15:56 GMT (envelope-from git) Date: Fri, 3 May 2024 00:15:56 GMT Message-Id: <202405030015.4430FuSQ079530@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 75577946b5a1 - main - ctl: Add helper routines for setting NVMe completion status List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 75577946b5a16df329c7e4b3a4a1e1ba7805b921 Auto-Submitted: auto-generated The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=75577946b5a16df329c7e4b3a4a1e1ba7805b921 commit 75577946b5a16df329c7e4b3a4a1e1ba7805b921 Author: John Baldwin AuthorDate: 2024-05-02 23:31:20 +0000 Commit: John Baldwin CommitDate: 2024-05-02 23:31:20 +0000 ctl: Add helper routines for setting NVMe completion status Also includes a few protocol-agnostic wrappers for setting a generic status (such as success) for a CTL I/O request whether it be SCSI or NVMe. Reviewed by: imp Sponsored by: Chelsio Communications Differential Revision: https://reviews.freebsd.org/D44718 --- sys/cam/ctl/ctl_error.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++ sys/cam/ctl/ctl_error.h | 27 ++++++ 2 files changed, 246 insertions(+) diff --git a/sys/cam/ctl/ctl_error.c b/sys/cam/ctl/ctl_error.c index a17095c91ac5..d07541a1a986 100644 --- a/sys/cam/ctl/ctl_error.c +++ b/sys/cam/ctl/ctl_error.c @@ -990,3 +990,222 @@ ctl_set_success(struct ctl_scsiio *ctsio) ctsio->sense_len = 0; ctsio->io_hdr.status = CTL_SUCCESS; } + +void +ctl_nvme_set_error(struct ctl_nvmeio *ctnio, uint8_t sc_type, + uint8_t sc_status) +{ + uint16_t status; + + memset(&ctnio->cpl, 0, sizeof(ctnio->cpl)); + status = NVMEF(NVME_STATUS_SCT, sc_type) | + NVMEF(NVME_STATUS_SC, sc_status); + ctnio->cpl.status = htole16(status); + ctnio->io_hdr.status = CTL_NVME_ERROR; +} + +void +ctl_nvme_set_generic_error(struct ctl_nvmeio *ctnio, uint8_t sc_status) +{ + ctl_nvme_set_error(ctnio, NVME_SCT_GENERIC, sc_status); +} + +void +ctl_nvme_set_invalid_opcode(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_INVALID_OPCODE); +} + +void +ctl_nvme_set_invalid_field(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_INVALID_FIELD); +} + +void +ctl_nvme_set_data_transfer_error(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_DATA_TRANSFER_ERROR); +} + +void +ctl_nvme_set_internal_error(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_INTERNAL_DEVICE_ERROR); +} + +void +ctl_nvme_set_invalid_namespace(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_INVALID_NAMESPACE_OR_FORMAT); +} + +void +ctl_nvme_set_command_aborted(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_COMMAND_ABORTED_BY_HOST); +} + +void +ctl_nvme_set_failed_fused_command(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_ABORTED_FAILED_FUSED); +} + +void +ctl_nvme_set_missing_fused_command(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_ABORTED_MISSING_FUSED); +} + +void +ctl_nvme_set_namespace_is_write_protected(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_NAMESPACE_IS_WRITE_PROTECTED); +} + +void +ctl_nvme_set_lba_out_of_range(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_LBA_OUT_OF_RANGE); +} + +void +ctl_nvme_set_namespace_not_ready(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_generic_error(ctnio, NVME_SC_NAMESPACE_NOT_READY); +} + +void +ctl_nvme_set_write_fault(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_error(ctnio, NVME_SCT_MEDIA_ERROR, + NVME_SC_WRITE_FAULTS); +} + +void +ctl_nvme_set_unrecoverable_read_error(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_error(ctnio, NVME_SCT_MEDIA_ERROR, + NVME_SC_UNRECOVERED_READ_ERROR); +} + +void +ctl_nvme_set_compare_failure(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_error(ctnio, NVME_SCT_MEDIA_ERROR, + NVME_SC_COMPARE_FAILURE); +} + +void +ctl_nvme_set_space_alloc_fail(struct ctl_nvmeio *ctnio) +{ + ctl_nvme_set_error(ctnio, NVME_SCT_MEDIA_ERROR, + NVME_SC_DEALLOCATED_OR_UNWRITTEN); +} + +void +ctl_nvme_set_success(struct ctl_nvmeio *ctnio) +{ + memset(&ctnio->cpl, 0, sizeof(ctnio->cpl)); + ctnio->io_hdr.status = CTL_SUCCESS; +} + +void +ctl_io_set_invalid_opcode(union ctl_io *io) +{ + switch (io->io_hdr.io_type) { + case CTL_IO_SCSI: + ctl_set_invalid_opcode(&io->scsiio); + break; + case CTL_IO_NVME: + ctl_nvme_set_invalid_opcode(&io->nvmeio); + break; + default: + __assert_unreachable(); + } +} + +void +ctl_io_set_hw_write_protected(union ctl_io *io) +{ + switch (io->io_hdr.io_type) { + case CTL_IO_SCSI: + ctl_set_hw_write_protected(&io->scsiio); + break; + case CTL_IO_NVME: + ctl_nvme_set_namespace_is_write_protected(&io->nvmeio); + break; + default: + __assert_unreachable(); + } +} + +void +ctl_io_set_busy(union ctl_io *io) +{ + switch (io->io_hdr.io_type) { + case CTL_IO_SCSI: + ctl_set_busy(&io->scsiio); + break; + case CTL_IO_NVME: + ctl_nvme_set_namespace_not_ready(&io->nvmeio); + break; + default: + __assert_unreachable(); + } +} + +void +ctl_io_set_compare_failure(union ctl_io *io, uint64_t offset) +{ + uint8_t info[8]; + + switch (io->io_hdr.io_type) { + case CTL_IO_SCSI: + scsi_u64to8b(offset, info); + ctl_set_sense(&io->scsiio, /*current_error*/ 1, + /*sense_key*/ SSD_KEY_MISCOMPARE, + /*asc*/ 0x1D, /*ascq*/ 0x00, + /*type*/ SSD_ELEM_INFO, + /*size*/ sizeof(info), /*data*/ &info, + /*type*/ SSD_ELEM_NONE); + break; + case CTL_IO_NVME: + ctl_nvme_set_compare_failure(&io->nvmeio); + break; + default: + __assert_unreachable(); + } +} + +void +ctl_io_set_space_alloc_fail(union ctl_io *io) +{ + switch (io->io_hdr.io_type) { + case CTL_IO_SCSI: + ctl_set_space_alloc_fail(&io->scsiio); + break; + case CTL_IO_NVME: + ctl_nvme_set_space_alloc_fail(&io->nvmeio); + break; + default: + __assert_unreachable(); + } +} + +void +ctl_io_set_success(union ctl_io *io) +{ + switch (io->io_hdr.io_type) { + case CTL_IO_SCSI: + ctl_set_success(&io->scsiio); + break; + case CTL_IO_NVME: + case CTL_IO_NVME_ADMIN: + ctl_nvme_set_success(&io->nvmeio); + break; + default: + __assert_unreachable(); + } +} diff --git a/sys/cam/ctl/ctl_error.h b/sys/cam/ctl/ctl_error.h index 6628f63db345..fb2113bef048 100644 --- a/sys/cam/ctl/ctl_error.h +++ b/sys/cam/ctl/ctl_error.h @@ -96,4 +96,31 @@ void ctl_set_hw_write_protected(struct ctl_scsiio *ctsio); void ctl_set_space_alloc_fail(struct ctl_scsiio *ctsio); void ctl_set_success(struct ctl_scsiio *ctsio); +void ctl_nvme_set_error(struct ctl_nvmeio *ctnio, uint8_t sc_type, + uint8_t sc_status); +void ctl_nvme_set_generic_error(struct ctl_nvmeio *ctnio, uint8_t sc_status); +void ctl_nvme_set_invalid_opcode(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_invalid_field(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_data_transfer_error(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_internal_error(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_invalid_namespace(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_command_aborted(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_failed_fused_command(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_missing_fused_command(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_namespace_is_write_protected(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_lba_out_of_range(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_namespace_not_ready(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_write_fault(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_unrecoverable_read_error(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_compare_failure(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_space_alloc_fail(struct ctl_nvmeio *ctnio); +void ctl_nvme_set_success(struct ctl_nvmeio *ctnio); + +void ctl_io_set_invalid_opcode(union ctl_io *io); +void ctl_io_set_hw_write_protected(union ctl_io *io); +void ctl_io_set_busy(union ctl_io *io); +void ctl_io_set_compare_failure(union ctl_io *io, uint64_t offset); +void ctl_io_set_space_alloc_fail(union ctl_io *io); +void ctl_io_set_success(union ctl_io *io); + #endif /* _CTL_ERROR_H_ */