• Sarah Sharp's avatar
    USB: xhci: URB cancellation support. · ae636747
    Sarah Sharp authored
    Add URB cancellation support to the xHCI host controller driver.  This
    currently supports cancellation for endpoints that do not have streams
    enabled.
    
    An URB is represented by a number of Transaction Request Buffers (TRBs),
    that are chained together to make one (or more) Transaction Descriptors
    (TDs) on an endpoint ring.  The ring is comprised of contiguous segments,
    linked together with Link TRBs (which may or may not be chained into a TD).
    
    To cancel an URB, we must stop the endpoint ring, make the hardware skip
    over the TDs in the URB (either by turning them into No-op TDs, or by
    moving the hardware's ring dequeue pointer past the last TRB in the last
    TD), and then restart the ring.
    
    There are times when we must drop the xHCI lock during this process, like
    when we need to complete cancelled URBs.  We must ensure that additional
    URBs can be marked as cancelled, and that new URBs can be enqueued (since
    the URB completion handlers can do either).  The new endpoint ring
    variables cancels_pending and state (which can only be modified while
    holding the xHCI lock) ensure that future cancellation and enqueueing do
    not interrupt any pending cancellation code.
    
    To facilitate cancellation, we must keep track of the starting ring
    segment, first TRB, and last TRB for each URB.  We also need to keep track
    of the list of TDs that have been marked as cancelled, separate from the
    list of TDs that are queued for this endpoint.  The new variables and
    cancellation list are stored in the xhci_td structure.
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    ae636747
xhci-hcd.c 38.7 KB