1 /* 2 * Copyright (c) 1982, 1986 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)hpmaptype.c 7.3 (Berkeley) 02/21/87 7 */ 8 9 /* 10 * RP??/RM?? drive type mapping routine. 11 * Used for compatibility with unlabeled disks. 12 */ 13 #ifdef COMPAT_42 14 #include "../machine/pte.h" 15 16 #include "../h/param.h" 17 #include "../h/inode.h" 18 #include "../h/fs.h" 19 #include "../h/disklabel.h" 20 21 #include "../vaxmba/hpreg.h" 22 #include "../vaxmba/mbareg.h" 23 24 #include "saio.h" 25 #include "savax.h" 26 27 /* 28 * Drive description table. 29 */ 30 struct st { 31 short nsect; /* # sectors/track */ 32 short ntrak; /* # tracks/surfaces/heads */ 33 short nspc; /* # sectors/cylinder */ 34 short ncyl; /* # cylinders */ 35 short *off; /* partition offset table (cylinders) */ 36 }; 37 38 short rp06_off[8] = { 0, 38, 0, -1, -1, -1, 118, -1 }; 39 short rm03_off[8] = { 0, 100, 0, -1, -1, -1, 309, -1 }; 40 short rm05_off[8] = { 0, 27, 0, 562, 589, 681, 562, 82 }; 41 short rm80_off[8] = { 0, 37, 0, -1, -1, -1, 115, -1 }; 42 short rp07_off[8] = { 0, 10, 0, 235, 245, 437, 235, 52 }; 43 short ml_off[8] = { 0, -1, -1, -1, -1, -1, -1, -1 }; 44 /*short cdc9775_off[8] = { 0, 13, 0, -1, -1, -1, 294, 66 };*/ 45 short cdc9730_off[8] = { 0, 50, 0, -1, -1, -1, 155, -1 }; 46 short capricorn_off[8] = { 0, 32, 0, 668, 723, 778, 668, 98 }; 47 short eagle_off[8] = { 0, 17, 0, 391, 408, 728, 391, 87 }; 48 short fj2361_off[8] = { 0, 13, 0, 294, 307, 547, 294, 66 }; 49 50 /* 51 * hptypes is used to translate Massbus drive type and other information 52 * into an index in hpst. The indices of hptypes and hpst must therefore agree. 53 */ 54 short hptypes[] = { 55 MBDT_RM03, 56 MBDT_RM05, 57 MBDT_RP06, 58 MBDT_RM80, 59 MBDT_RP05, 60 MBDT_RP07, 61 MBDT_ML11A, 62 MBDT_ML11B, 63 -1, /* 9755 */ 64 -1, /* 9730 */ 65 -1, /* Capricorn */ 66 -1, /* Eagle */ 67 MBDT_RM02, /* actually something else */ 68 -1, /* 9300 */ 69 -1, /* 9766 */ 70 -1, /* 2361 */ 71 0 72 }; 73 74 struct st hpst[] = { 75 #define HPDT_RM03 0 76 32, 5, 32*5, 823, rm03_off, /* RM03 */ 77 #define HPDT_RM05 1 78 32, 19, 32*19, 823, rm05_off, /* RM05 */ 79 #define HPDT_RP06 2 80 22, 19, 22*19, 815, rp06_off, /* RP06 */ 81 #define HPDT_RM80 3 82 31, 14, 31*14, 559, rm80_off, /* RM80 */ 83 #define HPDT_RP05 4 84 22, 19, 22*19, 411, rp06_off, /* RP05 */ 85 #define HPDT_RP07 5 86 50, 32, 50*32, 630, rp07_off, /* RP07 */ 87 #define HPDT_ML11A 6 88 1, 1, 1, 1, ml_off, /* ML11A */ 89 #define HPDT_ML11B 7 90 1, 1, 1, 1, ml_off, /* ML11B */ 91 #define HPDT_9775 8 92 32, 40, 32*40, 843, fj2361_off, /* 9775 */ 93 #define HPDT_9730 9 94 32, 10, 32*10, 823, cdc9730_off, /* 9730 */ 95 #define HPDT_CAP 10 96 32, 16, 32*16, 1024, capricorn_off, /* Ampex capricorn */ 97 #define HPDT_EAGLE 11 98 48, 20, 48*20, 842, eagle_off, /* Fuji Eagle */ 99 #define HPDT_RM02 12 100 32, 5, 32*5, 823, rm03_off, /* rm02 - not used */ 101 #define HPDT_9300 13 102 32, 19, 32*19, 815, rm05_off, /* Ampex 9300 */ 103 #define HPDT_9766 14 104 32, 19, 32*19, 823, rm05_off, /* CDC 9766 */ 105 #define HPDT_2361 15 106 64, 20, 64*20, 842, fj2361_off, /* Fuji 2361 */ 107 }; 108 #define NTYPES (sizeof(hpst) / sizeof(hpst[0])) 109 110 #define MASKREG(reg) ((reg)&0xffff) 111 112 hpmaptype(hpaddr, type, unit, lp) 113 register struct hpdevice *hpaddr; 114 register unsigned type; 115 int unit; 116 register struct disklabel *lp; 117 { 118 register i; 119 register struct st *st; 120 int hpsn; 121 122 for (i = 0; hptypes[i]; i++) 123 if (hptypes[i] == type) 124 goto found; 125 _stop("unknown drive type"); 126 127 found: 128 type = i; 129 /* 130 * Handle SI model byte stuff when 131 * we think it's an RM03 or RM05. 132 */ 133 if (type == HPDT_RM03 || type == HPDT_RM05) { 134 hpsn = hpaddr->hpsn; 135 if ((hpsn & SIMB_LU) == unit) 136 switch ((hpsn & SIMB_MB) &~ (SIMB_S6|SIRM03|SIRM05)) { 137 138 case SI9775D: 139 type = HPDT_9775; 140 break; 141 142 case SI9730D: 143 type = HPDT_9730; 144 break; 145 146 case SI9766: 147 type = HPDT_9766; 148 break; 149 150 case SI9762: 151 type = HPDT_RM03; 152 break; 153 154 case SICAPD: 155 type = HPDT_CAP; 156 break; 157 158 case SI9751D: 159 type = HPDT_EAGLE; 160 break; 161 } 162 } 163 /* 164 * RM02: EMULEX controller. Map to correct 165 * drive type by checking the holding 166 * register for the disk geometry. 167 */ 168 if (type == HPDT_RM02) { 169 int nsectors, ntracks, ncyl; 170 171 hpaddr->hpcs1 = HP_NOP; 172 hpaddr->hphr = HPHR_MAXTRAK; 173 ntracks = MASKREG(hpaddr->hphr) + 1; 174 DELAY(100); 175 hpaddr->hpcs1 = HP_NOP; 176 hpaddr->hphr = HPHR_MAXSECT; 177 nsectors = MASKREG(hpaddr->hphr) + 1; 178 DELAY(100); 179 hpaddr->hpcs1 = HP_NOP; 180 hpaddr->hphr = HPHR_MAXCYL; 181 ncyl = MASKREG(hpaddr->hphr) + 1; 182 for (type = 0; type < NTYPES; type++) 183 if (hpst[type].nsect == nsectors && 184 hpst[type].ntrak == ntracks && 185 hpst[type].ncyl == ncyl) 186 break; 187 188 if (type >= NTYPES) { 189 printf("%d sectors, %d tracks, %d cyl?\n", 190 nsectors, ntracks, ncyl); 191 type = HPDT_RM02; 192 } 193 done: 194 hpaddr->hpcs1 = HP_DCLR|HP_GO; 195 } 196 197 /* 198 * set up minimal disk label. 199 */ 200 st = &hpst[type]; 201 lp->d_nsectors = st->nsect; 202 lp->d_ntracks = st->ntrak; 203 lp->d_secpercyl = st->nspc; 204 lp->d_ncylinders = st->ncyl; 205 lp->d_secperunit = st->nspc * st->ncyl; 206 lp->d_npartitions = 8; 207 for (i = 0; i < 8; i++) { 208 if (st->off[i] == -1) 209 lp->d_partitions[i].p_size = 0; 210 else { 211 lp->d_partitions[i].p_offset = st->off[i] * 212 lp->d_secpercyl; 213 lp->d_partitions[i].p_size = lp->d_secperunit; 214 } 215 } 216 } 217 #endif COMPAT_42 218