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