aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2009-05-14 22:35:07 +0100
committerPaul Brook <paul@codesourcery.com>2009-05-14 22:35:07 +0100
commit6f68ecb2c11d90212d6f7d06c857843d30abcfdc (patch)
treee6926e91f567d60f0498556fe76de233ea5bb536
parent6b1b92d35b247188139c3dd022fd9521882ef8a9 (diff)
qdev scsi bus infrastructure
Signed-off-by: Paul Brook <paul@codesourcery.com>
-rw-r--r--hw/qdev.c19
-rw-r--r--hw/qdev.h4
2 files changed, 23 insertions, 0 deletions
diff --git a/hw/qdev.c b/hw/qdev.c
index db6f696d2d..a97f42589c 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -265,3 +265,22 @@ void qdev_attach_child_bus(DeviceState *dev, const char *name, void *bus)
p->next = dev->child_bus;
dev->child_bus = p;
}
+
+static int next_scsi_bus;
+
+/* Create a scsi bus, and attach devices to it. */
+/* TODO: Actually create a scsi bus for hotplug to use. */
+void scsi_bus_new(DeviceState *host, SCSIAttachFn attach)
+{
+ int bus = next_scsi_bus++;
+ int unit;
+ int index;
+
+ for (unit = 0; unit < MAX_SCSI_DEVS; unit++) {
+ index = drive_get_index(IF_SCSI, bus, unit);
+ if (index == -1) {
+ continue;
+ }
+ attach(host, drives_table[index].bdrv, unit);
+ }
+}
diff --git a/hw/qdev.h b/hw/qdev.h
index 5570e79923..eb4ac2f6f9 100644
--- a/hw/qdev.h
+++ b/hw/qdev.h
@@ -44,6 +44,8 @@ void *qdev_get_child_bus(DeviceState *dev, const char *name);
/*** Device API. ***/
typedef void (*qdev_initfn)(DeviceState *dev, void *opaque);
+typedef void (*SCSIAttachFn)(DeviceState *host, BlockDriverState *bdrv,
+ int unit);
DeviceType *qdev_register(const char *name, int size, qdev_initfn init,
void *opaque);
@@ -54,6 +56,8 @@ void qdev_init_gpio_in(DeviceState *dev, qemu_irq_handler handler, int n);
void qdev_init_gpio_out(DeviceState *dev, qemu_irq *pins, int n);
void qdev_attach_child_bus(DeviceState *dev, const char *name, void *bus);
+void scsi_bus_new(DeviceState *host, SCSIAttachFn attach);
+
CharDriverState *qdev_init_chardev(DeviceState *dev);
void *qdev_get_bus(DeviceState *dev);