xref: /csrg-svn/sys/vax/stand/rk.c (revision 1915)
1*1915Swnj /*	rk.c	4.1	12/17/80	*/
2*1915Swnj 
3*1915Swnj /*
4*1915Swnj  * RK disk driver, standalone version
5*1915Swnj  */
6*1915Swnj 
7*1915Swnj #include "../h/param.h"
8*1915Swnj #include "../h/inode.h"
9*1915Swnj #include "../h/pte.h"
10*1915Swnj #include "../h/uba.h"
11*1915Swnj #include "saio.h"
12*1915Swnj 
13*1915Swnj #define	RKADDR	((struct rk_regs *)(PHYSUMEM - 0160000 + 0177440))
14*1915Swnj #define FORMAT_22 0
15*1915Swnj #define	RESET	0102000
16*1915Swnj #define	WCOM	022
17*1915Swnj #define	RCOM	020
18*1915Swnj #define RK07	02000
19*1915Swnj #define	GO	01
20*1915Swnj #define RELEASE	010
21*1915Swnj #define	CTLRDY	0200
22*1915Swnj #define	PACKAK	000003	/* Pack Acknowledge */
23*1915Swnj 
24*1915Swnj struct	rk_regs
25*1915Swnj {
26*1915Swnj 	short	rkcs1;
27*1915Swnj 	short	rkwc;
28*1915Swnj 	u_short	rkba;
29*1915Swnj 	short	rkda;
30*1915Swnj 	short	rkcs2;
31*1915Swnj 	short	rkds;
32*1915Swnj 	short	rker;
33*1915Swnj 	short	rkasof;
34*1915Swnj 	short	rkdc;
35*1915Swnj 	short	rknull;
36*1915Swnj 	short	rkdb;
37*1915Swnj 	short	rkmr1;
38*1915Swnj 	short	rkecps;
39*1915Swnj 	short	rkecpt;
40*1915Swnj 	short	rkmr2;
41*1915Swnj 	short	rkmr3;
42*1915Swnj };
43*1915Swnj 
44*1915Swnj struct	devsize {
45*1915Swnj 	daddr_t	cyloff;
46*1915Swnj } rk_sizes[] = {
47*1915Swnj 	0, 146, 246, -1, -1, -1, -1, -1,
48*1915Swnj };
49*1915Swnj 
50*1915Swnj rkopen(io)
51*1915Swnj register struct iob *io;
52*1915Swnj {
53*1915Swnj 
54*1915Swnj 	if (rk_sizes[io->i_boff].cyloff == -1 ||
55*1915Swnj 	    io->i_boff < 0 || io->i_boff > 7)
56*1915Swnj 		_stop("rk bad unit");
57*1915Swnj 	io->i_boff = rk_sizes[io->i_boff].cyloff * 66;
58*1915Swnj }
59*1915Swnj 
60*1915Swnj rkstrategy(io, func)
61*1915Swnj register struct iob *io;
62*1915Swnj {
63*1915Swnj 	register short com;
64*1915Swnj 	daddr_t bn;
65*1915Swnj 	short dn, cn, sn, tn;
66*1915Swnj 	int ubinfo;
67*1915Swnj 
68*1915Swnj 	ubinfo = ubasetup(io, 1);
69*1915Swnj 	bn = io->i_bn;
70*1915Swnj 	dn = io->i_unit;
71*1915Swnj 	cn = bn/66;
72*1915Swnj 	sn = bn%22;
73*1915Swnj 	tn = (bn / 22) % 3;
74*1915Swnj 
75*1915Swnj 	RKADDR->rkcs2 = dn;
76*1915Swnj 	RKADDR->rkcs1 = PACKAK | RK07;
77*1915Swnj 	while ((com = RKADDR->rkcs1) & 01)
78*1915Swnj 		;
79*1915Swnj 	RKADDR->rkda = sn | (tn << 8);
80*1915Swnj 	RKADDR->rkdc = cn;
81*1915Swnj 	RKADDR->rkba = ubinfo;
82*1915Swnj 	RKADDR->rkwc = -(io->i_cc >> 1);
83*1915Swnj 	com = ((ubinfo & 0x30000) >> 8) | RK07 | GO | (FORMAT_22 << 12);
84*1915Swnj 	if(func == READ)
85*1915Swnj 		com |= RCOM; else
86*1915Swnj 		com |= WCOM;
87*1915Swnj 	RKADDR->rkcs1 = com;
88*1915Swnj 	while (((com = RKADDR->rkcs1) & CTLRDY) == 0)
89*1915Swnj 		;
90*1915Swnj 	while(RKADDR->rkds >= 0)
91*1915Swnj 		;
92*1915Swnj 	ubafree(ubinfo);
93*1915Swnj 	if (RKADDR->rkcs1 < 0) {		/* error bit */
94*1915Swnj 		printf("RK07 error: unit %d, cyl %d, trk %d, sect %d, ",
95*1915Swnj 			io->i_unit, cn, tn, sn);
96*1915Swnj 		printf("cs1 %X, cs2 %X, err %X\n",
97*1915Swnj 			RKADDR->rkcs1, RKADDR->rkcs2, RKADDR->rker);
98*1915Swnj 		RKADDR->rkcs1 = RESET|GO;
99*1915Swnj 		while(((com = RKADDR->rkcs1)&CTLRDY) == 0)
100*1915Swnj 			;
101*1915Swnj 		return (-1);
102*1915Swnj 	}
103*1915Swnj 	return (io->i_cc);
104*1915Swnj }
105