1 #ifndef lint 2 static char sccsid[] = "@(#)format.c 1.1 (Berkeley/CCI) 07/05/86"; 3 #endif 4 5 #include "vdfmt.h" 6 7 /* 8 ** 9 */ 10 11 format() 12 { 13 boolean read_bad_sector_map(); 14 cur.state = fmt; 15 print("Starting format on "); 16 printf("controller %d, drive %d, ", cur.controller, cur.drive); 17 printf("type %s.\n",CURRENT->vc_name); 18 19 /* Read the flaw map from the disk (where ever it may be) */ 20 if(read_bad_sector_map() == true) { 21 if(bad_map->bs_id != D_INFO.id) { 22 print("Module serial numbers do not match!\n"); 23 print("Use `info' to find the real serial number.\n"); 24 _longjmp(abort_environ, 1); 25 } 26 } 27 else 28 bad_map->bs_id = D_INFO.id; 29 30 /* Re-Initialize bad sector map relocation pointers */ 31 zero_bad_sector_map(); 32 write_bad_sector_map(); 33 if(kill_processes == true) 34 _longjmp(quit_environ, 1); 35 36 /* format the disk surface */ 37 format_relocation_area(); 38 format_maintainence_area(); 39 format_users_data_area(); 40 if(kill_processes == true) 41 _longjmp(quit_environ, 1); 42 43 44 /* verify the surface */ 45 verify_relocation_area(); 46 verify_maintainence_area(); 47 verify_users_data_area(); 48 } 49 50 51 /* 52 ** 53 */ 54 55 format_relocation_area() 56 { 57 register long sector_count; 58 dskadr dskaddr; 59 60 cur.substate = sub_fmt; 61 dskaddr.cylinder = (short)(CURRENT->vc_ncyl - NUMSYS); 62 dskaddr.track = (char)0; 63 dskaddr.sector = (char)0; 64 sector_count = (long)(NUMREL * CURRENT->vc_ntrak * CURRENT->vc_nsec); 65 format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 66 } 67 68 69 /* 70 ** 71 */ 72 73 format_users_data_area() 74 { 75 register long sector_count; 76 dskadr dskaddr; 77 register int cyl; 78 79 cur.substate = sub_fmt; 80 sector_count = (long)(CURRENT->vc_ntrak * CURRENT->vc_nsec); 81 dskaddr.track = (char)0; 82 dskaddr.sector = (char)0; 83 for(cyl=0; cyl < (CURRENT->vc_ncyl - NUMSYS); cyl++) { 84 dskaddr.cylinder = cyl; 85 format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 86 } 87 } 88 89 90 /* 91 ** 92 */ 93 94 format_maintainence_area() 95 { 96 register long sector_count; 97 dskadr dskaddr; 98 99 cur.substate = sub_fmt; 100 dskaddr.cylinder = (short)(CURRENT->vc_ncyl - NUMMNT - NUMMAP); 101 dskaddr.track = (char)0; 102 dskaddr.sector = (char)0; 103 sector_count = (long)(NUMMNT * CURRENT->vc_ntrak * CURRENT->vc_nsec); 104 format_sectors(&dskaddr, &dskaddr, NRM, sector_count); 105 } 106 107 108 /* 109 ** 110 */ 111 112 boolean is_formatted() 113 { 114 extern boolean align_buf(); 115 dskadr dskaddr; 116 117 dskaddr.cylinder = 0; 118 dskaddr.track = 0; 119 dskaddr.sector = 0; 120 if(C_INFO.type == SMD_ECTLR) { 121 access_dsk((char *)save, &dskaddr, RD_RAW, 1, 1); 122 if(align_buf((unsigned long *)save, CDCSYNC) == false) 123 return true; 124 return false; 125 } 126 else if(access_dsk((char *)save, &dskaddr, RD, 1, 1) & HEADER_ERROR) 127 return false; 128 return true; 129 } 130 131 132 /* 133 ** Vdformat_sectors is used to do the actual formatting of a block. 134 */ 135 136 format_sectors(dskaddr, hdraddr, flags, count) 137 dskadr *dskaddr, *hdraddr; 138 short flags; 139 long count; 140 { 141 cur.daddr.cylinder = dskaddr->cylinder & 0xfff; 142 cur.daddr.track = dskaddr->track; 143 dcb.opcode = FSECT; /* format sector command */ 144 dcb.intflg = NOINT; 145 dcb.nxtdcb = (fmt_dcb *)0; /* end of chain */ 146 dcb.operrsta = 0; 147 dcb.devselect = (char)cur.drive; 148 dcb.trailcnt = (char)(sizeof(trfmt) / sizeof(long)); 149 dcb.trail.fmtrail.addr = (char *)scratch; 150 dcb.trail.fmtrail.nsectors = count; 151 dcb.trail.fmtrail.disk.cylinder = dskaddr->cylinder | flags; 152 dcb.trail.fmtrail.disk.track = dskaddr->track; 153 dcb.trail.fmtrail.disk.sector = dskaddr->sector; 154 dcb.trail.fmtrail.hdr.cylinder = hdraddr->cylinder | flags; 155 dcb.trail.fmtrail.hdr.track = hdraddr->track; 156 dcb.trail.fmtrail.hdr.sector = hdraddr->sector; 157 mdcb.firstdcb = &dcb; 158 mdcb.vddcstat = 0; 159 VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type); 160 poll((int)(((count+849)/850)+120)); 161 if(vdtimeout <= 0) { 162 printf(" while formatting sectors.\n"); 163 _longjmp(abort_environ, 1); 164 } 165 } 166 167