SCCS-vsn: sys/vax/stand/idc.c 4.4
-/* idc.c 4.3 82/11/13 */
+/* idc.c 4.4 82/11/19 */
- *
- * This driver is full of kludges!
- * It depends heavily on the 1K file system.
*/
#include "../h/param.h"
*/
#include "../h/param.h"
io->i_boff = rb02_off[io->i_boff];
}
if (io->i_boff < 0)
io->i_boff = rb02_off[io->i_boff];
}
if (io->i_boff < 0)
+ _stop("idc%d: bad unit type", io->i_unit);
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;
idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
int ubinfo, errcnt = 0;
idcaddr = (struct idcdevice *)((caddr_t)ubauba(io->i_unit) + 0x200);
ubinfo = ubasetup(io, 1);
bn = io->i_bn;
ubinfo = ubasetup(io, 1);
bn = io->i_bn;
+ ccleft = io->i_cc;
+retry:
- 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;
- bn *= 2;
- cn = bn/(NRB02SECT*NRB02TRK);
- sn = bn%NRB02SECT;
- tn = (bn / NRB02SECT) % NRB02TRK;
+ cn = 2*bn/(NRB02SECT*NRB02TRK);
+ sn = (2*bn)%NRB02SECT;
+ tn = (2*bn / NRB02SECT) % NRB02TRK;
+ thiscc = (NRB02SECT - sn) * 256;
+ 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;
cn += io->i_boff;
idcaddr->idccsr = IDC_CRDY|IDC_SEEK|(dn<<8)|(1<<(dn+16));
idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
com |= IDC_WRITE;
idcaddr->idccsr = IDC_CRDY|com;
idcaddr->idcbar = ubinfo&0x3ffff;
com |= IDC_WRITE;
idcaddr->idccsr = IDC_CRDY|com;
idcaddr->idcbar = ubinfo&0x3ffff;
- idcaddr->idcbcr = -io->i_cc;
+ idcaddr->idcbcr = -thiscc;
idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
idcaddr->idccsr = com;
idcwait(idcaddr);
idcaddr->idcdar = (cn<<16)|(tn<<8)|sn;
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: unrecovered error\n");
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: unrecovered error\n");
}
if (errcnt)
printf("idc: recovered by retry\n");
}
if (errcnt)
printf("idc: recovered by retry\n");
- if (idc_type[dn] && sn == NRB80SECT) {
- io->i_bn++;
+ if (ccleft) {
+ bn += thiscc/(idc_type[dn]?512:256);
+ ubinfo += thiscc;
+ ubafree(io, ubinfo);
+ return (io->i_cc);