xref: /original-bsd/sys/tahoe/stand/vdformat/format.c (revision e59fb703)
1 #ifndef lint
2 static char sccsid[] = "@(#)format.c	1.8 (Berkeley/CCI) 06/24/90";
3 #endif
4 
5 #include	"vdfmt.h"
6 
7 /*
8 **
9 */
10 
11 format()
12 {
13 	boolean	read_bad_sector_map();
14 	cur.state = fmt;
15 	print("Starting format on ");
16 	printf("controller %d, drive %d, ", cur.controller, cur.drive);
17 	printf("type %s.\n", lab->d_typename);
18 
19 	if (lab->d_nsectors >  MAXSECS_PER_TRK ||
20 	    lab->d_ntracks >  MAXTRKS) {
21 		print(
22 		"Drive geometry (number of sectors or tracks) is too large;\n");
23 		print("vdformat must be recompiled with larger value\n");
24 		print("for MAXTRKS or  MAXSECS_PER_TRK.\n");
25 		 _longjmp(abort_environ, 1);
26 	}
27 	/* Read the flaw map from the disk (where ever it may be) */
28 	if(read_bad_sector_map() == true) {
29 		if(bad_map->bs_id != D_INFO->id) {
30 			print("Module serial numbers do not match!\n");
31 #ifdef notdef
32 			print("Use `info' to find the real serial number.\n");
33 			_longjmp(abort_environ, 1);
34 #else
35 			printf("Using serial number from drive, %d\n",
36 			    bad_map->bs_id);
37 			D_INFO->id = bad_map->bs_id;
38 #endif
39 		}
40 		clear_relocations(false);
41 	}
42 	else
43 		bad_map->bs_id = D_INFO->id;
44 
45 	/* Re-Initialize bad sector map relocation pointers */
46 	zero_bad_sector_map();
47 	write_bad_sector_map();
48 	if(kill_processes == true)
49 		_longjmp(quit_environ, 1);
50 
51 	/* format the disk surface */
52 	format_relocation_area();
53 	format_maintenence_area();
54 	format_users_data_area();
55 
56 
57 	/* verify the surface */
58 	verify_relocation_area();
59 	verify_maintenence_area();
60 	verify_users_data_area();
61 
62 	(void) writelabel();
63 }
64 
65 
66 /*
67 **
68 */
69 
70 format_relocation_area()
71 {
72 	register long		sector_count;
73 	dskadr			dskaddr;
74 
75 	cur.substate = sub_fmt;
76 	dskaddr.cylinder = (short)(lab->d_ncylinders - NUMSYS);
77 	dskaddr.track = (char)0;
78 	dskaddr.sector = (char)0;
79 	sector_count = (long)(NUMREL * lab->d_ntracks * lab->d_nsectors);
80 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
81 }
82 
83 
84 /*
85 **
86 */
87 
88 format_users_data_area()
89 {
90 	register long		sector_count;
91 	dskadr			dskaddr;
92 	register int		cyl;
93 
94 	cur.substate = sub_fmt;
95 	sector_count = (long)(lab->d_ntracks * lab->d_nsectors);
96 	dskaddr.track = (char)0;
97 	dskaddr.sector = (char)0;
98 	for(cyl=0; cyl < (lab->d_ncylinders - NUMSYS); cyl++) {
99 		dskaddr.cylinder = cyl;
100 		format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
101 		if (kill_processes)
102 			return;
103 	}
104 }
105 
106 
107 /*
108 **
109 */
110 
111 format_maintenence_area()
112 {
113 	register long		sector_count;
114 	dskadr			dskaddr;
115 
116 	cur.substate = sub_fmt;
117 	dskaddr.cylinder = (short)(lab->d_ncylinders - NUMMNT - NUMMAP);
118 	dskaddr.track = (char)0;
119 	dskaddr.sector = (char)0;
120 	sector_count = (long)(NUMMNT * lab->d_ntracks * lab->d_nsectors);
121 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
122 }
123 
124 
125 /*
126 **
127 */
128 
129 boolean is_formatted()
130 {
131 	extern boolean	align_buf();
132 	dskadr		dskaddr;
133 
134 	dskaddr.cylinder = 0;
135 	dskaddr.track = 0;
136 	dskaddr.sector = 0;
137 	if(C_INFO->type == VDTYPE_SMDE) {
138 		access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1);
139 		if(align_buf((unsigned long *)save, CDCSYNC) == false)
140 			return true;
141 		return	false;
142 	}
143 	else if(access_dsk((char *)save, &dskaddr, VDOP_RD, 1, 1)&HEADER_ERROR)
144 		return false;
145 	return true;
146 }
147 
148 
149 /*
150 **	Vdformat_sectors is used to do the actual formatting of a block.
151 */
152 
153 format_sectors(dskaddr, hdraddr, flags, count)
154 dskadr	*dskaddr, *hdraddr;
155 short	flags;
156 long	count;
157 {
158 	cur.daddr.cylinder = dskaddr->cylinder & 0xfff;
159 	cur.daddr.track = dskaddr->track;
160 	dcb.opcode = VDOP_FSECT;		/* format sector command */
161 	dcb.intflg = DCBINT_NONE;
162 	dcb.nxtdcb = (struct dcb *)0;	/* end of chain */
163 	dcb.operrsta  = 0;
164 	dcb.devselect = (char)cur.drive | lab->d_devflags;
165 	dcb.trailcnt = (char)(sizeof(struct trfmt) / sizeof(long));
166 	dcb.trail.fmtrail.addr = (char *)scratch;
167 	dcb.trail.fmtrail.nsectors = count;
168 	dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags;
169 	dcb.trail.fmtrail.disk.track = dskaddr->track;
170 	dcb.trail.fmtrail.disk.sector = dskaddr->sector;
171 	dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags;
172 	dcb.trail.fmtrail.hdr.track = hdraddr->track;
173 	dcb.trail.fmtrail.hdr.sector = hdraddr->sector;
174 	mdcb.mdcb_head = &dcb;
175 	mdcb.mdcb_status = 0;
176 	VDGO(C_INFO->addr, (u_long)&mdcb, C_INFO->type);
177 	poll((int)(((count+849)/850)+120));
178 	if(vdtimeout <= 0) {
179 		printf(" while formatting sectors.\n");
180 		_longjmp(abort_environ, 1);
181 	}
182 	if (dcb.operrsta & DCBS_HARD)
183 		vd_error("format");
184 }
185