xref: /original-bsd/sys/tahoe/stand/vdformat/vdfmt.h (revision 1451ccc8)
1 /*	vdfmt.h	1.7	88/06/07	*/
2 
3 /*
4  * VERSAbus disk controller (vd) disk formatter.
5  */
6 #include <setjmp.h>
7 #include "tahoe/mtpr.h"
8 #include "param.h"
9 #include "buf.h"
10 #include "disklabel.h"
11 #include "inode.h"
12 #include "fs.h"
13 #include "tahoevba/vbaparam.h"
14 #include "tahoevba/vdreg.h"
15 
16 #include "tahoe/cp.h"
17 extern	struct cpdcb_i cpin;		/* found in cons.c */
18 
19 /*
20  * Poll console and return 1 if input is present.
21  */
22 #define	input() \
23     (uncache(&cpin.cp_hdr.cp_unit), (cpin.cp_hdr.cp_unit&CPDONE))
24 
25 /*
26  * Configuration parameters
27  */
28 #define	MAXCTLR		8		/* Maximum # of controllers */
29 #define	MAXDRIVE	16		/* Max drives per controller */
30 
31 #define NUMMAP		1		/* # Cyls in bad sector map */
32 #define	NUMMNT		1		/* # cyls for diagnostics */
33 #define	NUMREL		3		/* # Cyls in relocation area */
34 #define	NUMSYS	(NUMREL+NUMMNT+NUMMAP)	/* Total cyls used by system */
35 
36 #define	MAXTRKS		24
37 #define	MAXSECS_PER_TRK	72		/* at 512 bytes/sector */
38 #define	MAXERR		1000
39 #define	MAXTRKSIZ	((512/sizeof(long)) * MAXSECS_PER_TRK)
40 #define bytes_trk 	(lab->d_nsectors * lab->d_secsize)
41 
42 #define	HARD_ERROR \
43     (DCBS_NRDY|DCBS_IVA|DCBS_NEM|DCBS_DPE|DCBS_OAB|DCBS_WPT|DCBS_SKI|DCBS_OCYL)
44 #define DATA_ERROR \
45     (DCBS_UDE|DCBS_DCE|DCBS_DSE|DCBS_DSL|DCBS_TOP|DCBS_TOM|DCBS_CCD|\
46      DCBS_HARD|DCBS_SOFT)
47 #define HEADER_ERROR	(DCBS_HCRC|DCBS_HCE)
48 #define	NRM		(short)0
49 #define	BAD		(short)VDUF
50 #define WPT		(short)(NRM | VDWPT)
51 #define RELOC_SECTOR	(short)(VDALT)
52 #define	ALT_SECTOR	(short)(VDALT)
53 
54 typedef enum { false, true } boolean;
55 typedef enum { u_false, u_true, u_unknown } uncertain;
56 
57 /*
58  * Free bad block allocation bit map
59  */
60 typedef struct {
61 	enum { ALLOCATED, NOTALLOCATED } free_status;
62 } fmt_free;
63 
64 typedef enum { SINGLE_SECTOR, FULL_TRACK } rel_type;	/* relocation type */
65 
66 /*
67  * Error table format
68  */
69 typedef struct {
70 	dskadr	err_adr;
71 	long	err_stat;
72 } fmt_err;
73 
74 /* utilities */
75 int	to_sector();
76 int	to_track();
77 int	data_ok();
78 boolean	get_yes_no();
79 boolean	is_in_map();
80 boolean	is_formatted();
81 boolean	read_bad_sector_map();
82 dskadr	*from_sector();
83 dskadr	*from_track();
84 dskadr	*from_unix();
85 dskadr	is_relocated();
86 dskadr	*new_location();
87 
88 /*
89  * Operation table
90  */
91 typedef struct {
92 	int	(*routine)();
93 	char	*op_name;
94 	char	*op_action;
95 } op_tbl;
96 
97 #define	NUMOPS	7
98 op_tbl	operations[NUMOPS];
99 
100 /*
101  * Operation bit mask values (must match order in operations table)
102  */
103 #define	FORMAT_OP	0x01	/* Format operation bit */
104 #define	VERIFY_OP	0x02	/* Verify operation bit */
105 #define	RELOCATE_OP	0x04	/* Relocate operation bit */
106 #define	INFO_OP		0x08	/* Info operation bit */
107 #define	CORRECT_OP	0x10	/* Correct operation bit */
108 #define	PROFILE_OP	0x20	/* Profile operation bit */
109 #define	EXERCISE_OP	0x40	/* Exercise operation bit */
110 
111 extern	int format(), verify(), relocate(), info();
112 extern	int correct(), profile(), exercise();
113 
114 
115 /*
116  * Operation table type and definitions
117  */
118 typedef struct {
119 	int	op;
120 	int	numpat;
121 } op_spec;
122 op_spec	ops_to_do[MAXCTLR][MAXDRIVE];
123 
124 /*
125  * Contains all the current parameters
126  */
127 typedef enum {
128 	formatted,
129 	half_formatted,
130 	unformatted,
131 	unknown
132 } drv_stat;
133 typedef enum {
134 	fmt,
135 	vfy,
136 	rel,
137 	cor,
138 	inf,
139 	cmd,
140 	exec,
141 	prof,
142 	setup
143 } state;
144 typedef enum {
145 	sub_chk,
146 	sub_rcvr,
147 	sub_stat,
148 	sub_rel,
149 	sub_vfy,
150 	sub_fmt,
151 	sub_sk,
152 	sub_wmap
153 } substate;
154 
155 /*
156  * Different environments for setjumps
157  */
158 jmp_buf	reset_environ;	/* Use when reset is issued */
159 jmp_buf	quit_environ;	/* Use when you want to quit what your doing */
160 jmp_buf	abort_environ;	/* Use when nothing can be done to recover */
161 
162 /*
163  * Flaw map definitions and storage
164  */
165 typedef struct {
166 	short	bs_cyl;			/* Cylinder position of flaw */
167 	short	bs_trk;			/* Track position of flaw */
168 	long	bs_offset;		/* (byte) Position of flaw on track */
169 	long	bs_length;		/* Length (in bits) of flaw */
170 	dskadr	bs_alt;			/* Addr of alt sector (all 0 if none) */
171 	enum { flaw_map, scanning, operator } bs_how; /* How it was found */
172 } bs_entry ;
173 
174 struct {
175 	int		controller;
176 	int		drive;
177 	state		state;
178 	substate	substate;
179 	int		error;
180 	dskadr		daddr;
181 } cur;
182 
183 /*
184  * Controller specific information
185  */
186 typedef struct {
187 	uncertain	alive;
188 	struct	vddevice *addr;
189 	char		*name;
190 	int		type;
191 	fmt_err		*(*decode_pos)();
192 	bs_entry	*(*code_pos)();
193 } ctlr_info;
194 
195 ctlr_info	c_info[MAXCTLR];
196 ctlr_info	*C_INFO;
197 
198 /*
199  * Drive specific information
200  */
201 typedef struct {
202 	uncertain	alive;
203 	int		id;
204 	struct		disklabel label;
205 	drv_stat	condition;
206 } drive_info;
207 #define	d_traksize	d_drivedata[1]
208 #define	d_pat		d_drivedata[2]
209 
210 drive_info	d_info[MAXCTLR][MAXDRIVE];
211 drive_info	*D_INFO;
212 struct disklabel *lab;
213 
214 struct	disklabel vdproto[];
215 int	ndrives;
216 int	smddrives;
217 
218 typedef struct {
219 	unsigned int	bs_id;		/* Pack id */
220 	unsigned int	bs_count;	/* number of known bad sectors */
221 	unsigned int	bs_max;		/* Maximum allowable bad sectors */
222 	bs_entry	list[1];
223 } bs_map;
224 
225 #define MAX_FLAWS (((MAXTRKSIZ*sizeof(long))-sizeof(bs_map))/sizeof(bs_entry))
226 
227 long	bs_map_space[MAXTRKSIZ];
228 bs_map	*bad_map;
229 
230 boolean	kill_processes;
231 int	num_controllers;
232 extern	int vdtimeout;
233 
234 /*
235  * Pattern buffers and the sort
236  */
237 fmt_free	free_tbl[NUMREL*MAXTRKS][MAXSECS_PER_TRK];
238 struct	mdcb	mdcb;		/* Master device control block */
239 struct	dcb	dcb;		/* Device control blocks */
240 
241 long	pattern_0[MAXTRKSIZ],  pattern_1[MAXTRKSIZ];
242 long	pattern_2[MAXTRKSIZ],  pattern_3[MAXTRKSIZ];
243 long	pattern_4[MAXTRKSIZ],  pattern_5[MAXTRKSIZ];
244 long	pattern_6[MAXTRKSIZ],  pattern_7[MAXTRKSIZ];
245 long	pattern_8[MAXTRKSIZ],  pattern_9[MAXTRKSIZ];
246 long	pattern_10[MAXTRKSIZ], pattern_11[MAXTRKSIZ];
247 long	pattern_12[MAXTRKSIZ], pattern_13[MAXTRKSIZ];
248 long	pattern_14[MAXTRKSIZ], pattern_15[MAXTRKSIZ];
249 
250 long	*pattern_address[16];	/* pointers to pattern_* */
251 
252 /*
253  * Double buffer for scanning existing
254  * file systems and general scratch
255  */
256 long	scratch[MAXTRKSIZ];
257 long	save[MAXTRKSIZ];
258 
259 /* XXX */
260 /*
261  * Flaw map stuff
262  */
263 typedef struct {
264 	long	flaw_sync;
265 	short	flaw_cyl;
266 	char	flaw_trk;
267 	char	flaw_sec;
268 	struct {
269 		short	flaw_offset;
270 		short	flaw_length;
271 	} flaw_pos[4];
272 	char	flaw_status;
273 	char	flaw_junk[1024]; /* Fill up 518 byte block */
274 } flaw;
275 
276 typedef struct {
277 	long		smde_sync;
278 	unsigned	adr_cyl  : 12;
279 	unsigned	adr_trk  : 8;
280 	unsigned	adr_sec  : 8;
281 	unsigned	sec_flgs : 4;
282 	unsigned	alt_cyl  : 12;
283 	unsigned	alt_trk  : 8;
284 	unsigned	alt_sec  : 8;
285 	char		smde_junk[1024];
286 } smde_hdr;
287 
288 /* for MAXTOR */
289 
290 typedef struct {
291 	unsigned long	esdi_flaw_sync;
292 	unsigned short	esdi_flaw_cyl;
293 	unsigned char	esdi_flaw_trk;
294 	unsigned char	esdi_flaw_sec;
295 	unsigned char	esdi_flags;
296 	unsigned char	esdi_ecc_1[2];
297 	unsigned char	esdi_pad_1[2];
298 	unsigned char	esdi_plo_sync[26];
299 } esdi_flaw_header;
300 
301 typedef struct {
302 	unsigned long	esdi_data_sync;
303 	unsigned char	esdi_month;
304 	unsigned char	esdi_day;
305 	unsigned char	esdi_year;
306 	unsigned char	esdi_head;
307 	unsigned char	esdi_pad_2[2];
308 	unsigned char	esdi_flaws[50][5];  /* see esdi_flaw_entry */
309 	unsigned char	esdi_ecc_2[2];
310 	unsigned char	esdi_pad_3[2];
311 	char		esdi_flaw_junk[1024]; /* Fill up block */
312 } esdi_flaw_data;
313 
314 
315 
316 typedef struct {
317 	esdi_flaw_header	esdi_header;
318 	esdi_flaw_data		esdi_data;
319 } esdi_flaw;
320 
321 
322 
323 /*
324 **  since each flaw entry is 5 bytes and this forces alignment problems we
325 ** define a structure here so that the entries can be BCOPYed into a
326 ** reasonable work area before access.
327 */
328 
329 typedef struct {
330 	unsigned short	esdi_flaw_cyl;
331 	unsigned short	esdi_flaw_offset;
332 	unsigned char	esdi_flaw_length;
333 } esdi_flaw_entry;
334 
335 #define	CDCSYNC		0x1919
336 #define	SMDSYNC		0x0019
337 #define	SMDESYNC	0x0009
338 #define	SMDE1SYNC	0x000d
339 #define	ESDISYNC	0x00fe
340 #define	ESDI1SYNC	0x00fe /* 0x00f8 */
341 
342 /* XXX */
343 
344 /*
345  * Flaw testing patterns.
346  */
347 struct	flawpat {
348 	u_int	fp_pat[16];
349 };
350