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