xref: /csrg-svn/sys/vax/stand/rk.c (revision 3263)
1 /*	rk.c	4.2	81/03/15	*/
2 
3 /*
4  * RK611/RK07
5  */
6 
7 #include "../h/param.h"
8 #include "../h/rkreg.h"
9 #include "../h/inode.h"
10 #include "../h/pte.h"
11 #include "../h/ubareg.h"
12 #include "saio.h"
13 #include "savax.h"
14 
15 u_short	rkstd[] = { 0777440 };
16 short	rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 };
17 
18 rkopen(io)
19 	register struct iob *io;
20 {
21 
22 	if (rk_off[io->i_boff] == -1 ||
23 	    io->i_boff < 0 || io->i_boff > 7)
24 		_stop("rk bad unit");
25 	io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK;
26 }
27 
28 rkstrategy(io, func)
29 	register struct iob *io;
30 {
31 	register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]);
32 	int com;
33 	daddr_t bn;
34 	short dn, cn, sn, tn;
35 	int ubinfo;
36 
37 	ubinfo = ubasetup(io, 1);
38 	bn = io->i_bn;
39 	dn = io->i_unit;
40 	cn = bn/(NRKSECT*NRKTRK);
41 	sn = bn%NRKSECT;
42 	tn = (bn / NRKSECT) % NRKTRK;
43 	rkaddr->rkcs2 = dn;
44 	rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO;
45 	rkwait(rkaddr);
46 	rkaddr->rkda = sn | (tn << 8);
47 	rkaddr->rkcyl = cn;
48 	rkaddr->rkba = ubinfo;
49 	rkaddr->rkwc = -(io->i_cc >> 1);
50 	com = RK_CDT|((ubinfo>>16)&0x30)|RK_GO;
51 	if (func == READ)
52 		com |= RK_READ;
53 	else
54 		com |= RK_WRITE;
55 	rkaddr->rkcs1 = com;
56 	rkwait(rkaddr);
57 	while ((rkaddr->rkds & RK_SVAL) == 0)
58 		;
59 	ubafree(io, ubinfo);
60 	if (rkaddr->rkcs1 & RK_CERR) {
61 		printf("rk error: cyl %d trk %d sec %d cs1 %o cs2 %o err %o\n",
62 		    cn, tn, sn, rkaddr->rkcs1, rkaddr->rkcs2, rkaddr->rker);
63 		rkaddr->rkcs1 = RK_DCLR|RK_GO;
64 		rkwait(rkaddr);
65 		return (-1);
66 	}
67 	return (io->i_cc);
68 }
69 
70 rkwait(rkaddr)
71 	register struct rkdevice *rkaddr;
72 {
73 
74 	while ((rkaddr->rkcs1 & RK_CRDY) == 0)
75 		;
76 }
77