diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2012-02-24 09:33:03 -0600 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2012-02-24 09:33:03 -0600 |
commit | 9ef1300b1b7d36794af30dcaf04e11184eb22dd2 (patch) | |
tree | 6d0973eae1f96b3724a1aed50ee666e9c9e4766c /hw/virtio-pci.c | |
parent | dcce6675de5a596e486e7dc341c3a7510d22aed6 (diff) | |
parent | eaccf49e9524dbdd43feb6a1cdafddf64252389a (diff) |
Merge remote-tracking branch 'bonzini/virtio-scsi' into staging
* bonzini/virtio-scsi:
scsi-block: always use scsi_generic_ops for cache != none
scsi: fix searching for an empty id
scsi: fix wrong return for target INQUIRY
virtio-scsi: add migration support
virtio-scsi: process control queue requests
virtio-scsi: add basic SCSI bus operation
virtio-scsi: Add basic request processing infrastructure
virtio-scsi: Add virtio-scsi stub device
scsi-disk: add migration support
scsi-generic: add migration support
scsi: add SCSIDevice vmstate definitions
scsi-disk: enable scatter/gather functionality
scsi: add scatter/gather functionality
scsi: pass residual amount to command_complete
ahci: use new DMA helpers
dma-helpers: add accounting wrappers
dma-helpers: add dma_buf_read and dma_buf_write
dma-helpers: make QEMUSGList target independent
Diffstat (limited to 'hw/virtio-pci.c')
-rw-r--r-- | hw/virtio-pci.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c index 907b52a25d..a0fb7c1b9c 100644 --- a/hw/virtio-pci.c +++ b/hw/virtio-pci.c @@ -21,6 +21,7 @@ #include "virtio-blk.h" #include "virtio-net.h" #include "virtio-serial.h" +#include "virtio-scsi.h" #include "pci.h" #include "qemu-error.h" #include "msix.h" @@ -930,12 +931,67 @@ static TypeInfo virtio_balloon_info = { .class_init = virtio_balloon_class_init, }; +static int virtio_scsi_init_pci(PCIDevice *pci_dev) +{ + VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); + VirtIODevice *vdev; + + vdev = virtio_scsi_init(&pci_dev->qdev, &proxy->scsi); + if (!vdev) { + return -EINVAL; + } + + vdev->nvectors = proxy->nvectors; + virtio_init_pci(proxy, vdev); + + /* make the actual value visible */ + proxy->nvectors = vdev->nvectors; + return 0; +} + +static int virtio_scsi_exit_pci(PCIDevice *pci_dev) +{ + VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev); + + virtio_scsi_exit(proxy->vdev); + return virtio_exit_pci(pci_dev); +} + +static Property virtio_scsi_properties[] = { + DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2), + DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOPCIProxy, host_features, scsi), + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_scsi_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PCIDeviceClass *k = PCI_DEVICE_CLASS(klass); + + k->init = virtio_scsi_init_pci; + k->exit = virtio_scsi_exit_pci; + k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; + k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI; + k->revision = 0x00; + k->class_id = PCI_CLASS_STORAGE_SCSI; + dc->reset = virtio_pci_reset; + dc->props = virtio_scsi_properties; +} + +static TypeInfo virtio_scsi_info = { + .name = "virtio-scsi-pci", + .parent = TYPE_PCI_DEVICE, + .instance_size = sizeof(VirtIOPCIProxy), + .class_init = virtio_scsi_class_init, +}; + static void virtio_pci_register_types(void) { type_register_static(&virtio_blk_info); type_register_static(&virtio_net_info); type_register_static(&virtio_serial_info); type_register_static(&virtio_balloon_info); + type_register_static(&virtio_scsi_info); } type_init(virtio_pci_register_types) |