1 #ifndef lint
2 static char sccsid[] = "@(#)format.c	1.1 (Berkeley/CCI) 07/05/86";
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 	}
87 }
88 
89 
90 /*
91 **
92 */
93 
94 format_maintainence_area()
95 {
96 	register long		sector_count;
97 	dskadr			dskaddr;
98 
99 	cur.substate = sub_fmt;
100 	dskaddr.cylinder = (short)(CURRENT->vc_ncyl - NUMMNT - NUMMAP);
101 	dskaddr.track = (char)0;
102 	dskaddr.sector = (char)0;
103 	sector_count = (long)(NUMMNT * CURRENT->vc_ntrak * CURRENT->vc_nsec);
104 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
105 }
106 
107 
108 /*
109 **
110 */
111 
112 boolean is_formatted()
113 {
114 	extern boolean	align_buf();
115 	dskadr		dskaddr;
116 
117 	dskaddr.cylinder = 0;
118 	dskaddr.track = 0;
119 	dskaddr.sector = 0;
120 	if(C_INFO.type == SMD_ECTLR) {
121 		access_dsk((char *)save, &dskaddr, RD_RAW, 1, 1);
122 		if(align_buf((unsigned long *)save, CDCSYNC) == false)
123 			return true;
124 		return	false;
125 	}
126 	else if(access_dsk((char *)save, &dskaddr, RD, 1, 1) & HEADER_ERROR)
127 		return false;
128 	return true;
129 }
130 
131 
132 /*
133 **	Vdformat_sectors is used to do the actual formatting of a block.
134 */
135 
136 format_sectors(dskaddr, hdraddr, flags, count)
137 dskadr	*dskaddr, *hdraddr;
138 short	flags;
139 long	count;
140 {
141 	cur.daddr.cylinder = dskaddr->cylinder & 0xfff;
142 	cur.daddr.track = dskaddr->track;
143 	dcb.opcode = FSECT;		/* format sector command */
144 	dcb.intflg = NOINT;
145 	dcb.nxtdcb = (fmt_dcb *)0;	/* end of chain */
146 	dcb.operrsta  = 0;
147 	dcb.devselect = (char)cur.drive;
148 	dcb.trailcnt = (char)(sizeof(trfmt) / sizeof(long));
149 	dcb.trail.fmtrail.addr = (char *)scratch;
150 	dcb.trail.fmtrail.nsectors = count;
151 	dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags;
152 	dcb.trail.fmtrail.disk.track = dskaddr->track;
153 	dcb.trail.fmtrail.disk.sector = dskaddr->sector;
154 	dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags;
155 	dcb.trail.fmtrail.hdr.track = hdraddr->track;
156 	dcb.trail.fmtrail.hdr.sector = hdraddr->sector;
157 	mdcb.firstdcb = &dcb;
158 	mdcb.vddcstat = 0;
159 	VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type);
160 	poll((int)(((count+849)/850)+120));
161 	if(vdtimeout <= 0) {
162 		printf(" while formatting sectors.\n");
163 		_longjmp(abort_environ, 1);
164 	}
165 }
166 
167