1: /*
2: * RK 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:
12: #define RKADDR ((struct device *)0177400)
13: #define NRK 4
14: #define NRKBLK 4872
15:
16: #define RESET 0
17: #define WCOM 2
18: #define RCOM 4
19: #define GO 01
20: #define DRESET 014
21: #define IENABLE 0100
22: #define DRY 0200
23: #define ARDY 0100
24: #define WLO 020000
25: #define CTLRDY 0200
26:
27: /*
28: * Monitoring device bit
29: */
30: #define DK_N 1
31:
32: struct device
33: {
34: int rkds;
35: int rker;
36: int rkcs;
37: int rkwc;
38: caddr_t rkba;
39: int rkda;
40: };
41:
42: struct buf rktab;
43: struct buf rrkbuf;
44:
45: rkstrategy(bp)
46: register struct buf *bp;
47: {
48:
49: if(bp->b_flags&B_PHYS)
50: mapalloc(bp);
51: if (bp->b_blkno >= NRKBLK) {
52: bp->b_flags |= B_ERROR;
53: iodone(bp);
54: return;
55: }
56: bp->av_forw = (struct buf *)NULL;
57: spl5();
58: if(rktab.b_actf == NULL)
59: rktab.b_actf = bp;
60: else
61: rktab.b_actl->av_forw = bp;
62: rktab.b_actl = bp;
63: if(rktab.b_active == NULL)
64: rkstart();
65: spl0();
66: }
67:
68: rkstart()
69: {
70: register struct buf *bp;
71: register com;
72: daddr_t bn;
73: int dn, cn, sn;
74:
75: if ((bp = rktab.b_actf) == NULL)
76: return;
77: rktab.b_active++;
78: bn = bp->b_blkno;
79: dn = minor(bp->b_dev);
80: cn = bn/12;
81: sn = bn%12;
82: RKADDR->rkda = (dn<<13) | (cn<<4) | sn;
83: RKADDR->rkba = bp->b_un.b_addr;
84: RKADDR->rkwc = -(bp->b_bcount>>1);
85: com = ((bp->b_xmem&3) << 4) | IENABLE | GO;
86: if(bp->b_flags & B_READ)
87: com |= RCOM; else
88: com |= WCOM;
89: RKADDR->rkcs = com;
90: dk_busy |= 1<<DK_N;
91: dk_numb[DK_N] += 1;
92: com = bp->b_bcount>>6;
93: dk_wds[DK_N] += com;
94: }
95:
96: rkintr()
97: {
98: register struct buf *bp;
99:
100: if (rktab.b_active == NULL)
101: return;
102: dk_busy &= ~(1<<DK_N);
103: bp = rktab.b_actf;
104: rktab.b_active = NULL;
105: if (RKADDR->rkcs < 0) { /* error bit */
106: deverror(bp, RKADDR->rker, RKADDR->rkds);
107: RKADDR->rkcs = RESET|GO;
108: while((RKADDR->rkcs&CTLRDY) == 0)
109: ;
110: if (++rktab.b_errcnt <= 10) {
111: rkstart();
112: return;
113: }
114: bp->b_flags |= B_ERROR;
115: }
116: rktab.b_errcnt = 0;
117: rktab.b_actf = bp->av_forw;
118: bp->b_resid = 0;
119: iodone(bp);
120: rkstart();
121: }
122:
123: rkread(dev)
124: dev_t dev;
125: {
126:
127: physio(rkstrategy, &rrkbuf, dev, B_READ);
128: }
129:
130: rkwrite(dev)
131: dev_t dev;
132: {
133:
134: physio(rkstrategy, &rrkbuf, dev, B_WRITE);
135: }
Defined functions
Defined variables
rktab
defined in line
42; used 13 times
Defined struct's
Defined macros
ARDY
defined in line
23;
never used
DK_N
defined in line
30; used 4 times
DRY
defined in line
22;
never used
GO
defined in line
19; used 2 times
NRK
defined in line
13;
never used
RCOM
defined in line
18; used 1 times
RESET
defined in line
16; used 1 times
WCOM
defined in line
17; used 1 times
WLO
defined in line
24;
never used