Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Apr 2009 12:04:03 +0000 (UTC)
From:      Takahashi Yoshihiro <nyan@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r190916 - user/nyan/pc98/sys/dev/uart
Message-ID:  <200904111204.n3BC43O7085564@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nyan
Date: Sat Apr 11 12:04:03 2009
New Revision: 190916
URL: http://svn.freebsd.org/changeset/base/190916

Log:
  MFH: revision 190834
  
    Fix hangs.

Modified:
  user/nyan/pc98/sys/dev/uart/uart_dev_i8251.c

Modified: user/nyan/pc98/sys/dev/uart/uart_dev_i8251.c
==============================================================================
--- user/nyan/pc98/sys/dev/uart/uart_dev_i8251.c	Sat Apr 11 10:37:04 2009	(r190915)
+++ user/nyan/pc98/sys/dev/uart/uart_dev_i8251.c	Sat Apr 11 12:04:03 2009	(r190916)
@@ -351,15 +351,17 @@ i8251_set_icr(struct uart_bas *bas, u_in
 static void
 i8251_clrint(struct uart_bas *bas)
 {
-	u_int8_t iir;
+	u_int8_t iir, lsr;
 
 	if (GET_SUBTYPE(bas) & COM_SUB_I8251F) {
 		iir = uart_getreg(bas, serf_iir);
 		while ((iir & IIR_NOPEND) == 0) {
 			iir &= IIR_IMASK;
-			if (iir == IIR_RLS)
-				(void)uart_getreg(bas, serf_lsr);
-			else if (iir == IIR_RXRDY || iir == IIR_RXTOUT)
+			if (iir == IIR_RLS) {
+				lsr = uart_getreg(bas, serf_lsr);
+				if (lsr & (FLSR_BI | FLSR_PE))
+					(void)uart_getreg(bas, serf_data);
+			} else if (iir == IIR_RXRDY || iir == IIR_RXTOUT)
 				(void)uart_getreg(bas, serf_data);
 			else if (iir == IIR_MLSC)
 				(void)uart_getreg(bas, serf_msr);
@@ -1052,7 +1054,8 @@ i8251_bus_ipend(struct uart_softc *sc)
 		if ((lsr & STS8251_TxRDY) && sc->sc_txbusy)
 			ipend |= SER_INT_TXIDLE;
 	}
-
+	if (ipend == 0)
+		i8251_clrint(bas);
 	uart_unlock(sc->sc_hwmtx);
 
 	return ((sc->sc_leaving) ? 0 : ipend);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904111204.n3BC43O7085564>