summaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/sierra.c
diff options
context:
space:
mode:
authorJohan Hovold <jhovold@gmail.com>2014-05-26 19:22:55 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-05-27 15:04:03 -0700
commit93670599fc52217dcf8a69832faf66171cdb9581 (patch)
treea4d6bdabf69318a4b4c2e29a4ad2d712f6ff9fd7 /drivers/usb/serial/sierra.c
parent80cc0fcbdaeaf10d04ba27779a2d7ceb73d2717a (diff)
downloadlinux-93670599fc52217dcf8a69832faf66171cdb9581.tar.gz
linux-93670599fc52217dcf8a69832faf66171cdb9581.tar.bz2
linux-93670599fc52217dcf8a69832faf66171cdb9581.zip
USB: sierra: fix characters being dropped at close
Fix characters potentially being dropped at close due to missing chars_in_buffer implementation. Note that currently the write urbs are not even killed at close (will be fixed separately), but this could still lead to dropped data since we have lowered DTR/RTS. Signed-off-by: Johan Hovold <jhovold@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/serial/sierra.c')
-rw-r--r--drivers/usb/serial/sierra.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index 37480348e39b..ed43b18ace78 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -675,6 +675,23 @@ static int sierra_write_room(struct tty_struct *tty)
return 2048;
}
+static int sierra_chars_in_buffer(struct tty_struct *tty)
+{
+ struct usb_serial_port *port = tty->driver_data;
+ struct sierra_port_private *portdata = usb_get_serial_port_data(port);
+ unsigned long flags;
+ int chars;
+
+ /* NOTE: This overcounts somewhat. */
+ spin_lock_irqsave(&portdata->lock, flags);
+ chars = portdata->outstanding_urbs * MAX_TRANSFER;
+ spin_unlock_irqrestore(&portdata->lock, flags);
+
+ dev_dbg(&port->dev, "%s - %d\n", __func__, chars);
+
+ return chars;
+}
+
static void sierra_stop_rx_urbs(struct usb_serial_port *port)
{
int i;
@@ -1060,6 +1077,7 @@ static struct usb_serial_driver sierra_device = {
.dtr_rts = sierra_dtr_rts,
.write = sierra_write,
.write_room = sierra_write_room,
+ .chars_in_buffer = sierra_chars_in_buffer,
.set_termios = sierra_set_termios,
.tiocmget = sierra_tiocmget,
.tiocmset = sierra_tiocmset,