mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 07:48:58 +07:00
8466489ef5
The Renesas uPD72020x XHCI controller seems to suffer from a really annoying bug, where it may retain some of its DMA programming across a XHCI reset, and despite the driver correctly programming new DMA addresses. This is visible if the device has been using 64-bit DMA addresses, and is then switched to using 32-bit DMA addresses. The top 32 bits of the address (now zero) are ignored are replaced by the 32 bits from the *previous* programming. Sticking with 64-bit DMA always works, but doesn't seem very appropriate. A PCI reset of the device restores the normal functionality, which is done at probe time. Unfortunately, this has to be done before any quirk has been discovered, hence the intrusive nature of the fix. Tested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Acked-by: Mathias Nyman <mathias.nyman@linux.intel.com> CC: stable@vger.kernel.org # v4.11+
30 lines
1.2 KiB
C
30 lines
1.2 KiB
C
#ifndef __LINUX_USB_PCI_QUIRKS_H
|
|
#define __LINUX_USB_PCI_QUIRKS_H
|
|
|
|
#ifdef CONFIG_USB_PCI
|
|
void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
|
|
int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
|
|
int usb_amd_find_chipset_info(void);
|
|
int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev);
|
|
bool usb_amd_hang_symptom_quirk(void);
|
|
bool usb_amd_prefetch_quirk(void);
|
|
void usb_amd_dev_put(void);
|
|
void usb_amd_quirk_pll_disable(void);
|
|
void usb_amd_quirk_pll_enable(void);
|
|
void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev);
|
|
void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev);
|
|
void usb_disable_xhci_ports(struct pci_dev *xhci_pdev);
|
|
void sb800_prefetch(struct device *dev, int on);
|
|
bool usb_xhci_needs_pci_reset(struct pci_dev *pdev);
|
|
#else
|
|
struct pci_dev;
|
|
static inline void usb_amd_quirk_pll_disable(void) {}
|
|
static inline void usb_amd_quirk_pll_enable(void) {}
|
|
static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {}
|
|
static inline void usb_amd_dev_put(void) {}
|
|
static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {}
|
|
static inline void sb800_prefetch(struct device *dev, int on) {}
|
|
#endif /* CONFIG_USB_PCI */
|
|
|
|
#endif /* __LINUX_USB_PCI_QUIRKS_H */
|