virtio-ccw: handle virtio 1 only devices
As a preparation for wiring-up virtio-crypto, the first non-transitional virtio device on the ccw transport, let us introduce a mechanism for disabling revision 0. This is more or less equivalent with disabling legacy as revision 0 is legacy only, and legacy drivers use the revision 0 exclusively. Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
ba690c7171
commit
47e13dfd86
@ -280,6 +280,15 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
|
||||
ccw.cmd_code);
|
||||
check_len = !((ccw.flags & CCW_FLAG_SLI) && !(ccw.flags & CCW_FLAG_DC));
|
||||
|
||||
if (dev->force_revision_1 && dev->revision < 0 &&
|
||||
ccw.cmd_code != CCW_CMD_SET_VIRTIO_REV) {
|
||||
/*
|
||||
* virtio-1 drivers must start with negotiating to a revision >= 1,
|
||||
* so post a command reject for all other commands
|
||||
*/
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
/* Look at the command. */
|
||||
switch (ccw.cmd_code) {
|
||||
case CCW_CMD_SET_VQ:
|
||||
@ -638,7 +647,8 @@ static int virtio_ccw_cb(SubchDev *sch, CCW1 ccw)
|
||||
* need to fetch it here. Nothing to do for now, though.
|
||||
*/
|
||||
if (dev->revision >= 0 ||
|
||||
revinfo.revision > virtio_ccw_rev_max(dev)) {
|
||||
revinfo.revision > virtio_ccw_rev_max(dev) ||
|
||||
(dev->force_revision_1 && !revinfo.revision)) {
|
||||
ret = -ENOSYS;
|
||||
break;
|
||||
}
|
||||
@ -669,6 +679,12 @@ static void virtio_ccw_device_realize(VirtioCcwDevice *dev, Error **errp)
|
||||
if (!sch) {
|
||||
return;
|
||||
}
|
||||
if (!virtio_ccw_rev_max(dev) && dev->force_revision_1) {
|
||||
error_setg(&err, "Invalid value of property max_rev "
|
||||
"(is %d expected >= 1)", virtio_ccw_rev_max(dev));
|
||||
error_propagate(errp, err);
|
||||
return;
|
||||
}
|
||||
|
||||
sch->driver_data = dev;
|
||||
sch->ccw_cb = virtio_ccw_cb;
|
||||
|
@ -94,6 +94,7 @@ struct VirtioCcwDevice {
|
||||
IndAddr *indicators2;
|
||||
IndAddr *summary_indicator;
|
||||
uint64_t ind_bit;
|
||||
bool force_revision_1;
|
||||
};
|
||||
|
||||
/* The maximum virtio revision we support. */
|
||||
|
Loading…
Reference in New Issue
Block a user