linux/drivers/usb/host
Sarah Sharp 3abeca998a xhci: Fix bug in control transfer cancellation.
When the xHCI driver attempts to cancel a transfer, it issues a Stop
Endpoint command and waits for the host controller to indicate which TRB
it was in the middle of processing.  The host will put an event TRB with
completion code COMP_STOP on the event ring if it stops on a control
transfer TRB (or other types of transfer TRBs).  The ring handling code
is supposed to set ep->stopped_trb to the TRB that the host stopped on
when this happens.

Unfortunately, there is a long-standing bug in the control transfer
completion code.  It doesn't actually check to see if COMP_STOP is set
before attempting to process the transfer based on which part of the
control TD completed.  So when we get an event on the data phase of the
control TRB with COMP_STOP set, it thinks it's a normal completion of
the transfer and doesn't set ep->stopped_td or ep->stopped_trb.

When the ring handling code goes on to process the completion of the Stop
Endpoint command, it sees that ep->stopped_trb is not a part of the TD
it's trying to cancel.  It thinks the hardware has its enqueue pointer
somewhere further up in the ring, and thinks it's safe to turn the control
TRBs into no-op TRBs.  Since the hardware was in the middle of the control
TRBs to be cancelled, the proper software behavior is to issue a Set TR
dequeue pointer command.

It turns out that the NEC host controllers can handle active TRBs being
set to no-op TRBs after a stop endpoint command, but other host
controllers have issues with this out-of-spec software behavior.  Fix this
behavior.

