Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 77ec584d authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman
Browse files

serial: pch: don't overwrite xmit->buf[0] by x_char



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: 3c6a4832 (Serial: EG20T: add PCH_UART driver)
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Link: https://lore.kernel.org/r/20220503080808.28332-1-jslaby@suse.cz


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f6cb1470
Loading
Loading
Loading
Loading
+7 −20
Original line number Diff line number Diff line
@@ -635,22 +635,6 @@ static int push_rx(struct eg20t_port *priv, const unsigned char *buf,
	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;
@@ -900,9 +884,10 @@ static unsigned int handle_tx(struct eg20t_port *priv)

	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--;
	}
@@ -957,9 +942,11 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv)
	}

	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--;
	}