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