lkml.org 
[lkml]   [2015]   [Apr]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 120/144] tty: serial: fsl_lpuart: clear receive flag on FIFO flush
    Date
    3.16.7-ckt10 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Stefan Agner <stefan@agner.ch>

    commit 8e4934c6d6c659e22b1b746af4196683e77ce6ca upstream.

    When the receiver was enabled during startup, a character could
    have been in the FIFO when the UART get initially used. The
    driver configures the (receive) watermark level, and flushes the
    FIFO. However, the receive flag (RDRF) could still be set at that
    stage (as mentioned in the register description of UARTx_RWFIFO).
    This leads to an interrupt which won't be handled properly in
    interrupt mode: The receive interrupt function lpuart_rxint checks
    the FIFO count, which is 0 at that point (due to the flush
    during initialization). The problem does not manifest when using
    DMA to receive characters.

    Fix this situation by explicitly read the status register, which
    leads to clearing of the RDRF flag. Due to the flush just after
    the status flag read, a explicit data read is not to required.

    Signed-off-by: Stefan Agner <stefan@agner.ch>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    drivers/tty/serial/fsl_lpuart.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
    index 05a033e7446c..2b49f2abd8b5 100644
    --- a/drivers/tty/serial/fsl_lpuart.c
    +++ b/drivers/tty/serial/fsl_lpuart.c
    @@ -608,6 +608,9 @@ static void lpuart_setup_watermark(struct lpuart_port *sport)
    writeb(val | UARTPFIFO_TXFE | UARTPFIFO_RXFE,
    sport->port.membase + UARTPFIFO);

    + /* explicitly clear RDRF */
    + readb(sport->port.membase + UARTSR1);
    +
    /* flush Tx and Rx FIFO */
    writeb(UARTCFIFO_TXFLUSH | UARTCFIFO_RXFLUSH,
    sport->port.membase + UARTCFIFO);

    \
     
     \ /
      Last update: 2015-04-21 18:01    [W:6.028 / U:0.236 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site