]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commit
xhci: Fix handling timeouted commands on hosts in weird states.
authorMathias Nyman <mathias.nyman@linux.intel.com>
Wed, 1 Jun 2016 15:09:08 +0000 (18:09 +0300)
committerKamal Mostafa <kamal@canonical.com>
Wed, 13 Jul 2016 15:59:59 +0000 (08:59 -0700)
commitb15691d829f732f899d1c3c6a852ca8465548932
treef4e22350980eeb4568a68004efa19aa23330176a
parentc9dda8bfa4de4a51580e508fdfaa4699eb992869
xhci: Fix handling timeouted commands on hosts in weird states.

BugLink: http://bugs.launchpad.net/bugs/1601952
commit 3425aa03f484d45dc21e0e791c2f6c74ea656421 upstream.

If commands timeout we mark them for abortion, then stop the command
ring, and turn the commands to no-ops and finally restart the command
ring.

If the host is working properly the no-op commands will finish and
pending completions are called.
If we notice the host is failing, driver clears the command ring and
completes, deletes and frees all pending commands.

There are two separate cases reported where host is believed to work
properly but is not. In the first case we successfully stop the ring
but no abort or stop command ring event is ever sent and host locks up.

The second case is if a host is removed, command times out and driver
believes the ring is stopped, and assumes it will be restarted, but
actually ends up timing out on the same command forever.
If one of the pending commands has the xhci->mutex held it will block
xhci_stop() in the remove codepath which otherwise would cleanup pending
commands.

Add a check that clears all pending commands in case host is removed,
or we are stuck timing out on the same command. Also restart the
command timeout timer when stopping the command ring to ensure we
recive an ring stop/abort event.

Tested-by: Joe Lawrence <joe.lawrence@stratus.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
drivers/usb/host/xhci-ring.c