4.4BSD/usr/src/sys/tahoe/stand/vdformat/online/io.c

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

#ifndef lint
static char sccsid[] = "%W% (Berkeley/CCI) %G%";
#endif

#include	"vdfmt.h"
#include	"cmd.h"


/*
**
*/

static cmd_text_element	nul_table[] = {
	{ 0,	"",	"" }
};

int	wait_for_char = 1;		/* synchronous by default */
int vdtimeout;
char	*clean_up = "Cleaning up...  Please wait.\n";


vread(sn, buf, seccnt)
int sn, seccnt;
char *buf;
{
	return (vrdwr(sn, buf, seccnt, VDOP_RD));
}

vwrite(sn, buf, seccnt)
int sn, seccnt;
char *buf;
{
	return (vrdwr(sn, buf, seccnt, VDOP_WD));
}

vrdwr(sn, buf, seccnt, op)
int sn, seccnt, op;
char *buf;
{
	dskadr	dskaddr;

	dskaddr.cylinder = sn / lab->d_secpercyl;
	sn %= lab->d_secpercyl;
	dskaddr.track = sn / lab->d_nsectors;
	dskaddr.sector = sn % lab->d_nsectors;
	if (access_dsk(buf, &dskaddr, op, seccnt, 1) & DCBS_HARD)
		return (0);
	return (seccnt);
}

/*
**	access_dsk is used by other routines to do reads and writes to the disk.
** The status of the read / write is returned to the caller for processing.
*/

access_dsk(buf, dskaddr, func, count, wait)
char	*buf;
dskadr	*dskaddr;
int	func, count, wait;
{
	struct format_op fop;

	cur.daddr.cylinder = dskaddr->cylinder;
	cur.daddr.track = dskaddr->track;
	wait_for_char = 0;

	bzero((char *)&fop, sizeof(fop));
	fop.df_buf = buf;
	fop.df_count = count * lab->d_secsize;
	fop.df_startblk = ((dskaddr->cylinder & 0xfff) * lab->d_ntracks +
	    dskaddr->track) * lab->d_nsectors + dskaddr->sector;
	fop.df_reg[0] = func;
	(void) ioctl(diskfd, DIOCWFORMAT, &fop);
	wait_for_char = 1;
	dcb.operrsta = fop.df_reg[0];		/* XXX */
	dcb.err_code = fop.df_reg[1];		/* XXX */
	return (fop.df_reg[0]);
}


/*
** 	data_ok checks an error status word for bit patterns
**  associated with error conditions from the VDDC controller.  If a hardware
**  error is present then the problem is reported on the console.
**  If a data error is present the a zero is returned.
**  If everything is OK then a 1 is returned.
*/

data_ok()
{
	register int	status = dcb.operrsta;

	if(status & HARD_ERROR){
		vd_error("data transfer");
		printf("  op = 0x%x\n", dcb.opcode);
		dcb.operrsta &= HEADER_ERROR;
	}
	return (int)(!(status & (DATA_ERROR | HEADER_ERROR)));
}

vd_error(s)
	char *s;
{
	register int	status = dcb.operrsta;

	print("%s error at sector %d (cyl %d trk %d sect %d),\n",
	    to_sector(cur.daddr), dcb.err_cyl, dcb.err_trk, dcb.err_sec);
	print("  status=%b", dcb.operrsta, VDERRBITS);
	if (C_INFO->type == VDTYPE_SMDE)
		printf(", ecode=0x%x", dcb.err_code);
	printf("\n");
}

/*
**
*/

static	int	indent_count;


/*
**
*/

indent()
{
	indent_count += 2;
}


/*
**
*/

exdent(count)
int	count;
{
	if(count == -1)
		indent_count = 0;
	else
		indent_count -= count * 2;
	if(indent_count < 0)
			indent_count = 0;
}


/*
**
*/
/*VARARGS1*/
print(par0, par1, par2, par3, par4, par5, par6)
char	*par0, *par1, *par2, *par3, *par4, *par5, *par6;
{
	register int	count = indent_count;

	while(count--)
		printf(" ");
	printf(par0, par1, par2, par3, par4, par5, par6);
/*	DELAY((strlen(par0) + 20) * 9000); */
}