129530Ssam #ifndef lint 2*29981Skarels static char sccsid[] = "@(#)format.c 1.2 (Berkeley/CCI) 11/04/86"; 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); 1729530Ssam printf("type %s.\n",CURRENT->vc_name); 1829530Ssam 1929530Ssam /* Read the flaw map from the disk (where ever it may be) */ 2029530Ssam if(read_bad_sector_map() == true) { 2129530Ssam if(bad_map->bs_id != D_INFO.id) { 2229530Ssam print("Module serial numbers do not match!\n"); 2329530Ssam print("Use `info' to find the real serial number.\n"); 2429530Ssam _longjmp(abort_environ, 1); 2529530Ssam } 2629530Ssam } 2729530Ssam else 2829530Ssam bad_map->bs_id = D_INFO.id; 2929530Ssam 3029530Ssam /* Re-Initialize bad sector map relocation pointers */ 3129530Ssam zero_bad_sector_map(); 3229530Ssam write_bad_sector_map(); 3329530Ssam if(kill_processes == true) 3429530Ssam _longjmp(quit_environ, 1); 3529530Ssam 3629530Ssam /* format the disk surface */ 37*29981Skarels printf("Starting format on system areas\n"); 3829530Ssam format_relocation_area(); 3929530Ssam format_maintainence_area(); 40*29981Skarels printf("Starting format on data area\n"); 4129530Ssam format_users_data_area(); 4229530Ssam if(kill_processes == true) 4329530Ssam _longjmp(quit_environ, 1); 4429530Ssam 4529530Ssam 4629530Ssam /* verify the surface */ 47*29981Skarels printf("Starting verify on system areas\n"); 4829530Ssam verify_relocation_area(); 4929530Ssam verify_maintainence_area(); 50*29981Skarels printf("Starting verify on data area\n"); 5129530Ssam verify_users_data_area(); 5229530Ssam } 5329530Ssam 5429530Ssam 5529530Ssam /* 5629530Ssam ** 5729530Ssam */ 5829530Ssam 5929530Ssam format_relocation_area() 6029530Ssam { 6129530Ssam register long sector_count; 6229530Ssam dskadr dskaddr; 6329530Ssam 6429530Ssam cur.substate = sub_fmt; 6529530Ssam dskaddr.cylinder = (short)(CURRENT->vc_ncyl - NUMSYS); 6629530Ssam dskaddr.track = (char)0; 6729530Ssam dskaddr.sector = (char)0; 6829530Ssam sector_count = (long)(NUMREL * CURRENT->vc_ntrak * CURRENT->vc_nsec); 6929530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 7029530Ssam } 7129530Ssam 7229530Ssam 7329530Ssam /* 7429530Ssam ** 7529530Ssam */ 7629530Ssam 7729530Ssam format_users_data_area() 7829530Ssam { 7929530Ssam register long sector_count; 8029530Ssam dskadr dskaddr; 8129530Ssam register int cyl; 8229530Ssam 8329530Ssam cur.substate = sub_fmt; 8429530Ssam sector_count = (long)(CURRENT->vc_ntrak * CURRENT->vc_nsec); 8529530Ssam dskaddr.track = (char)0; 8629530Ssam dskaddr.sector = (char)0; 8729530Ssam for(cyl=0; cyl < (CURRENT->vc_ncyl - NUMSYS); cyl++) { 8829530Ssam dskaddr.cylinder = cyl; 8929530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 90*29981Skarels if (kill_processes) 91*29981Skarels return; 9229530Ssam } 9329530Ssam } 9429530Ssam 9529530Ssam 9629530Ssam /* 9729530Ssam ** 9829530Ssam */ 9929530Ssam 10029530Ssam format_maintainence_area() 10129530Ssam { 10229530Ssam register long sector_count; 10329530Ssam dskadr dskaddr; 10429530Ssam 10529530Ssam cur.substate = sub_fmt; 10629530Ssam dskaddr.cylinder = (short)(CURRENT->vc_ncyl - NUMMNT - NUMMAP); 10729530Ssam dskaddr.track = (char)0; 10829530Ssam dskaddr.sector = (char)0; 10929530Ssam sector_count = (long)(NUMMNT * CURRENT->vc_ntrak * CURRENT->vc_nsec); 11029530Ssam format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 11129530Ssam } 11229530Ssam 11329530Ssam 11429530Ssam /* 11529530Ssam ** 11629530Ssam */ 11729530Ssam 11829530Ssam boolean is_formatted() 11929530Ssam { 12029530Ssam extern boolean align_buf(); 12129530Ssam dskadr dskaddr; 12229530Ssam 12329530Ssam dskaddr.cylinder = 0; 12429530Ssam dskaddr.track = 0; 12529530Ssam dskaddr.sector = 0; 12629530Ssam if(C_INFO.type == SMD_ECTLR) { 12729530Ssam access_dsk((char *)save, &dskaddr, RD_RAW, 1, 1); 12829530Ssam if(align_buf((unsigned long *)save, CDCSYNC) == false) 12929530Ssam return true; 13029530Ssam return false; 13129530Ssam } 13229530Ssam else if(access_dsk((char *)save, &dskaddr, RD, 1, 1) & HEADER_ERROR) 13329530Ssam return false; 13429530Ssam return true; 13529530Ssam } 13629530Ssam 13729530Ssam 13829530Ssam /* 13929530Ssam ** Vdformat_sectors is used to do the actual formatting of a block. 14029530Ssam */ 14129530Ssam 14229530Ssam format_sectors(dskaddr, hdraddr, flags, count) 14329530Ssam dskadr *dskaddr, *hdraddr; 14429530Ssam short flags; 14529530Ssam long count; 14629530Ssam { 14729530Ssam cur.daddr.cylinder = dskaddr->cylinder & 0xfff; 14829530Ssam cur.daddr.track = dskaddr->track; 14929530Ssam dcb.opcode = FSECT; /* format sector command */ 15029530Ssam dcb.intflg = NOINT; 15129530Ssam dcb.nxtdcb = (fmt_dcb *)0; /* end of chain */ 15229530Ssam dcb.operrsta = 0; 15329530Ssam dcb.devselect = (char)cur.drive; 15429530Ssam dcb.trailcnt = (char)(sizeof(trfmt) / sizeof(long)); 15529530Ssam dcb.trail.fmtrail.addr = (char *)scratch; 15629530Ssam dcb.trail.fmtrail.nsectors = count; 15729530Ssam dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags; 15829530Ssam dcb.trail.fmtrail.disk.track = dskaddr->track; 15929530Ssam dcb.trail.fmtrail.disk.sector = dskaddr->sector; 16029530Ssam dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags; 16129530Ssam dcb.trail.fmtrail.hdr.track = hdraddr->track; 16229530Ssam dcb.trail.fmtrail.hdr.sector = hdraddr->sector; 16329530Ssam mdcb.firstdcb = &dcb; 16429530Ssam mdcb.vddcstat = 0; 16529530Ssam VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type); 16629530Ssam poll((int)(((count+849)/850)+120)); 16729530Ssam if(vdtimeout <= 0) { 16829530Ssam printf(" while formatting sectors.\n"); 16929530Ssam _longjmp(abort_environ, 1); 17029530Ssam } 17129530Ssam } 17229530Ssam 173