- while ((hpaddr->hpds & DRY) == 0) /* shouldn't happen */
- printf("hp dry not set\n");
- if (hpaddr->hpds & ERR || mbastat & MBAEBITS)
- if (++mi->mi_tab.b_errcnt < 28 && (hpaddr->hper1&WLE) == 0) {
- if ((hpaddr->hper1&0xffff) != DCK) {
- hpaddr->hpcs1 = DCLR|GO;
- if ((mi->mi_tab.b_errcnt&07) == 4) {
- hpaddr->hpcs1 = RECAL|GO;
- while (hpaddr->hpds & PIP)
- ;
- mbclrattn(mi);
- }
- return (MBD_RETRY);
- } else if (hpecc(mi))
- return (MBD_RESTARTED);
- } else {
- deverror(bp, mbastat, hpaddr->hper1);
+#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");