149610Sdonn /*- 249610Sdonn * Copyright (c) 1991 The Regents of the University of California. 341475Smckusick * All rights reserved. 441475Smckusick * 541475Smckusick * %sccs.include.redist.c% 641475Smckusick * 7*49912Smckusick * @(#)conf.c 7.9 (Berkeley) 05/28/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 1749623Skarels int rawread __P((dev_t, struct uio *, int)); 1849623Skarels int rawwrite __P((dev_t, struct uio *, int)); 1949623Skarels int swstrategy __P((struct buf *)); 2049623Skarels int ttselect __P((dev_t, int, struct proc *)); 2141475Smckusick 2249623Skarels #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 2349623Skarels #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 2449623Skarels #define dev_type_strategy(n) int n __P((struct buf *)) 2549623Skarels #define dev_type_ioctl(n) \ 2649623Skarels int n __P((dev_t, int, caddr_t, int, struct proc *)) 2749610Sdonn 2849610Sdonn /* bdevsw-specific types */ 2949623Skarels #define dev_type_dump(n) int n __P((dev_t)) 3049623Skarels #define dev_type_size(n) int n __P((dev_t)) 3149610Sdonn 3249623Skarels #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t)) 3349610Sdonn #define dev_init(c,n,t) \ 3449623Skarels (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 3549610Sdonn 3649610Sdonn /* bdevsw-specific initializations */ 3749623Skarels #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0) 3849610Sdonn 3949623Skarels #define bdev_decl(n) \ 4049623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 4149623Skarels dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 4249610Sdonn 4349623Skarels #define bdev_disk_init(c,n) { \ 4449623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, \ 4549623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 4649623Skarels dev_init(c,n,dump), dev_size_init(c,n), 0 } 4749610Sdonn 4849623Skarels #define bdev_tape_init(c,n) { \ 4949623Skarels dev_init(c,n,open), dev_init(c,n,close), \ 5049623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 5149623Skarels dev_init(c,n,dump), 0, B_TAPE } 5249610Sdonn 5349623Skarels #define bdev_swap_init() { \ 5449623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 5549623Skarels swstrategy, (dev_type_ioctl((*))) enodev, \ 5649623Skarels (dev_type_dump((*))) enodev, 0, 0 } 5749610Sdonn 5849623Skarels #define bdev_notdef() bdev_tape_init(0,no) 5949610Sdonn bdev_decl(no); /* dummy declarations */ 6049610Sdonn 6141475Smckusick #include "ct.h" 62*49912Smckusick #include "st.h" 6341475Smckusick #include "rd.h" 6441475Smckusick #include "sd.h" 6541475Smckusick #include "cd.h" 6649328Shibler #include "vn.h" 6749610Sdonn 6849610Sdonn bdev_decl(ct); 69*49912Smckusick bdev_decl(st); 7049610Sdonn bdev_decl(rd); 7149610Sdonn bdev_decl(sd); 7249610Sdonn bdev_decl(cd); 7349610Sdonn bdev_decl(vn); 7449610Sdonn 7541475Smckusick struct bdevsw bdevsw[] = 7641475Smckusick { 7749610Sdonn bdev_tape_init(NCT,ct), /* 0: cs80 cartridge tape */ 7849610Sdonn bdev_notdef(), /* 1 */ 7949610Sdonn bdev_disk_init(NRD,rd), /* 2: hpib disk */ 8049610Sdonn bdev_swap_init(), /* 3: swap pseudo-device */ 8149610Sdonn bdev_disk_init(NSD,sd), /* 4: scsi disk */ 8249610Sdonn bdev_disk_init(NCD,cd), /* 5: concatenated disk driver */ 8349610Sdonn bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 84*49912Smckusick bdev_tape_init(NST,st), /* 7: exabyte tape */ 8541475Smckusick }; 8649610Sdonn 8741475Smckusick int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 8841475Smckusick 8949610Sdonn /* cdevsw-specific types */ 9049623Skarels #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 9149623Skarels #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 9249623Skarels #define dev_type_stop(n) int n __P((struct tty *, int)) 9349623Skarels #define dev_type_reset(n) int n __P((int)) 9449610Sdonn #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 9549610Sdonn #define dev_type_map(n) int n __P(()) 9641475Smckusick 9749623Skarels #define cdev_decl(n) \ 9849623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 9949623Skarels dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 10049623Skarels dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 10149623Skarels dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 10241475Smckusick 10349610Sdonn #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 10441475Smckusick 10549610Sdonn /* open, read, write, ioctl, strategy */ 10649623Skarels #define cdev_disk_init(c,n) { \ 10749623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 10849623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 10949623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 11049623Skarels dev_init(c,n,strategy) } 11149610Sdonn 11249610Sdonn /* open, close, read, write, ioctl, strategy */ 11349623Skarels #define cdev_tape_init(c,n) { \ 11449623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 11549623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 11649623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 11749623Skarels dev_init(c,n,strategy) } 11849610Sdonn 11949610Sdonn /* open, close, read, write, ioctl, stop, tty */ 12049623Skarels #define cdev_tty_init(c,n) { \ 12149623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 12249623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 12349623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 12449623Skarels (dev_type_map((*))) enodev, 0 } 12549610Sdonn 12649623Skarels #define cdev_notdef() { \ 12749623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 12849623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 12949623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 13049623Skarels (dev_type_reset((*))) nullop, 0, seltrue, \ 13149623Skarels (dev_type_map((*))) enodev, 0 } 13249610Sdonn 13349610Sdonn cdev_decl(no); /* dummy declarations */ 13449610Sdonn 13549610Sdonn cdev_decl(cn); 13649610Sdonn /* open, close, read, write, ioctl, select -- XXX should be a tty */ 13749623Skarels #define cdev_cn_init(c,n) { \ 13849623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 13949623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 14049623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 14149623Skarels (dev_type_map((*))) enodev, 0 } 14249610Sdonn 14349610Sdonn cdev_decl(ctty); 14449610Sdonn /* open, read, write, ioctl, select -- XXX should be a tty */ 14549623Skarels #define cdev_ctty_init(c,n) { \ 14649623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 14749623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 14849623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 14949623Skarels (dev_type_map((*))) enodev, 0 } 15049610Sdonn 15149610Sdonn dev_type_read(mmrw); 15249610Sdonn /* read/write */ 15349623Skarels #define cdev_mm_init(c,n) { \ 15449623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 15549623Skarels mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 15649623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 15749610Sdonn 15849610Sdonn /* read, write, strategy */ 15949623Skarels #define cdev_swap_init(c,n) { \ 16049623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 16149623Skarels rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 16249623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 16349623Skarels (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 16449610Sdonn 16541475Smckusick #include "pty.h" 16649610Sdonn #define pts_tty pt_tty 16749610Sdonn #define ptsioctl ptyioctl 16849610Sdonn cdev_decl(pts); 16949610Sdonn #define ptc_tty pt_tty 17049610Sdonn #define ptcioctl ptyioctl 17149610Sdonn cdev_decl(ptc); 17241475Smckusick 17349610Sdonn /* open, close, read, write, ioctl, tty, select */ 17449623Skarels #define cdev_ptc_init(c,n) { \ 17549623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 17649623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 17749623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 17849623Skarels (dev_type_map((*))) enodev, 0 } 17949610Sdonn 18049610Sdonn cdev_decl(log); 18149610Sdonn /* open, close, read, ioctl, select -- XXX should be a generic device */ 18249623Skarels #define cdev_log_init(c,n) { \ 18349623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 18449623Skarels (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 18549623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 18649623Skarels dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 18749610Sdonn 18849610Sdonn cdev_decl(ct); 189*49912Smckusick cdev_decl(st); 19049610Sdonn cdev_decl(sd); 19149610Sdonn cdev_decl(rd); 19249610Sdonn 19349610Sdonn /* XXX shouldn't this be optional? */ 19449610Sdonn cdev_decl(grf); 19549610Sdonn /* open, close, ioctl, select, map -- XXX should be a map device */ 19649623Skarels #define cdev_grf_init(c,n) { \ 19749623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 19849623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 19949623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 20049623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 20149610Sdonn 20241475Smckusick #include "ppi.h" 20349610Sdonn cdev_decl(ppi); 20449610Sdonn /* open, close, read, write, ioctl -- XXX should be a generic device */ 20549623Skarels #define cdev_ppi_init(c,n) { \ 20649623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 20749623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 20849623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 20949623Skarels (dev_type_map((*))) enodev, 0 } 21041475Smckusick 21149610Sdonn #include "dca.h" 21249610Sdonn cdev_decl(dca); 21349610Sdonn 21441475Smckusick #include "ite.h" 21549610Sdonn cdev_decl(ite); 21649610Sdonn /* open, close, read, write, ioctl, tty -- XXX should be a tty! */ 21749623Skarels #define cdev_ite_init(c,n) { \ 21849623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 21949623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 22049623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 22149623Skarels (dev_type_map((*))) enodev, 0 } 22241475Smckusick 22349610Sdonn /* XXX shouldn't this be optional? */ 22449610Sdonn cdev_decl(hil); 22549610Sdonn /* open, close, read, ioctl, select, map -- XXX should be a map device */ 22649623Skarels #define cdev_hil_init(c,n) { \ 22749623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 22849623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 22949623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 23049623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 23141475Smckusick 23241475Smckusick #include "dcm.h" 23349610Sdonn cdev_decl(dcm); 23441475Smckusick 23549610Sdonn cdev_decl(cd); 23649610Sdonn 23741475Smckusick #include "clock.h" 23849610Sdonn cdev_decl(clock); 23949610Sdonn /* open, close, ioctl, map -- XXX should be a map device */ 24049623Skarels #define cdev_clock_init(c,n) { \ 24149623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 24249623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 24349623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 24449623Skarels (dev_type_select((*))) nullop, dev_init(c,n,map), 0 } 24541475Smckusick 24649610Sdonn cdev_decl(vn); 24749610Sdonn /* open, read, write, ioctl -- XXX should be a disk */ 24849623Skarels #define cdev_vn_init(c,n) { \ 24949623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 25049623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 25149623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 25249623Skarels 0 } 25347583Smccanne 25449610Sdonn dev_type_open(fdopen); 25549610Sdonn /* open */ 25649623Skarels #define cdev_fd_init(c,n) { \ 25749623Skarels dev_init(c,n,open), (dev_type_close((*))) enodev, \ 25849623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 25949623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 26049623Skarels (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 26149623Skarels (dev_type_map((*))) enodev, 0 } 26241475Smckusick 26349610Sdonn #include "bpfilter.h" 26449610Sdonn cdev_decl(bpf); 26549610Sdonn /* open, close, read, write, ioctl, select -- XXX should be generic device */ 26649623Skarels #define cdev_bpf_init(c,n) { \ 26749623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 26849623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 26949623Skarels (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 27049623Skarels (dev_type_map((*))) enodev, 0 } 27147581Skarels 27241475Smckusick struct cdevsw cdevsw[] = 27341475Smckusick { 27449610Sdonn cdev_cn_init(1,cn), /* 0: virtual console */ 27549610Sdonn cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 27649610Sdonn cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 27749610Sdonn cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 27849610Sdonn cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 27949610Sdonn cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 28049610Sdonn cdev_log_init(1,log), /* 6: /dev/klog */ 28149610Sdonn cdev_tape_init(NCT,ct), /* 7: cs80 cartridge tape */ 28249610Sdonn cdev_disk_init(NSD,sd), /* 8: scsi disk */ 28349610Sdonn cdev_disk_init(NSD,rd), /* 9: hpib disk */ 28449610Sdonn cdev_grf_init(1,grf), /* 10: frame buffer */ 28549610Sdonn cdev_ppi_init(NPPI,ppi), /* 11: printer/plotter interface */ 28649610Sdonn cdev_tty_init(NDCA,dca), /* 12: built-in single-port serial */ 28749610Sdonn cdev_ite_init(NITE,ite), /* 13: console terminal emulator */ 28849610Sdonn cdev_hil_init(1,hil), /* 14: human interface loop */ 28949610Sdonn cdev_tty_init(NDCM,dcm), /* 15: 4-port serial */ 29049610Sdonn cdev_notdef(), /* 16 */ 29149610Sdonn cdev_disk_init(NCD,cd), /* 17: concatenated disk */ 29249610Sdonn cdev_clock_init(NCLOCK,clock), /* 18: mapped clock */ 29349610Sdonn cdev_vn_init(NVN,vn), /* 19: vnode disk */ 294*49912Smckusick cdev_tape_init(NST,st), /* 20: exabyte tape */ 29549610Sdonn cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 29649610Sdonn cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 29741475Smckusick }; 29849610Sdonn 29941475Smckusick int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 30041475Smckusick 30141475Smckusick int mem_no = 2; /* major device number of memory special file */ 30241475Smckusick 30341475Smckusick /* 30441475Smckusick * Swapdev is a fake device implemented 30541475Smckusick * in sw.c used only internally to get to swstrategy. 30641475Smckusick * It cannot be provided to the users, because the 30741475Smckusick * swstrategy routine munches the b_dev and b_blkno entries 30841475Smckusick * before calling the appropriate driver. This would horribly 30941475Smckusick * confuse, e.g. the hashing routines. Instead, /dev/drum is 31041475Smckusick * provided as a character (raw) device. 31141475Smckusick */ 31241475Smckusick dev_t swapdev = makedev(3, 0); 313