usb-console: pass baud from console to the initial tty open

The usb console code has had a long standing problem of not being able
to pass the baud rate from the kernel argument console=ttyUSB0,BAUD
down to the initial tty open, unless you were willing to settle for
9600 baud.

The solution is to directly use tty_init_termios() in
usb_console_setup() as this will preserve any changes to the initial
termios setting on future opens.

CC: Alan Cox <alan@linux.intel.com>
CC: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Jason Wessel 2010-03-16 16:05:44 -05:00 committed by Greg Kroah-Hartman
parent aae86e8adb
commit 92d2c5e4ba

View File

@ -66,7 +66,7 @@ static int usb_console_setup(struct console *co, char *options)
struct usb_serial_port *port; struct usb_serial_port *port;
int retval; int retval;
struct tty_struct *tty = NULL; struct tty_struct *tty = NULL;
struct ktermios *termios = NULL, dummy; struct ktermios dummy;
dbg("%s", __func__); dbg("%s", __func__);
@ -141,15 +141,14 @@ static int usb_console_setup(struct console *co, char *options)
goto reset_open_count; goto reset_open_count;
} }
kref_init(&tty->kref); kref_init(&tty->kref);
termios = kzalloc(sizeof(*termios), GFP_KERNEL); tty_port_tty_set(&port->port, tty);
if (!termios) { tty->driver = usb_serial_tty_driver;
tty->index = co->index;
if (tty_init_termios(tty)) {
retval = -ENOMEM; retval = -ENOMEM;
err("no more memory"); err("no more memory");
goto free_tty; goto free_tty;
} }
memset(&dummy, 0, sizeof(struct ktermios));
tty->termios = termios;
tty_port_tty_set(&port->port, tty);
} }
/* only call the device specific open if this /* only call the device specific open if this
@ -161,16 +160,16 @@ static int usb_console_setup(struct console *co, char *options)
if (retval) { if (retval) {
err("could not open USB console port"); err("could not open USB console port");
goto free_termios; goto fail;
} }
if (serial->type->set_termios) { if (serial->type->set_termios) {
termios->c_cflag = cflag; tty->termios->c_cflag = cflag;
tty_termios_encode_baud_rate(termios, baud, baud); tty_termios_encode_baud_rate(tty->termios, baud, baud);
memset(&dummy, 0, sizeof(struct ktermios));
serial->type->set_termios(tty, port, &dummy); serial->type->set_termios(tty, port, &dummy);
tty_port_tty_set(&port->port, NULL); tty_port_tty_set(&port->port, NULL);
kfree(termios);
kfree(tty); kfree(tty);
} }
set_bit(ASYNCB_INITIALIZED, &port->port.flags); set_bit(ASYNCB_INITIALIZED, &port->port.flags);
@ -185,8 +184,7 @@ static int usb_console_setup(struct console *co, char *options)
mutex_unlock(&serial->disc_mutex); mutex_unlock(&serial->disc_mutex);
return retval; return retval;
free_termios: fail:
kfree(termios);
tty_port_tty_set(&port->port, NULL); tty_port_tty_set(&port->port, NULL);
free_tty: free_tty:
kfree(tty); kfree(tty);