diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2015-06-26 10:22:55 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2015-07-01 16:35:50 +0200 |
commit | 604a6f1d558e9b7d10ed5f4e2996208753dac1f0 (patch) | |
tree | f8601caf5c741e7b67b0024609279f483246c799 /src/hw/virtio-scsi.c | |
parent | 6c14fef45e5b56eb81b29220989f84cbdb1bae2c (diff) | |
download | seabios-604a6f1d558e9b7d10ed5f4e2996208753dac1f0.tar.gz |
virtio-scsi: fix initialization for version 1.0
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'src/hw/virtio-scsi.c')
-rw-r--r-- | src/hw/virtio-scsi.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/src/hw/virtio-scsi.c b/src/hw/virtio-scsi.c index 8073c774..89dcb8db 100644 --- a/src/hw/virtio-scsi.c +++ b/src/hw/virtio-scsi.c @@ -151,14 +151,35 @@ init_virtio_scsi(struct pci_device *pci) return; } vp_init_simple(vp, pci); + u8 status = VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER; + + if (vp->use_modern) { + u64 features = vp_get_features(vp); + u64 version1 = 1ull << VIRTIO_F_VERSION_1; + if (!(features & version1)) { + dprintf(1, "modern device without virtio_1 feature bit: %x:%x\n", + pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); + goto fail; + } + + vp_set_features(vp, version1); + status |= VIRTIO_CONFIG_S_FEATURES_OK; + vp_set_status(vp, status); + if (!(vp_get_status(vp) & VIRTIO_CONFIG_S_FEATURES_OK)) { + dprintf(1, "device didn't accept features: %x:%x\n", + pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); + goto fail; + } + } + if (vp_find_vq(vp, 2, &vq) < 0 ) { dprintf(1, "fail to find vq for virtio-scsi %x:%x\n", pci_bdf_to_bus(bdf), pci_bdf_to_dev(bdf)); goto fail; } - vp_set_status(vp, VIRTIO_CONFIG_S_ACKNOWLEDGE | - VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK); + status |= VIRTIO_CONFIG_S_DRIVER_OK; + vp_set_status(vp, status); int i, tot; for (tot = 0, i = 0; i < 256; i++) |