• Ian Abbott's avatar
    [PATCH] USB: ftdi_sio: avoid losing received data in tty-ldisc · 76854cea
    Ian Abbott authored
    ftdi_sio: Avoid losing bytes at tty-ldisc.
    
    This patch was originally developed by Daniel Smertnig.  I
    (Ian Abbott) made a few changes.  It has been tested by both
    Daniel and I, at least for raw, non-canonical receive data
    processing.
    
    Here is Daniel's original description of the patch:
    
    ===
    During a project in which I was using a FTDI 232BM to
    transmit data at relative high speeds (625kBit/s), I
    noticed a problem where data was lost even if flow
    control was enabled: The FTDI-Driver receives 512 Bytes
    of data over USB at a time, which consists of 8 64-Byte
    packets. Subtracting the 2 bytes of status information
    included in each packet this gives 496 "real" data
    bytes per read.
    
    This data is passed (indirectly, via the flip buffers)
    to the tty line discipline which takes care of
    throttling when there the free buffer space reaches
    TTY_THRESHOLD_THROTTLE (128). Because the FTDI driver
    processes up to 496 bytes at a time, throttling won't
    happen in time and the line discipline will discard the
    remaining bytes.
    
    To avoid this the patch passes data in 62-byte blocks
    to the tty layer and checks the available space in the
    ldisc-buffers. If there isn't enough free space,
    processing the rest of the data is delayed using a
    workqueue.
    
    Note: The original problem should be easily
    reproducible with a userspace program which does slow &
    small reads.
    ===
    Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
    Signed-off-by: default avatarDaniel Smertnig <daniel.smertnig@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    76854cea
ftdi_sio.c 87.1 KB