summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_qpair.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2013-03-29 20:34:28 +0000
committerjimharris <jimharris@FreeBSD.org>2013-03-29 20:34:28 +0000
commit2128397eaf648b65e295eba2a5b4f2d9dcc3640b (patch)
tree2744e9774deaf9fff221c4a2a9234f52883e244d /sys/dev/nvme/nvme_qpair.c
parentd5c182905bb3f6a19be6f99d729e9e3dd83b3e53 (diff)
downloadFreeBSD-src-2128397eaf648b65e295eba2a5b4f2d9dcc3640b.zip
FreeBSD-src-2128397eaf648b65e295eba2a5b4f2d9dcc3640b.tar.gz
Add "type" to nvme_request, signifying if its payload is a VADDR, UIO, or
NULL. This simplifies decisions around if/how requests are routed through busdma. It also paves the way for supporting unmapped bios. Sponsored by: Intel
Diffstat (limited to 'sys/dev/nvme/nvme_qpair.c')
-rw-r--r--sys/dev/nvme/nvme_qpair.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c
index 2deb4b9..62a2277 100644
--- a/sys/dev/nvme/nvme_qpair.c
+++ b/sys/dev/nvme/nvme_qpair.c
@@ -336,7 +336,7 @@ nvme_qpair_complete_tracker(struct nvme_qpair *qpair, struct nvme_tracker *tr,
req->retries++;
nvme_qpair_submit_tracker(qpair, tr);
} else {
- if (req->payload_size > 0 || req->uio != NULL)
+ if (req->type != NVME_REQUEST_NULL)
bus_dmamap_unload(qpair->dma_tag,
tr->payload_dma_map);
@@ -740,22 +740,26 @@ _nvme_qpair_submit_request(struct nvme_qpair *qpair, struct nvme_request *req)
TAILQ_INSERT_TAIL(&qpair->outstanding_tr, tr, tailq);
tr->req = req;
- if (req->uio == NULL) {
- if (req->payload_size > 0) {
- err = bus_dmamap_load(tr->qpair->dma_tag,
- tr->payload_dma_map, req->payload,
- req->payload_size,
- nvme_payload_map, tr, 0);
- if (err != 0)
- panic("bus_dmamap_load returned non-zero!\n");
- } else
- nvme_qpair_submit_tracker(tr->qpair, tr);
- } else {
- err = bus_dmamap_load_uio(tr->qpair->dma_tag,
- tr->payload_dma_map, req->uio,
- nvme_payload_map_uio, tr, 0);
+ switch (req->type) {
+ case NVME_REQUEST_VADDR:
+ err = bus_dmamap_load(tr->qpair->dma_tag, tr->payload_dma_map,
+ req->u.payload, req->payload_size, nvme_payload_map, tr, 0);
if (err != 0)
panic("bus_dmamap_load returned non-zero!\n");
+ break;
+ case NVME_REQUEST_NULL:
+ nvme_qpair_submit_tracker(tr->qpair, tr);
+ break;
+ case NVME_REQUEST_UIO:
+ err = bus_dmamap_load_uio(tr->qpair->dma_tag,
+ tr->payload_dma_map, req->u.uio, nvme_payload_map_uio,
+ tr, 0);
+ if (err != 0)
+ panic("bus_dmamap_load_uio returned non-zero!\n");
+ break;
+ default:
+ panic("unknown nvme request type 0x%x\n", req->type);
+ break;
}
}
OpenPOWER on IntegriCloud