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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to