BSD 4_3_Reno development
[unix-history] / usr / src / sys / tahoestand / vdformat / vdfmt.h
CommitLineData
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"
19extern 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
56typedef enum { false, true } boolean;
57typedef enum { u_false, u_true, u_unknown } uncertain;
58
59/*
60 * Free bad block allocation bit map
61 */
62typedef struct {
63 enum { ALLOCATED, NOTALLOCATED } free_status;
64} fmt_free;
65
66typedef enum { SINGLE_SECTOR, FULL_TRACK } rel_type; /* relocation type */
67
68/*
69 * Error table format
70 */
71typedef struct {
72 dskadr err_adr;
73 long err_stat;
74} fmt_err;
75
76/* utilities */
77int to_sector();
78int to_track();
79int data_ok();
80boolean get_yes_no();
81boolean is_in_map();
82boolean is_formatted();
83boolean read_bad_sector_map();
84dskadr *from_sector();
85dskadr *from_track();
86dskadr *from_unix();
87dskadr is_relocated();
88dskadr *new_location();
89
90/*
91 * Operation table
92 */
93typedef struct {
94 int (*routine)();
95 char *op_name;
96 char *op_action;
97} op_tbl;
98
99#define NUMOPS 7
100op_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
113extern int format(), verify(), relocate(), info();
114extern int correct(), profile(), exercise();
115
116
117/*
118 * Operation table type and definitions
119 */
120typedef struct {
121 int op;
122 int numpat;
123} op_spec;
124op_spec ops_to_do[MAXCTLR][MAXDRIVE];
125
126/*
127 * Contains all the current parameters
128 */
129typedef enum {
130 formatted,
131 half_formatted,
132 unformatted,
133 unknown
134} drv_stat;
135typedef enum {
136 fmt,
137 vfy,
138 rel,
139 cor,
140 inf,
141 cmd,
142 exec,
143 prof,
144 setup
145} state;
146typedef 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 */
160jmp_buf reset_environ; /* Use when reset is issued */
161jmp_buf quit_environ; /* Use when you want to quit what your doing */
162jmp_buf abort_environ; /* Use when nothing can be done to recover */
163
164/*
165 * Flaw map definitions and storage
166 */
167typedef 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
176struct {
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 */
188typedef 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
197ctlr_info c_info[MAXCTLR];
198ctlr_info *C_INFO;
199
200/*
201 * Drive specific information
202 */
203typedef 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
212drive_info d_info[MAXCTLR][MAXDRIVE];
213drive_info *D_INFO;
214struct disklabel *lab;
215
216struct disklabel vdproto[];
217int ndrives;
218int 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 */
225typedef 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
238union {
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
255bs_map *bad_map;
256
257boolean kill_processes;
258int num_controllers;
259extern int vdtimeout;
260
261/*
262 * Pattern buffers and the sort
263 */
264fmt_free free_tbl[NUMREL*MAXTRKS][MAXSECS_PER_TRK];
265struct mdcb mdcb; /* Master device control block */
266struct dcb dcb; /* Device control blocks */
267
268long pattern_0[MAXTRKSIZ], pattern_1[MAXTRKSIZ];
269long pattern_2[MAXTRKSIZ], pattern_3[MAXTRKSIZ];
270long pattern_4[MAXTRKSIZ], pattern_5[MAXTRKSIZ];
271long pattern_6[MAXTRKSIZ], pattern_7[MAXTRKSIZ];
272long pattern_8[MAXTRKSIZ], pattern_9[MAXTRKSIZ];
273long pattern_10[MAXTRKSIZ], pattern_11[MAXTRKSIZ];
274long pattern_12[MAXTRKSIZ], pattern_13[MAXTRKSIZ];
275long pattern_14[MAXTRKSIZ], pattern_15[MAXTRKSIZ];
276
277long *pattern_address[16]; /* pointers to pattern_* */
278
279/*
280 * Double buffer for scanning existing
281 * file systems and general scratch
282 */
283long scratch[MAXTRKSIZ];
284long save[MAXTRKSIZ];
285
286/* XXX */
287/*
288 * Flaw map stuff
289 */
290typedef 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
303typedef 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
317typedef 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
328typedef 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
343typedef 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
356typedef 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 */
374struct flawpat {
375 u_int fp_pat[16];
376};