File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / d / pits / vddc_ex.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:30:29 2019 UTC (6 years, 11 months ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
Power 6/32 Unix version 1.21

#include "vddc.h"

extern int cyccnt;
extern long Probe, iob0, iob1, iob2, iob3, iob4;
extern struct DEVPAR devpar[];
extern int type, cont;
long v_err1, v_errprb, v_err2;

/*	
**	Routine to exercise VDDC
*/

vddc_ex()
{	register long unit, last_blk, nodr;
	long track;
	struct DEVPAR *dp;
	v_err1 = v_err2 = v_errprb = 0;		/* Clear error flags */
for (nodr=unit=0;devpar[unit+type*5].nocyl;unit++) {
	if (devpar[unit+type*5].alive) {
	dp = &devpar[unit+type*5];
		nodr++;
		Probe = 1;
		last_blk = v_probe(unit);
		Probe = 0;
		if ( last_blk > 0) {
			writes("\n\tWrite/Read/Compare test\n");
			writes("\nExercising   cylinder   track   sectors\n");
			for(track=0;track<dp->notraks;track++) {
				v_ex1(unit,dp->secs_trak/2,track,dp->nocyl-2);
			}
		}
		v_ex2(unit,dp->nocyl-2,dp->secs_trak/2);
	}
}
	if (!nodr) {
		writes("\n\n...No drive available");
		return; 
	}
	if (!v_err1 && !v_errprb && !v_err2) {
		writes("\n\nVDDC passed...\n");
		}
	else  	{
		writes("\n\nVDDC failed...\n");
	}
}

v_ex1(sdev,factor,trk,cyl)
long factor, trk, cyl;
int sdev;
{	register long ix, pat, *sptr, *dptr, loop;
	unsigned short *s, *d;

	pat = 0xabab0000;	/* Pattern */
	sptr = &iob0;		/* Source buffer */
	dptr = &iob3;		/* Destination buffer */
	writes("\n");
	writes("\t\t");writed(cyl);
	writes("\t  ");writed(trk);
	writes("\t ");writes("0-");
	writed(devpar[sdev+type*5].secs_trak-1);
for(loop=0;loop<50;loop++) {
/* 
**	Initialize pattern in source buffer 
*/
	for (ix=0; ix<(BLKSIZ/4)*factor; ix++) { 
		sptr[ix] = pat + ix;	/* init. pattern in source buffer */
		dptr[ix] = 0;		/* Clear destination buffer */
	}
/* 
**	Write x sectors of data 
*/
	if (vddc_op2(W_DATA,sdev,cyl,trk,0,factor,&iob0)==0) {
		v_err1 = 1;
		return(0);
	}
/* 
**	Read x sectors of data 
*/
	if (vddc_op2(R_DATA,sdev,cyl,trk,0,factor,&iob3)==0) {
		v_err1 = 1;
		return(0);
	}
	s = (unsigned short *)&iob0;		/* Source buffer */
	d = (unsigned short *)&iob3;		/* Destination buffer */
	for (ix=0; ix<(BLKSIZ/2)*factor; ix++) {
		if (s[ix] != d[ix]) {
			writes("\nCompare error: ");
			writes("expected ");
			writeh(s[ix] & 0xffff);
			writes(" , actual "); writeh(d[ix] & 0xffff);
			writes(", address "); writeh(&d[ix]);
			v_err1 = 1;
		}	
	}
	if (v_err1) loop = 0; 	/* If error then loop forever */
}
}
/*
**	routine to test reverse seek
*/
v_ex2(sdev,maxcyl,factor)
char sdev;
long maxcyl, factor;
{	long cyl, loop;
	writes("\n\n\tReverse Seek Test \n");
	for(loop = 1; loop<=cyccnt ; loop++){  
		writes("\nCycle ");writed (loop);
		for(cyl = maxcyl;cyl >= 0;cyl--){ 
			if(vddc_op3(SEEK,sdev,cyl,0,0)==0){
				v_err2=1;
				return(0);
			}
			DELAY(0x1a0a);	
		}
	if (vddc_op2(R_DATA,sdev,maxcyl,0,0,factor,&iob3)==0) {
		writes("\nfailed going to max cylinder.");
		v_err2 = 1;
		return(0);}
	}
	return(0);
}	
/*	
**	 routine to probe VDDC disk 
*/
v_probe(sdev)
int sdev;
{	register long *dptr, blk, inc;

	blk = 0;
	inc = 2000;
	writes("\n\n\tRead Block test\n");
	while (inc != 0) {
		for(blk += inc;;blk += inc) { /* Read 1 block of data */
			if (vddc_op(R_DATA,sdev,blk,1,&iob0)==0) 
				{ blk -= inc; break; }
		}
		inc /= 2;
	}
	if (blk <= 0) {
		writes("\n...Cannot probe "); writes(devpar[sdev+type*5].name);
		writed(sdev);
		v_errprb = 1;
		return(0); 
	}
	writes("\n"); writes(devpar[sdev+type*5].name); 
        writes(" unit "); writed(sdev); writes(" has ");
	writed((blk*1024)/1000); writes(" Kbytes.\n");
	return(blk);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.