projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sun merge
[unix-history]
/
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
aa6fefe
..
7f17005
100644
(file)
--- a/
usr/src/sys/vax/uba/rk.c
+++ b/
usr/src/sys/vax/uba/rk.c
@@
-1,4
+1,4
@@
-/* rk.c 4.
41 82/05/19
*/
+/* rk.c 4.
51 82/12/17
*/
#include "rk.h"
#if NHK > 0
#include "rk.h"
#if NHK > 0
@@
-18,23
+18,25
@@
int rkbdebug;
* TODO:
* Learn why we lose an interrupt sometime when spinning drives down
*/
* 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/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/map.h"
#include "../h/vm.h"
-#include "../h/ubareg.h"
-#include "../h/ubavar.h"
#include "../h/dk.h"
#include "../h/dk.h"
-#include "../h/cpu.h"
#include "../h/cmap.h"
#include "../h/dkbad.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;
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;
((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)
}
rkslave(ui, reg)
@@
-165,6
+167,17
@@
rkattach(ui)
ui->ui_flags = 0;
}
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;
{
rkstrategy(bp)
register struct buf *bp;
{
@@
-356,7
+369,7
@@
rkdgo(um)
{
register struct rkdevice *rkaddr = (struct rkdevice *)um->um_addr;
{
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);
}
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 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) {
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)];
dp = um->um_tab.b_actf;
bp = dp->b_actf;
ui = rkdinfo[dkunit(bp)];
@@
-416,8
+429,13
@@
hard:
else
#endif
goto 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;
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 (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;
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 (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;
}
rkaddr->rkcs1 = RK_IE;
}
@@
-508,26
+523,26
@@
rkwait(addr)
;
}
;
}
-rkread(dev)
+rkread(dev
, uio
)
dev_t dev;
dev_t dev;
+ struct uio *uio;
{
register int unit = minor(dev) >> 3;
if (unit >= NRK)
{
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;
dev_t dev;
+ struct uio *uio;
{
register int unit = minor(dev) >> 3;
if (unit >= NRK)
{
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)
}
rkecc(ui, flag)
@@
-559,7
+574,6
@@
rkecc(ui, flag)
cn += tn/st->ntrak;
tn %= st->ntrak;
ubapurge(um);
cn += tn/st->ntrak;
tn %= st->ntrak;
ubapurge(um);
- um->um_tab.b_active = 2; /* Either complete or continuing... */
switch (flag) {
case ECC:
{
switch (flag) {
case ECC:
{
@@
-583,8
+597,10
@@
rkecc(ui, flag)
i++;
bit -= 8;
}
i++;
bit -= 8;
}
- if (rk->rkwc == 0)
+ if (rk->rkwc == 0) {
+ um->um_tab.b_active = 0;
return (0);
return (0);
+ }
npf++;
reg++;
break;
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));
#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
}
break;
#endif
}
@@
-636,6
+654,7
@@
rkecc(ui, flag)
cmd |= (ubaddr >> 8) & 0x300;
cmd |= rktypes[ui->ui_type];
rk->rkcs1 = cmd;
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);
}
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);
rk_softc[um->um_ctlr].sc_wticks = 0;
if (um->um_ubinfo) {
printf("<%d>", (um->um_ubinfo>>28)&0xf);
- u
badone(um)
;
+ u
m->um_ubinfo = 0
;
}
for (unit = 0; unit < NRK; unit++) {
if ((ui = rkdinfo[unit]) == 0)
}
for (unit = 0; unit < NRK; unit++) {
if ((ui = rkdinfo[unit]) == 0)