126453f35SJulian Elischer /*- 226453f35SJulian Elischer * Parts Copyright (c) 1995 Terrence R. Lambert 326453f35SJulian Elischer * Copyright (c) 1995 Julian R. Elischer 426453f35SJulian Elischer * All rights reserved. 526453f35SJulian Elischer * 626453f35SJulian Elischer * Redistribution and use in source and binary forms, with or without 726453f35SJulian Elischer * modification, are permitted provided that the following conditions 826453f35SJulian Elischer * are met: 926453f35SJulian Elischer * 1. Redistributions of source code must retain the above copyright 1026453f35SJulian Elischer * notice, this list of conditions and the following disclaimer. 1126453f35SJulian Elischer * 2. Redistributions in binary form must reproduce the above copyright 1226453f35SJulian Elischer * notice, this list of conditions and the following disclaimer in the 1326453f35SJulian Elischer * documentation and/or other materials provided with the distribution. 1426453f35SJulian Elischer * 3. All advertising materials mentioning features or use of this software 1526453f35SJulian Elischer * must display the following acknowledgement: 1626453f35SJulian Elischer * This product includes software developed by Terrence R. Lambert. 1726453f35SJulian Elischer * 4. The name Terrence R. Lambert may not be used to endorse or promote 1826453f35SJulian Elischer * products derived from this software without specific prior written 1926453f35SJulian Elischer * permission. 2026453f35SJulian Elischer * 2126453f35SJulian Elischer * THIS SOFTWARE IS PROVIDED BY Julian R. Elischer ``AS IS'' AND ANY 2226453f35SJulian Elischer * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2326453f35SJulian Elischer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2426453f35SJulian Elischer * ARE DISCLAIMED. IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE 2526453f35SJulian Elischer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2626453f35SJulian Elischer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2726453f35SJulian Elischer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2826453f35SJulian Elischer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2926453f35SJulian Elischer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3026453f35SJulian Elischer * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3126453f35SJulian Elischer * SUCH DAMAGE. 3226453f35SJulian Elischer * 331dfcbb0cSJulian Elischer * $Id: kern_conf.c,v 1.7 1995/12/13 15:12:48 julian Exp $ 3426453f35SJulian Elischer */ 3526453f35SJulian Elischer 3626453f35SJulian Elischer #include <sys/param.h> 37f8a760b3SJulian Elischer #include <sys/types.h> 38f8a760b3SJulian Elischer #include <sys/systm.h> 3926453f35SJulian Elischer #include <sys/conf.h> 401dfcbb0cSJulian Elischer #include <sys/vnode.h> 411dfcbb0cSJulian Elischer 421dfcbb0cSJulian Elischer #define NUMCDEV 96 431dfcbb0cSJulian Elischer #define NUMBDEV 32 441dfcbb0cSJulian Elischer 451dfcbb0cSJulian Elischer struct bdevsw *bdevsw[NUMBDEV]; 461dfcbb0cSJulian Elischer int nblkdev = NUMBDEV; 471dfcbb0cSJulian Elischer struct cdevsw *cdevsw[NUMCDEV]; 481dfcbb0cSJulian Elischer int nchrdev = NUMCDEV; 491dfcbb0cSJulian Elischer 501dfcbb0cSJulian Elischer 511dfcbb0cSJulian Elischer 521dfcbb0cSJulian Elischer /* 531dfcbb0cSJulian Elischer * Routine to determine if a device is a disk. 541dfcbb0cSJulian Elischer * 551dfcbb0cSJulian Elischer * KLUDGE XXX add flags to cdevsw entries for disks XXX 561dfcbb0cSJulian Elischer * A minimal stub routine can always return 0. 571dfcbb0cSJulian Elischer */ 581dfcbb0cSJulian Elischer int 591dfcbb0cSJulian Elischer isdisk(dev, type) 601dfcbb0cSJulian Elischer dev_t dev; 611dfcbb0cSJulian Elischer int type; 621dfcbb0cSJulian Elischer { 631dfcbb0cSJulian Elischer 641dfcbb0cSJulian Elischer switch (major(dev)) { 651dfcbb0cSJulian Elischer case 15: /* VBLK: vn, VCHR: cd */ 661dfcbb0cSJulian Elischer return (1); 671dfcbb0cSJulian Elischer case 0: /* wd */ 681dfcbb0cSJulian Elischer case 2: /* fd */ 691dfcbb0cSJulian Elischer case 4: /* sd */ 701dfcbb0cSJulian Elischer case 6: /* cd */ 711dfcbb0cSJulian Elischer case 7: /* mcd */ 721dfcbb0cSJulian Elischer case 16: /* scd */ 731dfcbb0cSJulian Elischer case 17: /* matcd */ 741dfcbb0cSJulian Elischer case 18: /* ata */ 751dfcbb0cSJulian Elischer case 19: /* wcd */ 761dfcbb0cSJulian Elischer case 20: /* od */ 771dfcbb0cSJulian Elischer if (type == VBLK) 781dfcbb0cSJulian Elischer return (1); 791dfcbb0cSJulian Elischer return (0); 801dfcbb0cSJulian Elischer case 3: /* wd */ 811dfcbb0cSJulian Elischer case 9: /* fd */ 821dfcbb0cSJulian Elischer case 13: /* sd */ 831dfcbb0cSJulian Elischer case 29: /* mcd */ 841dfcbb0cSJulian Elischer case 43: /* vn */ 851dfcbb0cSJulian Elischer case 45: /* scd */ 861dfcbb0cSJulian Elischer case 46: /* matcd */ 871dfcbb0cSJulian Elischer case 69: /* wcd */ 881dfcbb0cSJulian Elischer case 70: /* od */ 891dfcbb0cSJulian Elischer if (type == VCHR) 901dfcbb0cSJulian Elischer return (1); 911dfcbb0cSJulian Elischer /* fall through */ 921dfcbb0cSJulian Elischer default: 931dfcbb0cSJulian Elischer return (0); 941dfcbb0cSJulian Elischer } 951dfcbb0cSJulian Elischer /* NOTREACHED */ 961dfcbb0cSJulian Elischer } 971dfcbb0cSJulian Elischer 981dfcbb0cSJulian Elischer 991dfcbb0cSJulian Elischer /* 1001dfcbb0cSJulian Elischer * Routine to convert from character to block device number. 1011dfcbb0cSJulian Elischer * 1021dfcbb0cSJulian Elischer * A minimal stub routine can always return NODEV. 1031dfcbb0cSJulian Elischer */ 1041dfcbb0cSJulian Elischer dev_t 1051dfcbb0cSJulian Elischer chrtoblk(dev_t dev) 1061dfcbb0cSJulian Elischer { 1071dfcbb0cSJulian Elischer int blkmaj; 1081dfcbb0cSJulian Elischer struct bdevsw *bd; 1091dfcbb0cSJulian Elischer struct cdevsw *cd; 1101dfcbb0cSJulian Elischer 1111dfcbb0cSJulian Elischer if(cd = cdevsw[major(dev)]) { 1121dfcbb0cSJulian Elischer if ( (bd = cd->d_bdev) ) 1131dfcbb0cSJulian Elischer return(makedev(bd->d_maj,minor(dev))); 1141dfcbb0cSJulian Elischer } 1151dfcbb0cSJulian Elischer return(NODEV); 1161dfcbb0cSJulian Elischer } 11726453f35SJulian Elischer 11826453f35SJulian Elischer /* 11926453f35SJulian Elischer * (re)place an entry in the bdevsw or cdevsw table 120f8a760b3SJulian Elischer * return the slot used in major(*descrip) 12126453f35SJulian Elischer */ 12226453f35SJulian Elischer #define ADDENTRY(TTYPE,NXXXDEV) \ 12326453f35SJulian Elischer int TTYPE##_add(dev_t *descrip, \ 1244c1a35b2SJulian Elischer struct TTYPE *newentry, \ 1256ba9ebceSJulian Elischer struct TTYPE **oldentry) \ 12626453f35SJulian Elischer { \ 127f8a760b3SJulian Elischer int i ; \ 128f8a760b3SJulian Elischer if ( (int)*descrip == -1) { /* auto (0 is valid) */ \ 12926453f35SJulian Elischer /* \ 13026453f35SJulian Elischer * Search the table looking for a slot... \ 13126453f35SJulian Elischer */ \ 13226453f35SJulian Elischer for (i = 0; i < NXXXDEV; i++) \ 1336ba9ebceSJulian Elischer if (TTYPE[i] == NULL) \ 134adb2dc29SJulian Elischer break; /* found one! */ \ 13526453f35SJulian Elischer /* out of allocable slots? */ \ 13626453f35SJulian Elischer if (i == NXXXDEV) { \ 13726453f35SJulian Elischer return ENFILE; \ 13826453f35SJulian Elischer } \ 13926453f35SJulian Elischer } else { /* assign */ \ 140de1676f9SJulian Elischer i = major(*descrip); \ 14126453f35SJulian Elischer if (i < 0 || i >= NXXXDEV) { \ 14226453f35SJulian Elischer return EINVAL; \ 14326453f35SJulian Elischer } \ 14426453f35SJulian Elischer } \ 14526453f35SJulian Elischer \ 1464c1a35b2SJulian Elischer /* maybe save old */ \ 14726453f35SJulian Elischer if (oldentry) { \ 1486ba9ebceSJulian Elischer *oldentry = TTYPE[i]; \ 14926453f35SJulian Elischer } \ 15087f6c662SJulian Elischer newentry->d_maj = i; \ 15126453f35SJulian Elischer /* replace with new */ \ 1526ba9ebceSJulian Elischer TTYPE[i] = newentry; \ 15326453f35SJulian Elischer \ 1546ba9ebceSJulian Elischer /* done! let them know where we put it */ \ 15526453f35SJulian Elischer *descrip = makedev(i,0); \ 156f8a760b3SJulian Elischer return 0; \ 15726453f35SJulian Elischer } \ 15826453f35SJulian Elischer 1594c1a35b2SJulian Elischer ADDENTRY(bdevsw, nblkdev) 1604c1a35b2SJulian Elischer ADDENTRY(cdevsw, nchrdev) 161