lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 843/879] serial: pch: dont overwrite xmit->buf[0] by x_char
    Date
    From: Jiri Slaby <jslaby@suse.cz>

    commit d9f3af4fbb1d955bbaf872d9e76502f6e3e803cb upstream.

    When x_char is to be sent, the TX path overwrites whatever is in the
    circular buffer at offset 0 with x_char and sends it using
    pch_uart_hal_write(). I don't understand how this was supposed to work
    if xmit->buf[0] already contained some character. It must have been
    lost.

    Remove this whole pop_tx_x() concept and do the work directly in the
    callers. (Without printing anything using dev_dbg().)

    Cc: <stable@vger.kernel.org>
    Fixes: 3c6a483275f4 (Serial: EG20T: add PCH_UART driver)
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    Link: https://lore.kernel.org/r/20220503080808.28332-1-jslaby@suse.cz
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/tty/serial/pch_uart.c | 27 +++++++--------------------
    1 file changed, 7 insertions(+), 20 deletions(-)

    --- a/drivers/tty/serial/pch_uart.c
    +++ b/drivers/tty/serial/pch_uart.c
    @@ -624,22 +624,6 @@ static int push_rx(struct eg20t_port *pr
    return 0;
    }

    -static int pop_tx_x(struct eg20t_port *priv, unsigned char *buf)
    -{
    - int ret = 0;
    - struct uart_port *port = &priv->port;
    -
    - if (port->x_char) {
    - dev_dbg(priv->port.dev, "%s:X character send %02x (%lu)\n",
    - __func__, port->x_char, jiffies);
    - buf[0] = port->x_char;
    - port->x_char = 0;
    - ret = 1;
    - }
    -
    - return ret;
    -}
    -
    static int dma_push_rx(struct eg20t_port *priv, int size)
    {
    int room;
    @@ -889,9 +873,10 @@ static unsigned int handle_tx(struct eg2

    fifo_size = max(priv->fifo_size, 1);
    tx_empty = 1;
    - if (pop_tx_x(priv, xmit->buf)) {
    - pch_uart_hal_write(priv, xmit->buf, 1);
    + if (port->x_char) {
    + pch_uart_hal_write(priv, &port->x_char, 1);
    port->icount.tx++;
    + port->x_char = 0;
    tx_empty = 0;
    fifo_size--;
    }
    @@ -946,9 +931,11 @@ static unsigned int dma_handle_tx(struct
    }

    fifo_size = max(priv->fifo_size, 1);
    - if (pop_tx_x(priv, xmit->buf)) {
    - pch_uart_hal_write(priv, xmit->buf, 1);
    +
    + if (port->x_char) {
    + pch_uart_hal_write(priv, &port->x_char, 1);
    port->icount.tx++;
    + port->x_char = 0;
    fifo_size--;
    }


    \
     
     \ /
      Last update: 2022-06-08 03:34    [W:2.614 / U:0.664 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site