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