129530Ssam #ifndef lint
2*55666Sbostic static char sccsid[] = "@(#)format.c 1.8.1.1 (Berkeley/CCI) 07/24/92";
329530Ssam #endif
429530Ssam
529530Ssam #include "vdfmt.h"
629530Ssam
729530Ssam /*
829530Ssam **
929530Ssam */
1029530Ssam
format()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
1943645Skarels if (lab->d_nsectors > MAXSECS_PER_TRK ||
2043645Skarels lab->d_ntracks > MAXTRKS) {
2143645Skarels print(
2243645Skarels "Drive geometry (number of sectors or tracks) is too large;\n");
2343645Skarels print("vdformat must be recompiled with larger value\n");
2443645Skarels print("for MAXTRKS or MAXSECS_PER_TRK.\n");
2543645Skarels _longjmp(abort_environ, 1);
2643645Skarels }
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
45*55666Sbostic #ifndef ONE
4629530Ssam /* Re-Initialize bad sector map relocation pointers */
4729530Ssam zero_bad_sector_map();
4829530Ssam write_bad_sector_map();
4929530Ssam if(kill_processes == true)
5029530Ssam _longjmp(quit_environ, 1);
5129530Ssam
5229530Ssam /* format the disk surface */
5329530Ssam format_relocation_area();
5432662Skarels format_maintenence_area();
55*55666Sbostic #endif /* ONE */
5629530Ssam format_users_data_area();
5729530Ssam
5829530Ssam
59*55666Sbostic #ifndef ONE
6029530Ssam /* verify the surface */
6129530Ssam verify_relocation_area();
6232662Skarels verify_maintenence_area();
6329530Ssam verify_users_data_area();
64*55666Sbostic #endif /* ONE */
6532662Skarels
6632662Skarels (void) writelabel();
6729530Ssam }
6829530Ssam
6929530Ssam
7029530Ssam /*
7129530Ssam **
7229530Ssam */
7329530Ssam
format_relocation_area()7429530Ssam format_relocation_area()
7529530Ssam {
7629530Ssam register long sector_count;
7729530Ssam dskadr dskaddr;
7829530Ssam
7929530Ssam cur.substate = sub_fmt;
8032662Skarels dskaddr.cylinder = (short)(lab->d_ncylinders - NUMSYS);
8129530Ssam dskaddr.track = (char)0;
8229530Ssam dskaddr.sector = (char)0;
8332662Skarels sector_count = (long)(NUMREL * lab->d_ntracks * lab->d_nsectors);
8429530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
8529530Ssam }
8629530Ssam
8729530Ssam
8829530Ssam /*
8929530Ssam **
9029530Ssam */
9129530Ssam
format_users_data_area()9229530Ssam format_users_data_area()
9329530Ssam {
9429530Ssam register long sector_count;
9529530Ssam dskadr dskaddr;
9629530Ssam register int cyl;
9729530Ssam
9829530Ssam cur.substate = sub_fmt;
99*55666Sbostic #ifndef ONE
10032662Skarels sector_count = (long)(lab->d_ntracks * lab->d_nsectors);
101*55666Sbostic #else /* ONE */
102*55666Sbostic sector_count = (long)(lab->d_nsectors);
103*55666Sbostic #endif /* ONE */
10429530Ssam dskaddr.track = (char)0;
10529530Ssam dskaddr.sector = (char)0;
106*55666Sbostic #ifndef ONE
10732662Skarels for(cyl=0; cyl < (lab->d_ncylinders - NUMSYS); cyl++) {
10829530Ssam dskaddr.cylinder = cyl;
109*55666Sbostic #else /* ONE */
110*55666Sbostic dskaddr.cylinder = 183;
111*55666Sbostic dskaddr.track = 7;
112*55666Sbostic #endif /* ONE */
11329530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
11429981Skarels if (kill_processes)
11529981Skarels return;
116*55666Sbostic #ifndef ONE
11729530Ssam }
118*55666Sbostic #endif /* ONE */
11929530Ssam }
12029530Ssam
12129530Ssam
12229530Ssam /*
12329530Ssam **
12429530Ssam */
12529530Ssam
format_maintenence_area()12632662Skarels format_maintenence_area()
12729530Ssam {
12829530Ssam register long sector_count;
12929530Ssam dskadr dskaddr;
13029530Ssam
13129530Ssam cur.substate = sub_fmt;
13232662Skarels dskaddr.cylinder = (short)(lab->d_ncylinders - NUMMNT - NUMMAP);
13329530Ssam dskaddr.track = (char)0;
13429530Ssam dskaddr.sector = (char)0;
13532662Skarels sector_count = (long)(NUMMNT * lab->d_ntracks * lab->d_nsectors);
13629530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count);
13729530Ssam }
13829530Ssam
13929530Ssam
14029530Ssam /*
14129530Ssam **
14229530Ssam */
14329530Ssam
is_formatted()14429530Ssam boolean is_formatted()
14529530Ssam {
14629530Ssam extern boolean align_buf();
14729530Ssam dskadr dskaddr;
14829530Ssam
14929530Ssam dskaddr.cylinder = 0;
15029530Ssam dskaddr.track = 0;
15129530Ssam dskaddr.sector = 0;
15232662Skarels if(C_INFO->type == VDTYPE_SMDE) {
15331318Ssam access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1);
15429530Ssam if(align_buf((unsigned long *)save, CDCSYNC) == false)
15529530Ssam return true;
15629530Ssam return false;
15729530Ssam }
15831318Ssam else if(access_dsk((char *)save, &dskaddr, VDOP_RD, 1, 1)&HEADER_ERROR)
15929530Ssam return false;
16029530Ssam return true;
16129530Ssam }
16229530Ssam
16329530Ssam
16429530Ssam /*
16529530Ssam ** Vdformat_sectors is used to do the actual formatting of a block.
16629530Ssam */
16729530Ssam
format_sectors(dskaddr,hdraddr,flags,count)16829530Ssam format_sectors(dskaddr, hdraddr, flags, count)
16929530Ssam dskadr *dskaddr, *hdraddr;
17029530Ssam short flags;
17129530Ssam long count;
17229530Ssam {
17329530Ssam cur.daddr.cylinder = dskaddr->cylinder & 0xfff;
17429530Ssam cur.daddr.track = dskaddr->track;
17531318Ssam dcb.opcode = VDOP_FSECT; /* format sector command */
17631318Ssam dcb.intflg = DCBINT_NONE;
17731318Ssam dcb.nxtdcb = (struct dcb *)0; /* end of chain */
17829530Ssam dcb.operrsta = 0;
17943645Skarels dcb.devselect = (char)cur.drive | lab->d_devflags;
18031318Ssam dcb.trailcnt = (char)(sizeof(struct trfmt) / sizeof(long));
18129530Ssam dcb.trail.fmtrail.addr = (char *)scratch;
182*55666Sbostic #ifdef ONE
183*55666Sbostic printf("format %d @ %d/%d/%d\n", count, dskaddr->cylinder, dskaddr->track, dskaddr->sector);
184*55666Sbostic #endif /* ONE */
18529530Ssam dcb.trail.fmtrail.nsectors = count;
18629530Ssam dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags;
18729530Ssam dcb.trail.fmtrail.disk.track = dskaddr->track;
18829530Ssam dcb.trail.fmtrail.disk.sector = dskaddr->sector;
18929530Ssam dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags;
19029530Ssam dcb.trail.fmtrail.hdr.track = hdraddr->track;
19129530Ssam dcb.trail.fmtrail.hdr.sector = hdraddr->sector;
19231318Ssam mdcb.mdcb_head = &dcb;
19331318Ssam mdcb.mdcb_status = 0;
19432662Skarels VDGO(C_INFO->addr, (u_long)&mdcb, C_INFO->type);
19529530Ssam poll((int)(((count+849)/850)+120));
19629530Ssam if(vdtimeout <= 0) {
19729530Ssam printf(" while formatting sectors.\n");
19829530Ssam _longjmp(abort_environ, 1);
19929530Ssam }
20034557Skarels if (dcb.operrsta & DCBS_HARD)
20134557Skarels vd_error("format");
20229530Ssam }
203