linux/drivers/usb/host
David Laight 35773dac5f usb: xhci: Link TRB must not occur within a USB payload burst
Section 4.11.7.1 of rev 1.0 of the xhci specification states that a link TRB
can only occur at a boundary between underlying USB frames (512 bytes for
high speed devices).

If this isn't done the USB frames aren't formatted correctly and, for example,
the USB3 ethernet ax88179_178a card will stop sending (while still receiving)
when running a netperf tcp transmit test with (say) and 8k buffer.

This should be a candidate for stable, the ax88179_178a driver defaults to
gso and tso enabled so it passes a lot of fragmented skb to the USB stack.

Notes from Sarah:

Discussion: http://marc.info/?l=linux-usb&m=138384509604981&w=2

This patch fixes a long-standing xHCI driver bug that was revealed by a
change in 3.12 in the usb-net driver.  Commit
638c5115a7 "USBNET: support DMA SG" added
support to use bulk endpoint scatter-gather (urb->sg).  Only the USB
ethernet drivers trigger this bug, because the mass storage driver sends
sg list entries in page-sized chunks.

This patch only fixes the issue for bulk endpoint scatter-gather.  The
problem will still occur for periodic endpoints, because hosts will
interpret no-op transfers as a request to skip a service interval, which
is not what we want.

Luckily, the USB core isn't set up for scatter-gather on isochronous
endpoints, and no USB drivers use scatter-gather for interrupt
endpoints.  Document this known limitation so that developers won't try
to use urb->sg for interrupt endpoints until this issue is fixed.  The
more comprehensive fix would be to allow link TRBs in the middle of the
endpoint ring and revert this patch, but that fix would touch too much
code to be allowed in for stable.

This patch should be backported to kernels as old as 3.12, that contain
the commit 638c5115a7 "USBNET: support DMA
SG".  Without this patch, the USB network device gets wedged, and stops
sending packets.  Mark Lord confirms this patch fixes the regression:

http://marc.info/?l=linux-netdev&m=138487107625966&w=2

