129530Ssam #ifndef lint
2*43645Skarels static char sccsid[] = "@(#)format.c	1.8 (Berkeley/CCI) 06/24/90";
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);
1732662Skarels 	printf("type %s.\n", lab->d_typename);
1829530Ssam 
19*43645Skarels 	if (lab->d_nsectors >  MAXSECS_PER_TRK ||
20*43645Skarels 	    lab->d_ntracks >  MAXTRKS) {
21*43645Skarels 		print(
22*43645Skarels 		"Drive geometry (number of sectors or tracks) is too large;\n");
23*43645Skarels 		print("vdformat must be recompiled with larger value\n");
24*43645Skarels 		print("for MAXTRKS or  MAXSECS_PER_TRK.\n");
25*43645Skarels 		 _longjmp(abort_environ, 1);
26*43645Skarels 	}
2729530Ssam 	/* Read the flaw map from the disk (where ever it may be) */
2829530Ssam 	if(read_bad_sector_map() == true) {
2932662Skarels 		if(bad_map->bs_id != D_INFO->id) {
3029530Ssam 			print("Module serial numbers do not match!\n");
3132662Skarels #ifdef notdef
3229530Ssam 			print("Use `info' to find the real serial number.\n");
3329530Ssam 			_longjmp(abort_environ, 1);
3432662Skarels #else
3532662Skarels 			printf("Using serial number from drive, %d\n",
3632662Skarels 			    bad_map->bs_id);
3732662Skarels 			D_INFO->id = bad_map->bs_id;
3832662Skarels #endif
3929530Ssam 		}
4034667Skarels 		clear_relocations(false);
4129530Ssam 	}
4229530Ssam 	else
4332662Skarels 		bad_map->bs_id = D_INFO->id;
4429530Ssam 
4529530Ssam 	/* Re-Initialize bad sector map relocation pointers */
4629530Ssam 	zero_bad_sector_map();
4729530Ssam 	write_bad_sector_map();
4829530Ssam 	if(kill_processes == true)
4929530Ssam 		_longjmp(quit_environ, 1);
5029530Ssam 
5129530Ssam 	/* format the disk surface */
5229530Ssam 	format_relocation_area();
5332662Skarels 	format_maintenence_area();
5429530Ssam 	format_users_data_area();
5529530Ssam 
5629530Ssam 
5729530Ssam 	/* verify the surface */
5829530Ssam 	verify_relocation_area();
5932662Skarels 	verify_maintenence_area();
6029530Ssam 	verify_users_data_area();
6132662Skarels 
6232662Skarels 	(void) writelabel();
6329530Ssam }
6429530Ssam 
6529530Ssam 
6629530Ssam /*
6729530Ssam **
6829530Ssam */
6929530Ssam 
7029530Ssam format_relocation_area()
7129530Ssam {
7229530Ssam 	register long		sector_count;
7329530Ssam 	dskadr			dskaddr;
7429530Ssam 
7529530Ssam 	cur.substate = sub_fmt;
7632662Skarels 	dskaddr.cylinder = (short)(lab->d_ncylinders - NUMSYS);
7729530Ssam 	dskaddr.track = (char)0;
7829530Ssam 	dskaddr.sector = (char)0;
7932662Skarels 	sector_count = (long)(NUMREL * lab->d_ntracks * lab->d_nsectors);
8029530Ssam 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
8129530Ssam }
8229530Ssam 
8329530Ssam 
8429530Ssam /*
8529530Ssam **
8629530Ssam */
8729530Ssam 
8829530Ssam format_users_data_area()
8929530Ssam {
9029530Ssam 	register long		sector_count;
9129530Ssam 	dskadr			dskaddr;
9229530Ssam 	register int		cyl;
9329530Ssam 
9429530Ssam 	cur.substate = sub_fmt;
9532662Skarels 	sector_count = (long)(lab->d_ntracks * lab->d_nsectors);
9629530Ssam 	dskaddr.track = (char)0;
9729530Ssam 	dskaddr.sector = (char)0;
9832662Skarels 	for(cyl=0; cyl < (lab->d_ncylinders - NUMSYS); cyl++) {
9929530Ssam 		dskaddr.cylinder = cyl;
10029530Ssam 		format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
10129981Skarels 		if (kill_processes)
10229981Skarels 			return;
10329530Ssam 	}
10429530Ssam }
10529530Ssam 
10629530Ssam 
10729530Ssam /*
10829530Ssam **
10929530Ssam */
11029530Ssam 
11132662Skarels format_maintenence_area()
11229530Ssam {
11329530Ssam 	register long		sector_count;
11429530Ssam 	dskadr			dskaddr;
11529530Ssam 
11629530Ssam 	cur.substate = sub_fmt;
11732662Skarels 	dskaddr.cylinder = (short)(lab->d_ncylinders - NUMMNT - NUMMAP);
11829530Ssam 	dskaddr.track = (char)0;
11929530Ssam 	dskaddr.sector = (char)0;
12032662Skarels 	sector_count = (long)(NUMMNT * lab->d_ntracks * lab->d_nsectors);
12129530Ssam 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
12229530Ssam }
12329530Ssam 
12429530Ssam 
12529530Ssam /*
12629530Ssam **
12729530Ssam */
12829530Ssam 
12929530Ssam boolean is_formatted()
13029530Ssam {
13129530Ssam 	extern boolean	align_buf();
13229530Ssam 	dskadr		dskaddr;
13329530Ssam 
13429530Ssam 	dskaddr.cylinder = 0;
13529530Ssam 	dskaddr.track = 0;
13629530Ssam 	dskaddr.sector = 0;
13732662Skarels 	if(C_INFO->type == VDTYPE_SMDE) {
13831318Ssam 		access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1);
13929530Ssam 		if(align_buf((unsigned long *)save, CDCSYNC) == false)
14029530Ssam 			return true;
14129530Ssam 		return	false;
14229530Ssam 	}
14331318Ssam 	else if(access_dsk((char *)save, &dskaddr, VDOP_RD, 1, 1)&HEADER_ERROR)
14429530Ssam 		return false;
14529530Ssam 	return true;
14629530Ssam }
14729530Ssam 
14829530Ssam 
14929530Ssam /*
15029530Ssam **	Vdformat_sectors is used to do the actual formatting of a block.
15129530Ssam */
15229530Ssam 
15329530Ssam format_sectors(dskaddr, hdraddr, flags, count)
15429530Ssam dskadr	*dskaddr, *hdraddr;
15529530Ssam short	flags;
15629530Ssam long	count;
15729530Ssam {
15829530Ssam 	cur.daddr.cylinder = dskaddr->cylinder & 0xfff;
15929530Ssam 	cur.daddr.track = dskaddr->track;
16031318Ssam 	dcb.opcode = VDOP_FSECT;		/* format sector command */
16131318Ssam 	dcb.intflg = DCBINT_NONE;
16231318Ssam 	dcb.nxtdcb = (struct dcb *)0;	/* end of chain */
16329530Ssam 	dcb.operrsta  = 0;
164*43645Skarels 	dcb.devselect = (char)cur.drive | lab->d_devflags;
16531318Ssam 	dcb.trailcnt = (char)(sizeof(struct trfmt) / sizeof(long));
16629530Ssam 	dcb.trail.fmtrail.addr = (char *)scratch;
16729530Ssam 	dcb.trail.fmtrail.nsectors = count;
16829530Ssam 	dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags;
16929530Ssam 	dcb.trail.fmtrail.disk.track = dskaddr->track;
17029530Ssam 	dcb.trail.fmtrail.disk.sector = dskaddr->sector;
17129530Ssam 	dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags;
17229530Ssam 	dcb.trail.fmtrail.hdr.track = hdraddr->track;
17329530Ssam 	dcb.trail.fmtrail.hdr.sector = hdraddr->sector;
17431318Ssam 	mdcb.mdcb_head = &dcb;
17531318Ssam 	mdcb.mdcb_status = 0;
17632662Skarels 	VDGO(C_INFO->addr, (u_long)&mdcb, C_INFO->type);
17729530Ssam 	poll((int)(((count+849)/850)+120));
17829530Ssam 	if(vdtimeout <= 0) {
17929530Ssam 		printf(" while formatting sectors.\n");
18029530Ssam 		_longjmp(abort_environ, 1);
18129530Ssam 	}
18234557Skarels 	if (dcb.operrsta & DCBS_HARD)
18334557Skarels 		vd_error("format");
18429530Ssam }
185