aboutsummaryrefslogtreecommitdiffstats
path: root/tty.current
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2009-11-05 10:59:25 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2009-11-05 10:59:25 -0800
commitf878c4f193b7327244af8f7de8cf8bc61fb78fe1 (patch)
tree0d95465d5a6a8f13259bc149b249f29501e7fb75 /tty.current
parent39874450fa07821078746db7b99cc931ca9478cc (diff)
downloadpatches-f878c4f193b7327244af8f7de8cf8bc61fb78fe1.tar.gz
some bugfixes for .32
Diffstat (limited to 'tty.current')
-rw-r--r--tty.current/tty-cp210x-fix-carrier-handling.patch87
-rw-r--r--tty.current/tty_port-if-we-are-opened-non-blocking-we-still-need-to-raise-the-carrier.patch46
2 files changed, 133 insertions, 0 deletions
diff --git a/tty.current/tty-cp210x-fix-carrier-handling.patch b/tty.current/tty-cp210x-fix-carrier-handling.patch
new file mode 100644
index 00000000000000..35b631bad80180
--- /dev/null
+++ b/tty.current/tty-cp210x-fix-carrier-handling.patch
@@ -0,0 +1,87 @@
+From karl@hiramoto.org Thu Nov 5 10:13:53 2009
+From: Karl Hiramoto <karl@hiramoto.org>
+Date: Wed, 28 Oct 2009 21:12:33 +0100
+Subject: tty: cp210x: Fix carrier handling
+To: greg@kroah.com
+Cc: Karl Hiramoto <karl@hiramoto.org>, Alan Cox <alan@linux.intel.com>
+Message-ID: <1256760753-4912-2-git-send-email-karl@hiramoto.org>
+
+
+From: Alan Cox <alan@linux.intel.com>
+
+Original discussion:
+http://thread.gmane.org/gmane.linux.usb.general/23217/focus=23248
+or
+http://marc.info/?l=linux-usb&m=125553790714133&w=2
+
+9a68e39d4a701fb3be03cae9b462408664ebd205 broke carrier handling so that a
+cp210x setup which needed the carrier lines set up (non CLOCAL) which did
+not make a call which set the termios bits left the lines down even if
+CLOCAL was not asserted.
+
+Fix this not by reverting but by adding the proper dtr_rts and
+carrier_raised methods. This both sets the modem lines properly and also
+implements the correct blocking semantics for the port as required by
+POSIX.
+
+Signed-off-by: Alan Cox <alan@linux.intel.com>
+Reported-by: Karl Hiramoto <karl@hiramoto.org>
+Tested-by: Karl Hiramoto <karl@hiramoto.org>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/cp210x.c | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -50,6 +50,8 @@ static int cp210x_tiocmset_port(struct u
+ static void cp210x_break_ctl(struct tty_struct *, int);
+ static int cp210x_startup(struct usb_serial *);
+ static void cp210x_disconnect(struct usb_serial *);
++static void cp210x_dtr_rts(struct usb_serial_port *p, int on);
++static int cp210x_carrier_raised(struct usb_serial_port *p);
+
+ static int debug;
+
+@@ -143,6 +145,8 @@ static struct usb_serial_driver cp210x_d
+ .tiocmset = cp210x_tiocmset,
+ .attach = cp210x_startup,
+ .disconnect = cp210x_disconnect,
++ .dtr_rts = cp210x_dtr_rts,
++ .carrier_raised = cp210x_carrier_raised
+ };
+
+ /* Config request types */
+@@ -746,6 +750,14 @@ static int cp210x_tiocmset_port(struct u
+ return cp210x_set_config(port, CP210X_SET_MHS, &control, 2);
+ }
+
++static void cp210x_dtr_rts(struct usb_serial_port *p, int on)
++{
++ if (on)
++ cp210x_tiocmset_port(p, NULL, TIOCM_DTR|TIOCM_RTS, 0);
++ else
++ cp210x_tiocmset_port(p, NULL, 0, TIOCM_DTR|TIOCM_RTS);
++}
++
+ static int cp210x_tiocmget (struct tty_struct *tty, struct file *file)
+ {
+ struct usb_serial_port *port = tty->driver_data;
+@@ -768,6 +780,15 @@ static int cp210x_tiocmget (struct tty_s
+ return result;
+ }
+
++static int cp210x_carrier_raised(struct usb_serial_port *p)
++{
++ unsigned int control;
++ cp210x_get_config(p, CP210X_GET_MDMSTS, &control, 1);
++ if (control & CONTROL_DCD)
++ return 1;
++ return 0;
++}
++
+ static void cp210x_break_ctl (struct tty_struct *tty, int break_state)
+ {
+ struct usb_serial_port *port = tty->driver_data;
diff --git a/tty.current/tty_port-if-we-are-opened-non-blocking-we-still-need-to-raise-the-carrier.patch b/tty.current/tty_port-if-we-are-opened-non-blocking-we-still-need-to-raise-the-carrier.patch
new file mode 100644
index 00000000000000..140287495cad2b
--- /dev/null
+++ b/tty.current/tty_port-if-we-are-opened-non-blocking-we-still-need-to-raise-the-carrier.patch
@@ -0,0 +1,46 @@
+From karl@hiramoto.org Thu Nov 5 10:13:31 2009
+From: Karl Hiramoto <karl@hiramoto.org>
+Date: Wed, 28 Oct 2009 21:12:32 +0100
+Subject: tty_port: If we are opened non blocking we still need to raise the carrier
+To: greg@kroah.com
+Cc: Karl Hiramoto <karl@hiramoto.org>, Alan Cox <alan@linux.intel.com>
+Message-ID: <1256760753-4912-1-git-send-email-karl@hiramoto.org>
+
+
+From: Alan Cox <alan@linux.intel.com>
+
+Original discussion:
+http://thread.gmane.org/gmane.linux.usb.general/23217/focus=23248
+or
+http://marc.info/?l=linux-usb&m=125553790714133&w=2
+
+
+The tty_port code inherited a bug common to various drivers it was based
+upon. If the tty is opened O_NONBLOCK we do not wait for the carrier to be
+raised but we must still raise our modem lines if appropriate.
+
+(There is a second question here about whether we should do so if CLOCAL is
+ set but that can wait)
+
+Signed-off-by: Alan Cox <alan@linux.intel.com>
+Reported-by: Karl Hiramoto <karl@hiramoto.org>
+Tested-by: Karl Hiramoto <karl@hiramoto.org>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/char/tty_port.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/char/tty_port.c
++++ b/drivers/char/tty_port.c
+@@ -221,6 +221,9 @@ int tty_port_block_til_ready(struct tty_
+ the port has just hung up or is in another error state */
+ if ((filp->f_flags & O_NONBLOCK) ||
+ (tty->flags & (1 << TTY_IO_ERROR))) {
++ /* Indicate we are open */
++ if (tty->termios->c_cflag & CBAUD)
++ tty_port_raise_dtr_rts(port);
+ port->flags |= ASYNC_NORMAL_ACTIVE;
+ return 0;
+ }