Commit 4ddb0339 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Make serial console work for any port

From: Bjorn Helgaas <bjorn.helgaas@hp.com>

The current serial console code only works for ports that are either
defined in SERIAL_PORT_DFNS (and set up by serial8250_isa_init_ports()) or
registered by early_serial_setup().

On ia64, SERIAL_PORT_DFNS is empty because we discover everything via ACPI
and PCI.  And we only use early_serial_setup() for one port described by
the HCDP firmware table.

This patch against 2.6.3-rc2 makes it work for any valid port.  If we don't
know about the port early, we just return -ENODEV from the setup()
function, which leaves the serial console disabled.  After the driver has
found all the ports, we try to register the serial console again if it
hasn't been enabled already.

I think the "port->type == PORT_UNKNOWN" test is cleaner than the
"port->ops" test -- it more clearly gets to the point of "do we know about
this port".
parent fe252bd7
...@@ -1976,6 +1976,8 @@ static int __init serial8250_console_setup(struct console *co, char *options) ...@@ -1976,6 +1976,8 @@ static int __init serial8250_console_setup(struct console *co, char *options)
if (co->index >= UART_NR) if (co->index >= UART_NR)
co->index = 0; co->index = 0;
port = &serial8250_ports[co->index].port; port = &serial8250_ports[co->index].port;
if (port->type == PORT_UNKNOWN)
return -ENODEV;
/* /*
* Temporary fix. * Temporary fix.
...@@ -2007,6 +2009,14 @@ static int __init serial8250_console_init(void) ...@@ -2007,6 +2009,14 @@ static int __init serial8250_console_init(void)
} }
console_initcall(serial8250_console_init); console_initcall(serial8250_console_init);
static int __init serial8250_late_console_init(void)
{
if (!(serial8250_console.flags & CON_ENABLED))
register_console(&serial8250_console);
return 0;
}
late_initcall(serial8250_late_console_init);
#define SERIAL8250_CONSOLE &serial8250_console #define SERIAL8250_CONSOLE &serial8250_console
#else #else
#define SERIAL8250_CONSOLE NULL #define SERIAL8250_CONSOLE NULL
......
...@@ -1871,9 +1871,6 @@ uart_set_options(struct uart_port *port, struct console *co, ...@@ -1871,9 +1871,6 @@ uart_set_options(struct uart_port *port, struct console *co,
if (flow == 'r') if (flow == 'r')
termios.c_cflag |= CRTSCTS; termios.c_cflag |= CRTSCTS;
if (!port->ops)
return 0; /* "console=" on ia64 */
port->ops->set_termios(port, &termios, NULL); port->ops->set_termios(port, &termios, NULL);
co->cflag = termios.c_cflag; co->cflag = termios.c_cflag;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment