summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_private.h
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_private.h
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_private.h')
-rw-r--r--sys/dev/nvme/nvme_private.h35
1 files changed, 28 insertions, 7 deletions
diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h
index d1cd4b1..d9946b6 100644
--- a/sys/dev/nvme/nvme_private.h
+++ b/sys/dev/nvme/nvme_private.h
@@ -123,14 +123,21 @@ struct nvme_completion_poll_status {
boolean_t done;
};
+#define NVME_REQUEST_VADDR 1
+#define NVME_REQUEST_NULL 2 /* For requests with no payload. */
+#define NVME_REQUEST_UIO 3
+
struct nvme_request {
struct nvme_command cmd;
struct nvme_qpair *qpair;
- void *payload;
+ union {
+ void *payload;
+ struct uio *uio;
+ } u;
+ uint32_t type;
uint32_t payload_size;
boolean_t timeout;
- struct uio *uio;
nvme_cb_fn_t cb_fn;
void *cb_arg;
int32_t retries;
@@ -482,27 +489,41 @@ _nvme_allocate_request(nvme_cb_fn_t cb_fn, void *cb_arg)
}
static __inline struct nvme_request *
-nvme_allocate_request(void *payload, uint32_t payload_size, nvme_cb_fn_t cb_fn,
- void *cb_arg)
+nvme_allocate_request_vaddr(void *payload, uint32_t payload_size,
+ nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
req = _nvme_allocate_request(cb_fn, cb_arg);
if (req != NULL) {
- req->payload = payload;
+ req->type = NVME_REQUEST_VADDR;
+ req->u.payload = payload;
req->payload_size = payload_size;
}
return (req);
}
static __inline struct nvme_request *
-nvme_allocate_request_uio(struct uio *uio, nvme_cb_fn_t cb_fn, void *cb_arg)
+nvme_allocate_request_null(nvme_cb_fn_t cb_fn, void *cb_arg)
{
struct nvme_request *req;
req = _nvme_allocate_request(cb_fn, cb_arg);
if (req != NULL)
- req->uio = uio;
+ req->type = NVME_REQUEST_NULL;
+ return (req);
+}
+
+static __inline struct nvme_request *
+nvme_allocate_request_uio(struct uio *uio, nvme_cb_fn_t cb_fn, void *cb_arg)
+{
+ struct nvme_request *req;
+
+ req = _nvme_allocate_request(cb_fn, cb_arg);
+ if (req != NULL) {
+ req->type = NVME_REQUEST_UIO;
+ req->u.uio = uio;
+ }
return (req);
}
OpenPOWER on IntegriCloud