+ case EVCMD_READ:
+ /*
+ * Process received data.
+ */
+ if ((tp->t_state & TS_ISOPEN) == 0) {
+ wakeup((caddr_t)&tp->t_rawq);
+ break;
+ }
+ if ((cc = ev->ev_count) == 0)
+ break;
+ cp = ms->ms_cbuf[port][mp->mp_nextrcv];
+ mppurge(cp, CBSIZE);
+ while (cc-- > 0) {
+ /*
+ * A null character is inserted,
+ * potentially when a break or framing
+ * error occurs. If we're not in raw
+ * mode, substitute the interrupt
+ * character.
+ */
+ if (*cp == 0 &&
+ (ev->ev_error == BRKASRT ||
+ ev->ev_error == FRAMERR))
+ if ((tp->t_flags&RAW) == 0)
+ *cp = tp->t_intrc;
+ (*linesw[tp->t_line].l_rint)(*cp++, tp);
+ }
+ /* setup for next read */
+ ptr = (caddr_t)&mp_softc[unit].ms_cbuf[port][mp->mp_nextrcv][0];
+ ev->ev_un.rcvblk = (u_char *)kvtophys(ptr);
+ ev->ev_params = (caddr_t) kvtophys(ptr);
+ switch(ev->ev_error) {
+ case RCVDTA:
+ /* Normal (good) rcv data do not
+ * report the following they are
+ * "normal" errors
+ */
+ case FRAMERR:
+ /* frame error */
+ case BRKASRT:
+ /* Break condition */
+ case PARERR:
+ /* parity error */
+ rcverr = (char *)0;
+ break;
+ case OVRNERR:
+ /* Overrun error */
+ rcverr = "overrun error";
+ break;
+ case OVFERR:
+ /* Overflow error */
+ rcverr = "overflow error";
+ break;
+ default:
+ rcverr = "undefined rcv error";
+ break;
+ }
+ if (rcverr != (char *)0)
+ mplog(unit, port, rcverr,
+ (int)ev->ev_error);