From d1db020954203590bebc07a0b2c2e8ec1f9afbbe Mon Sep 17 00:00:00 2001 From: Niklas Cassel Date: Thu, 17 Sep 2020 13:00:33 +0000 Subject: [PATCH] nvme: add a csi parameter to nvme_ctrlr_cmd_identify() With the introduction of namespace types, the identify command has gained an additional parameter: Command Set Identifier (CSI). This parameter is similar to the existing parameters NSID and CNTID, and is not used by all CNS values. Most notably, the CSI parameter is not used for the existing CNS values 00h (ID NS) and 01h (ID CTRL). There are new CNS values, e.g. 05h (ID IOCS specific NS), and 06h (ID IOCS specific CTRL), which do take the new CSI parameter. The new CNS values instead return Command Set Specific data structures, which is basically an additional data structure. Therefore, the CNS values 00h and 01h are very much still in use. (Even the NVM Command Set has a Command Set Specific data structure, even though all fields in that data structure are currently reserved.) Since the CSI parameter is unused by all the existing calls to nvme_ctrlr_cmd_identify() (since none of the calls send in a CNS value that uses CSI), simply send in 0 for all existing calls. No functional change intended. Signed-off-by: Niklas Cassel Change-Id: Ia2b2324393a0707152b2f8511f0a22ad4a12bd46 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4309 Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker --- lib/nvme/nvme_ctrlr.c | 8 ++++---- lib/nvme/nvme_ctrlr_cmd.c | 3 ++- lib/nvme/nvme_fabric.c | 2 +- lib/nvme/nvme_internal.h | 2 +- lib/nvme/nvme_ns.c | 4 ++-- test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c | 2 +- test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c | 2 +- 7 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 8f6796b0cc..5cdaa501cd 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1394,7 +1394,7 @@ nvme_ctrlr_identify(struct spdk_nvme_ctrlr *ctrlr) nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_WAIT_FOR_IDENTIFY, ctrlr->opts.admin_timeout_ms); - rc = nvme_ctrlr_cmd_identify(ctrlr, SPDK_NVME_IDENTIFY_CTRLR, 0, 0, + rc = nvme_ctrlr_cmd_identify(ctrlr, SPDK_NVME_IDENTIFY_CTRLR, 0, 0, 0, &ctrlr->cdata, sizeof(ctrlr->cdata), nvme_ctrlr_identify_done, ctrlr); if (rc != 0) { @@ -1524,7 +1524,7 @@ nvme_ctrlr_identify_active_ns_async(struct nvme_active_ns_ctx *ctx) } ctx->state = NVME_ACTIVE_NS_STATE_PROCESSING; - rc = nvme_ctrlr_cmd_identify(ctrlr, SPDK_NVME_IDENTIFY_ACTIVE_NS_LIST, 0, ctx->next_nsid, + rc = nvme_ctrlr_cmd_identify(ctrlr, SPDK_NVME_IDENTIFY_ACTIVE_NS_LIST, 0, ctx->next_nsid, 0, &ctx->new_ns_list[1024 * ctx->page], sizeof(struct spdk_nvme_ns_list), nvme_ctrlr_identify_active_ns_async_done, ctx); if (rc != 0) { @@ -1648,7 +1648,7 @@ nvme_ctrlr_identify_ns_async(struct spdk_nvme_ns *ns) nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_WAIT_FOR_IDENTIFY_NS, ctrlr->opts.admin_timeout_ms); - return nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS, 0, ns->id, + return nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS, 0, ns->id, 0, nsdata, sizeof(*nsdata), nvme_ctrlr_identify_ns_async_done, ns); } @@ -1721,7 +1721,7 @@ nvme_ctrlr_identify_id_desc_async(struct spdk_nvme_ns *ns) nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_WAIT_FOR_IDENTIFY_ID_DESCS, ctrlr->opts.admin_timeout_ms); return nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS_ID_DESCRIPTOR_LIST, - 0, ns->id, ns->id_desc_list, sizeof(ns->id_desc_list), + 0, ns->id, 0, ns->id_desc_list, sizeof(ns->id_desc_list), nvme_ctrlr_identify_id_desc_async_done, ns); } diff --git a/lib/nvme/nvme_ctrlr_cmd.c b/lib/nvme/nvme_ctrlr_cmd.c index 9b16c8d6fe..dffc13ac37 100644 --- a/lib/nvme/nvme_ctrlr_cmd.c +++ b/lib/nvme/nvme_ctrlr_cmd.c @@ -135,7 +135,7 @@ spdk_nvme_ctrlr_cmd_admin_raw(struct spdk_nvme_ctrlr *ctrlr, int nvme_ctrlr_cmd_identify(struct spdk_nvme_ctrlr *ctrlr, uint8_t cns, uint16_t cntid, uint32_t nsid, - void *payload, size_t payload_size, + uint8_t csi, void *payload, size_t payload_size, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { struct nvme_request *req; @@ -152,6 +152,7 @@ nvme_ctrlr_cmd_identify(struct spdk_nvme_ctrlr *ctrlr, uint8_t cns, uint16_t cnt cmd->opc = SPDK_NVME_OPC_IDENTIFY; cmd->cdw10_bits.identify.cns = cns; cmd->cdw10_bits.identify.cntid = cntid; + cmd->cdw11_bits.identify.csi = csi; cmd->nsid = nsid; return nvme_ctrlr_submit_admin_request(ctrlr, req); diff --git a/lib/nvme/nvme_fabric.c b/lib/nvme/nvme_fabric.c index c3d4f88028..577817e9e9 100644 --- a/lib/nvme/nvme_fabric.c +++ b/lib/nvme/nvme_fabric.c @@ -306,7 +306,7 @@ nvme_fabric_ctrlr_scan(struct spdk_nvme_probe_ctx *probe_ctx, } /* get the cdata info */ - rc = nvme_ctrlr_cmd_identify(discovery_ctrlr, SPDK_NVME_IDENTIFY_CTRLR, 0, 0, + rc = nvme_ctrlr_cmd_identify(discovery_ctrlr, SPDK_NVME_IDENTIFY_CTRLR, 0, 0, 0, &discovery_ctrlr->cdata, sizeof(discovery_ctrlr->cdata), nvme_completion_poll_cb, status); if (rc != 0) { diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 9f8aa4e1c4..5ff67d9b30 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -865,7 +865,7 @@ int nvme_poll_group_disconnect_qpair(struct spdk_nvme_qpair *qpair); /* Admin functions */ int nvme_ctrlr_cmd_identify(struct spdk_nvme_ctrlr *ctrlr, uint8_t cns, uint16_t cntid, uint32_t nsid, - void *payload, size_t payload_size, + uint8_t csi, void *payload, size_t payload_size, spdk_nvme_cmd_cb cb_fn, void *cb_arg); int nvme_ctrlr_cmd_set_num_queues(struct spdk_nvme_ctrlr *ctrlr, uint32_t num_queues, spdk_nvme_cmd_cb cb_fn, diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index 749b265921..e206b51d57 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -124,7 +124,7 @@ nvme_ctrlr_identify_ns(struct spdk_nvme_ns *ns) } nsdata = _nvme_ns_get_data(ns); - rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS, 0, ns->id, + rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS, 0, ns->id, 0, nsdata, sizeof(*nsdata), nvme_completion_poll_cb, status); if (rc != 0) { @@ -172,7 +172,7 @@ nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns) SPDK_DEBUGLOG(SPDK_LOG_NVME, "Attempting to retrieve NS ID Descriptor List\n"); rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS_ID_DESCRIPTOR_LIST, 0, ns->id, - ns->id_desc_list, sizeof(ns->id_desc_list), + 0, ns->id_desc_list, sizeof(ns->id_desc_list), nvme_completion_poll_cb, status); if (rc < 0) { free(status); diff --git a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c index 6264f33dda..e7d0ca935e 100644 --- a/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c +++ b/test/unit/lib/nvme/nvme_ctrlr.c/nvme_ctrlr_ut.c @@ -335,7 +335,7 @@ nvme_ctrlr_cmd_set_async_event_config(struct spdk_nvme_ctrlr *ctrlr, int nvme_ctrlr_cmd_identify(struct spdk_nvme_ctrlr *ctrlr, uint8_t cns, uint16_t cntid, uint32_t nsid, - void *payload, size_t payload_size, + uint8_t csi, void *payload, size_t payload_size, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { if (cns == SPDK_NVME_IDENTIFY_ACTIVE_NS_LIST) { diff --git a/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c b/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c index e642779a9f..fa408bb645 100644 --- a/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c +++ b/test/unit/lib/nvme/nvme_ns.c/nvme_ns_ut.c @@ -48,7 +48,7 @@ DEFINE_STUB(nvme_wait_for_completion_robust_lock, int, int nvme_ctrlr_cmd_identify(struct spdk_nvme_ctrlr *ctrlr, uint8_t cns, uint16_t cntid, uint32_t nsid, - void *payload, size_t payload_size, + uint8_t csi, void *payload, size_t payload_size, spdk_nvme_cmd_cb cb_fn, void *cb_arg) { return -1;