xref: /original-bsd/sys/tahoe/stand/vdformat/format.c (revision 81576b84)
16d59e3b3Ssam #ifndef lint
2*81576b84Sbostic static char sccsid[] = "@(#)format.c	1.8.1.1 (Berkeley/CCI) 07/24/92";
36d59e3b3Ssam #endif
46d59e3b3Ssam 
56d59e3b3Ssam #include	"vdfmt.h"
66d59e3b3Ssam 
76d59e3b3Ssam /*
86d59e3b3Ssam **
96d59e3b3Ssam */
106d59e3b3Ssam 
format()116d59e3b3Ssam format()
126d59e3b3Ssam {
136d59e3b3Ssam 	boolean	read_bad_sector_map();
146d59e3b3Ssam 	cur.state = fmt;
156d59e3b3Ssam 	print("Starting format on ");
166d59e3b3Ssam 	printf("controller %d, drive %d, ", cur.controller, cur.drive);
17d5d660dcSkarels 	printf("type %s.\n", lab->d_typename);
186d59e3b3Ssam 
19ab4ebc48Skarels 	if (lab->d_nsectors >  MAXSECS_PER_TRK ||
20ab4ebc48Skarels 	    lab->d_ntracks >  MAXTRKS) {
21ab4ebc48Skarels 		print(
22ab4ebc48Skarels 		"Drive geometry (number of sectors or tracks) is too large;\n");
23ab4ebc48Skarels 		print("vdformat must be recompiled with larger value\n");
24ab4ebc48Skarels 		print("for MAXTRKS or  MAXSECS_PER_TRK.\n");
25ab4ebc48Skarels 		 _longjmp(abort_environ, 1);
26ab4ebc48Skarels 	}
276d59e3b3Ssam 	/* Read the flaw map from the disk (where ever it may be) */
286d59e3b3Ssam 	if(read_bad_sector_map() == true) {
29d5d660dcSkarels 		if(bad_map->bs_id != D_INFO->id) {
306d59e3b3Ssam 			print("Module serial numbers do not match!\n");
31d5d660dcSkarels #ifdef notdef
326d59e3b3Ssam 			print("Use `info' to find the real serial number.\n");
336d59e3b3Ssam 			_longjmp(abort_environ, 1);
34d5d660dcSkarels #else
35d5d660dcSkarels 			printf("Using serial number from drive, %d\n",
36d5d660dcSkarels 			    bad_map->bs_id);
37d5d660dcSkarels 			D_INFO->id = bad_map->bs_id;
38d5d660dcSkarels #endif
396d59e3b3Ssam 		}
40319dde04Skarels 		clear_relocations(false);
416d59e3b3Ssam 	}
426d59e3b3Ssam 	else
43d5d660dcSkarels 		bad_map->bs_id = D_INFO->id;
446d59e3b3Ssam 
45*81576b84Sbostic #ifndef ONE
466d59e3b3Ssam 	/* Re-Initialize bad sector map relocation pointers */
476d59e3b3Ssam 	zero_bad_sector_map();
486d59e3b3Ssam 	write_bad_sector_map();
496d59e3b3Ssam 	if(kill_processes == true)
506d59e3b3Ssam 		_longjmp(quit_environ, 1);
516d59e3b3Ssam 
526d59e3b3Ssam 	/* format the disk surface */
536d59e3b3Ssam 	format_relocation_area();
54d5d660dcSkarels 	format_maintenence_area();
55*81576b84Sbostic #endif /* ONE */
566d59e3b3Ssam 	format_users_data_area();
576d59e3b3Ssam 
586d59e3b3Ssam 
59*81576b84Sbostic #ifndef ONE
606d59e3b3Ssam 	/* verify the surface */
616d59e3b3Ssam 	verify_relocation_area();
62d5d660dcSkarels 	verify_maintenence_area();
636d59e3b3Ssam 	verify_users_data_area();
64*81576b84Sbostic #endif /* ONE */
65d5d660dcSkarels 
66d5d660dcSkarels 	(void) writelabel();
676d59e3b3Ssam }
686d59e3b3Ssam 
696d59e3b3Ssam 
706d59e3b3Ssam /*
716d59e3b3Ssam **
726d59e3b3Ssam */
736d59e3b3Ssam 
format_relocation_area()746d59e3b3Ssam format_relocation_area()
756d59e3b3Ssam {
766d59e3b3Ssam 	register long		sector_count;
776d59e3b3Ssam 	dskadr			dskaddr;
786d59e3b3Ssam 
796d59e3b3Ssam 	cur.substate = sub_fmt;
80d5d660dcSkarels 	dskaddr.cylinder = (short)(lab->d_ncylinders - NUMSYS);
816d59e3b3Ssam 	dskaddr.track = (char)0;
826d59e3b3Ssam 	dskaddr.sector = (char)0;
83d5d660dcSkarels 	sector_count = (long)(NUMREL * lab->d_ntracks * lab->d_nsectors);
846d59e3b3Ssam 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
856d59e3b3Ssam }
866d59e3b3Ssam 
876d59e3b3Ssam 
886d59e3b3Ssam /*
896d59e3b3Ssam **
906d59e3b3Ssam */
916d59e3b3Ssam 
format_users_data_area()926d59e3b3Ssam format_users_data_area()
936d59e3b3Ssam {
946d59e3b3Ssam 	register long		sector_count;
956d59e3b3Ssam 	dskadr			dskaddr;
966d59e3b3Ssam 	register int		cyl;
976d59e3b3Ssam 
986d59e3b3Ssam 	cur.substate = sub_fmt;
99*81576b84Sbostic #ifndef ONE
100d5d660dcSkarels 	sector_count = (long)(lab->d_ntracks * lab->d_nsectors);
101*81576b84Sbostic #else /* ONE */
102*81576b84Sbostic 	sector_count = (long)(lab->d_nsectors);
103*81576b84Sbostic #endif /* ONE */
1046d59e3b3Ssam 	dskaddr.track = (char)0;
1056d59e3b3Ssam 	dskaddr.sector = (char)0;
106*81576b84Sbostic #ifndef ONE
107d5d660dcSkarels 	for(cyl=0; cyl < (lab->d_ncylinders - NUMSYS); cyl++) {
1086d59e3b3Ssam 		dskaddr.cylinder = cyl;
109*81576b84Sbostic #else /* ONE */
110*81576b84Sbostic 		dskaddr.cylinder = 183;
111*81576b84Sbostic 		dskaddr.track = 7;
112*81576b84Sbostic #endif /* ONE */
1136d59e3b3Ssam 		format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
1146b30744eSkarels 		if (kill_processes)
1156b30744eSkarels 			return;
116*81576b84Sbostic #ifndef ONE
1176d59e3b3Ssam 	}
118*81576b84Sbostic #endif /* ONE */
1196d59e3b3Ssam }
1206d59e3b3Ssam 
1216d59e3b3Ssam 
1226d59e3b3Ssam /*
1236d59e3b3Ssam **
1246d59e3b3Ssam */
1256d59e3b3Ssam 
format_maintenence_area()126d5d660dcSkarels format_maintenence_area()
1276d59e3b3Ssam {
1286d59e3b3Ssam 	register long		sector_count;
1296d59e3b3Ssam 	dskadr			dskaddr;
1306d59e3b3Ssam 
1316d59e3b3Ssam 	cur.substate = sub_fmt;
132d5d660dcSkarels 	dskaddr.cylinder = (short)(lab->d_ncylinders - NUMMNT - NUMMAP);
1336d59e3b3Ssam 	dskaddr.track = (char)0;
1346d59e3b3Ssam 	dskaddr.sector = (char)0;
135d5d660dcSkarels 	sector_count = (long)(NUMMNT * lab->d_ntracks * lab->d_nsectors);
1366d59e3b3Ssam 	format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
1376d59e3b3Ssam }
1386d59e3b3Ssam 
1396d59e3b3Ssam 
1406d59e3b3Ssam /*
1416d59e3b3Ssam **
1426d59e3b3Ssam */
1436d59e3b3Ssam 
is_formatted()1446d59e3b3Ssam boolean is_formatted()
1456d59e3b3Ssam {
1466d59e3b3Ssam 	extern boolean	align_buf();
1476d59e3b3Ssam 	dskadr		dskaddr;
1486d59e3b3Ssam 
1496d59e3b3Ssam 	dskaddr.cylinder = 0;
1506d59e3b3Ssam 	dskaddr.track = 0;
1516d59e3b3Ssam 	dskaddr.sector = 0;
152d5d660dcSkarels 	if(C_INFO->type == VDTYPE_SMDE) {
15368c7fc27Ssam 		access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1);
1546d59e3b3Ssam 		if(align_buf((unsigned long *)save, CDCSYNC) == false)
1556d59e3b3Ssam 			return true;
1566d59e3b3Ssam 		return	false;
1576d59e3b3Ssam 	}
15868c7fc27Ssam 	else if(access_dsk((char *)save, &dskaddr, VDOP_RD, 1, 1)&HEADER_ERROR)
1596d59e3b3Ssam 		return false;
1606d59e3b3Ssam 	return true;
1616d59e3b3Ssam }
1626d59e3b3Ssam 
1636d59e3b3Ssam 
1646d59e3b3Ssam /*
1656d59e3b3Ssam **	Vdformat_sectors is used to do the actual formatting of a block.
1666d59e3b3Ssam */
1676d59e3b3Ssam 
format_sectors(dskaddr,hdraddr,flags,count)1686d59e3b3Ssam format_sectors(dskaddr, hdraddr, flags, count)
1696d59e3b3Ssam dskadr	*dskaddr, *hdraddr;
1706d59e3b3Ssam short	flags;
1716d59e3b3Ssam long	count;
1726d59e3b3Ssam {
1736d59e3b3Ssam 	cur.daddr.cylinder = dskaddr->cylinder & 0xfff;
1746d59e3b3Ssam 	cur.daddr.track = dskaddr->track;
17568c7fc27Ssam 	dcb.opcode = VDOP_FSECT;		/* format sector command */
17668c7fc27Ssam 	dcb.intflg = DCBINT_NONE;
17768c7fc27Ssam 	dcb.nxtdcb = (struct dcb *)0;	/* end of chain */
1786d59e3b3Ssam 	dcb.operrsta  = 0;
179ab4ebc48Skarels 	dcb.devselect = (char)cur.drive | lab->d_devflags;
18068c7fc27Ssam 	dcb.trailcnt = (char)(sizeof(struct trfmt) / sizeof(long));
1816d59e3b3Ssam 	dcb.trail.fmtrail.addr = (char *)scratch;
182*81576b84Sbostic #ifdef ONE
183*81576b84Sbostic printf("format %d @ %d/%d/%d\n", count, dskaddr->cylinder, dskaddr->track, dskaddr->sector);
184*81576b84Sbostic #endif /* ONE */
1856d59e3b3Ssam 	dcb.trail.fmtrail.nsectors = count;
1866d59e3b3Ssam 	dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags;
1876d59e3b3Ssam 	dcb.trail.fmtrail.disk.track = dskaddr->track;
1886d59e3b3Ssam 	dcb.trail.fmtrail.disk.sector = dskaddr->sector;
1896d59e3b3Ssam 	dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags;
1906d59e3b3Ssam 	dcb.trail.fmtrail.hdr.track = hdraddr->track;
1916d59e3b3Ssam 	dcb.trail.fmtrail.hdr.sector = hdraddr->sector;
19268c7fc27Ssam 	mdcb.mdcb_head = &dcb;
19368c7fc27Ssam 	mdcb.mdcb_status = 0;
194d5d660dcSkarels 	VDGO(C_INFO->addr, (u_long)&mdcb, C_INFO->type);
1956d59e3b3Ssam 	poll((int)(((count+849)/850)+120));
1966d59e3b3Ssam 	if(vdtimeout <= 0) {
1976d59e3b3Ssam 		printf(" while formatting sectors.\n");
1986d59e3b3Ssam 		_longjmp(abort_environ, 1);
1996d59e3b3Ssam 	}
200a579ef8cSkarels 	if (dcb.operrsta & DCBS_HARD)
201a579ef8cSkarels 		vd_error("format");
2026d59e3b3Ssam }
203