From e4d271f302eefaffd41d113ffc06fa5b4bb95249 Mon Sep 17 00:00:00 2001 From: Konrad Sztyber Date: Wed, 24 Feb 2021 08:15:22 +0100 Subject: [PATCH] external_code/nvme: send identify controller during init Now that it's possible to both submit the identify controller command and process its completion, the initialization flow has been updated to issue that command and update controller's identify data (which can be retrieved via nvme_ctrlr_get_data()). Signed-off-by: Konrad Sztyber Change-Id: Iee0e85f431275a5e6f1767db1d807de7fba6cdcc Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/6677 Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Community-CI: Mellanox Build Bot Tested-by: SPDK CI Jenkins --- test/external_code/nvme/nvme.c | 39 ++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/test/external_code/nvme/nvme.c b/test/external_code/nvme/nvme.c index c3b66d62f..e83e327ba 100644 --- a/test/external_code/nvme/nvme.c +++ b/test/external_code/nvme/nvme.c @@ -395,9 +395,21 @@ submit_request(struct nvme_qpair *qpair, struct nvme_request *request) spdk_mmio_write_4(qpair->sq_tdbl, qpair->sq_tail); } -int identify_ctrlr(struct nvme_ctrlr *ctrlr); +static void +identify_ctrlr_done(void *ctx, const struct spdk_nvme_cpl *cpl) +{ + struct nvme_ctrlr *ctrlr = ctx; -int + if (spdk_nvme_cpl_is_error(cpl)) { + SPDK_ERRLOG("Identify Controller command failed\n"); + ctrlr->state = NVME_CTRLR_STATE_ERROR; + return; + } + + ctrlr->state = NVME_CTRLR_STATE_READY; +} + +static int identify_ctrlr(struct nvme_ctrlr *ctrlr) { struct nvme_request *request; @@ -416,8 +428,8 @@ identify_ctrlr(struct nvme_ctrlr *ctrlr) return -EAGAIN; } - request->cb_fn = NULL; - request->cb_arg = NULL; + request->cb_fn = identify_ctrlr_done; + request->cb_arg = ctrlr; cmd = &request->cmd; cmd->cid = request->cid; @@ -433,9 +445,7 @@ identify_ctrlr(struct nvme_ctrlr *ctrlr) return 0; } -int32_t process_completions(struct nvme_qpair *qpair); - -int32_t +static int32_t process_completions(struct nvme_qpair *qpair) { struct spdk_nvme_cpl *cpl; @@ -478,6 +488,7 @@ process_ctrlr_init(struct nvme_ctrlr *ctrlr) union spdk_nvme_cc_register cc; union spdk_nvme_csts_register csts; union spdk_nvme_aqa_register aqa; + int rc = 0; if (ctrlr->state == NVME_CTRLR_STATE_READY) { return 0; @@ -526,15 +537,25 @@ process_ctrlr_init(struct nvme_ctrlr *ctrlr) break; case NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1: if (csts.bits.rdy) { - ctrlr->state = NVME_CTRLR_STATE_READY; + ctrlr->state = NVME_CTRLR_STATE_IDENTIFY; } break; + case NVME_CTRLR_STATE_IDENTIFY: + ctrlr->state = NVME_CTRLR_STATE_WAIT_FOR_IDENTIFY; + rc = identify_ctrlr(ctrlr); + break; + case NVME_CTRLR_STATE_WAIT_FOR_IDENTIFY: + process_completions(ctrlr->admin_qpair); + break; + case NVME_CTRLR_STATE_ERROR: + rc = -1; + break; default: assert(0 && "should never get here"); return -1; } - return 0; + return rc; } static void