linux/drivers/usb/dwc3
John Youn c450960187 usb: dwc3: Fix assignment of EP transfer resources
The assignement of EP transfer resources was not handled properly in the
dwc3 driver. Commit aebda61871 ("usb: dwc3: Reset the transfer
resource index on SET_INTERFACE") previously fixed one aspect of this
where resources may be exhausted with multiple calls to SET_INTERFACE.
However, it introduced an issue where composite devices with multiple
interfaces can be assigned the same transfer resources for different
endpoints. This patch solves both issues.

The assignment of transfer resources cannot perfectly follow the data
book due to the fact that the controller driver does not have all
knowledge of the configuration in advance. It is given this information
piecemeal by the composite gadget framework after every
SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook
programming model in this scenario can cause errors. For two reasons:

1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION and
SET_INTERFACE (8.1.5). This is incorrect in the scenario of multiple
interfaces.

2) The databook does not mention doing more DEPXFERCFG for new endpoint
on alt setting (8.1.6).

The following simplified method is used instead:

All hardware endpoints can be assigned a transfer resource and this
setting will stay persistent until either a core reset or hibernation.
So whenever we do a DEPSTARTCFG(0) we can go ahead and do DEPXFERCFG for
every hardware endpoint as well. We are guaranteed that there are as
many transfer resources as endpoints.

This patch triggers off of the calling dwc3_gadget_start_config() for
EP0-out, which always happens first, and which should only happen in one
of the above conditions.

Fixes: aebda61871 ("usb: dwc3: Reset the transfer resource index on SET_INTERFACE")
Cc: <stable@vger.kernel.org> # v3.2+
Reported-by: Ravi Babu <ravibabu@ti.com>
Signed-off-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
2016-02-17 10:31:53 +02:00
..
core.c usb: dwc3: core: purge dev_dbg() calls 2015-12-15 09:12:41 -06:00
core.h usb: dwc3: Fix assignment of EP transfer resources 2016-02-17 10:31:53 +02:00
debug.c usb: dwc3: add tracepoints to aid debugging 2014-09-05 09:55:51 -05:00
debug.h usb: dwc3: add tracepoints to aid debugging 2014-09-05 09:55:51 -05:00
debugfs.c usb: dwc3: switch to GPL v2 only 2013-07-29 13:56:44 +03:00
dwc3-exynos.c usb: dwc3: exynos: switch dev_dbg() to dev_info() 2015-07-29 09:59:17 -05:00
dwc3-keystone.c usb: dwc3: keystone: convert dev_dbg() to dev_err() 2015-07-29 09:59:17 -05:00
dwc3-of-simple.c usb: dwc3: of-simple: fix build warning on !PM 2015-12-22 21:58:26 -06:00
dwc3-omap.c usb: dwc3: omap: enable irqs lately 2015-09-14 09:51:58 -05:00
dwc3-pci.c usb: dwc3: pci: add support for Intel Broxton SOC 2015-11-16 10:12:29 -06:00
dwc3-st.c usb: common: of_usb_get_dr_mode to usb_get_dr_mode 2015-09-27 10:54:31 -05:00
ep0.c usb: dwc3: Fix assignment of EP transfer resources 2016-02-17 10:31:53 +02:00
gadget.c usb: dwc3: Fix assignment of EP transfer resources 2016-02-17 10:31:53 +02:00
gadget.h usb: dwc3: gadget: fix set_halt() bug with pending transfers 2014-10-20 15:58:48 -05:00
host.c usb: dwc3: make LPM configurable in DT 2015-03-10 15:33:33 -05:00
io.h usb: dwc3: add tracepoints to aid debugging 2014-09-05 09:55:51 -05:00
Kconfig usb: dwc3: remove dwc3-qcom in favor of dwc3-of-simple 2015-12-15 09:12:41 -06:00
Makefile usb: dwc3: remove dwc3-qcom in favor of dwc3-of-simple 2015-12-15 09:12:41 -06:00
platform_data.h usb: dwc3: Add dis_enblslpm_quirk 2015-10-09 16:06:59 -05:00
trace.c usb: dwc3: add tracepoints to aid debugging 2014-09-05 09:55:51 -05:00
trace.h usb: dwc3: trace: show request flags 2015-12-15 09:12:41 -06:00
ulpi.c usb: dwc3: add ULPI interface support 2015-05-13 12:06:52 -05:00