diff options
author | jimharris <jimharris@FreeBSD.org> | 2013-03-29 20:34:28 +0000 |
---|---|---|
committer | jimharris <jimharris@FreeBSD.org> | 2013-03-29 20:34:28 +0000 |
commit | 2128397eaf648b65e295eba2a5b4f2d9dcc3640b (patch) | |
tree | 2744e9774deaf9fff221c4a2a9234f52883e244d /sys/dev/nvme/nvme_private.h | |
parent | d5c182905bb3f6a19be6f99d729e9e3dd83b3e53 (diff) | |
download | FreeBSD-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.h | 35 |
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); } |