Skip to contentSkip to conversation

serial: mvebu-uart: fix tx lost characters

PATCH New Gabriel Matni 3 participants 6 messages Mar 6, 2018 – Mar 20, 2018

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 serial: mvebu-uart: fix tx lost characters

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to ensure that the transmitter holding register (THR) is ready to receive a new byte.

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700 serial port")

---
drivers/tty/serial/mvebu-uart.c | 2 +-

1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/mvebu-uart.c +1 -1
index a100e98259d7..f0df0640208e 100644
@@ -618,7 +618,7 @@ static void wait_for_xmitr(struct uart_port *port)
   u32 val;
 
   readl_poll_timeout_atomic(port->membase + UART_STAT, val,
-             (val & STAT_TX_EMP), 1, 10000);
+             (val & STAT_TX_RDY(port)), 1, 10000);

}

static void mvebu_uart_console_putchar(struct uart_port *port, int ch) --
2.7.4

Quoted 99 lines

-----Original Message-----
From: Miquel Raynal [mailto:miquel.raynal at bootlin.com]
Sent: March 5, 2018 4:47 AM
To: Gabriel Matni <[email protected]>
Cc: linux-arm-kernel at lists.infradead.org; gregkh at linuxfoundation.org; Gr?gory Clement <[email protected]>; Thomas Petazzoni <[email protected]>
Subject: Re: [PATCH] serial: mvebu_uart: fix tx lost characters

Hi Gabriel,

Quoted 22 lines · Gabriel Matni

Hi Miqu?l,

Quoted 20 lines

-----Original Message-----
From: Miquel Raynal [mailto:miquel.raynal at bootlin.com]
Sent: February 27, 2018 8:13 AM
To: Gabriel Matni <[email protected]>
Cc: linux-arm-kernel at lists.infradead.org; gregkh at linuxfoundation.org; Gr?gory Clement <[email protected]>; Thomas Petazzoni <[email protected]>
Subject: Re: [PATCH] serial: mvebu_uart: fix tx lost characters

Hi Gabriel,

Quoted 6 lines · Gabriel Matni

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY instead of TX_EMPTY to ensure that the transmitter holding is ready to receive a new byte. Polling TX_EMPTY isn't enough as the hardware buffer can become empty but not yet

ready

Quoted 4 lines
Quoted 4 lines
Quoted 1 line

for CPU to write the next byte.

I am kind of sceptic with the explanation. My understanding is that:
- TX_EMPTY means the FIFO is empty

I had a deeper look into the spec : TX_EMPTY != TX_FIFO_EMPTY. I was referring to TX_FIFO_EMPTY here so my understanding of your solution was wrong.

Quoted 3 lines
Quoted 3 lines

- TX_RDY means the FIFO is not full, neither empty, it is a "half loaded" state.
Polling TX_RDY instead of TX_EMPTY should work too, but I don't see why

it

Quoted 1 line
Quoted 1 line

would fix the loss of character by filling the FIFO when there are bytes in

it

Quoted 3 lines
Quoted 1 line

rather than when it is fully empty.

TX_READY is set whenever the UART Transmitter Holding register is ready

to

Quoted 6 lines

receive a new byte. It gets cleared as soon as a new byte is written to the register. If the FIFO is empty or still has room, the ready will be set.

TX_EMPTY tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

I do agree with this statement. You are right that polling on TX_EMPTY looks wrong and we should definitively poll on TX_READY instead.

Quoted 2 lines

I am
unsure about the FIFO status in this case as I can encounter

TX_FIFO_EMP=0

Quoted 1 line

while TX_EMP=1, which suggests that the FIFO isn't necessarily empty

when

Quoted 1 line

TX_EMP is set.

That is weird but maybe the TX_FIFO_EMPTY is asserted only when all bits have been shifted, which is a 10-bit period after TSR is cleared, while TX_EMPTY would not wait for these bits to be actually shifted out and would be asserted a bit earlier, as soon as TSR is cleared. That is just and idea.

Quoted 4 lines

Therefore, the driver can either poll TX_FIFO_EMP or TX_READY to know whether it can output a new byte. I personally like TX_READY as it takes advantage of the FIFO.

True.

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

Thanks,
Miqu?l

--
Miquel Raynal, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

#1 lore raw

PATCH 1/1 serial: mvebu-uart: fix tx lost characters

Quoted 32 lines · Gabriel Matni

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to ensure that the transmitter holding register (THR) is ready to receive a new byte.

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700 serial port")

---
drivers/tty/serial/mvebu-uart.c | 2 +-

1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/mvebu-uart.c +1 -2
index a100e98259d7..f0df0640208e 100644
@@ -618,7 +618,7 @@ static void wait_for_xmitr(struct uart_port *port)
   u32 val;
 
   readl_poll_timeout_atomic(port->membase + UART_STAT, val,
-             (val & STAT_TX_EMP), 1, 10000);
+             (val & STAT_TX_RDY(port)), 1, 10000);
 }
 
 static void mvebu_uart_console_putchar(struct uart_port *port, int ch)
--
Quoted 1 line

2.7.4

Patch is corrupted and can not be applied :(

Please fix up and resend.

Also be sure to cc: the linux-serial mailing list, scripts/get_maintainer.pl is your friend...

thanks,

greg k-h

#2 lore raw

PATCH 1/1 serial: mvebu-uart: fix tx lost characters

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to ensure that the transmitter holding register (THR) is ready to receive a new byte.

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700

serial port")

---
 drivers/tty/serial/mvebu-uart.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/mvebu-uart.c +1 -1
index a100e98259d7..400e1bc558b2 100644
@@ -618,7 +618,7 @@ static void wait_for_xmitr(struct uart_port *port)
 	u32 val;
 
 	readl_poll_timeout_atomic(port->membase + UART_STAT, val,
-				  (val & STAT_TX_EMP), 1, 10000);
+             (val & STAT_TX_RDY(port)), 1, 10000);
 }
 
 static void mvebu_uart_console_putchar(struct uart_port *port, int ch)
Signature · 1 line
2.7.4
Quoted 58 lines

-----Original Message-----
From: gregkh at linuxfoundation.org <[email protected]>
Sent: March 15, 2018 12:55 PM
To: Gabriel Matni <[email protected]>
Cc: linux-arm-kernel at lists.infradead.org; stable at vger.kernel.org; Miquel Raynal <[email protected]>; Gr?gory Clement <[email protected]>; Thomas Petazzoni <[email protected]>
Subject: Re: [PATCH] serial: mvebu-uart: fix tx lost characters

Quoted 4 lines · Gabriel Matni

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to

ensure

Quoted 7 lines

that the transmitter holding register (THR) is ready to receive a new byte.

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700

serial port")

drivers/tty/serial/mvebu-

Quoted 8 lines

---
drivers/tty/serial/mvebu-uart.c | 2 +-

1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/mvebu- renamed from drivers/tty/serial/mvebu-uart.c +0 -0

uart.c

Quoted 13 lines

index a100e98259d7..f0df0640208e 100644

drivers/tty/serial/mvebu-uart.c +1 -2
@@ -618,7 +618,7 @@ static void wait_for_xmitr(struct uart_port *port)
   u32 val;
 
   readl_poll_timeout_atomic(port->membase + UART_STAT, val,
-             (val & STAT_TX_EMP), 1, 10000);
+             (val & STAT_TX_RDY(port)), 1, 10000);
 }
 
 static void mvebu_uart_console_putchar(struct uart_port *port, int ch)
--
Quoted 1 line

2.7.4

Patch is corrupted and can not be applied :(

Please fix up and resend.

Also be sure to cc: the linux-serial mailing list, scripts/get_maintainer.pl is your friend...

thanks,

greg k-h

#3 lore raw

PATCH 1/1 serial: mvebu-uart: fix tx lost characters

Hi Gabriel,

Quoted 25 lines · Gabriel Matni

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to ensure that the transmitter holding register (THR) is ready to receive a new byte.

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700

serial port")

---
 drivers/tty/serial/mvebu-uart.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/mvebu-uart.c +0 -0
index a100e98259d7..400e1bc558b2 100644

drivers/tty/serial/mvebu-uart.c static void wait_for_xmitr(struct uart_port *port) · line 621

Quoted 5 lines
drivers/tty/serial/mvebu-uart.c +1 -1
@@ -618,7 +618,7 @@ static void wait_for_xmitr(struct uart_port *port)
 	u32 val;
 
 	readl_poll_timeout_atomic(port->membase + UART_STAT, val,
-				  (val & STAT_TX_EMP), 1, 10000);
+             (val & STAT_TX_RDY(port)), 1, 10000);

