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