On Tue, Sep 09, 2014 at 11:19:43AM +0100, Dr. David Alan Gilbert (git) wrote: > From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> > > Add back the PCIe config capabilities on XHCI cards in non-PCIe slots, > but only for machine types before 2.1.
You can clear cmask for these bits to at least make it work one way. > This fixes a migration incompatibility in the XHCI PCI devices > caused by: > 058fdcf52cdbf57b67e7 - xhci: add endpoint cap on express bus only > > Note that in fixing it for compatibility with older QEMUs, it breaks > compatibility with existing QEMU 2.1's on older machine types. > > The status before this patch was (if it used an XHCI adapter): > machine type | source qemu > any pre-2.1 - FAIL > any 2.1... - PASS > > With this patch: > machine type | source qemu > any pre-2.1 - PASS > pre-2.1 2.1... - FAIL > 2.1 2.1... - PASS > > A test to trigger it is to add '-device nec-usb-xhci,id=xhci,addr=0x12' > to the command line. > > Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> Cc: qemu-sta...@nongnu.org Acked-by: Michael S. Tsirkin <m...@redhat.com> > --- > hw/usb/hcd-xhci.c | 6 +++++- > include/hw/i386/pc.h | 5 +++++ > 2 files changed, 10 insertions(+), 1 deletion(-) > > diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c > index bbe4c5f..73ced1f 100644 > --- a/hw/usb/hcd-xhci.c > +++ b/hw/usb/hcd-xhci.c > @@ -499,6 +499,7 @@ enum xhci_flags { > XHCI_FLAG_USE_MSI = 1, > XHCI_FLAG_USE_MSI_X, > XHCI_FLAG_SS_FIRST, > + XHCI_FLAG_FORCE_PCIE_ENDCAP, > }; > > static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, > @@ -3626,7 +3627,8 @@ static int usb_xhci_initfn(struct PCIDevice *dev) > > PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64, > &xhci->mem); > > - if (pci_bus_is_express(dev->bus)) { > + if (pci_bus_is_express(dev->bus) || > + xhci_get_flag(xhci, XHCI_FLAG_FORCE_PCIE_ENDCAP)) { > ret = pcie_endpoint_cap_init(dev, 0xa0); > assert(ret >= 0); > } > @@ -3855,6 +3857,8 @@ static Property xhci_properties[] = { > DEFINE_PROP_BIT("msix", XHCIState, flags, XHCI_FLAG_USE_MSI_X, true), > DEFINE_PROP_BIT("superspeed-ports-first", > XHCIState, flags, XHCI_FLAG_SS_FIRST, true), > + DEFINE_PROP_BIT("force-pcie-endcap", XHCIState, flags, > + XHCI_FLAG_FORCE_PCIE_ENDCAP, false), > DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS), > DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS), > DEFINE_PROP_UINT32("p2", XHCIState, numports_2, 4), > diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h > index a39cb42..77316d5 100644 > --- a/include/hw/i386/pc.h > +++ b/include/hw/i386/pc.h > @@ -330,6 +330,11 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t > *); > .value = "off",\ > },\ > {\ > + .driver = "nec-usb-xhci",\ > + .property = "force-pcie-endcap",\ > + .value = "on",\ > + },\ > + {\ > .driver = "pci-serial",\ > .property = "prog_if",\ > .value = stringify(0),\ > -- > 1.9.3