Hi Trent, Trent Piepho wrote: > On Mon, 2018-12-10 at 14:08 -0800, Thinh Nguyen wrote: >> Synopsys USB 3.x host HAPS platform has a class code of >> PCI_CLASS_SERIAL_USB_XHCI, and xhci driver can claim it. However, these >> devices should use dwc3-haps driver. Change these devices' class code to >> PCI_CLASS_SERIAL_USB_DEVICE to prevent the xhci-pci driver from claiming >> them. >> >> + >> + switch (pdev->device) { >> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3: >> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3_AXI: >> + case PCI_DEVICE_ID_SYNOPSYS_HAPSUSB31: >> + pdev->class = PCI_CLASS_SERIAL_USB_DEVICE; >> + pci_info(pdev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n", >> + class, pdev->class); >> + break; >> + default: >> + return; >> + } >> +} >> +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID, >> + quirk_synopsys_haps); >> + > This change breaks my IMX7d based device. This SoC has a PCIe bus > based on the Synopsys Designware host controller. This has a root > bridge that shows up as: > > 00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01) (prog-if 00 [Normal decode]) > 00:00.0 0604: 16c3:abcd (rev 01) (prog-if 00 [Normal decode]) > > Which is to say, class 0x0604, vendor PCI_VENDOR_ID_SYNOPSYS, and the > device ID 0xabcd. > > It looks like there has been a bit of sloppy allocation of PCI device > codes, as PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 is also 0xabcd. > > So the result of this patch is to try to turn the imx7d PCIe root > bridge into a USB controller. Which of course breaks it and prevents > anything behind it, i.e. the endpoint attached to the pci-e bus, from > working. > > Somehow this quirk needs to be more targeted. Right. Lukas also reported this. It appears that there's a duplicate VID PID used for the USB controller on HAPS platform. You can review the discussion subject "Linux Kernel Regression: HAPS quirk breaks PCIe on i.MX6QP". I'll send out a patch to resolve this issue. You can check the change to see if this resolves your issue: diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index b0a413f3f7ca..f46e7de9e15d 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -639,8 +639,8 @@ static void quirk_synopsys_haps(struct pci_dev *pdev) break; } } -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID, - quirk_synopsys_haps); +DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_SYNOPSYS, PCI_ANY_ID, + PCI_CLASS_SERIAL_USB_XHCI, 0, quirk_synopsys_haps); /* * Let's make the southbridge information explicit instead of having to Thanks, Thinh