From 017a8f885fb132cf3095762d9607fe6a4cca04fd Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Thu, 26 Dec 2019 09:01:57 -0700 Subject: [PATCH] lib/nvme: add objects for transport registration. Signed-off-by: Seth Howell Change-Id: I33d0a23b646a06acbf219ff283f094197af6b1fc Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/478865 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- include/spdk/nvme.h | 55 ++++++++++++++++++++++++++++++++++++++++ lib/nvme/nvme_internal.h | 7 +++++ 2 files changed, 62 insertions(+) diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index deae3eb77..dcfe8d98c 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -2840,6 +2840,61 @@ int spdk_nvme_cuse_register(struct spdk_nvme_ctrlr *ctrlr); */ void spdk_nvme_cuse_unregister(struct spdk_nvme_ctrlr *ctrlr); +struct nvme_request; + +struct spdk_nvme_transport_ops { + char name[SPDK_NVMF_TRSTRING_MAX_LEN + 1]; + + enum spdk_nvme_transport_type type; + + struct spdk_nvme_ctrlr *(*ctrlr_construct)(const struct spdk_nvme_transport_id *trid, + const struct spdk_nvme_ctrlr_opts *opts, + void *devhandle); + + int (*ctrlr_scan)(struct spdk_nvme_probe_ctx *probe_ctx, bool direct_connect); + + int (*ctrlr_destruct)(struct spdk_nvme_ctrlr *ctrlr); + + int (*ctrlr_enable)(struct spdk_nvme_ctrlr *ctrlr); + + int (*ctrlr_set_reg_4)(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t value); + + int (*ctrlr_set_reg_8)(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t value); + + int (*ctrlr_get_reg_4)(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t *value); + + int (*ctrlr_get_reg_8)(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t *value); + + uint32_t (*ctrlr_get_max_xfer_size)(struct spdk_nvme_ctrlr *ctrlr); + + uint16_t (*ctrlr_get_max_sges)(struct spdk_nvme_ctrlr *ctrlr); + + void *(*ctrlr_alloc_cmb_io_buffer)(struct spdk_nvme_ctrlr *ctrlr, size_t size); + + int (*ctrlr_free_cmb_io_buffer)(struct spdk_nvme_ctrlr *ctrlr, void *buf, size_t size); + + struct spdk_nvme_qpair *(*ctrlr_create_io_qpair)(struct spdk_nvme_ctrlr *ctrlr, uint16_t qid, + const struct spdk_nvme_io_qpair_opts *opts); + + int (*ctrlr_delete_io_qpair)(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); + + int (*ctrlr_connect_qpair)(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); + + volatile struct spdk_nvme_registers *(*ctrlr_get_registers)(struct spdk_nvme_ctrlr *ctrlr); + + void (*ctrlr_disconnect_qpair)(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair); + + void (*qpair_abort_reqs)(struct spdk_nvme_qpair *qpair, uint32_t dnr); + + int (*qpair_reset)(struct spdk_nvme_qpair *qpair); + + int (*qpair_submit_request)(struct spdk_nvme_qpair *qpair, struct nvme_request *req); + + int32_t (*qpair_process_completions)(struct spdk_nvme_qpair *qpair, uint32_t max_completions); + + void (*admin_qpair_abort_aers)(struct spdk_nvme_qpair *qpair); +}; + #ifdef __cplusplus } #endif diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index bd3a914b5..a20101db2 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -355,6 +355,11 @@ enum nvme_qpair_state { NVME_QPAIR_ENABLED, }; +struct nvme_transport { + struct spdk_nvme_transport_ops ops; + TAILQ_ENTRY(nvme_transport) link; +}; + struct spdk_nvme_qpair { struct spdk_nvme_ctrlr *ctrlr; @@ -400,6 +405,8 @@ struct spdk_nvme_qpair { void *req_buf; + const struct nvme_transport *transport; + uint8_t transport_failure_reason: 2; };