SCCS-vsn: sys/vax/stand/idc.c 7.3
#include "saio.h"
#include "savax.h"
#include "saio.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 };
+#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;
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 ((unsigned)io->i_boff > 7) {
- printf("idc bad unit");
+ if ((u_int)io->i_adapt >= MAXNUBA)
+ return (EADAPT);
+ if ((u_int)io->i_ctlr >= MAXCTLR)
+ return (ECTLR);
+ if ((u_int)io->i_unit >= MAXUNIT)
+ 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);
i = idcaddr->idcmpr;
if (idcaddr->idccsr & IDC_R80) {
idc_type[io->i_unit] = 1;
i = idcaddr->idcmpr;
if (idcaddr->idccsr & IDC_R80) {
idc_type[io->i_unit] = 1;
- io->i_boff = rb80_off[io->i_boff] * NRB80SECT * NRB80TRK;
+ 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] * NRB02SECT/2 * NRB02TRK;
- }
- if (io->i_boff < 0) {
- printf("idc%d: bad unit type", io->i_unit);
- return (EUNIT);
+ io->i_boff = rb02_off[io->i_part] * NRB02SECT/2 * NRB02TRK;
short ccleft, thiscc = 0;
int ubinfo, errcnt = 0;
short ccleft, thiscc = 0;
int ubinfo, errcnt = 0;
- idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
+ idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_adapt) + 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;
if (idcaddr->idccsr & IDC_ERR) {
printf("idc%d error: (cyl,trk,sec)=(%d,%d,%d) csr=%b\n",
dn, cn, tn, sn, idcaddr->idccsr, IDCCSR_BITS);
if (idcaddr->idccsr & IDC_ERR) {
printf("idc%d error: (cyl,trk,sec)=(%d,%d,%d) csr=%b\n",
dn, cn, tn, sn, idcaddr->idccsr, IDCCSR_BITS);
printf("idc: unrecovered error\n");
ubafree(io, ubinfo);
return (-1);
}
printf("idc: unrecovered error\n");
ubafree(io, ubinfo);
return (-1);
}
goto retry;
}
if (errcnt)
goto retry;
}
if (errcnt)
idcwait(idcaddr)
register struct idcdevice *idcaddr;
{
idcwait(idcaddr)
register struct idcdevice *idcaddr;
{
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);