lkml.org 
[lkml]   [2011]   [Nov]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[38/53] USB: Fix Corruption issue in USB ftdi driver ftdi_sio.c
    3.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andrew Worsley <amworsley@gmail.com>

    commit b1ffb4c851f185e9051ba837c16d9b84ef688d26 upstream.

    Fix for ftdi_set_termios() glitching output

    ftdi_set_termios() is constantly setting the baud rate, data bits and parity
    unnecessarily on every call, . When called while characters are being
    transmitted can cause the FTDI chip to corrupt the serial port bit stream
    output by stalling the output half a bit during the output of a character.
    Simple fix by skipping this setting if the baud rate/data bits/parity are
    unchanged.

    Signed-off-by: Andrew Worsley <amworsley@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/usb/serial/ftdi_sio.c | 14 +++++++++++---
    1 file changed, 11 insertions(+), 3 deletions(-)

    --- a/drivers/usb/serial/ftdi_sio.c
    +++ b/drivers/usb/serial/ftdi_sio.c
    @@ -2080,13 +2080,19 @@ static void ftdi_set_termios(struct tty_

    cflag = termios->c_cflag;

    - /* FIXME -For this cut I don't care if the line is really changing or
    - not - so just do the change regardless - should be able to
    - compare old_termios and tty->termios */
    + if (old_termios->c_cflag == termios->c_cflag
    + && old_termios->c_ispeed == termios->c_ispeed
    + && old_termios->c_ospeed == termios->c_ospeed)
    + goto no_c_cflag_changes;
    +
    /* NOTE These routines can get interrupted by
    ftdi_sio_read_bulk_callback - need to examine what this means -
    don't see any problems yet */

    + if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
    + (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
    + goto no_data_parity_stop_changes;
    +
    /* Set number of data bits, parity, stop bits */

    urb_value = 0;
    @@ -2127,6 +2133,7 @@ static void ftdi_set_termios(struct tty_
    }

    /* Now do the baudrate */
    +no_data_parity_stop_changes:
    if ((cflag & CBAUD) == B0) {
    /* Disable flow control */
    if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
    @@ -2154,6 +2161,7 @@ static void ftdi_set_termios(struct tty_

    /* Set flow control */
    /* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
    +no_c_cflag_changes:
    if (cflag & CRTSCTS) {
    dbg("%s Setting to CRTSCTS flow control", __func__);
    if (usb_control_msg(dev,



    \
     
     \ /
      Last update: 2011-11-23 02:07    [W:0.022 / U:31.456 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site