*** com.c.orig Mon Dec 15 18:29:15 1997 --- com.c Mon Dec 15 20:05:37 1997 *************** *** 221,240 **** --- 221,243 ---- err = divrnd(((quad_t)frequency) * 1000 / 16, speed * x) - 1000; if (err < 0) err = -err; if (err > COM_TOLERANCE) return (-1); return (x); #undef divrnd(n, q) } + /* XXX ryo */ + #define COM_SHARP_321S_FIX + #ifdef COM_DEBUG int com_debug = 0; void comstatus __P((struct com_softc *, char *)); void comstatus(sc, str) struct com_softc *sc; char *str; { struct tty *tp = sc->sc_tty; *************** *** 1261,1292 **** } SET(tp->t_state, TS_BUSY); sc->sc_tx_busy = 1; /* Enable transmit completion interrupts if necessary. */ if (!ISSET(sc->sc_ier, IER_ETXRDY)) { SET(sc->sc_ier, IER_ETXRDY); bus_space_write_1(iot, ioh, com_ier, sc->sc_ier); } - /* Output the first chunk of the contiguous buffer. */ { int n; n = sc->sc_tbc; if (n > sc->sc_fifolen) n = sc->sc_fifolen; bus_space_write_multi_1(iot, ioh, com_data, sc->sc_tba, n); sc->sc_tbc -= n; sc->sc_tba += n; } out: splx(s); return; } /* * Stop output on a line. */ void comstop(tp, flag) --- 1264,1300 ---- } SET(tp->t_state, TS_BUSY); sc->sc_tx_busy = 1; /* Enable transmit completion interrupts if necessary. */ if (!ISSET(sc->sc_ier, IER_ETXRDY)) { SET(sc->sc_ier, IER_ETXRDY); bus_space_write_1(iot, ioh, com_ier, sc->sc_ier); } /* Output the first chunk of the contiguous buffer. */ { int n; n = sc->sc_tbc; if (n > sc->sc_fifolen) n = sc->sc_fifolen; bus_space_write_multi_1(iot, ioh, com_data, sc->sc_tba, n); sc->sc_tbc -= n; sc->sc_tba += n; } + + #ifdef COM_SHARP_321S_FIX + bus_space_write_1( iot, ioh, com_ier, + bus_space_read_1(iot, ioh, com_ier) | IER_ETXRDY ); + #endif + out: splx(s); return; } /* * Stop output on a line. */ void comstop(tp, flag) *************** *** 1613,1635 **** --- 1621,1649 ---- * until the queue has drained a bit. */ if (!cc) { SET(sc->sc_rx_flags, RX_IBUF_OVERFLOWED); CLR(sc->sc_ier, IER_ERXRDY); bus_space_write_1(iot, ioh, com_ier, sc->sc_ier); } } else { if ((iir & IIR_IMASK) == IIR_RXRDY) { bus_space_write_1(iot, ioh, com_ier, 0); + delay(10); bus_space_write_1(iot, ioh, com_ier,sc->sc_ier); iir = IIR_NOPEND; + #ifdef COM_SHARP_321S_FIX + if (ISSET(lsr, LSR_TXRDY)) { + break; + } + #endif continue; } } msr = bus_space_read_1(iot, ioh, com_msr); delta = msr ^ sc->sc_msr; sc->sc_msr = msr; if (ISSET(delta, sc->sc_msr_mask)) { SET(sc->sc_msr_delta, delta); *************** *** 1641,1660 **** --- 1655,1680 ---- sc->sc_tbc = 0; sc->sc_heldtbc = 0; #ifdef COM_DEBUG if (com_debug) comstatus(sc, "comintr "); #endif } sc->sc_st_check = 1; } + + #ifdef COM_SHARP_321S_FIX + if (ISSET(lsr, LSR_TXRDY)) { + break; + } + #endif } while (!ISSET((iir = bus_space_read_1(iot, ioh, com_iir)), IIR_NOPEND)); /* * Done handling any receive interrupts. See if data can be * transmitted as well. Schedule tx done event if no data left * and tty was marked busy. */ if (ISSET(lsr, LSR_TXRDY)) { /* * If we've delayed a parameter change, do it now, and restart