usb: xhci: hold lock over xhci_abort_cmd_ring()
authorLu Baolu <baolu.lu@linux.intel.com>
Tue, 3 Jan 2017 16:28:49 +0000 (18:28 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2017 10:39:12 +0000 (11:39 +0100)
commitcb02cce9a7f8eea6f6c8432f296074d20829ff0f
tree35dbd0e1b64d05ffb55b1c549ff6ae87b9037ddc
parent9e6c400bb58220c46a2e5e616a1fbf756f011489
usb: xhci: hold lock over xhci_abort_cmd_ring()

commit 4dea70778c0f48b4385c7720c363ec8d37a401b4 upstream.

In command timer function, xhci_handle_command_timeout(), xhci->lock
is unlocked before call into xhci_abort_cmd_ring(). This might cause
race between the timer function and the event handler.

The xhci_abort_cmd_ring() function sets the CMD_RING_ABORT bit in the
command register and polling it until the setting takes effect. A stop
command ring event might be handled between writing the abort bit and
polling for it. The event handler will restart the command ring, which
causes the failure of polling, and we ever believed that we failed to
stop it.

As a bonus, this also fixes some issues of calling functions without
locking in xhci_handle_command_timeout().

Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-ring.c