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