Index: sys/dev/nvme/nvme_qpair.c =================================================================== --- sys/dev/nvme/nvme_qpair.c (revision 336931) +++ sys/dev/nvme/nvme_qpair.c (working copy) @@ -401,6 +401,8 @@ req->retries++; nvme_qpair_submit_tracker(qpair, tr); } else { + bus_dmamap_sync(qpair->dma_tag_payload, tr->payload_dma_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); if (req->type != NVME_REQUEST_NULL) bus_dmamap_unload(qpair->dma_tag_payload, tr->payload_dma_map); @@ -487,15 +489,17 @@ */ return (false); + bus_dmamap_sync(qpair->dma_tag, qpair->queuemem_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); while (1) { cpl = qpair->cpl[qpair->cq_head]; + if (!!(cpl.status & htole16(NVME_STATUS_P_MASK)) != qpair->phase) + break; + /* Convert to host endian */ nvme_completion_swapbytes(&cpl); - if (NVME_STATUS_GET_P(cpl.status) != qpair->phase) - break; - tr = qpair->act_tr[cpl.cid]; if (tr != NULL) { @@ -822,6 +826,8 @@ nvme_timeout, tr); #endif + bus_dmamap_sync(qpair->dma_tag, qpair->queuemem_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); /* Copy the command from the tracker to the submission queue. */ memcpy(&qpair->cmd[qpair->sq_tail], &req->cmd, sizeof(req->cmd)); @@ -879,6 +885,8 @@ tr->req->cmd.prp2 = 0; } + bus_dmamap_sync(tr->qpair->dma_tag_payload, tr->payload_dma_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); nvme_qpair_submit_tracker(tr->qpair, tr); }