|
|
1.1 root 1: /* hk.c 4.1 11/9/80 */
2:
3: /*
4: * RK7 disk driver, standalone version
5: */
6:
7: #include "../h/param.h"
8: #include "../h/inode.h"
9: #include "../h/pte.h"
10: #include "../h/uba.h"
11: #include "saio.h"
12:
13: #define RK7ADDR ((struct rk7_regs *)(PHYSUMEM - 0160000 + 0177440))
14: #define FORMAT_22 0
15: #define RESET 0102000
16: #define WCOM 022
17: #define RCOM 020
18: #define RK07 02000
19: #define GO 01
20: #define RELEASE 010
21: #define CTLRDY 0200
22: #define PACKAK 000003 /* Pack Acknowledge */
23:
24:
25: struct rk7_regs
26: {
27: short rk7cs1;
28: short rk7wc;
29: unsigned short rk7ba;
30: short rk7da;
31: short rk7cs2;
32: short rk7ds;
33: short rk7er;
34: short rk7asof;
35: short rk7dc;
36: short rk7null;
37: short rk7db;
38: short rk7mr1;
39: short rk7ecps;
40: short rk7ecpt;
41: short rk7mr2;
42: short rk7mr3;
43: };
44:
45: rk7strategy(io, func)
46: register struct iob *io;
47: {
48: register short com;
49: daddr_t bn;
50: short dn, cn, sn, tn;
51: int ubinfo;
52:
53: ubinfo = ubasetup( io, 1 );
54: bn = io->i_bn;
55: dn = io->i_unit;
56: cn = bn/66;
57: sn = bn%22;
58: tn = (bn / 22) % 3;
59:
60: RK7ADDR -> rk7cs2 = dn;
61: RK7ADDR -> rk7cs1 = PACKAK | RK07;
62: while((com = RK7ADDR->rk7cs1) & 01);
63:
64: RK7ADDR -> rk7da = sn | (tn << 8);
65: RK7ADDR -> rk7dc = cn;
66: RK7ADDR->rk7ba = ubinfo;
67: RK7ADDR->rk7wc = -(io->i_cc >> 1);
68:
69: com = ((ubinfo & 0x30000) >> 8 ) | RK07 | GO | ( FORMAT_22<< 12);
70: if(func == READ)
71: com |= RCOM; else
72: com |= WCOM;
73: RK7ADDR->rk7cs1 = com;
74:
75: while (((com = RK7ADDR->rk7cs1) & CTLRDY) == 0);
76: while(RK7ADDR->rk7ds >= 0);
77:
78: ubafree (ubinfo);
79: if (RK7ADDR->rk7cs1 < 0) { /* error bit */
80: printf ("RK07 error: unit %d, cyl %d, trk %d, sect %d, ",
81: io->i_unit, cn, tn, sn);
82: printf ("cs1 %X, cs2 %X, err %X\n",
83: RK7ADDR->rk7cs1, RK7ADDR->rk7cs2, RK7ADDR->rk7er);
84:
85: RK7ADDR->rk7cs1 = RESET|GO;
86: while(((com = RK7ADDR->rk7cs1)&CTLRDY) == 0);
87: return (-1);
88: }
89: return (io->i_cc);
90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.