• Helmut Grohne's avatar
    serial: xuartps: reduce hardware TX race condition · de4ed391
    Helmut Grohne authored
    After sending data to the uart, the driver was waiting until the TX
    FIFO was empty (for every single char written). After that, TX was
    disabled by writing the original TX state to the status register. At
    that time however, the state machine could still be shifting
    characters. Not waiting can result in strange hardware states,
    especially when coupled with calls to cdns_uart_set_termios, whose
    symptom generally is garbage characters being received from uart or a
    hang.
    
    According to UG585, the TACTIVE bit of the channel status register
    indicates the shifter operation and we should be waiting for that bit
    to clear.
    
    Sending characters does not require the TX FIFO to be empty, but merely
    to not be full. So cdns_uart_console_putchar is updated accordingly.
    
    During tests with an instrumented kernel and an oscilloscope, we could
    determine that the chance of a race is reduced by this patch. It is not
    removed entirely. On the oscilloscope, one can see that disabling the
    transmitter early can result in the transmission hanging in the middle
    of a character for a tiny duration. This hiccup is enough to
    desynchronize with a remote device for a sequence of characters until a
    data bit doesn't match the start or stop bits anymore.
    
    Link: https://www.spinics.net/lists/linux-serial/msg23156.html
    Link: https://www.spinics.net/lists/linux-serial/msg26139.htmlSigned-off-by: default avatarHelmut Grohne <h.grohne@intenta.de>
    Acked-by: default avatarSören Brinkmann <soren.brinkmann@xilinx.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    de4ed391
xilinx_uartps.c 46.5 KB