• Serge Semin's avatar
    serial: 8250_mtk: Fix high-speed baud rates clamping · 551e553f
    Serge Semin authored
    Commit 7b668c06 ("serial: 8250: Fix max baud limit in generic 8250
    port") fixed limits of a baud rate setting for a generic 8250 port.
    In other words since that commit the baud rate has been permitted to be
    within [uartclk / 16 / UART_DIV_MAX; uartclk / 16], which is absolutely
    normal for a standard 8250 UART port. But there are custom 8250 ports,
    which provide extended baud rate limits. In particular the Mediatek 8250
    port can work with baud rates up to "uartclk" speed.
    
    Normally that and any other peculiarity is supposed to be handled in a
    custom set_termios() callback implemented in the vendor-specific
    8250-port glue-driver. Currently that is how it's done for the most of
    the vendor-specific 8250 ports, but for some reason for Mediatek a
    solution has been spread out to both the glue-driver and to the generic
    8250-port code. Due to that a bug has been introduced, which permitted the
    extended baud rate limit for all even for standard 8250-ports. The bug
    has been fixed by the commit 7b668c06 ("serial: 8250: Fix max baud
    limit in generic 8250 port") by narrowing the baud rates limit back down to
    the normal bounds. Unfortunately by doing so we also broke the
    Mediatek-specific extended bauds feature.
    
    A fix of the problem described above is twofold. First since we can't get
    back the extended baud rate limits feature to the generic set_termios()
    function and that method supports only a standard baud rates range, the
    requested baud rate must be locally stored before calling it and then
    restored back to the new termios structure after the generic set_termios()
    finished its magic business. By doing so we still use the
    serial8250_do_set_termios() method to set the LCR/MCR/FCR/etc. registers,
    while the extended baud rate setting procedure will be performed later in
    the custom Mediatek-specific set_termios() callback. Second since a true
    baud rate is now fully calculated in the custom set_termios() method we
    need to locally update the port timeout by calling the
    uart_update_timeout() function. After the fixes described above are
    implemented in the 8250_mtk.c driver, the Mediatek 8250-port should
    get back to normally working with extended baud rates.
    
    Link: https://lore.kernel.org/linux-serial/20200701211337.3027448-1-danielwinkler@google.com
    
    Fixes: 7b668c06 ("serial: 8250: Fix max baud limit in generic 8250 port")
    Reported-by: default avatarDaniel Winkler <danielwinkler@google.com>
    Signed-off-by: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
    Cc: stable <stable@vger.kernel.org>
    Tested-by: default avatarClaire Chang <tientzu@chromium.org>
    Link: https://lore.kernel.org/r/20200714124113.20918-1-Sergey.Semin@baikalelectronics.ruSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    551e553f
8250_mtk.c 17.8 KB