|
|
1.1 root 1: /*
2: * RK7 disk driver
3: */
4:
5: #include "../h/param.h"
6: #include "../h/systm.h"
7: #include "../h/buf.h"
8: #include "../h/conf.h"
9: #include "../h/dir.h"
10: #include "../h/user.h"
11: #include "../h/uba.h"
12:
13: #define RK7ADDR ((struct rk7_regs *)( UBA0_DEV + 0177440))
14: #define ERR_CNT 10
15: #define NRK7 8
16: #define NRK7BLK 53790
17: #define FORMAT_22 0
18: #define RESET 0102000
19: #define WCOM 022
20: #define RCOM 020
21: #define RK07 02000
22: #define GO 01
23: #define RELEASE 010
24: #define IENABLE 0000100
25: #define CTLRDY 0200
26: #define PACKAK 000003 /* Pack Acknowledge */
27:
28:
29: struct rk7_regs
30: {
31: short rk7cs1;
32: short rk7wc;
33: unsigned short rk7ba;
34: short rk7da;
35: short rk7cs2;
36: short rk7ds;
37: short rk7er;
38: short rk7asof;
39: short rk7dc;
40: short rk7null;
41: short rk7db;
42: short rk7mr1;
43: short rk7ecps;
44: short rk7ecpt;
45: short rk7mr2;
46: short rk7mr3;
47: };
48:
49: struct buf rk7tab;
50: struct buf rrk7buf;
51:
52: int rk7_ubinfo;
53:
54: rk7strategy(bp)
55: register struct buf *bp;
56: {
57:
58: if (bp->b_blkno >= NRK7BLK) {
59: bp->b_flags |= B_ERROR;
60: iodone(bp);
61: return;
62: }
63: bp->av_forw = (struct buf *)NULL;
64: spl5();
65: if(rk7tab.b_actf == NULL)
66: rk7tab.b_actf = bp;
67: else
68: rk7tab.b_actl->av_forw = bp;
69: rk7tab.b_actl = bp;
70: if(rk7tab.b_active == NULL)
71: rk7start();
72: spl0();
73: }
74:
75: rk7start()
76: {
77: register struct buf *bp;
78: register short com;
79: daddr_t bn;
80: short dn, cn, sn, tn;
81:
82: if ((bp = rk7tab.b_actf) == NULL)
83: return;
84: rk7tab.b_active++;
85: rk7_ubinfo = ubasetup( bp, 1 );
86: bn = bp->b_blkno;
87: dn = minor(bp->b_dev);
88: cn = bn/66;
89: sn = bn%22;
90: tn = (bn / 22) % 3;
91: /*
92: printf("in start bn = %d dn = %d cn = %d sn = %d tn = %d\n",bn,dn,cn,sn,tn);
93: */
94: RK7ADDR -> rk7cs2 = dn;
95: RK7ADDR -> rk7cs1 = PACKAK | RK07;
96: while(RK7ADDR->rk7cs1 & 01);
97:
98: RK7ADDR -> rk7da = sn | (tn << 8);
99: RK7ADDR -> rk7dc = cn;
100: RK7ADDR->rk7ba = rk7_ubinfo;
101: RK7ADDR->rk7wc = -(bp->b_bcount>>1);
102:
103: com = ((rk7_ubinfo & 0x30000) >> 8 ) | IENABLE | RK07 | GO | ( FORMAT_22<< 12);
104: if(bp->b_flags & B_READ)
105: com |= RCOM; else
106: com |= WCOM;
107: RK7ADDR->rk7cs1 = com;
108: /*
109: printf("cs1 in start = %d(bit15) %o(remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1 & 077777);
110: */
111: }
112:
113: rk7intr()
114: {
115: register struct buf *bp;
116:
117:
118: /*
119: printf("in intr->rk7ds = %d(bit 15) %o(remainder)",(RK7ADDR->rk7ds>>15)&01,RK7ADDR->rk7ds & 077777);
120: printf("cs1 = %d(bit 15) %o(remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1 & 077777);
121: */
122: if (rk7tab.b_active == NULL)
123: return;
124: bp = rk7tab.b_actf;
125: rk7tab.b_active = NULL;
126: while(RK7ADDR->rk7ds >= 0);
127: /*
128: printf("rk7ds = %o(bit 15) %o\n",(RK7ADDR -> rk7ds >> 15) & 01,RK7ADDR -> rk7ds & 077777);
129: printf("after ready wait, cs1 = %d (bit 15) %o (remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1&077777);
130: */
131:
132: if (RK7ADDR->rk7cs1 < 0) { /* error bit */
133: deverror(bp, RK7ADDR->rk7er, RK7ADDR->rk7cs2);
134: printf("err reg = %o octal\n",RK7ADDR->rk7er);
135: RK7ADDR->rk7cs1 = RESET|GO;
136: while((RK7ADDR->rk7cs1&CTLRDY) == 0)
137: ;
138: if (++rk7tab.b_errcnt <= ERR_CNT) {
139: ubafree(rk7_ubinfo);
140: rk7start();
141: return;
142: }
143: bp->b_flags |= B_ERROR;
144: }
145: rk7tab.b_errcnt = 0;
146: rk7tab.b_actf = bp->av_forw;
147: bp->b_resid = 0;
148: ubafree(rk7_ubinfo);
149: iodone(bp);
150: RK7ADDR->rk7cs2 |= RELEASE;
151: RK7ADDR->rk7cs1 = GO;
152: rk7start();
153: }
154:
155: rk7read(dev)
156: dev_t dev;
157: {
158:
159: physio(rk7strategy, &rrk7buf, dev, B_READ, minphys);
160: }
161:
162: rk7write(dev)
163: dev_t dev;
164: {
165:
166: physio(rk7strategy, &rrk7buf, dev, B_WRITE, minphys);
167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.