149610Sdonn /*- 249610Sdonn * Copyright (c) 1991 The Regents of the University of California. 341475Smckusick * All rights reserved. 441475Smckusick * 541475Smckusick * %sccs.include.redist.c% 641475Smckusick * 7*49623Skarels * @(#)conf.c 7.8 (Berkeley) 05/10/91 841475Smckusick */ 941475Smckusick 1045788Sbostic #include "sys/param.h" 1145788Sbostic #include "sys/systm.h" 1245788Sbostic #include "sys/buf.h" 1345788Sbostic #include "sys/ioctl.h" 1445788Sbostic #include "sys/tty.h" 1545788Sbostic #include "sys/conf.h" 1641475Smckusick 17*49623Skarels int rawread __P((dev_t, struct uio *, int)); 18*49623Skarels int rawwrite __P((dev_t, struct uio *, int)); 19*49623Skarels int swstrategy __P((struct buf *)); 20*49623Skarels int ttselect __P((dev_t, int, struct proc *)); 2141475Smckusick 22*49623Skarels #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 23*49623Skarels #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 24*49623Skarels #define dev_type_strategy(n) int n __P((struct buf *)) 25*49623Skarels #define dev_type_ioctl(n) \ 26*49623Skarels int n __P((dev_t, int, caddr_t, int, struct proc *)) 2749610Sdonn 2849610Sdonn /* bdevsw-specific types */ 29*49623Skarels #define dev_type_dump(n) int n __P((dev_t)) 30*49623Skarels #define dev_type_size(n) int n __P((dev_t)) 3149610Sdonn 32*49623Skarels #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t)) 3349610Sdonn #define dev_init(c,n,t) \ 34*49623Skarels (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 3549610Sdonn 3649610Sdonn /* bdevsw-specific initializations */ 37*49623Skarels #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0) 3849610Sdonn 39*49623Skarels #define bdev_decl(n) \ 40*49623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 41*49623Skarels dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 4249610Sdonn 43*49623Skarels #define bdev_disk_init(c,n) { \ 44*49623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, \ 45*49623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 46*49623Skarels dev_init(c,n,dump), dev_size_init(c,n), 0 } 4749610Sdonn 48*49623Skarels #define bdev_tape_init(c,n) { \ 49*49623Skarels dev_init(c,n,open), dev_init(c,n,close), \ 50*49623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 51*49623Skarels dev_init(c,n,dump), 0, B_TAPE } 5249610Sdonn 53*49623Skarels #define bdev_swap_init() { \ 54*49623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 55*49623Skarels swstrategy, (dev_type_ioctl((*))) enodev, \ 56*49623Skarels (dev_type_dump((*))) enodev, 0, 0 } 5749610Sdonn 58*49623Skarels #define bdev_notdef() bdev_tape_init(0,no) 5949610Sdonn bdev_decl(no); /* dummy declarations */ 6049610Sdonn 6141475Smckusick #include "ct.h" 6241475Smckusick #include "rd.h" 6341475Smckusick #include "sd.h" 6441475Smckusick #include "cd.h" 6549328Shibler #include "vn.h" 6649610Sdonn 6749610Sdonn bdev_decl(ct); 6849610Sdonn bdev_decl(rd); 6949610Sdonn bdev_decl(sd); 7049610Sdonn bdev_decl(cd); 7149610Sdonn bdev_decl(vn); 7249610Sdonn 7341475Smckusick struct bdevsw bdevsw[] = 7441475Smckusick { 7549610Sdonn bdev_tape_init(NCT,ct), /* 0: cs80 cartridge tape */ 7649610Sdonn bdev_notdef(), /* 1 */ 7749610Sdonn bdev_disk_init(NRD,rd), /* 2: hpib disk */ 7849610Sdonn bdev_swap_init(), /* 3: swap pseudo-device */ 7949610Sdonn bdev_disk_init(NSD,sd), /* 4: scsi disk */ 8049610Sdonn bdev_disk_init(NCD,cd), /* 5: concatenated disk driver */ 8149610Sdonn bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 8241475Smckusick }; 8349610Sdonn 8441475Smckusick int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 8541475Smckusick 8649610Sdonn /* cdevsw-specific types */ 87*49623Skarels #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 88*49623Skarels #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 89*49623Skarels #define dev_type_stop(n) int n __P((struct tty *, int)) 90*49623Skarels #define dev_type_reset(n) int n __P((int)) 9149610Sdonn #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 9249610Sdonn #define dev_type_map(n) int n __P(()) 9341475Smckusick 94*49623Skarels #define cdev_decl(n) \ 95*49623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 96*49623Skarels dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 97*49623Skarels dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 98*49623Skarels dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 9941475Smckusick 10049610Sdonn #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 10141475Smckusick 10249610Sdonn /* open, read, write, ioctl, strategy */ 103*49623Skarels #define cdev_disk_init(c,n) { \ 104*49623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 105*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 106*49623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 107*49623Skarels dev_init(c,n,strategy) } 10849610Sdonn 10949610Sdonn /* open, close, read, write, ioctl, strategy */ 110*49623Skarels #define cdev_tape_init(c,n) { \ 111*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 112*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 113*49623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 114*49623Skarels dev_init(c,n,strategy) } 11549610Sdonn 11649610Sdonn /* open, close, read, write, ioctl, stop, tty */ 117*49623Skarels #define cdev_tty_init(c,n) { \ 118*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 119*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 120*49623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 121*49623Skarels (dev_type_map((*))) enodev, 0 } 12249610Sdonn 123*49623Skarels #define cdev_notdef() { \ 124*49623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 125*49623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 126*49623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 127*49623Skarels (dev_type_reset((*))) nullop, 0, seltrue, \ 128*49623Skarels (dev_type_map((*))) enodev, 0 } 12949610Sdonn 13049610Sdonn cdev_decl(no); /* dummy declarations */ 13149610Sdonn 13249610Sdonn cdev_decl(cn); 13349610Sdonn /* open, close, read, write, ioctl, select -- XXX should be a tty */ 134*49623Skarels #define cdev_cn_init(c,n) { \ 135*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 136*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 137*49623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 138*49623Skarels (dev_type_map((*))) enodev, 0 } 13949610Sdonn 14049610Sdonn cdev_decl(ctty); 14149610Sdonn /* open, read, write, ioctl, select -- XXX should be a tty */ 142*49623Skarels #define cdev_ctty_init(c,n) { \ 143*49623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 144*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 145*49623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 146*49623Skarels (dev_type_map((*))) enodev, 0 } 14749610Sdonn 14849610Sdonn dev_type_read(mmrw); 14949610Sdonn /* read/write */ 150*49623Skarels #define cdev_mm_init(c,n) { \ 151*49623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 152*49623Skarels mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 153*49623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 15449610Sdonn 15549610Sdonn /* read, write, strategy */ 156*49623Skarels #define cdev_swap_init(c,n) { \ 157*49623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 158*49623Skarels rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 159*49623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 160*49623Skarels (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 16149610Sdonn 16241475Smckusick #include "pty.h" 16349610Sdonn #define pts_tty pt_tty 16449610Sdonn #define ptsioctl ptyioctl 16549610Sdonn cdev_decl(pts); 16649610Sdonn #define ptc_tty pt_tty 16749610Sdonn #define ptcioctl ptyioctl 16849610Sdonn cdev_decl(ptc); 16941475Smckusick 17049610Sdonn /* open, close, read, write, ioctl, tty, select */ 171*49623Skarels #define cdev_ptc_init(c,n) { \ 172*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 173*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 174*49623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 175*49623Skarels (dev_type_map((*))) enodev, 0 } 17649610Sdonn 17749610Sdonn cdev_decl(log); 17849610Sdonn /* open, close, read, ioctl, select -- XXX should be a generic device */ 179*49623Skarels #define cdev_log_init(c,n) { \ 180*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 181*49623Skarels (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 182*49623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 183*49623Skarels dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 18449610Sdonn 18549610Sdonn cdev_decl(ct); 18649610Sdonn cdev_decl(sd); 18749610Sdonn cdev_decl(rd); 18849610Sdonn 18949610Sdonn /* XXX shouldn't this be optional? */ 19049610Sdonn cdev_decl(grf); 19149610Sdonn /* open, close, ioctl, select, map -- XXX should be a map device */ 192*49623Skarels #define cdev_grf_init(c,n) { \ 193*49623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 194*49623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 195*49623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 196*49623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 19749610Sdonn 19841475Smckusick #include "ppi.h" 19949610Sdonn cdev_decl(ppi); 20049610Sdonn /* open, close, read, write, ioctl -- XXX should be a generic device */ 201*49623Skarels #define cdev_ppi_init(c,n) { \ 202*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 203*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 204*49623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 205*49623Skarels (dev_type_map((*))) enodev, 0 } 20641475Smckusick 20749610Sdonn #include "dca.h" 20849610Sdonn cdev_decl(dca); 20949610Sdonn 21041475Smckusick #include "ite.h" 21149610Sdonn cdev_decl(ite); 21249610Sdonn /* open, close, read, write, ioctl, tty -- XXX should be a tty! */ 213*49623Skarels #define cdev_ite_init(c,n) { \ 214*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 215*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 216*49623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 217*49623Skarels (dev_type_map((*))) enodev, 0 } 21841475Smckusick 21949610Sdonn /* XXX shouldn't this be optional? */ 22049610Sdonn cdev_decl(hil); 22149610Sdonn /* open, close, read, ioctl, select, map -- XXX should be a map device */ 222*49623Skarels #define cdev_hil_init(c,n) { \ 223*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 224*49623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 225*49623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 226*49623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 22741475Smckusick 22841475Smckusick #include "dcm.h" 22949610Sdonn cdev_decl(dcm); 23041475Smckusick 23149610Sdonn cdev_decl(cd); 23249610Sdonn 23341475Smckusick #include "clock.h" 23449610Sdonn cdev_decl(clock); 23549610Sdonn /* open, close, ioctl, map -- XXX should be a map device */ 236*49623Skarels #define cdev_clock_init(c,n) { \ 237*49623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 238*49623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 239*49623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 240*49623Skarels (dev_type_select((*))) nullop, dev_init(c,n,map), 0 } 24141475Smckusick 24249610Sdonn cdev_decl(vn); 24349610Sdonn /* open, read, write, ioctl -- XXX should be a disk */ 244*49623Skarels #define cdev_vn_init(c,n) { \ 245*49623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 246*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 247*49623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 248*49623Skarels 0 } 24947583Smccanne 25049610Sdonn dev_type_open(fdopen); 25149610Sdonn /* open */ 252*49623Skarels #define cdev_fd_init(c,n) { \ 253*49623Skarels dev_init(c,n,open), (dev_type_close((*))) enodev, \ 254*49623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 255*49623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 256*49623Skarels (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 257*49623Skarels (dev_type_map((*))) enodev, 0 } 25841475Smckusick 25949610Sdonn #include "bpfilter.h" 26049610Sdonn cdev_decl(bpf); 26149610Sdonn /* open, close, read, write, ioctl, select -- XXX should be generic device */ 262*49623Skarels #define cdev_bpf_init(c,n) { \ 263*49623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 264*49623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 265*49623Skarels (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 266*49623Skarels (dev_type_map((*))) enodev, 0 } 26747581Skarels 26841475Smckusick struct cdevsw cdevsw[] = 26941475Smckusick { 27049610Sdonn cdev_cn_init(1,cn), /* 0: virtual console */ 27149610Sdonn cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 27249610Sdonn cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 27349610Sdonn cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 27449610Sdonn cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 27549610Sdonn cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 27649610Sdonn cdev_log_init(1,log), /* 6: /dev/klog */ 27749610Sdonn cdev_tape_init(NCT,ct), /* 7: cs80 cartridge tape */ 27849610Sdonn cdev_disk_init(NSD,sd), /* 8: scsi disk */ 27949610Sdonn cdev_disk_init(NSD,rd), /* 9: hpib disk */ 28049610Sdonn cdev_grf_init(1,grf), /* 10: frame buffer */ 28149610Sdonn cdev_ppi_init(NPPI,ppi), /* 11: printer/plotter interface */ 28249610Sdonn cdev_tty_init(NDCA,dca), /* 12: built-in single-port serial */ 28349610Sdonn cdev_ite_init(NITE,ite), /* 13: console terminal emulator */ 28449610Sdonn cdev_hil_init(1,hil), /* 14: human interface loop */ 28549610Sdonn cdev_tty_init(NDCM,dcm), /* 15: 4-port serial */ 28649610Sdonn cdev_notdef(), /* 16 */ 28749610Sdonn cdev_disk_init(NCD,cd), /* 17: concatenated disk */ 28849610Sdonn cdev_clock_init(NCLOCK,clock), /* 18: mapped clock */ 28949610Sdonn cdev_vn_init(NVN,vn), /* 19: vnode disk */ 29049610Sdonn cdev_notdef(), /* 20 */ 29149610Sdonn cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 29249610Sdonn cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 29341475Smckusick }; 29449610Sdonn 29541475Smckusick int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 29641475Smckusick 29741475Smckusick int mem_no = 2; /* major device number of memory special file */ 29841475Smckusick 29941475Smckusick /* 30041475Smckusick * Swapdev is a fake device implemented 30141475Smckusick * in sw.c used only internally to get to swstrategy. 30241475Smckusick * It cannot be provided to the users, because the 30341475Smckusick * swstrategy routine munches the b_dev and b_blkno entries 30441475Smckusick * before calling the appropriate driver. This would horribly 30541475Smckusick * confuse, e.g. the hashing routines. Instead, /dev/drum is 30641475Smckusick * provided as a character (raw) device. 30741475Smckusick */ 30841475Smckusick dev_t swapdev = makedev(3, 0); 309