• Helmut Grohne's avatar
    tty: xilinx_uartps: Really fix id assignment · 22a82fa7
    Helmut Grohne authored
    The problems started with the revert (18cc7ac8). The
    cdns_uart_console.index is statically assigned -1. When the port is
    registered, Linux assigns consecutive numbers to it. It turned out that
    when using ttyPS1 as console, the index is not updated as we are reusing
    the same cdns_uart_console instance for multiple ports. When registering
    ttyPS0, it gets updated from -1 to 0, but when registering ttyPS1, it
    already is 0 and not updated.
    
    That led to 2ae11c46. It assigns the index prior to registering
    the uart_driver once. Unfortunately, that ended up breaking the
    situation where the probe order does not match the id order. When using
    the same device tree for both uboot and linux, it is important that the
    serial0 alias points to the console. So some boards reverse those
    aliases. This was reported by Jan Kiszka. The proposed fix was reverting
    the index assignment and going back to the previous iteration.
    
    However such a reversed assignement (serial0 -> uart1, serial1 -> uart0)
    was already partially broken by the revert (18cc7ac8). While the
    ttyPS device works, the kmsg connection is already broken and kernel
    messages go missing. Reverting the id assignment does not fix this.
    
    >From the xilinx_uartps driver pov (after reverting the refactoring
    commits), there can be only one console. This manifests in static
    variables console_pprt and cdns_uart_console. These variables are not
    properly linked and can go out of sync. The cdns_uart_console.index is
    important for uart_add_one_port. We call that function for each port -
    one of which hopefully is the console. If it isn't, the CON_ENABLED flag
    is not set and console_port is cleared. The next cdns_uart_probe call
    then tries to register the next port using that same cdns_uart_console.
    
    It is important that console_port and cdns_uart_console (and its index
    in particular) stay in sync. The index assignment implemented by
    Shubhrajyoti Datta is correct in principle. It just may have to happen a
    second time if the first cdns_uart_probe call didn't encounter the
    console device. And we shouldn't change the index once the console uart
    is registered.
    Reported-by: default avatarShubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
    Reported-by: default avatarJan Kiszka <jan.kiszka@web.de>
    Link: https://lore.kernel.org/linux-serial/f4092727-d8f5-5f91-2c9f-76643aace993@siemens.com/
    Fixes: 18cc7ac8 ("Revert "serial: uartps: Register own uart console and driver structures"")
    Fixes: 2ae11c46 ("tty: xilinx_uartps: Fix missing id assignment to the console")
    Fixes: 76ed2e10 ("Revert "tty: xilinx_uartps: Fix missing id assignment to the console"")
    Signed-off-by: default avatarHelmut Grohne <helmut.grohne@intenta.de>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20200713073227.GA3805@laureti-devSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    22a82fa7
xilinx_uartps.c 48.3 KB