1: #
2: /*
3: * RP disk driver
4: */
5:
6: #include "../h/param.h"
7: #include "../h/systm.h"
8: #include "../h/buf.h"
9: #include "../h/dir.h"
10: #include "../h/conf.h"
11: #include "../h/user.h"
12:
13: struct device {
14: int rpds;
15: int rper;
16: union {
17: int w;
18: char c;
19: } rpcs;
20: int rpwc;
21: char *rpba;
22: int rpca;
23: int rpda;
24: };
25:
26: #define RPADDR ((struct device *) 0176710)
27: #define NRP 8
28:
29: struct {
30: daddr_t nblocks;
31: int cyloff;
32: } rp_sizes[] = {
33: 81000, 0, /* cyl 0 thru 405 */
34: 5000, 0, /* cyl 0 thru 24 */
35: 2000, 25, /* cyl 25 thru 34 */
36: 74000, 35, /* cyl 35 thru 405 */
37: 0, 0,
38: 0, 0,
39: 0, 0,
40: 0, 0,
41: };
42:
43: struct buf rptab;
44: struct buf rrpbuf;
45:
46: #define GO 01
47: #define RESET 0
48: #define HSEEK 014
49:
50: #define IENABLE 0100
51: #define READY 0200
52: #define RCOM 4
53: #define WCOM 2
54:
55: #define SUFU 01000
56: #define SUSU 02000
57: #define SUSI 04000
58: #define HNF 010000
59:
60: /*
61: * Use av_back to save track+sector,
62: * b_resid for cylinder.
63: */
64:
65: #define trksec av_back
66: #define cylin b_resid
67:
68: /*
69: * Monitoring device number
70: */
71: #define DK_N 2
72:
73: rpstrategy(bp)
74: register struct buf *bp;
75: {
76: register struct buf *dp;
77: register int unit;
78: long sz;
79:
80: unit = minor(bp->b_dev);
81: sz = bp->b_bcount;
82: sz = (sz+511)>>9;
83: if (unit >= (NRP<<3) ||
84: bp->b_blkno+sz >= rp_sizes[unit&07].nblocks) {
85: bp->b_flags |= B_ERROR;
86: iodone(bp);
87: return;
88: }
89: bp->av_forw = NULL;
90: unit >>= 3;
91: spl5();
92: dp = & rptab;
93: if (dp->b_actf == NULL)
94: dp->b_actf = bp;
95: else
96: dp->b_actl->av_forw = bp;
97: dp->b_actl = bp;
98: if (dp->b_active == NULL)
99: rpstart();
100: spl0();
101: }
102:
103: rpstart()
104: {
105: register struct buf *bp;
106: register int unit;
107: int com,cn,tn,sn,dn;
108: daddr_t bn;
109:
110:
111: if ((bp = rptab.b_actf) == NULL)
112: return;
113: rptab.b_active++;
114: unit = minor(bp->b_dev);
115: dn = unit>>3;
116: bn = bp->b_blkno;
117: cn = bn/(20*10) + rp_sizes[unit&07].cyloff;
118: sn = bn%(20*10);
119: tn = sn/10;
120: sn = sn%10;
121: RPADDR->rpcs.w = (dn<<8);
122: RPADDR->rpda = (tn<<8) | sn;
123: RPADDR->rpca = cn;
124: RPADDR->rpba = bp->b_un.b_addr;
125: RPADDR->rpwc = -(bp->b_bcount>>1);
126: com = ((bp->b_xmem&3)<<4) | IENABLE | GO;
127: if (bp->b_flags & B_READ)
128: com |= RCOM; else
129: com |= WCOM;
130:
131: RPADDR->rpcs.w |= com;
132: dk_busy |= 1<<DK_N;
133: dk_numb[DK_N] += 1;
134: unit = bp->b_bcount>>6;
135: dk_wds[DK_N] += unit;
136: }
137:
138: rpintr()
139: {
140: register struct buf *bp;
141: register int ctr;
142:
143: if (rptab.b_active == NULL)
144: return;
145: dk_busy &= ~(1<<DK_N);
146: bp = rptab.b_actf;
147: rptab.b_active = NULL;
148: if (RPADDR->rpcs.w < 0) { /* error bit */
149: deverror(bp, RPADDR->rper, RPADDR->rpds);
150: if(RPADDR->rpds & (SUFU|SUSI|HNF)) {
151: RPADDR->rpcs.c = HSEEK|GO;
152: ctr = 0;
153: while ((RPADDR->rpds&SUSU) && --ctr)
154: ;
155: }
156: RPADDR->rpcs.w = RESET|GO;
157: ctr = 0;
158: while ((RPADDR->rpcs.w&READY) == 0 && --ctr)
159: ;
160: if (++rptab.b_errcnt <= 10) {
161: rpstart();
162: return;
163: }
164: bp->b_flags |= B_ERROR;
165: }
166: rptab.b_errcnt = 0;
167: rptab.b_actf = bp->av_forw;
168: bp->b_resid = 0;
169: iodone(bp);
170: rpstart();
171: }
172:
173: rpread(dev)
174: {
175:
176: physio(rpstrategy, &rrpbuf, dev, B_READ);
177: }
178:
179: rpwrite(dev)
180: {
181:
182: physio(rpstrategy, &rrpbuf, dev, B_WRITE);
183: }
Defined functions
Defined variables
rptab
defined in line
43; used 9 times
Defined struct's
Defined macros
DK_N
defined in line
71; used 4 times
GO
defined in line
46; used 3 times
HNF
defined in line
58; used 1 times
HSEEK
defined in line
48; used 1 times
NRP
defined in line
27; used 1 times
RCOM
defined in line
52; used 1 times
READY
defined in line
51; used 1 times
RESET
defined in line
47; used 1 times
RPADDR
defined in line
26; used 14 times
SUFU
defined in line
55; used 1 times
SUSI
defined in line
57; used 1 times
SUSU
defined in line
56; used 1 times
WCOM
defined in line
53; used 1 times
cylin
defined in line
66;
never used