irq = platform_get_irq(to_platform_device(dwc->dev), 0);
        ret = request_threaded_irq(irq, dwc3_interrupt, dwc3_thread_interrupt,
-                       IRQF_SHARED | IRQF_ONESHOT, "dwc3", dwc);
+                       IRQF_SHARED, "dwc3", dwc);
        if (ret) {
                dev_err(dwc->dev, "failed to request irq #%d --> %d\n",
                                irq, ret);
        struct dwc3 *dwc = _dwc;
        unsigned long flags;
        irqreturn_t ret = IRQ_NONE;
+       u32 reg;
        int i;
 
        spin_lock_irqsave(&dwc->lock, flags);
                evt->count = 0;
                evt->flags &= ~DWC3_EVENT_PENDING;
                ret = IRQ_HANDLED;
+
+               /* Unmask interrupt */
+               reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(i));
+               reg &= ~DWC3_GEVNTSIZ_INTMASK;
+               dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(i), reg);
        }
 
        spin_unlock_irqrestore(&dwc->lock, flags);
 {
        struct dwc3_event_buffer *evt;
        u32 count;
+       u32 reg;
 
        evt = dwc->ev_buffs[buf];
 
        evt->count = count;
        evt->flags |= DWC3_EVENT_PENDING;
 
+       /* Mask interrupt */
+       reg = dwc3_readl(dwc->regs, DWC3_GEVNTSIZ(buf));
+       reg |= DWC3_GEVNTSIZ_INTMASK;
+       dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(buf), reg);
+
        return IRQ_WAKE_THREAD;
 }