- 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);
+ printf(" (came back!)\n");
+ }
+nosval:
+ rkaddr->rkcyl = bp->b_cylin;
+ rkcyl[ui->ui_unit] = bp->b_cylin;
+ rkaddr->rkda = (tn << 8) + sn;
+ rkaddr->rkwc = -bp->b_bcount / sizeof (short);
+ if (bp->b_flags & B_READ)
+ cmd = rktypes[ui->ui_type]|RK_IE|RK_READ|RK_GO;
+ else
+ cmd = rktypes[ui->ui_type]|RK_IE|RK_WRITE|RK_GO;
+ um->um_cmd = cmd;
+ (void) ubago(ui);
+}
+
+rkdgo(um)
+ register struct uba_ctlr *um;
+{
+ register struct rkdevice *rkaddr = (struct rkdevice *)um->um_addr;
+
+ um->um_tab.b_active = 2; /* should now be 2 */
+ rkaddr->rkba = um->um_ubinfo;
+ rkaddr->rkcs1 = um->um_cmd|((um->um_ubinfo>>8)&0x300);
+}
+
+rkintr(rk11)
+ int rk11;
+{
+ register struct uba_ctlr *um = rkminfo[rk11];
+ register struct uba_device *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 == 2 || sc->sc_recal) {
+ um->um_tab.b_active = 1;
+ dp = um->um_tab.b_actf;
+ bp = dp->b_actf;
+ ui = rkdinfo[dkunit(bp)];
+ dk_busy &= ~(1 << ui->ui_dk);
+#ifndef NOBADSECT
+ if (bp->b_flags&B_BAD)
+ if (rkecc(ui, CONT))
+ return;
+#endif
+ if (rkaddr->rkcs1 & RK_CERR) {
+ int recal;
+ u_short ds = rkaddr->rkds;
+ u_short cs2 = rkaddr->rkcs2;
+ u_short er = rkaddr->rker;
+#ifdef RKDEBUG
+ if (rkdebug) {
+ printf("cs2=%b ds=%b er=%b\n",
+ cs2, RKCS2_BITS, ds,
+ RKDS_BITS, er, RKER_BITS);
+ }
+#endif
+ if (er & RKER_WLE) {
+ printf("rk%d: write locked\n", dkunit(bp));
+ bp->b_flags |= B_ERROR;
+ } else if (++um->um_tab.b_errcnt > 28 ||
+ ds&RKDS_HARD || er&RKER_HARD || cs2&RKCS2_HARD) {
+hard:
+ harderr(bp, "rk");
+ printf("cs2=%b ds=%b er=%b\n",
+ cs2, RKCS2_BITS, ds,
+ RKDS_BITS, er, RKER_BITS);
+ bp->b_flags |= B_ERROR;
+ sc->sc_recal = 0;
+ } else if (er & RKER_BSE) {
+#ifndef NOBADSECT
+ if (rkecc(ui, BSE))
+ return;
+ else
+#endif
+ goto hard;
+ } else {
+ if ((er & (RKER_DCK|RKER_ECH)) == RKER_DCK) {
+ if (rkecc(ui, ECC))
+ return;
+ } else
+ um->um_tab.b_active = 0;
+ }
+ if (cs2&RKCS2_MDS) {
+ rkaddr->rkcs2 = RKCS2_SCLR;
+ goto retry;
+ }
+ recal = 0;
+ if (ds&RKDS_DROT || er&(RKER_OPI|RKER_SKI|RKER_UNS) ||
+ (um->um_tab.b_errcnt&07) == 4)
+ recal = 1;
+ rkaddr->rkcs1 = RK_CCLR;
+ rkaddr->rkcs2 = ui->ui_slave;
+ rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_DCLR|RK_GO;
+ rkwait(rkaddr);
+ if (recal && um->um_tab.b_active == 0) {
+ rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_IE|RK_RECAL|RK_GO;
+ rkcyl[ui->ui_unit] = -1;
+ sc->sc_recal = 0;
+ goto nextrecal;