fix: READ_CAPACITY command for 12 bytes CDB SCSI device.
[lunaix-os.git] / lunaix-os / kernel / device.c
index 9cb2fa1d0d2d515b01168e55c0987644d57bce16..017f3b331114c5da0984a90b3632cb14f5f8565d 100644 (file)
@@ -8,27 +8,28 @@ struct llist_header dev_list;
 static struct twifs_node* dev_root;
 
 int
-__dev_read(struct v_file* file, void* buffer, size_t len);
+__dev_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
 
 int
-__dev_write(struct v_file* file, void* buffer, size_t len);
+__dev_write(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
 
 void
 device_init()
 {
-    dev_root = twifs_toplevel_node("dev", 3);
+    dev_root = twifs_toplevel_node("dev", 3, 0);
 
     llist_init_head(&dev_list);
 }
 
 struct device*
-device_add(struct device* parent, void* underlay, char* name_fmt, ...)
+__device_add(struct device* parent,
+             void* underlay,
+             char* name_fmt,
+             uint32_t type,
+             va_list args)
 {
     struct device* dev = vzalloc(sizeof(struct device));
 
-    va_list args;
-    va_start(args, name_fmt);
-
     size_t strlen =
       __sprintf_internal(dev->name_val, name_fmt, DEVICE_NAME_SIZE, args);
 
@@ -40,39 +41,64 @@ device_add(struct device* parent, void* underlay, char* name_fmt, ...)
     llist_append(&dev_list, &dev->dev_list);
 
     struct twifs_node* dev_node =
-      twifs_file_node(dev_root, dev->name_val, strlen);
+      twifs_file_node(dev_root, dev->name_val, strlen, type);
     dev_node->data = dev;
-    dev_node->fops.read = __dev_read;
-    dev_node->fops.write = __dev_write;
+    dev_node->ops.read = __dev_read;
+    dev_node->ops.write = __dev_write;
 
     dev->fs_node = dev_node;
 
+    return dev;
+}
+
+struct device*
+device_addseq(struct device* parent, void* underlay, char* name_fmt, ...)
+{
+    va_list args;
+    va_start(args, name_fmt);
+
+    struct device* dev =
+      __device_add(parent, underlay, name_fmt, VFS_IFSEQDEV, args);
+
+    va_end(args);
+    return dev;
+}
+
+struct device*
+device_addvol(struct device* parent, void* underlay, char* name_fmt, ...)
+{
+    va_list args;
+    va_start(args, name_fmt);
+
+    struct device* dev =
+      __device_add(parent, underlay, name_fmt, VFS_IFVOLDEV, args);
+
     va_end(args);
     return dev;
 }
 
 int
-__dev_read(struct v_file* file, void* buffer, size_t len)
+__dev_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos)
 {
-    struct twifs_node* dev_node = (struct twifs_node*)file->inode->data;
+    struct twifs_node* dev_node = (struct twifs_node*)inode->data;
     struct device* dev = (struct device*)dev_node->data;
 
     if (!dev->read) {
         return ENOTSUP;
     }
-    return dev->read(dev, buffer, file->f_pos, len);
+    return dev->read(dev, buffer, fpos, len);
 }
 
 int
-__dev_write(struct v_file* file, void* buffer, size_t len)
+__dev_write(struct v_inode* inode, void* buffer, size_t len, size_t fpos)
 {
-    struct twifs_node* dev_node = (struct twifs_node*)file->inode->data;
+    struct twifs_node* dev_node = (struct twifs_node*)inode->data;
     struct device* dev = (struct device*)dev_node->data;
 
     if (!dev->write) {
         return ENOTSUP;
     }
-    return dev->write(dev, buffer, file->f_pos, len);
+    return dev->write(dev, buffer, fpos, len);
 }
 
 void