[PATCH 10/10] USB: ftdi_sio: use ftdi_get_modem_status in chars_in_buffer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Use ftdi_get_modem_status to check hardware buffers in chars_in_buffer.

Signed-off-by: Johan Hovold <jhovold@xxxxxxxxx>
---
 drivers/usb/serial/ftdi_sio.c | 52 +++++++++----------------------------------
 1 file changed, 11 insertions(+), 41 deletions(-)

diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index b8bc9d0..8c3379b 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;
 }
 
-- 
1.7.12.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux