diff options
author | Oliver Neukum <oneukum@suse.de> | 2007-05-07 13:16:58 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-12 16:29:51 -0700 |
commit | 39892da44b21b5362eb848ca424d73a25ccc488f (patch) | |
tree | 856b5d2309633a29784b345cbd1dc7a1cd3d9afb | |
parent | b308e74d9c708ee2a9af14fbe235e0a41216f4ed (diff) | |
download | linux-39892da44b21b5362eb848ca424d73a25ccc488f.tar.bz2 |
USB: Digi AccelePort adapted to new tty buffering
this fixes the flushing trouble due to its own buffering for this driver.
Signed-off-by: Oliver Neukum <oneukum@suse.de>
Cc: Al Borchers <alborchers@steinerpoint.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/usb/serial/digi_acceleport.c | 52 |
1 files changed, 13 insertions, 39 deletions
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index d78692c01cfa..9ffd99aded53 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -930,23 +930,17 @@ static void digi_rx_unthrottle( struct usb_serial_port *port ) { int ret = 0; - int len; unsigned long flags; struct digi_port *priv = usb_get_serial_port_data(port); - struct tty_struct *tty = port->tty; - dbg( "digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num ); spin_lock_irqsave( &priv->dp_port_lock, flags ); - /* send any buffered chars from throttle time on to tty subsystem */ - - len = tty_buffer_request_room(tty, priv->dp_in_buf_len); - if( len > 0 ) { - tty_insert_flip_string_flags(tty, priv->dp_in_buf, priv->dp_in_flag_buf, len); - tty_flip_buffer_push( tty ); - } + /* turn throttle off */ + priv->dp_throttled = 0; + priv->dp_in_buf_len = 0; + priv->dp_throttle_restart = 0; /* restart read chain */ if( priv->dp_throttle_restart ) { @@ -954,11 +948,6 @@ dbg( "digi_rx_unthrottle: TOP: port=%d", priv->dp_port_num ); ret = usb_submit_urb( port->read_urb, GFP_ATOMIC ); } - /* turn throttle off */ - priv->dp_throttled = 0; - priv->dp_in_buf_len = 0; - priv->dp_throttle_restart = 0; - spin_unlock_irqrestore( &priv->dp_port_lock, flags ); if( ret ) { @@ -1864,31 +1853,16 @@ static int digi_read_inb_callback( struct urb *urb ) /* data length is len-1 (one byte of len is status) */ --len; - if( throttled ) { - - len = min( len, - DIGI_IN_BUF_SIZE - priv->dp_in_buf_len ); - - if( len > 0 ) { - memcpy( priv->dp_in_buf + priv->dp_in_buf_len, - data, len ); - memset( priv->dp_in_flag_buf - + priv->dp_in_buf_len, flag, len ); - priv->dp_in_buf_len += len; - } - - } else { - len = tty_buffer_request_room(tty, len); - if( len > 0 ) { - /* Hot path */ - if(flag == TTY_NORMAL) - tty_insert_flip_string(tty, data, len); - else { - for(i = 0; i < len; i++) - tty_insert_flip_char(tty, data[i], flag); - } - tty_flip_buffer_push( tty ); + len = tty_buffer_request_room(tty, len); + if( len > 0 ) { + /* Hot path */ + if(flag == TTY_NORMAL) + tty_insert_flip_string(tty, data, len); + else { + for(i = 0; i < len; i++) + tty_insert_flip_char(tty, data[i], flag); } + tty_flip_buffer_push( tty ); } } |