Ultrix-3.1/sys/sas/rk.c

Compare this file to the similar file:
Show the results in this format:

/*
 * SCCSID: @(#)rk.c	3.0	4/21/86
 */
/**********************************************************************
 *   Copyright (c) Digital Equipment Corporation 1984, 1985, 1986.    *
 *   All Rights Reserved. 					      *
 *   Reference "/usr/src/COPYRIGHT" for applicable restrictions.      *
 **********************************************************************/

/*
 * RK05 standalone disk driver
 * Fred Canter
 */

#include <sys/param.h>
#include <sys/inode.h>
#include "saio.h"

#define	NRK	4
#define	NRKBLK	4872

#define	RESET	0
#define	WCOM	2
#define	RCOM	4
#define	GO	01
#define	DRESET	014
#define	IENABLE	0100
#define	DRY	0200
#define	ARDY	0100
#define	WLO	020000
#define	CTLRDY	0200

struct	device
{
	int	rkds;
	int	rker;
	int	rkcs;
	int	rkwc;
	caddr_t	rkba;
	int	rkda;
};

rkstrategy(io, func)
register struct iob *io;
{
	register struct device *rkaddr;
	register com;
	daddr_t bn;
	int dn, cn, sn;
	int errcnt;

	rkaddr = devsw[io->i_ino.i_dev].dv_csr;
	errcnt = 0;
retry:
	bn = io->i_bn;
	dn = io->i_unit;
	cn = bn/12;
	sn = bn%12;
	rkaddr->rkda = (dn<<13) | (cn<<4) | sn;
	rkaddr->rkba = io->i_ma;
	rkaddr->rkwc = -(io->i_cc>>1);
	com = (segflag<<4)|GO;
	if (func == READ)
		com |= RCOM; else
		com |= WCOM;
	rkaddr->rkcs = com;
	while ((rkaddr->rkcs&CTLRDY) == 0)
		;
	if (rkaddr->rkcs<0) {	/* error bit */
		if(errcnt == 0) {
			printf("\nRK unit %d disk error: cyl=%d sect=%d",
				dn, cn, sn);
			printf("\ncs=%o ds=%o er=%o",
			    rkaddr->rkcs, rkaddr->rkds, rkaddr->rker);
		}
		if(++errcnt >= 10) {
			printf("\n(FATAL ERROR)\n");
			return(-1);
		}
		rkaddr->rkcs = RESET|GO;
		while((rkaddr->rkcs&CTLRDY) == 0) ;
		goto retry;
	}
	if(errcnt)
		printf("\n(RECOVERED by retry)\n");
	return(io->i_cc);
}