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)
committerSasha Levin <sasha.levin@oracle.com>
Wed, 28 Oct 2015 02:14:05 +0000 (22:14 -0400)
commit3d94dce3f2db73cd857b8e729606cfd64e9afaac
tree3f97101e0998e90c48478ed0b16702a7f0ef77b1
parent79c927e7c79234db33d917d30e9f372a0b9baa25
usb: chipidea: udc: using the correct stall implementation

[ Upstream commit 56ffa1d154c7e12af16273f0cdc42690dd05caf5 ]

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>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
drivers/usb/chipidea/udc.c