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