diff options
author | Stefan Hajnoczi | 2019-10-23 12:04:13 +0200 |
---|---|---|
committer | Michael S. Tsirkin | 2019-10-25 13:46:22 +0200 |
commit | e73255be96bf435fe6bf9a5c196dcd7c76adb0da (patch) | |
tree | 964539b964e4214eca8f4dc3d4b8dca90043569e /tests/virtio-scsi-test.c | |
parent | libqos: extend feature bits to 64-bit (diff) | |
download | qemu-e73255be96bf435fe6bf9a5c196dcd7c76adb0da.tar.gz qemu-e73255be96bf435fe6bf9a5c196dcd7c76adb0da.tar.xz qemu-e73255be96bf435fe6bf9a5c196dcd7c76adb0da.zip |
virtio-scsi-test: add missing feature negotiation
VIRTIO Device Initialization requires feature negotiation. Currently
virtio-scsi-test.c is non-compliant.
libqos tests acknowledge all feature bits advertised by the device,
except VIRTIO_F_BAD_FEATURE (which devices use to detect broken
drivers!) and VIRTIO_RING_F_EVENT_IDX (which is not implemented in
libqos and accepting it would break notifications).
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-Id: <20191023100425.12168-5-stefanha@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Thomas Huth" <thuth@redhat.com>
Diffstat (limited to 'tests/virtio-scsi-test.c')
-rw-r--r-- | tests/virtio-scsi-test.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c index 7c8f9b27f8..0415e75876 100644 --- a/tests/virtio-scsi-test.c +++ b/tests/virtio-scsi-test.c @@ -123,10 +123,16 @@ static QVirtioSCSIQueues *qvirtio_scsi_init(QVirtioDevice *dev) QVirtioSCSIQueues *vs; const uint8_t test_unit_ready_cdb[VIRTIO_SCSI_CDB_SIZE] = {}; struct virtio_scsi_cmd_resp resp; + uint64_t features; int i; vs = g_new0(QVirtioSCSIQueues, 1); vs->dev = dev; + + features = qvirtio_get_features(dev); + features &= ~(QVIRTIO_F_BAD_FEATURE | (1ull << VIRTIO_RING_F_EVENT_IDX)); + qvirtio_set_features(dev, features); + vs->num_queues = qvirtio_config_readl(dev, 0); g_assert_cmpint(vs->num_queues, <, MAX_NUM_QUEUES); @@ -135,6 +141,8 @@ static QVirtioSCSIQueues *qvirtio_scsi_init(QVirtioDevice *dev) vs->vq[i] = qvirtqueue_setup(dev, alloc, i); } + qvirtio_set_driver_ok(dev); + /* Clear the POWER ON OCCURRED unit attention */ g_assert_cmpint(virtio_scsi_do_command(vs, test_unit_ready_cdb, NULL, 0, NULL, 0, &resp), |