xref: /csrg-svn/sys/luna68k/stand/conf.c (revision 57081)
1*57081Sakito /*
2*57081Sakito  * Copyright (c) 1992 OMRON Corporation.
3*57081Sakito  * Copyright (c) 1992 The Regents of the University of California.
4*57081Sakito  * All rights reserved.
5*57081Sakito  *
6*57081Sakito  * This code is derived from software contributed to Berkeley by
7*57081Sakito  * OMRON Corporation.
8*57081Sakito  *
9*57081Sakito  * %sccs.include.redist.c%
10*57081Sakito  *
11*57081Sakito  *	@(#)conf.c	7.1 (Berkeley) 12/13/92
12*57081Sakito  */
13*57081Sakito 
14*57081Sakito #include <luna68k/stand/saio.h>
15*57081Sakito 
16*57081Sakito devread(io)
17*57081Sakito 	register struct iob *io;
18*57081Sakito {
19*57081Sakito 	int cc;
20*57081Sakito 
21*57081Sakito 	io->i_flgs |= F_RDDATA;
22*57081Sakito 	io->i_error = 0;
23*57081Sakito 	cc = (*devsw[io->i_dev].dv_strategy)(io, READ);
24*57081Sakito 	io->i_flgs &= ~F_TYPEMASK;
25*57081Sakito 	return (cc);
26*57081Sakito }
27*57081Sakito 
28*57081Sakito devwrite(io)
29*57081Sakito 	register struct iob *io;
30*57081Sakito {
31*57081Sakito 	int cc;
32*57081Sakito 
33*57081Sakito 	io->i_flgs |= F_WRDATA;
34*57081Sakito 	io->i_error = 0;
35*57081Sakito 	cc = (*devsw[io->i_dev].dv_strategy)(io, WRITE);
36*57081Sakito 	io->i_flgs &= ~F_TYPEMASK;
37*57081Sakito 	return (cc);
38*57081Sakito }
39*57081Sakito 
40*57081Sakito devopen(io)
41*57081Sakito 	register struct iob *io;
42*57081Sakito {
43*57081Sakito 
44*57081Sakito 	(*devsw[io->i_dev].dv_open)(io);
45*57081Sakito }
46*57081Sakito 
47*57081Sakito devclose(io)
48*57081Sakito 	register struct iob *io;
49*57081Sakito {
50*57081Sakito 
51*57081Sakito 	(*devsw[io->i_dev].dv_close)(io);
52*57081Sakito }
53*57081Sakito 
54*57081Sakito devioctl(io, cmd, arg)
55*57081Sakito 	register struct iob *io;
56*57081Sakito 	int cmd;
57*57081Sakito 	caddr_t arg;
58*57081Sakito {
59*57081Sakito 
60*57081Sakito 	return ((*devsw[io->i_dev].dv_ioctl)(io, cmd, arg));
61*57081Sakito }
62*57081Sakito 
63*57081Sakito /*ARGSUSED*/
64*57081Sakito nullsys(io)
65*57081Sakito 	struct iob *io;
66*57081Sakito {
67*57081Sakito 
68*57081Sakito 	;
69*57081Sakito }
70*57081Sakito 
71*57081Sakito /*ARGSUSED*/
72*57081Sakito nullioctl(io, cmd, arg)
73*57081Sakito 	struct iob *io;
74*57081Sakito 	int cmd;
75*57081Sakito 	caddr_t arg;
76*57081Sakito {
77*57081Sakito 
78*57081Sakito 	return (ECMD);
79*57081Sakito }
80*57081Sakito 
81*57081Sakito int	nullsys(), nullioctl();
82*57081Sakito int	sdstrategy(), sdopen(), sdioctl();
83*57081Sakito 
84*57081Sakito struct devsw devsw[] = {
85*57081Sakito 	{ "sd",	sdstrategy,	sdopen,		nullsys,	nullioctl },
86*57081Sakito 	{ 0, 0, 0, 0, 0 },
87*57081Sakito };
88*57081Sakito 
89*57081Sakito dev_t
90*57081Sakito make_device(str)
91*57081Sakito 	char *str;
92*57081Sakito {
93*57081Sakito 	char *cp;
94*57081Sakito 	struct devsw *dp;
95*57081Sakito 	int major, unit, part;
96*57081Sakito 
97*57081Sakito 	/*
98*57081Sakito 	 * parse path strings
99*57081Sakito 	 */
100*57081Sakito 							/* find end of dev type name */
101*57081Sakito 	for (cp = str; *cp && *cp != '('; cp++)
102*57081Sakito 			;
103*57081Sakito 	if (*cp != '(') {
104*57081Sakito 		return (-1);
105*57081Sakito 	}
106*57081Sakito 							/* compare dev type name */
107*57081Sakito 	*cp = '\0';
108*57081Sakito 	for (dp = devsw; dp->dv_name; dp++)
109*57081Sakito 		if (!strcmp(str, dp->dv_name))
110*57081Sakito 			break;
111*57081Sakito 	*cp++ = '(';
112*57081Sakito 	if (dp->dv_name == NULL) {
113*57081Sakito 		return (-1);
114*57081Sakito 	}
115*57081Sakito 	major = dp - devsw;
116*57081Sakito 							/* get unit number */
117*57081Sakito 	unit = *cp++ - '0';
118*57081Sakito 	if (*cp >= '0' && *cp <= '9')
119*57081Sakito 		unit = unit * 10 + *cp++ - '0';
120*57081Sakito 	if (unit < 0 || unit > 63) {
121*57081Sakito 		return (-1);
122*57081Sakito 	}
123*57081Sakito 							/* get partition offset */
124*57081Sakito 	if (*cp++ != ',') {
125*57081Sakito 		return (-1);
126*57081Sakito 	}
127*57081Sakito 	part = *cp - '0';
128*57081Sakito 							/* check out end of dev spec */
129*57081Sakito 	for (;;) {
130*57081Sakito 		if (*cp == ')')
131*57081Sakito 			break;
132*57081Sakito 		if (*cp++)
133*57081Sakito 			continue;
134*57081Sakito 		return (-1);
135*57081Sakito 	}
136*57081Sakito 
137*57081Sakito 	return(major << 8 | unit << 3 | part);
138*57081Sakito }
139