OpenCloudOS-Kernel/drivers/usb/host
Sarah Sharp 50d0206fca xhci: Fix bug after deq ptr set to link TRB.
This patch fixes a particularly nasty bug that was revealed by the ring
expansion patches.  The bug has been present since the very beginning of
the xHCI driver history, and could have caused general protection faults
from bad memory accesses.

The first thing to note is that a Set TR Dequeue Pointer command can
move the dequeue pointer to a link TRB, if the canceled or stalled
transfer TD ended just before a link TRB.  The function to increment the
dequeue pointer, inc_deq, was written before cancellation and stall
support was added.  It assumed that the dequeue pointer could never
point to a link TRB.  It would unconditionally increment the dequeue
pointer at the start of the function, check if the pointer was now on a
link TRB, and move it to the top of the next segment if so.

This means that if a Set TR Dequeue Point command moved the dequeue
pointer to a link TRB, a subsequent call to inc_deq() would move the
pointer off the segment and into la-la-land.  It would then read from
that memory to determine if it was a link TRB.  Other functions would
often call inc_deq() until the dequeue pointer matched some other
pointer, which means this function would quite happily read all of
system memory before wrapping around to the right pointer value.

Often, there would be another endpoint segment from a different ring
allocated from the same DMA pool, which would be contiguous to the
segment inc_deq just stepped off of.  inc_deq would eventually find the
link TRB in that segment, and blindly move the dequeue pointer back to
the top of the correct ring segment.

The only reason the original code worked at all is because there was
only one ring segment.  With the ring expansion patches, the dequeue
pointer would eventually wrap into place, but the dequeue segment would
be out-of-sync.  On the second TD after the dequeue pointer was moved to
a link TRB, trb_in_td() would fail (because the dequeue pointer and
dequeue segment were out-of-sync), and this message would appear:

ERROR Transfer event TRB DMA ptr not part of current TD

