- register struct buf *bp;
- register d, x;
- register struct device *rkaddr = RKADDR;
- int ds, er;
-
- if (rktab.b_active == NULL)
- return;
- dk_busy &= ~(1<<RKDK_N);
- bp = rktab.b_actf;
- rktab.b_active = NULL;
- if (rkaddr->rkcs1 < 0) { /* error bit */
- d = (minor(bp->b_dev)>>3);
- x = 1;
- if (rkaddr->rkcs1&DI) {
- printf("rkintr: DI\n");
- }
- if (rkaddr->rkds&CDA)
- printf("rkintr: CDA\n");
- if ((rkaddr->rkds&CDA) || (rkaddr->rkcs1&DI)) {
- er = (unsigned short)rkaddr->rker;
- ds = (unsigned short)rkaddr->rkds;
- rkaddr->rkcs1 = CDT | DCLR | GO;
- } else {
- if ((rkaddr->rkds&SVAL)==0) {
- x = 0x8000 - rkselect(rkaddr, d);
- printf("rkintr: no SVAL, delay %d\n", x);
+ register struct rkdevice *rkaddr = (struct rkdevice *)um->um_addr;
+
+ rkaddr->rkba = um->um_ubinfo;
+ rkaddr->rkcs1 = um->um_cmd|((um->um_ubinfo>>8)&0x300);
+}
+
+hkintr(rk11)
+ int rk11;
+{
+ register struct uba_minfo *um = rkminfo[rk11];
+ register struct uba_dinfo *ui;
+ register struct rkdevice *rkaddr = (struct rkdevice *)um->um_addr;
+ register struct buf *bp, *dp;
+ int unit;
+ struct rk_softc *sc = &rk_softc[um->um_ctlr];
+ int as = (rkaddr->rkatt >> 8) | sc->sc_softas;
+ int needie = 1;
+
+ sc->sc_wticks = 0;
+ sc->sc_softas = 0;
+ if (um->um_tab.b_active) {
+ dp = um->um_tab.b_actf;
+ bp = dp->b_actf;
+ ui = rkdinfo[dkunit(bp)];
+ dk_busy &= ~(1 << ui->ui_dk);
+ if (rkaddr->rkcs1 & RK_CERR) {
+ int recal;
+ u_short ds = rkaddr->rkds;
+ u_short cs2 = rkaddr->rkcs2;
+ u_short er = rkaddr->rker;
+ if (sc->sc_recal)
+ printf("recal CERR\n");
+ rkerrs++;
+ if (rkflags&1)
+ printf("%d ds %o cs2 %o er %o\n", um->um_tab.b_errcnt,
+ ds, cs2, er);
+ if (er & RK_WLE)
+ printf("rk%d is write locked\n", dkunit(bp));
+ if (ds & RKDS_HARD)
+ printf("rk%d is down\n", dkunit(bp));
+ if (++um->um_tab.b_errcnt > 28 ||
+ ds&RKDS_HARD || er&RKER_HARD || cs2&RKCS2_HARD)
+ bp->b_flags |= B_ERROR;
+ else
+ um->um_tab.b_active = 0;
+ if (um->um_tab.b_errcnt > 27)
+ deverror(bp, cs2, (ds<<8)|er);
+ if (cs2&RK_MDS) {
+ rkaddr->rkcs2 = RK_SCLR;
+ goto retry;
+ }
+ recal = 0;
+ if (ds&RK_DROT || er&(RK_OPI|RK_SKI|RK_UNS) ||
+ (um->um_tab.b_errcnt&07) == 4)
+ recal = 1;
+ if ((er & (RK_DCK|RK_ECH)) == RK_DCK)
+ if (rkecc(ui))
+ return;
+ rkaddr->rkcs1 = RK_CDT|RK_CCLR;
+ rkaddr->rkcs2 = ui->ui_slave;
+ rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
+ rkwait(rkaddr);
+ if (recal && um->um_tab.b_active == 0) {
+ rkaddr->rkcs1 = RK_CDT|RK_IE|RK_RECAL|RK_GO;
+ rkcyl[ui->ui_unit] = -1;
+ rkwait(rkaddr);
+ um->um_tab.b_active = 1;
+ sc->sc_recal = 1;
+ return;