|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: *
6: * @(#)rk.c 7.7 (Berkeley) 7/9/88
7: */
8:
9: /*
10: * RK611/RK07
11: */
12: #include "param.h"
13: #include "inode.h"
14: #include "fs.h"
15: #include "disklabel.h"
16:
17: #include "../vax/pte.h"
18:
19: #include "../vaxuba/ubareg.h"
20: #include "../vaxuba/rkreg.h"
21:
22: #include "saio.h"
23: #include "savax.h"
24:
25: #define SECTSIZ 512 /* sector size in bytes */
26:
27: #define MAXCTLR 1 /* all addresses must be specified */
28: #define MAXUNIT 8
29: u_short rkstd[MAXCTLR] = { 0777440 };
30: struct disklabel rklabel[MAXNUBA][MAXCTLR][MAXUNIT];
31: char lbuf[SECTSIZ];
32:
33: rkopen(io)
34: register struct iob *io;
35: {
36: register struct rkdevice *rkaddr;
37: register struct disklabel *lp;
38: struct iob tio;
39:
40: if ((u_int)io->i_adapt >= nuba)
41: return (EADAPT);
42: if ((u_int)io->i_ctlr >= MAXCTLR)
43: return (ECTLR);
44: if ((u_int)io->i_unit >= MAXUNIT)
45: return (EUNIT);
46: rkaddr = (struct rkdevice *)ubamem(io->i_adapt, rkstd[io->i_ctlr]);
47: if (badaddr((char *)rkaddr, sizeof(short)))
48: return (ENXIO);
49: rkaddr->rkcs2 = RKCS2_SCLR;
50: rkwait(rkaddr);
51: /*
52: * Read in the pack label.
53: */
54: lp = &rklabel[io->i_adapt][io->i_ctlr][io->i_unit];
55: lp->d_nsectors = NRKSECT;
56: lp->d_secpercyl = NRKTRK*NRKSECT;
57: tio = *io;
58: tio.i_bn = LABELSECTOR;
59: tio.i_ma = lbuf;
60: tio.i_cc = SECTSIZ;
61: tio.i_flgs |= F_RDDATA;
62: if (rkstrategy(&tio, READ) != SECTSIZ)
63: return (ERDLAB);
64: *lp = *(struct disklabel *)(lbuf + LABELOFFSET);
65: if (lp->d_magic != DISKMAGIC || lp->d_magic2 != DISKMAGIC)
66: #ifdef COMPAT_42
67: {
68: printf("rk%d: unlabeled\n", io->i_unit);
69: rkmaptype(io, lp);
70: }
71: #else
72: return (EUNLAB);
73: #endif
74: if ((u_int)io->i_part >= lp->d_npartitions ||
75: (io->i_boff = lp->d_partitions[io->i_part].p_offset) == -1)
76: return (EPART);
77: return (0);
78: }
79:
80: #ifdef COMPAT_42
81: u_long rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 };
82:
83: rkmaptype(io, lp)
84: struct iob *io;
85: register struct disklabel *lp;
86: {
87: register struct partition *pp;
88: register u_long *off = rk_off;
89: register int i;
90:
91: lp->d_npartitions = 8;
92: pp = lp->d_partitions;
93: for (i = 0; i < 8; i++, pp++)
94: pp->p_offset = *off++;
95: }
96: #endif
97:
98: rkstrategy(io, func)
99: register struct iob *io;
100: {
101: register struct rkdevice *rkaddr;
102: register daddr_t bn;
103: int com, ubinfo, errcnt = 0;
104: short cn, sn, tn;
105:
106: rkaddr = (struct rkdevice *)ubamem(io->i_adapt, rkstd[io->i_ctlr]);
107: retry:
108: ubinfo = ubasetup(io, 1);
109: bn = io->i_bn;
110: cn = bn / (NRKSECT*NRKTRK);
111: sn = bn % NRKSECT;
112: tn = (bn / NRKSECT) % NRKTRK;
113: rkaddr->rkcs2 = io->i_unit;
114: rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO;
115: rkwait(rkaddr);
116: rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
117: rkwait(rkaddr);
118: rkaddr->rkda = sn | (tn << 8);
119: rkaddr->rkcyl = cn;
120: rkaddr->rkba = ubinfo;
121: rkaddr->rkwc = -(io->i_cc >> 1);
122: com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO;
123: if (func == READ)
124: com |= RK_READ;
125: else
126: com |= RK_WRITE;
127: rkaddr->rkcs1 = com;
128: rkwait(rkaddr);
129: while ((rkaddr->rkds & RKDS_SVAL) == 0)
130: ;
131: ubafree(io, ubinfo);
132: if (rkaddr->rkcs1 & RK_CERR) {
133: printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n",
134: cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS,
135: rkaddr->rker, RKER_BITS);
136: rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
137: rkwait(rkaddr);
138: if (errcnt++ == 10) {
139: printf("rk: unrecovered error\n");
140: return (-1);
141: }
142: goto retry;
143: }
144: if (errcnt)
145: printf("rk: recovered by retry\n");
146: return (io->i_cc);
147: }
148:
149: rkwait(rkaddr)
150: register struct rkdevice *rkaddr;
151: {
152: while ((rkaddr->rkcs1 & RK_CRDY) == 0);
153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.