From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx1.til-technologies.net ([92.103.228.36] helo=mx.til-technologies.net) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1UFlwE-0007QQ-BZ for barebox@lists.infradead.org; Wed, 13 Mar 2013 13:41:51 +0000 Message-ID: <51408267.8040703@til-technologies.fr> Date: Wed, 13 Mar 2013 14:43:03 +0100 From: Cerrato Renaud MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 3/5] at91udc: fix recursive poll() To: barebox@lists.infradead.org I noticed some weird behavior using DFU gadget on AT91SAM9260 which worked 1 of 10 times. The bug was due to the usb_gadget_poll() being called while the previous call was still in progress : some USB calls may takes a lot of time (ex : DFU erase-then-write), resulting in the poller to be triggered again while still in the poll() function. This patch adds a poll lock to the AT91 UDC driver. Signed-off-by: Cerrato Renaud --- drivers/usb/gadget/at91_udc.c | 14 ++++++++------ drivers/usb/gadget/at91_udc.h | 1 + 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 0654038..8ae9119 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c @@ -1340,22 +1340,24 @@ int usb_gadget_poll(void) struct at91_udc *udc = &controller; u32 value; - if (!udc->udp_baseaddr) + if (!udc->udp_baseaddr || udc->poll_lock) return 0; + udc->poll_lock = 1; + value = gpio_get_value(udc->board.vbus_pin); value ^= udc->board.vbus_active_low; - - if (!value) { - at91_update_vbus(udc, value); - return 0; - } at91_update_vbus(udc, value); + if (!value) + goto exit; + value = at91_udp_read(udc, AT91_UDP_ISR) & (~(AT91_UDP_SOFINT)); if (value) at91_udc_irq(udc); +exit: + udc->poll_lock = 0; return value; } diff --git a/drivers/usb/gadget/at91_udc.h b/drivers/usb/gadget/at91_udc.h index e592cc5..51145a9 100644 --- a/drivers/usb/gadget/at91_udc.h +++ b/drivers/usb/gadget/at91_udc.h @@ -127,6 +127,7 @@ struct at91_udc { unsigned wait_for_config_ack:1; unsigned selfpowered:1; unsigned active_suspend:1; + unsigned poll_lock:1; u8 addr; u32 gpio_vbus_val; struct at91_udc_data board; -- 1.7.2.5 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox