Annotation of sys/arch/mvme68k/stand/libsa/bugdev.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bugdev.c,v 1.4 2007/06/17 00:28:56 deraadt Exp $ */
2:
3: /*
4: * Copyright (c) 1993 Paul Kranenburg
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
15: * 3. All advertising materials mentioning features or use of this software
16: * must display the following acknowledgement:
17: * This product includes software developed by Paul Kranenburg.
18: * 4. The name of the author may not be used to endorse or promote products
19: * derived from this software without specific prior written permission
20: *
21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31: */
32:
33: #include <sys/param.h>
34: #include <sys/disklabel.h>
35: #include <machine/prom.h>
36:
37: #include "stand.h"
38: #include "libsa.h"
39:
40: void cputobsdlabel(struct disklabel *lp, struct mvmedisklabel *clp);
41:
42: int errno;
43:
44: struct bugsc_softc {
45: int fd; /* Prom file descriptor */
46: int poff; /* Partition offset */
47: int psize; /* Partition size */
48: short ctrl;
49: short dev;
50: } bugsc_softc[1];
51:
52: int
53: devopen(struct open_file *f, const char *fname, char **file)
54: {
55: register struct bugsc_softc *pp = &bugsc_softc[0];
56: int error, i, dn = 0, pn = 0;
57: char *dev, *cp;
58: static char iobuf[MAXBSIZE];
59: struct disklabel sdlabel;
60:
61: dev = bugargs.arg_start;
62:
63: /*
64: * Extract partition # from boot device string.
65: */
66: for (cp = dev; *cp; cp++) /* void */;
67: while (*cp != '/' && cp > dev) {
68: if (*cp == ':')
69: pn = *(cp+1) - 'a';
70: --cp;
71: }
72:
73: pp->fd = bugscopen(f);
74:
75: if (pp->fd < 0) {
76: printf("Can't open device `%s'\n", dev);
77: return (ENXIO);
78: }
79: error = bugscstrategy(pp, F_READ, LABELSECTOR, DEV_BSIZE, iobuf, &i);
80: if (error)
81: return (error);
82: if (i != DEV_BSIZE)
83: return (EINVAL);
84:
85: cputobsdlabel(&sdlabel, (struct mvmedisklabel *)iobuf);
86: pp->poff = sdlabel.d_partitions[pn].p_offset;
87: pp->psize = sdlabel.d_partitions[pn].p_size;
88:
89: f->f_dev = devsw;
90: f->f_devdata = (void *)pp;
91: *file = (char *)fname;
92: return (0);
93: }
94:
95: /* silly block scale factor */
96: #define BUG_BLOCK_SIZE 256
97: #define BUG_SCALE (512/BUG_BLOCK_SIZE)
98:
99: int
100: bugscstrategy(void *devdata, int func, daddr_t dblk, size_t size, void *buf,
101: size_t *rsize)
102: {
103: struct mvmeprom_dskio dio;
104: register struct bugsc_softc *pp = (struct bugsc_softc *)devdata;
105: daddr_t blk = dblk + pp->poff;
106:
107: twiddle();
108:
109: dio.ctrl_lun = pp->ctrl;
110: dio.dev_lun = pp->dev;
111: dio.status = 0;
112: dio.pbuffer = buf;
113: dio.blk_num = blk * BUG_SCALE;
114: dio.blk_cnt = size / BUG_BLOCK_SIZE; /* assumed size in bytes */
115: dio.flag = 0;
116: dio.addr_mod = 0;
117: #ifdef DEBUG
118: printf("bugscstrategy: size=%d blk=%d buf=%x\n", size, blk, buf);
119: printf("ctrl %d dev %d\n", dio.ctrl_lun, dio.dev_lun);
120: #endif
121: mvmeprom_diskrd(&dio);
122:
123: *rsize = dio.blk_cnt * BUG_BLOCK_SIZE;
124: #ifdef DEBUG
125: printf("rsize %d status %x\n", *rsize, dio.status);
126: #endif
127:
128: if (dio.status)
129: return (EIO);
130: return (0);
131: }
132:
133: int
134: bugscopen(struct open_file *f)
135: {
136: #ifdef DEBUG
137: printf("bugscopen:\n");
138: #endif
139:
140: f->f_devdata = (void *)bugsc_softc;
141: bugsc_softc[0].ctrl = (short)bugargs.ctrl_lun;
142: bugsc_softc[0].dev = (short)bugargs.dev_lun;
143: #ifdef DEBUG
144: printf("using mvmebug ctrl %d dev %d\n",
145: bugsc_softc[0].ctrl, bugsc_softc[0].dev);
146: #endif
147: return (0);
148: }
149:
150: int
151: bugscclose(struct open_file *f)
152: {
153: return (EIO);
154: }
155:
156: int
157: bugscioctl(struct open_file *f, u_long cmd, void *data)
158: {
159: return (EIO);
160: }
161:
162: void
163: cputobsdlabel(struct disklabel *lp, struct mvmedisklabel *clp)
164: {
165: int i;
166:
167: lp->d_magic = clp->magic1;
168: lp->d_type = clp->type;
169: lp->d_subtype = clp->subtype;
170: bcopy(clp->vid_vd, lp->d_typename, 16);
171: bcopy(clp->packname, lp->d_packname, 16);
172: lp->d_secsize = clp->cfg_psm;
173: lp->d_nsectors = clp->cfg_spt;
174: lp->d_ncylinders = clp->cfg_trk; /* trk is really num of cyl! */
175: lp->d_ntracks = clp->cfg_hds;
176:
177: lp->d_secpercyl = clp->secpercyl;
178: lp->d_secperunit = clp->secperunit;
179: lp->d_secpercyl = clp->secpercyl;
180: lp->d_secperunit = clp->secperunit;
181: lp->d_sparespertrack = clp->sparespertrack;
182: lp->d_sparespercyl = clp->sparespercyl;
183: lp->d_acylinders = clp->acylinders;
184: lp->d_rpm = clp->rpm;
185: lp->d_interleave = clp->cfg_ilv;
186: lp->d_trackskew = clp->cfg_sof;
187: lp->d_cylskew = clp->cylskew;
188: lp->d_headswitch = clp->headswitch;
189:
190: /* this silly table is for winchester drives */
191: switch (clp->cfg_ssr) {
192: case 0:
193: lp->d_trkseek = 0;
194: break;
195: case 1:
196: lp->d_trkseek = 6;
197: break;
198: case 2:
199: lp->d_trkseek = 10;
200: break;
201: case 3:
202: lp->d_trkseek = 15;
203: break;
204: case 4:
205: lp->d_trkseek = 20;
206: break;
207: default:
208: lp->d_trkseek = 0;
209: break;
210: }
211: lp->d_flags = clp->flags;
212: for (i = 0; i < NDDATA; i++)
213: lp->d_drivedata[i] = clp->drivedata[i];
214: for (i = 0; i < NSPARE; i++)
215: lp->d_spare[i] = clp->spare[i];
216: lp->d_magic2 = clp->magic2;
217: lp->d_checksum = clp->checksum;
218: lp->d_npartitions = clp->partitions;
219: lp->d_bbsize = clp->bbsize;
220: lp->d_sbsize = clp->sbsize;
221: bcopy(clp->vid_4, &(lp->d_partitions[0]),sizeof (struct partition) * 4);
222: bcopy(clp->cfg_4, &(lp->d_partitions[4]), sizeof (struct partition) *
223: ((MAXPARTITIONS < 16) ? (MAXPARTITIONS - 4) : 12));
224: }
CVSweb