* 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.4 (Berkeley) %G%
#include "../vaxuba/idcreg.h"
#include "../vaxuba/ubareg.h"
short rb02_off
[] = { 0, 400, 0, -1, -1, -1, -1, -1 };
short rb80_off
[] = { 0, 37, 0, -1, -1, -1, 115, 305 };
register struct idcdevice
*idcaddr
;
if ((u_int
)io
->i_ctlr
>= MAXCTLR
)
if ((u_int
)io
->i_unit
>= MAXUNIT
)
if ((u_int
)io
->i_part
>= MAXPART
)
idcaddr
= (struct idcdevice
*)((caddr_t
)ubauba(io
->i_adapt
) + 0x200);
idcaddr
->idcmpr
= IDCGS_GETSTAT
;
idcaddr
->idccsr
= IDC_GETSTAT
|(io
->i_unit
<<8);
idcaddr
->idccsr
= IDC_CRDY
|(1<<(io
->i_unit
+16));
idcaddr
->idccsr
= (io
->i_unit
<<8)|IDC_RHDR
;
if (idcaddr
->idccsr
& IDC_ERR
) {
printf("idc error: idccsr %x\n", idcaddr
->idccsr
);
if (idcaddr
->idccsr
& IDC_R80
) {
idc_type
[io
->i_unit
] = 1;
io
->i_boff
= rb80_off
[io
->i_part
] * NRB80SECT
* NRB80TRK
;
idc_type
[io
->i_unit
] = 0;
io
->i_boff
= rb02_off
[io
->i_part
] * NRB02SECT
/2 * NRB02TRK
;
register struct idcdevice
*idcaddr
;
short ccleft
, thiscc
= 0;
idcaddr
= (struct idcdevice
*)((caddr_t
)ubauba(io
->i_adapt
) + 0x200);
ubinfo
= ubasetup(io
, 1);
cn
= bn
/(NRB80SECT
*NRB80TRK
);
tn
= (bn
/ NRB80SECT
) % NRB80TRK
;
thiscc
= (NRB80SECT
- sn
) * 512;
cn
= 2*bn
/(NRB02SECT
*NRB02TRK
);
tn
= (2*bn
/ NRB02SECT
) % NRB02TRK
;
thiscc
= (NRB02SECT
- sn
) * 256;
thiscc
= MIN(thiscc
, ccleft
);
idcaddr
->idccsr
= IDC_CRDY
|IDC_SEEK
|(dn
<<8)|(1<<(dn
+16));
idcaddr
->idcdar
= (cn
<<16)|(tn
<<8)|sn
;
idcaddr
->idccsr
= IDC_SEEK
|(dn
<<8);
idcaddr
->idccsr
&= ~IDC_ATTN
;
idcaddr
->idccsr
= IDC_CRDY
|com
;
idcaddr
->idcbar
= ubinfo
&0x3ffff;
idcaddr
->idcbcr
= -thiscc
;
idcaddr
->idcdar
= (cn
<<16)|(tn
<<8)|sn
;
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");
printf("idc: recovered by retry\n");
register struct idcdevice
*idcaddr
;
while ((idcaddr
->idccsr
& (IDC_CRDY
|IDC_DRDY
)) != (IDC_CRDY
|IDC_DRDY
))