BSD 4 development
[unix-history] / usr / src / sys / newdev / rk7.c
CommitLineData
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
29struct 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
49struct buf rk7tab;
50struct buf rrk7buf;
51
52int rk7_ubinfo;
53
54rk7strategy(bp)
55register 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
75rk7start()
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/*
92printf("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/*
109printf("cs1 in start = %d(bit15) %o(remainder)\n",(RK7ADDR->rk7cs1>>15)&01,RK7ADDR->rk7cs1 & 077777);
110*/
111}
112
113rk7intr()
114{
115 register struct buf *bp;
116
117
118/*
119printf("in intr->rk7ds = %d(bit 15) %o(remainder)",(RK7ADDR->rk7ds>>15)&01,RK7ADDR->rk7ds & 077777);
120printf("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);
129printf("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
155rk7read(dev)
156dev_t dev;
157{
158
159 physio(rk7strategy, &rrk7buf, dev, B_READ, minphys);
160}
161
162rk7write(dev)
163dev_t dev;
164{
165
166 physio(rk7strategy, &rrk7buf, dev, B_WRITE, minphys);
167}