Message ID | 1479394881-13863-2-git-send-email-rogerq@ti.com |
---|---|
State | New |
Headers | show |
Hello. On 11/17/2016 6:01 PM, Roger Quadros wrote: > From: Felipe Balbi <balbi@ti.com> > > 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> > --- > drivers/usb/host/xhci-hub.c | 6 ++++++ > drivers/usb/host/xhci.h | 3 +++ > 2 files changed, 9 insertions(+) > > diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c > index 0ef1690..c3c051d 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"); The messages shouldn't be broken up to facilitate grepping. [...] > diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h > index f945380..4f724aa 100644 > --- a/drivers/usb/host/xhci.h > +++ b/drivers/usb/host/xhci.h > @@ -1656,6 +1656,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 << 21) Indent with tabs as above, please. [...] MBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 0ef1690..c3c051d 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 f945380..4f724aa 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1656,6 +1656,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 << 21) + unsigned int num_active_eps; unsigned int limit_active_eps; /* There are two roothubs to keep track of bus suspend info for */