SCCS-vsn: sys/vax/uba/up.c 4.44
SCCS-vsn: sys/vax/uba/rk.c 4.39
SCCS-vsn: sys/vax/uba/uba.c 4.41
-/* rk.c 4.38 82/01/17 */
+/* rk.c 4.39 82/03/29 */
#include "rk.h"
#if NHK > 0
#include "rk.h"
#if NHK > 0
register struct buf *bp, *dp;
register struct uba_ctlr *um;
register struct rkdevice *rkaddr;
register struct buf *bp, *dp;
register struct uba_ctlr *um;
register struct rkdevice *rkaddr;
dk_busy &= ~(1<<ui->ui_dk);
dp = &rkutab[ui->ui_unit];
um = ui->ui_mi;
rkaddr = (struct rkdevice *)um->um_addr;
if (um->um_tab.b_active) {
rk_softc[um->um_ctlr].sc_softas |= 1<<ui->ui_slave;
dk_busy &= ~(1<<ui->ui_dk);
dp = &rkutab[ui->ui_unit];
um = ui->ui_mi;
rkaddr = (struct rkdevice *)um->um_addr;
if (um->um_tab.b_active) {
rk_softc[um->um_ctlr].sc_softas |= 1<<ui->ui_slave;
+ if ((bp = dp->b_actf) == NULL)
+ return;
rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_CERR;
rkaddr->rkcs2 = ui->ui_slave;
rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_DCLR|RK_GO;
rkwait(rkaddr);
rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_CERR;
rkaddr->rkcs2 = ui->ui_slave;
rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_DCLR|RK_GO;
rkwait(rkaddr);
- if ((bp = dp->b_actf) == NULL) {
- rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_DCLR|RK_GO;
- rkwait(rkaddr);
- return (0);
- }
if ((rkaddr->rkds & RKDS_VV) == 0 || ui->ui_flags == 0) {
/* SHOULD WARN SYSTEM THAT THIS HAPPENED */
#ifndef NOBADSECT
if ((rkaddr->rkds & RKDS_VV) == 0 || ui->ui_flags == 0) {
/* SHOULD WARN SYSTEM THAT THIS HAPPENED */
#ifndef NOBADSECT
rkaddr->rkcyl = bp->b_cylin;
rkcyl[ui->ui_unit] = bp->b_cylin;
rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_IE|RK_SEEK|RK_GO;
rkaddr->rkcyl = bp->b_cylin;
rkcyl[ui->ui_unit] = bp->b_cylin;
rkaddr->rkcs1 = rktypes[ui->ui_type]|RK_IE|RK_SEEK|RK_GO;
if (ui->ui_dk >= 0) {
dk_busy |= 1<<ui->ui_dk;
dk_seek[ui->ui_dk]++;
if (ui->ui_dk >= 0) {
dk_busy |= 1<<ui->ui_dk;
dk_seek[ui->ui_dk]++;
loop:
if ((dp = um->um_tab.b_actf) == NULL)
loop:
if ((dp = um->um_tab.b_actf) == NULL)
if ((bp = dp->b_actf) == NULL) {
um->um_tab.b_actf = dp->b_forw;
goto loop;
if ((bp = dp->b_actf) == NULL) {
um->um_tab.b_actf = dp->b_forw;
goto loop;
cmd = rktypes[ui->ui_type]|RK_IE|RK_WRITE|RK_GO;
um->um_cmd = cmd;
(void) ubago(ui);
cmd = rktypes[ui->ui_type]|RK_IE|RK_WRITE|RK_GO;
um->um_cmd = cmd;
(void) ubago(ui);
{
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 */
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);
}
sc->sc_wticks = 0;
sc->sc_softas = 0;
sc->sc_wticks = 0;
sc->sc_softas = 0;
- if (um->um_tab.b_active) {
+ if (um->um_tab.b_active == 2 || sc->sc_recal) {
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)];
bp->b_resid = -rkaddr->rkwc * sizeof(short);
iodone(bp);
if (dp->b_actf)
bp->b_resid = -rkaddr->rkwc * sizeof(short);
iodone(bp);
if (dp->b_actf)
- if (rkustart(ui))
- needie = 0;
}
as &= ~(1<<ui->ui_slave);
}
}
as &= ~(1<<ui->ui_slave);
}
if (as & 1) {
ui = rkip[rk11][unit];
if (ui) {
if (as & 1) {
ui = rkip[rk11][unit];
if (ui) {
- if (rkustart(rkip[rk11][unit]))
- needie = 0;
+ rkustart(rkip[rk11][unit]);
} else {
rkaddr->rkcs1 = RK_CCLR;
rkaddr->rkcs2 = unit;
} else {
rkaddr->rkcs1 = RK_CCLR;
rkaddr->rkcs2 = unit;
}
}
if (um->um_tab.b_actf && um->um_tab.b_active == 0)
}
}
if (um->um_tab.b_actf && um->um_tab.b_active == 0)
- if (rkstart(um))
- needie = 0;
- if (needie)
+ rkstart(um);
+ if (((needie = rkaddr->rkcs1) & RK_IE) == 0)
cn += tn/st->ntrak;
tn %= st->ntrak;
ubapurge(um);
cn += tn/st->ntrak;
tn %= st->ntrak;
ubapurge(um);
- um->um_tab.b_active++; /* Either complete or continuing... */
+ um->um_tab.b_active = 2; /* Either complete or continuing... */
switch (flag) {
case ECC:
{
switch (flag) {
case ECC:
{
um->um_tab.b_active = 0;
um->um_tab.b_actf = um->um_tab.b_actl = 0;
rk_softc[um->um_ctlr].sc_recal = 0;
um->um_tab.b_active = 0;
um->um_tab.b_actf = um->um_tab.b_actl = 0;
rk_softc[um->um_ctlr].sc_recal = 0;
+ rk_softc[um->um_ctlr].sc_wticks = 0;
if (um->um_ubinfo) {
printf("<%d>", (um->um_ubinfo>>28)&0xf);
ubadone(um);
if (um->um_ubinfo) {
printf("<%d>", (um->um_ubinfo>>28)&0xf);
ubadone(um);
-/* uba.c 4.40 82/03/14 */
+/* uba.c 4.41 82/03/29 */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
if (ui->ui_dk >= 0) {
unit = ui->ui_dk;
dk_busy |= 1<<unit;
if (ui->ui_dk >= 0) {
unit = ui->ui_dk;
dk_busy |= 1<<unit;
+ dk_xfer[unit]++;
+ dk_wds[unit] += um->um_tab.b_actf->b_actf->b_bcount>>6;
}
if (uh->uh_actf == ui)
uh->uh_actf = ui->ui_forw;
(*um->um_driver->ud_dgo)(um);
}
if (uh->uh_actf == ui)
uh->uh_actf = ui->ui_forw;
(*um->um_driver->ud_dgo)(um);
- if (ui->ui_dk >= 0) {
- dk_xfer[unit]++;
- dk_wds[unit] += um->um_tab.b_actf->b_actf->b_bcount>>6;
- }
return (1);
rwait:
if (uh->uh_actf != ui) {
return (1);
rwait:
if (uh->uh_actf != ui) {
/*
* This routine allows remapping of previously
* allocated UNIBUS bdp and map resources
/*
* This routine allows remapping of previously
* allocated UNIBUS bdp and map resources
-#define UPECCDEBUG
-/* up.c 4.43 82/03/24 */
+/* up.c 4.44 82/03/29 */
#include "up.h"
#if NSC > 0
#include "up.h"
#if NSC > 0
};
/* END OF STUFF WHICH SHOULD BE READ IN PER DISK */
};
/* END OF STUFF WHICH SHOULD BE READ IN PER DISK */
-#define _upSDIST 2 /* 1.0 msec */
+/*
+ * On a 780 upSDIST could be 2, but
+ * in the interest of 750's...
+ */
+#define _upSDIST 3 /* 1.5 msec */
#define _upRDIST 4 /* 2.0 msec */
int upSDIST = _upSDIST;
#define _upRDIST 4 /* 2.0 msec */
int upSDIST = _upSDIST;
32, 19, 32*19, 823, up_sizes, /* 9300/cdc */
/* 9300 actually has 815 cylinders... */
32, 10, 32*10, 823, fj_sizes, /* fujitsu 160m */
32, 19, 32*19, 823, up_sizes, /* 9300/cdc */
/* 9300 actually has 815 cylinders... */
32, 10, 32*10, 823, fj_sizes, /* fujitsu 160m */
- 32, 16, 32*16, 1024, am_sizes, /* fujitsu 160m */
+ 32, 16, 32*16, 1024, am_sizes, /* ampex capricorn */
};
u_char up_offset[16] = {
};
u_char up_offset[16] = {
{
register struct updevice *upaddr = (struct updevice *)um->um_addr;
{
register struct updevice *upaddr = (struct updevice *)um->um_addr;
+ um->um_tab.b_active++; /* should now be 2 */
upaddr->upba = um->um_ubinfo;
upaddr->upcs1 = um->um_cmd|((um->um_ubinfo>>8)&0x300);
}
upaddr->upba = um->um_ubinfo;
upaddr->upcs1 = um->um_cmd|((um->um_ubinfo>>8)&0x300);
}
* interrupt for attention status on seeking drives.
* Just service them.
*/
* interrupt for attention status on seeking drives.
* Just service them.
*/
- if (um->um_tab.b_active == 0) {
+ if (um->um_tab.b_active != 2 && !sc->sc_recal) {
if (upaddr->upcs1 & UP_TRE)
upaddr->upcs1 = UP_TRE;
goto doattn;
if (upaddr->upcs1 & UP_TRE)
upaddr->upcs1 = UP_TRE;
goto doattn;
- um->um_tab.b_active++; /* Either complete or continuing... */
+ um->um_tab.b_active = 2; /* Either complete or continuing... */
if (up->upwc == 0)
return (0);
/*
if (up->upwc == 0)
return (0);
/*
um->um_tab.b_active = 0;
um->um_tab.b_actf = um->um_tab.b_actl = 0;
up_softc[sc21].sc_recal = 0;
um->um_tab.b_active = 0;
um->um_tab.b_actf = um->um_tab.b_actl = 0;
up_softc[sc21].sc_recal = 0;
+ up_softc[sc21].sc_wticks = 0;
if (um->um_ubinfo) {
printf("<%d>", (um->um_ubinfo>>28)&0xf);
ubadone(um);
if (um->um_ubinfo) {
printf("<%d>", (um->um_ubinfo>>28)&0xf);
ubadone(um);