usb: dwc3: gadget: use evt->cache for processing events
authorJohn Youn <johnyoun@synopsys.com>
Tue, 15 Nov 2016 11:07:02 +0000 (13:07 +0200)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 18 Nov 2016 11:54:43 +0000 (13:54 +0200)
Let's start copying events from evt->buf to
evt->cache and use evt->cache for processing events.

A follow-up patch will be added to clear events in
the top-half handler in order to bring IRQ line low
as soon as possible.

Signed-off-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/gadget.c

index 304653fd9223a1c518584ff7673d351ee4a9b65c..0481cb7d71421d88c4540fa5b32d88bbc854f415 100644 (file)
@@ -2821,7 +2821,7 @@ static irqreturn_t dwc3_process_event_buf(struct dwc3_event_buffer *evt)
        while (left > 0) {
                union dwc3_event event;
 
-               event.raw = *(u32 *) (evt->buf + evt->lpos);
+               event.raw = *(u32 *) (evt->cache + evt->lpos);
 
                dwc3_process_event_entry(dwc, &event);
 
@@ -2869,6 +2869,7 @@ static irqreturn_t dwc3_thread_interrupt(int irq, void *_evt)
 static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
 {
        struct dwc3 *dwc = evt->dwc;
+       u32 amount;
        u32 count;
        u32 reg;
 
@@ -2892,6 +2893,12 @@ static irqreturn_t dwc3_check_event_buf(struct dwc3_event_buffer *evt)
        reg |= DWC3_GEVNTSIZ_INTMASK;
        dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(0), reg);
 
+       amount = min(count, evt->length - evt->lpos);
+       memcpy(evt->cache + evt->lpos, evt->buf + evt->lpos, amount);
+
+       if (amount < count)
+               memcpy(evt->cache, evt->buf, count - amount);
+
        return IRQ_WAKE_THREAD;
 }