1be5c7
From a60940fb7ef026f3aa968e77389efa51ea648ddf Mon Sep 17 00:00:00 2001
1be5c7
From: Thomas Huth <thuth@redhat.com>
1be5c7
Date: Fri, 8 Jul 2022 12:29:50 +0200
1be5c7
Subject: [PATCH 34/37] pc-bios/s390-ccw/virtio: Read device config after
1be5c7
 feature negotiation
1be5c7
1be5c7
RH-Author: Thomas Huth <thuth@redhat.com>
1be5c7
RH-MergeRequest: 198: pc-bios/s390-ccw: Fix boot from disks with 4k sectors that do not have the typical DASD geometry
1be5c7
RH-Commit: [6/9] 99ed8765d614207db19ded75d62c65171674d982
1be5c7
RH-Bugzilla: 2098076
1be5c7
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
1be5c7
RH-Acked-by: David Hildenbrand <david@redhat.com>
1be5c7
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
1be5c7
1be5c7
Bugzilla: http://bugzilla.redhat.com/2098076
1be5c7
1be5c7
commit aa5c69ce99411c4886bcd051f288afc02b6d968d
1be5c7
Author: Thomas Huth <thuth@redhat.com>
1be5c7
Date:   Mon Jul 4 13:18:58 2022 +0200
1be5c7
1be5c7
    pc-bios/s390-ccw/virtio: Read device config after feature negotiation
1be5c7
1be5c7
    Feature negotiation should be done first, since some fields in the
1be5c7
    config area can depend on the negotiated features and thus should
1be5c7
    rather be read afterwards.
1be5c7
1be5c7
    While we're at it, also adjust the error message here a little bit
1be5c7
    (the code is nowadays used for non-block virtio devices, too).
1be5c7
1be5c7
    Message-Id: <20220704111903.62400-8-thuth@redhat.com>
1be5c7
    Reviewed-by: Eric Farman <farman@linux.ibm.com>
1be5c7
    Reviewed-by: Cornelia Huck <cohuck@redhat.com>
1be5c7
    Signed-off-by: Thomas Huth <thuth@redhat.com>
1be5c7
1be5c7
Signed-off-by: Thomas Huth <thuth@redhat.com>
1be5c7
---
1be5c7
 pc-bios/s390-ccw/virtio.c | 7 +++----
1be5c7
 1 file changed, 3 insertions(+), 4 deletions(-)
1be5c7
1be5c7
diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
1be5c7
index 4e85a2eb82..d8c2b52710 100644
1be5c7
--- a/pc-bios/s390-ccw/virtio.c
1be5c7
+++ b/pc-bios/s390-ccw/virtio.c
1be5c7
@@ -262,10 +262,6 @@ void virtio_setup_ccw(VDev *vdev)
1be5c7
     rc = run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false);
1be5c7
     IPL_assert(rc == 0, "Could not write DRIVER status to host");
1be5c7
 
1be5c7
-    IPL_assert(
1be5c7
-        run_ccw(vdev, CCW_CMD_READ_CONF, &vdev->config, cfg_size, false) == 0,
1be5c7
-       "Could not get block device configuration");
1be5c7
-
1be5c7
     /* Feature negotiation */
1be5c7
     for (i = 0; i < ARRAY_SIZE(vdev->guest_features); i++) {
1be5c7
         feats.features = 0;
1be5c7
@@ -278,6 +274,9 @@ void virtio_setup_ccw(VDev *vdev)
1be5c7
         IPL_assert(rc == 0, "Could not set features bits");
1be5c7
     }
1be5c7
 
1be5c7
+    rc = run_ccw(vdev, CCW_CMD_READ_CONF, &vdev->config, cfg_size, false);
1be5c7
+    IPL_assert(rc == 0, "Could not get virtio device configuration");
1be5c7
+
1be5c7
     for (i = 0; i < vdev->nr_vqs; i++) {
1be5c7
         VqInfo info = {
1be5c7
             .queue = (unsigned long long) ring_area + (i * VIRTIO_RING_SIZE),
1be5c7
-- 
1be5c7
2.35.3
1be5c7