Skip to contentSkip to conversation

usb: at91_udc: correct hanging while disconnecting usb cable

PATCH In review Nicolas Ferre 2 participants 2 messages Dec 6, 2007

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 usb: at91_udc: correct hanging while disconnecting usb cable

Correct hanging while disconnecting the USB device cable. Prevent a race between vbus and UDP interrupts. This bug was tracked on at91sam9260ek boards.

A usb resume interrupt was firing after the vbus interrupt : the IP was then already stoped and not able to deal with it (no more clock). A simple interrupt disabling is ok as the "end of bus reset" irq is non maskable and ok to resume the USB device IP.

drivers/usb/gadget/at91_udc.c +0 -0
@@ -908,6 +908,7 @@ static void pullup(struct at91_udc *udc,
 
	if (is_on) {
		clk_on(udc);
+		at91_udp_write(udc, AT91_UDP_ICR, AT91_UDP_RXRSM);
		at91_udp_write(udc, AT91_UDP_TXVC, 0);
		if (cpu_is_at91rm9200())
			at91_set_gpio_value(udc->board.pullup_pin, 1);
@@ -925,6 +926,7 @@ static void pullup(struct at91_udc *udc,
		}
	} else {
		stop_activity(udc);
+		at91_udp_write(udc, AT91_UDP_IDR, AT91_UDP_RXRSM);
		at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
		if (cpu_is_at91rm9200())
			at91_set_gpio_value(udc->board.pullup_pin, 0);
#1 lore raw
Quoted 4 lines · Nicolas Ferre

Correct hanging while disconnecting the USB device cable. Prevent a race between vbus and UDP interrupts. This bug was tracked on at91sam9260ek boards.

Quoted 8 lines

---

A usb resume interrupt was firing after the vbus interrupt : the IP was then already stoped and not able to deal with it (no more clock). A simple interrupt disabling is ok as the "end of bus reset" irq is non maskable and ok to resume the USB device IP.

Good, thanks for finding this. The bug was reported recently, and obviously can't be reproduced except on boards which *have* a VBUS interrupt!

I've signed off on this and suggested Greg merge it before the 2.6.24-final freeze.

- Dave