This patch should be backported to kernels as far back as 2.6.31, but it
may be a bit challenging, since process_ctrl_td() was introduced in some
refactoring done in 2.6.36, and some endian-safe patches added in 2.6.40
that touch the same lines.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: stable@kernel.org
2011-05-11 16:17:59 -07:00
..
whci Fix common misspellings 2011-03-31 11:26:23 -03:00
ehci-ath79.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-atmel.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-au1xxx.c USB: ehci-au1xxx: fix suspend callback 2011-05-06 18:16:39 -07:00
ehci-cns3xxx.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-dbg.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-fsl.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-fsl.h USB: ehci-fsl: add MPC5121E specific suspend and resume 2011-05-02 16:59:36 -07:00
ehci-grlib.c USB: EHCI: Add bus glue for GRLIB GRUSBHC controller 2011-05-03 11:43:48 -07:00
ehci-hcd.c USB: EHCI: Add bus glue for GRLIB GRUSBHC controller 2011-05-03 11:43:48 -07:00
ehci-hub.c USB: extend ehci-fsl and fsl_udc_core driver for OTG operation 2011-05-02 16:59:38 -07:00
ehci-ixp4xx.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-lpm.c USB: Mark EHCI LPM functions as __maybe_unused 2011-02-17 10:47:55 -08:00
ehci-mem.c
ehci-msm.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-mxc.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-octeon.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-omap.c Merge branch 2.6.39-rc7 into usb-linus 2011-05-10 13:30:45 -07:00
ehci-orion.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-pci.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-pmcmsp.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-ppc-of.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-ps3.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-q.c Merge 2.6.39-rc4 into usb-next 2011-04-19 05:50:38 -07:00
ehci-s5p.c USB: ehci-s5p : use __devinit and __devexit macros for probe and remove 2011-05-10 14:14:59 -07:00
ehci-sched.c USB host: Move AMD PLL quirk to pci-quirks.c 2011-03-01 16:01:45 -05:00
ehci-sh.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-spear.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-tegra.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-vt8500.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-w90x900.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci-xilinx-of.c USB: EHCI: Support controllers with big endian capability regs 2011-05-03 11:43:21 -07:00
ehci.h USB: EHCI: Add bus glue for GRLIB GRUSBHC controller 2011-05-03 11:43:48 -07:00
fhci-dbg.c
fhci-hcd.c Fix common misspellings 2011-03-31 11:26:23 -03:00
fhci-hub.c
fhci-mem.c
fhci-q.c
fhci-sched.c
fhci-tds.c Fix common misspellings 2011-03-31 11:26:23 -03:00
fhci.h Fix common misspellings 2011-03-31 11:26:23 -03:00
fsl-mph-dr-of.c USB: ehci-fsl: Fix 'have_sysif_regs' detection 2011-01-22 18:38:58 -08:00
hwa-hc.c
imx21-dbg.c
imx21-hcd.c Fix common misspellings 2011-03-31 11:26:23 -03:00
imx21-hcd.h
isp116x-hcd.c USB 3.0 Hub Changes 2011-03-13 18:07:11 -07:00
isp116x.h Fix common misspellings 2011-03-31 11:26:23 -03:00
isp1362-hcd.c Fix common misspellings 2011-03-31 11:26:23 -03:00
isp1362.h
isp1760-hcd.c usb/isp1760: Report correct urb status after unlink 2011-05-02 17:07:49 -07:00
isp1760-hcd.h usb/isp1760: Improve urb queueing, get rid of BUG():s in normal code paths 2011-05-02 17:03:50 -07:00
isp1760-if.c dt/usb: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
Kconfig USB: UHCI: Add support for GRLIB GRUSBHC controller 2011-05-06 18:24:02 -07:00
Makefile
octeon2-common.c usb: Configure octeon2 glue logic for proper uSOF cycle period. 2011-05-03 10:09:32 -07:00
ohci-at91.c
ohci-ath79.c USB: ohci: add bus glue for the Atheros AR71XX/AR7240 SoCs 2011-04-13 16:58:19 -07:00
ohci-au1xxx.c USB: ohci-au1xxx: fix warning "__BIG_ENDIAN" is not defined 2011-04-13 15:44:03 -07:00
ohci-cns3xxx.c
ohci-da8xx.c
ohci-dbg.c
ohci-ep93xx.c
ohci-hcd.c USB: ohci: add bus glue for the Atheros AR71XX/AR7240 SoCs 2011-04-13 16:58:19 -07:00
ohci-hub.c USB 3.0 Hub Changes 2011-03-13 18:07:11 -07:00
ohci-jz4740.c
ohci-mem.c
ohci-octeon.c
ohci-omap3.c usb: host: omap: ehci and ohci simplification 2011-03-01 17:02:49 +02:00
ohci-omap.c
ohci-pci.c USB: OHCI: use pci_dev->revision 2011-03-07 12:15:21 -08:00
ohci-pnx4008.c
ohci-pnx8550.c
ohci-ppc-of.c dt/usb: Eliminate users of of_platform_{,un}register_driver 2011-02-28 13:22:45 -07:00
ohci-ppc-soc.c
ohci-ps3.c
ohci-pxa27x.c
ohci-q.c USB host: Move AMD PLL quirk to pci-quirks.c 2011-03-01 16:01:45 -05:00
ohci-s3c2410.c USB: ohci-s3c2410: return proper error if clk_get fails 2011-05-06 18:16:40 -07:00
ohci-sa1111.c
ohci-sh.c
ohci-sm501.c
ohci-spear.c
ohci-ssb.c
ohci-tmio.c tmio: Silence warnings introduced by mfd changes 2011-03-23 10:42:01 +01:00
ohci.h Merge branch 'remove' of master.kernel.org:/home/rmk/linux-2.6-arm 2011-03-16 19:05:40 -07:00
oxu210hp-hcd.c Fix common misspellings 2011-03-31 11:26:23 -03:00
oxu210hp.h
pci-quirks.c USB host: Fix lockdep warning in AMD PLL quirk 2011-04-13 15:44:04 -07:00
pci-quirks.h USB host: Move AMD PLL quirk to pci-quirks.c 2011-03-01 16:01:45 -05:00
r8a66597-hcd.c USB 3.0 Hub Changes 2011-03-13 18:07:11 -07:00
r8a66597.h
sl811_cs.c
sl811-hcd.c USB: sl811: add Kconfig option for ISOCHRONOUS mode 2011-04-13 16:26:12 -07:00
sl811.h
u132-hcd.c usb: u132-hcd: Drop __TIME__ usage 2011-04-13 16:36:06 -07:00
uhci-debug.c USB: UHCI: Wrap I/O register accesses 2011-05-06 18:24:01 -07:00
uhci-grlib.c USB: UHCI: Add support for GRLIB GRUSBHC controller 2011-05-06 18:24:02 -07:00
uhci-hcd.c USB: UHCI: Add support for GRLIB GRUSBHC controller 2011-05-06 18:24:02 -07:00
uhci-hcd.h USB: UHCI: Support non-PCI host controllers 2011-05-06 18:24:01 -07:00
uhci-hub.c USB: UHCI: Wrap I/O register accesses 2011-05-06 18:24:01 -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
xhci-dbg.c xhci: Make xHCI driver endian-safe 2011-05-02 16:42:49 -07:00
xhci-ext-caps.h xHCI: prolong host controller halt time limit 2011-03-13 18:07:09 -07:00
xhci-hub.c Merge branch 2.6.39-rc7 into usb-linus 2011-05-10 13:30:45 -07:00
xhci-mem.c xHCI 1.0: Isoch endpoint CErr field set 2011-05-09 09:34:47 -07:00
xhci-pci.c xhci-hcd: Include <linux/slab.h> in xhci-pci.c 2011-04-29 17:33:12 -07:00
xhci-ring.c xhci: Fix bug in control transfer cancellation. 2011-05-11 16:17:59 -07:00
xhci.c xHCI 1.0: Max Exit Latency Too Large Error 2011-05-09 09:34:48 -07:00
xhci.h xHCI 1.0: Max Exit Latency Too Large Error 2011-05-09 09:34:48 -07:00