| From 241bd1184906223509ad92bdc95f5868adc9962e Mon Sep 17 00:00:00 2001 |
| From: Felipe Balbi <balbi@ti.com> |
| Date: Mon, 23 Jan 2017 14:19:58 +0200 |
| Subject: [PATCH] usb: xhci: add quirk flag for broken PED bits |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 41135de1e7fd14c6fcb9158404ba5c8fb97bf259 upstream. |
| |
| Some devices from Texas Instruments [1] suffer from |
| a silicon bug where Port Enabled/Disabled bit |
| should not be used to silence an erroneous device. |
| |
| The bug is so that if port is disabled with PED |
| bit, an IRQ for device removal (or attachment) |
| will never fire. |
| |
| Just for the sake of completeness, the actual |
| problem lies with SNPS USB IP and this affects |
| all known versions up to 3.00a. A separate |
| patch will be added to dwc3 to enabled this |
| quirk flag if version is <= 3.00a. |
| |
| [1] - AM572x Silicon Errata http://www.ti.com/lit/er/sprz429j/sprz429j.pdf |
| Section i896— USB xHCI Port Disable Feature Does Not Work |
| |
| Signed-off-by: Felipe Balbi <balbi@ti.com> |
| Signed-off-by: Roger Quadros <rogerq@ti.com> |
| Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c |
| index 0ef16900efed..1d41637a53e5 100644 |
| --- a/drivers/usb/host/xhci-hub.c |
| +++ b/drivers/usb/host/xhci-hub.c |
| @@ -458,6 +458,12 @@ static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci, |
| return; |
| } |
| |
| + if (xhci->quirks & XHCI_BROKEN_PORT_PED) { |
| + xhci_dbg(xhci, |
| + "Broken Port Enabled/Disabled, ignoring port disable request.\n"); |
| + return; |
| + } |
| + |
| /* Write 1 to disable the port */ |
| writel(port_status | PORT_PE, addr); |
| port_status = readl(addr); |
| diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
| index c525722aa934..f97b009ffc40 100644 |
| --- a/drivers/usb/host/xhci.h |
| +++ b/drivers/usb/host/xhci.h |
| @@ -1657,6 +1657,9 @@ struct xhci_hcd { |
| #define XHCI_SSIC_PORT_UNUSED (1 << 22) |
| #define XHCI_NO_64BIT_SUPPORT (1 << 23) |
| #define XHCI_MISSING_CAS (1 << 24) |
| +/* For controller with a broken Port Disable implementation */ |
| +#define XHCI_BROKEN_PORT_PED (1 << 25) |
| + |
| unsigned int num_active_eps; |
| unsigned int limit_active_eps; |
| /* There are two roothubs to keep track of bus suspend info for */ |
| -- |
| 2.12.0 |
| |