diff --git a/components/drivers/virtio/virtio_blk.c b/components/drivers/virtio/virtio_blk.c index 9629f3cac505fd2d16745bf96dd401a2f0ea5cfe..a568a7008a42c06c56459b863f575d98f665fedd 100644 --- a/components/drivers/virtio/virtio_blk.c +++ b/components/drivers/virtio/virtio_blk.c @@ -21,7 +21,7 @@ static void virtio_blk_rw(struct virtio_blk_device *virtio_blk_dev, rt_off_t pos int flags) { rt_uint16_t idx[3]; - rt_size_t size = count * VIRTIO_BLK_BUF_DATA_SIZE; + rt_size_t size = count * virtio_blk_dev->config->blk_size; struct virtio_device *virtio_dev = &virtio_blk_dev->virtio_dev; #ifdef RT_USING_SMP @@ -45,7 +45,7 @@ static void virtio_blk_rw(struct virtio_blk_device *virtio_blk_dev, rt_off_t pos virtio_blk_dev->info[idx[0]].valid = RT_TRUE; virtio_blk_dev->info[idx[0]].req.type = flags; virtio_blk_dev->info[idx[0]].req.ioprio = 0; - virtio_blk_dev->info[idx[0]].req.sector = pos * count; + virtio_blk_dev->info[idx[0]].req.sector = pos * (virtio_blk_dev->config->blk_size / 512); flags = flags == VIRTIO_BLK_T_OUT ? 0 : VIRTQ_DESC_F_WRITE; @@ -114,7 +114,7 @@ static rt_err_t virtio_blk_control(rt_device_t dev, int cmd, void *args) } geometry->bytes_per_sector = VIRTIO_BLK_BYTES_PER_SECTOR; - geometry->block_size = VIRTIO_BLK_BLOCK_SIZE; + geometry->block_size = virtio_blk_dev->config->blk_size; geometry->sector_count = virtio_blk_dev->config->capacity; } break; diff --git a/components/drivers/virtio/virtio_blk.h b/components/drivers/virtio/virtio_blk.h index e3c3e9d58767dab4759db4ff4ac3451662593f49..548bcee4c819d2e367a8d5032c380877f6bb3a9a 100644 --- a/components/drivers/virtio/virtio_blk.h +++ b/components/drivers/virtio/virtio_blk.h @@ -17,9 +17,7 @@ #include #define VIRTIO_BLK_QUEUE 0 -#define VIRTIO_BLK_BUF_DATA_SIZE 512 #define VIRTIO_BLK_BYTES_PER_SECTOR 512 -#define VIRTIO_BLK_BLOCK_SIZE 512 #define VIRTIO_BLK_QUEUE_RING_SIZE 4 #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ @@ -43,10 +41,11 @@ struct virtio_blk_req struct virtio_blk_config { - rt_uint64_t capacity; - rt_uint32_t size_max; - rt_uint32_t seg_max; + rt_uint64_t capacity; /* The capacity (in 512-byte sectors). */ + rt_uint32_t size_max; /* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */ + rt_uint32_t seg_max; /* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */ + /* Geometry of the device (if VIRTIO_BLK_F_GEOMETRY) */ struct virtio_blk_geometry { rt_uint16_t cylinders; @@ -54,7 +53,7 @@ struct virtio_blk_config rt_uint8_t sectors; } geometry; - rt_uint32_t blk_size; + rt_uint32_t blk_size; /* Block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ struct virtio_blk_topology {