diff options
author | jimharris <jimharris@FreeBSD.org> | 2013-04-01 16:23:34 +0000 |
---|---|---|
committer | jimharris <jimharris@FreeBSD.org> | 2013-04-01 16:23:34 +0000 |
commit | c4799f93b1f433fa89bc025d115ebfab7642becc (patch) | |
tree | 6193d8fa376e042d95c0425e902862feeab0da0c /sys/dev/nvme/nvme_ns_cmd.c | |
parent | ba76652a6fffac982314a5d34e37ca4f1ff381b1 (diff) | |
download | FreeBSD-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.c | 58 |
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) { |