+#ifdef hp300
+ if ((dca->dca_ic & (IC_IR|IC_IE)) != (IC_IR|IC_IE))
+ return (0);
+#endif
+ tp = &dca_tty[unit];
+ while (1) {
+ code = dca->dca_iir;
+#ifdef DEBUG
+ dcaintrcount[code & IIR_IMASK]++;
+#endif
+ switch (code & IIR_IMASK) {
+ case IIR_NOPEND:
+ return (1);
+ case IIR_RXTOUT:
+ case IIR_RXRDY:
+ /* do time-critical read in-line */
+/*
+ * Process a received byte. Inline for speed...
+ */
+#ifdef KGDB
+#define RCVBYTE() \
+ code = dca->dca_data; \
+ if ((tp->t_state & TS_ISOPEN) == 0) { \
+ if (code == FRAME_END && \
+ kgdb_dev == makedev(dcamajor, unit)) \
+ kgdb_connect(0); /* trap into kgdb */ \
+ } else \
+ (*linesw[tp->t_line].l_rint)(code, tp)
+#else
+#define RCVBYTE() \
+ code = dca->dca_data; \
+ if ((tp->t_state & TS_ISOPEN) != 0) \
+ (*linesw[tp->t_line].l_rint)(code, tp)
+#endif
+ RCVBYTE();
+ if (dca_hasfifo & (1 << unit)) {
+#ifdef DEBUG
+ register int fifocnt = 1;
+#endif
+ while ((code = dca->dca_lsr) & LSR_RCV_MASK) {
+ if (code == LSR_RXRDY) {
+ RCVBYTE();
+ } else
+ dcaeint(unit, code, dca);
+#ifdef DEBUG
+ fifocnt++;
+#endif
+ }
+#ifdef DEBUG
+ if (fifocnt > 16)
+ fifoin[0]++;
+ else
+ fifoin[fifocnt]++;
+#endif
+ }
+ if (!iflowdone && (tp->t_cflag&CRTS_IFLOW) &&
+ tp->t_rawq.c_cc > TTYHOG/2) {
+ dca->dca_mcr &= ~MCR_RTS;
+ iflowdone = 1;
+ }
+ break;
+ case IIR_TXRDY:
+ tp->t_state &=~ (TS_BUSY|TS_FLUSH);
+ if (tp->t_line)
+ (*linesw[tp->t_line].l_start)(tp);
+ else
+ dcastart(tp);
+ break;
+ case IIR_RLS:
+ dcaeint(unit, dca->dca_lsr, dca);
+ break;
+ default:
+ if (code & IIR_NOPEND)
+ return (1);
+ log(LOG_WARNING, "dca%d: weird interrupt: 0x%x\n",
+ unit, code);
+ /* fall through */
+ case IIR_MLSC: