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