[PATCH 24/49] tty: Make tiocgicount a handler

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Greg Kroah-Hartman
Date: Friday, October 22, 2010 - 11:21 am

From: Alan Cox <alan@linux.intel.com>

Dan Rosenberg noted that various drivers return the struct with uncleared
fields. Instead of spending forever trying to stomp all the drivers that
get it wrong (and every new driver) do the job in one place.

This first patch adds the needed operations and hooks them up, including
the needed USB midlayer and serial core plumbing.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 drivers/char/tty_io.c           |   21 +++++++++++++++++++++
 drivers/serial/serial_core.c    |   37 +++++++++++++++++--------------------
 drivers/usb/serial/usb-serial.c |   13 +++++++++++++
 include/linux/tty_driver.h      |    9 +++++++++
 include/linux/usb/serial.h      |    2 ++
 5 files changed, 62 insertions(+), 20 deletions(-)

diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index e185db3..c05c5af 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -96,6 +96,7 @@
 #include <linux/bitops.h>
 #include <linux/delay.h>
 #include <linux/seq_file.h>
+#include <linux/serial.h>
 
 #include <linux/uaccess.h>
 #include <asm/system.h>
@@ -2511,6 +2512,20 @@ static int tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int
 	return tty->ops->tiocmset(tty, file, set, clear);
 }
 
