|
|
1.1 ! root 1: /* up.old.c 7.1 86/06/05 */ ! 2: ! 3: #include "../machine/pte.h" ! 4: ! 5: #include "../h/param.h" ! 6: #include "../h/inode.h" ! 7: #include "../h/fs.h" ! 8: ! 9: #include "../vaxuba/upreg.h" ! 10: #include "../vaxuba/ubareg.h" ! 11: ! 12: #include "saio.h" ! 13: #include "savax.h" ! 14: ! 15: u_short ubastd[] = { 0776700 }; ! 16: char up_gottype[MAXNUBA*8]; ! 17: char up_type[MAXNUBA*8]; ! 18: extern struct st upst[]; ! 19: ! 20: upopen(io) ! 21: register struct iob *io; ! 22: { ! 23: register struct updevice *upaddr = ! 24: (struct updevice *)ubamem(io->i_unit, ubastd[0]); ! 25: register struct st *st; ! 26: ! 27: while ((upaddr->upcs1 & UP_DVA) == 0) ! 28: ; ! 29: if (up_gottype[io->i_unit] == 0) { ! 30: up_type[io->i_unit] = upmaptype(io->i_unit, upaddr); ! 31: if (up_type[io->i_unit] < 0) ! 32: _stop("unknown drive type"); ! 33: up_gottype[io->i_unit] = 1; ! 34: } ! 35: st = &upst[up_type[io->i_unit]]; ! 36: if (io->i_boff < 0 || io->i_boff > 7 || st->off[io->i_boff] == -1) ! 37: _stop("up bad unit"); ! 38: io->i_boff = st->off[io->i_boff] * st->nspc; ! 39: } ! 40: ! 41: upstrategy(io, func) ! 42: register struct iob *io; ! 43: { ! 44: int unit, nspc, ns, cn, tn, sn; ! 45: daddr_t bn; ! 46: int info; ! 47: register struct updevice *upaddr = ! 48: (struct updevice *)ubamem(io->i_unit, ubastd[0]); ! 49: register struct st *st = &upst[up_type[io->i_unit]]; ! 50: ! 51: unit = io->i_unit; ! 52: bn = io->i_bn; ! 53: cn = bn/st->nspc; ! 54: sn = bn%st->nspc; ! 55: tn = sn/st->nsect; ! 56: sn = sn%st->nsect; ! 57: upaddr->upcs2 = unit % 8; ! 58: if ((upaddr->upds & UPDS_VV) == 0) { ! 59: upaddr->upcs1 = UP_DCLR|UP_GO; ! 60: upaddr->upcs1 = UP_PRESET|UP_GO; ! 61: upaddr->upof = UPOF_FMT22; ! 62: } ! 63: if ((upaddr->upds & UPDS_DREADY) != UPDS_DREADY) ! 64: _stop("up not ready"); ! 65: info = ubasetup(io, 1); ! 66: upaddr->updc = cn; ! 67: upaddr->upda = (tn << 8) + sn; ! 68: upaddr->upba = info; ! 69: upaddr->upwc = -io->i_cc / sizeof (short); ! 70: if (func == READ) ! 71: upaddr->upcs1 = UP_RCOM|UP_GO; ! 72: else ! 73: upaddr->upcs1 = UP_WCOM|UP_GO; ! 74: do { ! 75: DELAY(25); ! 76: } while ((upaddr->upcs1 & UP_RDY) == 0); ! 77: if (upaddr->upds & UPDS_ERR) { ! 78: printf("up error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er1=%b er2=%b\n", ! 79: cn, tn, sn, ! 80: upaddr->upcs2, UPCS2_BITS, upaddr->uper1, UPER1_BITS, ! 81: upaddr->uper2, UPER2_BITS); ! 82: return (-1); ! 83: } ! 84: ubafree(io, info); ! 85: return (io->i_cc + (upaddr->upwc * sizeof (short))); ! 86: } ! 87: ! 88: /*ARGSUSED*/ ! 89: upioctl(io, cmd, arg) ! 90: struct iob *io; ! 91: int cmd; ! 92: caddr_t arg; ! 93: { ! 94: ! 95: return (ECMD); ! 96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.