|
@@ -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;
|
|
|
}
|
|
|
|