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

#include "vddc.h"

extern long Probe, iob0, iob1, iob2, iob3, iob4;
extern struct DEVPAR devpar[];
long v_err;
long format_flag = 0;

/*	Routine to exercise VDDC
*/
vddc_ex()
{	register long unit, last_blk, nodr;

	writes("\n\t** VDDC test **\n");
	format_flag = 0;
	for (nodr=unit=0;devpar[unit].nocyl;unit++) {
		if (devpar[unit].alive) {
			nodr++;
			if (format_flag) vddc_ctlr(FORMAT,unit);
			Probe = 1;
			last_blk = v_probe(unit);
			Probe = 0;
			if ( last_blk > 0) {
 				v_ex1(1,unit,last_blk);
 				v_ex1(2,unit,last_blk-2);
 				v_ex1(3,unit,last_blk-3); }
			}
		}
	if (!nodr) {
		writes("\nNo drive available...");
		return; }
	if (!v_err) writes("\nVDDC passed..\n");
		else  writes("\nVDDC failed..\n");
}

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


	pat = 0xababab00;	/* Pattern */
	sptr = &iob0;		/* Source buffer */
	dptr = &iob3;		/* Destination buffer */

for(v_err=loop=0;loop<40;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 1 block of data */
	if (vddc_op(WR_COMP,sdev,blk,factor,&iob0)==0) { v_err=1; return(0); }

	/* Read 1 block of data */
	if (vddc_op(RD_DATA,sdev,blk,factor,&iob3)==0) { v_err=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("\nExpected ");
			writeh(s[ix] & 0xffff);
			writes(" , actual "); writeh(d[ix] & 0xffff);
			writes(", address "); writeh(&d[ix]);
			v_err = 1;
			}	
		}
	if (v_err) loop = 0; 	/* If error then loop forever */
	}
}


/*	routine to probe VDDC disk 
*/
v_probe(sdev)
char sdev;
{	register long *dptr, blk, inc;

	inc = 2000;
	blk = 0;
	while (inc != 0) {
		for(blk += inc;;blk += inc) { /* Read 1 block of data */
			if (vddc_op(RD_DATA,sdev,blk,1,&iob0)==0) 
				{ blk -= inc; break; }
			}
		inc /= 2;
		}
	if (blk <= 0) {
		writes("\nCannot probe "); writes(devpar[sdev].name);
		return(0); }
	writes("\n"); writes(devpar[sdev].name); 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.