+static int tty_tiocgicount(struct tty_struct *tty, void __user *arg)
+{
+	int retval = -EINVAL;
+	struct serial_icounter_struct icount;
+	memset(&icount, 0, sizeof(icount));
+	if (tty->ops->get_icount)
+		retval = tty->ops->get_icount(tty, &icount);
+	if (retval != 0)
+		return retval;
+	if (copy_to_user(arg, &icount, sizeof(icount)))
+		return -EFAULT;
+	return 0;
+}
+
 struct tty_struct *tty_pair_get_tty(struct tty_struct *tty)
 {
 	if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
@@ -2631,6 +2646,12 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 	case TIOCMBIC:
 	case TIOCMBIS:
 		return tty_tiocmset(tty, file, cmd, p);
+	case TIOCGICOUNT:
+		retval = tty_tiocgicount(tty, p);
+		/* For the moment allow fall through to the old method */
+        	if (retval != -EINVAL)
+			return retval;
+		break;
 	case TCFLSH:
 		switch (arg) {
 		case TCIFLUSH:
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index bc6cddd..c4ea146 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -1074,10 +1074,10 @@ uart_wait_modem_status(struct uart_state *state, unsigned long arg)
  * NB: both 1->0 and 0->1 transitions are counted except for
  *     RI where only 0->1 is counted.
  */
-static int uart_get_count(struct uart_state *state,
-			  struct serial_icounter_struct __user *icnt)
+static int uart_get_icount(struct tty_struct *tty,
+			  struct serial_icounter_struct *icount)
 {
-	struct serial_icounter_struct icount;
+	struct uart_state *state = tty->driver_data;
 	struct uart_icount cnow;
 	struct uart_port *uport = state->uart_port;
 
@@ -1085,19 +1085,19 @@ static int uart_get_count(struct uart_state *state,
 	memcpy(&cnow, &uport->icount, sizeof(struct uart_icount));
 	spin_unlock_irq(&uport->lock);
 
-	icount.cts         = cnow.cts;
-	icount.dsr         = cnow.dsr;
-	icount.rng         = cnow.rng;
-	icount.dcd         = cnow.dcd;
-	icount.rx          = cnow.rx;
-	icount.tx          = cnow.tx;
-	icount.frame       = cnow.frame;
-	icount.overrun     = cnow.overrun;
-	icount.parity      = cnow.parity;
-	icount.brk         = cnow.brk;
-	icount.buf_overrun = cnow.buf_overrun;
+	icount->cts         = cnow.cts;
+	icount->dsr         = cnow.dsr;
+	icount->rng         = cnow.rng;
+	icount->dcd         = cnow.dcd;
+	icount->rx          = cnow.rx;
+	icount->tx          = cnow.tx;
+	icount->frame       = cnow.frame;
+	icount->overrun     = cnow.overrun;
+	icount->parity      = cnow.parity;
+	icount->brk         = cnow.brk;
+	icount->buf_overrun = cnow.buf_overrun;
 
-	return copy_to_user(icnt, &icount, sizeof(icount)) ? -EFAULT : 0;
+	return 0;
 }
 
 /*
@@ -1150,10 +1150,6 @@ uart_ioctl(struct tty_struct *tty, struct file *filp, unsigned int cmd,
 	case TIOCMIWAIT:
 		ret = uart_wait_modem_status(state, arg);
 		break;
-
-	case TIOCGICOUNT:
-		ret = uart_get_count(state, uarg);
-		break;
 	}
 
 	if (ret != -ENOIOCTLCMD)
@@ -2295,6 +2291,7 @@ static const struct tty_operations uart_ops = {
 #endif
 	.tiocmget	= uart_tiocmget,
 	.tiocmset	= uart_tiocmset,
+	.get_icount	= uart_get_icount,
 #ifdef CONFIG_CONSOLE_POLL
 	.poll_init	= uart_poll_init,
 	.poll_get_char	= uart_poll_get_char,
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 7a2177c..e64da74 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -519,6 +519,18 @@ static int serial_tiocmset(struct tty_struct *tty, struct file *file,
 	return -EINVAL;
 }
 
+static int serial_get_icount(struct tty_struct *tty,
+				struct serial_icounter_struct *icount)
+{
+	struct usb_serial_port *port = tty->driver_data;
+
+	dbg("%s - port %d", __func__, port->number);
+
+	if (port->serial->type->get_icount)
+		return port->serial->type->get_icount(tty, icount);
+	return -EINVAL;
+}
+
 /*
  * We would be calling tty_wakeup here, but unfortunately some line
  * disciplines have an annoying habit of calling tty->write from
@@ -1195,6 +1207,7 @@ static const struct tty_operations serial_ops = {
 	.chars_in_buffer =	serial_chars_in_buffer,
 	.tiocmget =		serial_tiocmget,
 	.tiocmset =		serial_tiocmset,
+	.get_icount = 		serial_get_icount,
 	.cleanup = 		serial_cleanup,
 	.install = 		serial_install,
 	.proc_fops =		&serial_proc_fops,
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h
index b086779..db2d227 100644
--- a/include/linux/tty_driver.h
+++ b/include/linux/tty_driver.h
@@ -224,6 +224,12 @@
  *	unless the tty also has a valid tty->termiox pointer.
  *
  *	Optional: Called under the termios lock
+ *
+ * int (*get_icount)(struct tty_struct *tty, struct serial_icounter *icount);
+ *
+ *	Called when the device receives a TIOCGICOUNT ioctl. Passed a kernel
+ *	structure to complete. This method is optional and will only be called
+ *	if provided (otherwise EINVAL will be returned).
  */
 
 #include <linux/fs.h>
@@ -232,6 +238,7 @@
 
 struct tty_struct;
 struct tty_driver;
+struct serial_icounter_struct;
 
 struct tty_operations {
 	struct tty_struct * (*lookup)(struct tty_driver *driver,
@@ -268,6 +275,8 @@ struct tty_operations {
 			unsigned int set, unsigned int clear);
 	int (*resize)(struct tty_struct *tty, struct winsize *ws);
 	int (*set_termiox)(struct tty_struct *tty, struct termiox *tnew);
+	int (*get_icount)(struct tty_struct *tty,
+				struct serial_icounter_struct *icount);
 #ifdef CONFIG_CONSOLE_POLL
 	int (*poll_init)(struct tty_driver *driver, int line, char *options);
 	int (*poll_get_char)(struct tty_driver *driver, int line);
diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h
index 55675b1..16d682f 100644
--- a/include/linux/usb/serial.h
+++ b/include/linux/usb/serial.h
@@ -271,6 +271,8 @@ struct usb_serial_driver {
 	int  (*tiocmget)(struct tty_struct *tty, struct file *file);
 	int  (*tiocmset)(struct tty_struct *tty, struct file *file,
 			 unsigned int set, unsigned int clear);
+	int  (*get_icount)(struct tty_struct *tty,
+			struct serial_icounter_struct *icount);
 	/* Called by the tty layer for port level work. There may or may not
 	   be an attached tty at this point */
 	void (*dtr_rts)(struct usb_serial_port *port, int on);
-- 
1.7.2

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[GIT PATCH] TTY/Serial merge for .37-rc1, Greg KH, (Fri Oct 22, 10:51 am)
[PATCH 01/49] tty: add tty_struct-&gt;dev pointer to correspo ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 02/49] serport: place serport serio device correctl ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 03/49] serial: mfd: snprintf() returns largish values, Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 04/49] serial: Add CONSOLE_POLL support for uartlite, Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 05/49] tty: Remove __GFP_NOFAIL from tty_add_file(), Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 06/49] ioctl: Use asm-generic/ioctls.h on arm (enab ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 07/49] ioctl: Use asm-generic/ioctls.h on avr32 (en ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 08/49] ioctl: Use asm-generic/ioctls.h on cris (ena ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 09/49] ioctl: Use asm-generic/ioctls.h on frv (enab ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 10/49] ioctl: Use asm-generic/ioctls.h on h8300 (en ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 11/49] ioctl: Use asm-generic/ioctls.h on ia64 (ena ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 12/49] ioctl: Use asm-generic/ioctls.h on m32r (ena ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 13/49] ioctl: Use asm-generic/ioctls.h on m68k (ena ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 14/49] ioctl: Use asm-generic/ioctls.h on mn10300 ( ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 15/49] ioctl: Use asm-generic/ioctls.h on s390 (ena ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 16/49] serial-core: skip call set_termios/console_s ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 17/49] serial-core: restore termios settings when r ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 18/49] add ttyprintk driver, Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 19/49] Char: mxser, call pci_disable_device from pr ..., Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 20/49] tty_io: check return code of tty_register_device, Greg Kroah-Hartman, (Fri Oct 22, 11:20 am)
[PATCH 21/49] serial: mrst_max3110: some code cleanup, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 22/49] serial: mrst_max3110: Make the IRQ option ru ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 23/49] serial: max3107: Fix memory leaks when retur ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 24/49] tty: Make tiocgicount a handler, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 25/49] tty: Convert the USB drivers to the new icou ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 26/49] tty: icount changeover for other main devices, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 27/49] tty: Fix warning left over from TIOCGICOUNT ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 28/49] tty: Add a new file /proc/tty/consoles, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 29/49] vcs: add poll/fasync support, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 30/49] vcs: invoke the vt update callback when /dev ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 31/49] tty: MAINTAINERS: add drivers/serial/jsm/ as ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 32/49] serial: 8250: Don't delay after transmitter ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 33/49] serial: mark the 8250 driver as maintained, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 34/49] serial: Factor out uart_poll_timeout() from ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 35/49] altera_uart: Add support for polling mode (I ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 36/49] altera_uart: Add support for getting mapbase ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 37/49] altera_uart: Add support for different addre ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 38/49] altera_uart: Make it possible to use Altera ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 39/49] altera_uart: Fixup type usage of port flags, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 40/49] altera_uart: Fix missing prototype for regis ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 41/49] altera_uart: Don't use plain integer as NULL ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 42/49] 8250: allow platforms to override PM hook., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 43/49] Alchemy: Add UART PM methods., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 44/49] jsm: Remove the uart port on errors, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 45/49] serial: mfd: add more baud rates support, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 46/49] serial/imx: check that the buffer is non-emp ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 47/49] serial: abstraction for 8250 legacy ports, Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
[PATCH 48/49] serial: bfin_sport_uart: speed up sport RX s ..., Greg Kroah-Hartman, (Fri Oct 22, 11:21 am)
Re: [PATCH 28/49] tty: Add a new file /proc/tty/consoles, Christoph Hellwig, (Sat Oct 23, 4:46 am)
Re: [PATCH 28/49] tty: Add a new file /proc/tty/consoles, Dr. Werner Fink, (Mon Oct 25, 12:51 am)
Re: [PATCH 28/49] tty: Add a new file /proc/tty/consoles, Dr. Werner Fink, (Wed Oct 27, 2:27 am)
Re: [PATCH 28/49] tty: Add a new file /proc/tty/consoles, Dr. Werner Fink, (Wed Oct 27, 4:31 am)
Re: [PATCH 29/49] vcs: add poll/fasync support, Kay Sievers, (Tue Nov 9, 5:12 pm)
Re: [PATCH 29/49] vcs: add poll/fasync support, Nicolas Pitre, (Tue Nov 9, 6:26 pm)
Re: [PATCH 29/49] vcs: add poll/fasync support, Kay Sievers, (Tue Nov 9, 6:42 pm)
Re: [PATCH 29/49] vcs: add poll/fasync support, Nicolas Pitre, (Tue Nov 9, 11:33 pm)
Re: [PATCH 29/49] vcs: add poll/fasync support, Kay Sievers, (Wed Nov 10, 2:35 am)