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