+ ubapurge(um);
+ switch (flag) {
+ case ECC:
+ {
+ register int i;
+ int bit, byte, mask;
+
+ npf--;
+ reg--;
+ printf("rk%d%c: soft ecc sn%d\n", dkunit(bp),
+ 'a'+(minor(bp->b_dev)&07), bp->b_blkno + npf);
+ mask = rk->rkec2;
+ i = rk->rkec1 - 1; /* -1 makes 0 origin */
+ bit = i&07;
+ i = (i&~07)>>3;
+ byte = i + o;
+ while (i < 512 && (int)ptob(npf)+i < bp->b_bcount && bit > -11) {
+ addr = ptob(ubp->uba_map[reg+btop(byte)].pg_pfnum)+
+ (byte & PGOFSET);
+ putmemc(addr, getmemc(addr)^(mask<<bit));
+ byte++;
+ i++;
+ bit -= 8;
+ }
+ if (rk->rkwc == 0) {
+ um->um_tab.b_active = 0;
+ return (0);
+ }
+ npf++;
+ reg++;
+ break;
+ }
+
+#ifndef NOBADSECT
+ case BSE:
+#ifdef RKBDEBUG
+ if (rkbdebug)
+ printf("rkecc, BSE: bn %d cn %d tn %d sn %d\n", bn, cn, tn, sn);
+#endif
+ if ((bn = isbad(&rkbad[ui->ui_unit], cn, tn, sn)) < 0)
+ return(0);
+ bp->b_flags |= B_BAD;
+ bp->b_error = npf + 1;
+ bn = st->ncyl*st->nspc - st->nsect - 1 - bn;
+ cn = bn/st->nspc;
+ sn = bn%st->nspc;
+ tn = sn/st->nsect;
+ sn %= st->nsect;
+#ifdef RKBDEBUG
+ if (rkbdebug)
+ printf("revector to cn %d tn %d sn %d\n", cn, tn, sn);
+#endif
+ rk->rkwc = -(512 / sizeof (short));
+ break;
+
+ case CONT:
+#ifdef RKBDEBUG
+ if (rkbdebug)
+ printf("rkecc, CONT: bn %d cn %d tn %d sn %d\n", bn,cn,tn,sn);
+#endif
+ bp->b_flags &= ~B_BAD;
+ rk->rkwc = -((bp->b_bcount - (int)ptob(npf)) / sizeof (short));
+ if (rk->rkwc == 0) {
+ um->um_tab.b_active = 0;
+ return (0);
+ }
+ break;
+#endif
+ }
+ rk->rkcs1 = RK_CCLR;
+ rk->rkcs2 = ui->ui_slave;
+ rk->rkcs1 = rktypes[ui->ui_type]|RK_DCLR|RK_GO;
+ rkwait(rk);