• Mathias Nyman's avatar
    xhci: Fix handling timeouted commands on hosts in weird states. · b15691d8
    Mathias Nyman authored
    BugLink: http://bugs.launchpad.net/bugs/1601952
    
    commit 3425aa03 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: default avatarJoe Lawrence <joe.lawrence@stratus.com>
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarTim Gardner <tim.gardner@canonical.com>
    Signed-off-by: default avatarKamal Mostafa <kamal@canonical.com>
    b15691d8
xhci-ring.c 129 KB