2006-03-25 17:01:53 +00:00
|
|
|
#ifndef __LINUX_USB_PCI_QUIRKS_H
|
|
|
|
#define __LINUX_USB_PCI_QUIRKS_H
|
|
|
|
|
2011-03-01 06:57:05 +00:00
|
|
|
#ifdef CONFIG_PCI
|
2006-03-25 17:01:53 +00:00
|
|
|
void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
|
|
|
|
int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);
|
2011-03-01 06:57:05 +00:00
|
|
|
int usb_amd_find_chipset_info(void);
|
|
|
|
void usb_amd_dev_put(void);
|
|
|
|
void usb_amd_quirk_pll_disable(void);
|
|
|
|
void usb_amd_quirk_pll_enable(void);
|
Intel xhci: Support EHCI/xHCI port switching.
The Intel Panther Point chipsets contain an EHCI and xHCI host controller
that shares some number of skew-dependent ports. These ports can be
switched from the EHCI to the xHCI host (and vice versa) by a hardware MUX
that is controlled by registers in the xHCI PCI configuration space. The
USB 3.0 SuperSpeed terminations on the xHCI ports can be controlled
separately from the USB 2.0 data wires.
This switchover mechanism is there to support users who do a custom
install of certain non-Linux operating systems that don't have official
USB 3.0 support. By default, the ports are under EHCI, SuperSpeed
terminations are off, and USB 3.0 devices will show up under the EHCI
controller at reduced speeds. (This was more palatable for the marketing
folks than having completely dead USB 3.0 ports if no xHCI drivers are
available.) Users should be able to turn on xHCI by default through a
BIOS option, but users are happiest when they don't have to change random
BIOS settings.
This patch introduces a driver method to switchover the ports from EHCI to
xHCI before the EHCI driver finishes PCI enumeration. We want to switch
the ports over before the USB core has the chance to enumerate devices
under EHCI, or boot from USB mass storage will fail if the boot device
connects under EHCI first, and then gets disconnected when the port
switches over to xHCI.
Add code to the xHCI PCI quirk to switch the ports from EHCI to xHCI. The
PCI quirks code will run before any other PCI probe function is called, so
this avoids the issue with boot devices.
Another issue is with BIOS behavior during system resume from hibernate.
If the BIOS doesn't support xHCI, it may switch the devices under EHCI to
allow use of the USB keyboard, mice, and mass storage devices. It's
supposed to remember the value of the port routing registers and switch
them back when the OS attempts to take control of the xHCI host controller,
but we all know not to trust BIOS writers.
Make both the xHCI driver and the EHCI driver attempt to switchover the
ports in their PCI resume functions. We can't guarantee which PCI device
will be resumed first, so this avoids any race conditions. Writing a '1'
to an already set port switchover bit or a '0' to a cleared port switchover
bit should have no effect.
The xHCI PCI configuration registers will be documented in the EDS-level
chipset spec, which is not public yet. I have permission from legal and
the Intel chipset group to release this patch early to allow good Linux
support at product launch. I've tried to document the registers as much
as possible, so please let me know if anything is unclear.
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
2011-02-22 17:57:15 +00:00
|
|
|
bool usb_is_intel_switchable_xhci(struct pci_dev *pdev);
|
|
|
|
void usb_enable_xhci_ports(struct pci_dev *xhci_pdev);
|
xhci: Switch PPT ports to EHCI on shutdown.
The Intel desktop boards DH77EB and DH77DF have a hardware issue that
can be worked around by BIOS. If the USB ports are switched to xHCI on
shutdown, the xHCI host will send a spurious interrupt, which will wake
the system. Some BIOS will work around this, but not all.
The bug can be avoided if the USB ports are switched back to EHCI on
shutdown. The Intel Windows driver switches the ports back to EHCI, so
change the Linux xHCI driver to do the same.
Unfortunately, we can't tell the two effected boards apart from other
working motherboards, because the vendors will change the DMI strings
for the DH77EB and DH77DF boards to their own custom names. One example
is Compulab's mini-desktop, the Intense-PC. Instead, key off the
Panther Point xHCI host PCI vendor and device ID, and switch the ports
over for all PPT xHCI hosts.
The only impact this will have on non-effected boards is to add a couple
hundred milliseconds delay on boot when the BIOS has to switch the ports
over from EHCI to xHCI.
This patch should be backported to kernels as old as 3.0, that contain
the commit 69e848c2090aebba5698a1620604c7dccb448684 "Intel xhci: Support
EHCI/xHCI port switching."
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Reported-by: Denis Turischev <denis@compulab.co.il>
Tested-by: Denis Turischev <denis@compulab.co.il>
Cc: stable@vger.kernel.org
2012-07-23 15:59:30 +00:00
|
|
|
void usb_disable_xhci_ports(struct pci_dev *xhci_pdev);
|
2013-05-28 13:04:50 +00:00
|
|
|
void sb800_prefetch(struct device *dev, int on);
|
2011-03-01 06:57:05 +00:00
|
|
|
#else
|
2013-07-23 22:22:59 +00:00
|
|
|
struct pci_dev;
|
2011-03-01 06:57:05 +00:00
|
|
|
static inline void usb_amd_quirk_pll_disable(void) {}
|
|
|
|
static inline void usb_amd_quirk_pll_enable(void) {}
|
|
|
|
static inline void usb_amd_dev_put(void) {}
|
2012-09-05 05:34:26 +00:00
|
|
|
static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {}
|
2013-05-28 13:04:50 +00:00
|
|
|
static inline void sb800_prefetch(struct device *dev, int on) {}
|
2011-03-01 06:57:05 +00:00
|
|
|
#endif /* CONFIG_PCI */
|
2006-03-25 17:01:53 +00:00
|
|
|
|
|
|
|
#endif /* __LINUX_USB_PCI_QUIRKS_H */
|