Blame SOURCES/0030-usb-xhci-Fix-PCI-capability-order.patch

9bac43
From 2dd7402227e77d748a7375233ac9e7feab244bda Mon Sep 17 00:00:00 2001
9bac43
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
9bac43
Date: Fri, 5 May 2017 19:06:14 +0200
9bac43
Subject: usb-xhci: Fix PCI capability order
9bac43
9bac43
RH-Author: Dr. David Alan Gilbert <dgilbert@redhat.com>
9bac43
Message-id: <20170505190614.15987-2-dgilbert@redhat.com>
9bac43
Patchwork-id: 75038
9bac43
O-Subject: [RHEL-7.4 qemu-kvm-rhev PATCH 1/1] usb-xhci: Fix PCI capability order
9bac43
Bugzilla: 1447874
9bac43
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
9bac43
RH-Acked-by: Michael S. Tsirkin <mst@redhat.com>
9bac43
RH-Acked-by: Gerd Hoffmann <kraxel@redhat.com>
9bac43
RH-Acked-by: Juan Quintela <quintela@redhat.com>
9bac43
9bac43
From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
9bac43
9bac43
Upstream commit 1108b2f8a9 in 2.7.0 changed the order
9bac43
of the PCI capability chain in the XHCI pci device in the case
9bac43
where the device has the PCIe endpoint capability (i.e. only
9bac43
older machine types, pc-i440fx-2.0 upstream, pc-i440fx-rhel7.0.0
9bac43
apparently for us).
9bac43
9bac43
Changing the order breaks migration compatibility; fixing this
9bac43
upstream would mean breaking the same case going from 2.7.0->current
9bac43
that currently works 2.7.0->2.9.0 - so upstream it's a choice
9bac43
of two breakages.
9bac43
9bac43
Since we never released 2.7.0/2.8.0 we can fix this downstream.
9bac43
9bac43
This reverts the order so that we create the capabilities in the
9bac43
order:
9bac43
   PCIe
9bac43
   MSI
9bac43
   MSI-X
9bac43
9bac43
The symptom is:
9bac43
qemu-kvm: get_pci_config_device: Bad config data: i=0x71 read: a0 device: 0 cmask: ff wmask: 0 w1cmask:0
9bac43
qemu-kvm: Failed to load PCIDevice:config
9bac43
qemu-kvm: Failed to load xhci:parent_obj
9bac43
qemu-kvm: error while loading state for instance 0x0 of device '0000:00:0d.0/xhci'
9bac43
qemu-kvm: load of migration failed: Invalid argument
9bac43
9bac43
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
9bac43
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
9bac43
--
9bac43
Rebase notes (2.9.0):
9bac43
- Change in assert condition (upstream)
9bac43
9bac43
(cherry picked from commit aad727a5ecde1ad4935eb8427604d4df5a1f1f35)
9bac43
---
9bac43
 hw/usb/hcd-xhci.c | 12 ++++++------
9bac43
 1 file changed, 6 insertions(+), 6 deletions(-)
9bac43
9bac43
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
9bac43
index 10848db..53de805 100644
9bac43
--- a/hw/usb/hcd-xhci.c
9bac43
+++ b/hw/usb/hcd-xhci.c
9bac43
@@ -3368,6 +3368,12 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
9bac43
         xhci->max_pstreams_mask = 0;
9bac43
     }
9bac43
 
9bac43
+    if (pci_bus_is_express(dev->bus) ||
9bac43
+        xhci_get_flag(xhci, XHCI_FLAG_FORCE_PCIE_ENDCAP)) {
9bac43
+        ret = pcie_endpoint_cap_init(dev, 0xa0);
9bac43
+        assert(ret > 0);
9bac43
+    }
9bac43
+
9bac43
     if (xhci->msi != ON_OFF_AUTO_OFF) {
9bac43
         ret = msi_init(dev, 0x70, xhci->numintrs, true, false, &err;;
9bac43
         /* Any error other than -ENOTSUP(board's MSI support is broken)
9bac43
@@ -3416,12 +3422,6 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
9bac43
                      PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64,
9bac43
                      &xhci->mem);
9bac43
 
9bac43
-    if (pci_bus_is_express(dev->bus) ||
9bac43
-        xhci_get_flag(xhci, XHCI_FLAG_FORCE_PCIE_ENDCAP)) {
9bac43
-        ret = pcie_endpoint_cap_init(dev, 0xa0);
9bac43
-        assert(ret > 0);
9bac43
-    }
9bac43
-
9bac43
     if (xhci->msix != ON_OFF_AUTO_OFF) {
9bac43
         /* TODO check for errors, and should fail when msix=on */
9bac43
         msix_init(dev, xhci->numintrs,
9bac43
-- 
9bac43
1.8.3.1
9bac43