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