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