• Sarah Sharp's avatar
    USB: xhci: Handle stalled control endpoints. · a38ea35f
    Sarah Sharp authored
    When a control endpoint stalls, the next control transfer will clear the
    stall.  The USB core doesn't call down to the host controller driver's
    endpoint_reset() method when control endpoints stall, so the xHCI driver
    has to do all its stall handling for internal state in its interrupt handler.
    
    When the host stalls on a control endpoint, it may stop on the data phase
    or status phase of the control transfer.  Like other stalled endpoints,
    the xHCI driver needs to queue a Reset Endpoint command and move the
    hardware's control endpoint ring dequeue pointer past the failed control
    transfer (with a Set TR Dequeue Pointer or a Configure Endpoint command).
    
    Since the USB core doesn't call usb_hcd_reset_endpoint() for control
    endpoints, we need to do this in interrupt context when we get notified of
    the stalled transfer.  URBs may be queued to the hardware before these two
    commands complete.  The endpoint queue will be restarted once both
    commands complete.
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    a38ea35f
xhci-hcd.c 48.3 KB