summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_ns_cmd.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2012-10-18 00:39:29 +0000
committerjimharris <jimharris@FreeBSD.org>2012-10-18 00:39:29 +0000
commitc9e224f9c92699211c2ddfe2284967950e341d37 (patch)
treea0eff5362e51926a6f21f6c1c0df66c880c6515a /sys/dev/nvme/nvme_ns_cmd.c
parent2e5a6d8f161627fd51fe1bc5551ba988c49cb06f (diff)
downloadFreeBSD-src-c9e224f9c92699211c2ddfe2284967950e341d37.zip
FreeBSD-src-c9e224f9c92699211c2ddfe2284967950e341d37.tar.gz
Add nvme_ctrlr_submit_[admin|io]_request functions which consolidates
code for allocating nvme_tracker objects and making calls into bus_dmamap_load for commands which have payloads. Sponsored by: Intel
Diffstat (limited to 'sys/dev/nvme/nvme_ns_cmd.c')
-rw-r--r--sys/dev/nvme/nvme_ns_cmd.c41
1 files changed, 8 insertions, 33 deletions
diff --git a/sys/dev/nvme/nvme_ns_cmd.c b/sys/dev/nvme/nvme_ns_cmd.c
index ecc8cc5..f16168a 100644
--- a/sys/dev/nvme/nvme_ns_cmd.c
+++ b/sys/dev/nvme/nvme_ns_cmd.c
@@ -34,17 +34,12 @@ nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, uint64_t lba,
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_tracker *tr;
struct nvme_command *cmd;
- int err;
req = nvme_allocate_request(payload, lba_count*512, cb_fn, cb_arg);
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
-
- if (tr == NULL)
+ if (req == NULL)
return (ENOMEM);
-
cmd = &req->cmd;
cmd->opc = NVME_OPC_READ;
cmd->nsid = ns->id;
@@ -53,10 +48,7 @@ nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, uint64_t lba,
*(uint64_t *)&cmd->cdw10 = lba;
cmd->cdw12 = lba_count-1;
- err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map, payload,
- req->payload_size, nvme_payload_map, tr, 0);
-
- KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
+ nvme_ctrlr_submit_io_request(ns->ctrlr, req);
return (0);
}
@@ -66,15 +58,11 @@ nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba,
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_tracker *tr;
struct nvme_command *cmd;
- int err;
req = nvme_allocate_request(payload, lba_count*512, cb_fn, cb_arg);
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
-
- if (tr == NULL)
+ if (req == NULL)
return (ENOMEM);
cmd = &req->cmd;
@@ -85,10 +73,7 @@ nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba,
*(uint64_t *)&cmd->cdw10 = lba;
cmd->cdw12 = lba_count-1;
- err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map, payload,
- req->payload_size, nvme_payload_map, tr, 0);
-
- KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
+ nvme_ctrlr_submit_io_request(ns->ctrlr, req);
return (0);
}
@@ -98,16 +83,12 @@ nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
uint8_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_tracker *tr;
struct nvme_command *cmd;
- int err;
req = nvme_allocate_request(payload,
num_ranges * sizeof(struct nvme_dsm_range), cb_fn, cb_arg);
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
-
- if (tr == NULL)
+ if (req == NULL)
return (ENOMEM);
cmd = &req->cmd;
@@ -118,10 +99,7 @@ nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
cmd->cdw10 = num_ranges;
cmd->cdw11 = NVME_DSM_ATTR_DEALLOCATE;
- err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map, payload,
- req->payload_size, nvme_payload_map, tr, 0);
-
- KASSERT(err == 0, ("bus_dmamap_load returned non-zero!\n"));
+ nvme_ctrlr_submit_io_request(ns->ctrlr, req);
return (0);
}
@@ -130,21 +108,18 @@ int
nvme_ns_cmd_flush(struct nvme_namespace *ns, nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
- struct nvme_tracker *tr;
struct nvme_command *cmd;
req = nvme_allocate_request(NULL, 0, cb_fn, cb_arg);
- tr = nvme_allocate_tracker(ns->ctrlr, FALSE, req);
-
- if (tr == NULL)
+ if (req == NULL)
return (ENOMEM);
cmd = &req->cmd;
cmd->opc = NVME_OPC_FLUSH;
cmd->nsid = ns->id;
- nvme_qpair_submit_cmd(tr->qpair, tr);
+ nvme_ctrlr_submit_io_request(ns->ctrlr, req);
return (0);
}
OpenPOWER on IntegriCloud