xref: /csrg-svn/sys/vax/stand/hpmaptype.c (revision 30547)
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.1 (Berkeley) 6/5/86
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