Commit | Line | Data |
---|---|---|
5eaa5c61 BJ |
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 | } |