linux/drivers/usb/chipidea
Peter Chen 2fc5a7dace usb: chipidea: udc: using MultO at TD as real mult value for ISO-TX
We have met a bug that the high bandwidth ISO-TX transfer has failed
at the last packet if it is less than 1024, the TD status shows it
is "Transaction Error".

The root cause of this problem is: the mult value at qh is not correct
for current TD's transfer length. We use TD list to queue un-transfer
TDs, and change mult for new adding TDs. If new adding TDs transfer length
less than 1024, but the queued un-transfer TDs transfer length is larger
than 1024, the transfer error will occur, and vice versa.
Usually, this problem occurs at the last packet, and the first packet for
new frame.

We fixed this problem by setting Mult at QH as the largest value (3), and
set MultO (Multiplier Override) at TD according to every transfer length.
It can cover both hardware version less than 2.3 (the real mult is MultO
if it is not 0) and 2.3+ (the real mult is min(qh.mult, td.multo)).

Since the MultO bits are only existed at TX TD, we keep the ISO-RX behavior
unchanged.

For stable tree: 3.11+.

Cc: stable <stable@vger.kernel.org>
Cc: Michael Grzeschik <m.grzeschik@pengutronix.de>
Reported-by: Matthieu Vanin <b47495@freescale.com>
Tested-by: Matthieu Vanin <b47495@freescale.com>
Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-01-13 15:55:19 -08:00
..
bits.h usb: chipidea: add ci_hdrc_enter_lpm API 2013-09-30 18:54:07 -07:00
ci_hdrc_imx.c usb: chipidea: imx: set CI_HDRC_IMX28_WRITE_FIX for imx28 2014-01-13 15:55:19 -08:00
ci_hdrc_imx.h USB: chipidea: add guard macro to ci_hdrc_imx.h 2014-01-03 12:37:57 -08:00
ci_hdrc_msm.c usb: chipidea: retire flag CI_HDRC_PULLUP_ON_VBUS 2013-08-14 12:37:20 -07:00
ci_hdrc_pci.c usb: chipidea: remove DEFINE_PCI_DEVICE_TABLE macro 2013-12-03 10:22:52 -08:00
ci.h usb: chipidea: add freescale imx28 special write register method 2014-01-13 15:55:19 -08:00
core.c usb: chipidea: put hw_phymode_configure before ci_usb_phy_init 2014-01-13 15:55:19 -08:00
debug.c usb: chipidea: drop "13xxx" infix 2013-06-24 16:16:55 -07:00
debug.h usb: chipidea: drop "13xxx" infix 2013-06-24 16:16:55 -07:00
host.c usb: chipidea: add freescale imx28 special write register method 2014-01-13 15:55:19 -08:00
host.h usb: chipidea: add role init and destroy APIs 2013-08-14 12:37:19 -07:00
Kconfig usb: chipidea: USB_CHIPIDEA should depend on HAS_DMA 2013-09-25 17:30:39 -07:00
Makefile usb: chipidea: imx: avoid unnecessary probe defer every time 2013-12-08 18:02:54 -08:00
otg.c usb: chipidea: add wait vbus lower than OTGSC_BSV before role starts 2013-08-14 12:37:20 -07:00
otg.h usb: chipidea: need to mask INT_STATUS when write otgsc 2014-01-13 15:55:19 -08:00
udc.c usb: chipidea: udc: using MultO at TD as real mult value for ISO-TX 2014-01-13 15:55:19 -08:00
udc.h usb: chipidea: add role init and destroy APIs 2013-08-14 12:37:19 -07:00
usbmisc_imx.c usb: chipidea: usbmisc: Add support for i.MX51 CPU 2013-12-08 18:02:55 -08:00