diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2009-11-05 10:59:25 -0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-11-05 10:59:25 -0800 |
| commit | f878c4f193b7327244af8f7de8cf8bc61fb78fe1 (patch) | |
| tree | 0d95465d5a6a8f13259bc149b249f29501e7fb75 /tty.current | |
| parent | 39874450fa07821078746db7b99cc931ca9478cc (diff) | |
| download | patches-f878c4f193b7327244af8f7de8cf8bc61fb78fe1.tar.gz | |
some bugfixes for .32
Diffstat (limited to 'tty.current')
| -rw-r--r-- | tty.current/tty-cp210x-fix-carrier-handling.patch | 87 | ||||
| -rw-r--r-- | tty.current/tty_port-if-we-are-opened-non-blocking-we-still-need-to-raise-the-carrier.patch | 46 |
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; + } |
