• Paul Burton's avatar
    Revert "serial: 8250: Fix clearing FIFOs in RS485 mode again" · 3c9dc275
    Paul Burton authored
    Commit f6aa5beb ("serial: 8250: Fix clearing FIFOs in RS485 mode
    again") makes a change to FIFO clearing code which its commit message
    suggests was intended to be specific to use with RS485 mode, however:
    
     1) The change made does not just affect __do_stop_tx_rs485(), it also
        affects other uses of serial8250_clear_fifos() including paths for
        starting up, shutting down or auto-configuring a port regardless of
        whether it's an RS485 port or not.
    
     2) It makes the assumption that resetting the FIFOs is a no-op when
        FIFOs are disabled, and as such it checks for this case & explicitly
        avoids setting the FIFO reset bits when the FIFO enable bit is
        clear. A reading of the PC16550D manual would suggest that this is
        OK since the FIFO should automatically be reset if it is later
        enabled, but we support many 16550-compatible devices and have never
        required this auto-reset behaviour for at least the whole git era.
        Starting to rely on it now seems risky, offers no benefit, and
        indeed breaks at least the Ingenic JZ4780's UARTs which reads
        garbage when the RX FIFO is enabled if we don't explicitly reset it.
    
     3) By only resetting the FIFOs if they're enabled, the behaviour of
        serial8250_do_startup() during boot now depends on what the value of
        FCR is before the 8250 driver is probed. This in itself seems
        questionable and leaves us with FCR=0 & no FIFO reset if the UART
        was used by 8250_early, otherwise it depends upon what the
        bootloader left behind.
    
     4) Although the naming of serial8250_clear_fifos() may be unclear, it
        is clear that callers of it expect that it will disable FIFOs. Both
        serial8250_do_startup() & serial8250_do_shutdown() contain comments
        to that effect, and other callers explicitly re-enable the FIFOs
        after calling serial8250_clear_fifos(). The premise of that patch
        that disabling the FIFOs is incorrect therefore seems wrong.
    
    For these reasons, this reverts commit f6aa5beb ("serial: 8250: Fix
    clearing FIFOs in RS485 mode again").
    Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
    Fixes: f6aa5beb ("serial: 8250: Fix clearing FIFOs in RS485 mode again").
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Daniel Jedrychowski <avistel@gmail.com>
    Cc: Marek Vasut <marex@denx.de>
    Cc: linux-mips@vger.kernel.org
    Cc: linux-serial@vger.kernel.org
    Cc: stable <stable@vger.kernel.org> # 4.10+
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    3c9dc275
8250_port.c 83.3 KB