7 static struct BusInfo scsi_bus_info
= {
9 .size
= sizeof(SCSIBus
),
10 .props
= (Property
[]) {
11 DEFINE_PROP_UINT32("scsi-id", SCSIDevice
, id
, -1),
12 DEFINE_PROP_END_OF_LIST(),
15 static int next_scsi_bus
;
17 /* Create a scsi bus, and attach devices to it. */
18 void scsi_bus_new(SCSIBus
*bus
, DeviceState
*host
, int tcq
, int ndev
,
19 scsi_completionfn complete
)
21 qbus_create_inplace(&bus
->qbus
, &scsi_bus_info
, host
, NULL
);
22 bus
->busnr
= next_scsi_bus
++;
25 bus
->complete
= complete
;
28 static int scsi_qdev_init(DeviceState
*qdev
, DeviceInfo
*base
)
30 SCSIDevice
*dev
= DO_UPCAST(SCSIDevice
, qdev
, qdev
);
31 SCSIDeviceInfo
*info
= DO_UPCAST(SCSIDeviceInfo
, qdev
, base
);
32 SCSIBus
*bus
= DO_UPCAST(SCSIBus
, qbus
, dev
->qdev
.parent_bus
);
35 for (dev
->id
= 0; dev
->id
< bus
->ndev
; dev
->id
++) {
36 if (bus
->devs
[dev
->id
] == NULL
)
40 if (dev
->id
>= bus
->ndev
) {
41 qemu_error("bad scsi device id: %d\n", dev
->id
);
45 if (bus
->devs
[dev
->id
]) {
46 bus
->devs
[dev
->id
]->info
->destroy(bus
->devs
[dev
->id
]);
48 bus
->devs
[dev
->id
] = dev
;
51 return dev
->info
->init(dev
);
57 void scsi_qdev_register(SCSIDeviceInfo
*info
)
59 info
->qdev
.bus_info
= &scsi_bus_info
;
60 info
->qdev
.init
= scsi_qdev_init
;
61 qdev_register(&info
->qdev
);
64 /* handle legacy '-drive if=scsi,...' cmd line args */
65 SCSIDevice
*scsi_bus_legacy_add_drive(SCSIBus
*bus
, DriveInfo
*dinfo
, int unit
)
70 driver
= bdrv_is_sg(dinfo
->bdrv
) ? "scsi-generic" : "scsi-disk";
71 dev
= qdev_create(&bus
->qbus
, driver
);
72 qdev_prop_set_uint32(dev
, "scsi-id", unit
);
73 qdev_prop_set_drive(dev
, "drive", dinfo
);
75 return DO_UPCAST(SCSIDevice
, qdev
, dev
);
78 void scsi_bus_legacy_handle_cmdline(SCSIBus
*bus
)
83 for (unit
= 0; unit
< MAX_SCSI_DEVS
; unit
++) {
84 dinfo
= drive_get(IF_SCSI
, bus
->busnr
, unit
);
88 scsi_bus_legacy_add_drive(bus
, dinfo
, unit
);