usb: musb: core: Disable the Interrupts till BABBLE is fully handled
authorGeorge Cherian <george.cherian@ti.com>
Fri, 14 Nov 2014 08:24:46 +0000 (13:54 +0530)
committerFelipe Balbi <balbi@ti.com>
Tue, 18 Nov 2014 15:55:31 +0000 (09:55 -0600)
Disable the MUSB interrupts till MUSB is recovered fully from BABBLE
condition. There are chances that we could get multiple interrupts
till the time the babble recover work gets scheduled. Sometimes
this could even end up in an endless loop making MUSB itself unusable.

Reported-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: George Cherian <george.cherian@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/musb/musb_core.c

index f1dfe53515fb2dac391934b8c99316446dea94cc..5257928425ceb8fc60b8c2ce8b970e98aeab40e1 100644 (file)
@@ -423,6 +423,7 @@ void musb_hnp_stop(struct musb *musb)
        musb->port1_status &= ~(USB_PORT_STAT_C_CONNECTION << 16);
 }
 
+static void musb_generic_disable(struct musb *musb);
 /*
  * Interrupt Service Routine to record USB "global" interrupts.
  * Since these do not happen often and signify things of
@@ -846,9 +847,11 @@ b_host:
        }
 
        /* handle babble condition */
-       if (int_usb & MUSB_INTR_BABBLE && is_host_active(musb))
+       if (int_usb & MUSB_INTR_BABBLE && is_host_active(musb)) {
+               musb_generic_disable(musb);
                schedule_delayed_work(&musb->recover_work,
                                      msecs_to_jiffies(100));
+       }
 
 #if 0
 /* REVISIT ... this would be for multiplexing periodic endpoints, or