149610Sdonn /*- 249610Sdonn * Copyright (c) 1991 The Regents of the University of California. 341475Smckusick * All rights reserved. 441475Smckusick * 541475Smckusick * %sccs.include.redist.c% 641475Smckusick * 7*57336Shibler * @(#)conf.c 7.15 (Berkeley) 12/27/92 841475Smckusick */ 941475Smckusick 1056508Sbostic #include <sys/param.h> 1156508Sbostic #include <sys/systm.h> 1256508Sbostic #include <sys/buf.h> 1356508Sbostic #include <sys/ioctl.h> 1456508Sbostic #include <sys/proc.h> 1556508Sbostic #include <sys/tty.h> 1656508Sbostic #include <sys/conf.h> 1741475Smckusick 1849623Skarels int rawread __P((dev_t, struct uio *, int)); 1949623Skarels int rawwrite __P((dev_t, struct uio *, int)); 2049623Skarels int swstrategy __P((struct buf *)); 2149623Skarels int ttselect __P((dev_t, int, struct proc *)); 2241475Smckusick 2349623Skarels #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 2449623Skarels #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 2549623Skarels #define dev_type_strategy(n) int n __P((struct buf *)) 2649623Skarels #define dev_type_ioctl(n) \ 2749623Skarels int n __P((dev_t, int, caddr_t, int, struct proc *)) 2849610Sdonn 2949610Sdonn /* bdevsw-specific types */ 3052520Smckusick #define dev_type_dump(n) int n __P(()) 3149623Skarels #define dev_type_size(n) int n __P((dev_t)) 3249610Sdonn 3349623Skarels #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t)) 3449610Sdonn #define dev_init(c,n,t) \ 3549623Skarels (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 3649610Sdonn 3749610Sdonn /* bdevsw-specific initializations */ 3849623Skarels #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0) 3949610Sdonn 4049623Skarels #define bdev_decl(n) \ 4149623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 4249623Skarels dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 4349610Sdonn 44*57336Shibler /* disk without close routine */ 4549623Skarels #define bdev_disk_init(c,n) { \ 4649623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, \ 4749623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 4849623Skarels dev_init(c,n,dump), dev_size_init(c,n), 0 } 4949610Sdonn 50*57336Shibler /* disk with close routine */ 51*57336Shibler #define bdev_ldisk_init(c,n) { \ 52*57336Shibler dev_init(c,n,open), dev_init(c,n,close), \ 53*57336Shibler dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 54*57336Shibler dev_init(c,n,dump), dev_size_init(c,n), 0 } 55*57336Shibler 5649623Skarels #define bdev_tape_init(c,n) { \ 5749623Skarels dev_init(c,n,open), dev_init(c,n,close), \ 5849623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 5949623Skarels dev_init(c,n,dump), 0, B_TAPE } 6049610Sdonn 6149623Skarels #define bdev_swap_init() { \ 6249623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 6349623Skarels swstrategy, (dev_type_ioctl((*))) enodev, \ 6449623Skarels (dev_type_dump((*))) enodev, 0, 0 } 6549610Sdonn 6649623Skarels #define bdev_notdef() bdev_tape_init(0,no) 6749610Sdonn bdev_decl(no); /* dummy declarations */ 6849610Sdonn 6941475Smckusick #include "ct.h" 7049912Smckusick #include "st.h" 7141475Smckusick #include "rd.h" 7241475Smckusick #include "sd.h" 7341475Smckusick #include "cd.h" 7449328Shibler #include "vn.h" 7549610Sdonn 7649610Sdonn bdev_decl(ct); 7749912Smckusick bdev_decl(st); 7849610Sdonn bdev_decl(rd); 7949610Sdonn bdev_decl(sd); 8049610Sdonn bdev_decl(cd); 8149610Sdonn bdev_decl(vn); 8249610Sdonn 8341475Smckusick struct bdevsw bdevsw[] = 8441475Smckusick { 8549610Sdonn bdev_tape_init(NCT,ct), /* 0: cs80 cartridge tape */ 8649610Sdonn bdev_notdef(), /* 1 */ 87*57336Shibler bdev_ldisk_init(NRD,rd),/* 2: hpib disk */ 8849610Sdonn bdev_swap_init(), /* 3: swap pseudo-device */ 89*57336Shibler bdev_ldisk_init(NSD,sd),/* 4: scsi disk */ 9049610Sdonn bdev_disk_init(NCD,cd), /* 5: concatenated disk driver */ 9149610Sdonn bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 9249912Smckusick bdev_tape_init(NST,st), /* 7: exabyte tape */ 9341475Smckusick }; 9449610Sdonn 9541475Smckusick int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 9641475Smckusick 9749610Sdonn /* cdevsw-specific types */ 9849623Skarels #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 9949623Skarels #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 10049623Skarels #define dev_type_stop(n) int n __P((struct tty *, int)) 10149623Skarels #define dev_type_reset(n) int n __P((int)) 10249610Sdonn #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 10349610Sdonn #define dev_type_map(n) int n __P(()) 10441475Smckusick 10549623Skarels #define cdev_decl(n) \ 10649623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 10749623Skarels dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 10849623Skarels dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 10949623Skarels dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 11041475Smckusick 11149610Sdonn #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 11241475Smckusick 11349610Sdonn /* open, read, write, ioctl, strategy */ 11449623Skarels #define cdev_disk_init(c,n) { \ 11549623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 11649623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 11749623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 11849623Skarels dev_init(c,n,strategy) } 11949610Sdonn 12049610Sdonn /* open, close, read, write, ioctl, strategy */ 121*57336Shibler #define cdev_ldisk_init(c,n) { \ 122*57336Shibler dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 123*57336Shibler dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 124*57336Shibler (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 125*57336Shibler dev_init(c,n,strategy) } 126*57336Shibler 127*57336Shibler /* open, close, read, write, ioctl, strategy */ 12849623Skarels #define cdev_tape_init(c,n) { \ 12949623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 13049623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 13149623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 13249623Skarels dev_init(c,n,strategy) } 13349610Sdonn 13449610Sdonn /* open, close, read, write, ioctl, stop, tty */ 13549623Skarels #define cdev_tty_init(c,n) { \ 13649623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 13749623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 13849623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 13949623Skarels (dev_type_map((*))) enodev, 0 } 14049610Sdonn 14149623Skarels #define cdev_notdef() { \ 14249623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 14349623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 14449623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 14549623Skarels (dev_type_reset((*))) nullop, 0, seltrue, \ 14649623Skarels (dev_type_map((*))) enodev, 0 } 14749610Sdonn 14849610Sdonn cdev_decl(no); /* dummy declarations */ 14949610Sdonn 15049610Sdonn cdev_decl(cn); 15149610Sdonn /* open, close, read, write, ioctl, select -- XXX should be a tty */ 15249623Skarels #define cdev_cn_init(c,n) { \ 15349623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 15449623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 15549623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 15649623Skarels (dev_type_map((*))) enodev, 0 } 15749610Sdonn 15849610Sdonn cdev_decl(ctty); 15949610Sdonn /* open, read, write, ioctl, select -- XXX should be a tty */ 16049623Skarels #define cdev_ctty_init(c,n) { \ 16149623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 16249623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 16349623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 16449623Skarels (dev_type_map((*))) enodev, 0 } 16549610Sdonn 16649610Sdonn dev_type_read(mmrw); 16749610Sdonn /* read/write */ 16849623Skarels #define cdev_mm_init(c,n) { \ 16949623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 17049623Skarels mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 17149623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 17249610Sdonn 17349610Sdonn /* read, write, strategy */ 17449623Skarels #define cdev_swap_init(c,n) { \ 17549623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 17649623Skarels rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 17749623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 17849623Skarels (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 17949610Sdonn 18041475Smckusick #include "pty.h" 18149610Sdonn #define pts_tty pt_tty 18249610Sdonn #define ptsioctl ptyioctl 18349610Sdonn cdev_decl(pts); 18449610Sdonn #define ptc_tty pt_tty 18549610Sdonn #define ptcioctl ptyioctl 18649610Sdonn cdev_decl(ptc); 18741475Smckusick 18849610Sdonn /* open, close, read, write, ioctl, tty, select */ 18949623Skarels #define cdev_ptc_init(c,n) { \ 19049623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 19149623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 19249623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 19349623Skarels (dev_type_map((*))) enodev, 0 } 19449610Sdonn 19549610Sdonn cdev_decl(log); 19649610Sdonn /* open, close, read, ioctl, select -- XXX should be a generic device */ 19749623Skarels #define cdev_log_init(c,n) { \ 19849623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 19949623Skarels (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 20049623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 20149623Skarels dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 20249610Sdonn 20349610Sdonn cdev_decl(ct); 20449912Smckusick cdev_decl(st); 20549610Sdonn cdev_decl(sd); 20649610Sdonn cdev_decl(rd); 20749610Sdonn 20853933Shibler #include "grf.h" 20949610Sdonn cdev_decl(grf); 21049610Sdonn /* open, close, ioctl, select, map -- XXX should be a map device */ 21149623Skarels #define cdev_grf_init(c,n) { \ 21249623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 21349623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 21449623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 21549623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 21649610Sdonn 21741475Smckusick #include "ppi.h" 21849610Sdonn cdev_decl(ppi); 21949610Sdonn /* open, close, read, write, ioctl -- XXX should be a generic device */ 22049623Skarels #define cdev_ppi_init(c,n) { \ 22149623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 22249623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 22349623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 22449623Skarels (dev_type_map((*))) enodev, 0 } 22541475Smckusick 22649610Sdonn #include "dca.h" 22749610Sdonn cdev_decl(dca); 22849610Sdonn 22941475Smckusick #include "ite.h" 23049610Sdonn cdev_decl(ite); 23149610Sdonn /* open, close, read, write, ioctl, tty -- XXX should be a tty! */ 23249623Skarels #define cdev_ite_init(c,n) { \ 23349623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 23449623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 23549623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 23649623Skarels (dev_type_map((*))) enodev, 0 } 23741475Smckusick 23849610Sdonn /* XXX shouldn't this be optional? */ 23949610Sdonn cdev_decl(hil); 24049610Sdonn /* open, close, read, ioctl, select, map -- XXX should be a map device */ 24149623Skarels #define cdev_hil_init(c,n) { \ 24249623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 24349623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 24449623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 24549623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 24641475Smckusick 24741475Smckusick #include "dcm.h" 24849610Sdonn cdev_decl(dcm); 24941475Smckusick 25049610Sdonn cdev_decl(cd); 25149610Sdonn 25249610Sdonn cdev_decl(vn); 25349610Sdonn /* open, read, write, ioctl -- XXX should be a disk */ 25449623Skarels #define cdev_vn_init(c,n) { \ 25549623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 25649623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 25749623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 25849623Skarels 0 } 25947583Smccanne 26049610Sdonn dev_type_open(fdopen); 26149610Sdonn /* open */ 26249623Skarels #define cdev_fd_init(c,n) { \ 26349623Skarels dev_init(c,n,open), (dev_type_close((*))) enodev, \ 26449623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 26549623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 26649623Skarels (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 26749623Skarels (dev_type_map((*))) enodev, 0 } 26841475Smckusick 26949610Sdonn #include "bpfilter.h" 27049610Sdonn cdev_decl(bpf); 27149610Sdonn /* open, close, read, write, ioctl, select -- XXX should be generic device */ 27249623Skarels #define cdev_bpf_init(c,n) { \ 27349623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 27449623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 27549623Skarels (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 27649623Skarels (dev_type_map((*))) enodev, 0 } 27747581Skarels 27841475Smckusick struct cdevsw cdevsw[] = 27941475Smckusick { 28049610Sdonn cdev_cn_init(1,cn), /* 0: virtual console */ 28149610Sdonn cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 28249610Sdonn cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 28349610Sdonn cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 28449610Sdonn cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 28549610Sdonn cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 28649610Sdonn cdev_log_init(1,log), /* 6: /dev/klog */ 28749610Sdonn cdev_tape_init(NCT,ct), /* 7: cs80 cartridge tape */ 288*57336Shibler cdev_ldisk_init(NSD,sd), /* 8: scsi disk */ 289*57336Shibler cdev_ldisk_init(NRD,rd), /* 9: hpib disk */ 29053933Shibler cdev_grf_init(NGRF,grf), /* 10: frame buffer */ 29149610Sdonn cdev_ppi_init(NPPI,ppi), /* 11: printer/plotter interface */ 29249610Sdonn cdev_tty_init(NDCA,dca), /* 12: built-in single-port serial */ 29349610Sdonn cdev_ite_init(NITE,ite), /* 13: console terminal emulator */ 29449610Sdonn cdev_hil_init(1,hil), /* 14: human interface loop */ 29549610Sdonn cdev_tty_init(NDCM,dcm), /* 15: 4-port serial */ 29649610Sdonn cdev_notdef(), /* 16 */ 29749610Sdonn cdev_disk_init(NCD,cd), /* 17: concatenated disk */ 29854866Smckusick cdev_notdef(), /* 18 */ 29949610Sdonn cdev_vn_init(NVN,vn), /* 19: vnode disk */ 30049912Smckusick cdev_tape_init(NST,st), /* 20: exabyte tape */ 30149610Sdonn cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 30249610Sdonn cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 30341475Smckusick }; 30449610Sdonn 30541475Smckusick int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 30641475Smckusick 30741475Smckusick int mem_no = 2; /* major device number of memory special file */ 30841475Smckusick 30941475Smckusick /* 31041475Smckusick * Swapdev is a fake device implemented 31141475Smckusick * in sw.c used only internally to get to swstrategy. 31241475Smckusick * It cannot be provided to the users, because the 31341475Smckusick * swstrategy routine munches the b_dev and b_blkno entries 31441475Smckusick * before calling the appropriate driver. This would horribly 31541475Smckusick * confuse, e.g. the hashing routines. Instead, /dev/drum is 31641475Smckusick * provided as a character (raw) device. 31741475Smckusick */ 31841475Smckusick dev_t swapdev = makedev(3, 0); 319