USB: spcp8x5: fix device initialisation at open

Do not use uninitialised termios data to determine when to configure the
device at open.

Cc: stable@vger.kernel.org
Signed-off-by: Johan Hovold <jhovold@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Johan Hovold 2013-06-10 18:29:39 +02:00 committed by Greg Kroah-Hartman
parent 21886725d5
commit 5e4211f1c4
1 changed files with 4 additions and 6 deletions

View File

@ -291,7 +291,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
struct spcp8x5_private *priv = usb_get_serial_port_data(port); struct spcp8x5_private *priv = usb_get_serial_port_data(port);
unsigned long flags; unsigned long flags;
unsigned int cflag = tty->termios.c_cflag; unsigned int cflag = tty->termios.c_cflag;
unsigned int old_cflag = old_termios->c_cflag;
unsigned short uartdata; unsigned short uartdata;
unsigned char buf[2] = {0, 0}; unsigned char buf[2] = {0, 0};
int baud; int baud;
@ -299,15 +298,15 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
u8 control; u8 control;
/* check that they really want us to change something */ /* check that they really want us to change something */
if (!tty_termios_hw_change(&tty->termios, old_termios)) if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
return; return;
/* set DTR/RTS active */ /* set DTR/RTS active */
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
control = priv->line_control; control = priv->line_control;
if ((old_cflag & CBAUD) == B0) { if (old_termios && (old_termios->c_cflag & CBAUD) == B0) {
priv->line_control |= MCR_DTR; priv->line_control |= MCR_DTR;
if (!(old_cflag & CRTSCTS)) if (!(old_termios->c_cflag & CRTSCTS))
priv->line_control |= MCR_RTS; priv->line_control |= MCR_RTS;
} }
if (control != priv->line_control) { if (control != priv->line_control) {
@ -394,7 +393,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port) static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port)
{ {
struct ktermios tmp_termios;
struct usb_serial *serial = port->serial; struct usb_serial *serial = port->serial;
struct spcp8x5_private *priv = usb_get_serial_port_data(port); struct spcp8x5_private *priv = usb_get_serial_port_data(port);
int ret; int ret;
@ -411,7 +409,7 @@ static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port)
spcp8x5_set_ctrl_line(port, priv->line_control); spcp8x5_set_ctrl_line(port, priv->line_control);
if (tty) if (tty)
spcp8x5_set_termios(tty, port, &tmp_termios); spcp8x5_set_termios(tty, port, NULL);
port->port.drain_delay = 256; port->port.drain_delay = 256;