usb: chipidea: udc: using the correct stall implementation
authorPeter Chen <peter.chen@freescale.com>
Mon, 24 Aug 2015 06:10:07 +0000 (14:10 +0800)
committerPeter Chen <peter.chen@freescale.com>
Tue, 15 Sep 2015 08:08:28 +0000 (16:08 +0800)
commit56ffa1d154c7e12af16273f0cdc42690dd05caf5
tree22a8c962b0d623bdb27800d4eb3badab68baf003
parent6ff33f3902c3b1c5d0db6b1e2c70b6d76fba357f
usb: chipidea: udc: using the correct stall implementation

According to spec, there are functional and protocol stalls.

For functional stall, it is for bulk and interrupt endpoints,
below are cases for it:
- Host sends SET_FEATURE request for Set-Halt, the udc driver
needs to set stall, and return true unconditionally.
- The gadget driver may call usb_ep_set_halt to stall certain
endpoints, if there is a transfer in pending, the udc driver
should not set stall, and return -EAGAIN accordingly.
These two kinds of stall need to be cleared by host using CLEAR_FEATURE
request (Clear-Halt).

For protocol stall, it is for control endpoint, this stall will
be set if the control request has failed. This stall will be
cleared by next setup request (hardware will do it).

It fixed usbtest (drivers/usb/misc/usbtest.c) Test 13 "set/clear halt"
test failure, meanwhile, this change has been verified by
USB2 CV Compliance Test and MSC Tests.

Cc: <stable@vger.kernel.org> #3.10+
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Felipe Balbi <balbi@ti.com>
Signed-off-by: Peter Chen <peter.chen@freescale.com>
drivers/usb/chipidea/udc.c