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