diff options
author | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2009-08-07 17:04:55 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-09-23 09:46:17 -0400 |
commit | ac9d8fe7c6a8041cca5a0738915d2c4e21381421 (patch) | |
tree | 6ac3db149d39a61900e6df41ab9424f933a51489 /drivers/usb/host/xhci-pci.c | |
parent | 82d1009f537c2a43be0a410abd33521f76ee3a5a (diff) |
USB: xhci: Add quirk for Fresco Logic xHCI hardware.
This Fresco Logic xHCI host controller chip revision puts bad data into
the output endpoint context after a Reset Endpoint command. It needs a
Configure Endpoint command (instead of a Set TR Dequeue Pointer command)
after the reset endpoint command.
Set up the input context before issuing the Reset Endpoint command so we
don't copy bad data from the output endpoint context. The HW also can't
handle two commands queued at once, so submit the TRB for the Configure
Endpoint command in the event handler for the Reset Endpoint command.
Devices that stall on control endpoints before a configuration is selected
will not work under this Fresco Logic xHCI host controller revision.
This patch is for prototype hardware that will be given to other companies
for evaluation purposes only, and should not reach consumer hands. Fresco
Logic's next chip rev should have this bug fixed.
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/xhci-pci.c')
-rw-r--r-- | drivers/usb/host/xhci-pci.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 592fe7e623f7..8fb308d43bc1 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -24,6 +24,10 @@ | |||
24 | 24 | ||
25 | #include "xhci.h" | 25 | #include "xhci.h" |
26 | 26 | ||
27 | /* Device for a quirk */ | ||
28 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 | ||
29 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 | ||
30 | |||
27 | static const char hcd_name[] = "xhci_hcd"; | 31 | static const char hcd_name[] = "xhci_hcd"; |
28 | 32 | ||
29 | /* called after powerup, by probe or system-pm "wakeup" */ | 33 | /* called after powerup, by probe or system-pm "wakeup" */ |
@@ -62,6 +66,15 @@ static int xhci_pci_setup(struct usb_hcd *hcd) | |||
62 | xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params); | 66 | xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params); |
63 | xhci_print_registers(xhci); | 67 | xhci_print_registers(xhci); |
64 | 68 | ||
69 | /* Look for vendor-specific quirks */ | ||
70 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && | ||
71 | pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && | ||
72 | pdev->revision == 0x0) { | ||
73 | xhci->quirks |= XHCI_RESET_EP_QUIRK; | ||
74 | xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" | ||
75 | " endpoint cmd after reset endpoint\n"); | ||
76 | } | ||
77 | |||
65 | /* Make sure the HC is halted. */ | 78 | /* Make sure the HC is halted. */ |
66 | retval = xhci_halt(xhci); | 79 | retval = xhci_halt(xhci); |
67 | if (retval) | 80 | if (retval) |