|
@@ -284,7 +284,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
|
|
serial settings even to the same values as before. Thus
|
|
|
we actually need to filter in this specific case */
|
|
|
|
|
|
- if (!tty_termios_hw_change(&tty->termios, old_termios))
|
|
|
+ if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios))
|
|
|
return;
|
|
|
|
|
|
cflag = tty->termios.c_cflag;
|
|
@@ -293,7 +293,8 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
|
|
if (!buf) {
|
|
|
dev_err(&port->dev, "%s - out of memory.\n", __func__);
|
|
|
/* Report back no change occurred */
|
|
|
- tty->termios = *old_termios;
|
|
|
+ if (old_termios)
|
|
|
+ tty->termios = *old_termios;
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -433,7 +434,7 @@ static void pl2303_set_termios(struct tty_struct *tty,
|
|
|
control = priv->line_control;
|
|
|
if ((cflag & CBAUD) == B0)
|
|
|
priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS);
|
|
|
- else if ((old_termios->c_cflag & CBAUD) == B0)
|
|
|
+ else if (old_termios && (old_termios->c_cflag & CBAUD) == B0)
|
|
|
priv->line_control |= (CONTROL_DTR | CONTROL_RTS);
|
|
|
if (control != priv->line_control) {
|
|
|
control = priv->line_control;
|
|
@@ -492,7 +493,6 @@ static void pl2303_close(struct usb_serial_port *port)
|
|
|
|
|
|
static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|
|
{
|
|
|
- struct ktermios tmp_termios;
|
|
|
struct usb_serial *serial = port->serial;
|
|
|
struct pl2303_serial_private *spriv = usb_get_serial_data(serial);
|
|
|
int result;
|
|
@@ -508,7 +508,7 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port)
|
|
|
|
|
|
/* Setup termios */
|
|
|
if (tty)
|
|
|
- pl2303_set_termios(tty, port, &tmp_termios);
|
|
|
+ pl2303_set_termios(tty, port, NULL);
|
|
|
|
|
|
result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
|
|
|
if (result) {
|