X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/cc7ff771d458d13d0bee7f0a854c955a290c42b8..961945a80c6f995f4567dbce8881af0bbdee211c:/usr/src/sys/vax/uba/rk.c diff --git a/usr/src/sys/vax/uba/rk.c b/usr/src/sys/vax/uba/rk.c index 6db2e20ec0..7f170057ba 100644 --- a/usr/src/sys/vax/uba/rk.c +++ b/usr/src/sys/vax/uba/rk.c @@ -1,4 +1,4 @@ -/* rk.c 4.39 82/03/29 */ +/* rk.c 4.51 82/12/17 */ #include "rk.h" #if NHK > 0 @@ -18,23 +18,25 @@ int rkbdebug; * TODO: * Learn why we lose an interrupt sometime when spinning drives down */ +#include "../machine/pte.h" + #include "../h/param.h" #include "../h/systm.h" #include "../h/buf.h" #include "../h/conf.h" #include "../h/dir.h" #include "../h/user.h" -#include "../h/pte.h" #include "../h/map.h" #include "../h/vm.h" -#include "../h/ubareg.h" -#include "../h/ubavar.h" #include "../h/dk.h" -#include "../h/cpu.h" #include "../h/cmap.h" #include "../h/dkbad.h" +#include "../h/uio.h" -#include "../h/rkreg.h" +#include "../vax/cpu.h" +#include "../vaxuba/ubareg.h" +#include "../vaxuba/ubavar.h" +#include "../vaxuba/rkreg.h" struct rk_softc { int sc_softas; @@ -123,7 +125,7 @@ rkprobe(reg) ((struct rkdevice *)reg)->rkcs1 = RK_CDT|RK_IE|RK_CRDY; DELAY(10); ((struct rkdevice *)reg)->rkcs1 = RK_CDT; - return (1); + return (sizeof (struct rkdevice)); } rkslave(ui, reg) @@ -165,6 +167,17 @@ rkattach(ui) ui->ui_flags = 0; } +rkopen(dev) + dev_t dev; +{ + register int unit = minor(dev) >> 3; + register struct uba_device *ui; + + if (unit >= NRK || (ui = rkdinfo[unit]) == 0 || ui->ui_alive == 0) + return (ENXIO); + return (0); +} + rkstrategy(bp) register struct buf *bp; { @@ -356,7 +369,7 @@ rkdgo(um) { register struct rkdevice *rkaddr = (struct rkdevice *)um->um_addr; - um->um_tab.b_active++; /* should now be 2 */ + 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); } @@ -371,11 +384,11 @@ rkintr(rk11) 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)]; @@ -416,8 +429,13 @@ hard: else #endif goto hard; - } else - um->um_tab.b_active = 0; + } 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; @@ -426,9 +444,6 @@ hard: if (ds&RKDS_DROT || er&(RKER_OPI|RKER_SKI|RKER_UNS) || (um->um_tab.b_errcnt&07) == 4) recal = 1; - if ((er & (RKER_DCK|RKER_ECH)) == RKER_DCK) - if (rkecc(ui, ECC)) - return; rkaddr->rkcs1 = RK_CCLR; rkaddr->rkcs2 = ui->ui_slave; rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_DCLR|RK_GO; @@ -496,7 +511,7 @@ retry: } if (um->um_tab.b_actf && um->um_tab.b_active == 0) rkstart(um); - if (((needie = rkaddr->rkcs1) & RK_IE) == 0) + if (((rkaddr->rkcs1) & RK_IE) == 0) rkaddr->rkcs1 = RK_IE; } @@ -508,26 +523,26 @@ rkwait(addr) ; } -rkread(dev) +rkread(dev, uio) dev_t dev; + struct uio *uio; { register int unit = minor(dev) >> 3; if (unit >= NRK) - u.u_error = ENXIO; - else - physio(rkstrategy, &rrkbuf[unit], dev, B_READ, minphys); + return (ENXIO); + return (physio(rkstrategy, &rrkbuf[unit], dev, B_READ, minphys, uio)); } -rkwrite(dev) +rkwrite(dev, uio) dev_t dev; + struct uio *uio; { register int unit = minor(dev) >> 3; if (unit >= NRK) - u.u_error = ENXIO; - else - physio(rkstrategy, &rrkbuf[unit], dev, B_WRITE, minphys); + return (ENXIO); + return (physio(rkstrategy, &rrkbuf[unit], dev, B_WRITE, minphys, uio)); } rkecc(ui, flag) @@ -559,7 +574,6 @@ rkecc(ui, flag) cn += tn/st->ntrak; tn %= st->ntrak; ubapurge(um); - um->um_tab.b_active = 2; /* Either complete or continuing... */ switch (flag) { case ECC: { @@ -583,8 +597,10 @@ rkecc(ui, flag) i++; bit -= 8; } - if (rk->rkwc == 0) + if (rk->rkwc == 0) { + um->um_tab.b_active = 0; return (0); + } npf++; reg++; break; @@ -619,8 +635,10 @@ rkecc(ui, flag) #endif bp->b_flags &= ~B_BAD; rk->rkwc = -((bp->b_bcount - (int)ptob(npf)) / sizeof (short)); - if (rk->rkwc == 0) - return(0); + if (rk->rkwc == 0) { + um->um_tab.b_active = 0; + return (0); + } break; #endif } @@ -636,6 +654,7 @@ rkecc(ui, flag) cmd |= (ubaddr >> 8) & 0x300; cmd |= rktypes[ui->ui_type]; rk->rkcs1 = cmd; + um->um_tab.b_active = 2; /* continuing */ um->um_tab.b_errcnt = 0; /* error has been corrected */ return (1); } @@ -658,7 +677,7 @@ rkreset(uban) rk_softc[um->um_ctlr].sc_wticks = 0; if (um->um_ubinfo) { printf("<%d>", (um->um_ubinfo>>28)&0xf); - ubadone(um); + um->um_ubinfo = 0; } for (unit = 0; unit < NRK; unit++) { if ((ui = rkdinfo[unit]) == 0)