149610Sdonn /*- 249610Sdonn * Copyright (c) 1991 The Regents of the University of California. 341475Smckusick * All rights reserved. 441475Smckusick * 541475Smckusick * %sccs.include.redist.c% 641475Smckusick * 7*59487Smckusick * @(#)conf.c 7.16 (Berkeley) 04/28/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> 15*59487Smckusick #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); 320*59487Smckusick 321*59487Smckusick /* 322*59487Smckusick * Routine that identifies /dev/mem and /dev/kmem. 323*59487Smckusick * 324*59487Smckusick * A minimal stub routine can always return 0. 325*59487Smckusick */ 326*59487Smckusick iskmemdev(dev) 327*59487Smckusick dev_t dev; 328*59487Smckusick { 329*59487Smckusick 330*59487Smckusick if (major(dev) == 2 && (minor(dev) == 0 || minor(dev) == 1)) 331*59487Smckusick return (1); 332*59487Smckusick return (0); 333*59487Smckusick } 334*59487Smckusick 335*59487Smckusick /* 336*59487Smckusick * Routine to determine if a device is a disk. 337*59487Smckusick * 338*59487Smckusick * A minimal stub routine can always return 0. 339*59487Smckusick */ 340*59487Smckusick isdisk(dev, type) 341*59487Smckusick dev_t dev; 342*59487Smckusick int type; 343*59487Smckusick { 344*59487Smckusick 345*59487Smckusick switch (major(dev)) { 346*59487Smckusick case 2: 347*59487Smckusick case 4: 348*59487Smckusick case 5: 349*59487Smckusick case 6: 350*59487Smckusick if (type == VBLK) 351*59487Smckusick return (1); 352*59487Smckusick return (0); 353*59487Smckusick case 8: 354*59487Smckusick case 9: 355*59487Smckusick case 17: 356*59487Smckusick case 19: 357*59487Smckusick if (type == VCHR) 358*59487Smckusick return (1); 359*59487Smckusick /* fall through */ 360*59487Smckusick default: 361*59487Smckusick return (0); 362*59487Smckusick } 363*59487Smckusick /* NOTREACHED */ 364*59487Smckusick } 365*59487Smckusick 366*59487Smckusick #define MAXDEV 21 367*59487Smckusick static int chrtoblktbl[MAXDEV] = { 368*59487Smckusick /* VCHR */ /* VBLK */ 369*59487Smckusick /* 0 */ NODEV, 370*59487Smckusick /* 1 */ NODEV, 371*59487Smckusick /* 2 */ NODEV, 372*59487Smckusick /* 3 */ NODEV, 373*59487Smckusick /* 4 */ NODEV, 374*59487Smckusick /* 5 */ NODEV, 375*59487Smckusick /* 6 */ NODEV, 376*59487Smckusick /* 7 */ 0, 377*59487Smckusick /* 8 */ 4, 378*59487Smckusick /* 9 */ 2, 379*59487Smckusick /* 10 */ NODEV, 380*59487Smckusick /* 11 */ NODEV, 381*59487Smckusick /* 12 */ NODEV, 382*59487Smckusick /* 13 */ NODEV, 383*59487Smckusick /* 14 */ NODEV, 384*59487Smckusick /* 15 */ NODEV, 385*59487Smckusick /* 16 */ NODEV, 386*59487Smckusick /* 17 */ 5, 387*59487Smckusick /* 18 */ NODEV, 388*59487Smckusick /* 19 */ 6, 389*59487Smckusick /* 20 */ 7, 390*59487Smckusick }; 391*59487Smckusick /* 392*59487Smckusick * Routine to convert from character to block device number. 393*59487Smckusick * 394*59487Smckusick * A minimal stub routine can always return NODEV. 395*59487Smckusick */ 396*59487Smckusick chrtoblk(dev) 397*59487Smckusick dev_t dev; 398*59487Smckusick { 399*59487Smckusick int blkmaj; 400*59487Smckusick 401*59487Smckusick if (major(dev) >= MAXDEV || (blkmaj = chrtoblktbl[major(dev)]) == NODEV) 402*59487Smckusick return (NODEV); 403*59487Smckusick return (makedev(blkmaj, minor(dev))); 404*59487Smckusick } 405