From 137f7c590d37279f49caf4d3152a0a7d12f01831 Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Tue, 3 Mar 2015 17:32:12 +0100 Subject: [PATCH] usb: dwc3: optimize interrupt loop There is no point in calling dwc3_thread_interrupt() if no event is pending. There is also no point in flushing event cache in EVERY loop iteration. Signed-off-by: Marek Szyprowski --- drivers/usb/dwc3/core.c | 7 ------- drivers/usb/dwc3/gadget.c | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 33d2cf2f11..ab3c94e512 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -769,18 +769,11 @@ void dwc3_uboot_exit(int index) void dwc3_uboot_handle_interrupt(int index) { struct dwc3 *dwc = NULL; - int i; - struct dwc3_event_buffer *evt; list_for_each_entry(dwc, &dwc3_list, list) { if (dwc->index != index) continue; - for (i = 0; i < dwc->num_event_buffers; i++) { - evt = dwc->ev_buffs[i]; - dwc3_flush_cache((int)evt->buf, evt->length); - } - dwc3_gadget_uboot_handle_interrupt(dwc); break; } diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 7c342c63ec..eb31cd93d6 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2683,6 +2683,17 @@ void dwc3_gadget_exit(struct dwc3 *dwc) */ void dwc3_gadget_uboot_handle_interrupt(struct dwc3 *dwc) { - dwc3_interrupt(0, dwc); - dwc3_thread_interrupt(0, dwc); + int ret = dwc3_interrupt(0, dwc); + + if (ret == IRQ_WAKE_THREAD) { + int i; + struct dwc3_event_buffer *evt; + + for (i = 0; i < dwc->num_event_buffers; i++) { + evt = dwc->ev_buffs[i]; + dwc3_flush_cache((int)evt->buf, evt->length); + } + + dwc3_thread_interrupt(0, dwc); + } } -- 2.39.5