summaryrefslogtreecommitdiff
path: root/sys/dev/ic/com.c
diff options
context:
space:
mode:
authormycroft <mycroft@NetBSD.org>2004-07-04 08:09:03 +0000
committermycroft <mycroft@NetBSD.org>2004-07-04 08:09:03 +0000
commitdf4e7d03fc07ab326806de021bcb32662cfde5eb (patch)
tree1eabbb1d4e0d972bf352eadf72627aa65fc185fa /sys/dev/ic/com.c
parentf2c2db34e81b509bc94821f65f635e81fc6a580a (diff)
Incorporate 4 changes that have been suggested:
* At high speed, set the FIFO trigger to the maximum value to reduce interrupt load. PR 15448. * Handler the case of IIR=RXRDY and LSR=!LSR_RCV_MASK differently, to avoid a hang with some chips. PR 21184, and possibly PR 10974 and PR 8248. * Remove the extra wait at the end of com_common_putc(), after writing a character out, so that we get another TXRDY interrupt. This prevents stalls when normal output and kernel output are mixed. PR 4263. * Do not "preload" the TX FIFO; wait for a TXRDY interrupt to come in after enabling it.
Diffstat (limited to 'sys/dev/ic/com.c')
-rw-r--r--sys/dev/ic/com.c35
1 files changed, 9 insertions, 26 deletions
diff --git a/sys/dev/ic/com.c b/sys/dev/ic/com.c
index d2cfa5ce504..2f36c212e23 100644
--- a/sys/dev/ic/com.c
+++ b/sys/dev/ic/com.c
@@ -1,7 +1,7 @@
-/* $NetBSD: com.c,v 1.227 2004/05/01 19:03:59 thorpej Exp $ */
+/* $NetBSD: com.c,v 1.228 2004/07/04 08:09:03 mycroft Exp $ */
/*-
- * Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
+ * Copyright (c) 1998, 1999, 2004 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -73,7 +73,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.227 2004/05/01 19:03:59 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.228 2004/07/04 08:09:03 mycroft Exp $");
#include "opt_com.h"
#include "opt_ddb.h"
@@ -1346,13 +1346,7 @@ com_to_tiocm(struct com_softc *sc)
if (ISSET(combits, MSR_RI | MSR_TERI))
SET(ttybits, TIOCM_RI);
-#ifdef COM_PXA2X0
- if (sc->sc_type == COM_TYPE_PXA2x0) {
- if ((sc->sc_ier & 0x0f) != 0)
- SET(ttybits, TIOCM_LE);
- } else
-#endif
- if ((sc->sc_ier & 0xbf) != 0)
+ if (ISSET(sc->sc_ier, IER_ERXRDY | IER_ETXRDY | IER_ERLS | IER_EMSC))
SET(ttybits, TIOCM_LE);
return (ttybits);
@@ -1519,7 +1513,7 @@ comparam(struct tty *tp, struct termios *t)
else if (ISSET(sc->sc_hwflags, COM_HW_FIFO))
sc->sc_fifo = FIFO_ENABLE |
(t->c_ospeed <= 1200 ? FIFO_TRIGGER_1 :
- t->c_ospeed <= 38400 ? FIFO_TRIGGER_8 : FIFO_TRIGGER_4);
+ t->c_ospeed <= 38400 ? FIFO_TRIGGER_8 : FIFO_TRIGGER_14);
else
sc->sc_fifo = 0;
@@ -1757,6 +1751,7 @@ comstart(struct tty *tp)
bus_space_write_1(iot, ioh, com_ier, sc->sc_ier);
}
+#if 0
/* Output the first chunk of the contiguous buffer. */
if (!ISSET(sc->sc_hwflags, COM_HW_NO_TXPRELOAD)) {
u_int n;
@@ -1768,6 +1763,7 @@ comstart(struct tty *tp)
sc->sc_tbc -= n;
sc->sc_tba += n;
}
+#endif
COM_UNLOCK(sc);
out:
splx(s);
@@ -2150,16 +2146,8 @@ again: do {
sc->sc_ier);
}
} else {
- if ((iir & IIR_IMASK) == IIR_RXRDY) {
-#ifdef COM_PXA2X0
- if (sc->sc_type == COM_TYPE_PXA2x0)
- bus_space_write_1(iot, ioh, com_ier,
- IER_EUART);
- else
-#endif
- bus_space_write_1(iot, ioh, com_ier, 0);
- delay(10);
- bus_space_write_1(iot, ioh, com_ier,sc->sc_ier);
+ if ((iir & (IIR_RXRDY|IIR_TXRDY)) == IIR_RXRDY) {
+ (void) bus_space_read_1(iot, ioh, com_data);
continue;
}
}
@@ -2390,11 +2378,6 @@ com_common_putc(dev_t dev, bus_space_tag_t iot, bus_space_handle_t ioh, int c)
bus_space_write_1(iot, ioh, com_data, c);
COM_BARRIER(iot, ioh, BR | BW);
- /* wait for this transmission to complete */
- timo = 1500000;
- while (!ISSET(bus_space_read_1(iot, ioh, com_lsr), LSR_TXRDY) && --timo)
- continue;
-
splx(s);
}