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
BSD 4_4 release
[unix-history]
/
usr
/
src
/
sys
/
vax
/
stand
/
idc.c
diff --git
a/usr/src/sys/vax/stand/idc.c
b/usr/src/sys/vax/stand/idc.c
index
9753825
..
cce0039
100644
(file)
--- a/
usr/src/sys/vax/stand/idc.c
+++ b/
usr/src/sys/vax/stand/idc.c
@@
-1,28
+1,32
@@
-/* idc.c 4.3 82/11/13 */
+/*
+ * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
+ * All rights reserved. The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ * @(#)idc.c 7.7 (Berkeley) 5/4/91
+ */
/*
* IDC (RB730)
/*
* IDC (RB730)
- *
- * This driver is full of kludges!
- * It depends heavily on the 1K file system.
*/
*/
-#include "../h/param.h"
-#include "../h/inode.h"
-#include "../h/pte.h"
-#include "../h/fs.h"
+#include "sys/param.h"
-#include "../vaxuba/idcreg.h"
-#include "../vaxuba/ubareg.h"
+#include "../include/pte.h"
+#include "../uba/idcreg.h"
+#include "../uba/ubareg.h"
-#include "saio.h"
+#include "s
tand/s
aio.h"
#include "savax.h"
#include "savax.h"
-u_short idcstd[] = { 0175606 };
short rb02_off[] = { 0, 400, 0, -1, -1, -1, -1, -1 };
short rb80_off[] = { 0, 37, 0, -1, -1, -1, 115, 305 };
short rb02_off[] = { 0, 400, 0, -1, -1, -1, -1, -1 };
short rb80_off[] = { 0, 37, 0, -1, -1, -1, 115, 305 };
-int idc_type[4];
+#define MAXCTLR 1
+#define MAXUNIT 4
+#define MAXPART 8
+
+int idc_type[MAXUNIT];
idcopen(io)
register struct iob *io;
idcopen(io)
register struct iob *io;
@@
-30,9
+34,15
@@
idcopen(io)
register struct idcdevice *idcaddr;
register int i;
register struct idcdevice *idcaddr;
register int i;
- idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
- if (io->i_boff < 0 || io->i_boff > 7)
- _stop("idc bad unit");
+ if (io->i_adapt != 0)
+ return (EADAPT);
+ if ((u_int)io->i_ctlr >= MAXCTLR)
+ return (ECTLR);
+ if ((u_int)io->i_unit >= MAXUNIT)
+ return (EUNIT);
+ if ((u_int)io->i_part >= MAXPART)
+ return (EPART);
+ idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_adapt) + 0x200);
idcaddr->idcmpr = IDCGS_GETSTAT;
idcaddr->idccsr = IDC_GETSTAT|(io->i_unit<<8);
idcwait(idcaddr);
idcaddr->idcmpr = IDCGS_GETSTAT;
idcaddr->idccsr = IDC_GETSTAT|(io->i_unit<<8);
idcwait(idcaddr);
@@
-43,19
+53,18
@@
idcopen(io)
idcwait(idcaddr);
if (idcaddr->idccsr & IDC_ERR) {
printf("idc error: idccsr %x\n", idcaddr->idccsr);
idcwait(idcaddr);
if (idcaddr->idccsr & IDC_ERR) {
printf("idc error: idccsr %x\n", idcaddr->idccsr);
-
_stop("idc fatal error"
);
+
return (EIO
);
}
i = idcaddr->idcmpr;
i = idcaddr->idcmpr;
if (idcaddr->idccsr & IDC_R80) {
idc_type[io->i_unit] = 1;
}
i = idcaddr->idcmpr;
i = idcaddr->idcmpr;
if (idcaddr->idccsr & IDC_R80) {
idc_type[io->i_unit] = 1;
- io->i_boff = rb80_off[io->i_
boff]
;
+ io->i_boff = rb80_off[io->i_
part] * NRB80SECT * NRB80TRK
;
} else {
idc_type[io->i_unit] = 0;
} else {
idc_type[io->i_unit] = 0;
- io->i_boff = rb02_off[io->i_
boff]
;
+ io->i_boff = rb02_off[io->i_
part] * NRB02SECT/2 * NRB02TRK
;
}
}
- if (io->i_boff < 0)
- _stop("idc bad unit");
+ return (0);
}
idcstrategy(io, func)
}
idcstrategy(io, func)
@@
-65,69
+74,69
@@
idcstrategy(io, func)
int com;
daddr_t bn;
short dn, cn, sn, tn;
int com;
daddr_t bn;
short dn, cn, sn, tn;
+ short ccleft, thiscc = 0;
int ubinfo, errcnt = 0;
int ubinfo, errcnt = 0;
- idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
-retry:
+ idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_adapt) + 0x200);
ubinfo = ubasetup(io, 1);
bn = io->i_bn;
ubinfo = ubasetup(io, 1);
bn = io->i_bn;
+ ccleft = io->i_cc;
+retry:
dn = io->i_unit;
dn = io->i_unit;
- if (io->i_cc != 1024) printf("idc: count %d != 1024\n", io->i_cc);
if (idc_type[dn]) {
cn = bn/(NRB80SECT*NRB80TRK);
sn = bn%NRB80SECT;
tn = (bn / NRB80SECT) % NRB80TRK;
if (idc_type[dn]) {
cn = bn/(NRB80SECT*NRB80TRK);
sn = bn%NRB80SECT;
tn = (bn / NRB80SECT) % NRB80TRK;
- if (sn == NRB80SECT)
- io->i_cc = 512;
+ thiscc = (NRB80SECT - sn) * 512;
} else {
} else {
-
bn *= 2
;
-
cn = bn/(NRB02SECT*NRB02TRK)
;
-
sn = bn%NRB02SECT
;
- t
n = (bn / NRB02SECT) % NRB02TRK
;
+
cn = 2*bn/(NRB02SECT*NRB02TRK)
;
+
sn = (2*bn)%NRB02SECT
;
+
tn = (2*bn / NRB02SECT) % NRB02TRK
;
+ t
hiscc = (NRB02SECT - sn) * 256
;
}
}
- cn += io->i_boff;
+ thiscc = MIN(thiscc, ccleft);
+ ccleft -= thiscc;
idcaddr->idccsr = IDC_CRDY|IDC_SEEK|(dn<<8)|(1<<(dn+16));
idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
idcaddr->idccsr = IDC_SEEK|(dn<<8);
idcwait(idcaddr);
idcaddr->idccsr &= ~IDC_ATTN;
com = dn<<8;
idcaddr->idccsr = IDC_CRDY|IDC_SEEK|(dn<<8)|(1<<(dn+16));
idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
idcaddr->idccsr = IDC_SEEK|(dn<<8);
idcwait(idcaddr);
idcaddr->idccsr &= ~IDC_ATTN;
com = dn<<8;
- if (func == READ)
+ if (func ==
F_
READ)
com |= IDC_READ;
else
com |= IDC_WRITE;
idcaddr->idccsr = IDC_CRDY|com;
idcaddr->idcbar = ubinfo&0x3ffff;
com |= IDC_READ;
else
com |= IDC_WRITE;
idcaddr->idccsr = IDC_CRDY|com;
idcaddr->idcbar = ubinfo&0x3ffff;
- idcaddr->idcbcr = -
io->i_
cc;
+ idcaddr->idcbcr = -
this
cc;
idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
idcaddr->idccsr = com;
idcwait(idcaddr);
idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
idcaddr->idccsr = com;
idcwait(idcaddr);
- ubafree(io, ubinfo);
if (idcaddr->idccsr & IDC_ERR) {
if (idcaddr->idccsr & IDC_ERR) {
- printf("idc error: (cyl,trk,sec)=(%d,%d,%d) csr=%b\n",
- cn, tn, sn, idcaddr->idccsr, IDCCSR_BITS);
- if (errcnt == 10) {
+ printf("idc
%d
error: (cyl,trk,sec)=(%d,%d,%d) csr=%b\n",
+
dn,
cn, tn, sn, idcaddr->idccsr, IDCCSR_BITS);
+ if (errcnt
++
== 10) {
printf("idc: unrecovered error\n");
printf("idc: unrecovered error\n");
+ ubafree(io, ubinfo);
return (-1);
}
return (-1);
}
- errcnt++;
goto retry;
}
if (errcnt)
printf("idc: recovered by retry\n");
goto retry;
}
if (errcnt)
printf("idc: recovered by retry\n");
- if (idc_type[dn] && sn == NRB80SECT) {
- io->i_bn++;
+ if (ccleft) {
+ bn += thiscc/NBPG;
+ ubinfo += thiscc;
goto retry;
}
goto retry;
}
- return (1024);
+ ubafree(io, ubinfo);
+ return (io->i_cc);
}
}
+static
idcwait(idcaddr)
register struct idcdevice *idcaddr;
{
idcwait(idcaddr)
register struct idcdevice *idcaddr;
{
- register int i;
-
while ((idcaddr->idccsr & (IDC_CRDY|IDC_DRDY)) != (IDC_CRDY|IDC_DRDY))
while ((idcaddr->idccsr & (IDC_CRDY|IDC_DRDY)) != (IDC_CRDY|IDC_DRDY))
- for (i = 10; i; i--)
- ;
+ DELAY(10);
}
}