1 /**	$MirOS: src/sys/sys/conf.h,v 1.3 2005/08/02 12:00:13 tg Exp $ */
2 /*	$OpenBSD: conf.h,v 1.76 2005/07/31 06:39:07 dlg Exp $	*/
3 /*	$NetBSD: conf.h,v 1.33 1996/05/03 20:03:32 christos Exp $	*/
4 
5 /*-
6  * Copyright (c) 1990, 1993
7  *	The Regents of the University of California.  All rights reserved.
8  * (c) UNIX System Laboratories, Inc.
9  * All or some portions of this file are derived from material licensed
10  * to the University of California by American Telephone and Telegraph
11  * Co. or Unix System Laboratories, Inc. and are reproduced herein with
12  * the permission of UNIX System Laboratories, Inc.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  * 1. Redistributions of source code must retain the above copyright
18  *    notice, this list of conditions and the following disclaimer.
19  * 2. Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the
21  *    documentation and/or other materials provided with the distribution.
22  * 3. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *	@(#)conf.h	8.3 (Berkeley) 1/21/94
39  */
40 
41 
42 #ifndef _SYS_CONF_H_
43 #define _SYS_CONF_H_
44 
45 /*
46  * Definitions of device driver entry switches
47  */
48 
49 struct buf;
50 struct proc;
51 struct tty;
52 struct uio;
53 struct vnode;
54 struct knote;
55 
56 /*
57  * Types for d_type
58  */
59 #define	D_TAPE	1
60 #define	D_DISK	2
61 #define	D_TTY	3
62 
63 /*
64  * Flags for d_type
65  */
66 #define D_KQFILTER	0x00010000	/* has kqfilter entry */
67 
68 #ifdef _KERNEL
69 
70 #define	dev_type_open(n)	int n(dev_t, int, int, struct proc *)
71 #define	dev_type_close(n)	int n(dev_t, int, int, struct proc *)
72 #define	dev_type_strategy(n)	void n(struct buf *)
73 #define	dev_type_ioctl(n) \
74 	int n(dev_t, u_long, caddr_t, int, struct proc *)
75 
76 #define	dev_decl(n,t)	__CONCAT(dev_type_,t)(__CONCAT(n,t))
77 #define	dev_init(c,n,t) \
78 	((c) > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio)
79 
80 #endif /* _KERNEL */
81 
82 /*
83  * Block device switch table
84  */
85 struct bdevsw {
86 	int	(*d_open)(dev_t dev, int oflags, int devtype,
87 				     struct proc *p);
88 	int	(*d_close)(dev_t dev, int fflag, int devtype,
89 				     struct proc *p);
90 	void	(*d_strategy)(struct buf *bp);
91 	int	(*d_ioctl)(dev_t dev, u_long cmd, caddr_t data,
92 				     int fflag, struct proc *p);
93 	int	(*d_dump)(dev_t dev, daddr_t blkno, caddr_t va,
94 				    size_t size);
95 	int	(*d_psize)(dev_t dev);
96 	int	d_type;
97 };
98 
99 #ifdef _KERNEL
100 
101 extern struct bdevsw bdevsw[];
102 
103 /* bdevsw-specific types */
104 #define	dev_type_dump(n)	int n(dev_t, daddr_t, caddr_t, size_t)
105 #define	dev_type_size(n)	int n(dev_t)
106 
107 /* bdevsw-specific initializations */
108 #define	dev_size_init(c,n)	(c > 0 ? __CONCAT(n,size) : 0)
109 
110 #define	bdev_decl(n) \
111 	dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \
112 	dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size)
113 
114 #define	bdev_disk_init(c,n) { \
115 	dev_init(c,n,open), dev_init(c,n,close), \
116 	dev_init(c,n,strategy), dev_init(c,n,ioctl), \
117 	dev_init(c,n,dump), dev_size_init(c,n), D_DISK }
118 
119 #define	bdev_tape_init(c,n) { \
120 	dev_init(c,n,open), dev_init(c,n,close), \
121 	dev_init(c,n,strategy), dev_init(c,n,ioctl), \
122 	dev_init(c,n,dump), 0, D_TAPE }
123 
124 #define	bdev_swap_init(c,n) { \
125 	(dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
126 	dev_init(c,n,strategy), (dev_type_ioctl((*))) enodev, \
127 	(dev_type_dump((*))) enodev, 0 }
128 
129 #define	bdev_lkm_dummy() { \
130 	(dev_type_open((*))) lkmenodev, (dev_type_close((*))) enodev, \
131 	(dev_type_strategy((*))) enodev, (dev_type_ioctl((*))) enodev, \
132 	(dev_type_dump((*))) enodev, 0 }
133 
134 #define	bdev_notdef() { \
135 	(dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
136 	(dev_type_strategy((*))) enodev, (dev_type_ioctl((*))) enodev, \
137 	(dev_type_dump((*))) enodev, 0 }
138 
139 #endif
140 
141 /*
142  * Character device switch table
143  */
144 struct cdevsw {
145 	int	(*d_open)(dev_t dev, int oflags, int devtype,
146 				     struct proc *p);
147 	int	(*d_close)(dev_t dev, int fflag, int devtype,
148 				     struct proc *);
149 	int	(*d_read)(dev_t dev, struct uio *uio, int ioflag);
150 	int	(*d_write)(dev_t dev, struct uio *uio, int ioflag);
151 	int	(*d_ioctl)(dev_t dev, u_long cmd, caddr_t data,
152 				     int fflag, struct proc *p);
153 	int	(*d_stop)(struct tty *tp, int rw);
154 	struct tty *
155 		(*d_tty)(dev_t dev);
156 	int	(*d_poll)(dev_t dev, int events, struct proc *p);
157 	paddr_t	(*d_mmap)(dev_t, off_t, int);
158 	u_int	d_type;
159 	int	(*d_kqfilter)(dev_t dev, struct knote *kn);
160 };
161 
162 #ifdef _KERNEL
163 
164 extern struct cdevsw cdevsw[];
165 
166 /* cdevsw-specific types */
167 #define	dev_type_read(n)	int n(dev_t, struct uio *, int)
168 #define	dev_type_write(n)	int n(dev_t, struct uio *, int)
169 #define	dev_type_stop(n)	int n(struct tty *, int)
170 #define	dev_type_tty(n)		struct tty *n(dev_t)
171 #define	dev_type_poll(n)	int n(dev_t, int, struct proc *)
172 #define	dev_type_mmap(n)	paddr_t n(dev_t, off_t, int)
173 #define dev_type_kqfilter(n)	int n(dev_t, struct knote *)
174 
175 #define	cdev_decl(n) \
176 	dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \
177 	dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \
178 	dev_decl(n,tty); dev_decl(n,poll); dev_decl(n,mmap); \
179 	dev_decl(n,kqfilter)
180 
181 /* open, close, read, write, ioctl */
182 #define	cdev_disk_init(c,n) { \
183 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
184 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
185 	0, seltrue, (dev_type_mmap((*))) enodev, D_DISK }
186 
187 /* open, close, read, write, ioctl */
188 #define	cdev_tape_init(c,n) { \
189 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
190 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
191 	0, seltrue, (dev_type_mmap((*))) enodev, D_TAPE }
192 
193 /* open, close, read, ioctl */
194 #define cdev_scanner_init(c,n) { \
195 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
196 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
197 	(dev_type_stop((*))) nullop, \
198 	0, seltrue, (dev_type_mmap((*))) enodev, 0 }
199 
200 /* open, close, read, write, ioctl, stop, tty */
201 #define	cdev_tty_init(c,n) { \
202 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
203 	dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \
204 	dev_init(c,n,tty), ttpoll, (dev_type_mmap((*))) enodev, \
205 	D_TTY | D_KQFILTER, ttkqfilter }
206 
207 /* open, close, read, ioctl, poll, nokqfilter */
208 #define	cdev_mouse_init(c,n) { \
209 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
210 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
211 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
212 	(dev_type_mmap((*))) enodev }
213 
214 /* open, close, read, write, ioctl, poll, nokqfilter */
215 #define	cdev_mousewr_init(c,n) { \
216 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
217 	dev_init(c,n,write), dev_init(c,n,ioctl), \
218 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
219 	(dev_type_mmap((*))) enodev }
220 
221 #define	cdev_lkm_dummy() { \
222 	(dev_type_open((*))) lkmenodev, (dev_type_close((*))) enodev, \
223 	(dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
224 	(dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
225 	0, seltrue, (dev_type_mmap((*))) enodev }
226 
227 #define	cdev_notdef() { \
228 	(dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
229 	(dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
230 	(dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
231 	0, seltrue, (dev_type_mmap((*))) enodev }
232 
233 /* open, close, read, write, ioctl, poll, kqfilter -- XXX should be a tty */
234 #define	cdev_cn_init(c,n) { \
235 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
236 	dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \
237 	0, dev_init(c,n,poll), (dev_type_mmap((*))) enodev, \
238 	D_TTY | D_KQFILTER, dev_init(c,n,kqfilter) }
239 
240 /* open, read, write, ioctl, poll, kqfilter -- XXX should be a tty */
241 #define cdev_ctty_init(c,n) { \
242 	dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
243 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
244 	0, dev_init(c,n,poll), (dev_type_mmap((*))) enodev, \
245 	D_TTY | D_KQFILTER, ttkqfilter }
246 
247 /* open, close, read, write, ioctl, mmap */
248 #define cdev_mm_init(c,n) { \
249 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
250 	dev_init(c,n,write), dev_init(c,n,ioctl), \
251 	(dev_type_stop((*))) enodev, 0, seltrue, dev_init(c,n,mmap) }
252 
253 /* open, close, read, write, ioctl, mmap */
254 #define cdev_crypto_init(c,n) { \
255 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
256 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
257 	0, (dev_type_poll((*))) enodev, (dev_type_mmap((*))) enodev }
258 
259 /* open, close, read, write, ioctl */
260 #define cdev_systrace_init(c,n) { \
261 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
262 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
263 	0, (dev_type_poll((*))) enodev, (dev_type_mmap((*))) enodev }
264 
265 /* read, write */
266 #define cdev_swap_init(c,n) { \
267 	(dev_type_open((*))) nullop, (dev_type_close((*))) nullop, \
268 	dev_init(c,n,read), dev_init(c,n,write), (dev_type_ioctl((*))) enodev, \
269 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
270 	(dev_type_mmap((*))) enodev }
271 
272 /* open, close, read, write, ioctl, tty, poll, kqfilter */
273 #define cdev_ptc_init(c,n) { \
274 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
275 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
276 	dev_init(c,n,tty), dev_init(c,n,poll), (dev_type_mmap((*))) enodev, \
277 	D_TTY | D_KQFILTER, dev_init(c,n,kqfilter) }
278 
279 /* open, close, read, write, ioctl, mmap */
280 #define cdev_ptm_init(c,n) { \
281 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
282 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
283 	0, (dev_type_poll((*))) enodev, (dev_type_mmap((*))) enodev }
284 
285 /* open, close, read, ioctl, poll, kqfilter XXX should be a generic device */
286 #define cdev_log_init(c,n) { \
287 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
288 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
289 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
290 	(dev_type_mmap((*))) enodev, D_KQFILTER, dev_init(c,n,kqfilter) }
291 
292 /* open */
293 #define cdev_fd_init(c,n) { \
294 	dev_init(c,n,open), (dev_type_close((*))) enodev, \
295 	(dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
296 	(dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
297 	0, (dev_type_poll((*))) enodev, (dev_type_mmap((*))) enodev }
298 
299 /* open, close, read, write, ioctl, poll, kqfilter -- XXX should be generic device */
300 #define cdev_bpftun_init(c,n) { \
301 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
302 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
303 	0, dev_init(c,n,poll), (dev_type_mmap((*))) enodev, \
304 	D_KQFILTER, dev_init(c,n,kqfilter) }
305 
306 /* open, close, ioctl */
307 #define	cdev_lkm_init(c,n) { \
308 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
309 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
310 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
311 	(dev_type_mmap((*))) enodev }
312 
313 /* open, close, ioctl */
314 #define	cdev_ch_init(c,n) { \
315 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
316 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
317 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
318 	(dev_type_mmap((*))) enodev }
319 
320 /* open, close, ioctl */
321 #define       cdev_uk_init(c,n) { \
322 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
323 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
324 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
325 	(dev_type_mmap((*))) enodev }
326 
327 /* open, close, read, ioctl */
328 #define cdev_ss_init(c,n) { \
329 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
330 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
331 	(dev_type_stop((*))) enodev, 0, seltrue, \
332 	(dev_type_mmap((*))) enodev }
333 
334 /* open, close, ioctl, mmap */
335 #define	cdev_fb_init(c,n) { \
336 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
337 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
338 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
339 	dev_init(c,n,mmap) }
340 
341 /* open, close, read, write, ioctl, poll, kqfilter */
342 #define cdev_audio_init(c,n) { \
343 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
344 	dev_init(c,n,write), dev_init(c,n,ioctl), \
345 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
346 	dev_init(c,n,mmap), D_KQFILTER, dev_init(c,n,kqfilter) }
347 
348 /* open, close, read, write, ioctl, poll, nokqfilter */
349 #define cdev_midi_init(c,n) { \
350 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
351 	dev_init(c,n,write), dev_init(c,n,ioctl), \
352 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
353 	(dev_type_mmap((*))) enodev }
354 
355 /* open, close, read */
356 #define cdev_ksyms_init(c,n) { \
357 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
358 	(dev_type_write((*))) enodev, (dev_type_ioctl((*))) enodev, \
359 	(dev_type_stop((*))) enodev, 0, seltrue, \
360 	(dev_type_mmap((*))) enodev, 0 }
361 
362 /* open, close, read, write, ioctl, stop, tty, poll, mmap, kqfilter */
363 #define	cdev_wsdisplay_init(c,n) { \
364 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
365 	dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \
366 	dev_init(c,n,tty), ttpoll, dev_init(c,n,mmap), \
367 	D_KQFILTER, dev_init(c,n,kqfilter) }
368 
369 /* open, close, read, write, ioctl, poll, kqfilter */
370 #define	cdev_random_init(c,n) { \
371 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
372 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
373 	0, dev_init(c,n,poll), (dev_type_mmap((*))) enodev, \
374 	D_KQFILTER, dev_init(c,n,kqfilter) }
375 void	randomattach(void);
376 
377 /* open, close, ioctl, poll, nokqfilter */
378 #define	cdev_usb_init(c,n) { \
379 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
380 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
381 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
382 	(dev_type_mmap((*))) enodev }
383 
384 /* open, close, write, ioctl */
385 #define cdev_ulpt_init(c,n) { \
386 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
387 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
388 	0, (dev_type_poll((*))) enodev, (dev_type_mmap((*))) enodev }
389 
390 /* open, close, ioctl */
391 #define cdev_pf_init(c,n) { \
392 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
393 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
394 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
395 	(dev_type_mmap((*))) enodev }
396 
397 /* open, close, read, write, ioctl, poll, nokqfilter */
398 #define	cdev_urio_init(c,n) { \
399 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
400 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
401 	0, dev_init(c,n,poll), (dev_type_mmap((*))) enodev }
402 
403 /* open, close, read, write, ioctl, poll, kqfilter */
404 #define	cdev_usbdev_init(c,n) { \
405 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
406 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
407 	0, dev_init(c,n,poll), (dev_type_mmap((*))) enodev, D_KQFILTER, \
408 	dev_init(c,n,kqfilter) }
409 
410 /* open, close, init */
411 #define cdev_pci_init(c,n) { \
412 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
413 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
414 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
415 	(dev_type_mmap((*))) enodev }
416 
417 /* open, close, init */
418 #define cdev_iop_init(c,n) { \
419 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
420 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
421 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
422 	(dev_type_mmap((*))) enodev }
423 
424 /* open, close, ioctl */
425 #define cdev_radio_init(c,n) { \
426 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
427 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
428 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
429 	(dev_type_mmap((*))) enodev }
430 
431 /* open, close, write, ioctl */
432 #define cdev_spkr_init(c,n) { \
433 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
434 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
435 	0, seltrue, (dev_type_mmap((*))) enodev }
436 
437 /* open, close, write, ioctl */
438 #define cdev_lpt_init(c,n) { \
439 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
440 	dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
441 	0, seltrue, (dev_type_mmap((*))) enodev }
442 
443 /* open, close, read, ioctl, mmap */
444 #define cdev_bktr_init(c, n) { \
445 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
446 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
447 	(dev_type_stop((*))) enodev, 0, seltrue, \
448 	dev_init(c,n,mmap) }
449 
450 /* open, close, read, ioctl, poll, kqfilter */
451 #define cdev_hotplug_init(c,n) { \
452 	dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
453 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
454 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,poll), \
455 	(dev_type_mmap((*))) enodev, D_KQFILTER, dev_init(c,n,kqfilter) }
456 
457 /* open, close, ioctl */
458 #define cdev_gpio_init(c,n) { \
459 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
460 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
461 	(dev_type_stop((*))) enodev, 0, (dev_type_poll((*))) enodev, \
462 	(dev_type_mmap((*))) enodev }
463 
464 /* symbolic sleep message strings */
465 extern char devopn[], devio[], devwait[], devin[], devout[];
466 extern char devioc[], devcls[];
467 
468 #endif
469 
470 /*
471  * Line discipline switch table
472  */
473 struct linesw {
474 	int	(*l_open)(dev_t dev, struct tty *tp);
475 	int	(*l_close)(struct tty *tp, int flags);
476 	int	(*l_read)(struct tty *tp, struct uio *uio,
477 				     int flag);
478 	int	(*l_write)(struct tty *tp, struct uio *uio,
479 				     int flag);
480 	int	(*l_ioctl)(struct tty *tp, u_long cmd, caddr_t data,
481 				     int flag, struct proc *p);
482 	int	(*l_rint)(int c, struct tty *tp);
483 	int	(*l_start)(struct tty *tp);
484 	int	(*l_modem)(struct tty *tp, int flag);
485 };
486 
487 #ifdef _KERNEL
488 extern struct linesw linesw[];
489 #endif
490 
491 /*
492  * Swap device table
493  */
494 struct swdevt {
495 	dev_t	sw_dev;
496 	int	sw_flags;
497 	int	sw_nblks;
498 	struct	vnode *sw_vp;
499 };
500 #define	SW_FREED	0x01
501 #define	SW_SEQUENTIAL	0x02
502 #define	sw_freed	sw_flags	/* XXX compat */
503 
504 #ifdef _KERNEL
505 extern struct swdevt swdevt[];
506 extern int chrtoblktbl[];
507 extern int nchrtoblktbl;
508 
509 struct bdevsw *bdevsw_lookup(dev_t);
510 struct cdevsw *cdevsw_lookup(dev_t);
511 int	chrtoblk(dev_t);
512 int	blktochr(dev_t);
513 int	iskmemdev(dev_t);
514 int	iszerodev(dev_t);
515 dev_t	getnulldev(void);
516 
517 cdev_decl(filedesc);
518 
519 cdev_decl(log);
520 
521 #ifndef LKM
522 # define	NLKM	0
523 # define	lkmenodev	enodev
524 #else
525 # define	NLKM	1
526 #endif
527 cdev_decl(lkm);
528 
529 #define	ptstty		ptytty
530 #define	ptsioctl	ptyioctl
531 cdev_decl(pts);
532 
533 #define	ptctty		ptytty
534 #define	ptcioctl	ptyioctl
535 cdev_decl(ptc);
536 
537 cdev_decl(ptm);
538 
539 cdev_decl(ctty);
540 
541 cdev_decl(audio);
542 cdev_decl(midi);
543 cdev_decl(sequencer);
544 cdev_decl(radio);
545 cdev_decl(cn);
546 
547 bdev_decl(sw);
548 cdev_decl(sw);
549 
550 bdev_decl(vnd);
551 cdev_decl(vnd);
552 
553 bdev_decl(ccd);
554 cdev_decl(ccd);
555 
556 bdev_decl(raid);
557 cdev_decl(raid);
558 
559 cdev_decl(iop);
560 
561 cdev_decl(ch);
562 
563 cdev_decl(ss);
564 
565 bdev_decl(sd);
566 cdev_decl(sd);
567 
568 cdev_decl(ses);
569 
570 bdev_decl(st);
571 cdev_decl(st);
572 
573 bdev_decl(cd);
574 cdev_decl(cd);
575 
576 bdev_decl(rd);
577 cdev_decl(rd);
578 
579 bdev_decl(uk);
580 cdev_decl(uk);
581 
582 cdev_decl(bpf);
583 
584 cdev_decl(pf);
585 
586 cdev_decl(tun);
587 
588 cdev_decl(random);
589 
590 cdev_decl(wsdisplay);
591 cdev_decl(wskbd);
592 cdev_decl(wsmouse);
593 cdev_decl(wsmux);
594 
595 cdev_decl(ksyms);
596 
597 cdev_decl(crypto);
598 
599 cdev_decl(systrace);
600 
601 cdev_decl(bio);
602 
603 cdev_decl(gpr);
604 cdev_decl(bktr);
605 
606 cdev_decl(usb);
607 cdev_decl(ugen);
608 cdev_decl(uhid);
609 cdev_decl(ucom);
610 cdev_decl(ulpt);
611 cdev_decl(uscanner);
612 cdev_decl(urio);
613 
614 #endif
615 
616 #endif /* _SYS_CONF_H_ */
617