Linux-Serial Archive on lore.kernel.org
 help / color / Atom feed
* [PATCHv2] serial: uartps: Add monitoring TACTIVE bit in set_termios
@ 2020-01-07 11:57 shubhrajyoti.datta
  2020-01-07 12:51 ` Johan Hovold
  0 siblings, 1 reply; 2+ messages in thread
From: shubhrajyoti.datta @ 2020-01-07 11:57 UTC (permalink / raw)
  To: linux-serial; +Cc: gregkh, jacmet, git, Raviteja Narayanam, Shubhrajyoti Datta

From: Raviteja Narayanam <raviteja.narayanam@xilinx.com>

Before setting up baud rate in set_termios function, make sure
all the data is shifted out from the Uart transmitter by
monitoring TACTIVE bit in the channel status register.

Signed-off-by: Raviteja Narayanam <raviteja.narayanam@xilinx.com>
Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
---
v2: fix the signed-off

 drivers/tty/serial/xilinx_uartps.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
index 4e55bc3..7424f33 100644
--- a/drivers/tty/serial/xilinx_uartps.c
+++ b/drivers/tty/serial/xilinx_uartps.c
@@ -690,11 +690,15 @@ static void cdns_uart_set_termios(struct uart_port *port,
 	unsigned int ctrl_reg, mode_reg, val;
 	int err;
 
-	/* Wait for the transmit FIFO to empty before making changes */
+	/* Wait for the transmit FIFO to empty and Transmitter to shift out
+	 * all the data before making changes
+	 */
 	if (!(readl(port->membase + CDNS_UART_CR) &
 				CDNS_UART_CR_TX_DIS)) {
 		err = readl_poll_timeout(port->membase + CDNS_UART_SR,
-					 val, (val & CDNS_UART_SR_TXEMPTY),
+					 val, ((val & (CDNS_UART_SR_TXEMPTY |
+					 CDNS_UART_SR_TACTIVE)) ==
+					 CDNS_UART_SR_TXEMPTY),
 					 1000, TX_TIMEOUT);
 		if (err) {
 			dev_err(port->dev, "timed out waiting for tx empty");
-- 
2.1.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCHv2] serial: uartps: Add monitoring TACTIVE bit in set_termios
  2020-01-07 11:57 [PATCHv2] serial: uartps: Add monitoring TACTIVE bit in set_termios shubhrajyoti.datta
@ 2020-01-07 12:51 ` Johan Hovold
  0 siblings, 0 replies; 2+ messages in thread
From: Johan Hovold @ 2020-01-07 12:51 UTC (permalink / raw)
  To: shubhrajyoti.datta
  Cc: linux-serial, gregkh, jacmet, git, Raviteja Narayanam,
	Shubhrajyoti Datta

On Tue, Jan 07, 2020 at 05:27:03PM +0530, shubhrajyoti.datta@gmail.com wrote:
> From: Raviteja Narayanam <raviteja.narayanam@xilinx.com>
> 
> Before setting up baud rate in set_termios function, make sure
> all the data is shifted out from the Uart transmitter by
> monitoring TACTIVE bit in the channel status register.

set_termios() is not supposed to do that unconditionally. Instead the
user specifies whether the output buffer shall been drained (e.g. using
TCSADRAIN) and the tty layer takes care of it.

Almost no other serial driver does this, which is a hint that you're
doing something wrong.

I suggest you remove the check instead and possibly amend tx_empty() if
you need to check CDNS_UART_SR_TACTIVE as well.

> Signed-off-by: Raviteja Narayanam <raviteja.narayanam@xilinx.com>
> Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
> ---
> v2: fix the signed-off
> 
>  drivers/tty/serial/xilinx_uartps.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
> index 4e55bc3..7424f33 100644
> --- a/drivers/tty/serial/xilinx_uartps.c
> +++ b/drivers/tty/serial/xilinx_uartps.c
> @@ -690,11 +690,15 @@ static void cdns_uart_set_termios(struct uart_port *port,
>  	unsigned int ctrl_reg, mode_reg, val;
>  	int err;
>  
> -	/* Wait for the transmit FIFO to empty before making changes */
> +	/* Wait for the transmit FIFO to empty and Transmitter to shift out
> +	 * all the data before making changes
> +	 */
>  	if (!(readl(port->membase + CDNS_UART_CR) &
>  				CDNS_UART_CR_TX_DIS)) {
>  		err = readl_poll_timeout(port->membase + CDNS_UART_SR,
> -					 val, (val & CDNS_UART_SR_TXEMPTY),
> +					 val, ((val & (CDNS_UART_SR_TXEMPTY |
> +					 CDNS_UART_SR_TACTIVE)) ==
> +					 CDNS_UART_SR_TXEMPTY),
>  					 1000, TX_TIMEOUT);
>  		if (err) {
>  			dev_err(port->dev, "timed out waiting for tx empty");

Johan

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, back to index

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-07 11:57 [PATCHv2] serial: uartps: Add monitoring TACTIVE bit in set_termios shubhrajyoti.datta
2020-01-07 12:51 ` Johan Hovold

Linux-Serial Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-serial/0 linux-serial/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-serial linux-serial/ https://lore.kernel.org/linux-serial \
		linux-serial@vger.kernel.org
	public-inbox-index linux-serial

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-serial


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git