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