summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Youn <johnyoun@synopsys.com>2016-11-14 12:32:45 -0800
committerFelipe Balbi <felipe.balbi@linux.intel.com>2016-11-18 13:54:51 +0200
commit28632b44d129cd2dc677475197a01cced307cfc5 (patch)
treea672111667bc1c1f0dee26ed0ecfed9c3d36a205
parentcf40b86b6ef6df5262ef5a8463b42524e6aa5590 (diff)
usb: dwc3: Workaround for irq mask issue
This is a workaround for STAR 9000961433 which affects only version 3.00a of the DWC_usb3 core. This prevents the controller interrupt from being masked while handling events. Enabling interrupt moderation allows us to work around this issue because once the GEVNTCOUNT.count is written the IRQ is immediately deasserted and won't be asserted again until GEVNTCOUNT.EHB is cleared. Signed-off-by: John Youn <johnyoun@synopsys.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r--drivers/usb/dwc3/core.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 889dbabc7c2d..e95144870210 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1004,6 +1004,17 @@ static void dwc3_check_params(struct dwc3 *dwc)
dwc->imod_interval = 0;
}
+ /*
+ * Workaround for STAR 9000961433 which affects only version
+ * 3.00a of the DWC_usb3 core. This prevents the controller
+ * interrupt from being masked while handling events. IMOD
+ * allows us to work around this issue. Enable it for the
+ * affected version.
+ */
+ if (!dwc->imod_interval &&
+ (dwc->revision == DWC3_REVISION_300A))
+ dwc->imod_interval = 1;
+
/* Check the maximum_speed parameter */
switch (dwc->maximum_speed) {
case USB_SPEED_LOW: