commit 82ec0ee7bed3280952cab897810c2fe00b0abff2 Author: Paul Brook Date: Mon May 4 17:13:11 2009 +0100 qdev scsi bus infrastructure Signed-off-by: Paul Brook diff --git a/hw/qdev.c b/hw/qdev.c index 868ba75..7874049 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -309,3 +309,21 @@ BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type) } return drives_table[index].bdrv; } + +static int next_scsi_bus; + +/* Create a scsi bus, and attach devices to it. */ +void qdev_init_scsi(DeviceState *dev, 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(dev, drives_table[index].bdrv, unit); + } +} diff --git a/hw/qdev.h b/hw/qdev.h index 08b2713..79eb22f 100644 --- a/hw/qdev.h +++ b/hw/qdev.h @@ -54,6 +54,7 @@ qemu_irq qdev_get_irq_sink(DeviceState *dev, int n); /*** Device API. ***/ typedef void (*qdev_initfn)(DeviceState *dev, void *opaque); +typedef void (*SCSIAttachFn)(void *opaque, BlockDriverState *bdrv, int unit); DeviceType *qdev_register(const char *name, int size, qdev_initfn init, void *opaque); @@ -65,6 +66,7 @@ void qdev_init_mmio_cb(DeviceState *dev, target_phys_addr_t size, void qdev_init_irq(DeviceState *dev, qemu_irq *p); void qdev_pass_irq(DeviceState *dev, DeviceState *target); void qdev_init_irq_sink(DeviceState *dev, qemu_irq_handler handler, int nirq); +void qdev_init_scsi(DeviceState *dev, SCSIAttachFn attach); CharDriverState *qdev_init_chardev(DeviceState *dev);