From df4e7d03fc07ab326806de021bcb32662cfde5eb Mon Sep 17 00:00:00 2001 From: mycroft Date: Sun, 4 Jul 2004 08:09:03 +0000 Subject: 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. --- sys/dev/ic/com.c | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) (limited to 'sys/dev') 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 -__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); } -- cgit