153903Smckusick /*
263309Sbostic * Copyright (c) 1992, 1993
363309Sbostic * The Regents of the University of California. All rights reserved.
453903Smckusick *
553903Smckusick * This code is derived from software contributed to Berkeley by
653903Smckusick * Kazumasa Utashiro of Software Research Associates, Inc.
753903Smckusick *
853903Smckusick * %sccs.include.redist.c%
953903Smckusick *
10*67957Smckusick * @(#)conf.c 8.3 (Berkeley) 11/21/94
1153903Smckusick */
1253903Smckusick
1357176Sutashiro #include <sys/param.h>
1457176Sutashiro #include <sys/systm.h>
1557176Sutashiro #include <sys/buf.h>
1657176Sutashiro #include <sys/ioctl.h>
1759780Sutashiro #include <sys/proc.h>
1859780Sutashiro #include <sys/vnode.h>
1957176Sutashiro #include <sys/tty.h>
2057176Sutashiro #include <sys/conf.h>
2153903Smckusick
2253903Smckusick int rawread __P((dev_t, struct uio *, int));
2353903Smckusick int rawwrite __P((dev_t, struct uio *, int));
2453903Smckusick int swstrategy __P((struct buf *));
2553903Smckusick int ttselect __P((dev_t, int, struct proc *));
2653903Smckusick
2753903Smckusick #define dev_type_open(n) int n __P((dev_t, int, int, struct proc *))
2853903Smckusick #define dev_type_close(n) int n __P((dev_t, int, int, struct proc *))
2953903Smckusick #define dev_type_strategy(n) int n __P((struct buf *))
3053903Smckusick #define dev_type_ioctl(n) \
3153903Smckusick int n __P((dev_t, int, caddr_t, int, struct proc *))
3253903Smckusick
3353903Smckusick /* bdevsw-specific types */
3453903Smckusick #define dev_type_dump(n) int n __P((dev_t))
3553903Smckusick #define dev_type_size(n) int n __P((dev_t))
3653903Smckusick
3753903Smckusick #define dev_decl(n,t) __CONCAT(dev_type_,t)(__CONCAT(n,t))
3853903Smckusick #define dev_init(c,n,t) \
3953903Smckusick (c > 0 ? __CONCAT(n,t) : (__CONCAT(dev_type_,t)((*))) enxio)
4053903Smckusick
4153903Smckusick /* bdevsw-specific initializations */
4253903Smckusick #define dev_size_init(c,n) (c > 0 ? __CONCAT(n,size) : 0)
4353903Smckusick
4453903Smckusick #define bdev_decl(n) \
4553903Smckusick dev_decl(n,open); dev_decl(n,close); dev_decl(n,strategy); \
4653903Smckusick dev_decl(n,ioctl); dev_decl(n,dump); dev_decl(n,size)
4753903Smckusick
4853903Smckusick #define bdev_disk_init(c,n) { \
4953903Smckusick dev_init(c,n,open), (dev_type_close((*))) nullop, \
5053903Smckusick dev_init(c,n,strategy), dev_init(c,n,ioctl), \
5153903Smckusick dev_init(c,n,dump), dev_size_init(c,n), 0 }
5253903Smckusick
5353903Smckusick #define bdev_tape_init(c,n) { \
5453903Smckusick dev_init(c,n,open), dev_init(c,n,close), \
5553903Smckusick dev_init(c,n,strategy), dev_init(c,n,ioctl), \
5653903Smckusick dev_init(c,n,dump), 0, B_TAPE }
5753903Smckusick
5853903Smckusick #define bdev_swap_init() { \
5953903Smckusick (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
6053903Smckusick swstrategy, (dev_type_ioctl((*))) enodev, \
6153903Smckusick (dev_type_dump((*))) enodev, 0, 0 }
6253903Smckusick
6353903Smckusick #define bdev_notdef() bdev_tape_init(0,no)
6453903Smckusick bdev_decl(no); /* dummy declarations */
6553903Smckusick
6653903Smckusick #include "sd.h"
6753903Smckusick #define sd_b_ioctl sdioctl
6853903Smckusick #define sd_b_strategy sdstrategy
6953903Smckusick #define sd_b_dump sddump
7053903Smckusick #define sd_b_size sdsize
7153903Smckusick bdev_decl(sd_b_);
7253903Smckusick
7353903Smckusick #include "fd.h"
7453903Smckusick #define fd_b_ioctl fdioctl
7553903Smckusick #define fd_b_strategy fdstrategy
7653903Smckusick #define fd_b_dump fddump
7753903Smckusick #define fd_b_size fdsize
7853903Smckusick bdev_decl(fd_b_);
7953903Smckusick
8053903Smckusick #include "vn.h"
8153903Smckusick bdev_decl(vn);
8253903Smckusick
8353903Smckusick struct bdevsw bdevsw[] =
8453903Smckusick {
8553903Smckusick bdev_disk_init(NSD,sd_b_), /* 0: SCSI disk */
8653903Smckusick bdev_disk_init(NFD,fd_b_), /* 1: floppy disk */
8753903Smckusick bdev_notdef(), /* 2 */
8853903Smckusick bdev_disk_init(NVN,vn), /* 3: vnode disk driver (swap to files) */
8953903Smckusick bdev_swap_init(), /* 4: swap pseudo-device */
9053903Smckusick };
9153903Smckusick
9253903Smckusick int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]);
9353903Smckusick
9453903Smckusick /* cdevsw-specific types */
9553903Smckusick #define dev_type_read(n) int n __P((dev_t, struct uio *, int))
9653903Smckusick #define dev_type_write(n) int n __P((dev_t, struct uio *, int))
9753903Smckusick #define dev_type_stop(n) int n __P((struct tty *, int))
9853903Smckusick #define dev_type_reset(n) int n __P((int))
9953903Smckusick #define dev_type_select(n) int n __P((dev_t, int, struct proc *))
10053903Smckusick #define dev_type_map(n) int n __P(())
10153903Smckusick
10253903Smckusick #define cdev_decl(n) \
10353903Smckusick dev_decl(n,open); dev_decl(n,close); dev_decl(n,read); \
10453903Smckusick dev_decl(n,write); dev_decl(n,ioctl); dev_decl(n,stop); \
10553903Smckusick dev_decl(n,reset); dev_decl(n,select); dev_decl(n,map); \
10653903Smckusick dev_decl(n,strategy); extern struct tty __CONCAT(n,_tty)[]
10753903Smckusick
10853903Smckusick #define dev_tty_init(c,n) (c > 0 ? __CONCAT(n,_tty) : 0)
10953903Smckusick
11053903Smckusick /* open, read, write, ioctl, strategy */
11153903Smckusick #define cdev_disk_init(c,n) { \
11253903Smckusick dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
11353903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
11453903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
11553903Smckusick dev_init(c,n,strategy) }
11653903Smckusick
11753903Smckusick /* open, close, read, write, ioctl, strategy */
11853903Smckusick #define cdev_tape_init(c,n) { \
11953903Smckusick dev_init(c,n,open), dev_init(c,n,close), rawread, \
12053903Smckusick rawwrite, dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
12153903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
12253903Smckusick dev_init(c,n,strategy) }
12353903Smckusick
12453903Smckusick /* open, close, read, write, ioctl, stop, tty */
12553903Smckusick #define cdev_tty_init(c,n) { \
12653903Smckusick dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
12753903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \
12853903Smckusick (dev_type_reset((*))) nullop, dev_tty_init(c,n), ttselect, \
12953903Smckusick (dev_type_map((*))) enodev, 0 }
13053903Smckusick
13153903Smckusick #define cdev_notdef() { \
13253903Smckusick (dev_type_open((*))) enodev, (dev_type_close((*))) enodev, \
13353903Smckusick (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
13453903Smckusick (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
13553903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, \
13653903Smckusick (dev_type_map((*))) enodev, 0 }
13753903Smckusick
13853903Smckusick /* open, close, read, write, ioctl -- XXX should be tty */
13953903Smckusick #define cdev_vc_init(c,n) { \
14053903Smckusick dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
14153903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \
14253903Smckusick (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \
14353903Smckusick (dev_type_map((*))) enodev, 0 }
14453903Smckusick
14553903Smckusick cdev_decl(no); /* dummy declarations */
14653903Smckusick
14753903Smckusick #include "rs.h"
14853903Smckusick cdev_decl(rs);
14953903Smckusick cdev_decl(vc);
15054511Sutashiro
15154511Sutashiro #include "bm.h"
15253903Smckusick cdev_decl(cn);
15353903Smckusick
15454468Sutashiro cdev_decl(ctty);
15554468Sutashiro /* open, read, write, ioctl, select -- XXX should be a tty */
15654468Sutashiro #define cdev_ctty_init(c,n) { \
15754468Sutashiro dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
15854468Sutashiro dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
15954468Sutashiro (dev_type_reset((*))) nullop, 0, dev_init(c,n,select), \
16054468Sutashiro (dev_type_map((*))) enodev, 0 }
16154468Sutashiro
16253903Smckusick dev_type_read(mmrw);
16353903Smckusick /* read/write */
16453903Smckusick #define cdev_mm_init(c,n) { \
16553903Smckusick (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, mmrw, \
16653903Smckusick mmrw, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) nullop, \
16753903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 }
16853903Smckusick
16953903Smckusick #include "sd.h"
17053903Smckusick #define sd_c_read sdread
17153903Smckusick #define sd_c_write sdwrite
17253903Smckusick #define sd_c_ioctl sdioctl
17353903Smckusick #define sd_c_reset sdreset
17453903Smckusick #define sd_c_strategy sdstrategy
17553903Smckusick #define sd_c_dump sddump
17653903Smckusick #define sd_c_size sdsize
17753903Smckusick cdev_decl(sd_c_);
17853903Smckusick
17953903Smckusick #include "fd.h"
18053903Smckusick #define fd_c_read fdread
18153903Smckusick #define fd_c_write fdwrite
18253903Smckusick #define fd_c_ioctl fdioctl
18353903Smckusick #define fd_c_reset fdreset
18453903Smckusick #define fd_c_strategy fdstrategy
18553903Smckusick #define fd_c_dump fddump
18653903Smckusick #define fd_c_size fdsize
18753903Smckusick cdev_decl(fd_c_);
18853903Smckusick
18953903Smckusick #include "lp.h"
19053903Smckusick cdev_decl(lp);
19153903Smckusick
19253903Smckusick /* read, write, strategy */
19353903Smckusick #define cdev_swap_init(c,n) { \
19453903Smckusick (dev_type_open((*))) nullop, (dev_type_close((*))) nullop, rawread, \
19553903Smckusick rawwrite, (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
19653903Smckusick (dev_type_reset((*))) nullop, 0, (dev_type_select((*))) enodev, \
19753903Smckusick (dev_type_map((*))) enodev, dev_init(c,n,strategy) }
19853903Smckusick
19953903Smckusick #include "pty.h"
20053903Smckusick #define pts_tty pt_tty
20153903Smckusick #define ptsioctl ptyioctl
20253903Smckusick cdev_decl(pts);
20353903Smckusick #define ptc_tty pt_tty
20453903Smckusick #define ptcioctl ptyioctl
20553903Smckusick cdev_decl(ptc);
20653903Smckusick
20753903Smckusick /* open, close, read, write, ioctl, tty, select */
20853903Smckusick #define cdev_ptc_init(c,n) { \
20953903Smckusick dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
21053903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) nullop, \
21153903Smckusick (dev_type_reset((*))) nullop, dev_tty_init(c,n), dev_init(c,n,select), \
21253903Smckusick (dev_type_map((*))) enodev, 0 }
21353903Smckusick
21453903Smckusick #include "kb.h"
21553903Smckusick cdev_decl(kb);
21653903Smckusick /* open, close, write, ioctl */
21753903Smckusick #define cdev_kb_init(c,n) { \
21853903Smckusick dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
21953903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), \
22053903Smckusick (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \
22153903Smckusick seltrue, (dev_type_map((*))) enodev, \
22253903Smckusick 0 }
22353903Smckusick
22453903Smckusick #include "ms.h"
22553903Smckusick #define msmap msmmap
22653903Smckusick cdev_decl(ms);
22753903Smckusick /* open, close, read, write, ioctl, select */
22853903Smckusick #define cdev_ms_init(c,n) { \
22953903Smckusick dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
23053903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
23153903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
23253903Smckusick 0 }
23353903Smckusick
23453903Smckusick #include "fb.h"
23553903Smckusick cdev_decl(fb);
23653903Smckusick /* open, close, ioctl, mmap */
23753903Smckusick #define cdev_fb_init(c,n) { \
23853903Smckusick dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
23953903Smckusick (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
24053903Smckusick (dev_type_stop((*))) enodev, \
24153903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, 0 }
24253903Smckusick /*
24353903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, dev_init(c,n,map), 0 }
24453903Smckusick */
24553903Smckusick
24653903Smckusick #include "st.h"
24753903Smckusick cdev_decl(st);
24853903Smckusick
24953903Smckusick #include "lb.h"
25053903Smckusick cdev_decl(lbp);
25153903Smckusick
25253903Smckusick #include "ir.h"
25353903Smckusick cdev_decl(ir);
25453903Smckusick /* open, close, read, ioctl */
25553903Smckusick #define cdev_ir_init(c,n) { \
25653903Smckusick dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
25753903Smckusick (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
25853903Smckusick (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \
25953903Smckusick seltrue, (dev_type_map((*))) enodev, 0 }
26053903Smckusick
26153903Smckusick cdev_decl(log);
26253903Smckusick /* open, close, read, ioctl, select -- XXX should be a generic device */
26353903Smckusick #define cdev_log_init(c,n) { \
26453903Smckusick dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
26553903Smckusick (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
26653903Smckusick (dev_type_stop((*))) enodev, (dev_type_reset((*))) nullop, 0, \
26753903Smckusick dev_init(c,n,select), (dev_type_map((*))) enodev, 0 }
26853903Smckusick
26953903Smckusick dev_type_open(fdopen);
27053903Smckusick /* open */
27153903Smckusick #define cdev_fd_init(c,n) { \
27253903Smckusick dev_init(c,n,open), (dev_type_close((*))) enodev, \
27353903Smckusick (dev_type_read((*))) enodev, (dev_type_write((*))) enodev, \
27453903Smckusick (dev_type_ioctl((*))) enodev, (dev_type_stop((*))) enodev, \
27553903Smckusick (dev_type_reset((*))) enodev, 0, (dev_type_select((*))) enodev, \
27653903Smckusick (dev_type_map((*))) enodev, 0 }
27753903Smckusick
27853903Smckusick cdev_decl(vn);
27953903Smckusick /* open, read, write, ioctl -- XXX should be a disk */
28053903Smckusick #define cdev_vn_init(c,n) { \
28153903Smckusick dev_init(c,n,open), (dev_type_close((*))) nullop, dev_init(c,n,read), \
28253903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
28353903Smckusick (dev_type_reset((*))) nullop, 0, seltrue, (dev_type_map((*))) enodev, \
28453903Smckusick 0 }
28553903Smckusick
28653903Smckusick #include "bpfilter.h"
28753903Smckusick cdev_decl(bpf);
28853903Smckusick /* open, close, read, write, ioctl, select -- XXX should be generic device */
28953903Smckusick #define cdev_bpf_init(c,n) { \
29053903Smckusick dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \
29153903Smckusick dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \
29253903Smckusick (dev_type_reset((*))) enodev, 0, dev_init(c,n,select), \
29353903Smckusick (dev_type_map((*))) enodev, 0 }
29453903Smckusick
29553903Smckusick struct cdevsw cdevsw[] =
29653903Smckusick {
29753903Smckusick cdev_vc_init(1,vc), /* 0: virtual console */
29853903Smckusick cdev_tty_init(NRS,rs), /* 1: rs232c */
29954468Sutashiro cdev_ctty_init(1,ctty), /* 2: controlling terminal */
30053903Smckusick cdev_mm_init(1,mm), /* 3: /dev/{null,mem,kmem,...} */
30153903Smckusick cdev_disk_init(NSD,sd_c_), /* 4: scsi disk */
30253903Smckusick cdev_disk_init(NFD,fd_c_), /* 5: floppy disk */
30353903Smckusick cdev_disk_init(NLP,lp), /* 6: printer */
30453903Smckusick cdev_swap_init(1,sw), /* 7: /dev/drum (swap pseudo-device) */
30553903Smckusick cdev_tty_init(NPTY,pts), /* 8: pseudo-tty slave */
30653903Smckusick cdev_ptc_init(NPTY,ptc), /* 9: pseudo-tty master */
30753903Smckusick cdev_notdef(), /* 10: md (sony memory disk) */
30853903Smckusick cdev_kb_init(NKB,kb), /* 11: keyboard */
30953903Smckusick cdev_ms_init(NMS,ms), /* 12: mouse */
31053903Smckusick cdev_fd_init(1,fd), /* 13: file descriptor pseudo-dev */
31153903Smckusick cdev_fb_init(NFB,fb), /* 14: frame buffer */
31253903Smckusick cdev_vn_init(NVN,vn), /* 15: vnode disk */
31353903Smckusick cdev_tape_init(NST,st), /* 16: scsi tape */
31453903Smckusick cdev_kb_init(NLB,lbp), /* 17: lbp */
31553903Smckusick cdev_ir_init(NIR,ir), /* 18: image reader */
31653903Smckusick cdev_notdef(), /* 19: vme */
31753903Smckusick cdev_notdef(), /* 20: gpib */
31853903Smckusick cdev_notdef(), /* 21: rd */
31954511Sutashiro cdev_tty_init(NBM,cn), /* 22: console display device */
32053903Smckusick cdev_notdef(), /* 23: ether */
32153903Smckusick cdev_bpf_init(NBPFILTER,bpf), /* 24: berkeley packet filter */
32253903Smckusick cdev_notdef(), /* 25 */
32353903Smckusick cdev_notdef(), /* 26 */
32453903Smckusick cdev_notdef(), /* 27 */
32553903Smckusick cdev_notdef(), /* 28: scsi */
32653903Smckusick cdev_notdef(), /* 29: sony shm */
32753903Smckusick cdev_notdef(), /* 30: sony semaphoe? */
32853903Smckusick cdev_notdef(), /* 31: vvcrs */
32953903Smckusick cdev_notdef(), /* 32: fddi */
33053903Smckusick cdev_log_init(1,log), /* 33: /dev/klog */
33153903Smckusick cdev_notdef(), /* 34: image board */
33253903Smckusick cdev_notdef(), /* 35: sb? */
33353903Smckusick cdev_notdef(), /* 36: sbe? */
33453903Smckusick cdev_notdef(), /* 37: vd (safs) */
33553903Smckusick cdev_notdef(), /* 38: xd (safs) */
33653903Smckusick cdev_notdef(), /* 39: isdn */
33753903Smckusick cdev_notdef(), /* 40: rb */
33853903Smckusick cdev_notdef(), /* 41: gs */
33953903Smckusick cdev_notdef(), /* 42: rx */
34053903Smckusick };
34153903Smckusick
34253903Smckusick int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]);
34353903Smckusick
34453903Smckusick int mem_no = 2; /* major device number of memory special file */
34553903Smckusick
34653903Smckusick /*
34753903Smckusick * Swapdev is a fake device implemented
34853903Smckusick * in sw.c used only internally to get to swstrategy.
34953903Smckusick * It cannot be provided to the users, because the
35053903Smckusick * swstrategy routine munches the b_dev and b_blkno entries
35153903Smckusick * before calling the appropriate driver. This would horribly
35253903Smckusick * confuse, e.g. the hashing routines. Instead, /dev/drum is
35353903Smckusick * provided as a character (raw) device.
35453903Smckusick */
35553903Smckusick dev_t swapdev = makedev(1, 0);
35659780Sutashiro
35759780Sutashiro /*
35859780Sutashiro * Routine that identifies /dev/mem and /dev/kmem.
35959780Sutashiro *
36059780Sutashiro * A minimal stub routine can always return 0.
36159780Sutashiro */
iskmemdev(dev)36259780Sutashiro iskmemdev(dev)
36359780Sutashiro dev_t dev;
36459780Sutashiro {
36559780Sutashiro
36659780Sutashiro if (major(dev) == 3 && (minor(dev) == 0 || minor(dev) == 1))
36759780Sutashiro return (1);
36859780Sutashiro return (0);
36959780Sutashiro }
37059780Sutashiro
iszerodev(dev)37164851Shibler iszerodev(dev)
37264851Shibler dev_t dev;
37364851Shibler {
37464851Shibler return (major(dev) == 3 && minor(dev) == 12);
37564851Shibler }
37664851Shibler
37759780Sutashiro /*
378*67957Smckusick * Routine to determine if a device is a tty.
379*67957Smckusick *
380*67957Smckusick * A minimal stub routine can always return 0.
381*67957Smckusick */
istty(dev)382*67957Smckusick istty(dev)
383*67957Smckusick dev_t dev;
384*67957Smckusick {
385*67957Smckusick
386*67957Smckusick switch (major(dev)) {
387*67957Smckusick case 0:
388*67957Smckusick case 1:
389*67957Smckusick case 2:
390*67957Smckusick case 8:
391*67957Smckusick case 9:
392*67957Smckusick case 11:
393*67957Smckusick return (1);
394*67957Smckusick default:
395*67957Smckusick return (0);
396*67957Smckusick }
397*67957Smckusick }
398*67957Smckusick
399*67957Smckusick /*
40059780Sutashiro * Routine to determine if a device is a disk.
40159780Sutashiro *
40259780Sutashiro * A minimal stub routine can always return 0.
40359780Sutashiro */
isdisk(dev,type)40459780Sutashiro isdisk(dev, type)
40559780Sutashiro dev_t dev;
40659780Sutashiro int type;
40759780Sutashiro {
40859780Sutashiro
40959780Sutashiro switch (major(dev)) {
41059780Sutashiro case 0:
41159780Sutashiro case 3:
41259780Sutashiro if (type == VBLK)
41359780Sutashiro return (1);
41459780Sutashiro return (0);
41559780Sutashiro case 4:
41659780Sutashiro case 15:
41759780Sutashiro if (type == VCHR)
41859780Sutashiro return (1);
41959780Sutashiro /* FALLTHROUGH */
42059780Sutashiro default:
42159780Sutashiro return (0);
42259780Sutashiro }
42359780Sutashiro /* NOTREACHED */
42459780Sutashiro }
42559780Sutashiro
42659780Sutashiro #define MAXDEV 43
42759780Sutashiro static int chrtoblktbl[MAXDEV] = {
42859780Sutashiro /* VCHR */ /* VBLK */
42959780Sutashiro /* 0 */ NODEV,
43059780Sutashiro /* 1 */ NODEV,
43159780Sutashiro /* 2 */ NODEV,
43259780Sutashiro /* 3 */ NODEV,
43359780Sutashiro /* 4 */ 0,
43459780Sutashiro /* 5 */ NODEV,
43559780Sutashiro /* 6 */ NODEV,
43659780Sutashiro /* 7 */ NODEV,
43759780Sutashiro /* 8 */ NODEV,
43859780Sutashiro /* 9 */ NODEV,
43959780Sutashiro /* 10 */ NODEV,
44059780Sutashiro /* 11 */ NODEV,
44159780Sutashiro /* 12 */ NODEV,
44259780Sutashiro /* 13 */ NODEV,
44359780Sutashiro /* 14 */ NODEV,
44459780Sutashiro /* 15 */ 3,
44559780Sutashiro /* 16 */ NODEV,
44659780Sutashiro /* 17 */ NODEV,
44759780Sutashiro /* 18 */ NODEV,
44859780Sutashiro /* 19 */ NODEV,
44959780Sutashiro /* 20 */ NODEV,
45059780Sutashiro /* 21 */ NODEV,
45159780Sutashiro /* 22 */ NODEV,
45259780Sutashiro /* 23 */ NODEV,
45359780Sutashiro /* 24 */ NODEV,
45459780Sutashiro /* 25 */ NODEV,
45559780Sutashiro /* 26 */ NODEV,
45659780Sutashiro /* 27 */ NODEV,
45759780Sutashiro /* 28 */ NODEV,
45859780Sutashiro /* 29 */ NODEV,
45959780Sutashiro /* 30 */ NODEV,
46059780Sutashiro /* 31 */ NODEV,
46159780Sutashiro /* 32 */ NODEV,
46259780Sutashiro /* 33 */ NODEV,
46359780Sutashiro /* 34 */ NODEV,
46459780Sutashiro /* 35 */ NODEV,
46559780Sutashiro /* 36 */ NODEV,
46659780Sutashiro /* 37 */ NODEV,
46759780Sutashiro /* 38 */ NODEV,
46859780Sutashiro /* 39 */ NODEV,
46959780Sutashiro /* 40 */ NODEV,
47059780Sutashiro /* 41 */ NODEV,
47159780Sutashiro /* 42 */ NODEV,
47259780Sutashiro };
47359780Sutashiro /*
47459780Sutashiro * Routine to convert from character to block device number.
47559780Sutashiro *
47659780Sutashiro * A minimal stub routine can always return NODEV.
47759780Sutashiro */
chrtoblk(dev)47859780Sutashiro chrtoblk(dev)
47959780Sutashiro dev_t dev;
48059780Sutashiro {
48159780Sutashiro int blkmaj;
48259780Sutashiro
48359780Sutashiro if (major(dev) >= MAXDEV || (blkmaj = chrtoblktbl[major(dev)]) == NODEV)
48459780Sutashiro return (NODEV);
48559780Sutashiro return (makedev(blkmaj, minor(dev)));
48659780Sutashiro }
487