• G
    xhci: fix usb3 streams · 15341303
    Gerd Hoffmann 提交于
    xhci maintains a radix tree for each stream endpoint because it must
    be able to map a trb address to the stream ring.  Each ring segment
    must be added to the ring for this to work.  Currently xhci sticks
    only the first segment of each stream ring into the radix tree.
    
    Result is that things work initially, but as soon as the first segment
    is full xhci can't map the trb address from the completion event to the
    stream ring any more -> BOOM.  You'll find this message in the logs:
    
      ERROR Transfer event for disabled endpoint or incorrect stream ring
    
    This patch adds a helper function to update the radix tree, and a
    function to remove ring segments from the tree.  Both functions loop
    over the segment list and handles all segments instead of just the
    first.
    
    [Note: Sarah changed this patch to add radix_tree_maybe_preload() and
    radix_tree_preload_end() calls around the radix tree insert, since we
    can now insert entries in interrupt context.  There are now two helper
    functions to make the code cleaner, and those functions are moved to
    make them static.]
    Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
    Signed-off-by: NHans de Goede <hdegoede@redhat.com>
    Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
    15341303
xhci-mem.c 73.8 KB