Skip to contentSkip to conversation

8250 receive lockup fix

PATCH New Paul Fulghum 1 participant 1 message Oct 8, 2004

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 8250 receive lockup fix

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

drivers/serial/8250.c +12 -1
@@ -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;