USB: pxa27x_udc: single-thread setup requests
authorRobert Jarzmik <robert.jarzmik@free.fr>
Wed, 22 Apr 2009 03:41:03 +0000 (20:41 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 16 Jun 2009 04:44:42 +0000 (21:44 -0700)
commit367815eea4e483d9c3630f69ae0a57e1e32a92b0
tree6f4031e06ab7bb589452fb31291eb2167796ff6c
parent9f5351b743716c796d13235651699fb4ec7aa64f
USB: pxa27x_udc: single-thread setup requests

Since the PXA 27x UDC automatically ACK's some control
packets such as SET_INTERFACE, the gadgets may not get a
chance to process the request before another control packet
is received. The Linux gadgets do not expect to receive
setup callbacks out of order. The file storage gadget only
saves the "highest" priority request.

The PXA27x UDC driver must make sure it only sends one up at
a time, allowing the gadget to make changes before
continuing. In theory, the host would be NACK'd while the
gadget processes the change but the UDC has already ACK'd
the request. If another request is sent by the host that is
not automatically ACK'd by the UDC, then the throttling
happens properly to regain sync.

The observed case was the file_storage gadget timing out on
a BulkReset request because the SET_INTERFACE was being
processed by the gadget. Since SET_INTERFACE is higher
priority than BulkReset, the BulkReset was dropped.  This
was exacerbated by turning on the debug which delayed the
fsg signal processing thread.

This also fixes the "should never get in
WAIT_ACK_SET_CONF_INTERF state here!!!" warning.

Reported-by: Vernon Sauder <vernoninhand@gmail.com>
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Acked-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
index 51790b0..1937d8c 100644
drivers/usb/gadget/pxa27x_udc.c
drivers/usb/gadget/pxa27x_udc.h