Commit b308e74d authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman

USB: visor driver adapted to new tty buffering

the new tty buffering code allows usb drivers to stop private buffering.
In fact we must do so to allow flushing to work correctly. This does so
for the visor driver.
Signed-off-by: default avatarOliver Neukum <oneukum@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a5262dcf
...@@ -273,7 +273,8 @@ struct visor_private { ...@@ -273,7 +273,8 @@ struct visor_private {
int bytes_in; int bytes_in;
int bytes_out; int bytes_out;
int outstanding_urbs; int outstanding_urbs;
int throttled; unsigned char throttled;
unsigned char actually_throttled;
}; };
/* number of outstanding urbs to prevent userspace DoS from happening */ /* number of outstanding urbs to prevent userspace DoS from happening */
...@@ -509,9 +510,8 @@ static void visor_read_bulk_callback (struct urb *urb) ...@@ -509,9 +510,8 @@ static void visor_read_bulk_callback (struct urb *urb)
struct visor_private *priv = usb_get_serial_port_data(port); struct visor_private *priv = usb_get_serial_port_data(port);
unsigned char *data = urb->transfer_buffer; unsigned char *data = urb->transfer_buffer;
struct tty_struct *tty; struct tty_struct *tty;
unsigned long flags;
int throttled;
int result; int result;
int available_room;
dbg("%s - port %d", __FUNCTION__, port->number); dbg("%s - port %d", __FUNCTION__, port->number);
...@@ -524,17 +524,20 @@ static void visor_read_bulk_callback (struct urb *urb) ...@@ -524,17 +524,20 @@ static void visor_read_bulk_callback (struct urb *urb)
tty = port->tty; tty = port->tty;
if (tty && urb->actual_length) { if (tty && urb->actual_length) {
tty_buffer_request_room(tty, urb->actual_length); available_room = tty_buffer_request_room(tty, urb->actual_length);
tty_insert_flip_string(tty, data, urb->actual_length); if (available_room) {
tty_insert_flip_string(tty, data, available_room);
tty_flip_buffer_push(tty); tty_flip_buffer_push(tty);
} }
spin_lock_irqsave(&priv->lock, flags); spin_lock(&priv->lock);
priv->bytes_in += urb->actual_length; priv->bytes_in += available_room;
throttled = priv->throttled;
spin_unlock_irqrestore(&priv->lock, flags); } else {
spin_lock(&priv->lock);
}
/* Continue trying to always read if we should */ /* Continue trying to always read if we should */
if (!throttled) { if (!priv->throttled) {
usb_fill_bulk_urb (port->read_urb, port->serial->dev, usb_fill_bulk_urb (port->read_urb, port->serial->dev,
usb_rcvbulkpipe(port->serial->dev, usb_rcvbulkpipe(port->serial->dev,
port->bulk_in_endpointAddress), port->bulk_in_endpointAddress),
...@@ -544,8 +547,10 @@ static void visor_read_bulk_callback (struct urb *urb) ...@@ -544,8 +547,10 @@ static void visor_read_bulk_callback (struct urb *urb)
result = usb_submit_urb(port->read_urb, GFP_ATOMIC); result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
if (result) if (result)
dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); dev_err(&port->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result);
} else {
priv->actually_throttled = 1;
} }
return; spin_unlock(&priv->lock);
} }
static void visor_read_int_callback (struct urb *urb) static void visor_read_int_callback (struct urb *urb)
...@@ -608,6 +613,7 @@ static void visor_unthrottle (struct usb_serial_port *port) ...@@ -608,6 +613,7 @@ static void visor_unthrottle (struct usb_serial_port *port)
dbg("%s - port %d", __FUNCTION__, port->number); dbg("%s - port %d", __FUNCTION__, port->number);
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
priv->throttled = 0; priv->throttled = 0;
priv->actually_throttled = 0;
spin_unlock_irqrestore(&priv->lock, flags); spin_unlock_irqrestore(&priv->lock, flags);
port->read_urb->dev = port->serial->dev; port->read_urb->dev = port->serial->dev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment