xref: /csrg-svn/sys/vax/stand/rk.c (revision 29306)
123237Smckusick /*
2*29306Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
323237Smckusick  * All rights reserved.  The Berkeley software License Agreement
423237Smckusick  * specifies the terms and conditions for redistribution.
523237Smckusick  *
6*29306Smckusick  *	@(#)rk.c	7.1 (Berkeley) 06/05/86
723237Smckusick  */
81915Swnj 
91915Swnj /*
103263Swnj  * RK611/RK07
111915Swnj  */
129806Ssam #include "../machine/pte.h"
131915Swnj 
141915Swnj #include "../h/param.h"
151915Swnj #include "../h/inode.h"
167446Sroot #include "../h/fs.h"
179186Ssam 
189186Ssam #include "../vaxuba/ubareg.h"
199186Ssam #include "../vaxuba/rkreg.h"
209186Ssam 
211915Swnj #include "saio.h"
223263Swnj #include "savax.h"
231915Swnj 
243263Swnj u_short	rkstd[] = { 0777440 };
253263Swnj short	rk_off[] = { 0, 241, 0, -1, -1, -1, 393, -1 };
261915Swnj 
271915Swnj rkopen(io)
283263Swnj 	register struct iob *io;
291915Swnj {
303349Swnj 	register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]);
311915Swnj 
323263Swnj 	if (rk_off[io->i_boff] == -1 ||
331915Swnj 	    io->i_boff < 0 || io->i_boff > 7)
341915Swnj 		_stop("rk bad unit");
353263Swnj 	io->i_boff = rk_off[io->i_boff] * NRKSECT*NRKTRK;
363349Swnj 	rkaddr->rkcs2 = RKCS2_SCLR;
373349Swnj 	rkwait(rkaddr);
381915Swnj }
391915Swnj 
401915Swnj rkstrategy(io, func)
413263Swnj 	register struct iob *io;
421915Swnj {
433263Swnj 	register struct rkdevice *rkaddr = (struct rkdevice *)ubamem(io->i_unit, rkstd[0]);
443263Swnj 	int com;
451915Swnj 	daddr_t bn;
461915Swnj 	short dn, cn, sn, tn;
473349Swnj 	int ubinfo, errcnt = 0;
481915Swnj 
493349Swnj retry:
501915Swnj 	ubinfo = ubasetup(io, 1);
511915Swnj 	bn = io->i_bn;
521915Swnj 	dn = io->i_unit;
533263Swnj 	cn = bn/(NRKSECT*NRKTRK);
543263Swnj 	sn = bn%NRKSECT;
553263Swnj 	tn = (bn / NRKSECT) % NRKTRK;
563263Swnj 	rkaddr->rkcs2 = dn;
573263Swnj 	rkaddr->rkcs1 = RK_CDT|RK_PACK|RK_GO;
583263Swnj 	rkwait(rkaddr);
593349Swnj 	rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
603349Swnj 	rkwait(rkaddr);
613263Swnj 	rkaddr->rkda = sn | (tn << 8);
623263Swnj 	rkaddr->rkcyl = cn;
633263Swnj 	rkaddr->rkba = ubinfo;
643263Swnj 	rkaddr->rkwc = -(io->i_cc >> 1);
654038Swnj 	com = RK_CDT|((ubinfo>>8)&0x300)|RK_GO;
663263Swnj 	if (func == READ)
673263Swnj 		com |= RK_READ;
683263Swnj 	else
693263Swnj 		com |= RK_WRITE;
703263Swnj 	rkaddr->rkcs1 = com;
713263Swnj 	rkwait(rkaddr);
723349Swnj 	while ((rkaddr->rkds & RKDS_SVAL) == 0)
731915Swnj 		;
743263Swnj 	ubafree(io, ubinfo);
753263Swnj 	if (rkaddr->rkcs1 & RK_CERR) {
763349Swnj 		printf("rk error: (cyl,trk,sec)=(%d,%d,%d) cs2=%b er=%b\n",
773349Swnj 		    cn, tn, sn, rkaddr->rkcs2, RKCS2_BITS,
783349Swnj 		    rkaddr->rker, RKER_BITS);
793349Swnj 		rkaddr->rkcs1 = RK_CDT|RK_DCLR|RK_GO;
803263Swnj 		rkwait(rkaddr);
813349Swnj 		if (errcnt == 10) {
823349Swnj 			printf("rk: unrecovered error\n");
833349Swnj 			return (-1);
843349Swnj 		}
853349Swnj 		errcnt++;
863349Swnj 		goto retry;
871915Swnj 	}
883349Swnj 	if (errcnt)
893349Swnj 		printf("rk: recovered by retry\n");
901915Swnj 	return (io->i_cc);
911915Swnj }
923263Swnj 
933263Swnj rkwait(rkaddr)
943263Swnj 	register struct rkdevice *rkaddr;
953263Swnj {
963263Swnj 
973263Swnj 	while ((rkaddr->rkcs1 & RK_CRDY) == 0)
983263Swnj 		;
993263Swnj }
10010024Ssam 
10110024Ssam /*ARGSUSED*/
10210024Ssam rkioctl(io, cmd, arg)
10310024Ssam 	struct iob *io;
10410024Ssam 	int cmd;
10510024Ssam 	caddr_t arg;
10610024Ssam {
10710024Ssam 
10810024Ssam 	return (ECMD);
10910024Ssam }
110