• Nicolas Cavallari's avatar
    Bluetooth: Work around SCO over USB HCI design defect · b3fdb8c9
    Nicolas Cavallari authored
    The USB interface between the host and the bluetooth adapter used for
    SCO packets uses an USB isochronous endpoint with a fragmentation scheme
    that does not tolerate errors.  Except USB isochronous transfers do
    not provide a reliable stream with guaranteed delivery. (There is no
    retry on error, see USB spec v2.0 5.6 and 8.5.5.)
    
    To fragment a packet, the bluetooth HCI simply splits it in parts and
    transfer them as-is.  The receiver is expected to reconstruct the packet
    by assuming the first fragment contains the header and parsing its size
    field.  There is no error detection either.
    
    If a fragment is lost, the end result is that the kernel is no longer
    synchronized and will pass malformed data to the upper layers, since it
    has no way to tell if the first fragment is an actual first fragment or
    a continuation fragment.  Resynchronization can only happen by luck and
    requires an unbounded amount of time.
    
    The typical symptom for a HSP/HFP bluetooth headset is that the
    microphone stops working and dmesg contains piles of rate-limited
    "Bluetooth: hci0: SCO packet for unknown connection handle XXXX"
    errors for an indeterminate amount of time, until the kernel accidentally
    resynchronize.
    
    A workaround is to ask the upper layer to prevalidate the first fragment
    header.  This is not possible with user channels so this workaround is
    disabled in this case.
    
    This problem is the most severe when using an ath3k adapter on an i.MX 6
    board, where packet loss occur regularly, possibly because it is an USB1
    device connected on an USB2 hub and this is a special case requiring
    split transactions.
    Signed-off-by: default avatarNicolas Cavallari <nicolas.cavallari@green-communications.fr>
    Signed-off-by: default avatarLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
    b3fdb8c9
btusb.c 114 KB