4.4BSD/usr/src/sys/tahoe/stand/vdformat/vdfmt.c

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

#ifndef lint
static char sccsid[] = "@(#)vdfmt.c	1.7 (Berkeley/CCI) 6/24/90";
#endif

/*
**
*/

#include	"vdfmt.h"

main()
{
	exdent(-1);
	print("VDFORMAT            Berkeley Version 1.7 \n\n");

	for(;;) {
		determine_controller_types();
		print(
		  "\nType `Help' for help, `Start' to execute operations.\n\n");
		if(!_setjmp(reset_environ)) {
			init_environment();
			for(;;) {
				if(!_setjmp(quit_environ)) {
					reset_operation_tables();
					process_commands();
				}
				else
					report_unexecuted_ops();
			}
		}
	}
}


/*
**
*/

report_unexecuted_ops()
{
	register int	ctlr, drive;
	char *header = "The following operations will not be executed:\n";

	indent();
	for(ctlr=0; ctlr<MAXCTLR; ctlr++)
		for(drive=0; drive<MAXDRIVE; drive++)
			if(ops_to_do[ctlr][drive].op) {
				print(header);
				if(strlen(header)) {
					indent();
					header = "";
					print(header);
				}
				display_operations(ctlr, drive);
				ops_to_do[ctlr][drive].op = 0;
			}
	exdent(-1);
}


/*
**
*/
#define	VDBASE	0xffff2000	/* address of first controller */
#define	VDOFF	0x100		/* offset between controllers */

determine_controller_types()
{
	extern fmt_err	*smd_decode_position(), *smd_e_decode_position();
	extern bs_entry	*smd_code_position(), *smd_e_code_position();
	register int	ctlr, drive;
	register ctlr_info *ci;

	/* Identify which controllers are present and what type they are. */
	num_controllers = 0;
	for(ctlr = 0; ctlr < MAXCTLR; ctlr++) {
		ci = &c_info[ctlr];
		ci->addr = (struct vddevice *)(VDBASE+(ctlr*VDOFF));
		if(!badaddr(ci->addr, 2)) {
			printf("controller %d: ", ctlr);
			num_controllers++;
			ci->addr->vdreset = (unsigned)0xffffffff;
			DELAY(1000000);
			if(ci->addr->vdreset!=(unsigned)0xffffffff) {
				ci->alive = u_true;
				ci->type = VDTYPE_VDDC;
				ci->name = "VDDC";
				ci->decode_pos = smd_decode_position;
				ci->code_pos = smd_code_position;
				printf("vddc\n");
				DELAY(1000000);
			} else {
				ci->alive = u_true;
				ci->type = VDTYPE_SMDE;
				ci->name = "SMD-E";
				ci->addr->vdrstclr = 0;
				ci->decode_pos = smd_e_decode_position;
				ci->code_pos = smd_e_code_position;
				printf("smd-e\n");
				DELAY(3000000);
			}
		} else  {
			ci->alive = u_false;
			ci->type = -1;
		}
		for(drive=0; drive<MAXDRIVE; drive++)
			d_info[ctlr][drive].alive = u_unknown;
	}
	if(num_controllers == 0)
		_stop("vdfmt: I can't find any disk controllers.  Giving up!");
}


/*
**	Init_environment is used to reset everything to it's initial state.
** All previously stored drive information is lost when this command
** is executed.
*/

init_environment()
{
	register int	ctlr, drive;

	/* clear list of operations to do */
	for(ctlr=0; ctlr<MAXCTLR; ctlr++) {
		for(drive=0; drive<MAXDRIVE; drive++) {
			bzero((char *)&d_info[ctlr][drive],
			    sizeof(d_info[ctlr][drive]));
			d_info[ctlr][drive].alive = u_unknown;
			d_info[ctlr][drive].id = -1;
		}
	}
	/* Init pattern table pointers */
	pattern_address[0] = pattern_0;
	pattern_address[1] = pattern_1;
	pattern_address[2] = pattern_2;
	pattern_address[3] = pattern_3;
	pattern_address[4] = pattern_4;
	pattern_address[5] = pattern_5;
	pattern_address[6] = pattern_6;
	pattern_address[7] = pattern_7;
	pattern_address[8] = pattern_8;
	pattern_address[9] = pattern_9;
	pattern_address[10] = pattern_10;
	pattern_address[11] = pattern_11;
	pattern_address[12] = pattern_12;
	pattern_address[13] = pattern_13;
	pattern_address[14] = pattern_14;
	pattern_address[15] = pattern_15;
	/* Init operations command table */
	operations[0].routine = format;
	operations[0].op_name = "Format";
	operations[0].op_action = "Formatting";
	operations[1].routine = verify;
	operations[1].op_name = "Verify";
	operations[1].op_action = "Verification";
	operations[2].routine = relocate;
	operations[2].op_name = "Relocate";
	operations[2].op_action = "Relocation";
	operations[3].routine = info;
	operations[3].op_name = "Info";
	operations[3].op_action = "Information gathering";
	operations[4].routine = correct;
	operations[4].op_name = "Correct";
	operations[4].op_action = "Correction";
	operations[5].routine = profile;
	operations[5].op_name = "Profile";
	operations[5].op_action = "Profiling";
	operations[6].routine = exercise;
	operations[6].op_name = "Exercise";
	operations[6].op_action = "exercising";
	bad_map = &norm_bad_map;
}


/*
**	Reset_operation_tables reinitializes all the  tables that
**  control the sequence of formatter operations.
*/

reset_operation_tables()
{
	register int	ctlr, drive;

	/* clear list of operations to do */
	for(ctlr=0; ctlr<MAXCTLR; ctlr++) {
		for(drive=0; drive<MAXDRIVE; drive++) {
			ops_to_do[ctlr][drive].op = 0;
			ops_to_do[ctlr][drive].numpat = 1;
		}
	}
	kill_processes = false;
}