• Sarah Sharp's avatar
    xhci: Handle zero-length isochronous packets. · 48df4a6f
    Sarah Sharp authored
    For a long time, the xHCI driver has had this note:
    	/* FIXME: Ignoring zero-length packets, can those happen? */
    
    It turns out that, yes, there are drivers that need to queue zero-length
    transfers for isochronous OUT transfers.  Without this patch, users will
    see kernel hang messages when a driver attempts to enqueue an isochronous
    URB with a zero length transfer (because count_isoc_trbs_needed will return
    zero for that TD, xhci_td->last_trb will never be set, and updating the
    dequeue pointer will cause an infinite loop).
    
    Matěj ran into this issue when using an NI Audio4DJ USB soundcard
    with the snd-usb-caiaq driver.  See
    	https://bugzilla.kernel.org/show_bug.cgi?id=40702
    
    Fix count_isoc_trbs_needed() to return 1 for zero-length transfers (thanks
    Alan on the math help).  Update the various TRB field calculations to deal
    with zero-length transfers.  We're still transferring one packet with a
    zero-length data payload, so the total_packet_count should be 1. The
    Transfer Burst Count (TBC) and Transfer Last Burst Packet Count (TLBPC)
    fields should be set to zero.
    
    This patch should be backported to kernels as old as 2.6.36.
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Tested-by: default avatarMatěj Laitl <matej@laitl.cz>
    Cc: Daniel Mack <zonque@gmail.com>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: stable@kernel.org
    48df4a6f
xhci-ring.c 111 KB