|
|
1.1 root 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: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.