From oneukum@suse.de Mon May 7 04:17:03 2007 From: Oliver Neukum Date: Mon, 7 May 2007 13:16:58 +0200 Subject: USB: Digi AccelePort adapted to new tty buffering To: , borchers@steinerpoint.com, "Greg Kroah-Hartman" , linux-usb-devel@lists.sourceforge.net Message-ID: <200705071316.59700.oneukum@suse.de> Content-Disposition: inline this fixes the flushing trouble due to its own buffering for this driver. Signed-off-by: Oliver Neukum Cc: Al Borchers Signed-off-by: Greg Kroah-Hartman --- drivers/usb/serial/digi_acceleport.c | 52 ++++++++--------------------------- 1 file changed, 13 insertions(+), 39 deletions(-) --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -930,23 +930,17 @@ static void digi_rx_unthrottle( struct u { 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", 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( struc /* 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 ); } }