Signed-off-by: David Laight <david.laight@aculab.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Tested-by: Mark Lord <mlord@pobox.com>
Cc: stable@vger.kernel.org
2013-12-02 11:57:10 -08:00
..
whci usb: Remove unnecessary semicolons 2013-10-11 16:26:46 -07:00
bcma-hcd.c DMA-API: usb: bcma: replace dma_set_mask()+dma_set_coherent_mask() with new helper 2013-10-31 14:48:34 +00:00
ehci-atmel.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ehci-dbg.c USB: EHCI: create per-TT bandwidth tables 2013-10-14 11:04:38 -07:00
ehci-exynos.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ehci-fsl.c Merge 3.12-rc3 into usb-next 2013-09-29 18:45:55 -07:00
ehci-fsl.h
ehci-grlib.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci-hcd.c USB: EHCI: add check for wakeup/suspend race 2013-10-19 14:10:16 -07:00
ehci-hub.c ehci: remove ehci_vdbg() verbose debugging statements 2013-08-30 12:02:07 -07:00
ehci-mem.c USB: EHCI: fix sparse errors 2013-10-19 14:08:04 -07:00
ehci-msm.c USB: ehci-msm: Add device tree support and binding information 2013-10-11 16:31:15 -07:00
ehci-mv.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci-mxc.c usb: ehci-mxc: check for pdata before dereferencing 2013-08-23 10:46:03 -07:00
ehci-octeon.c DMA-API: usb: use dma_set_coherent_mask() 2013-10-31 14:49:01 +00:00
ehci-omap.c DMA-API: usb: use new dma_coerce_mask_and_coherent() 2013-10-31 14:49:04 +00:00
ehci-orion.c DMA-API: usb: use new dma_coerce_mask_and_coherent() 2013-10-31 14:49:04 +00:00
ehci-pci.c usb: ehci: use amd_chipset_type to filter for usb subsystem hang bug 2013-10-03 15:44:50 -07:00
ehci-platform.c DMA-API: usb: use new dma_coerce_mask_and_coherent() 2013-10-31 14:49:04 +00:00
ehci-pmcmsp.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci-ppc-of.c DeviceTree updates for 3.13. This is a bit larger pull request than 2013-11-12 16:52:17 +09:00
ehci-ps3.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci-q.c USB: EHCI: use a bandwidth-allocation table 2013-10-11 16:45:43 -07:00
ehci-sched.c USB: EHCI: fix sparse errors 2013-10-19 14:08:04 -07:00
ehci-sead3.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci-sh.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci-spear.c DMA-API: usb: use new dma_coerce_mask_and_coherent() 2013-10-31 14:49:04 +00:00
ehci-sysfs.c USB: EHCI: use a bandwidth-allocation table 2013-10-11 16:45:43 -07:00
ehci-tegra.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ehci-tilegx.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci-timer.c USB: EHCI: improve interrupt qh unlink 2013-08-12 11:43:48 -07:00
ehci-w90x900.c USB: EHCI: make ehci-w90X900 a separate driver 2013-09-26 09:47:22 -07:00
ehci-xilinx-of.c Revert "Revert "USB: EHCI: support running URB giveback in tasklet context"" 2013-09-23 13:32:51 -07:00
ehci.h USB: EHCI: create per-TT bandwidth tables 2013-10-14 11:04:38 -07:00
fhci-dbg.c
fhci-hcd.c drivers: clean-up prom.h implicit includes 2013-10-09 20:04:04 -05:00
fhci-hub.c
fhci-mem.c
fhci-q.c
fhci-sched.c USB: FHCI: upgrade the isochronous API 2013-05-30 21:34:31 +09:00
fhci-tds.c
fhci.h USB: FHCI: upgrade the isochronous API 2013-05-30 21:34:31 +09:00
fotg210-hcd.c usb: Remove unnecessary semicolons 2013-10-11 16:26:46 -07:00
fotg210.h usb: host: Faraday fotg210-hcd driver 2013-07-29 11:15:39 -07:00
fsl-mph-dr-of.c usb: host: fsl-mph-dr-of: Staticize local symbols 2013-09-17 11:06:57 -05:00
fusbh200-hcd.c usb: Remove unnecessary semicolons 2013-10-11 16:26:46 -07:00
fusbh200.h usb host: Faraday USB2.0 FUSBH200-HCD driver 2013-05-17 10:12:52 -07:00
hwa-hc.c usb: wusbcore: add a quirk for Alereon HWA device isoc behavior 2013-10-29 16:44:49 -07:00
imx21-dbg.c
imx21-hcd.c USB: iMX21: accept very late isochronous URBs 2013-09-25 17:05:34 -07:00
imx21-hcd.h
isp116x-hcd.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
isp116x.h USB: isp116x: remove dependency on CONFIG_USB_DEBUG 2013-07-23 16:35:17 -07:00
isp1362-hcd.c usb: Remove unnecessary semicolons 2013-10-11 16:26:46 -07:00
isp1362.h USB: isp1362: move debug files from proc to debugfs 2013-07-24 14:43:05 -07:00
isp1760-hcd.c USB: remove remaining instances of USB_SUSPEND 2013-05-15 13:44:44 -04:00
isp1760-hcd.h
isp1760-if.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
Kconfig usb: ohci: remove ep93xx bus glue platform driver 2013-10-29 16:43:37 -07:00
Makefile usb: ohci: remove ep93xx bus glue platform driver 2013-10-29 16:43:37 -07:00
octeon2-common.c
ohci-at91.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ohci-da8xx.c Revert "USB: OHCI: Properly handle ohci-da8xx suspend" 2013-10-14 10:18:25 -07:00
ohci-dbg.c usb: Remove unnecessary semicolons 2013-10-11 16:26:46 -07:00
ohci-exynos.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ohci-hcd.c Revert "USB: OHCI: Properly handle OHCI controller suspend" 2013-10-14 10:19:10 -07:00
ohci-hub.c USB: OHCI: fix and explain sparse errors 2013-10-19 14:08:04 -07:00
ohci-jz4740.c USB: ohci-jz4740: remove unnecessary platform_set_drvdata() 2013-05-16 17:47:17 -07:00
ohci-mem.c
ohci-nxp.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ohci-octeon.c DMA-API: usb: use new dma_coerce_mask_and_coherent() 2013-10-31 14:49:04 +00:00
ohci-omap3.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ohci-omap.c USB: OHCI: Properly handle ohci-omap suspend 2013-10-05 17:56:41 -07:00
ohci-pci.c usb: ohci: use amd_chipset_type to filter for SB800 prefetch 2013-10-03 15:44:51 -07:00
ohci-platform.c USB: OHCI: Properly handle ohci-platform suspend 2013-10-05 17:56:41 -07:00
ohci-ppc-of.c drivers: clean-up prom.h implicit includes 2013-10-09 20:04:04 -05:00
ohci-ps3.c
ohci-pxa27x.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ohci-q.c USB: OHCI: accept very late isochronous URBs 2013-09-25 17:05:35 -07:00
ohci-s3c2410.c ARM: SoC platform changes for 3.13 2013-11-11 16:49:45 +09:00
ohci-sa1111.c DMA-API: usb: ohci-sa1111: add a note about DMA masks 2013-10-31 14:48:44 +00:00
ohci-sm501.c USB: OHCI: Properly handle ohci-sm501 suspend 2013-10-05 17:56:41 -07:00
ohci-spear.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
ohci-tilegx.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-tmio.c usb: host: ohci-tmio: Remove redundant platform_set_drvdata() 2013-05-17 10:14:53 -07:00
ohci.h USB: OHCI: add a name for the platform-private field 2013-06-03 11:03:18 -07:00
oxu210hp-hcd.c Merge 3.10-rc3 into usb-next 2013-05-27 11:00:52 +09:00
oxu210hp.h
pci-quirks.c Merge 3.12-rc6 into usb-next. 2013-10-19 13:19:07 -07:00
pci-quirks.h usb: ohci: use amd_chipset_type to filter for SB800 prefetch 2013-10-03 15:44:51 -07:00
r8a66597-hcd.c usb: r8a66597-hcd: use platform_{get,set}_drvdata() 2013-08-30 11:11:35 -07:00
r8a66597.h
sl811_cs.c drivers/usb: use module_pcmcia_driver() in pcmcia drivers 2013-03-15 12:26:38 -07:00
sl811-hcd.c usb: Remove unnecessary semicolons 2013-10-11 16:26:46 -07:00
sl811.h USB: sl811: move debug files from proc to debugfs 2013-07-24 14:43:05 -07:00
ssb-hcd.c DMA-API: usb: ssb-hcd: replace dma_set_mask()+dma_set_coherent_mask() with new helper 2013-10-31 14:48:36 +00:00
u132-hcd.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
uhci-debug.c USB/host: Use existing macros instead of hard-coded values in uhci-debug.c 2013-10-05 17:58:48 -07:00
uhci-grlib.c USB: host: use platform_{get,set}_drvdata() 2013-05-30 21:32:54 +09:00
uhci-hcd.c Merge 3.8-rc5 into usb-next 2013-01-25 12:41:02 -08:00
uhci-hcd.h USB: UHCI: remove unused definition 2013-01-24 13:42:09 -08:00
uhci-hub.c USB/host: Bugfix: Return length of copied buffer in uhci_hub_control() 2013-10-07 00:07:17 -07:00
uhci-pci.c USB: UHCI: check for wakeup/suspend race 2013-10-19 14:12:14 -07:00
uhci-platform.c Merge branch 'for-linus-dma-masks' of git://git.linaro.org/people/rmk/linux-arm 2013-11-14 07:55:21 +09:00
uhci-q.c USB: UHCI: accept very late isochronous URBs 2013-09-25 17:05:34 -07:00
xhci-dbg.c xhci: add traces for debug messages in xhci_address_device() 2013-08-13 16:05:38 -07:00
xhci-ext-caps.h xhci: fix port BESL LPM capability checking 2013-08-27 08:54:42 -07:00
xhci-hub.c xhci: Final patches for 3.13 2013-10-19 14:03:44 -07:00
xhci-mem.c usb: Don't enable USB 2.0 Link PM by default. 2013-10-16 12:24:19 -07:00
xhci-pci.c xhci: Fix spurious wakeups after S5 on Haswell 2013-10-09 16:27:20 -07:00
xhci-plat.c xhci: Step 1 to fix usb-linus and usb-next. 2013-08-15 18:00:46 -07:00
xhci-ring.c usb: xhci: Link TRB must not occur within a USB payload burst 2013-12-02 11:57:10 -08:00
xhci-trace.c xhci: add traces for debug messages in xhci_address_device() 2013-08-13 16:05:38 -07:00
xhci-trace.h xhci: trace debug statements related to ring expansion 2013-08-13 21:14:44 -07:00
xhci.c xhci: Final patches for 3.13 2013-10-19 14:03:44 -07:00
xhci.h xhci: Final patches for 3.13 2013-10-19 14:03:44 -07:00