summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_ns_cmd.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2013-04-01 16:23:34 +0000
committerjimharris <jimharris@FreeBSD.org>2013-04-01 16:23:34 +0000
commitc4799f93b1f433fa89bc025d115ebfab7642becc (patch)
tree6193d8fa376e042d95c0425e902862feeab0da0c /sys/dev/nvme/nvme_ns_cmd.c
parentba76652a6fffac982314a5d34e37ca4f1ff381b1 (diff)
downloadFreeBSD-src-c4799f93b1f433fa89bc025d115ebfab7642becc.zip
FreeBSD-src-c4799f93b1f433fa89bc025d115ebfab7642becc.tar.gz
Add unmapped bio support to nvme(4) and nvd(4).
Sponsored by: Intel
Diffstat (limited to 'sys/dev/nvme/nvme_ns_cmd.c')
-rw-r--r--sys/dev/nvme/nvme_ns_cmd.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/sys/dev/nvme/nvme_ns_cmd.c b/sys/dev/nvme/nvme_ns_cmd.c
index 011ce4d..50ec120 100644
--- a/sys/dev/nvme/nvme_ns_cmd.c
+++ b/sys/dev/nvme/nvme_ns_cmd.c
@@ -54,6 +54,35 @@ nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, uint64_t lba,
}
int
+nvme_ns_cmd_read_bio(struct nvme_namespace *ns, struct bio *bp,
+ nvme_cb_fn_t cb_fn, void *cb_arg)
+{
+ struct nvme_request *req;
+ struct nvme_command *cmd;
+ uint64_t lba;
+ uint64_t lba_count;
+
+ req = nvme_allocate_request_bio(bp, cb_fn, cb_arg);
+
+ if (req == NULL)
+ return (ENOMEM);
+ cmd = &req->cmd;
+ cmd->opc = NVME_OPC_READ;
+ cmd->nsid = ns->id;
+
+ lba = bp->bio_offset / nvme_ns_get_sector_size(ns);
+ lba_count = bp->bio_bcount / nvme_ns_get_sector_size(ns);
+
+ /* TODO: create a read command data structure */
+ *(uint64_t *)&cmd->cdw10 = lba;
+ cmd->cdw12 = lba_count-1;
+
+ nvme_ctrlr_submit_io_request(ns->ctrlr, req);
+
+ return (0);
+}
+
+int
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)
{
@@ -80,6 +109,35 @@ nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba,
}
int
+nvme_ns_cmd_write_bio(struct nvme_namespace *ns, struct bio *bp,
+ nvme_cb_fn_t cb_fn, void *cb_arg)
+{
+ struct nvme_request *req;
+ struct nvme_command *cmd;
+ uint64_t lba;
+ uint64_t lba_count;
+
+ req = nvme_allocate_request_bio(bp, cb_fn, cb_arg);
+
+ if (req == NULL)
+ return (ENOMEM);
+ cmd = &req->cmd;
+ cmd->opc = NVME_OPC_WRITE;
+ cmd->nsid = ns->id;
+
+ lba = bp->bio_offset / nvme_ns_get_sector_size(ns);
+ lba_count = bp->bio_bcount / nvme_ns_get_sector_size(ns);
+
+ /* TODO: create a write command data structure */
+ *(uint64_t *)&cmd->cdw10 = lba;
+ cmd->cdw12 = lba_count-1;
+
+ nvme_ctrlr_submit_io_request(ns->ctrlr, req);
+
+ return (0);
+}
+
+int
nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload,
uint8_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg)
{
OpenPOWER on IntegriCloud