129530Ssam #ifndef lint 2*34667Skarels static char sccsid[] = "@(#)format.c 1.7 (Berkeley/CCI) 06/07/88"; 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 1929530Ssam /* Read the flaw map from the disk (where ever it may be) */ 2029530Ssam if(read_bad_sector_map() == true) { 2132662Skarels if(bad_map->bs_id != D_INFO->id) { 2229530Ssam print("Module serial numbers do not match!\n"); 2332662Skarels #ifdef notdef 2429530Ssam print("Use `info' to find the real serial number.\n"); 2529530Ssam _longjmp(abort_environ, 1); 2632662Skarels #else 2732662Skarels printf("Using serial number from drive, %d\n", 2832662Skarels bad_map->bs_id); 2932662Skarels D_INFO->id = bad_map->bs_id; 3032662Skarels #endif 3129530Ssam } 32*34667Skarels clear_relocations(false); 3329530Ssam } 3429530Ssam else 3532662Skarels bad_map->bs_id = D_INFO->id; 3629530Ssam 3729530Ssam /* Re-Initialize bad sector map relocation pointers */ 3829530Ssam zero_bad_sector_map(); 3929530Ssam write_bad_sector_map(); 4029530Ssam if(kill_processes == true) 4129530Ssam _longjmp(quit_environ, 1); 4229530Ssam 4329530Ssam /* format the disk surface */ 4429530Ssam format_relocation_area(); 4532662Skarels format_maintenence_area(); 4629530Ssam format_users_data_area(); 4729530Ssam 4829530Ssam 4929530Ssam /* verify the surface */ 5029530Ssam verify_relocation_area(); 5132662Skarels verify_maintenence_area(); 5229530Ssam verify_users_data_area(); 5332662Skarels 5432662Skarels (void) writelabel(); 5529530Ssam } 5629530Ssam 5729530Ssam 5829530Ssam /* 5929530Ssam ** 6029530Ssam */ 6129530Ssam 6229530Ssam format_relocation_area() 6329530Ssam { 6429530Ssam register long sector_count; 6529530Ssam dskadr dskaddr; 6629530Ssam 6729530Ssam cur.substate = sub_fmt; 6832662Skarels dskaddr.cylinder = (short)(lab->d_ncylinders - NUMSYS); 6929530Ssam dskaddr.track = (char)0; 7029530Ssam dskaddr.sector = (char)0; 7132662Skarels sector_count = (long)(NUMREL * lab->d_ntracks * lab->d_nsectors); 7229530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 7329530Ssam } 7429530Ssam 7529530Ssam 7629530Ssam /* 7729530Ssam ** 7829530Ssam */ 7929530Ssam 8029530Ssam format_users_data_area() 8129530Ssam { 8229530Ssam register long sector_count; 8329530Ssam dskadr dskaddr; 8429530Ssam register int cyl; 8529530Ssam 8629530Ssam cur.substate = sub_fmt; 8732662Skarels sector_count = (long)(lab->d_ntracks * lab->d_nsectors); 8829530Ssam dskaddr.track = (char)0; 8929530Ssam dskaddr.sector = (char)0; 9032662Skarels for(cyl=0; cyl < (lab->d_ncylinders - NUMSYS); cyl++) { 9129530Ssam dskaddr.cylinder = cyl; 9229530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 9329981Skarels if (kill_processes) 9429981Skarels return; 9529530Ssam } 9629530Ssam } 9729530Ssam 9829530Ssam 9929530Ssam /* 10029530Ssam ** 10129530Ssam */ 10229530Ssam 10332662Skarels format_maintenence_area() 10429530Ssam { 10529530Ssam register long sector_count; 10629530Ssam dskadr dskaddr; 10729530Ssam 10829530Ssam cur.substate = sub_fmt; 10932662Skarels dskaddr.cylinder = (short)(lab->d_ncylinders - NUMMNT - NUMMAP); 11029530Ssam dskaddr.track = (char)0; 11129530Ssam dskaddr.sector = (char)0; 11232662Skarels sector_count = (long)(NUMMNT * lab->d_ntracks * lab->d_nsectors); 11329530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 11429530Ssam } 11529530Ssam 11629530Ssam 11729530Ssam /* 11829530Ssam ** 11929530Ssam */ 12029530Ssam 12129530Ssam boolean is_formatted() 12229530Ssam { 12329530Ssam extern boolean align_buf(); 12429530Ssam dskadr dskaddr; 12529530Ssam 12629530Ssam dskaddr.cylinder = 0; 12729530Ssam dskaddr.track = 0; 12829530Ssam dskaddr.sector = 0; 12932662Skarels if(C_INFO->type == VDTYPE_SMDE) { 13031318Ssam access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1); 13129530Ssam if(align_buf((unsigned long *)save, CDCSYNC) == false) 13229530Ssam return true; 13329530Ssam return false; 13429530Ssam } 13531318Ssam else if(access_dsk((char *)save, &dskaddr, VDOP_RD, 1, 1)&HEADER_ERROR) 13629530Ssam return false; 13729530Ssam return true; 13829530Ssam } 13929530Ssam 14029530Ssam 14129530Ssam /* 14229530Ssam ** Vdformat_sectors is used to do the actual formatting of a block. 14329530Ssam */ 14429530Ssam 14529530Ssam format_sectors(dskaddr, hdraddr, flags, count) 14629530Ssam dskadr *dskaddr, *hdraddr; 14729530Ssam short flags; 14829530Ssam long count; 14929530Ssam { 15029530Ssam cur.daddr.cylinder = dskaddr->cylinder & 0xfff; 15129530Ssam cur.daddr.track = dskaddr->track; 15231318Ssam dcb.opcode = VDOP_FSECT; /* format sector command */ 15331318Ssam dcb.intflg = DCBINT_NONE; 15431318Ssam dcb.nxtdcb = (struct dcb *)0; /* end of chain */ 15529530Ssam dcb.operrsta = 0; 15629530Ssam dcb.devselect = (char)cur.drive; 15731318Ssam dcb.trailcnt = (char)(sizeof(struct trfmt) / sizeof(long)); 15829530Ssam dcb.trail.fmtrail.addr = (char *)scratch; 15929530Ssam dcb.trail.fmtrail.nsectors = count; 16029530Ssam dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags; 16129530Ssam dcb.trail.fmtrail.disk.track = dskaddr->track; 16229530Ssam dcb.trail.fmtrail.disk.sector = dskaddr->sector; 16329530Ssam dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags; 16429530Ssam dcb.trail.fmtrail.hdr.track = hdraddr->track; 16529530Ssam dcb.trail.fmtrail.hdr.sector = hdraddr->sector; 16631318Ssam mdcb.mdcb_head = &dcb; 16731318Ssam mdcb.mdcb_status = 0; 16832662Skarels VDGO(C_INFO->addr, (u_long)&mdcb, C_INFO->type); 16929530Ssam poll((int)(((count+849)/850)+120)); 17029530Ssam if(vdtimeout <= 0) { 17129530Ssam printf(" while formatting sectors.\n"); 17229530Ssam _longjmp(abort_environ, 1); 17329530Ssam } 17434557Skarels if (dcb.operrsta & DCBS_HARD) 17534557Skarels vd_error("format"); 17629530Ssam } 177