This fixes bugzilla entry 4333 (option-based modem unhappy on USB 3.0
port: "Transfer event TRB DMA ptr not part of current TD", "rejecting
I/O to offline device"),

	https://bugzilla.kernel.org/show_bug.cgi?id=43333

and possibly other general protection fault bugs as well.

This patch should be backported to kernels as old as 2.6.31.  A separate
patch will be created for kernels older than 3.4, since inc_deq was
modified in 3.4 and this patch will not apply.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Tested-by: James Ettle <theholyettlz@googlemail.com>
Tested-by: Matthew Hall <mhall@mhcomputing.net>
Cc: stable@vger.kernel.org
2012-08-08 12:17:38 -07:00
..
whci Merge branch 'for-next/dwc3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next 2011-12-12 15:19:53 -08:00
Kconfig USB patches for 3.6-rc1 2012-07-26 10:23:47 -07:00
Makefile USB: Add driver for the ssb bus 2012-04-18 13:43:30 -07:00
alchemy-common.c MIPS: Alchemy: Au1300 SoC support 2011-12-07 22:02:05 +00:00
bcma-hcd.c usb/bcma: Add missing #include <linux/slab.h> 2012-04-23 13:22:00 -07:00
ehci-atmel.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-au1xxx.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-cns3xxx.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-dbg.c USB: EHCI: add new root-hub state: STOPPING 2012-07-16 16:50:14 -07:00
ehci-fsl.c USB: ehci-fsl: Update ifdef check to work on 64-bit ppc 2012-07-16 17:11:12 -07:00
ehci-fsl.h fsl/usb: Add controller version based ULPI and UTMI phy support 2012-04-18 13:46:42 -07:00
ehci-grlib.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-hcd.c USB patches for 3.6-rc1 2012-07-26 10:23:47 -07:00
ehci-hub.c USB: EHCI: resolve some unlikely races 2012-07-16 16:56:48 -07:00
ehci-ixp4xx.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-lpm.c USB: Mark EHCI LPM functions as __maybe_unused 2011-02-17 10:47:55 -08:00
ehci-ls1x.c USB: Add EHCI bus glue for Loongson1x SoCs (UPDATED) 2012-01-24 15:28:02 -08:00
ehci-mem.c USB: EHCI: use hrtimer for (s)iTD deallocation 2012-07-16 16:54:25 -07:00
ehci-msm.c EHCI: centralize controller suspend/resume 2012-07-09 08:54:18 -07:00
ehci-mv.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-mxc.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-octeon.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-omap.c MFD bits for the 3.6 merge window. 2012-07-30 12:41:17 -07:00
ehci-orion.c ARM: SoC fixes 2012-07-26 20:29:52 -07:00
ehci-pci.c USB: EHCI: use hrtimer for the periodic schedule 2012-07-16 16:53:16 -07:00
ehci-platform.c EHCI: centralize controller suspend/resume 2012-07-09 08:54:18 -07:00
ehci-pmcmsp.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-ppc-of.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-ps3.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-q.c USB: EHCI: use hrtimer for the I/O watchdog 2012-07-16 16:56:47 -07:00
ehci-s5p.c USB: ehci-s5p: Add vbus setup function to the s5p ehci glue layer 2012-07-17 10:48:29 -07:00
ehci-sched.c USB: EHCI: simplify isochronous scanning 2012-07-16 16:56:47 -07:00
ehci-sead3.c EHCI: centralize controller suspend/resume 2012-07-09 08:54:18 -07:00
ehci-sh.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-spear.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-sysfs.c USB: EHCI: Allow users to override 80% max periodic bandwidth 2011-07-08 14:51:33 -07:00
ehci-tegra.c USB patches for 3.6-rc1 2012-07-26 10:23:47 -07:00
ehci-tilegx.c usb: add host support for the tilegx architecture 2012-07-18 16:40:29 -04:00
ehci-timer.c USB: EHCI: use hrtimer for the I/O watchdog 2012-07-16 16:56:47 -07:00
ehci-vt8500.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-w90x900.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-xilinx-of.c EHCI: centralize controller initialization 2012-07-09 13:35:05 -07:00
ehci-xls.c usb: host: tegra: pass correct pointer in ehci_setup() 2012-07-16 17:13:39 -07:00
ehci.h USB: EHCI: resolve some unlikely races 2012-07-16 16:56:48 -07:00
fhci-dbg.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-hcd.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-hub.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-mem.c
fhci-q.c
fhci-sched.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-tds.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci.h USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fsl-mph-dr-of.c fsl/usb: Add controller version based ULPI and UTMI phy support 2012-04-18 13:46:42 -07:00
hwa-hc.c Merge branch 'usb-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb 2012-01-09 12:09:47 -08:00
imx21-dbg.c usb: Fix typo in imx21-dbg.c 2012-02-13 14:32:34 -08:00
imx21-hcd.c usb: imx21-hcd.c: Use clk_prepare_enable/clk_disable_unprepare 2012-06-12 13:31:03 +03:00
imx21-hcd.h
isp116x-hcd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
isp116x.h Fix common misspellings 2011-03-31 11:26:23 -03:00
isp1362-hcd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
isp1362.h
isp1760-hcd.c isp1760-hcd: fix possible memory leak if urb could not be enqueued 2012-04-18 13:51:19 -07:00
isp1760-hcd.h usb/isp1760: Allow to optionally trigger low-level chip reset via GPIOLIB. 2011-10-19 13:29:06 -07:00
isp1760-if.c isp1760-if: make module unloads correctly 2012-04-18 13:50:44 -07:00
octeon2-common.c usb: Configure octeon2 glue logic for proper uSOF cycle period. 2011-05-03 10:09:32 -07:00
ohci-at91.c USB: ohci-at91: add a reset function to fix race condition 2012-05-09 15:22:27 -07:00
ohci-au1xxx.c usb: [MIPS] fix unresolved err() reference in host/ohci-au1xxx.c 2012-05-01 18:36:09 -04:00
ohci-cns3xxx.c USB: ohci-cns3xxx.c: remove err() usage 2012-04-27 11:24:40 -07:00
ohci-da8xx.c ohci-da8xx: set MODULE_ALIAS to allow autoloading 2012-05-08 09:26:10 -07:00
ohci-dbg.c USB: ohci-dbg.c: remove dbg() usage 2012-05-01 21:33:37 -07:00
ohci-ep93xx.c USB: ohci-ep93xx.c: remove dbg() usage 2012-05-01 21:33:38 -07:00
ohci-exynos.c USB: ohci-exynos: Add support for device tree 2012-07-16 17:16:17 -07:00
ohci-hcd.c usb: add host support for the tilegx architecture 2012-07-18 16:40:29 -04:00
ohci-hub.c USB: ohci-hub: Mark ohci_finish_controller_resume() as __maybe_unused 2012-06-13 17:26:11 -07:00
ohci-jz4740.c
ohci-mem.c
ohci-nxp.c USB: ohci-nxp: add usbd and otg clock initialization 2012-06-20 16:20:24 -07:00
ohci-octeon.c USB: irq: Remove IRQF_DISABLED 2011-09-18 01:39:36 -07:00
ohci-omap.c USB patches for 3.6-rc1 2012-07-26 10:23:47 -07:00
ohci-omap3.c ARM: OMAP: USBHOST: Replace usbhs core driver APIs by Runtime pm APIs 2011-12-16 04:29:57 -07:00
ohci-pci.c usb: add support for STA2X11 host driver 2012-01-24 14:15:37 -08:00
ohci-platform.c usb: Fix various typo within usb 2012-04-18 13:57:26 -07:00
ohci-pnx8550.c usb: [MIPS] fix unresolved err() reference in host/ohci-pnx8550.c 2012-05-01 18:36:09 -04:00
ohci-ppc-of.c USB: ohci-ppc-of.c: remove err() usage 2012-04-27 11:24:42 -07:00
ohci-ppc-soc.c USB: ohci-ppc-soc.c: remove err() usage 2012-04-27 11:24:42 -07:00
ohci-ps3.c USB: ohci-ps3.c: remove err() usage 2012-04-27 11:24:43 -07:00
ohci-pxa27x.c usb: [ARM] fix unresolved err() reference in host/ohci-pxa27x.c 2012-05-01 18:36:09 -04:00
ohci-q.c OHCI: remove uses of hcd->state 2011-11-18 10:51:00 -08:00
ohci-s3c2410.c USB: ohci-s3c2410.c: remove err() usage 2012-04-27 11:24:43 -07:00
ohci-sa1111.c USB: ohci-sa1111.c: remove dbg() usage 2012-05-01 21:33:39 -07:00
ohci-sh.c USB: ohci-sh.c: remove err() usage 2012-04-27 11:24:44 -07:00
ohci-sm501.c OHCI: remove uses of hcd->state 2011-11-18 10:51:00 -08:00
ohci-spear.c USB: ehci: ohci: Add clk_{un}prepare() support 2012-04-18 14:33:43 -07:00
ohci-tilegx.c usb: add host support for the tilegx architecture 2012-07-18 16:40:29 -04:00
ohci-tmio.c USB: ohci-tmio.c: remove err() usage 2012-04-27 11:24:44 -07:00
ohci-xls.c USB: ohci-xls.c: remove err() usage 2012-04-27 11:24:45 -07:00
ohci.h USB: move transceiver from ehci_hcd and ohci_hcd to hcd and rename it as phy 2012-06-13 12:38:36 -07:00
oxu210hp-hcd.c USB: oxu210hp-hcd.c: remove dbg() usage 2012-05-01 21:33:43 -07:00
oxu210hp.h
pci-quirks.c xhci: Add Lynx Point to list of Intel switchable hosts. 2012-05-03 13:18:40 -07:00
pci-quirks.h Intel xhci: Support EHCI/xHCI port switching. 2011-05-27 12:07:36 -07:00
r8a66597-hcd.c usb/host/r8a66597: remove conditional compilation of clk code 2012-07-30 17:25:12 -07:00
r8a66597.h usb/host/r8a66597: remove conditional compilation of clk code 2012-07-30 17:25:12 -07:00
sl811-hcd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
sl811.h
sl811_cs.c pcmcia: Convert pcmcia_device_id declarations to const 2011-05-06 07:46:22 +02:00
ssb-hcd.c usb/ssb: Add missing #include <linux/slab.h> 2012-04-23 13:22:00 -07:00
u132-hcd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
uhci-debug.c USB: UHCI: Add support for big endian descriptors 2011-05-19 16:43:20 -07:00
uhci-grlib.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00
uhci-hcd.c Remove all #inclusions of asm/system.h 2012-03-28 18:30:03 +01:00
uhci-hcd.h USB: UHCI: Add support for big endian descriptors 2011-05-19 16:43:20 -07:00
uhci-hub.c UHCI: hub_status_data should indicate if ports are resuming 2012-04-09 15:43:21 -07:00
uhci-pci.c USB: UHCI: Move PCI specific functions to uhci-pci.c 2011-05-06 18:24:00 -07:00
uhci-q.c usb: fix number of mapped SG DMA entries 2011-12-09 16:18:19 -08:00
xhci-dbg.c xHCI: correct to print the true HSEE of USBCMD 2012-04-10 15:21:52 -07:00
xhci-ext-caps.h xHCI: Correct the #define XHCI_LEGACY_DISABLE_SMI 2012-04-11 08:31:06 -07:00
xhci-hub.c USB: Link PM fixes and Latency Tolerance Messaging 2012-07-16 16:58:30 -07:00
xhci-mem.c xhci: Don't free endpoints in xhci_mem_cleanup() 2012-06-13 16:37:30 -07:00
xhci-pci.c xhci: Add Etron XHCI_TRUST_TX_LENGTH quirk. 2012-08-07 10:56:31 -07:00
xhci-plat.c usb: host: xhci: add platform driver support 2012-03-13 10:30:59 -07:00
xhci-ring.c xhci: Fix bug after deq ptr set to link TRB. 2012-08-08 12:17:38 -07:00
xhci.c xhci: Increase reset timeout for Renesas 720201 host. 2012-08-07 10:56:30 -07:00
xhci.h xhci: Rate-limit XHCI_TRUST_TX_LENGTH quirk warning. 2012-08-07 10:56:31 -07:00