- 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 (HPDK_N+unit <= HPDK_NMAX)
- dk_busy &= ~(1<<(HPDK_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;
- else
- hptab.b_active = 0;
- if(hptab.b_errcnt > 27)
- deverror(bp, mbastat, hpaddr->hper1);
- if ((hpaddr->hper1&0xffff) == DCK) {
- if (hpecc(hpaddr, bp))
- return;
- }
- hpaddr->hpcs1 = DCLR|GO;
- if((hptab.b_errcnt&07) == 4) {
- HPMBA->mba_cr &= ~MBAIE;
- hpaddr->hpcs1 = RECAL|GO;
- while(hpaddr->hpds & PIP)
- ;
- HPMBA->mba_cr |= MBAIE;
- }
- }
- if(hptab.b_active) {
- if(hptab.b_errcnt) {
- HPMBA->mba_cr &= ~MBAIE;
- hpaddr->hpcs1 = RTC|GO;
- while(hpaddr->hpds & PIP)
- ;
- HPMBA->mba_cr |= MBAIE;
- }
- hptab.b_active = 0;
- hptab.b_errcnt = 0;
- hptab.b_actf = dp->b_forw;
- dp->b_active = 0;
- dp->b_errcnt = 0;
- dp->b_actf = bp->av_forw;
- bp->b_resid = -HPMBA->mba_bcr & 0xffff;
- iodone(bp);
- if(dp->b_actf)
- hpustart(unit);
+ register struct device *hpaddr = (struct device *)mi->mi_drv;
+ register struct buf *bp = mi->mi_tab.b_actf;
+
+ 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);
+ bp->b_flags |= B_ERROR;