xref: /original-bsd/sys/tahoe/stand/vdformat/vdfmt.c (revision 252ddc1c)
1 #ifndef lint
2 static char sccsid[] = "@(#)vdfmt.c	1.7 (Berkeley/CCI) 06/24/90";
3 #endif
4 
5 /*
6 **
7 */
8 
9 #include	"vdfmt.h"
10 
11 main()
12 {
13 	exdent(-1);
14 	print("VDFORMAT            Berkeley Version 1.7 \n\n");
15 
16 	for(;;) {
17 		determine_controller_types();
18 		print(
19 		  "\nType `Help' for help, `Start' to execute operations.\n\n");
20 		if(!_setjmp(reset_environ)) {
21 			init_environment();
22 			for(;;) {
23 				if(!_setjmp(quit_environ)) {
24 					reset_operation_tables();
25 					process_commands();
26 				}
27 				else
28 					report_unexecuted_ops();
29 			}
30 		}
31 	}
32 }
33 
34 
35 /*
36 **
37 */
38 
39 report_unexecuted_ops()
40 {
41 	register int	ctlr, drive;
42 	char *header = "The following operations will not be executed:\n";
43 
44 	indent();
45 	for(ctlr=0; ctlr<MAXCTLR; ctlr++)
46 		for(drive=0; drive<MAXDRIVE; drive++)
47 			if(ops_to_do[ctlr][drive].op) {
48 				print(header);
49 				if(strlen(header)) {
50 					indent();
51 					header = "";
52 					print(header);
53 				}
54 				display_operations(ctlr, drive);
55 				ops_to_do[ctlr][drive].op = 0;
56 			}
57 	exdent(-1);
58 }
59 
60 
61 /*
62 **
63 */
64 #define	VDBASE	0xffff2000	/* address of first controller */
65 #define	VDOFF	0x100		/* offset between controllers */
66 
67 determine_controller_types()
68 {
69 	extern fmt_err	*smd_decode_position(), *smd_e_decode_position();
70 	extern bs_entry	*smd_code_position(), *smd_e_code_position();
71 	register int	ctlr, drive;
72 	register ctlr_info *ci;
73 
74 	/* Identify which controllers are present and what type they are. */
75 	num_controllers = 0;
76 	for(ctlr = 0; ctlr < MAXCTLR; ctlr++) {
77 		ci = &c_info[ctlr];
78 		ci->addr = (struct vddevice *)(VDBASE+(ctlr*VDOFF));
79 		if(!badaddr(ci->addr, 2)) {
80 			printf("controller %d: ", ctlr);
81 			num_controllers++;
82 			ci->addr->vdreset = (unsigned)0xffffffff;
83 			DELAY(1000000);
84 			if(ci->addr->vdreset!=(unsigned)0xffffffff) {
85 				ci->alive = u_true;
86 				ci->type = VDTYPE_VDDC;
87 				ci->name = "VDDC";
88 				ci->decode_pos = smd_decode_position;
89 				ci->code_pos = smd_code_position;
90 				printf("vddc\n");
91 				DELAY(1000000);
92 			} else {
93 				ci->alive = u_true;
94 				ci->type = VDTYPE_SMDE;
95 				ci->name = "SMD-E";
96 				ci->addr->vdrstclr = 0;
97 				ci->decode_pos = smd_e_decode_position;
98 				ci->code_pos = smd_e_code_position;
99 				printf("smd-e\n");
100 				DELAY(3000000);
101 			}
102 		} else  {
103 			ci->alive = u_false;
104 			ci->type = -1;
105 		}
106 		for(drive=0; drive<MAXDRIVE; drive++)
107 			d_info[ctlr][drive].alive = u_unknown;
108 	}
109 	if(num_controllers == 0)
110 		_stop("vdfmt: I can't find any disk controllers.  Giving up!");
111 }
112 
113 
114 /*
115 **	Init_environment is used to reset everything to it's initial state.
116 ** All previously stored drive information is lost when this command
117 ** is executed.
118 */
119 
120 init_environment()
121 {
122 	register int	ctlr, drive;
123 
124 	/* clear list of operations to do */
125 	for(ctlr=0; ctlr<MAXCTLR; ctlr++) {
126 		for(drive=0; drive<MAXDRIVE; drive++) {
127 			bzero((char *)&d_info[ctlr][drive],
128 			    sizeof(d_info[ctlr][drive]));
129 			d_info[ctlr][drive].alive = u_unknown;
130 			d_info[ctlr][drive].id = -1;
131 		}
132 	}
133 	/* Init pattern table pointers */
134 	pattern_address[0] = pattern_0;
135 	pattern_address[1] = pattern_1;
136 	pattern_address[2] = pattern_2;
137 	pattern_address[3] = pattern_3;
138 	pattern_address[4] = pattern_4;
139 	pattern_address[5] = pattern_5;
140 	pattern_address[6] = pattern_6;
141 	pattern_address[7] = pattern_7;
142 	pattern_address[8] = pattern_8;
143 	pattern_address[9] = pattern_9;
144 	pattern_address[10] = pattern_10;
145 	pattern_address[11] = pattern_11;
146 	pattern_address[12] = pattern_12;
147 	pattern_address[13] = pattern_13;
148 	pattern_address[14] = pattern_14;
149 	pattern_address[15] = pattern_15;
150 	/* Init operations command table */
151 	operations[0].routine = format;
152 	operations[0].op_name = "Format";
153 	operations[0].op_action = "Formatting";
154 	operations[1].routine = verify;
155 	operations[1].op_name = "Verify";
156 	operations[1].op_action = "Verification";
157 	operations[2].routine = relocate;
158 	operations[2].op_name = "Relocate";
159 	operations[2].op_action = "Relocation";
160 	operations[3].routine = info;
161 	operations[3].op_name = "Info";
162 	operations[3].op_action = "Information gathering";
163 	operations[4].routine = correct;
164 	operations[4].op_name = "Correct";
165 	operations[4].op_action = "Correction";
166 	operations[5].routine = profile;
167 	operations[5].op_name = "Profile";
168 	operations[5].op_action = "Profiling";
169 	operations[6].routine = exercise;
170 	operations[6].op_name = "Exercise";
171 	operations[6].op_action = "exercising";
172 	bad_map = &norm_bad_map;
173 }
174 
175 
176 /*
177 **	Reset_operation_tables reinitializes all the  tables that
178 **  control the sequence of formatter operations.
179 */
180 
181 reset_operation_tables()
182 {
183 	register int	ctlr, drive;
184 
185 	/* clear list of operations to do */
186 	for(ctlr=0; ctlr<MAXCTLR; ctlr++) {
187 		for(drive=0; drive<MAXDRIVE; drive++) {
188 			ops_to_do[ctlr][drive].op = 0;
189 			ops_to_do[ctlr][drive].numpat = 1;
190 		}
191 	}
192 	kill_processes = false;
193 }
194