summary refs log tree commit diff
path: root/drivers/usb
diff options
context:
space:
mode:
authorJohan Hovold <jhovold@gmail.com>2012-10-29 10:56:28 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-10-30 13:19:32 -0700
commit5fb0432e64335bcf3f620e2d86a97fba0437c84b (patch)
treea5ad7d01729bf474289e273b603c983c0b07c247 /drivers/usb
parent8da636d9b5f3af354458f5b7eadaf51f23017fdc (diff)
downloadlinux-5fb0432e64335bcf3f620e2d86a97fba0437c84b.tar.gz
USB: ftdi_sio: use ftdi_get_modem_status in chars_in_buffer
Use ftdi_get_modem_status to check hardware buffers in chars_in_buffer.

Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/serial/ftdi_sio.c52
1 files changed, 11 insertions, 41 deletions
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index b8bc9d0cb127..8c3379b52f24 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -923,6 +923,8 @@ static int  ftdi_ioctl(struct tty_struct *tty,
 			unsigned int cmd, unsigned long arg);
 static void ftdi_break_ctl(struct tty_struct *tty, int break_state);
 static int ftdi_chars_in_buffer(struct tty_struct *tty);
+static int ftdi_get_modem_status(struct tty_struct *tty,
+						unsigned char status[2]);
 
 static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base);
 static unsigned short int ftdi_232am_baud_to_divisor(int baud);
@@ -2092,55 +2094,23 @@ static void ftdi_break_ctl(struct tty_struct *tty, int break_state)
 static int ftdi_chars_in_buffer(struct tty_struct *tty)
 {
 	struct usb_serial_port *port = tty->driver_data;
-	struct ftdi_private *priv = usb_get_serial_port_data(port);
 	int chars;
-	unsigned char *buf;
+	unsigned char buf[2];
 	int ret;
 
 	chars = usb_serial_generic_chars_in_buffer(tty);
 	if (chars)
-		return chars;
-
-	/* Check hardware buffer */
-	switch (priv->chip_type) {
-	case FT8U232AM:
-	case FT232BM:
-	case FT2232C:
-	case FT232RL:
-	case FT2232H:
-	case FT4232H:
-	case FT232H:
-	case FTX:
-		break;
-	case SIO:
-	default:
-		return chars;
-	}
-
-	buf = kmalloc(2, GFP_KERNEL);
-	if (!buf) {
-		dev_err(&port->dev, "kmalloc failed");
-		return chars;
-	}
+		goto out;
 
-	ret = usb_control_msg(port->serial->dev,
-				usb_rcvctrlpipe(port->serial->dev, 0),
-				FTDI_SIO_GET_MODEM_STATUS_REQUEST,
-				FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE,
-				0, priv->interface,
-				buf, 2, WDR_TIMEOUT);
-
-	if (ret < 2) {
-		dev_err(&port->dev, "Unable to read modem and line status: "
-			"%i\n", ret);
-		goto chars_in_buffer_out;
+	/* Check if hardware buffer is empty. */
+	ret = ftdi_get_modem_status(tty, buf);
+	if (ret == 2) {
+		if (!(buf[1] & FTDI_RS_TEMT))
+			chars = 1;
 	}
+out:
+	dev_dbg(&port->dev, "%s - %d\n", __func__, chars);
 
-	if (!(buf[1] & FTDI_RS_TEMT))
-		chars++;
-
-chars_in_buffer_out:
-	kfree(buf);
 	return chars;
 }