Message ID | 20250131100651.343015-1-chenhuacai@loongson.cn |
---|---|
State | New |
Headers | show |
Series | USB: pci-quirks: Fix HCCPARAMS register error for LS7A EHCI | expand |
On Fri, Jan 31, 2025 at 06:06:51PM +0800, Huacai Chen wrote: > 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@vger.kernel.org > Signed-off-by: Baoqi Zhang <zhangbaoqi@loongson.cn> > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> > --- > drivers/usb/host/pci-quirks.c | 4 ++++ > include/linux/pci_ids.h | 1 + > 2 files changed, 5 insertions(+) > > diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c > index 1f9c1b1435d8..7e3151400a5e 100644 > --- a/drivers/usb/host/pci-quirks.c > +++ b/drivers/usb/host/pci-quirks.c > @@ -958,6 +958,10 @@ 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); > + if (pdev->vendor == PCI_VENDOR_ID_LOONGSON && > + pdev->device == PCI_DEVICE_ID_LOONGSON_EHCI) > + hcc_params &= ~(0xffL << 8); Can you please add a comment before this "if" statement explaining why it is necessary? Alan Stern > + > offset = (hcc_params >> 8) & 0xff; > while (offset && --count) { > pci_read_config_dword(pdev, offset, &cap); > diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h > index de5deb1a0118..74a84834d9eb 100644 > --- a/include/linux/pci_ids.h > +++ b/include/linux/pci_ids.h > @@ -162,6 +162,7 @@ > > #define PCI_VENDOR_ID_LOONGSON 0x0014 > > +#define PCI_DEVICE_ID_LOONGSON_EHCI 0x7a14 > #define PCI_DEVICE_ID_LOONGSON_HDA 0x7a07 > #define PCI_DEVICE_ID_LOONGSON_HDMI 0x7a37 > > -- > 2.47.1 >
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 1f9c1b1435d8..7e3151400a5e 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -958,6 +958,10 @@ 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); + if (pdev->vendor == PCI_VENDOR_ID_LOONGSON && + pdev->device == PCI_DEVICE_ID_LOONGSON_EHCI) + hcc_params &= ~(0xffL << 8); + offset = (hcc_params >> 8) & 0xff; while (offset && --count) { pci_read_config_dword(pdev, offset, &cap); diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index de5deb1a0118..74a84834d9eb 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -162,6 +162,7 @@ #define PCI_VENDOR_ID_LOONGSON 0x0014 +#define PCI_DEVICE_ID_LOONGSON_EHCI 0x7a14 #define PCI_DEVICE_ID_LOONGSON_HDA 0x7a07 #define PCI_DEVICE_ID_LOONGSON_HDMI 0x7a37