aboutsummaryrefslogtreecommitdiffstats
path: root/src/hw/virtio-scsi.c
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2015-06-26 10:22:55 +0200
committerGerd Hoffmann <kraxel@redhat.com>2015-07-01 16:35:50 +0200
commit604a6f1d558e9b7d10ed5f4e2996208753dac1f0 (patch)
treef8601caf5c741e7b67b0024609279f483246c799 /src/hw/virtio-scsi.c
parent6c14fef45e5b56eb81b29220989f84cbdb1bae2c (diff)
downloadseabios-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.c25
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++)