All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] 8250 receive lockup fix
@ 2004-10-08 21:02 Paul Fulghum
  0 siblings, 0 replies; only message in thread
From: Paul Fulghum @ 2004-10-08 21:02 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel

Fix lockup caused by 8520 serial driver not clearing
receive interrupt if flip buffer becomes full.

Signed-off-by: Paul Fulghum <paulkf@microgate.com>


--- linux-2.6.9-rc3-mm3/drivers/serial/8250.c	2004-10-08 15:51:04.000000000 -0500
+++ bluedillo/drivers/serial/8250.c	2004-10-08 15:51:44.000000000 -0500
@@ -872,8 +872,19 @@ receive_chars(struct uart_8250_port *up,
 	do {
 		if (unlikely(tty->flip.count >= TTY_FLIPBUF_SIZE)) {
 			tty->flip.work.func((void *)tty);
-			if (tty->flip.count >= TTY_FLIPBUF_SIZE)
+			if (tty->flip.count >= TTY_FLIPBUF_SIZE) {
+				/* no room in flip buffer, discard rx FIFO contents to clear IRQ
+				 * *FIXME* Hardware with auto flow control
+				 * would benefit from leaving the data in the FIFO and
+				 * disabling the rx IRQ until space becomes available.
+				 */
+				do {
+					serial_inp(up, UART_RX);
+					up->port.icount.overrun++;
+					*status = serial_inp(up, UART_LSR);
+				} while ((*status & UART_LSR_DR) && (max_count-- > 0));
 				return;	/* if TTY_DONT_FLIP is set */
+			}
 		}
 		ch = serial_inp(up, UART_RX);
 		*tty->flip.char_buf_ptr = ch;



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2004-10-08 21:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-10-08 21:02 [PATCH] 8250 receive lockup fix Paul Fulghum

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.