summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanusz Dziedzic <januszx.dziedzic@linux.intel.com>2016-12-08 10:57:34 +0100
committerFelipe Balbi <felipe.balbi@linux.intel.com>2017-01-02 10:55:28 +0200
commitd7fd41c6dbcc547578a8a56cc52d6f2d36e505bc (patch)
treee97ab060d5cb8d77bb03e211dd3b139b3b1ed9ff
parent0994b0a257557e18ee8f0b7c5f0f73fe2b54eec1 (diff)
downloadlinux-stable-d7fd41c6dbcc547578a8a56cc52d6f2d36e505bc.tar.gz
linux-stable-d7fd41c6dbcc547578a8a56cc52d6f2d36e505bc.tar.bz2
linux-stable-d7fd41c6dbcc547578a8a56cc52d6f2d36e505bc.zip
usb: dwc3: skip interrupt when ep disabled
In case EP disabled pass only EPCPLT command to be handled. In other case we could hit Bug like below. BUG: unable to handle kernel NULL pointer dereference at 0000000000000003 IP: [<ffffffff81673428>] dwc3_thread_interrupt+0x11c8/0x1790 while dep->endpoint.desc is NULL. Signed-off-by: Janusz Dziedzic <januszx.dziedzic@linux.intel.com> Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
-rw-r--r--drivers/usb/dwc3/gadget.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 0286e3141864..725b13ad220d 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2232,9 +2232,14 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
dep = dwc->eps[epnum];
- if (!(dep->flags & DWC3_EP_ENABLED) &&
- !(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
- return;
+ if (!(dep->flags & DWC3_EP_ENABLED)) {
+ if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING))
+ return;
+
+ /* Handle only EPCMDCMPLT when EP disabled */
+ if (event->endpoint_event != DWC3_DEPEVT_EPCMDCMPLT)
+ return;
+ }
if (epnum == 0 || epnum == 1) {
dwc3_ep0_interrupt(dwc, event);