linux-serial.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: linux-serial@vger.kernel.org,
	"Greg KH" <gregkh@linuxfoundation.org>,
	"Jiri Slaby" <jirislaby@kernel.org>,
	"Lukas Wunner" <lukas@wunner.de>,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
	"Vicente Bergas" <vicencb@gmail.com>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: "Johan Hovold" <johan@kernel.org>,
	heiko@sntech.de, giulio.benetti@micronovasrl.com,
	"Heikki Krogerus" <heikki.krogerus@linux.intel.com>,
	"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
Subject: [PATCH v4 02/13] serial: 8250: use THRE & __stop_tx also with DMA
Date: Mon, 25 Apr 2022 17:33:59 +0300	[thread overview]
Message-ID: <20220425143410.12703-3-ilpo.jarvinen@linux.intel.com> (raw)
In-Reply-To: <20220425143410.12703-1-ilpo.jarvinen@linux.intel.com>

8250 DMA tx complete path lacks calls to normal 8250 stop handling. It
does not use THRE to detect true completion of the tx and also doesn't
call __stop_tx. This leads to problems with em485 that needs to handle
RTS timing.

Instead of handling tx stop internally within 8250 dma code, enable
THRE when tx'able data runs out and tweak serial8250_handle_irq to call
only __stop_tx when uart is using DMA.

It also seems bit early to call serial8250_rpm_put_tx from there while
tx is still underway(?).

Tested-by: Vicente Bergas <vicencb@gmail.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
---
 drivers/tty/serial/8250/8250_dma.c  | 3 +--
 drivers/tty/serial/8250/8250_port.c | 9 ++++++---
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c
index 890fa7ddaa7f..e1625a73ce57 100644
--- a/drivers/tty/serial/8250/8250_dma.c
+++ b/drivers/tty/serial/8250/8250_dma.c
@@ -34,7 +34,7 @@ static void __dma_tx_complete(void *param)
 		uart_write_wakeup(&p->port);
 
 	ret = serial8250_tx_dma(p);
-	if (ret)
+	if (ret || !dma->tx_running)
 		serial8250_set_THRI(p);
 
 	spin_unlock_irqrestore(&p->port.lock, flags);
@@ -71,7 +71,6 @@ int serial8250_tx_dma(struct uart_8250_port *p)
 
 	if (uart_tx_stopped(&p->port) || uart_circ_empty(xmit)) {
 		/* We have been called from __dma_tx_complete() */
-		serial8250_rpm_put_tx(p);
 		return 0;
 	}
 
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
index d30a6c1c4c20..40b62126c1ca 100644
--- a/drivers/tty/serial/8250/8250_port.c
+++ b/drivers/tty/serial/8250/8250_port.c
@@ -1950,9 +1950,12 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir)
 			status = serial8250_rx_chars(up, status);
 	}
 	serial8250_modem_status(up);
-	if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE) &&
-		(up->ier & UART_IER_THRI))
-		serial8250_tx_chars(up);
+	if ((status & UART_LSR_THRE) && (up->ier & UART_IER_THRI)) {
+		if (!up->dma || up->dma->tx_err)
+			serial8250_tx_chars(up);
+		else
+			__stop_tx(up);
+	}
 
 	uart_unlock_and_check_sysrq_irqrestore(port, flags);
 
-- 
2.30.2


  parent reply	other threads:[~2022-04-25 14:34 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-25 14:33 [PATCH v4 00/13] Add RS485 support to DW UART Ilpo Järvinen
2022-04-25 14:33 ` [PATCH v4 01/13] serial: Store character timing information to uart_port Ilpo Järvinen
2022-04-25 14:33 ` Ilpo Järvinen [this message]
2022-04-25 14:34 ` [PATCH v4 03/13] serial: 8250: Handle UART without interrupt on TEMT Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 04/13] serial: 8250_dwlib: RS485 HW half & full duplex support Ilpo Järvinen
2022-04-26 11:29   ` Greg KH
2022-09-20 11:37   ` Lukas Wunner
2022-09-20 12:01     ` Ilpo Järvinen
2022-09-20 12:10       ` Lukas Wunner
2022-04-25 14:34 ` [PATCH v4 05/13] serial: 8250_dwlib: Implement SW half " Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 06/13] dt_bindings: rs485: Add receiver enable polarity Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 07/13] ACPI / property: Document RS485 _DSD properties Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 08/13] serial: termbits: ADDRB to indicate 9th bit addressing mode Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 09/13] serial: General support for multipoint addresses Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 10/13] serial: 8250: make saved LSR larger Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 11/13] serial: 8250: create lsr_save_mask Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 12/13] serial: 8250_lpss: Use 32-bit reads Ilpo Järvinen
2022-04-25 14:34 ` [PATCH v4 13/13] serial: 8250_dwlib: Support for 9th bit multipoint addressing Ilpo Järvinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220425143410.12703-3-ilpo.jarvinen@linux.intel.com \
    --to=ilpo.jarvinen@linux.intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=giulio.benetti@micronovasrl.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=heiko@sntech.de \
    --cc=jirislaby@kernel.org \
    --cc=johan@kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=u.kleine-koenig@pengutronix.de \
    --cc=vicencb@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).