usb: at91_udc: correct hanging while disconnecting usb cable
Subsystems (2)
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);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
Signed-off-by Nicolas Ferre <[email protected]>---
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