149610Sdonn /*- 2*63157Sbostic * Copyright (c) 1991, 1993 3*63157Sbostic * The Regents of the University of California. All rights reserved. 441475Smckusick * 541475Smckusick * %sccs.include.redist.c% 641475Smckusick * 7*63157Sbostic * @(#)conf.c 8.1 (Berkeley) 06/10/93 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> 1559487Smckusick #include <sys/vnode.h> 1656508Sbostic #include <sys/tty.h> 1756508Sbostic #include <sys/conf.h> 1841475Smckusick 1949623Skarels int rawread __P((dev_t, struct uio *, int)); 2049623Skarels int rawwrite __P((dev_t, struct uio *, int)); 2149623Skarels int swstrategy __P((struct buf *)); 2249623Skarels int ttselect __P((dev_t, int, struct proc *)); 2341475Smckusick 2449623Skarels #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *)) 2549623Skarels #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *)) 2649623Skarels #define dev_type_strategy(n) int n __P((struct buf *)) 2749623Skarels #define dev_type_ioctl(n) \ 2849623Skarels int n __P((dev_t, int, caddr_t, int, struct proc *)) 2949610Sdonn 3049610Sdonn /* bdevsw-specific types */ 3152520Smckusick #define dev_type_dump(n) int n __P(()) 3249623Skarels #define dev_type_size(n) int n __P((dev_t)) 3349610Sdonn 3449623Skarels #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t)) 3549610Sdonn #define dev_init(c,n,t) \ 3649623Skarels (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio) 3749610Sdonn 3849610Sdonn /* bdevsw-specific initializations */ 3949623Skarels #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0) 4049610Sdonn 4149623Skarels #define bdev_decl(n) \ 4249623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \ 4349623Skarels dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size) 4449610Sdonn 4557336Shibler /* disk without close routine */ 4649623Skarels #define bdev_disk_init(c,n) { \ 4749623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, \ 4849623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 4949623Skarels dev_init(c,n,dump), dev_size_init(c,n), 0 } 5049610Sdonn 5157336Shibler /* disk with close routine */ 5257336Shibler #define bdev_ldisk_init(c,n) { \ 5357336Shibler dev_init(c,n,open), dev_init(c,n,close), \ 5457336Shibler dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 5557336Shibler dev_init(c,n,dump), dev_size_init(c,n), 0 } 5657336Shibler 5749623Skarels #define bdev_tape_init(c,n) { \ 5849623Skarels dev_init(c,n,open), dev_init(c,n,close), \ 5949623Skarels dev_init(c,n,strategy), dev_init(c,n,ioctl), \ 6049623Skarels dev_init(c,n,dump), 0, B_TAPE } 6149610Sdonn 6249623Skarels #define bdev_swap_init() { \ 6349623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 6449623Skarels swstrategy, (dev_type_ioctl((*))) enodev, \ 6549623Skarels (dev_type_dump((*))) enodev, 0, 0 } 6649610Sdonn 6749623Skarels #define bdev_notdef() bdev_tape_init(0,no) 6849610Sdonn bdev_decl(no); /* dummy declarations */ 6949610Sdonn 7041475Smckusick #include "ct.h" 7149912Smckusick #include "st.h" 7241475Smckusick #include "rd.h" 7341475Smckusick #include "sd.h" 7441475Smckusick #include "cd.h" 7549328Shibler #include "vn.h" 7649610Sdonn 7749610Sdonn bdev_decl(ct); 7849912Smckusick bdev_decl(st); 7949610Sdonn bdev_decl(rd); 8049610Sdonn bdev_decl(sd); 8149610Sdonn bdev_decl(cd); 8249610Sdonn bdev_decl(vn); 8349610Sdonn 8441475Smckusick struct bdevsw bdevsw[] = 8541475Smckusick { 8649610Sdonn bdev_tape_init(NCT,ct), /* 0: cs80 cartridge tape */ 8749610Sdonn bdev_notdef(), /* 1 */ 8857336Shibler bdev_ldisk_init(NRD,rd),/* 2: hpib disk */ 8949610Sdonn bdev_swap_init(), /* 3: swap pseudo-device */ 9057336Shibler bdev_ldisk_init(NSD,sd),/* 4: scsi disk */ 9149610Sdonn bdev_disk_init(NCD,cd), /* 5: concatenated disk driver */ 9249610Sdonn bdev_disk_init(NVN,vn), /* 6: vnode disk driver (swap to files) */ 9349912Smckusick bdev_tape_init(NST,st), /* 7: exabyte tape */ 9441475Smckusick }; 9549610Sdonn 9641475Smckusick int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); 9741475Smckusick 9849610Sdonn /* cdevsw-specific types */ 9949623Skarels #define dev_type_read(n) int n __P((dev_t, struct uio *, int)) 10049623Skarels #define dev_type_write(n) int n __P((dev_t, struct uio *, int)) 10149623Skarels #define dev_type_stop(n) int n __P((struct tty *, int)) 10249623Skarels #define dev_type_reset(n) int n __P((int)) 10349610Sdonn #define dev_type_select(n) int n __P((dev_t, int, struct proc *)) 10449610Sdonn #define dev_type_map(n) int n __P(()) 10541475Smckusick 10649623Skarels #define cdev_decl(n) \ 10749623Skarels dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \ 10849623Skarels dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \ 10949623Skarels dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \ 11049623Skarels dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[] 11141475Smckusick 11249610Sdonn #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0) 11341475Smckusick 11449610Sdonn /* open, read, write, ioctl, strategy */ 11549623Skarels #define cdev_disk_init(c,n) { \ 11649623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 11749623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 11849623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 11949623Skarels dev_init(c,n,strategy) } 12049610Sdonn 12149610Sdonn /* open, close, read, write, ioctl, strategy */ 12257336Shibler #define cdev_ldisk_init(c,n) { \ 12357336Shibler dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 12457336Shibler dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 12557336Shibler (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 12657336Shibler dev_init(c,n,strategy) } 12757336Shibler 12857336Shibler /* open, close, read, write, ioctl, strategy */ 12949623Skarels #define cdev_tape_init(c,n) { \ 13049623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 13149623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 13249623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 13349623Skarels dev_init(c,n,strategy) } 13449610Sdonn 13549610Sdonn /* open, close, read, write, ioctl, stop, tty */ 13649623Skarels #define cdev_tty_init(c,n) { \ 13749623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 13849623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ 13949623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 14049623Skarels (dev_type_map((*))) enodev, 0 } 14149610Sdonn 14249623Skarels #define cdev_notdef() { \ 14349623Skarels (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \ 14449623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 14549623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 14649623Skarels (dev_type_reset((*))) nullop, 0, seltrue, \ 14749623Skarels (dev_type_map((*))) enodev, 0 } 14849610Sdonn 14949610Sdonn cdev_decl(no); /* dummy declarations */ 15049610Sdonn 15149610Sdonn cdev_decl(cn); 15249610Sdonn /* open, close, read, write, ioctl, select -- XXX should be a tty */ 15349623Skarels #define cdev_cn_init(c,n) { \ 15449623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 15549623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 15649623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 15749623Skarels (dev_type_map((*))) enodev, 0 } 15849610Sdonn 15949610Sdonn cdev_decl(ctty); 16049610Sdonn /* open, read, write, ioctl, select -- XXX should be a tty */ 16149623Skarels #define cdev_ctty_init(c,n) { \ 16249623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 16349623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 16449623Skarels (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \ 16549623Skarels (dev_type_map((*))) enodev, 0 } 16649610Sdonn 16749610Sdonn dev_type_read(mmrw); 16849610Sdonn /* read/write */ 16949623Skarels #define cdev_mm_init(c,n) { \ 17049623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \ 17149623Skarels mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \ 17249623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 } 17349610Sdonn 17449610Sdonn /* read, write, strategy */ 17549623Skarels #define cdev_swap_init(c,n) { \ 17649623Skarels (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \ 17749623Skarels rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 17849623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 17949623Skarels (dev_type_map((*))) enodev, dev_init(c,n,strategy) } 18049610Sdonn 18141475Smckusick #include "pty.h" 18249610Sdonn #define pts_tty pt_tty 18349610Sdonn #define ptsioctl ptyioctl 18449610Sdonn cdev_decl(pts); 18549610Sdonn #define ptc_tty pt_tty 18649610Sdonn #define ptcioctl ptyioctl 18749610Sdonn cdev_decl(ptc); 18841475Smckusick 18949610Sdonn /* open, close, read, write, ioctl, tty, select */ 19049623Skarels #define cdev_ptc_init(c,n) { \ 19149623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 19249623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \ 19349623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \ 19449623Skarels (dev_type_map((*))) enodev, 0 } 19549610Sdonn 19649610Sdonn cdev_decl(log); 19749610Sdonn /* open, close, read, ioctl, select -- XXX should be a generic device */ 19849623Skarels #define cdev_log_init(c,n) { \ 19949623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 20049623Skarels (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \ 20149623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 20249623Skarels dev_init(c,n,select), (dev_type_map((*))) enodev, 0 } 20349610Sdonn 20449610Sdonn cdev_decl(ct); 20549912Smckusick cdev_decl(st); 20649610Sdonn cdev_decl(sd); 20749610Sdonn cdev_decl(rd); 20849610Sdonn 20953933Shibler #include "grf.h" 21049610Sdonn cdev_decl(grf); 21149610Sdonn /* open, close, ioctl, select, map -- XXX should be a map device */ 21249623Skarels #define cdev_grf_init(c,n) { \ 21349623Skarels dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) nullop, \ 21449623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 21549623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 21649623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 21749610Sdonn 21841475Smckusick #include "ppi.h" 21949610Sdonn cdev_decl(ppi); 22049610Sdonn /* open, close, read, write, ioctl -- XXX should be a generic device */ 22149623Skarels #define cdev_ppi_init(c,n) { \ 22249623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 22349623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 22449623Skarels (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \ 22549623Skarels (dev_type_map((*))) enodev, 0 } 22641475Smckusick 22749610Sdonn #include "dca.h" 22849610Sdonn cdev_decl(dca); 22949610Sdonn 23041475Smckusick #include "ite.h" 23149610Sdonn cdev_decl(ite); 23249610Sdonn /* open, close, read, write, ioctl, tty -- XXX should be a tty! */ 23349623Skarels #define cdev_ite_init(c,n) { \ 23449623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 23549623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 23649623Skarels (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \ 23749623Skarels (dev_type_map((*))) enodev, 0 } 23841475Smckusick 23949610Sdonn /* XXX shouldn't this be optional? */ 24049610Sdonn cdev_decl(hil); 24149610Sdonn /* open, close, read, ioctl, select, map -- XXX should be a map device */ 24249623Skarels #define cdev_hil_init(c,n) { \ 24349623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 24449623Skarels (dev_type_write((*))) nullop, dev_init(c,n,ioctl), \ 24549623Skarels (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \ 24649623Skarels dev_init(c,n,select), dev_init(c,n,map), 0 } 24741475Smckusick 24841475Smckusick #include "dcm.h" 24949610Sdonn cdev_decl(dcm); 25041475Smckusick 25149610Sdonn cdev_decl(cd); 25249610Sdonn 25349610Sdonn cdev_decl(vn); 25449610Sdonn /* open, read, write, ioctl -- XXX should be a disk */ 25549623Skarels #define cdev_vn_init(c,n) { \ 25649623Skarels dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \ 25749623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 25849623Skarels (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \ 25949623Skarels 0 } 26047583Smccanne 26149610Sdonn dev_type_open(fdopen); 26249610Sdonn /* open */ 26349623Skarels #define cdev_fd_init(c,n) { \ 26449623Skarels dev_init(c,n,open), (dev_type_close((*))) enodev, \ 26549623Skarels (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \ 26649623Skarels (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \ 26749623Skarels (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \ 26849623Skarels (dev_type_map((*))) enodev, 0 } 26941475Smckusick 27049610Sdonn #include "bpfilter.h" 27149610Sdonn cdev_decl(bpf); 27249610Sdonn /* open, close, read, write, ioctl, select -- XXX should be generic device */ 27349623Skarels #define cdev_bpf_init(c,n) { \ 27449623Skarels dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ 27549623Skarels dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ 27649623Skarels (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \ 27749623Skarels (dev_type_map((*))) enodev, 0 } 27847581Skarels 27941475Smckusick struct cdevsw cdevsw[] = 28041475Smckusick { 28149610Sdonn cdev_cn_init(1,cn), /* 0: virtual console */ 28249610Sdonn cdev_ctty_init(1,ctty), /* 1: controlling terminal */ 28349610Sdonn cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */ 28449610Sdonn cdev_swap_init(1,sw), /* 3: /dev/drum (swap pseudo-device) */ 28549610Sdonn cdev_tty_init(NPTY,pts), /* 4: pseudo-tty slave */ 28649610Sdonn cdev_ptc_init(NPTY,ptc), /* 5: pseudo-tty master */ 28749610Sdonn cdev_log_init(1,log), /* 6: /dev/klog */ 28849610Sdonn cdev_tape_init(NCT,ct), /* 7: cs80 cartridge tape */ 28957336Shibler cdev_ldisk_init(NSD,sd), /* 8: scsi disk */ 29057336Shibler cdev_ldisk_init(NRD,rd), /* 9: hpib disk */ 29153933Shibler cdev_grf_init(NGRF,grf), /* 10: frame buffer */ 29249610Sdonn cdev_ppi_init(NPPI,ppi), /* 11: printer/plotter interface */ 29349610Sdonn cdev_tty_init(NDCA,dca), /* 12: built-in single-port serial */ 29449610Sdonn cdev_ite_init(NITE,ite), /* 13: console terminal emulator */ 29549610Sdonn cdev_hil_init(1,hil), /* 14: human interface loop */ 29649610Sdonn cdev_tty_init(NDCM,dcm), /* 15: 4-port serial */ 29749610Sdonn cdev_notdef(), /* 16 */ 29849610Sdonn cdev_disk_init(NCD,cd), /* 17: concatenated disk */ 29954866Smckusick cdev_notdef(), /* 18 */ 30049610Sdonn cdev_vn_init(NVN,vn), /* 19: vnode disk */ 30149912Smckusick cdev_tape_init(NST,st), /* 20: exabyte tape */ 30249610Sdonn cdev_fd_init(1,fd), /* 21: file descriptor pseudo-dev */ 30349610Sdonn cdev_bpf_init(NBPFILTER,bpf), /* 22: berkeley packet filter */ 30441475Smckusick }; 30549610Sdonn 30641475Smckusick int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); 30741475Smckusick 30841475Smckusick int mem_no = 2; /* major device number of memory special file */ 30941475Smckusick 31041475Smckusick /* 31141475Smckusick * Swapdev is a fake device implemented 31241475Smckusick * in sw.c used only internally to get to swstrategy. 31341475Smckusick * It cannot be provided to the users, because the 31441475Smckusick * swstrategy routine munches the b_dev and b_blkno entries 31541475Smckusick * before calling the appropriate driver. This would horribly 31641475Smckusick * confuse, e.g. the hashing routines. Instead, /dev/drum is 31741475Smckusick * provided as a character (raw) device. 31841475Smckusick */ 31941475Smckusick dev_t swapdev = makedev(3, 0); 32059487Smckusick 32159487Smckusick /* 32259487Smckusick * Routine that identifies /dev/mem and /dev/kmem. 32359487Smckusick * 32459487Smckusick * A minimal stub routine can always return 0. 32559487Smckusick */ 32659487Smckusick iskmemdev(dev) 32759487Smckusick dev_t dev; 32859487Smckusick { 32959487Smckusick 33059487Smckusick if (major(dev) == 2 && (minor(dev) == 0 || minor(dev) == 1)) 33159487Smckusick return (1); 33259487Smckusick return (0); 33359487Smckusick } 33459487Smckusick 33559487Smckusick /* 33659487Smckusick * Routine to determine if a device is a disk. 33759487Smckusick * 33859487Smckusick * A minimal stub routine can always return 0. 33959487Smckusick */ 34059487Smckusick isdisk(dev, type) 34159487Smckusick dev_t dev; 34259487Smckusick int type; 34359487Smckusick { 34459487Smckusick 34559487Smckusick switch (major(dev)) { 34659487Smckusick case 2: 34759487Smckusick case 4: 34859487Smckusick case 5: 34959487Smckusick case 6: 35059487Smckusick if (type == VBLK) 35159487Smckusick return (1); 35259487Smckusick return (0); 35359487Smckusick case 8: 35459487Smckusick case 9: 35559487Smckusick case 17: 35659487Smckusick case 19: 35759487Smckusick if (type == VCHR) 35859487Smckusick return (1); 35959487Smckusick /* fall through */ 36059487Smckusick default: 36159487Smckusick return (0); 36259487Smckusick } 36359487Smckusick /* NOTREACHED */ 36459487Smckusick } 36559487Smckusick 36659487Smckusick #define MAXDEV 21 36759487Smckusick static int chrtoblktbl[MAXDEV] = { 36859487Smckusick /* VCHR */ /* VBLK */ 36959487Smckusick /* 0 */ NODEV, 37059487Smckusick /* 1 */ NODEV, 37159487Smckusick /* 2 */ NODEV, 37259487Smckusick /* 3 */ NODEV, 37359487Smckusick /* 4 */ NODEV, 37459487Smckusick /* 5 */ NODEV, 37559487Smckusick /* 6 */ NODEV, 37659487Smckusick /* 7 */ 0, 37759487Smckusick /* 8 */ 4, 37859487Smckusick /* 9 */ 2, 37959487Smckusick /* 10 */ NODEV, 38059487Smckusick /* 11 */ NODEV, 38159487Smckusick /* 12 */ NODEV, 38259487Smckusick /* 13 */ NODEV, 38359487Smckusick /* 14 */ NODEV, 38459487Smckusick /* 15 */ NODEV, 38559487Smckusick /* 16 */ NODEV, 38659487Smckusick /* 17 */ 5, 38759487Smckusick /* 18 */ NODEV, 38859487Smckusick /* 19 */ 6, 38959487Smckusick /* 20 */ 7, 39059487Smckusick }; 39159487Smckusick /* 39259487Smckusick * Routine to convert from character to block device number. 39359487Smckusick * 39459487Smckusick * A minimal stub routine can always return NODEV. 39559487Smckusick */ 39659487Smckusick chrtoblk(dev) 39759487Smckusick dev_t dev; 39859487Smckusick { 39959487Smckusick int blkmaj; 40059487Smckusick 40159487Smckusick if (major(dev) >= MAXDEV || (blkmaj = chrtoblktbl[major(dev)]) == NODEV) 40259487Smckusick return (NODEV); 40359487Smckusick return (makedev(blkmaj, minor(dev))); 40459487Smckusick } 405