• Andiry Xu's avatar
    USB: xHCI: Isochronous transfer implementation · 04e51901
    Andiry Xu authored
    This patch implements isochronous urb enqueue and interrupt handler part.
    
    When an isochronous urb is passed to xHCI driver, first check the transfer
    ring to guarantee there is enough room for the whole urb. Then update the
    start_frame and interval field of the urb. Always assume URB_ISO_ASAP
    is set, and never use urb->start_frame as input.
    
    The number of isoc TDs is equal to urb->number_of_packets. One isoc TD is
    consumed every Interval. Each isoc TD consists of an Isoch TRB chained to
    zero or more Normal TRBs.
    
    Call prepare_transfer for each TD to do initialization; then calculate the
    number of TRBs needed for each TD. If the data required by an isoc TD is
    physically contiguous (not crosses a page boundary), then only one isoc TRB
    is needed; otherwise one or more additional normal TRB shall be chained to
    the isoc TRB by the host.
    
    Set TRB_IOC to the last TRB of each isoc TD. Do not ring endpoint doorbell
    to start xHC procession until all the TDs are inserted to the endpoint
    transer ring.
    
    In irq handler, update urb status and actual_length, increase
    urb_priv->td_cnt. When all the TDs are completed(td_cnt is equal to
    urb_priv->length), giveback the urb to usbcore.
    Signed-off-by: default avatarAndiry Xu <andiry.xu@amd.com>
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    04e51901
xhci-ring.c 93 KB