} if (!dev->serial) { dev->serial = qemu_strdup(s->drive_serial_str); } add_boot_device_path(dev->conf.bootindex, &dev->qdev, dev->unit ? "/disk@1" : "/disk@0"); return 0; } static IDEDeviceInfo ide_drive_info = { .qdev.name = "ide-drive", .qdev.fw_name = "drive", .qdev.size = sizeof(IDEDrive), .init = ide_drive_initfn, .qdev.props = (Property[]) { DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1), DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf), DEFINE_PROP_STRING("ver", IDEDrive, dev.version), DEFINE_PROP_STRING("serial", IDEDrive, dev.serial), DEFINE_PROP_END_OF_LIST(), } }; static void ide_drive_register(void) { ide_qdev_register(&ide_drive_info); } device_init(ide_drive_register);
} qdev_prop_set_drive(&dev->qdev, "drive", dinfo); if (qdev_init(&dev->qdev) < 0) return NULL; return dev; } static struct USBDeviceInfo msd_info = { .product_desc = "QEMU USB MSD", .qdev.name = "usb-storage", .qdev.size = sizeof(MSDState), .init = usb_msd_initfn, .handle_packet = usb_generic_handle_packet, .handle_reset = usb_msd_handle_reset, .handle_control = usb_msd_handle_control, .handle_data = usb_msd_handle_data, .usbdevice_name = "disk", .usbdevice_init = usb_msd_init, .qdev.props = (Property[]) { DEFINE_BLOCK_PROPERTIES(MSDState, conf), DEFINE_PROP_END_OF_LIST(), }, }; static void usb_msd_register_devices(void) { usb_qdev_register(&msd_info); } device_init(usb_msd_register_devices)
k->init = virtio_ccw_net_init; k->exit = virtio_ccw_net_exit; dc->reset = virtio_ccw_reset; dc->props = virtio_ccw_net_properties; } static const TypeInfo virtio_ccw_net = { .name = "virtio-net-ccw", .parent = TYPE_VIRTIO_CCW_DEVICE, .instance_size = sizeof(VirtioCcwDevice), .class_init = virtio_ccw_net_class_init, }; static Property virtio_ccw_blk_properties[] = { DEFINE_PROP_STRING("devno", VirtioCcwDevice, bus_id), DEFINE_BLOCK_PROPERTIES(VirtioCcwDevice, blk.conf), DEFINE_PROP_STRING("serial", VirtioCcwDevice, blk.serial), #ifdef __linux__ DEFINE_PROP_BIT("scsi", VirtioCcwDevice, blk.scsi, 0, true), #endif DEFINE_VIRTIO_BLK_FEATURES(VirtioCcwDevice, host_features[0]), DEFINE_PROP_END_OF_LIST(), }; static void virtio_ccw_blk_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass); k->init = virtio_ccw_blk_init; k->exit = virtio_ccw_blk_exit;
static void scsi_generic_class_initfn(ObjectClass *klass, void *data) { SCSIDeviceClass *sc = SCSI_DEVICE_CLASS(klass); sc->init = scsi_generic_initfn; sc->destroy = scsi_destroy; sc->alloc_req = scsi_new_request; } static DeviceInfo scsi_generic_info = { .name = "scsi-generic", .fw_name = "disk", .desc = "pass through generic scsi device (/dev/sg*)", .size = sizeof(SCSIDevice), .reset = scsi_generic_reset, .class_init = scsi_generic_class_initfn, .props = (Property[]) { DEFINE_BLOCK_PROPERTIES(SCSIDevice, conf), DEFINE_PROP_END_OF_LIST(), }, }; static void scsi_generic_register_devices(void) { scsi_qdev_register(&scsi_generic_info); } device_init(scsi_generic_register_devices) #endif /* __linux__ */
} static SCSIDeviceInfo scsi_generic_info = { .qdev.name = "scsi-generic", .qdev.desc = "pass through generic scsi device (/dev/sg*)", .qdev.size = sizeof(SCSIGenericState), .qdev.reset = scsi_generic_reset, .init = scsi_generic_initfn, .destroy = scsi_destroy, .alloc_req = scsi_new_request, .free_req = scsi_free_request, .send_command = scsi_send_command, .read_data = scsi_read_data, .write_data = scsi_write_data, .cancel_io = scsi_cancel_io, .get_buf = scsi_get_buf, .get_sense = scsi_get_sense, .qdev.props = (Property[]) { DEFINE_BLOCK_PROPERTIES(SCSIGenericState, qdev.conf), DEFINE_PROP_END_OF_LIST(), }, }; static void scsi_generic_register_devices(void) { scsi_qdev_register(&scsi_generic_info); } device_init(scsi_generic_register_devices) #endif /* __linux__ */