• Paul Zimmerman's avatar
    xhci: Fix reset-device and configure-endpoint commands · 7a3783ef
    Paul Zimmerman authored
    We have been having problems with the USB-IF Gold Tree tests when plugging
    and unplugging devices from the tree. I have seen that the reset-device
    and configure-endpoint commands, which are invoked from
    xhci_discover_or_reset_device() and xhci_configure_endpoint(), will sometimes
    time out.
    
    After much debugging, I determined that the commands themselves do not actually
    time out, but rather their completion events do not get delivered to the right
    place.
    
    This happens when the command ring has just wrapped around, and it's enqueue
    pointer is left pointing to the link TRB. xhci_discover_or_reset_device() and
    xhci_configure_endpoint() use the enqueue pointer directly as their command
    TRB pointer, without checking whether it's pointing to the link TRB.
    
    When the completion event arrives, if the command TRB is pointing to the link
    TRB, the check against the command ring dequeue pointer in
    handle_cmd_in_cmd_wait_list() fails, so the completion inside the command does
    not get signaled.
    
    The patch below fixes the timeout problem for me.
    
    This should be queued for the 2.6.35 and 2.6.36 stable trees.
    Signed-off-by: default avatarPaul Zimmerman <paulz@synopsys.com>
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Cc: stable@kernel.org
    7a3783ef
xhci.c 82.7 KB