|
|
1.1 root 1: /* rk.c 2.2 1/23/80 */
2:
3: /*
4: * RK disk driver
5: */
6:
7: #include "../h/param.h"
8: #include "../h/systm.h"
9: #include "../h/buf.h"
10: #include "../h/conf.h"
11: #include "../h/dir.h"
12: #include "../h/user.h"
13: #include "../h/uba.h"
14:
15: #define RKADDR ((struct rk_regs *)( UBA0_DEV + 0177400))
16: #define NRK 4
17: #define NRKBLK 4872
18:
19: #define RESET 0
20: #define WCOM 2
21: #define RCOM 4
22: #define GO 01
23: #define DRESET 014
24: #define IENABLE 0100
25: #define DRY 0200
26: #define ARDY 0100
27: #define WLO 020000
28: #define CTLRDY 0200
29:
30: /*
31: * Monitoring device bit
32: */
33: #define DK_N 1
34:
35: struct rk_regs
36: {
37: short rkds;
38: short rker;
39: short rkcs;
40: short rkwc;
41: unsigned short rkba;
42: short rkda;
43: };
44:
45: struct buf rktab;
46: struct buf rrkbuf;
47:
48: int rk_ubinfo;
49:
50: rkstrategy(bp)
51: register struct buf *bp;
52: {
53:
54: if (bp->b_blkno >= NRKBLK) {
55: bp->b_flags |= B_ERROR;
56: iodone(bp);
57: return;
58: }
59: bp->av_forw = (struct buf *)NULL;
60: VOID spl5();
61: if(rktab.b_actf == NULL)
62: rktab.b_actf = bp;
63: else
64: rktab.b_actl->av_forw = bp;
65: rktab.b_actl = bp;
66: if(rktab.b_active == NULL)
67: rkstart();
68: VOID spl0();
69: }
70:
71: rkstart()
72: {
73: register struct buf *bp;
74: register com;
75: daddr_t bn;
76: int dn, cn, sn;
77:
78: if ((bp = rktab.b_actf) == NULL)
79: return;
80: rktab.b_active++;
81: rk_ubinfo = ubasetup( bp, 1 );
82: bn = bp->b_blkno;
83: dn = minor(bp->b_dev);
84: cn = bn/12;
85: sn = bn%12;
86: RKADDR->rkda = (dn<<13) | (cn<<4) | sn;
87: RKADDR->rkba = rk_ubinfo;
88: RKADDR->rkwc = -(bp->b_bcount>>1);
89: com = ((rk_ubinfo & 0x30000) >> 8 ) | IENABLE | GO;
90: if(bp->b_flags & B_READ)
91: com |= RCOM; else
92: com |= WCOM;
93: RKADDR->rkcs = com;
94: /*
95: dk_busy |= 1<<DK_N;
96: dk_numb[DK_N] += 1;
97: com = bp->b_bcount>>6;
98: dk_wds[DK_N] += com;
99: */
100: }
101:
102: rkintr()
103: {
104: register struct buf *bp;
105:
106: if (rktab.b_active == NULL)
107: return;
108: dk_busy &= ~(1<<DK_N);
109: bp = rktab.b_actf;
110: rktab.b_active = NULL;
111: if (RKADDR->rkcs < 0) { /* error bit */
112: deverror(bp, RKADDR->rker, RKADDR->rkds);
113: RKADDR->rkcs = RESET|GO;
114: while((RKADDR->rkcs&CTLRDY) == 0)
115: ;
116: if (++rktab.b_errcnt <= 10) {
117: ubafree(rk_ubinfo);
118: rkstart();
119: return;
120: }
121: bp->b_flags |= B_ERROR;
122: }
123: rktab.b_errcnt = 0;
124: rktab.b_actf = bp->av_forw;
125: bp->b_resid = 0;
126: ubafree(rk_ubinfo);
127: iodone(bp);
128: rkstart();
129: }
130:
131: rkread(dev)
132: dev_t dev;
133: {
134:
135: physio(rkstrategy, &rrkbuf, dev, B_READ, minphys);
136: }
137:
138: rkwrite(dev)
139: dev_t dev;
140: {
141:
142: physio(rkstrategy, &rrkbuf, dev, B_WRITE, minphys);
143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.