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