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