129530Ssam #ifndef lint 2*34557Skarels static char sccsid[] = "@(#)format.c 1.6 (Berkeley/CCI) 05/31/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 } 3229530Ssam } 3329530Ssam else 3432662Skarels bad_map->bs_id = D_INFO->id; 3529530Ssam 3629530Ssam /* Re-Initialize bad sector map relocation pointers */ 3729530Ssam zero_bad_sector_map(); 3829530Ssam write_bad_sector_map(); 3929530Ssam if(kill_processes == true) 4029530Ssam _longjmp(quit_environ, 1); 4129530Ssam 4229530Ssam /* format the disk surface */ 4329530Ssam format_relocation_area(); 4432662Skarels format_maintenence_area(); 4529530Ssam format_users_data_area(); 4629530Ssam if(kill_processes == true) 4729530Ssam _longjmp(quit_environ, 1); 4829530Ssam 4929530Ssam 5029530Ssam /* verify the surface */ 5129530Ssam verify_relocation_area(); 5232662Skarels verify_maintenence_area(); 5329530Ssam verify_users_data_area(); 5432662Skarels 5532662Skarels (void) writelabel(); 5629530Ssam } 5729530Ssam 5829530Ssam 5929530Ssam /* 6029530Ssam ** 6129530Ssam */ 6229530Ssam 6329530Ssam format_relocation_area() 6429530Ssam { 6529530Ssam register long sector_count; 6629530Ssam dskadr dskaddr; 6729530Ssam 6829530Ssam cur.substate = sub_fmt; 6932662Skarels dskaddr.cylinder = (short)(lab->d_ncylinders - NUMSYS); 7029530Ssam dskaddr.track = (char)0; 7129530Ssam dskaddr.sector = (char)0; 7232662Skarels sector_count = (long)(NUMREL * lab->d_ntracks * lab->d_nsectors); 7329530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 7429530Ssam } 7529530Ssam 7629530Ssam 7729530Ssam /* 7829530Ssam ** 7929530Ssam */ 8029530Ssam 8129530Ssam format_users_data_area() 8229530Ssam { 8329530Ssam register long sector_count; 8429530Ssam dskadr dskaddr; 8529530Ssam register int cyl; 8629530Ssam 8729530Ssam cur.substate = sub_fmt; 8832662Skarels sector_count = (long)(lab->d_ntracks * lab->d_nsectors); 8929530Ssam dskaddr.track = (char)0; 9029530Ssam dskaddr.sector = (char)0; 9132662Skarels for(cyl=0; cyl < (lab->d_ncylinders - NUMSYS); cyl++) { 9229530Ssam dskaddr.cylinder = cyl; 9329530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 9429981Skarels if (kill_processes) 9529981Skarels return; 9629530Ssam } 9729530Ssam } 9829530Ssam 9929530Ssam 10029530Ssam /* 10129530Ssam ** 10229530Ssam */ 10329530Ssam 10432662Skarels format_maintenence_area() 10529530Ssam { 10629530Ssam register long sector_count; 10729530Ssam dskadr dskaddr; 10829530Ssam 10929530Ssam cur.substate = sub_fmt; 11032662Skarels dskaddr.cylinder = (short)(lab->d_ncylinders - NUMMNT - NUMMAP); 11129530Ssam dskaddr.track = (char)0; 11229530Ssam dskaddr.sector = (char)0; 11332662Skarels sector_count = (long)(NUMMNT * lab->d_ntracks * lab->d_nsectors); 11429530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 11529530Ssam } 11629530Ssam 11729530Ssam 11829530Ssam /* 11929530Ssam ** 12029530Ssam */ 12129530Ssam 12229530Ssam boolean is_formatted() 12329530Ssam { 12429530Ssam extern boolean align_buf(); 12529530Ssam dskadr dskaddr; 12629530Ssam 12729530Ssam dskaddr.cylinder = 0; 12829530Ssam dskaddr.track = 0; 12929530Ssam dskaddr.sector = 0; 13032662Skarels if(C_INFO->type == VDTYPE_SMDE) { 13131318Ssam access_dsk((char *)save, &dskaddr, VDOP_RDRAW, 1, 1); 13229530Ssam if(align_buf((unsigned long *)save, CDCSYNC) == false) 13329530Ssam return true; 13429530Ssam return false; 13529530Ssam } 13631318Ssam else if(access_dsk((char *)save, &dskaddr, VDOP_RD, 1, 1)&HEADER_ERROR) 13729530Ssam return false; 13829530Ssam return true; 13929530Ssam } 14029530Ssam 14129530Ssam 14229530Ssam /* 14329530Ssam ** Vdformat_sectors is used to do the actual formatting of a block. 14429530Ssam */ 14529530Ssam 14629530Ssam format_sectors(dskaddr, hdraddr, flags, count) 14729530Ssam dskadr *dskaddr, *hdraddr; 14829530Ssam short flags; 14929530Ssam long count; 15029530Ssam { 15129530Ssam cur.daddr.cylinder = dskaddr->cylinder & 0xfff; 15229530Ssam cur.daddr.track = dskaddr->track; 15331318Ssam dcb.opcode = VDOP_FSECT; /* format sector command */ 15431318Ssam dcb.intflg = DCBINT_NONE; 15531318Ssam dcb.nxtdcb = (struct dcb *)0; /* end of chain */ 15629530Ssam dcb.operrsta = 0; 15729530Ssam dcb.devselect = (char)cur.drive; 15831318Ssam dcb.trailcnt = (char)(sizeof(struct trfmt) / sizeof(long)); 15929530Ssam dcb.trail.fmtrail.addr = (char *)scratch; 16029530Ssam dcb.trail.fmtrail.nsectors = count; 16129530Ssam dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags; 16229530Ssam dcb.trail.fmtrail.disk.track = dskaddr->track; 16329530Ssam dcb.trail.fmtrail.disk.sector = dskaddr->sector; 16429530Ssam dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags; 16529530Ssam dcb.trail.fmtrail.hdr.track = hdraddr->track; 16629530Ssam dcb.trail.fmtrail.hdr.sector = hdraddr->sector; 16731318Ssam mdcb.mdcb_head = &dcb; 16831318Ssam mdcb.mdcb_status = 0; 16932662Skarels VDGO(C_INFO->addr, (u_long)&mdcb, C_INFO->type); 17029530Ssam poll((int)(((count+849)/850)+120)); 17129530Ssam if(vdtimeout <= 0) { 17229530Ssam printf(" while formatting sectors.\n"); 17329530Ssam _longjmp(abort_environ, 1); 17429530Ssam } 175*34557Skarels if (dcb.operrsta & DCBS_HARD) 176*34557Skarels vd_error("format"); 17732662Skarels if(kill_processes == true) 17832662Skarels _longjmp(quit_environ, 1); 17929530Ssam } 180