Revision 763684be
b/hw/virtio-scsi.c | ||
---|---|---|
692 | 692 |
.load_request = virtio_scsi_load_request, |
693 | 693 |
}; |
694 | 694 |
|
695 |
static VirtIODevice *virtio_scsi_common_init(DeviceState *dev, |
|
696 |
VirtIOSCSIConf *proxyconf, |
|
697 |
VirtIOSCSI **ps) |
|
695 |
static int virtio_scsi_device_init(VirtIODevice *vdev) |
|
698 | 696 |
{ |
699 |
VirtIOSCSI *s = *ps;
|
|
700 |
VirtIODevice *vdev = VIRTIO_DEVICE(s);
|
|
697 |
DeviceState *qdev = DEVICE(vdev);
|
|
698 |
VirtIOSCSI *s = VIRTIO_SCSI(vdev);
|
|
701 | 699 |
static int virtio_scsi_id; |
702 | 700 |
int i; |
703 | 701 |
|
704 |
/* |
|
705 |
* We have two cases here: the old virtio-scsi-pci device, and the |
|
706 |
* refactored virtio-scsi. |
|
707 |
*/ |
|
702 |
virtio_init(VIRTIO_DEVICE(s), "virtio-scsi", VIRTIO_ID_SCSI, |
|
703 |
sizeof(VirtIOSCSIConfig)); |
|
708 | 704 |
|
709 |
if (s == NULL) { |
|
710 |
/* virtio-scsi-pci */ |
|
711 |
s = (VirtIOSCSI *)virtio_common_init("virtio-scsi", VIRTIO_ID_SCSI, |
|
712 |
sizeof(VirtIOSCSIConfig), |
|
713 |
sizeof(VirtIOSCSI)); |
|
714 |
} else { |
|
715 |
/* virtio-scsi */ |
|
716 |
virtio_init(VIRTIO_DEVICE(s), "virtio-scsi", VIRTIO_ID_SCSI, |
|
717 |
sizeof(VirtIOSCSIConfig)); |
|
718 |
} |
|
705 |
s->cmd_vqs = g_malloc0(s->conf.num_queues * sizeof(VirtQueue *)); |
|
719 | 706 |
|
720 |
s->cmd_vqs = g_malloc0(proxyconf->num_queues * sizeof(VirtQueue *)); |
|
721 |
|
|
722 |
s->qdev = dev; |
|
723 |
s->conf = *proxyconf; |
|
707 |
s->qdev = qdev; |
|
724 | 708 |
|
725 | 709 |
/* TODO set up vdev function pointers */ |
726 | 710 |
vdev->get_config = virtio_scsi_get_config; |
... | ... | |
737 | 721 |
virtio_scsi_handle_cmd); |
738 | 722 |
} |
739 | 723 |
|
740 |
scsi_bus_new(&s->bus, dev, &virtio_scsi_scsi_info); |
|
741 |
if (!dev->hotplugged) { |
|
724 |
scsi_bus_new(&s->bus, qdev, &virtio_scsi_scsi_info);
|
|
725 |
if (!qdev->hotplugged) {
|
|
742 | 726 |
scsi_bus_legacy_handle_cmdline(&s->bus); |
743 | 727 |
} |
744 | 728 |
|
745 |
register_savevm(dev, "virtio-scsi", virtio_scsi_id++, 1, |
|
729 |
register_savevm(qdev, "virtio-scsi", virtio_scsi_id++, 1,
|
|
746 | 730 |
virtio_scsi_save, virtio_scsi_load, s); |
747 | 731 |
|
748 |
return vdev; |
|
749 |
} |
|
750 |
|
|
751 |
VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf) |
|
752 |
{ |
|
753 |
VirtIOSCSI *s = NULL; |
|
754 |
return virtio_scsi_common_init(dev, proxyconf, &s); |
|
755 |
} |
|
756 |
|
|
757 |
void virtio_scsi_exit(VirtIODevice *vdev) |
|
758 |
{ |
|
759 |
VirtIOSCSI *s = (VirtIOSCSI *)vdev; |
|
760 |
unregister_savevm(s->qdev, "virtio-scsi", s); |
|
761 |
g_free(s->cmd_vqs); |
|
762 |
virtio_cleanup(vdev); |
|
763 |
} |
|
764 |
|
|
765 |
static int virtio_scsi_device_init(VirtIODevice *vdev) |
|
766 |
{ |
|
767 |
DeviceState *qdev = DEVICE(vdev); |
|
768 |
VirtIOSCSI *s = VIRTIO_SCSI(vdev); |
|
769 |
if (virtio_scsi_common_init(qdev, &(s->conf), &s) == NULL) { |
|
770 |
return -1; |
|
771 |
} |
|
772 | 732 |
return 0; |
773 | 733 |
} |
774 | 734 |
|
Also available in: Unified diff