diff options
Diffstat (limited to 'rtemsbsd/sys/dev/nvd')
-rw-r--r-- | rtemsbsd/sys/dev/nvd/nvd.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/rtemsbsd/sys/dev/nvd/nvd.c b/rtemsbsd/sys/dev/nvd/nvd.c index 897b0af6..4a8e8ac1 100644 --- a/rtemsbsd/sys/dev/nvd/nvd.c +++ b/rtemsbsd/sys/dev/nvd/nvd.c @@ -43,6 +43,7 @@ #include <stdatomic.h> #include <rtems/blkdev.h> +#include <rtems/thread.h> #define NVD_STR "nvd" @@ -164,10 +165,9 @@ nvd_completion(void *arg, const struct nvme_completion *status) static int nvd_request(struct nvd_disk *ndisk, rtems_blkdev_request *req, - uint32_t media_blocks_per_block) + uint32_t media_block_size) { uint32_t i; - uint32_t lb_count; uint32_t bufnum; BSD_ASSERT(req->req == RTEMS_BLKDEV_REQ_READ || @@ -178,13 +178,15 @@ nvd_request(struct nvd_disk *ndisk, rtems_blkdev_request *req, req->status = RTEMS_SUCCESSFUL; bufnum = req->bufnum; req->bufnum |= bufnum << NVD_BUFNUM_SHIFT; - lb_count = media_blocks_per_block * ndisk->lb_per_media_block; for (i = 0; i < bufnum; ++i) { rtems_blkdev_sg_buffer *sg; + uint32_t lb_count; int error; sg = &req->bufs[i]; + lb_count = (sg->length / media_block_size) * + ndisk->lb_per_media_block; if (req->req == RTEMS_BLKDEV_REQ_READ) { error = nvme_ns_cmd_read(ndisk->ns, sg->buffer, @@ -208,28 +210,27 @@ nvd_request(struct nvd_disk *ndisk, rtems_blkdev_request *req, static void nvd_sync_completion(void *arg, const struct nvme_completion *status) { - rtems_status_code sc; - - if (nvme_completion_is_error(status)) { - sc = RTEMS_IO_ERROR; - } else { - sc = RTEMS_SUCCESSFUL; - } + rtems_binary_semaphore *sync; - rtems_blkdev_request_done(arg, sc); + sync = arg; + rtems_binary_semaphore_post(sync); } static int -nvd_sync(struct nvd_disk *ndisk, rtems_blkdev_request *req) +nvd_sync(struct nvd_disk *ndisk) { + rtems_binary_semaphore sync; int error; - error = nvme_ns_cmd_flush(ndisk->ns, nvd_sync_completion, req); - if (error != 0) { - rtems_blkdev_request_done(req, RTEMS_NO_MEMORY); + rtems_binary_semaphore_init(&sync, "nvd sync"); + + error = nvme_ns_cmd_flush(ndisk->ns, nvd_sync_completion, &sync); + if (error == 0) { + rtems_binary_semaphore_wait(&sync); } - return (0); + rtems_binary_semaphore_destroy(&sync); + return (error); } static int @@ -240,11 +241,11 @@ nvd_ioctl(rtems_disk_device *dd, uint32_t req, void *arg) ndisk = rtems_disk_get_driver_data(dd); if (req == RTEMS_BLKIO_REQUEST) { - return (nvd_request(ndisk, arg, dd->media_blocks_per_block)); + return (nvd_request(ndisk, arg, dd->media_block_size)); } if (req == RTEMS_BLKDEV_REQ_SYNC) { - return (nvd_sync(ndisk, arg)); + return (nvd_sync(ndisk)); } if (req == RTEMS_BLKIO_CAPABILITIES) { |