lkml.org 
[lkml]   [2007]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [SOLVED] Serial buffer corruption [was Re: FTDI usb-serial possible bug]
    Date
    Am Samstag, 5. Mai 2007 20:08 schrieb Antonino Ingargiola:
    > Now I don't want to abuse your kindness, but I (personally) would be
    > *really* interested in a similar fix for the FTDI usb-serial driver,
    > because many measurements I do use an FTDI device.

    Does this work?

    Regards
    Oliver
    ----

    --- a/drivers/usb/serial/ftdi_sio.c 2007-05-05 20:21:41.000000000 +0200
    +++ b/drivers/usb/serial/ftdi_sio.c 2007-05-05 20:27:09.000000000 +0200
    @@ -1749,10 +1749,6 @@ static void ftdi_process_read (struct wo
    length = 0;
    }

    - if (priv->rx_flags & THROTTLED) {
    - dbg("%s - throttled", __FUNCTION__);
    - break;
    - }
    if (tty_buffer_request_room(tty, length) < length) {
    /* break out & wait for throttling/unthrottling to happen */
    dbg("%s - receive room low", __FUNCTION__);
    @@ -1825,16 +1821,6 @@ static void ftdi_process_read (struct wo
    dbg("%s - incomplete, %d bytes processed, %d remain",
    __FUNCTION__, packet_offset,
    urb->actual_length - packet_offset);
    - /* check if we were throttled while processing */
    - spin_lock_irqsave(&priv->rx_lock, flags);
    - if (priv->rx_flags & THROTTLED) {
    - priv->rx_flags |= ACTUALLY_THROTTLED;
    - spin_unlock_irqrestore(&priv->rx_lock, flags);
    - dbg("%s - deferring remainder until unthrottled",
    - __FUNCTION__);
    - return;
    - }
    - spin_unlock_irqrestore(&priv->rx_lock, flags);
    /* if the port is closed stop trying to read */
    if (port->open_count > 0){
    /* delay processing of remainder */
    @@ -1856,9 +1842,15 @@ static void ftdi_process_read (struct wo
    port->read_urb->transfer_buffer, port->read_urb->transfer_buffer_length,
    ftdi_read_bulk_callback, port);

    - result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
    - if (result)
    - err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
    + spin_lock_irqsave(&priv->rx_lock, flags);
    + if (priv->rx_flags & THROTTLED) {
    + priv->rx_flags |= ACTUALLY_THROTTLED;
    + } else {
    + result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
    + if (result)
    + err("%s - failed resubmitting read urb, error %d", __FUNCTION__, result);
    + }
    + spin_unlock_irqrestore(&priv->rx_lock, flags);
    }

    return;
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2007-05-05 20:39    [W:3.127 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site