xref: /csrg-svn/sys/vax/stand/rk.c (revision 3263)
1*3263Swnj /*	rk.c	4.2	81/03/15	*/
21915Swnj 
31915Swnj /*
4*3263Swnj  * RK611/RK07
51915Swnj  */
61915Swnj 
71915Swnj #include "../h/param.h"
8*3263Swnj #include "../h/rkreg.h"
91915Swnj #include "../h/inode.h"
101915Swnj #include "../h/pte.h"
11*3263Swnj #include "../h/ubareg.h"
121915Swnj #include "saio.h"
13*3263Swnj #include "savax.h"
141915Swnj 
15*3263Swnj u_short	rkstd[] = { 0777440 };
16*3263Swnj short	rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 };
171915Swnj 
181915Swnj rkopen(io)
19*3263Swnj 	register struct iob *io;
201915Swnj {
211915Swnj 
22*3263Swnj 	if (rk_off[io->i_boff] == -1 ||
231915Swnj 	    io->i_boff < 0 || io->i_boff > 7)
241915Swnj 		_stop("rk bad unit");
25*3263Swnj 	io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK;
261915Swnj }
271915Swnj 
281915Swnj rkstrategy(io, func)
29*3263Swnj 	register struct iob *io;
301915Swnj {
31*3263Swnj 	register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]);
32*3263Swnj 	int com;
331915Swnj 	daddr_t bn;
341915Swnj 	short dn, cn, sn, tn;
351915Swnj 	int ubinfo;
361915Swnj 
371915Swnj 	ubinfo = ubasetup(io, 1);
381915Swnj 	bn = io->i_bn;
391915Swnj 	dn = io->i_unit;
40*3263Swnj 	cn = bn/(NRKSECT*NRKTRK);
41*3263Swnj 	sn = bn%NRKSECT;
42*3263Swnj 	tn = (bn / NRKSECT) % NRKTRK;
43*3263Swnj 	rkaddr->rkcs2 = dn;
44*3263Swnj 	rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO;
45*3263Swnj 	rkwait(rkaddr);
46*3263Swnj 	rkaddr->rkda = sn | (tn << 8);
47*3263Swnj 	rkaddr->rkcyl = cn;
48*3263Swnj 	rkaddr->rkba = ubinfo;
49*3263Swnj 	rkaddr->rkwc = -(io->i_cc >> 1);
50*3263Swnj 	com = RK_CDT|((ubinfo>>16)&0x30)|RK_GO;
51*3263Swnj 	if (func == READ)
52*3263Swnj 		com |= RK_READ;
53*3263Swnj 	else
54*3263Swnj 		com |= RK_WRITE;
55*3263Swnj 	rkaddr->rkcs1 = com;
56*3263Swnj 	rkwait(rkaddr);
57*3263Swnj 	while ((rkaddr->rkds & RK_SVAL) == 0)
581915Swnj 		;
59*3263Swnj 	ubafree(io, ubinfo);
60*3263Swnj 	if (rkaddr->rkcs1 & RK_CERR) {
61*3263Swnj 		printf("rk error: cyl %d trk %d sec %d cs1 %o cs2 %o err %o\n",
62*3263Swnj 		    cn, tn, sn, rkaddr->rkcs1, rkaddr->rkcs2, rkaddr->rker);
63*3263Swnj 		rkaddr->rkcs1 = RK_DCLR|RK_GO;
64*3263Swnj 		rkwait(rkaddr);
651915Swnj 		return (-1);
661915Swnj 	}
671915Swnj 	return (io->i_cc);
681915Swnj }
69*3263Swnj 
70*3263Swnj rkwait(rkaddr)
71*3263Swnj 	register struct rkdevice *rkaddr;
72*3263Swnj {
73*3263Swnj 
74*3263Swnj 	while ((rkaddr->rkcs1 & RK_CRDY) == 0)
75*3263Swnj 		;
76*3263Swnj }
77