]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
USB: pci-quirks: Fix HCCPARAMS register error for LS7A EHCI
authorHuacai Chen <chenhuacai@loongson.cn>
Sun, 2 Feb 2025 12:49:35 +0000 (20:49 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Feb 2025 08:18:14 +0000 (09:18 +0100)
LS7A EHCI controller doesn't have extended capabilities, so the EECP
(EHCI Extended Capabilities Pointer) field of HCCPARAMS register should
be 0x0, but it reads as 0xa0 now. This is a hardware flaw and will be
fixed in future, now just clear the EECP field to avoid error messages
on boot:

......
[    0.581675] pci 0000:00:04.1: EHCI: unrecognized capability ff
[    0.581699] pci 0000:00:04.1: EHCI: unrecognized capability ff
[    0.581716] pci 0000:00:04.1: EHCI: unrecognized capability ff
[    0.581851] pci 0000:00:04.1: EHCI: unrecognized capability ff
......
[    0.581916] pci 0000:00:05.1: EHCI: unrecognized capability ff
[    0.581951] pci 0000:00:05.1: EHCI: unrecognized capability ff
[    0.582704] pci 0000:00:05.1: EHCI: unrecognized capability ff
[    0.582799] pci 0000:00:05.1: EHCI: unrecognized capability ff
......

Cc: stable <stable@kernel.org>
Signed-off-by: Baoqi Zhang <zhangbaoqi@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Link: https://lore.kernel.org/r/20250202124935.480500-1-chenhuacai@loongson.cn
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/pci-quirks.c

index 1f9c1b1435d862895b3c3bee40760d4ceccf0a3e..0404489c2f6a9cd40faa46da151b1f65d0319c80 100644 (file)
@@ -958,6 +958,15 @@ static void quirk_usb_disable_ehci(struct pci_dev *pdev)
         * booting from USB disk or using a usb keyboard
         */
        hcc_params = readl(base + EHCI_HCC_PARAMS);
+
+       /* LS7A EHCI controller doesn't have extended capabilities, the
+        * EECP (EHCI Extended Capabilities Pointer) field of HCCPARAMS
+        * register should be 0x0 but it reads as 0xa0.  So clear it to
+        * avoid error messages on boot.
+        */
+       if (pdev->vendor == PCI_VENDOR_ID_LOONGSON && pdev->device == 0x7a14)
+               hcc_params &= ~(0xffL << 8);
+
        offset = (hcc_params >> 8) & 0xff;
        while (offset && --count) {
                pci_read_config_dword(pdev, offset, &cap);