summaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb/am35x.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-10-18 08:14:10 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-10-18 08:14:10 -0700
commit6b7ced68f3fbbab6e9625b957f1ea0add22a5ac7 (patch)
tree40e367c4a0c6fd920faa69b0f948fcb0877f7b40 /drivers/usb/musb/am35x.c
parent470809741a28c3092279f4e1f3f432e534d46068 (diff)
parent69da85edbab5cd42909d3ba65b3dad1c1fb40206 (diff)
downloadlinux-stable-6b7ced68f3fbbab6e9625b957f1ea0add22a5ac7.tar.gz
linux-stable-6b7ced68f3fbbab6e9625b957f1ea0add22a5ac7.tar.bz2
linux-stable-6b7ced68f3fbbab6e9625b957f1ea0add22a5ac7.zip
Merge tag 'fixes-for-v3.7-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-linus
usb: fixes for v3.7-rc2 Here's the first set of fixes for v3.7-rc cycle. DesignWare Core USB3 Driver (dwc3) got two fixes. The first one fixes a long standing bug which would keep endpoint with BUSY flag set forever if we cancel a transfer which has already been started by the controller. The second fix will just switch PHYs back off when DWC3 driver is removed. MUSB fixed a bug which would cause a Kernel Oops at least on AM3517 when removing a device. For some reason that particular device can fall into a situation where you have both Disconnect and Endpoint IRQs happen simultaneously (have both bits set in IRQ_STATUS register) and, because Disconnect Interrupt is handled before Endpoint Interrupts, we would try to transfer data over a disconnected device, thus generating a kernel oops. Renensas' USB DRD driver got two fixes which are a) fixing an off-by-one bug on the pipe iterator implementation and b) fixing Interrupt Status Clear procedure in order to properly clear a single Interrupt event without clearing (and masking) other events we didn't handle yet.
Diffstat (limited to 'drivers/usb/musb/am35x.c')
-rw-r--r--drivers/usb/musb/am35x.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c
index 457f25e62c51..c964d6af178b 100644
--- a/drivers/usb/musb/am35x.c
+++ b/drivers/usb/musb/am35x.c
@@ -305,6 +305,12 @@ static irqreturn_t am35x_musb_interrupt(int irq, void *hci)
ret = IRQ_HANDLED;
}
+ /* Drop spurious RX and TX if device is disconnected */
+ if (musb->int_usb & MUSB_INTR_DISCONNECT) {
+ musb->int_tx = 0;
+ musb->int_rx = 0;
+ }
+
if (musb->int_tx || musb->int_rx || musb->int_usb)
ret |= musb_interrupt(musb);