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
a85c96b
..
cce0039
100644
(file)
--- a/
usr/src/sys/vax/stand/idc.c
+++ b/
usr/src/sys/vax/stand/idc.c
@@
-1,25
+1,32
@@
-/* idc.c 4.7 83/04/30 */
+/*
+ * 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)
*/
-#include "../machine/pte.h"
-#include "../h/param.h"
-#include "../h/inode.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;
@@
-27,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);
@@
-40,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%d: bad unit type", io->i_unit);
+ return (0);
}
idcstrategy(io, func)
}
idcstrategy(io, func)
@@
-65,7
+77,7
@@
idcstrategy(io, func)
short ccleft, thiscc = 0;
int ubinfo, errcnt = 0;
short ccleft, thiscc = 0;
int ubinfo, errcnt = 0;
- idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_
uni
t) + 0x200);
+ idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_
adap
t) + 0x200);
ubinfo = ubasetup(io, 1);
bn = io->i_bn;
ccleft = io->i_cc;
ubinfo = ubasetup(io, 1);
bn = io->i_bn;
ccleft = io->i_cc;
@@
-84,14
+96,13
@@
retry:
}
thiscc = MIN(thiscc, ccleft);
ccleft -= thiscc;
}
thiscc = MIN(thiscc, ccleft);
ccleft -= thiscc;
- cn += io->i_boff;
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;
com |= IDC_READ;
else
com |= IDC_WRITE;
@@
-102,20
+113,19
@@
retry:
idcaddr->idccsr = com;
idcwait(idcaddr);
if (idcaddr->idccsr & IDC_ERR) {
idcaddr->idccsr = com;
idcwait(idcaddr);
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");
ubafree(io, ubinfo);
return (-1);
}
printf("idc: unrecovered error\n");
ubafree(io, ubinfo);
return (-1);
}
- errcnt++;
goto retry;
}
if (errcnt)
printf("idc: recovered by retry\n");
if (ccleft) {
goto retry;
}
if (errcnt)
printf("idc: recovered by retry\n");
if (ccleft) {
- bn += thiscc/
(idc_type[dn]?512:256)
;
+ bn += thiscc/
NBPG
;
ubinfo += thiscc;
goto retry;
}
ubinfo += thiscc;
goto retry;
}
@@
-123,22
+133,10
@@
retry:
return (io->i_cc);
}
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--)
- ;
-}
-
-/*ARGSUSED*/
-idcioctl(io, cmd, arg)
- struct iob *io;
- int cmd;
- caddr_t arg;
-{
-
- return (ECMD);
+ DELAY(10);
}
}