summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorJack Pham <jackp@codeaurora.org>2014-02-24 20:04:11 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 11:06:21 -0700
commitd675e701902c11a326e6ce2682f8acb09fd89c98 (patch)
tree0400f4b6425fe2fce22ff789bcf7422e5a15de96 /drivers/usb
parent0b937c189f0218bcbee4ceeec090d43237e93b13 (diff)
usb: dwc3: gadget: Handle erratic error event only once
DWC3 databook suggests that upon receiving erratic error event software should reset the controller. The way in which the driver currently handles interrupts by offloading event processing to a threaded handler could result in a long sequence of received erratic errors in the event queue. dwc3_gadget_interrupt() could then end up processing a large number of the same event unnecessarily. In the case of dwc3-msm, this results in KERN_INFO messages flooding the console. Fix this by only handling erratic error once. Add a state variable to keep track of when it is seen, and clear it once a non-error event is processed. Change-Id: I5deeb2a614f9002867472a0e4aa26a61f0413ceb Signed-off-by: Jack Pham <jackp@codeaurora.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/dwc3/core.h2
-rw-r--r--drivers/usb/dwc3/gadget.c8
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index 5c198e0c80f1..44d42d7e0c01 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -749,6 +749,7 @@ struct dwc3_scratchpad_array {
* 1 - -3.5dB de-emphasis
* 2 - No de-emphasis
* 3 - Reserved
+ * @err_evt_seen: previous event in queue was erratic error
*/
struct dwc3 {
struct usb_ctrlrequest *ctrl_req;
@@ -895,6 +896,7 @@ struct dwc3 {
unsigned tx_de_emphasis:2;
unsigned nominal_elastic_buffer:1;
+ unsigned err_evt_seen:1;
};
/* -------------------------------------------------------------------------- */
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 95d9de5c2832..3c340ce266c4 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2658,8 +2658,10 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
break;
case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
dwc3_trace(trace_dwc3_gadget, "Erratic Error");
- dbg_event(0xFF, "ERROR", 0);
- dwc3_dump_reg_info(dwc);
+ if (!dwc->err_evt_seen) {
+ dbg_event(0xFF, "ERROR", 0);
+ dwc3_dump_reg_info(dwc);
+ }
break;
case DWC3_DEVICE_EVENT_CMD_CMPL:
dwc3_trace(trace_dwc3_gadget, "Command Complete");
@@ -2671,6 +2673,8 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
default:
dev_WARN(dwc->dev, "UNKNOWN IRQ %d\n", event->type);
}
+
+ dwc->err_evt_seen = (event->type == DWC3_DEVICE_EVENT_ERRATIC_ERROR);
}
static void dwc3_process_event_entry(struct dwc3 *dwc,