+ register struct htdevice *htaddr = (struct htdevice *)mi->mi_drv;
+ register struct buf *bp = mi->mi_tab.b_actf;
+ register struct tu_softc *sc;
+ int ds, er, mbs;
+
+ sc = &tu_softc[TUUNIT(bp->b_dev)];
+ ds = sc->sc_dsreg = MASKREG(htaddr->htds);
+ er = sc->sc_erreg = MASKREG(htaddr->hter);
+ sc->sc_resid = MASKREG(htaddr->htfc);
+ mbs = mbsr;
+ sc->sc_blkno++;
+ if((bp->b_flags & B_READ) == 0)
+ sc->sc_flags |= H_WRITTEN;
+ if ((ds&(HTDS_ERR|HTDS_MOL)) != HTDS_MOL || mbs & MBSR_EBITS) {
+ htaddr->htcs1 = HT_DCLR|HT_GO;
+ mbclrattn(mi);
+ if (bp == &rhtbuf[HTUNIT(bp->b_dev)]) {
+ er &= ~HTER_FCE;
+ mbs &= ~(MBSR_DTABT|MBSR_MBEXC);
+ }
+ if (bp->b_flags & B_READ && ds & HTDS_PES)
+ er &= ~(HTER_CSITM|HTER_CORCRC);
+ if (er&HTER_HARD || mbs&MBSR_EBITS || (ds&HTDS_MOL) == 0 ||
+ er && ++mi->mi_tab.b_errcnt >= 7) {
+ if ((ds & HTDS_MOL) == 0 && sc->sc_openf > 0)
+ sc->sc_openf = -1;
+ if ((er&HTER_HARD) == HTER_FCE &&
+ (mbs&MBSR_EBITS) == (MBSR_DTABT|MBSR_MBEXC) &&
+ (ds&HTDS_MOL))
+ goto noprint;
+ printf("tu%d: hard error bn%d mbsr=%b er=%b ds=%b\n",
+ TUUNIT(bp->b_dev), bp->b_blkno,
+ mbsr, mbsr_bits,
+ sc->sc_erreg, hter_bits,
+ sc->sc_dsreg, htds_bits);
+noprint:
+ bp->b_flags |= B_ERROR;
+ return (MBD_DONE);
+ }
+ if (er)
+ return (MBD_RETRY);
+ }
+ bp->b_resid = 0;
+ if (bp->b_flags & B_READ)
+ if (ds&HTDS_TM) { /* must be a read, right? */
+ bp->b_resid = bp->b_bcount;
+ sc->sc_nxrec = dbtofsb(bp->b_blkno);
+ } else if(bp->b_bcount > MASKREG(htaddr->htfc))
+ bp->b_resid = bp->b_bcount - MASKREG(htaddr->htfc);
+ return (MBD_DONE);
+}