I think this line should be indented like the one you replaced.

Thanks,
Miqu?l

Signature · 3 lines
Miquel Raynal, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com
#4 lore raw

PATCH 1/1 serial: mvebu-uart: fix tx lost characters

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to ensure that the transmitter holding register (THR) is ready to receive a new byte.

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700

serial port")

---
 drivers/tty/serial/mvebu-uart.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/mvebu-uart.c +1 -1
index a100e98259d7..f0df0640208e 100644
@@ -618,7 +618,7 @@ static void wait_for_xmitr(struct uart_port *port)
 	u32 val;
 
 	readl_poll_timeout_atomic(port->membase + UART_STAT, val,
-				  (val & STAT_TX_EMP), 1, 10000);
+				  (val & STAT_TX_RDY(port)), 1, 10000);
 }
 
 static void mvebu_uart_console_putchar(struct uart_port *port, int ch)
Signature · 1 line
2.7.4
Quoted 57 lines

-----Original Message-----
From: Miquel Raynal <[email protected]>
Sent: March 15, 2018 4:22 PM
To: Gabriel Matni <[email protected]>
Cc: gregkh at linuxfoundation.org; linux-serial at vger.kernel.org; linux-arm- kernel at lists.infradead.org; stable at vger.kernel.org; Gr?gory Clement <[email protected]>; Thomas Petazzoni <[email protected]>
Subject: Re: [PATCH] serial: mvebu-uart: fix tx lost characters

Hi Gabriel,

Quoted 4 lines · Gabriel Matni

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to

ensure

drivers/tty/serial/mvebu-

Quoted 17 lines

that the transmitter holding register (THR) is ready to receive a new byte.

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700

serial port")

---
 drivers/tty/serial/mvebu-uart.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/mvebu- renamed from drivers/tty/serial/mvebu-uart.c +0 -0

uart.c

drivers/tty/serial/mvebu-uart.c static void wait_for_xmitr(struct uart_port *port) · line 621

Quoted 9 lines

index a100e98259d7..400e1bc558b2 100644

drivers/tty/serial/mvebu-uart.c +1 -1
@@ -618,7 +618,7 @@ static void wait_for_xmitr(struct uart_port *port)
 	u32 val;
 
 	readl_poll_timeout_atomic(port->membase + UART_STAT, val,
-				  (val & STAT_TX_EMP), 1, 10000);
+             (val & STAT_TX_RDY(port)), 1, 10000);

I think this line should be indented like the one you replaced.

Thanks,
Miqu?l

--
Miquel Raynal, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

#5 lore raw

PATCH 1/1 serial: mvebu-uart: fix tx lost characters

Quoted 6 lines · Gabriel Matni

From: Gabriel Matni <[email protected]>

Fixes missing characters on kernel console at low baud rates (i.e.9600). The driver should poll TX_RDY or TX_FIFO_EMP instead of TX_EMP to ensure that the transmitter holding register (THR) is ready to receive a new byte.

Quoted 6 lines

TX_EMP tells us when it is possible to send a break sequence via SND_BRK_SEQ. While this also indicates that both the THR and the TSR are empty, it does not guarantee that a new byte can be written just yet.

Fixes 30530791a7a0 ("serial: mvebu-uart: initial support for Armada-3700

serial port")

Can all be on one line.

And should this go to the stable trees?

Quoted 3 lines

Trailing whitespace?

Quoted 4 lines
---
 drivers/tty/serial/mvebu-uart.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

What version of this patch is this? How do I know which to accept?

Please properly version your patch, and include the changes below the --- line like the documentation says to do.

thanks,

greg k-h