129530Ssam #ifndef lint
2*29981Skarels static char sccsid[] = "@(#)format.c	1.2 (Berkeley/CCI) 11/04/86";
329530Ssam #endif
429530Ssam 
529530Ssam #include	"vdfmt.h"
629530Ssam 
729530Ssam /*
829530Ssam **
929530Ssam */
1029530Ssam 
1129530Ssam format()
1229530Ssam {
1329530Ssam 	boolean	read_bad_sector_map();
1429530Ssam 	cur.state = fmt;
1529530Ssam 	print("Starting format on ");
1629530Ssam 	printf("controller %d, drive %d, ", cur.controller, cur.drive);
1729530Ssam 	printf("type %s.\n",CURRENT->vc_name);
1829530Ssam 
1929530Ssam 	/* Read the flaw map from the disk (where ever it may be) */
2029530Ssam 	if(read_bad_sector_map() == true) {
2129530Ssam 		if(bad_map->bs_id != D_INFO.id) {
2229530Ssam 			print("Module serial numbers do not match!\n");
2329530Ssam 			print("Use `info' to find the real serial number.\n");
2429530Ssam 			_longjmp(abort_environ, 1);
2529530Ssam 		}
2629530Ssam 	}
2729530Ssam 	else
2829530Ssam 		bad_map->bs_id = D_INFO.id;
2929530Ssam 
3029530Ssam 	/* Re-Initialize bad sector map relocation pointers */
3129530Ssam 	zero_bad_sector_map();
3229530Ssam 	write_bad_sector_map();
3329530Ssam 	if(kill_processes == true)
3429530Ssam 		_longjmp(quit_environ, 1);
3529530Ssam 
3629530Ssam 	/* format the disk surface */
37*29981Skarels printf("Starting format on system areas\n");
3829530Ssam 	format_relocation_area();
3929530Ssam 	format_maintainence_area();
40*29981Skarels printf("Starting format on data area\n");
4129530Ssam 	format_users_data_area();
4229530Ssam 	if(kill_processes == true)
4329530Ssam 		_longjmp(quit_environ, 1);
4429530Ssam 
4529530Ssam 
4629530Ssam 	/* verify the surface */
47*29981Skarels printf("Starting verify on system areas\n");
4829530Ssam 	verify_relocation_area();
4929530Ssam 	verify_maintainence_area();
50*29981Skarels printf("Starting verify on data area\n");
5129530Ssam 	verify_users_data_area();
5229530Ssam }
5329530Ssam 
5429530Ssam 
5529530Ssam /*
5629530Ssam **
5729530Ssam */
5829530Ssam 
5929530Ssam format_relocation_area()
6029530Ssam {
6129530Ssam 	register long		sector_count;
6229530Ssam 	dskadr			dskaddr;
6329530Ssam 
6429530Ssam 	cur.substate = sub_fmt;
6529530Ssam 	dskaddr.cylinder = (short)(CURRENT->vc_ncyl - NUMSYS);
6629530Ssam 	dskaddr.track = (char)0;
6729530Ssam 	dskaddr.sector = (char)0;
6829530Ssam 	sector_count = (long)(NUMREL * CURRENT->vc_ntrak * CURRENT->vc_nsec);
6929530Ssam 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
7029530Ssam }
7129530Ssam 
7229530Ssam 
7329530Ssam /*
7429530Ssam **
7529530Ssam */
7629530Ssam 
7729530Ssam format_users_data_area()
7829530Ssam {
7929530Ssam 	register long		sector_count;
8029530Ssam 	dskadr			dskaddr;
8129530Ssam 	register int		cyl;
8229530Ssam 
8329530Ssam 	cur.substate = sub_fmt;
8429530Ssam 	sector_count = (long)(CURRENT->vc_ntrak * CURRENT->vc_nsec);
8529530Ssam 	dskaddr.track = (char)0;
8629530Ssam 	dskaddr.sector = (char)0;
8729530Ssam 	for(cyl=0; cyl < (CURRENT->vc_ncyl - NUMSYS); cyl++) {
8829530Ssam 		dskaddr.cylinder = cyl;
8929530Ssam 		format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
90*29981Skarels 		if (kill_processes)
91*29981Skarels 			return;
9229530Ssam 	}
9329530Ssam }
9429530Ssam 
9529530Ssam 
9629530Ssam /*
9729530Ssam **
9829530Ssam */
9929530Ssam 
10029530Ssam format_maintainence_area()
10129530Ssam {
10229530Ssam 	register long		sector_count;
10329530Ssam 	dskadr			dskaddr;
10429530Ssam 
10529530Ssam 	cur.substate = sub_fmt;
10629530Ssam 	dskaddr.cylinder = (short)(CURRENT->vc_ncyl - NUMMNT - NUMMAP);
10729530Ssam 	dskaddr.track = (char)0;
10829530Ssam 	dskaddr.sector = (char)0;
10929530Ssam 	sector_count = (long)(NUMMNT * CURRENT->vc_ntrak * CURRENT->vc_nsec);
11029530Ssam 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
11129530Ssam }
11229530Ssam 
11329530Ssam 
11429530Ssam /*
11529530Ssam **
11629530Ssam */
11729530Ssam 
11829530Ssam boolean is_formatted()
11929530Ssam {
12029530Ssam 	extern boolean	align_buf();
12129530Ssam 	dskadr		dskaddr;
12229530Ssam 
12329530Ssam 	dskaddr.cylinder = 0;
12429530Ssam 	dskaddr.track = 0;
12529530Ssam 	dskaddr.sector = 0;
12629530Ssam 	if(C_INFO.type == SMD_ECTLR) {
12729530Ssam 		access_dsk((char *)save, &dskaddr, RD_RAW, 1, 1);
12829530Ssam 		if(align_buf((unsigned long *)save, CDCSYNC) == false)
12929530Ssam 			return true;
13029530Ssam 		return	false;
13129530Ssam 	}
13229530Ssam 	else if(access_dsk((char *)save, &dskaddr, RD, 1, 1) & HEADER_ERROR)
13329530Ssam 		return false;
13429530Ssam 	return true;
13529530Ssam }
13629530Ssam 
13729530Ssam 
13829530Ssam /*
13929530Ssam **	Vdformat_sectors is used to do the actual formatting of a block.
14029530Ssam */
14129530Ssam 
14229530Ssam format_sectors(dskaddr, hdraddr, flags, count)
14329530Ssam dskadr	*dskaddr, *hdraddr;
14429530Ssam short	flags;
14529530Ssam long	count;
14629530Ssam {
14729530Ssam 	cur.daddr.cylinder = dskaddr->cylinder & 0xfff;
14829530Ssam 	cur.daddr.track = dskaddr->track;
14929530Ssam 	dcb.opcode = FSECT;		/* format sector command */
15029530Ssam 	dcb.intflg = NOINT;
15129530Ssam 	dcb.nxtdcb = (fmt_dcb *)0;	/* end of chain */
15229530Ssam 	dcb.operrsta  = 0;
15329530Ssam 	dcb.devselect = (char)cur.drive;
15429530Ssam 	dcb.trailcnt = (char)(sizeof(trfmt) / sizeof(long));
15529530Ssam 	dcb.trail.fmtrail.addr = (char *)scratch;
15629530Ssam 	dcb.trail.fmtrail.nsectors = count;
15729530Ssam 	dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags;
15829530Ssam 	dcb.trail.fmtrail.disk.track = dskaddr->track;
15929530Ssam 	dcb.trail.fmtrail.disk.sector = dskaddr->sector;
16029530Ssam 	dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags;
16129530Ssam 	dcb.trail.fmtrail.hdr.track = hdraddr->track;
16229530Ssam 	dcb.trail.fmtrail.hdr.sector = hdraddr->sector;
16329530Ssam 	mdcb.firstdcb = &dcb;
16429530Ssam 	mdcb.vddcstat = 0;
16529530Ssam 	VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type);
16629530Ssam 	poll((int)(((count+849)/850)+120));
16729530Ssam 	if(vdtimeout <= 0) {
16829530Ssam 		printf(" while formatting sectors.\n");
16929530Ssam 		_longjmp(abort_environ, 1);
17029530Ssam 	}
17129530Ssam }
17229530Ssam 
173