|
|
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.