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>
This commit is contained in:
parent
a9340358f4
commit
e73255be96
|
@ -123,10 +123,16 @@ static QVirtioSCSIQueues *qvirtio_scsi_init(QVirtioDevice *dev)
|
||||||
QVirtioSCSIQueues *vs;
|
QVirtioSCSIQueues *vs;
|
||||||
const uint8_t test_unit_ready_cdb[VIRTIO_SCSI_CDB_SIZE] = {};
|
const uint8_t test_unit_ready_cdb[VIRTIO_SCSI_CDB_SIZE] = {};
|
||||||
struct virtio_scsi_cmd_resp resp;
|
struct virtio_scsi_cmd_resp resp;
|
||||||
|
uint64_t features;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
vs = g_new0(QVirtioSCSIQueues, 1);
|
vs = g_new0(QVirtioSCSIQueues, 1);
|
||||||
vs->dev = dev;
|
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);
|
vs->num_queues = qvirtio_config_readl(dev, 0);
|
||||||
|
|
||||||
g_assert_cmpint(vs->num_queues, <, MAX_NUM_QUEUES);
|
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);
|
vs->vq[i] = qvirtqueue_setup(dev, alloc, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qvirtio_set_driver_ok(dev);
|
||||||
|
|
||||||
/* Clear the POWER ON OCCURRED unit attention */
|
/* Clear the POWER ON OCCURRED unit attention */
|
||||||
g_assert_cmpint(virtio_scsi_do_command(vs, test_unit_ready_cdb,
|
g_assert_cmpint(virtio_scsi_do_command(vs, test_unit_ready_cdb,
|
||||||
NULL, 0, NULL, 0, &resp),
|
NULL, 0, NULL, 0, &resp),
|
||||||
|
|
Loading…
Reference in a new issue