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