- 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);
+ if (hpaddr->hpds&HP_ERR || mbasr&MBAEBITS) {
+ int dready = 0;
+
+ while ((hpaddr->hpds & HP_DRY) == 0) {
+ if (++dready > 32)
+ break;
+ }
+ if ((hpaddr->hpds&HP_DREADY) != HP_DREADY) {
+ printf("hp%d not ready\n", dkunit(bp));
+ bp->b_flags |= B_ERROR;
+ } else if (hpaddr->hper1&HP_WLE) {
+ printf("hp%d is write locked\n", dkunit(bp));
+ bp->b_flags |= B_ERROR;
+ } else if (++mi->mi_tab.b_errcnt > 27 ||
+ mbasr & MBASR_HARD ||
+ hpaddr->hper1 & HPER1_HARD ||
+ hpaddr->hper2 & HPER2_HARD) {
+ harderr(bp);
+ printf("hp%d mbasr=%b er1=%b er2=%b\n",
+ dkunit(bp), mbasr, mbasr_bits,
+ hpaddr->hper1, HPER1_BITS,
+ hpaddr->hper2, HPER2_BITS);