Re: Pericom PI7C9X2G608 (12d8: 2608) missing from ACS quirk — breaks Renesas uPD720202 USB3 cards when IOMMU is on

Bjorn Helgaas <[email protected]>
Newsgroups org.kernel.vger.linux-pci,org.kernel.vger.linux-usb
Message-ID <20260811212835.GA711008@bhelgaas>
On Tue, Aug 11, 2026 at 05:57:33AM -0500, Max Stevens wrote:
> Hi Bjorn,
> 
> Thanks for the quick patch. I tested its effect on my PI7C9X2G608GP
> (12d8:2608) by replicating what pci_fixup_pericom_acs_store_forward()
> does, using setpci at runtime (I have not built a patched kernel —
> happy to do that too if you want a test of the actual binary).
> 
> Findings on the 2G608:
> 
> The mode register exists at the same offset as on the smaller
> switches: upstream port config 0x74. Value on my system before any
> test: 0x0102 (store-forward bit clear).
> With ACS on all four downstream ports set to what the kernel normally
> enables here (ACSCtl = SrcValid+ ReqRedir+ CmpltRedir+ UpstreamFwd+),
> and 0x74 bit 0 CLEAR, device enumeration on the downstream xHCI
> controllers fails: [43069.603242] xhci-pci-renesas 0000:0c:00.0: Error
> while assigning device slot ID: Command Aborted [43069.603270] usb
> usb9-port1: couldn't allocate usb_device
> Setting 0x74 to 0x0103 (bit 0, store-forward) with ACS unchanged, then
> rebinding the xHCI drivers: the same device on the same port
> enumerates immediately and works fully: [43071.971147] usb 9-1: new
> full-speed USB device number 2 using xhci-pci-renesas [43072.132176]
> usb 9-1: Product: Azeron Keypad [43072.218656] hid-generic
> 0003:16D0:113C.0017: input,hidraw12: USB HID v1.11 Keyboard [Azeron
> LTD Azeron Keypad] on usb-0000:0c:00.0-1/input1
> I toggled the bit back and forth across several driver rebinds. Every
> "Command Aborted" failure I have logged (both today and across earlier
> debugging) occurred with the bit clear; none with it set.
> 
> One honest nuance: with the bit clear the failure is not 100% — I saw
> one enumeration attempt start successfully during a bit-clear window.
> That intermittency is consistent with the load-dependent packet
> buffering behaviour described in Nathan's original erratum writeup,
> and with this card family's long history of "sometimes almost works"
> reports on various forums.

If it's an improvement, I think it's worth applying even if it's not a
100% fix.

> So on this hardware the store-forward workaround behaves exactly as it
> does on the already-quirked siblings, and the patch looks correct to
> me.
> 
> Tested-by: Maximo Paulino [email protected]

Thanks for doing this.  I'll queue up the patch below for v7.3 without
your explicit tested-by because quirks run at different times than
setpci, and the timing/ordering is often important.


commit c56a7c02e664 ("PCI: Add ACS quirk for Pericom PI7C9X2G404 switches [12d8:2608]")
Author: Bjorn Helgaas <[email protected]>
Date:   Mon Aug 10 20:20:26 2026 -0500

    PCI: Add ACS quirk for Pericom PI7C9X2G404 switches [12d8:2608]
    
    Max reported that PI7C9X2G608GP (12d8:2608), the 6-port variant, has the
    same erratum and makes an entire class of consumer USB 3.0 cards completely
    non-functional on any system with the IOMMU enabled.
    
    On a system with a StarTech PEXUSB3S44V-style 4-port USB 3.0 card With
    IOMMU on, ACS on the switch's downstream ports is enabled (ACSCtl:
    SrcValid+ ReqRedir+ CmpltRedir+ UpstreamFwd+). The four xHCI controllers
    then probe cleanly, register their buses, upload firmware, and report port
    connect status normally — but any device plugged into any port fails
    enumeration with:
    
      xhci-pci-renesas 0000:09:00.0: Error while assigning device slot ID: Command Aborted
      xhci-pci-renesas 0000:09:00.0: Max number of devices this xHCI host supports is 32.
      usb usb3-port1: couldn't allocate usb_device
    
    Apply the same workaround used for other related Pericom switches.
    
    Reported-by: Max Stevens <[email protected]>
    Closes: https://lore.kernel.org/all/CADoo8uyrmw_GkNgNf+bV_pieYN_gn5i49rOF8jUvSsfPOcqCJA@mail.gmail.com
    Signed-off-by: Bjorn Helgaas <[email protected]>


diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index b09f27f7846f..27f7d56c9ac3 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -6263,6 +6263,10 @@ DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_PERICOM, 0xb404,
 			 pci_fixup_pericom_acs_store_forward);
 DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_PERICOM, 0xb404,
 			 pci_fixup_pericom_acs_store_forward);
+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_PERICOM, 0x2608,
+			 pci_fixup_pericom_acs_store_forward);
+DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_PERICOM, 0x2608,
+			 pci_fixup_pericom_acs_store_forward);
 
 static void nvidia_ion_ahci_fixup(struct pci_dev *pdev)
 {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.