From ed6e83f958b7e00c32c4e39cf4f87421c00b4909 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Thu, 29 Mar 2018 14:43:17 -0700 Subject: [PATCH] nvmf: implement Firmware Slot Information log page Change-Id: I93a4cae46dad7ec42fd82fa4917fd27e3b14c46a Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/405827 Tested-by: SPDK Automated Test System Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris --- lib/nvmf/ctrlr.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 79509ced4..841f60047 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -795,6 +795,25 @@ spdk_nvmf_ctrlr_async_event_request(struct spdk_nvmf_request *req) return SPDK_NVMF_REQUEST_EXEC_STATUS_ASYNCHRONOUS; } +static void +spdk_nvmf_get_firmware_slot_log_page(void *buffer, uint64_t offset, uint32_t length) +{ + struct spdk_nvme_firmware_page fw_page; + size_t copy_len; + + memset(&fw_page, 0, sizeof(fw_page)); + fw_page.afi.active_slot = 1; + fw_page.afi.next_reset_slot = 0; + spdk_strcpy_pad(fw_page.revision[0], FW_VERSION, sizeof(fw_page.revision[0]), ' '); + + if (offset < sizeof(fw_page)) { + copy_len = spdk_min(sizeof(fw_page) - offset, length); + if (copy_len > 0) { + memcpy(buffer, (const char *)&fw_page + offset, copy_len); + } + } +} + static int spdk_nvmf_ctrlr_get_log_page(struct spdk_nvmf_request *req) { @@ -847,9 +866,11 @@ spdk_nvmf_ctrlr_get_log_page(struct spdk_nvmf_request *req) switch (lid) { case SPDK_NVME_LOG_ERROR: case SPDK_NVME_LOG_HEALTH_INFORMATION: - case SPDK_NVME_LOG_FIRMWARE_SLOT: /* TODO: actually fill out log page data */ return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; + case SPDK_NVME_LOG_FIRMWARE_SLOT: + spdk_nvmf_get_firmware_slot_log_page(req->data, offset, len); + return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; case SPDK_NVME_LOG_COMMAND_EFFECTS_LOG: spdk_nvmf_get_cmds_and_effects_log_page(req->data, offset, len); return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;