diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h --- a/sys/dev/nvme/nvme_private.h +++ b/sys/dev/nvme/nvme_private.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -114,21 +115,11 @@ int done; }; -#define NVME_REQUEST_VADDR 1 -#define NVME_REQUEST_NULL 2 /* For requests with no payload. */ -#define NVME_REQUEST_UIO 3 -#define NVME_REQUEST_BIO 4 -#define NVME_REQUEST_CCB 5 - struct nvme_request { struct nvme_command cmd; struct nvme_qpair *qpair; - union { - void *payload; - struct bio *bio; - } u; - uint32_t type; - uint32_t payload_size; + struct memdesc payload; + bool payload_valid; bool timeout; nvme_cb_fn_t cb_fn; void *cb_arg; @@ -521,9 +512,8 @@ req = _nvme_allocate_request(cb_fn, cb_arg); if (req != NULL) { - req->type = NVME_REQUEST_VADDR; - req->u.payload = payload; - req->payload_size = payload_size; + req->payload = memdesc_vaddr(payload, payload_size); + req->payload_valid = true; } return (req); } @@ -534,8 +524,6 @@ struct nvme_request *req; req = _nvme_allocate_request(cb_fn, cb_arg); - if (req != NULL) - req->type = NVME_REQUEST_NULL; return (req); } @@ -546,8 +534,8 @@ req = _nvme_allocate_request(cb_fn, cb_arg); if (req != NULL) { - req->type = NVME_REQUEST_BIO; - req->u.bio = bio; + req->payload = memdesc_bio(bio); + req->payload_valid = true; } return (req); } @@ -559,8 +547,8 @@ req = _nvme_allocate_request(cb_fn, cb_arg); if (req != NULL) { - req->type = NVME_REQUEST_CCB; - req->u.payload = ccb; + req->payload = memdesc_ccb(ccb); + req->payload_valid = true; } return (req); diff --git a/sys/dev/nvme/nvme_qpair.c b/sys/dev/nvme/nvme_qpair.c --- a/sys/dev/nvme/nvme_qpair.c +++ b/sys/dev/nvme/nvme_qpair.c @@ -447,7 +447,7 @@ KASSERT(cpl->cid == req->cmd.cid, ("cpl cid does not match cmd cid\n")); if (!retry) { - if (req->type != NVME_REQUEST_NULL) { + if (req->payload_valid) { bus_dmamap_sync(qpair->dma_tag_payload, tr->payload_dma_map, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); @@ -462,7 +462,7 @@ req->retries++; nvme_qpair_submit_tracker(qpair, tr); } else { - if (req->type != NVME_REQUEST_NULL) { + if (req->payload_valid) { bus_dmamap_unload(qpair->dma_tag_payload, tr->payload_dma_map); } @@ -1179,45 +1179,13 @@ tr->deadline = SBT_MAX; tr->req = req; - switch (req->type) { - case NVME_REQUEST_VADDR: - KASSERT(req->payload_size <= qpair->ctrlr->max_xfer_size, - ("payload_size (%d) exceeds max_xfer_size (%d)\n", - req->payload_size, qpair->ctrlr->max_xfer_size)); - err = bus_dmamap_load(tr->qpair->dma_tag_payload, - tr->payload_dma_map, req->u.payload, req->payload_size, - nvme_payload_map, tr, 0); - if (err != 0) - nvme_printf(qpair->ctrlr, - "bus_dmamap_load returned 0x%x!\n", err); - break; - case NVME_REQUEST_NULL: + if (!req->payload_valid) { nvme_qpair_submit_tracker(tr->qpair, tr); - break; - case NVME_REQUEST_BIO: - KASSERT(req->u.bio->bio_bcount <= qpair->ctrlr->max_xfer_size, - ("bio->bio_bcount (%jd) exceeds max_xfer_size (%d)\n", - (intmax_t)req->u.bio->bio_bcount, - qpair->ctrlr->max_xfer_size)); - err = bus_dmamap_load_bio(tr->qpair->dma_tag_payload, - tr->payload_dma_map, req->u.bio, nvme_payload_map, tr, 0); - if (err != 0) - nvme_printf(qpair->ctrlr, - "bus_dmamap_load_bio returned 0x%x!\n", err); - break; - case NVME_REQUEST_CCB: - err = bus_dmamap_load_ccb(tr->qpair->dma_tag_payload, - tr->payload_dma_map, req->u.payload, - nvme_payload_map, tr, 0); - if (err != 0) - nvme_printf(qpair->ctrlr, - "bus_dmamap_load_ccb returned 0x%x!\n", err); - break; - default: - panic("unknown nvme request type 0x%x\n", req->type); - break; + return; } + err = bus_dmamap_load_mem(tr->qpair->dma_tag_payload, + tr->payload_dma_map, &req->payload, nvme_payload_map, tr, 0); if (err != 0) { /* * The dmamap operation failed, so we manually fail the @@ -1226,6 +1194,8 @@ * nvme_qpair_manual_complete_tracker must not be called * with the qpair lock held. */ + nvme_printf(qpair->ctrlr, + "bus_dmamap_load_mem returned 0x%x!\n", err); mtx_unlock(&qpair->lock); nvme_qpair_manual_complete_tracker(tr, NVME_SCT_GENERIC, NVME_SC_DATA_TRANSFER_ERROR, DO_NOT_RETRY, ERROR_PRINT_ALL);