nvme: add spdk_nvme_ctrlr_cmd_get_log_page_ext()

This new function allows specifying some of the extra
cdw10, cdw11 and cdw14 bits added in the more recent
versions of the NVMe specification.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: I08a7840ad066b08fe557a2e7b974df491646978f

Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/479737
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com>
This commit is contained in:
Jim Harris 2020-01-08 06:19:42 -07:00 committed by Tomasz Zawadzki
parent c96cefbfd7
commit a828415390
2 changed files with 57 additions and 3 deletions

View File

@ -1400,6 +1400,46 @@ int spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr,
uint64_t offset,
spdk_nvme_cmd_cb cb_fn, void *cb_arg);
/**
* Get a specific log page from the NVMe controller.
*
* This function is thread safe and can be called at any point while the controller
* is attached to the SPDK NVMe driver.
*
* This function allows specifying extra fields in cdw10 and cdw11 such as
* Retain Asynchronous Event and Log Specific Field.
*
* Call spdk_nvme_ctrlr_process_admin_completions() to poll for completion of
* commands submitted through this function.
*
* \sa spdk_nvme_ctrlr_is_log_page_supported()
*
* \param ctrlr Opaque handle to NVMe controller.
* \param log_page The log page identifier.
* \param nsid Depending on the log page, this may be 0, a namespace identifier,
* or SPDK_NVME_GLOBAL_NS_TAG.
* \param payload The pointer to the payload buffer.
* \param payload_size The size of payload buffer.
* \param offset Offset in bytes within the log page to start retrieving log page
* data. May only be non-zero if the controller supports extended data for Get Log
* Page as reported in the controller data log page attributes.
* \param cdw10 Value to specify for cdw10. Specify 0 for numdl - it will be
* set by this function based on the payload_size parameter. Specify 0 for lid -
* it will be set by this function based on the log_page parameter.
* \param cdw11 Value to specify for cdw11. Specify 0 for numdu - it will be
* set by this function based on the payload_size.
* \param cdw14 Value to specify for cdw14.
* \param cb_fn Callback function to invoke when the log page has been retrieved.
* \param cb_arg Argument to pass to the callback function.
*
* \return 0 if successfully submitted, negated errno if resources could not be
* allocated for this request, -ENXIO if the admin qpair is failed at the transport layer.
*/
int spdk_nvme_ctrlr_cmd_get_log_page_ext(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page,
uint32_t nsid, void *payload, uint32_t payload_size,
uint64_t offset, uint32_t cdw10, uint32_t cdw11,
uint32_t cdw14, spdk_nvme_cmd_cb cb_fn, void *cb_arg);
/**
* Abort a specific previously-submitted NVMe command.
*

View File

@ -486,9 +486,11 @@ nvme_ctrlr_cmd_set_host_id(struct spdk_nvme_ctrlr *ctrlr, void *host_id, uint32_
}
int
spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page,
uint32_t nsid, void *payload, uint32_t payload_size,
uint64_t offset, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
spdk_nvme_ctrlr_cmd_get_log_page_ext(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page,
uint32_t nsid, void *payload, uint32_t payload_size,
uint64_t offset, uint32_t cdw10,
uint32_t cdw11, uint32_t cdw14,
spdk_nvme_cmd_cb cb_fn, void *cb_arg)
{
struct nvme_request *req;
struct spdk_nvme_cmd *cmd;
@ -528,12 +530,15 @@ spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page
cmd = &req->cmd;
cmd->opc = SPDK_NVME_OPC_GET_LOG_PAGE;
cmd->nsid = nsid;
cmd->cdw10 = cdw10;
cmd->cdw10_bits.get_log_page.numdl = numdl;
cmd->cdw10_bits.get_log_page.lid = log_page;
cmd->cdw11 = cdw11;
cmd->cdw11_bits.get_log_page.numdu = numdu;
cmd->cdw12 = lpol;
cmd->cdw13 = lpou;
cmd->cdw14 = cdw14;
rc = nvme_ctrlr_submit_admin_request(ctrlr, req);
nvme_robust_mutex_unlock(&ctrlr->ctrlr_lock);
@ -541,6 +546,15 @@ spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page
return rc;
}
int
spdk_nvme_ctrlr_cmd_get_log_page(struct spdk_nvme_ctrlr *ctrlr, uint8_t log_page,
uint32_t nsid, void *payload, uint32_t payload_size,
uint64_t offset, spdk_nvme_cmd_cb cb_fn, void *cb_arg)
{
return spdk_nvme_ctrlr_cmd_get_log_page_ext(ctrlr, log_page, nsid, payload,
payload_size, offset, 0, 0, 0, cb_fn, cb_arg);
}
static void
spdk_nvme_ctrlr_cmd_abort_cpl(void *ctx, const struct spdk_nvme_cpl *cpl)
{