- register struct buf *bp, *dp;
- register unit;
- register struct device *hpaddr;
-
- if(hptab.b_active) {
- dp = hptab.b_actf;
- bp = dp->b_actf;
- unit = dkunit(bp);
- if (DK_N+unit <= DK_NMAX)
- dk_busy &= ~(1<<(DK_N+unit));
- hpaddr = mbadev(HPMBA, unit);
- if (hpaddr->hpds & ERR || mbastat & MBAEBITS) {
- while((hpaddr->hpds & DRY) == 0)
- ;
- if(++hptab.b_errcnt > 28 || hpaddr->hper1&WLE)
- bp->b_flags |= B_ERROR;
+ register struct hpdevice *hpaddr = (struct hpdevice *)mi->mi_drv;
+ register struct buf *bp = mi->mi_tab.b_actf;
+ int retry = 0;
+
+#ifndef NOBADSECT
+ if (bp->b_flags&B_BAD) {
+ if (hpecc(mi, CONT))
+ return(MBD_RESTARTED);
+ }
+#endif
+ if (hpaddr->hpds&HPDS_ERR || mbsr&MBSR_EBITS) {
+#ifdef HPDEBUG
+ if (hpdebug) {
+ int dc = hpaddr->hpdc, da = hpaddr->hpda;
+
+ printf("hperr: bp %x cyl %d blk %d as %o ",
+ bp, bp->b_cylin, bp->b_blkno,
+ hpaddr->hpas&0xff);
+ printf("dc %x da %x\n",dc&0xffff, da&0xffff);
+ printf("errcnt %d ", mi->mi_tab.b_errcnt);
+ printf("mbsr=%b ", mbsr, mbsr_bits);
+ printf("er1=%b er2=%b\n",
+ hpaddr->hper1, HPER1_BITS,
+ hpaddr->hper2, HPER2_BITS);
+ DELAY(1000000);
+ }
+#endif
+ if (hpaddr->hper1&HPER1_WLE) {
+ printf("hp%d: write locked\n", dkunit(bp));
+ bp->b_flags |= B_ERROR;
+ } else if (++mi->mi_tab.b_errcnt > 27 ||
+ mbsr & MBSR_HARD ||
+ hpaddr->hper1 & HPER1_HARD ||
+ hpaddr->hper2 & HPER2_HARD) {
+hard:
+ harderr(bp, "hp");
+ if (mbsr & (MBSR_EBITS &~ (MBSR_DTABT|MBSR_MBEXC)))
+ printf("mbsr=%b ", mbsr, mbsr_bits);
+ printf("er1=%b er2=%b",
+ hpaddr->hper1, HPER1_BITS,
+ hpaddr->hper2, HPER2_BITS);
+ if (hpaddr->hpmr)
+ printf(" mr=%o", hpaddr->hpmr&0xffff);
+ if (hpaddr->hpmr2)
+ printf(" mr2=%o", hpaddr->hpmr2&0xffff);
+ printf("\n");
+ bp->b_flags |= B_ERROR;
+ hprecal[mi->mi_unit] = 0;
+ } else if (hpaddr->hper2 & HPER2_BSE) {
+#ifndef NOBADSECT
+ if (hpecc(mi, BSE))
+ return(MBD_RESTARTED);