]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
printk/of_serial: fix serial console cessation part way through boot.
authorStephen Chivers <schivers@csc.com>
Tue, 13 May 2014 22:04:39 +0000 (08:04 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 Jul 2014 03:13:53 +0000 (20:13 -0700)
commit 7fa21dd8bd191564a195291161d6b43db5d9c350 upstream.

Commit 5f5c9ae56c38942623f69c3e6dc6ec78e4da2076
"serial_core: Unregister console in uart_remove_one_port()"
fixed a crash where a serial port was removed but
not deregistered as a console.

There is a side effect of that commit for platforms having serial consoles
and of_serial configured (CONFIG_SERIAL_OF_PLATFORM). The serial console
is disabled midway through the boot process.

This cessation of the serial console affects PowerPC computers
such as the MVME5100 and SAM440EP.

The sequence is:

bootconsole [udbg0] enabled
....
serial8250/16550 driver initialises and registers its UARTS,
one of these is the serial console.
console [ttyS0] enabled
....
of_serial probes "platform" devices, registering them as it goes.
One of these is the serial console.
console [ttyS0] disabled.

The disabling of the serial console is due to:

a.  unregister_console in printk not clearing the
    CONS_ENABLED bit in the console flags,
    even though it has announced that the console is disabled; and

b.  of_platform_serial_probe in of_serial not setting the port type
    before it registers with serial8250_register_8250_port.

This patch ensures that the serial console is re-enabled when of_serial
registers a serial port that corresponds to the designated console.

===
The above failure was identified in Linux-3.15-rc2.

Tested using MVME5100 and SAM440EP PowerPC computers with
kernels built from Linux-3.15-rc5 and tty-next.

The continued operation of the serial console is vital for computers
such as the MVME5100 as that Single Board Computer does not
have any grapical/display hardware.

Signed-off-by: Stephen Chivers <schivers@csc.com>
Tested-by: Stephen Chivers <schivers@csc.com>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> [unregister_console]
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/of_serial.c
kernel/printk/printk.c

index 99246606a256b71cbef9272b1402afc4bdcf1009..27981e2b943076d3f35f08fdb13a5a2b309fc633 100644 (file)
@@ -173,6 +173,7 @@ static int of_platform_serial_probe(struct platform_device *ofdev)
        {
                struct uart_8250_port port8250;
                memset(&port8250, 0, sizeof(port8250));
+               port.type = port_type;
                port8250.port = port;
 
                if (port.fifosize)
index 7228258b85eca19e105df60bf3101bbc8a5e30b4..221229cf019020838faaa697102e58fe6d36e2dc 100644 (file)
@@ -2413,6 +2413,7 @@ int unregister_console(struct console *console)
        if (console_drivers != NULL && console->flags & CON_CONSDEV)
                console_drivers->flags |= CON_CONSDEV;
 
+       console->flags &= ~CON_ENABLED;
        console_unlock();
        console_sysfs_notify();
        return res;