summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_qpair.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2013-04-12 17:48:45 +0000
committerjimharris <jimharris@FreeBSD.org>2013-04-12 17:48:45 +0000
commit72eb2cf9e36619cc7b1dcbf99fd83a5cbf8d0ca4 (patch)
tree56772b7cdcea64177bec77fa37bcba9791b6ba4a /sys/dev/nvme/nvme_qpair.c
parent3b35b1fc99f4811a83934c659912d37fecc7483f (diff)
downloadFreeBSD-src-72eb2cf9e36619cc7b1dcbf99fd83a5cbf8d0ca4.zip
FreeBSD-src-72eb2cf9e36619cc7b1dcbf99fd83a5cbf8d0ca4.tar.gz
Move the busdma mapping functions to nvme_qpair.c.
This removes nvme_uio.c completely. Sponsored by: Intel
Diffstat (limited to 'sys/dev/nvme/nvme_qpair.c')
-rw-r--r--sys/dev/nvme/nvme_qpair.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index 9a73bd2..b9bc027 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -699,6 +699,51 @@ nvme_qpair_submit_tracker(struct nvme_qpair *qpair, struct nvme_tracker *tr)
}
static void
+nvme_payload_map(void *arg, bus_dma_segment_t *seg, int nseg, int error)
+{
+ struct nvme_tracker *tr = arg;
+ uint32_t cur_nseg;
+
+ /*
+ * If the mapping operation failed, return immediately. The caller
+ * is responsible for detecting the error status and failing the
+ * tracker manually.
+ */
+ if (error != 0)
+ return;
+
+ /*
+ * Note that we specified PAGE_SIZE for alignment and max
+ * segment size when creating the bus dma tags. So here
+ * we can safely just transfer each segment to its
+ * associated PRP entry.
+ */
+ tr->req->cmd.prp1 = seg[0].ds_addr;
+
+ if (nseg == 2) {
+ tr->req->cmd.prp2 = seg[1].ds_addr;
+ } else if (nseg > 2) {
+ cur_nseg = 1;
+ tr->req->cmd.prp2 = (uint64_t)tr->prp_bus_addr;
+ while (cur_nseg < nseg) {
+ tr->prp[cur_nseg-1] =
+ (uint64_t)seg[cur_nseg].ds_addr;
+ cur_nseg++;
+ }
+ }
+
+ nvme_qpair_submit_tracker(tr->qpair, tr);
+}
+
+static void
+nvme_payload_map_uio(void *arg, bus_dma_segment_t *seg, int nseg,
+ bus_size_t mapsize, int error)
+{
+
+ nvme_payload_map(arg, seg, nseg, error);
+}
+
+static void
_nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req)
{
struct nvme_tracker *tr;
OpenPOWER on IntegriCloud