diff mbox series

[2/2] tty: serial: 8250_omap: use two-entry sg list for tx dma

Message ID 20250506150748.3162-2-mans@mansr.com
State New
Headers show
Series None | expand

Commit Message

Mans Rullgard May 6, 2025, 3:07 p.m. UTC
On buffer wraparound, two sg entries are needed to transfer the full
contents of the kfifo.

This is equivalent to the change made to the 8250_dma driver in commit
59449c9dbdaa ("tty: serial: 8250_dma: use sgl with 2 nents to take care
of buffer wrap").

Signed-off-by: Mans Rullgard <mans@mansr.com>
---
 drivers/tty/serial/8250/8250_omap.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c
index 180466e09605..66ba43a20725 100644
--- a/drivers/tty/serial/8250/8250_omap.c
+++ b/drivers/tty/serial/8250/8250_omap.c
@@ -1152,9 +1152,11 @@  static int omap_8250_tx_dma(struct uart_8250_port *p)
 	struct omap8250_priv		*priv = p->port.private_data;
 	struct tty_port			*tport = &p->port.state->port;
 	struct dma_async_tx_descriptor	*desc;
-	struct scatterlist sg;
+	struct scatterlist *sg;
+	struct scatterlist sgl[2];
 	int skip_byte = -1;
 	int ret;
+	int i;
 
 	if (dma->tx_running)
 		return 0;
@@ -1208,18 +1210,22 @@  static int omap_8250_tx_dma(struct uart_8250_port *p)
 		skip_byte = c;
 	}
 
-	sg_init_table(&sg, 1);
-	kfifo_dma_out_prepare_mapped(&tport->xmit_fifo, &sg, 1,
-				     UART_XMIT_SIZE, dma->tx_addr);
+	sg_init_table(sgl, ARRAY_SIZE(sgl));
+	ret = kfifo_dma_out_prepare_mapped(&tport->xmit_fifo, sgl, ARRAY_SIZE(sgl),
+					   UART_XMIT_SIZE, dma->tx_addr);
 
-	desc = dmaengine_prep_slave_sg(dma->txchan, &sg, 1, DMA_MEM_TO_DEV,
+	desc = dmaengine_prep_slave_sg(dma->txchan, sgl, ret, DMA_MEM_TO_DEV,
 			DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 	if (!desc) {
 		ret = -EBUSY;
 		goto err;
 	}
 
-	dma->tx_size = sg_dma_len(&sg);
+	dma->tx_size = 0;
+
+	for_each_sg(sgl, sg, ret, i)
+		dma->tx_size += sg_dma_len(sg);
+
 	dma->tx_running = 1;
 
 	desc->callback = omap_8250_dma_tx_complete;