[PATCH] Revert "OMAP/serial: Fix incorrect Rx FIFO threshold setting, LSR validation on Tx, and Tx FIFO IRQ generation"

Paul Walmsley paul at pwsan.com
Mon Apr 1 01:25:11 EDT 2013


This reverts commit 1776fd059c40907297d6c26c51876575d63fd9e2.

Commit 1776fd059c40 causes UART sluggishness on the OMAP37xx EVM.
This can be demonstrated by pasting in a ten-character string, like
"ffffffffff", at the serial console.  The string will be echoed back
two to three characters at a time, with about a one-second pause
between groups.  This causes one of the OMAP PM validation tests to
time out:

http://www.pwsan.com/omap/testlogs/test_v3.9-rc5/20130331205513/pm/37xxevm/37xxevm_log.txt

With commit 1776fd059c40 reverted, the test succeeds:

http://www.pwsan.com/omap/testlogs/serial_fix_37xx_v3.9-rc/20130331230517/pm/37xxevm/37xxevm_log.txt

This problem has been present since v3.9-rc1, but was incorrectly 
suspected to be due to commit 6aa9707099c4b25700940eb3d016f16c4434360d 
("lockdep: check that no locks held at freeze time"), due to limitations
in my local testbed.

Signed-off-by: Paul Walmsley <paul at pwsan.com>
Cc: Alexey Pelykh <alexey.pelykh at gmail.com>
Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
---

Alexey, care to make another attempt for 3.11 at fixing the issue you were 
originally debugging, but one that also works on OMAP37xx EVM?  It would 
be good to cc the <linux-omap at vger.kernel.org> on your OMAP work.  If you 
don't have a 37xx EVM, someone there might be able to help you test.

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

diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 4dc4140..9915e4d 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -59,7 +59,6 @@
 
 /* SCR register bitmasks */
 #define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK		(1 << 7)
-#define OMAP_UART_SCR_TX_TRIG_GRANU1_MASK		(1 << 6)
 #define OMAP_UART_SCR_TX_EMPTY			(1 << 3)
 
 /* FCR register bitmasks */
@@ -321,6 +320,9 @@ static void transmit_chars(struct uart_omap_port *up, unsigned int lsr)
 	struct circ_buf *xmit = &up->port.state->xmit;
 	int count;
 
+	if (!(lsr & UART_LSR_THRE))
+		return;
+
 	if (up->port.x_char) {
 		serial_out(up, UART_TX, up->port.x_char);
 		up->port.icount.tx++;
@@ -862,7 +864,7 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
 	serial_out(up, UART_IER, up->ier);
 	serial_out(up, UART_LCR, cval);		/* reset DLAB */
 	up->lcr = cval;
-	up->scr = 0;
+	up->scr = OMAP_UART_SCR_TX_EMPTY;
 
 	/* FIFOs and DMA Settings */
 
@@ -886,6 +888,8 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
 	serial_out(up, UART_MCR, up->mcr | UART_MCR_TCRTLR);
 	/* FIFO ENABLE, DMA MODE */
 
+	up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;
+
 	/* Set receive FIFO threshold to 16 characters and
 	 * transmit FIFO threshold to 16 spaces
 	 */
-- 
1.7.10.4




More information about the linux-arm-kernel mailing list