Message ID | 20250326102355.2320755-1-chenhuacai@loongson.cn (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | USB: OHCI: Add quirk for LS7A OHCI controller (rev 0x02) | expand |
On Wed, Mar 26, 2025 at 06:23:55PM +0800, Huacai Chen wrote: > The OHCI controller (rev 0x02) under LS7A PCI host has a hardware flaw. > MMIO register with offset 0x60/0x64 is treated as legacy PS2-compatible > keyboard/mouse interface, which confuse the OHCI controller. Since OHCI > only use a 4KB BAR resource indeed, the LS7A OHCI controller's 32KB BAR > is wrapped around (the second 4KB BAR space is the same as the first 4KB > internally). So we can add an 4KB offset (0x1000) to the OHCI registers > (from the PCI BAR resource) as a quirk. > > Cc: stable@vger.kernel.org > Suggested-by: Bjorn Helgaas <bhelgaas@google.com> > Tested-by: Mingcong Bai <jeffbai@aosc.io> > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> > --- > drivers/usb/host/ohci-pci.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c > index 900ea0d368e0..38e535aa09fe 100644 > --- a/drivers/usb/host/ohci-pci.c > +++ b/drivers/usb/host/ohci-pci.c > @@ -165,6 +165,15 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) > return 0; > } > > +static int ohci_quirk_loongson(struct usb_hcd *hcd) > +{ > + struct pci_dev *pdev = to_pci_dev(hcd->self.controller); > + > + hcd->regs += (pdev->revision == 0x2) ? 0x1000 : 0x0; Please add a comment explaining why the quirk is needed and how it fixes the problem. Alan Stern > + > + return 0; > +} > + > static int ohci_quirk_qemu(struct usb_hcd *hcd) > { > struct ohci_hcd *ohci = hcd_to_ohci(hcd); > @@ -224,6 +233,10 @@ static const struct pci_device_id ohci_pci_quirks[] = { > PCI_DEVICE(PCI_VENDOR_ID_ATI, 0x4399), > .driver_data = (unsigned long)ohci_quirk_amd700, > }, > + { > + PCI_DEVICE(PCI_VENDOR_ID_LOONGSON, 0x7a24), > + .driver_data = (unsigned long)ohci_quirk_loongson, > + }, > { > .vendor = PCI_VENDOR_ID_APPLE, > .device = 0x003f, > -- > 2.47.1 >
On Wed, Mar 26, 2025 at 10:11 PM Alan Stern <stern@rowland.harvard.edu> wrote: > > On Wed, Mar 26, 2025 at 06:23:55PM +0800, Huacai Chen wrote: > > The OHCI controller (rev 0x02) under LS7A PCI host has a hardware flaw. > > MMIO register with offset 0x60/0x64 is treated as legacy PS2-compatible > > keyboard/mouse interface, which confuse the OHCI controller. Since OHCI > > only use a 4KB BAR resource indeed, the LS7A OHCI controller's 32KB BAR > > is wrapped around (the second 4KB BAR space is the same as the first 4KB > > internally). So we can add an 4KB offset (0x1000) to the OHCI registers > > (from the PCI BAR resource) as a quirk. > > > > Cc: stable@vger.kernel.org > > Suggested-by: Bjorn Helgaas <bhelgaas@google.com> > > Tested-by: Mingcong Bai <jeffbai@aosc.io> > > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn> > > --- > > drivers/usb/host/ohci-pci.c | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c > > index 900ea0d368e0..38e535aa09fe 100644 > > --- a/drivers/usb/host/ohci-pci.c > > +++ b/drivers/usb/host/ohci-pci.c > > @@ -165,6 +165,15 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) > > return 0; > > } > > > > +static int ohci_quirk_loongson(struct usb_hcd *hcd) > > +{ > > + struct pci_dev *pdev = to_pci_dev(hcd->self.controller); > > + > > + hcd->regs += (pdev->revision == 0x2) ? 0x1000 : 0x0; > > Please add a comment explaining why the quirk is needed and how it fixes > the problem. OK, I will do it in V2. Huacai > > Alan Stern > > > + > > + return 0; > > +} > > + > > static int ohci_quirk_qemu(struct usb_hcd *hcd) > > { > > struct ohci_hcd *ohci = hcd_to_ohci(hcd); > > @@ -224,6 +233,10 @@ static const struct pci_device_id ohci_pci_quirks[] = { > > PCI_DEVICE(PCI_VENDOR_ID_ATI, 0x4399), > > .driver_data = (unsigned long)ohci_quirk_amd700, > > }, > > + { > > + PCI_DEVICE(PCI_VENDOR_ID_LOONGSON, 0x7a24), > > + .driver_data = (unsigned long)ohci_quirk_loongson, > > + }, > > { > > .vendor = PCI_VENDOR_ID_APPLE, > > .device = 0x003f, > > -- > > 2.47.1 > >
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 900ea0d368e0..38e535aa09fe 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c @@ -165,6 +165,15 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) return 0; } +static int ohci_quirk_loongson(struct usb_hcd *hcd) +{ + struct pci_dev *pdev = to_pci_dev(hcd->self.controller); + + hcd->regs += (pdev->revision == 0x2) ? 0x1000 : 0x0; + + return 0; +} + static int ohci_quirk_qemu(struct usb_hcd *hcd) { struct ohci_hcd *ohci = hcd_to_ohci(hcd); @@ -224,6 +233,10 @@ static const struct pci_device_id ohci_pci_quirks[] = { PCI_DEVICE(PCI_VENDOR_ID_ATI, 0x4399), .driver_data = (unsigned long)ohci_quirk_amd700, }, + { + PCI_DEVICE(PCI_VENDOR_ID_LOONGSON, 0x7a24), + .driver_data = (unsigned long)ohci_quirk_loongson, + }, { .vendor = PCI_VENDOR_ID_APPLE, .device = 0x003f,