Browse Source

Fixup virtio-blk with fs interface

GuEe-GUI 2 years ago
parent
commit
ca3e588720
2 changed files with 8 additions and 9 deletions
  1. 3 3
      components/drivers/virtio/virtio_blk.c
  2. 5 6
      components/drivers/virtio/virtio_blk.h

+ 3 - 3
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;

+ 5 - 6
components/drivers/virtio/virtio_blk.h

@@ -17,9 +17,7 @@
 #include <virtio.h>
 
 #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
     {